diff --git a/CHANGELOG.md b/CHANGELOG.md index 588348a0..cf4be7da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Button to remove uploaded media in post status form is now properly placed and sized. - Fixed shoutbox not working in mobile layout +### Changed +- Display 'people voted' instead of 'votes' for multi-choice polls ## [2.2.3] - 2021-01-18 ### Added @@ -29,6 +31,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Added some missing unicode emoji - Added the upload limit to the Features panel in the About page - Support for solid color wallpaper, instance doesn't have to define a wallpaper anymore +- Group staff members by role in the About page ### Fixed - Fixed the occasional bug where screen would scroll 1px when typing into a reply form diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue index 4becdc41..1d6c760e 100644 --- a/src/components/emoji_input/emoji_input.vue +++ b/src/components/emoji_input/emoji_input.vue @@ -10,6 +10,7 @@ v-if="!hideEmojiButton" class="button-unstyled emoji-picker-icon" @click.prevent="togglePicker" + type="button" > diff --git a/src/components/extra_buttons/extra_buttons.vue b/src/components/extra_buttons/extra_buttons.vue index e845d8fc..c6cb9fbe 100644 --- a/src/components/extra_buttons/extra_buttons.vue +++ b/src/components/extra_buttons/extra_buttons.vue @@ -139,6 +139,11 @@ @import '../../_variables.scss'; .ExtraButtons { + /* override of popover internal stuff */ + .popover-trigger-button { + width: auto; + } + .popover-trigger { position: static; padding: 10px; diff --git a/src/components/mfa_form/recovery_form.vue b/src/components/mfa_form/recovery_form.vue index 0bf68e27..8457ec5d 100644 --- a/src/components/mfa_form/recovery_form.vue +++ b/src/components/mfa_form/recovery_form.vue @@ -26,6 +26,7 @@ @@ -33,6 +34,7 @@ diff --git a/src/components/mfa_form/totp_form.vue b/src/components/mfa_form/totp_form.vue index 79230148..5d80e185 100644 --- a/src/components/mfa_form/totp_form.vue +++ b/src/components/mfa_form/totp_form.vue @@ -28,6 +28,7 @@ @@ -35,6 +36,7 @@ diff --git a/src/components/poll/poll.vue b/src/components/poll/poll.vue index 42819c19..187d1829 100644 --- a/src/components/poll/poll.vue +++ b/src/components/poll/poll.vue @@ -58,7 +58,12 @@ {{ $t('polls.vote') }}
- {{ totalVotesCount }} {{ $t("polls.votes") }} ·  + +
diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue index ac940b98..04734674 100644 --- a/src/components/react_button/react_button.vue +++ b/src/components/react_button/react_button.vue @@ -1,6 +1,7 @@ + + + + diff --git a/src/components/settings_modal/helpers/modified_indicator.vue b/src/components/settings_modal/helpers/modified_indicator.vue new file mode 100644 index 00000000..b75a2811 --- /dev/null +++ b/src/components/settings_modal/helpers/modified_indicator.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js index 86703697..2c833c0c 100644 --- a/src/components/settings_modal/helpers/shared_computed_object.js +++ b/src/components/settings_modal/helpers/shared_computed_object.js @@ -1,29 +1,15 @@ -import { - instanceDefaultProperties, - multiChoiceProperties, - defaultState as configDefaultState -} from 'src/modules/config.js' +import { defaultState as configDefaultState } from 'src/modules/config.js' const SharedComputedObject = () => ({ user () { return this.$store.state.users.currentUser }, - // Getting localized values for instance-default properties - ...instanceDefaultProperties - .filter(key => multiChoiceProperties.includes(key)) + // Getting values for default properties + ...Object.keys(configDefaultState) .map(key => [ key + 'DefaultValue', function () { - return this.$store.getters.instanceDefaultConfig[key] - } - ]) - .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), - ...instanceDefaultProperties - .filter(key => !multiChoiceProperties.includes(key)) - .map(key => [ - key + 'LocalizedValue', - function () { - return this.$t('settings.values.' + this.$store.getters.instanceDefaultConfig[key]) + return this.$store.getters.defaultConfig[key] } ]) .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), diff --git a/src/components/settings_modal/tabs/filtering_tab.js b/src/components/settings_modal/tabs/filtering_tab.js index 5f38a5ae..6e95f7af 100644 --- a/src/components/settings_modal/tabs/filtering_tab.js +++ b/src/components/settings_modal/tabs/filtering_tab.js @@ -1,5 +1,5 @@ import { filter, trim } from 'lodash' -import Checkbox from 'src/components/checkbox/checkbox.vue' +import BooleanSetting from '../helpers/boolean_setting.vue' import SharedComputedObject from '../helpers/shared_computed_object.js' import { library } from '@fortawesome/fontawesome-svg-core' @@ -18,7 +18,7 @@ const FilteringTab = { } }, components: { - Checkbox + BooleanSetting }, computed: { ...SharedComputedObject(), diff --git a/src/components/settings_modal/tabs/filtering_tab.vue b/src/components/settings_modal/tabs/filtering_tab.vue index 8f850c8b..18dd4be9 100644 --- a/src/components/settings_modal/tabs/filtering_tab.vue +++ b/src/components/settings_modal/tabs/filtering_tab.vue @@ -5,34 +5,34 @@ {{ $t('settings.notification_visibility') }}
  • - + {{ $t('settings.notification_visibility_likes') }} - +
  • - + {{ $t('settings.notification_visibility_repeats') }} - +
  • - + {{ $t('settings.notification_visibility_follows') }} - +
  • - + {{ $t('settings.notification_visibility_mentions') }} - +
  • - + {{ $t('settings.notification_visibility_moves') }} - +
  • - + {{ $t('settings.notification_visibility_emoji_reactions') }} - +
@@ -60,14 +60,14 @@
- - {{ $t('settings.hide_post_stats') }} {{ $t('settings.instance_default', { value: hidePostStatsLocalizedValue }) }} - + + {{ $t('settings.hide_post_stats') }} +
- - {{ $t('settings.hide_user_stats') }} {{ $t('settings.instance_default', { value: hideUserStatsLocalizedValue }) }} - + + {{ $t('settings.hide_user_stats') }} +
@@ -80,9 +80,9 @@ />
- - {{ $t('settings.hide_filtered_statuses') }} {{ $t('settings.instance_default', { value: hideFilteredStatusesLocalizedValue }) }} - + + {{ $t('settings.hide_filtered_statuses') }} +
diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 029ee7a1..2db523be 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -1,4 +1,4 @@ -import Checkbox from 'src/components/checkbox/checkbox.vue' +import BooleanSetting from '../helpers/boolean_setting.vue' import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue' import SharedComputedObject from '../helpers/shared_computed_object.js' @@ -26,7 +26,7 @@ const GeneralTab = { } }, components: { - Checkbox, + BooleanSetting, InterfaceLanguageSwitcher }, computed: { diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 2cfa53dd..f409e341 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -7,9 +7,9 @@
  • - + {{ $t('settings.hide_isp') }} - +
  • @@ -17,9 +17,9 @@
  • - + {{ $t('settings.hide_wallpaper') }} - +
  • @@ -27,51 +27,51 @@

    {{ $t('nav.timeline') }}

    • - - {{ $t('settings.hide_muted_posts') }} {{ $t('settings.instance_default', { value: hideMutedPostsLocalizedValue }) }} - + + {{ $t('settings.hide_muted_posts') }} +
    • - - {{ $t('settings.collapse_subject') }} {{ $t('settings.instance_default', { value: collapseMessageWithSubjectLocalizedValue }) }} - + + {{ $t('settings.collapse_subject') }} +
    • - + {{ $t('settings.streaming') }} - +
      • - {{ $t('settings.pause_on_unfocused') }} - +
    • - + {{ $t('settings.useStreamingApi') }}
      {{ $t('settings.useStreamingApiWarning') }} -
      +
    • - + {{ $t('settings.emoji_reactions_on_timeline') }} - +
    • - + {{ $t('settings.virtual_scrolling') }} - +
    @@ -80,14 +80,14 @@

    {{ $t('settings.composing') }}

    • - - {{ $t('settings.scope_copy') }} {{ $t('settings.instance_default', { value: scopeCopyLocalizedValue }) }} - + + {{ $t('settings.scope_copy') }} +
    • - - {{ $t('settings.subject_input_always_show') }} {{ $t('settings.instance_default', { value: alwaysShowSubjectInputLocalizedValue }) }} - + + {{ $t('settings.subject_input_always_show') }} +
    • @@ -148,19 +148,19 @@
    • - - {{ $t('settings.minimal_scopes_mode') }} {{ $t('settings.instance_default', { value: minimalScopesModeLocalizedValue }) }} - + + {{ $t('settings.minimal_scopes_mode') }} {{ minimalScopesModeDefaultValue }} +
    • - + {{ $t('settings.autohide_floating_post_button') }} - +
    • - + {{ $t('settings.pad_emoji') }} - +
    @@ -169,14 +169,14 @@

    {{ $t('settings.attachments') }}

    • - + {{ $t('settings.hide_attachments_in_tl') }} - +
    • - + {{ $t('settings.hide_attachments_in_convo') }} - +
    • - + {{ $t('settings.nsfw_clickthrough') }} - +
      • - {{ $t('settings.preload_images') }} - +
      • - {{ $t('settings.use_one_click_nsfw') }} - +
    • - + {{ $t('settings.stop_gifs') }} - +
    • - + {{ $t('settings.loop_video') }} - +
      • - {{ $t('settings.loop_video_silent_only') }} - +
      • - + {{ $t('settings.play_videos_in_modal') }} - +
      • - + {{ $t('settings.use_contain_fit') }} - +
      @@ -260,9 +260,9 @@

      {{ $t('settings.notifications') }}

      • - + {{ $t('settings.enable_web_push_notifications') }} - +
      @@ -271,9 +271,9 @@

      {{ $t('settings.fun') }}

      • - - {{ $t('settings.greentext') }} {{ $t('settings.instance_default', { value: greentextLocalizedValue }) }} - + + {{ $t('settings.greentext') }} +
      diff --git a/src/components/staff_panel/staff_panel.js b/src/components/staff_panel/staff_panel.js index 8665648a..b9561bf1 100644 --- a/src/components/staff_panel/staff_panel.js +++ b/src/components/staff_panel/staff_panel.js @@ -1,4 +1,6 @@ import map from 'lodash/map' +import groupBy from 'lodash/groupBy' +import { mapGetters, mapState } from 'vuex' import BasicUserCard from '../basic_user_card/basic_user_card.vue' const StaffPanel = { @@ -10,9 +12,21 @@ const StaffPanel = { BasicUserCard }, computed: { - staffAccounts () { - return map(this.$store.state.instance.staffAccounts, nickname => this.$store.getters.findUser(nickname)).filter(_ => _) - } + groupedStaffAccounts () { + const staffAccounts = map(this.staffAccounts, this.findUser).filter(_ => _) + const groupedStaffAccounts = groupBy(staffAccounts, 'role') + + return [ + { role: 'admin', users: groupedStaffAccounts['admin'] }, + { role: 'moderator', users: groupedStaffAccounts['moderator'] } + ].filter(group => group.users) + }, + ...mapGetters([ + 'findUser' + ]), + ...mapState({ + staffAccounts: state => state.instance.staffAccounts + }) } } diff --git a/src/components/staff_panel/staff_panel.vue b/src/components/staff_panel/staff_panel.vue index 1d13003d..c52ade42 100644 --- a/src/components/staff_panel/staff_panel.vue +++ b/src/components/staff_panel/staff_panel.vue @@ -7,11 +7,18 @@
      - +
      +

      {{ $t('general.role.' + group.role) }}

      + +
      @@ -20,4 +27,14 @@ diff --git a/src/components/tab_switcher/tab_switcher.js b/src/components/tab_switcher/tab_switcher.js index 76e7ef03..12aac8e6 100644 --- a/src/components/tab_switcher/tab_switcher.js +++ b/src/components/tab_switcher/tab_switcher.js @@ -93,7 +93,9 @@ export default Vue.component('tab-switcher', { diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index 773f764a..c6c4dfee 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -89,7 +89,7 @@ v-if="user.bot" class="alert user-role" > - bot + {{ $t('user_card.bot') }} diff --git a/src/i18n/en.json b/src/i18n/en.json index e849da29..4e3fc67a 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -75,7 +75,11 @@ "confirm": "Confirm", "verify": "Verify", "close": "Close", - "peek": "Peek" + "peek": "Peek", + "role": { + "admin": "Admin", + "moderator": "Moderator" + } }, "image_cropper": { "crop_picture": "Crop picture", @@ -148,6 +152,8 @@ "add_option": "Add Option", "option": "Option", "votes": "votes", + "people_voted_count": "{count} person voted | {count} people voted", + "votes_count": "{count} vote | {count} votes", "vote": "Vote", "type": "Poll type", "single_choice": "Single choice", @@ -242,6 +248,7 @@ "settings": { "app_name": "App name", "security": "Security", + "setting_changed": "Setting is different from default", "enter_current_password_to_confirm": "Enter your current password to confirm your identity", "mfa": { "otp": "OTP", @@ -712,6 +719,7 @@ "mute_progress": "Muting…", "hide_repeats": "Hide repeats", "show_repeats": "Show repeats", + "bot": "Bot", "admin_menu": { "moderation": "Moderation", "grant_admin": "Grant Admin", diff --git a/src/modules/config.js b/src/modules/config.js index 3b6129e5..a7667780 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -77,18 +77,22 @@ export const instanceDefaultProperties = Object.entries(defaultState) .map(([key, value]) => key) const config = { - state: defaultState, + state: { ...defaultState }, getters: { - mergedConfig (state, getters, rootState, rootGetters) { + defaultConfig (state, getters, rootState, rootGetters) { const { instance } = rootState return { - ...state, - ...instanceDefaultProperties - .map(key => [key, state[key] === undefined - ? instance[key] - : state[key] - ]) - .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}) + ...defaultState, + ...Object.fromEntries( + instanceDefaultProperties.map(key => [key, instance[key]]) + ) + } + }, + mergedConfig (state, getters, rootState, rootGetters) { + const { defaultConfig } = rootGetters + return { + ...defaultConfig, + ...state } } },