From 902954b29825647eaf5435c89e379ef4babe7931 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Thu, 9 Feb 2023 21:35:56 -0500
Subject: Use class to style screenreader-only text
---
src/components/settings_modal/helpers/modified_indicator.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/helpers/modified_indicator.vue b/src/components/settings_modal/helpers/modified_indicator.vue
index 8311533a..45db3fc2 100644
--- a/src/components/settings_modal/helpers/modified_indicator.vue
+++ b/src/components/settings_modal/helpers/modified_indicator.vue
@@ -5,12 +5,12 @@
>
--
cgit v1.2.3-70-g09d2
From af0cd5422304d7b2111739d85c279b3fa175a853 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 12 Mar 2023 14:32:13 +0200
Subject: serverSideConfig renamed into profileSettingConfig to avoid confusion
with serverSideStorage, reduced overall need for SharedComputedObject in
settings tabs, moved copypaste code of "setting" type of helpers into a
separate file.
---
.../settings_modal/helpers/boolean_setting.js | 53 +-------
.../settings_modal/helpers/boolean_setting.vue | 4 +-
.../settings_modal/helpers/choice_setting.js | 51 ++------
.../settings_modal/helpers/choice_setting.vue | 2 +-
.../settings_modal/helpers/integer_setting.js | 39 +-----
.../helpers/profile_setting_indicator.vue | 51 ++++++++
.../helpers/server_side_indicator.vue | 51 --------
src/components/settings_modal/helpers/setting.js | 84 +++++++++++++
.../helpers/shared_computed_object.js | 18 ---
.../settings_modal/helpers/size_setting.js | 48 ++-----
.../settings_modal/tabs/filtering_tab.vue | 14 +--
src/components/settings_modal/tabs/general_tab.js | 6 +-
src/components/settings_modal/tabs/general_tab.vue | 29 ++---
.../settings_modal/tabs/notifications_tab.vue | 4 +-
src/components/settings_modal/tabs/profile_tab.vue | 32 +++--
src/main.js | 4 +-
src/modules/config.js | 3 +-
src/modules/profileConfig.js | 140 +++++++++++++++++++++
src/modules/serverSideConfig.js | 140 ---------------------
19 files changed, 351 insertions(+), 422 deletions(-)
create mode 100644 src/components/settings_modal/helpers/profile_setting_indicator.vue
delete mode 100644 src/components/settings_modal/helpers/server_side_indicator.vue
create mode 100644 src/components/settings_modal/helpers/setting.js
create mode 100644 src/modules/profileConfig.js
delete mode 100644 src/modules/serverSideConfig.js
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/helpers/boolean_setting.js b/src/components/settings_modal/helpers/boolean_setting.js
index 2e6992cb..078cc5ff 100644
--- a/src/components/settings_modal/helpers/boolean_setting.js
+++ b/src/components/settings_modal/helpers/boolean_setting.js
@@ -1,56 +1,13 @@
-import { get, set } from 'lodash'
import Checkbox from 'src/components/checkbox/checkbox.vue'
import ModifiedIndicator from './modified_indicator.vue'
-import ServerSideIndicator from './server_side_indicator.vue'
+import ProfileSettingIndicator from './profile_setting_indicator.vue'
+import Setting from './setting.js'
+
export default {
components: {
Checkbox,
ModifiedIndicator,
- ServerSideIndicator
+ ProfileSettingIndicator
},
- props: [
- 'path',
- 'disabled',
- 'expert'
- ],
- computed: {
- pathDefault () {
- const [firstSegment, ...rest] = this.path.split('.')
- return [firstSegment + 'DefaultValue', ...rest].join('.')
- },
- state () {
- const value = get(this.$parent, this.path)
- if (value === undefined) {
- return this.defaultState
- } else {
- return value
- }
- },
- defaultState () {
- return get(this.$parent, this.pathDefault)
- },
- isServerSide () {
- return this.path.startsWith('serverSide_')
- },
- isChanged () {
- return !this.path.startsWith('serverSide_') && this.state !== this.defaultState
- },
- matchesExpertLevel () {
- return (this.expert || 0) <= this.$parent.expertLevel
- }
- },
- methods: {
- update (e) {
- const [firstSegment, ...rest] = this.path.split('.')
- set(this.$parent, this.path, e)
- // Updating nested properties does not trigger update on its parent.
- // probably still not as reliable, but works for depth=1 at least
- if (rest.length > 0) {
- set(this.$parent, firstSegment, { ...get(this.$parent, firstSegment) })
- }
- },
- reset () {
- set(this.$parent, this.path, this.defaultState)
- }
- }
+ ...Setting
}
diff --git a/src/components/settings_modal/helpers/boolean_setting.vue b/src/components/settings_modal/helpers/boolean_setting.vue
index 41142966..bc014bc9 100644
--- a/src/components/settings_modal/helpers/boolean_setting.vue
+++ b/src/components/settings_modal/helpers/boolean_setting.vue
@@ -5,7 +5,7 @@
>
-
+
diff --git a/src/components/settings_modal/helpers/choice_setting.js b/src/components/settings_modal/helpers/choice_setting.js
index 3da559fe..8aa5f54b 100644
--- a/src/components/settings_modal/helpers/choice_setting.js
+++ b/src/components/settings_modal/helpers/choice_setting.js
@@ -1,51 +1,20 @@
-import { get, set } from 'lodash'
import Select from 'src/components/select/select.vue'
import ModifiedIndicator from './modified_indicator.vue'
-import ServerSideIndicator from './server_side_indicator.vue'
+import ProfileSettingIndicator from './profile_setting_indicator.vue'
+import Setting from './setting.js'
+
export default {
components: {
Select,
ModifiedIndicator,
- ServerSideIndicator
+ ProfileSettingIndicator
},
- props: [
- 'path',
- 'disabled',
- 'options',
- 'expert'
- ],
- computed: {
- pathDefault () {
- const [firstSegment, ...rest] = this.path.split('.')
- return [firstSegment + 'DefaultValue', ...rest].join('.')
- },
- state () {
- const value = get(this.$parent, this.path)
- if (value === undefined) {
- return this.defaultState
- } else {
- return value
- }
- },
- defaultState () {
- return get(this.$parent, this.pathDefault)
- },
- isServerSide () {
- return this.path.startsWith('serverSide_')
- },
- isChanged () {
- return !this.path.startsWith('serverSide_') && this.state !== this.defaultState
- },
- matchesExpertLevel () {
- return (this.expert || 0) <= this.$parent.expertLevel
- }
- },
- methods: {
- update (e) {
- set(this.$parent, this.path, e)
- },
- reset () {
- set(this.$parent, this.path, this.defaultState)
+ ...Setting,
+ props: {
+ ...Setting.props,
+ options: {
+ type: Array,
+ required: true
}
}
}
diff --git a/src/components/settings_modal/helpers/choice_setting.vue b/src/components/settings_modal/helpers/choice_setting.vue
index 8fdbb5d3..4c4cdefe 100644
--- a/src/components/settings_modal/helpers/choice_setting.vue
+++ b/src/components/settings_modal/helpers/choice_setting.vue
@@ -23,7 +23,7 @@
:changed="isChanged"
:onclick="reset"
/>
-
+
diff --git a/src/components/settings_modal/helpers/integer_setting.js b/src/components/settings_modal/helpers/integer_setting.js
index e64d0cee..0f29f11a 100644
--- a/src/components/settings_modal/helpers/integer_setting.js
+++ b/src/components/settings_modal/helpers/integer_setting.js
@@ -1,44 +1,15 @@
-import { get, set } from 'lodash'
import ModifiedIndicator from './modified_indicator.vue'
+import Setting from './setting.js'
+
export default {
components: {
ModifiedIndicator
},
- props: {
- path: String,
- disabled: Boolean,
- min: Number,
- expert: [Number, String]
- },
- computed: {
- pathDefault () {
- const [firstSegment, ...rest] = this.path.split('.')
- return [firstSegment + 'DefaultValue', ...rest].join('.')
- },
- state () {
- const value = get(this.$parent, this.path)
- if (value === undefined) {
- return this.defaultState
- } else {
- return value
- }
- },
- defaultState () {
- return get(this.$parent, this.pathDefault)
- },
- isChanged () {
- return this.state !== this.defaultState
- },
- matchesExpertLevel () {
- return (this.expert || 0) <= this.$parent.expertLevel
- }
- },
+ ...Setting,
methods: {
+ ...Setting.methods,
update (e) {
- set(this.$parent, this.path, parseInt(e.target.value))
- },
- reset () {
- set(this.$parent, this.path, this.defaultState)
+ this.configSink(this.path, parseInt(e.target.value))
}
}
}
diff --git a/src/components/settings_modal/helpers/profile_setting_indicator.vue b/src/components/settings_modal/helpers/profile_setting_indicator.vue
new file mode 100644
index 00000000..d160781b
--- /dev/null
+++ b/src/components/settings_modal/helpers/profile_setting_indicator.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+ {{ $t('settings.setting_server_side') }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/settings_modal/helpers/server_side_indicator.vue b/src/components/settings_modal/helpers/server_side_indicator.vue
deleted file mode 100644
index bf181959..00000000
--- a/src/components/settings_modal/helpers/server_side_indicator.vue
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{ $t('settings.setting_server_side') }}
-
-
-
-
-
-
-
-
-
diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js
new file mode 100644
index 00000000..dc37675c
--- /dev/null
+++ b/src/components/settings_modal/helpers/setting.js
@@ -0,0 +1,84 @@
+import { get, set } from 'lodash'
+export default {
+ props: {
+ path: {
+ type: String,
+ required: true
+ },
+ disabled: {
+ type: Boolean,
+ default: false
+ },
+ parentPath: {
+ type: String
+ },
+ parentInvert: {
+ type: Boolean,
+ default: false
+ },
+ expert: {
+ type: [Number, String],
+ default: 0
+ },
+ source: {
+ type: String,
+ default: 'default'
+ }
+ },
+ computed: {
+ state () {
+ const value = get(this.configSource, this.path)
+ if (value === undefined) {
+ return this.defaultState
+ } else {
+ return value
+ }
+ },
+ shouldBeDisabled () {
+ const parentValue = this.parentPath !== undefined ? get(this.configSource, this.parentPath) : null
+ return this.disabled || (parentValue !== null ? (this.parentInvert ? parentValue : !parentValue) : false)
+ },
+ configSource () {
+ switch (this.source) {
+ case 'profile':
+ return this.$store.state.profileConfig
+ default:
+ return this.$store.getters.mergedConfig
+ }
+ },
+ configSink () {
+ switch (this.source) {
+ case 'profile':
+ return (k, v) => this.$store.dispatch('setProfileOption', { name: k, value: v })
+ default:
+ return (k, v) => this.$store.dispatch('setOption', { name: k, value: v })
+ }
+ },
+ defaultState () {
+ switch (this.source) {
+ case 'profile':
+ return {}
+ default:
+ return get(this.$store.getters.defaultConfig, this.path)
+ }
+ },
+ isProfileTied () {
+ return this.source === 'profile'
+ },
+ isChanged () {
+ return !this.source === 'default' && this.state !== this.defaultState
+ },
+ matchesExpertLevel () {
+ return (this.expert || 0) <= this.$store.state.config.expertLevel > 0
+ }
+ },
+ methods: {
+ update (e) {
+ console.log('U', this.path, e)
+ this.configSink(this.path, e)
+ },
+ reset () {
+ set(this.$store.getters.mergedConfig, this.path, this.defaultState)
+ }
+ }
+}
diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js
index 12431dca..6b22174d 100644
--- a/src/components/settings_modal/helpers/shared_computed_object.js
+++ b/src/components/settings_modal/helpers/shared_computed_object.js
@@ -1,19 +1,9 @@
import { defaultState as configDefaultState } from 'src/modules/config.js'
-import { defaultState as serverSideConfigDefaultState } from 'src/modules/serverSideConfig.js'
const SharedComputedObject = () => ({
user () {
return this.$store.state.users.currentUser
},
- // Getting values for default properties
- ...Object.keys(configDefaultState)
- .map(key => [
- key + 'DefaultValue',
- function () {
- return this.$store.getters.defaultConfig[key]
- }
- ])
- .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
// Generating computed values for vuex properties
...Object.keys(configDefaultState)
.map(key => [key, {
@@ -23,14 +13,6 @@ const SharedComputedObject = () => ({
}
}])
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
- ...Object.keys(serverSideConfigDefaultState)
- .map(key => ['serverSide_' + key, {
- get () { return this.$store.state.serverSideConfig[key] },
- set (value) {
- this.$store.dispatch('setServerSideOption', { name: key, value })
- }
- }])
- .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
// Special cases (need to transform values or perform actions first)
useStreamingApi: {
get () { return this.$store.getters.mergedConfig.useStreamingApi },
diff --git a/src/components/settings_modal/helpers/size_setting.js b/src/components/settings_modal/helpers/size_setting.js
index 58697412..4a0f7e48 100644
--- a/src/components/settings_modal/helpers/size_setting.js
+++ b/src/components/settings_modal/helpers/size_setting.js
@@ -1,6 +1,6 @@
-import { get, set } from 'lodash'
import ModifiedIndicator from './modified_indicator.vue'
import Select from 'src/components/select/select.vue'
+import Setting from './setting.js'
export const allCssUnits = ['cm', 'mm', 'in', 'px', 'pt', 'pc', 'em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', '%']
export const defaultHorizontalUnits = ['px', 'rem', 'vw']
@@ -11,57 +11,31 @@ export default {
ModifiedIndicator,
Select
},
+ ...Setting,
props: {
- path: String,
- disabled: Boolean,
+ ...Setting.props,
min: Number,
units: {
- type: [String],
+ type: Array,
default: () => allCssUnits
- },
- expert: [Number, String]
+ }
},
computed: {
- pathDefault () {
- const [firstSegment, ...rest] = this.path.split('.')
- return [firstSegment + 'DefaultValue', ...rest].join('.')
- },
+ ...Setting.computed,
stateUnit () {
- return (this.state || '').replace(/\d+/, '')
+ return this.state.replace(/\d+/, '')
},
stateValue () {
- return (this.state || '').replace(/\D+/, '')
- },
- state () {
- const value = get(this.$parent, this.path)
- if (value === undefined) {
- return this.defaultState
- } else {
- return value
- }
- },
- defaultState () {
- return get(this.$parent, this.pathDefault)
- },
- isChanged () {
- return this.state !== this.defaultState
- },
- matchesExpertLevel () {
- return (this.expert || 0) <= this.$parent.expertLevel
+ return this.state.replace(/\D+/, '')
}
},
methods: {
- update (e) {
- set(this.$parent, this.path, e)
- },
- reset () {
- set(this.$parent, this.path, this.defaultState)
- },
+ ...Setting.methods,
updateValue (e) {
- set(this.$parent, this.path, parseInt(e.target.value) + this.stateUnit)
+ this.configSink(this.path, parseInt(e.target.value) + this.stateUnit)
},
updateUnit (e) {
- set(this.$parent, this.path, this.stateValue + e.target.value)
+ this.configSink(this.path, this.stateValue + e.target.value)
}
}
}
diff --git a/src/components/settings_modal/tabs/filtering_tab.vue b/src/components/settings_modal/tabs/filtering_tab.vue
index 97046ff0..46c6bc5c 100644
--- a/src/components/settings_modal/tabs/filtering_tab.vue
+++ b/src/components/settings_modal/tabs/filtering_tab.vue
@@ -7,13 +7,11 @@
{{ $t('settings.hide_filtered_statuses') }}
-
+
-
{{ $t('settings.hide_wordfiltered_statuses') }}
@@ -22,7 +20,8 @@
-
{{ $t('settings.hide_muted_threads') }}
@@ -31,7 +30,8 @@
-
{{ $t('settings.hide_muted_posts') }}
diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js
index ea24d6ad..e8f7016e 100644
--- a/src/components/settings_modal/tabs/general_tab.js
+++ b/src/components/settings_modal/tabs/general_tab.js
@@ -6,7 +6,7 @@ import SizeSetting, { defaultHorizontalUnits } from '../helpers/size_setting.vue
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
import SharedComputedObject from '../helpers/shared_computed_object.js'
-import ServerSideIndicator from '../helpers/server_side_indicator.vue'
+import ProfileSettingIndicator from '../helpers/profile_setting_indicator.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faGlobe
@@ -65,7 +65,7 @@ const GeneralTab = {
SizeSetting,
InterfaceLanguageSwitcher,
ScopeSelector,
- ServerSideIndicator
+ ProfileSettingIndicator
},
computed: {
horizontalUnits () {
@@ -108,7 +108,7 @@ const GeneralTab = {
},
methods: {
changeDefaultScope (value) {
- this.$store.dispatch('setServerSideOption', { name: 'defaultScope', value })
+ this.$store.dispatch('setProfileOption', { name: 'defaultScope', value })
}
}
}
diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue
index 65248ac1..0eb3d06c 100644
--- a/src/components/settings_modal/tabs/general_tab.vue
+++ b/src/components/settings_modal/tabs/general_tab.vue
@@ -29,14 +29,11 @@
{{ $t('settings.streaming') }}
-
+
-
{{ $t('settings.pause_on_unfocused') }}
@@ -265,7 +262,7 @@
-
{{ $t('settings.no_rich_text_description') }}
@@ -290,7 +287,7 @@
{{ $t('settings.preload_images') }}
@@ -299,7 +296,7 @@
{{ $t('settings.use_one_click_nsfw') }}
@@ -312,15 +309,13 @@
>
{{ $t('settings.loop_video') }}
-
+
-
{{ $t('settings.loop_video_silent_only') }}
@@ -418,18 +413,18 @@
-
-
-
+
{{ $t('settings.sensitive_by_default') }}
diff --git a/src/components/settings_modal/tabs/notifications_tab.vue b/src/components/settings_modal/tabs/notifications_tab.vue
index dd3806ed..ea095372 100644
--- a/src/components/settings_modal/tabs/notifications_tab.vue
+++ b/src/components/settings_modal/tabs/notifications_tab.vue
@@ -4,7 +4,7 @@
{{ $t('settings.notification_setting_filters') }}
-
-
+
{{ $t('settings.notification_setting_block_from_strangers') }}
@@ -67,7 +67,7 @@
-
{{ $t('settings.notification_setting_hide_notification_contents') }}
diff --git a/src/components/settings_modal/tabs/profile_tab.vue b/src/components/settings_modal/tabs/profile_tab.vue
index 6a5b478a..74652990 100644
--- a/src/components/settings_modal/tabs/profile_tab.vue
+++ b/src/components/settings_modal/tabs/profile_tab.vue
@@ -254,37 +254,35 @@
{{ $t('settings.account_privacy') }}
-
-
+
{{ $t('settings.lock_account_description') }}
-
-
+
{{ $t('settings.discoverable') }}
-
-
+
{{ $t('settings.allow_following_move') }}
-
-
+
{{ $t('settings.hide_favorites_description') }}
-
-
+
{{ $t('settings.hide_followers_description') }}
-
+
-
{{ $t('settings.hide_followers_count_description') }}
@@ -292,17 +290,15 @@
-
-
+
{{ $t('settings.hide_follows_description') }}
-
+
-
{{ $t('settings.hide_follows_count_description') }}
diff --git a/src/main.js b/src/main.js
index d3e60a0f..fd712113 100644
--- a/src/main.js
+++ b/src/main.js
@@ -10,7 +10,7 @@ import listsModule from './modules/lists.js'
import usersModule from './modules/users.js'
import apiModule from './modules/api.js'
import configModule from './modules/config.js'
-import serverSideConfigModule from './modules/serverSideConfig.js'
+import profileConfigModule from './modules/profileConfig.js'
import serverSideStorageModule from './modules/serverSideStorage.js'
import shoutModule from './modules/shout.js'
import oauthModule from './modules/oauth.js'
@@ -80,7 +80,7 @@ const persistedStateOptions = {
lists: listsModule,
api: apiModule,
config: configModule,
- serverSideConfig: serverSideConfigModule,
+ profileConfig: profileConfigModule,
serverSideStorage: serverSideStorageModule,
shout: shoutModule,
oauth: oauthModule,
diff --git a/src/modules/config.js b/src/modules/config.js
index 3d9cf591..6ab59d6d 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -1,6 +1,7 @@
import Cookies from 'js-cookie'
import { setPreset, applyTheme, applyConfig } from '../services/style_setter/style_setter.js'
import messages from '../i18n/messages'
+import { set } from 'lodash'
import localeService from '../services/locale/locale.service.js'
const BACKEND_LANGUAGE_COOKIE_NAME = 'userLanguage'
@@ -147,7 +148,7 @@ const config = {
},
mutations: {
setOption (state, { name, value }) {
- state[name] = value
+ set(state, name, value)
},
setHighlight (state, { user, color, type }) {
const data = this.state.config.highlight[user]
diff --git a/src/modules/profileConfig.js b/src/modules/profileConfig.js
new file mode 100644
index 00000000..2cb2014a
--- /dev/null
+++ b/src/modules/profileConfig.js
@@ -0,0 +1,140 @@
+import { get, set } from 'lodash'
+
+const defaultApi = ({ rootState, commit }, { path, value }) => {
+ const params = {}
+ set(params, path, value)
+ return rootState
+ .api
+ .backendInteractor
+ .updateProfile({ params })
+ .then(result => {
+ commit('addNewUsers', [result])
+ commit('setCurrentUser', result)
+ })
+}
+
+const notificationsApi = ({ rootState, commit }, { path, value, oldValue }) => {
+ const settings = {}
+ set(settings, path, value)
+ return rootState
+ .api
+ .backendInteractor
+ .updateNotificationSettings({ settings })
+ .then(result => {
+ if (result.status === 'success') {
+ commit('confirmProfileOption', { name, value })
+ } else {
+ commit('confirmProfileOption', { name, value: oldValue })
+ }
+ })
+}
+
+/**
+ * Map that stores relation between path for reading (from user profile),
+ * for writing (into API) an what API to use.
+ *
+ * Shorthand - instead of { get, set, api? } object it's possible to use string
+ * in case default api is used and get = set
+ *
+ * If no api is specified, defaultApi is used (see above)
+ */
+export const settingsMap = {
+ defaultScope: 'source.privacy',
+ defaultNSFW: 'source.sensitive', // BROKEN: pleroma/pleroma#2837
+ stripRichContent: {
+ get: 'source.pleroma.no_rich_text',
+ set: 'no_rich_text'
+ },
+ // Privacy
+ locked: 'locked',
+ acceptChatMessages: {
+ get: 'pleroma.accepts_chat_messages',
+ set: 'accepts_chat_messages'
+ },
+ allowFollowingMove: {
+ get: 'pleroma.allow_following_move',
+ set: 'allow_following_move'
+ },
+ discoverable: {
+ get: 'source.pleroma.discoverable',
+ set: 'discoverable'
+ },
+ hideFavorites: {
+ get: 'pleroma.hide_favorites',
+ set: 'hide_favorites'
+ },
+ hideFollowers: {
+ get: 'pleroma.hide_followers',
+ set: 'hide_followers'
+ },
+ hideFollows: {
+ get: 'pleroma.hide_follows',
+ set: 'hide_follows'
+ },
+ hideFollowersCount: {
+ get: 'pleroma.hide_followers_count',
+ set: 'hide_followers_count'
+ },
+ hideFollowsCount: {
+ get: 'pleroma.hide_follows_count',
+ set: 'hide_follows_count'
+ },
+ // NotificationSettingsAPIs
+ webPushHideContents: {
+ get: 'pleroma.notification_settings.hide_notification_contents',
+ set: 'hide_notification_contents',
+ api: notificationsApi
+ },
+ blockNotificationsFromStrangers: {
+ get: 'pleroma.notification_settings.block_from_strangers',
+ set: 'block_from_strangers',
+ api: notificationsApi
+ }
+}
+
+export const defaultState = Object.fromEntries(Object.keys(settingsMap).map(key => [key, null]))
+
+const profileConfig = {
+ state: { ...defaultState },
+ mutations: {
+ confirmProfileOption (state, { name, value }) {
+ set(state, name, value)
+ },
+ wipeProfileOption (state, { name }) {
+ set(state, name, null)
+ },
+ wipeAllProfileOptions (state) {
+ Object.keys(settingsMap).forEach(key => {
+ set(state, key, null)
+ })
+ },
+ // Set the settings based on their path location
+ setCurrentUser (state, user) {
+ Object.entries(settingsMap).forEach((map) => {
+ const [name, value] = map
+ const { get: path = value } = value
+ set(state, name, get(user._original, path))
+ })
+ }
+ },
+ actions: {
+ setProfileOption ({ rootState, state, commit, dispatch }, { name, value }) {
+ const oldValue = get(state, name)
+ const map = settingsMap[name]
+ if (!map) throw new Error('Invalid server-side setting')
+ const { set: path = map, api = defaultApi } = map
+ commit('wipeProfileOption', { name })
+
+ api({ rootState, commit }, { path, value, oldValue })
+ .catch((e) => {
+ console.warn('Error setting server-side option:', e)
+ commit('confirmProfileOption', { name, value: oldValue })
+ })
+ },
+ logout ({ commit }) {
+ commit('wipeAllProfileOptions')
+ }
+ }
+}
+
+export default profileConfig
diff --git a/src/modules/serverSideConfig.js b/src/modules/serverSideConfig.js
deleted file mode 100644
index 476263bc..00000000
--- a/src/modules/serverSideConfig.js
+++ /dev/null
@@ -1,140 +0,0 @@
-import { get, set } from 'lodash'
-
-const defaultApi = ({ rootState, commit }, { path, value }) => {
- const params = {}
- set(params, path, value)
- return rootState
- .api
- .backendInteractor
- .updateProfile({ params })
- .then(result => {
- commit('addNewUsers', [result])
- commit('setCurrentUser', result)
- })
-}
-
-const notificationsApi = ({ rootState, commit }, { path, value, oldValue }) => {
- const settings = {}
- set(settings, path, value)
- return rootState
- .api
- .backendInteractor
- .updateNotificationSettings({ settings })
- .then(result => {
- if (result.status === 'success') {
- commit('confirmServerSideOption', { name, value })
- } else {
- commit('confirmServerSideOption', { name, value: oldValue })
- }
- })
-}
-
-/**
- * Map that stores relation between path for reading (from user profile),
- * for writing (into API) an what API to use.
- *
- * Shorthand - instead of { get, set, api? } object it's possible to use string
- * in case default api is used and get = set
- *
- * If no api is specified, defaultApi is used (see above)
- */
-export const settingsMap = {
- defaultScope: 'source.privacy',
- defaultNSFW: 'source.sensitive', // BROKEN: pleroma/pleroma#2837
- stripRichContent: {
- get: 'source.pleroma.no_rich_text',
- set: 'no_rich_text'
- },
- // Privacy
- locked: 'locked',
- acceptChatMessages: {
- get: 'pleroma.accepts_chat_messages',
- set: 'accepts_chat_messages'
- },
- allowFollowingMove: {
- get: 'pleroma.allow_following_move',
- set: 'allow_following_move'
- },
- discoverable: {
- get: 'source.pleroma.discoverable',
- set: 'discoverable'
- },
- hideFavorites: {
- get: 'pleroma.hide_favorites',
- set: 'hide_favorites'
- },
- hideFollowers: {
- get: 'pleroma.hide_followers',
- set: 'hide_followers'
- },
- hideFollows: {
- get: 'pleroma.hide_follows',
- set: 'hide_follows'
- },
- hideFollowersCount: {
- get: 'pleroma.hide_followers_count',
- set: 'hide_followers_count'
- },
- hideFollowsCount: {
- get: 'pleroma.hide_follows_count',
- set: 'hide_follows_count'
- },
- // NotificationSettingsAPIs
- webPushHideContents: {
- get: 'pleroma.notification_settings.hide_notification_contents',
- set: 'hide_notification_contents',
- api: notificationsApi
- },
- blockNotificationsFromStrangers: {
- get: 'pleroma.notification_settings.block_from_strangers',
- set: 'block_from_strangers',
- api: notificationsApi
- }
-}
-
-export const defaultState = Object.fromEntries(Object.keys(settingsMap).map(key => [key, null]))
-
-const serverSideConfig = {
- state: { ...defaultState },
- mutations: {
- confirmServerSideOption (state, { name, value }) {
- set(state, name, value)
- },
- wipeServerSideOption (state, { name }) {
- set(state, name, null)
- },
- wipeAllServerSideOptions (state) {
- Object.keys(settingsMap).forEach(key => {
- set(state, key, null)
- })
- },
- // Set the settings based on their path location
- setCurrentUser (state, user) {
- Object.entries(settingsMap).forEach((map) => {
- const [name, value] = map
- const { get: path = value } = value
- set(state, name, get(user._original, path))
- })
- }
- },
- actions: {
- setServerSideOption ({ rootState, state, commit, dispatch }, { name, value }) {
- const oldValue = get(state, name)
- const map = settingsMap[name]
- if (!map) throw new Error('Invalid server-side setting')
- const { set: path = map, api = defaultApi } = map
- commit('wipeServerSideOption', { name })
-
- api({ rootState, commit }, { path, value, oldValue })
- .catch((e) => {
- console.warn('Error setting server-side option:', e)
- commit('confirmServerSideOption', { name, value: oldValue })
- })
- },
- logout ({ commit }) {
- commit('wipeAllServerSideOptions')
- }
- }
-}
-
-export default serverSideConfig
--
cgit v1.2.3-70-g09d2
From ac32997f8b17ba3f2209c992c27394c48a1594c7 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 12 Mar 2023 16:51:50 +0200
Subject: move websocket connection logic into module
---
.../helpers/shared_computed_object.js | 19 +-----
src/modules/config.js | 70 ++++++++++++++--------
2 files changed, 46 insertions(+), 43 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js
index 6b22174d..e898c8ac 100644
--- a/src/components/settings_modal/helpers/shared_computed_object.js
+++ b/src/components/settings_modal/helpers/shared_computed_object.js
@@ -12,24 +12,7 @@ const SharedComputedObject = () => ({
this.$store.dispatch('setOption', { name: key, value })
}
}])
- .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
- // Special cases (need to transform values or perform actions first)
- useStreamingApi: {
- get () { return this.$store.getters.mergedConfig.useStreamingApi },
- set (value) {
- const promise = value
- ? this.$store.dispatch('enableMastoSockets')
- : this.$store.dispatch('disableMastoSockets')
-
- promise.then(() => {
- this.$store.dispatch('setOption', { name: 'useStreamingApi', value })
- }).catch((e) => {
- console.error('Failed starting MastoAPI Streaming socket', e)
- this.$store.dispatch('disableMastoSockets')
- this.$store.dispatch('setOption', { name: 'useStreamingApi', value: false })
- })
- }
- }
+ .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})
})
export default SharedComputedObject
diff --git a/src/modules/config.js b/src/modules/config.js
index 6ab59d6d..5e3f0105 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -178,31 +178,51 @@ const config = {
commit('setHighlight', { user, color, type })
},
setOption ({ commit, dispatch, state }, { name, value }) {
- commit('setOption', { name, value })
- switch (name) {
- case 'theme':
- setPreset(value)
- break
- case 'sidebarColumnWidth':
- case 'contentColumnWidth':
- case 'notifsColumnWidth':
- applyConfig(state)
- break
- case 'customTheme':
- case 'customThemeSource':
- applyTheme(value)
- break
- case 'interfaceLanguage':
- messages.setLanguage(this.getters.i18n, value)
- dispatch('loadUnicodeEmojiData', value)
- Cookies.set(
- BACKEND_LANGUAGE_COOKIE_NAME,
- localeService.internalToBackendLocaleMulti(value)
- )
- break
- case 'thirdColumnMode':
- dispatch('setLayoutWidth', undefined)
- break
+ const exceptions = new Set([
+ 'useStreamingApi'
+ ])
+
+ if (exceptions.has(name)) {
+ switch (name) {
+ case 'useStreamingApi': {
+ const action = value ? 'enableMastoSockets' : 'disableMastoSockets'
+
+ dispatch(action).then(() => {
+ commit('setOption', { name: 'useStreamingApi', value })
+ }).catch((e) => {
+ console.error('Failed starting MastoAPI Streaming socket', e)
+ dispatch('disableMastoSockets')
+ dispatch('setOption', { name: 'useStreamingApi', value: false })
+ })
+ }
+ }
+ } else {
+ commit('setOption', { name, value })
+ switch (name) {
+ case 'theme':
+ setPreset(value)
+ break
+ case 'sidebarColumnWidth':
+ case 'contentColumnWidth':
+ case 'notifsColumnWidth':
+ applyConfig(state)
+ break
+ case 'customTheme':
+ case 'customThemeSource':
+ applyTheme(value)
+ break
+ case 'interfaceLanguage':
+ messages.setLanguage(this.getters.i18n, value)
+ dispatch('loadUnicodeEmojiData', value)
+ Cookies.set(
+ BACKEND_LANGUAGE_COOKIE_NAME,
+ localeService.internalToBackendLocaleMulti(value)
+ )
+ break
+ case 'thirdColumnMode':
+ dispatch('setLayoutWidth', undefined)
+ break
+ }
}
}
}
--
cgit v1.2.3-70-g09d2
From 947b73f8702ff4b7c5f74620204e86a4f375315c Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 12 Mar 2023 16:55:39 +0200
Subject: minimize the rest of the sharedcomputedobject
---
.../settings_modal/helpers/shared_computed_object.js | 14 +++-----------
1 file changed, 3 insertions(+), 11 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js
index e898c8ac..b8a016e6 100644
--- a/src/components/settings_modal/helpers/shared_computed_object.js
+++ b/src/components/settings_modal/helpers/shared_computed_object.js
@@ -1,18 +1,10 @@
-import { defaultState as configDefaultState } from 'src/modules/config.js'
-
const SharedComputedObject = () => ({
user () {
return this.$store.state.users.currentUser
},
- // Generating computed values for vuex properties
- ...Object.keys(configDefaultState)
- .map(key => [key, {
- get () { return this.$store.getters.mergedConfig[key] },
- set (value) {
- this.$store.dispatch('setOption', { name: key, value })
- }
- }])
- .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})
+ expertLevel () {
+ return this.$store.getters.mergedConfig.expertLevel > 0
+ }
})
export default SharedComputedObject
--
cgit v1.2.3-70-g09d2
From 6a7b182af11af6c50439c62bc5ee37cc5960810e Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 12 Mar 2023 17:11:20 +0200
Subject: fixes for stuff i missed
---
.../settings_modal/helpers/boolean_setting.vue | 2 +-
src/components/settings_modal/helpers/setting.js | 2 +-
.../helpers/shared_computed_object.js | 3 +++
src/components/settings_modal/tabs/general_tab.vue | 2 +-
.../tabs/security_tab/security_tab.vue | 22 +++++++++++-----------
5 files changed, 17 insertions(+), 14 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/helpers/boolean_setting.vue b/src/components/settings_modal/helpers/boolean_setting.vue
index bc014bc9..260ee75e 100644
--- a/src/components/settings_modal/helpers/boolean_setting.vue
+++ b/src/components/settings_modal/helpers/boolean_setting.vue
@@ -19,7 +19,7 @@
:changed="isChanged"
:onclick="reset"
/>
-
+
diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js
index dc37675c..a766e6dc 100644
--- a/src/components/settings_modal/helpers/setting.js
+++ b/src/components/settings_modal/helpers/setting.js
@@ -62,7 +62,7 @@ export default {
return get(this.$store.getters.defaultConfig, this.path)
}
},
- isProfileTied () {
+ isProfileSetting () {
return this.source === 'profile'
},
isChanged () {
diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js
index b8a016e6..912999ce 100644
--- a/src/components/settings_modal/helpers/shared_computed_object.js
+++ b/src/components/settings_modal/helpers/shared_computed_object.js
@@ -4,6 +4,9 @@ const SharedComputedObject = () => ({
},
expertLevel () {
return this.$store.getters.mergedConfig.expertLevel > 0
+ },
+ mergedConfig () {
+ return this.$store.getters.mergedConfig
}
})
diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue
index 0eb3d06c..eb2cef9b 100644
--- a/src/components/settings_modal/tabs/general_tab.vue
+++ b/src/components/settings_modal/tabs/general_tab.vue
@@ -210,7 +210,7 @@
-
diff --git a/src/components/settings_modal/tabs/security_tab/security_tab.vue b/src/components/settings_modal/tabs/security_tab/security_tab.vue
index 6e03bef4..d36d478f 100644
--- a/src/components/settings_modal/tabs/security_tab/security_tab.vue
+++ b/src/components/settings_modal/tabs/security_tab/security_tab.vue
@@ -143,8 +143,8 @@
/>
-
foo@example.org
-
+
@@ -175,16 +175,16 @@
{{ $t('settings.move_account') }}
{{ $t('settings.move_account_notes') }}
-
-
- foo@example.org
-
-
+
+
+ foo@example.org
+
+
+
--
cgit v1.2.3-70-g09d2
From 4d23d31fecf480abfccc4db3ac79c6640078dc3b Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 14 Mar 2023 21:50:43 +0200
Subject: initial admin settings prototype (WIP)
---
src/components/admin_modal/admin_modal.js | 68 ++++++++++++
src/components/admin_modal/admin_modal.scss | 80 ++++++++++++++
src/components/admin_modal/admin_modal.vue | 121 +++++++++++++++++++++
src/components/admin_modal/admin_modal_content.js | 88 +++++++++++++++
.../admin_modal/admin_modal_content.scss | 56 ++++++++++
src/components/admin_modal/tabs/general_tab.js | 33 ++++++
src/components/desktop_nav/desktop_nav.js | 5 +-
src/components/desktop_nav/desktop_nav.vue | 9 +-
src/components/notification/notification.vue | 2 +-
.../settings_modal/admin_tabs/instance_tab.js | 29 +++++
.../settings_modal/admin_tabs/instance_tab.vue | 35 ++++++
src/components/settings_modal/helpers/setting.js | 14 ++-
.../settings_modal/helpers/string_setting.js | 9 ++
.../settings_modal/helpers/string_setting.vue | 25 +++++
src/components/settings_modal/settings_modal.js | 23 +++-
src/components/settings_modal/settings_modal.vue | 3 +-
.../settings_modal/settings_modal_admin_content.js | 76 +++++++++++++
.../settings_modal_admin_content.scss | 56 ++++++++++
.../settings_modal_admin_content.vue | 21 ++++
.../settings_modal/settings_modal_content.js | 88 ---------------
.../settings_modal/settings_modal_content.scss | 56 ----------
.../settings_modal/settings_modal_content.vue | 83 --------------
.../settings_modal/settings_modal_user_content.js | 88 +++++++++++++++
.../settings_modal_user_content.scss | 56 ++++++++++
.../settings_modal/settings_modal_user_content.vue | 83 ++++++++++++++
src/components/tab_switcher/tab_switcher.jsx | 8 +-
src/modules/adminSettings.js | 5 +-
src/modules/interface.js | 21 +++-
28 files changed, 985 insertions(+), 256 deletions(-)
create mode 100644 src/components/admin_modal/admin_modal.js
create mode 100644 src/components/admin_modal/admin_modal.scss
create mode 100644 src/components/admin_modal/admin_modal.vue
create mode 100644 src/components/admin_modal/admin_modal_content.js
create mode 100644 src/components/admin_modal/admin_modal_content.scss
create mode 100644 src/components/admin_modal/tabs/general_tab.js
create mode 100644 src/components/settings_modal/admin_tabs/instance_tab.js
create mode 100644 src/components/settings_modal/admin_tabs/instance_tab.vue
create mode 100644 src/components/settings_modal/helpers/string_setting.js
create mode 100644 src/components/settings_modal/helpers/string_setting.vue
create mode 100644 src/components/settings_modal/settings_modal_admin_content.js
create mode 100644 src/components/settings_modal/settings_modal_admin_content.scss
create mode 100644 src/components/settings_modal/settings_modal_admin_content.vue
delete mode 100644 src/components/settings_modal/settings_modal_content.js
delete mode 100644 src/components/settings_modal/settings_modal_content.scss
delete mode 100644 src/components/settings_modal/settings_modal_content.vue
create mode 100644 src/components/settings_modal/settings_modal_user_content.js
create mode 100644 src/components/settings_modal/settings_modal_user_content.scss
create mode 100644 src/components/settings_modal/settings_modal_user_content.vue
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/admin_modal/admin_modal.js b/src/components/admin_modal/admin_modal.js
new file mode 100644
index 00000000..525f09aa
--- /dev/null
+++ b/src/components/admin_modal/admin_modal.js
@@ -0,0 +1,68 @@
+import Modal from 'src/components/modal/modal.vue'
+import PanelLoading from 'src/components/panel_loading/panel_loading.vue'
+import AsyncComponentError from 'src/components/async_component_error/async_component_error.vue'
+import getResettableAsyncComponent from 'src/services/resettable_async_component.js'
+import Popover from '../popover/popover.vue'
+import Checkbox from 'src/components/checkbox/checkbox.vue'
+import { library } from '@fortawesome/fontawesome-svg-core'
+import {
+ newImporter,
+ newExporter
+} from 'src/services/export_import/export_import.js'
+import {
+ faTimes,
+ faFileUpload,
+ faFileDownload,
+ faChevronDown
+} from '@fortawesome/free-solid-svg-icons'
+import {
+ faWindowMinimize
+} from '@fortawesome/free-regular-svg-icons'
+
+library.add(
+ faTimes,
+ faWindowMinimize,
+ faFileUpload,
+ faFileDownload,
+ faChevronDown
+)
+
+const AdminModal = {
+ data () {
+ return {}
+ },
+ components: {
+ Modal,
+ Popover,
+ Checkbox,
+ AdminModalContent: getResettableAsyncComponent(
+ () => import('./admin_modal_content.vue'),
+ {
+ loadingComponent: PanelLoading,
+ errorComponent: AsyncComponentError,
+ delay: 0
+ }
+ )
+ },
+ methods: {
+ closeModal () {
+ this.$store.dispatch('closeAdminModal')
+ },
+ peekModal () {
+ this.$store.dispatch('togglePeekAdminModal')
+ }
+ },
+ computed: {
+ modalActivated () {
+ return this.$store.state.interface.adminModalState !== 'hidden'
+ },
+ modalOpenedOnce () {
+ return this.$store.state.interface.adminModalLoaded
+ },
+ modalPeeked () {
+ return this.$store.state.interface.adminModalState === 'minimized'
+ }
+ }
+}
+
+export default AdminModal
diff --git a/src/components/admin_modal/admin_modal.scss b/src/components/admin_modal/admin_modal.scss
new file mode 100644
index 00000000..0d916f32
--- /dev/null
+++ b/src/components/admin_modal/admin_modal.scss
@@ -0,0 +1,80 @@
+@import "src/variables";
+
+.admin-modal {
+ overflow: hidden;
+
+ .setting-list,
+ .option-list {
+ list-style-type: none;
+ padding-left: 2em;
+
+ li {
+ margin-bottom: 0.5em;
+ }
+
+ .suboptions {
+ margin-top: 0.3em;
+ }
+ }
+
+ .admin-modal-panel {
+ overflow: hidden;
+ transition: transform;
+ transition-timing-function: ease-in-out;
+ transition-duration: 300ms;
+ width: 1000px;
+ max-width: 90vw;
+ height: 90vh;
+
+ @media all and (max-width: 800px) {
+ max-width: 100vw;
+ height: 100%;
+ }
+
+ >.panel-body {
+ height: 100%;
+ overflow-y: hidden;
+
+ .btn {
+ min-height: 2em;
+ min-width: 10em;
+ padding: 0 2em;
+ }
+ }
+ }
+
+ .admin-footer {
+ display: flex;
+
+ >* {
+ margin-right: 0.5em;
+ }
+
+ .extra-content {
+ display: flex;
+ flex-grow: 1;
+ }
+ }
+
+ &.peek {
+ .admin-modal-panel {
+ /* Explanation:
+ * Modal is positioned vertically centered.
+ * 100vh - 100% = Distance between modal's top+bottom boundaries and screen
+ * (100vh - 100%) / 2 = Distance between bottom (or top) boundary and screen
+ * + 100% - we move modal completely off-screen, it's top boundary touches
+ * bottom of the screen
+ * - 50px - leaving tiny amount of space so that titlebar + tiny amount of modal is visible
+ */
+ transform: translateY(calc(((100vh - 100%) / 2 + 100%) - 50px));
+
+ @media all and (max-width: 800px) {
+ /* For mobile, the modal takes 100% of the available screen.
+ This ensures the minimized modal is always 50px above the browser bottom
+ bar regardless of whether or not it is visible.
+ */
+ transform: translateY(calc(100% - 50px));
+ }
+ }
+ }
+}
diff --git a/src/components/admin_modal/admin_modal.vue b/src/components/admin_modal/admin_modal.vue
new file mode 100644
index 00000000..d7e5a80f
--- /dev/null
+++ b/src/components/admin_modal/admin_modal.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+ {{ $t('admin.settings') }}
+
+
+
+ {{ currentSaveStateNotice.error ? $t('admin.saving_err') : $t('settings.saving_ok') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/admin_modal/admin_modal_content.js b/src/components/admin_modal/admin_modal_content.js
new file mode 100644
index 00000000..897cc163
--- /dev/null
+++ b/src/components/admin_modal/admin_modal_content.js
@@ -0,0 +1,88 @@
+import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
+
+import DataImportExportTab from './tabs/data_import_export_tab.vue'
+import MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue'
+import NotificationsTab from './tabs/notifications_tab.vue'
+import FilteringTab from './tabs/filtering_tab.vue'
+import SecurityTab from './tabs/security_tab/security_tab.vue'
+import ProfileTab from './tabs/profile_tab.vue'
+import GeneralTab from './tabs/general_tab.vue'
+import VersionTab from './tabs/version_tab.vue'
+import ThemeTab from './tabs/theme_tab/theme_tab.vue'
+
+import { library } from '@fortawesome/fontawesome-svg-core'
+import {
+ faWrench,
+ faUser,
+ faFilter,
+ faPaintBrush,
+ faBell,
+ faDownload,
+ faEyeSlash,
+ faInfo
+} from '@fortawesome/free-solid-svg-icons'
+
+library.add(
+ faWrench,
+ faUser,
+ faFilter,
+ faPaintBrush,
+ faBell,
+ faDownload,
+ faEyeSlash,
+ faInfo
+)
+
+const AdminModalContent = {
+ components: {
+ TabSwitcher,
+
+ DataImportExportTab,
+ MutesAndBlocksTab,
+ NotificationsTab,
+ FilteringTab,
+ SecurityTab,
+ ProfileTab,
+ GeneralTab,
+ VersionTab,
+ ThemeTab
+ },
+ computed: {
+ isLoggedIn () {
+ return !!this.$store.state.users.currentUser
+ },
+ open () {
+ return this.$store.state.interface.AdminModalState !== 'hidden'
+ },
+ bodyLock () {
+ return this.$store.state.interface.AdminModalState === 'visible'
+ }
+ },
+ methods: {
+ onOpen () {
+ const targetTab = this.$store.state.interface.AdminModalTargetTab
+ // We're being told to open in specific tab
+ if (targetTab) {
+ const tabIndex = this.$refs.tabSwitcher.$slots.default().findIndex(elm => {
+ return elm.props && elm.props['data-tab-name'] === targetTab
+ })
+ if (tabIndex >= 0) {
+ this.$refs.tabSwitcher.setTab(tabIndex)
+ }
+ }
+ // Clear the state of target tab, so that next time Admin is opened
+ // it doesn't force it.
+ this.$store.dispatch('clearAdminModalTargetTab')
+ }
+ },
+ mounted () {
+ this.onOpen()
+ },
+ watch: {
+ open: function (value) {
+ if (value) this.onOpen()
+ }
+ }
+}
+
+export default AdminModalContent
diff --git a/src/components/admin_modal/admin_modal_content.scss b/src/components/admin_modal/admin_modal_content.scss
new file mode 100644
index 00000000..2db7b2f8
--- /dev/null
+++ b/src/components/admin_modal/admin_modal_content.scss
@@ -0,0 +1,56 @@
+@import "src/variables";
+
+.admin_tab-switcher {
+ height: 100%;
+
+ .setting-item {
+ border-bottom: 2px solid var(--fg, $fallback--fg);
+ margin: 1em 1em 1.4em;
+ padding-bottom: 1.4em;
+
+ > div,
+ > label {
+ display: block;
+ margin-bottom: 0.5em;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .select-multiple {
+ display: flex;
+
+ .option-list {
+ margin: 0;
+ padding-left: 0.5em;
+ }
+ }
+
+ &:last-child {
+ border-bottom: none;
+ padding-bottom: 0;
+ margin-bottom: 1em;
+ }
+
+ select {
+ min-width: 10em;
+ }
+
+ textarea {
+ width: 100%;
+ max-width: 100%;
+ height: 100px;
+ }
+
+ .unavailable,
+ .unavailable svg {
+ color: var(--cRed, $fallback--cRed);
+ color: $fallback--cRed;
+ }
+
+ .number-input {
+ max-width: 6em;
+ }
+ }
+}
diff --git a/src/components/admin_modal/tabs/general_tab.js b/src/components/admin_modal/tabs/general_tab.js
new file mode 100644
index 00000000..8c166f19
--- /dev/null
+++ b/src/components/admin_modal/tabs/general_tab.js
@@ -0,0 +1,33 @@
+import BooleanSetting from '../settings_modal/helpers/boolean_setting.vue'
+import ChoiceSetting from '../settings_modal/helpers/choice_setting.vue'
+import IntegerSetting from '../settings_modal/helpers/integer_setting.vue'
+
+import { library } from '@fortawesome/fontawesome-svg-core'
+import {
+ faGlobe
+} from '@fortawesome/free-solid-svg-icons'
+
+library.add(
+ faGlobe
+)
+
+const GeneralTab = {
+ components: {
+ BooleanSetting,
+ ChoiceSetting,
+ IntegerSetting,
+ },
+ computed: {
+ mergedConfig () {
+ console.log(this.$store.state)
+ return this.$store.state
+ }
+ },
+ methods: {
+ changeDefaultScope (value) {
+ this.$store.dispatch('setProfileOption', { name: 'defaultScope', value })
+ }
+ }
+}
+
+export default GeneralTab
diff --git a/src/components/desktop_nav/desktop_nav.js b/src/components/desktop_nav/desktop_nav.js
index 745b1a81..f6a2e294 100644
--- a/src/components/desktop_nav/desktop_nav.js
+++ b/src/components/desktop_nav/desktop_nav.js
@@ -107,7 +107,10 @@ export default {
this.searchBarHidden = hidden
},
openSettingsModal () {
- this.$store.dispatch('openSettingsModal')
+ this.$store.dispatch('openSettingsModal', 'user')
+ },
+ openAdminModal () {
+ this.$store.dispatch('openSettingsModal', 'admin')
}
}
}
diff --git a/src/components/desktop_nav/desktop_nav.vue b/src/components/desktop_nav/desktop_nav.vue
index dc8bbfd3..49382f8e 100644
--- a/src/components/desktop_nav/desktop_nav.vue
+++ b/src/components/desktop_nav/desktop_nav.vue
@@ -48,20 +48,19 @@
icon="cog"
/>
-
-
+
-
+
+
diff --git a/src/components/settings_modal/helpers/choice_setting.js b/src/components/settings_modal/helpers/choice_setting.js
index a3c3bf44..3ff81bc9 100644
--- a/src/components/settings_modal/helpers/choice_setting.js
+++ b/src/components/settings_modal/helpers/choice_setting.js
@@ -11,7 +11,32 @@ export default {
...Setting.props,
options: {
type: Array,
- required: true
+ required: false
+ },
+ optionLabelMap: {
+ type: Object,
+ required: false,
+ default: {}
+ }
+ },
+ computed: {
+ ...Setting.computed,
+ realOptions () {
+ if (this.source === 'admin') {
+ console.log(this.backendDescriptionSuggestions)
+ return this.backendDescriptionSuggestions.map(x => ({
+ key: x,
+ value: x,
+ label: this.optionLabelMap[x] || x
+ }))
+ }
+ return this.options
+ }
+ },
+ methods: {
+ ...Setting.methods,
+ getValue (e) {
+ return e
}
}
}
diff --git a/src/components/settings_modal/helpers/choice_setting.vue b/src/components/settings_modal/helpers/choice_setting.vue
index 4c4cdefe..55f9a62c 100644
--- a/src/components/settings_modal/helpers/choice_setting.vue
+++ b/src/components/settings_modal/helpers/choice_setting.vue
@@ -3,15 +3,20 @@
v-if="matchesExpertLevel"
class="ChoiceSetting"
>
-
+
+ {{ backendDescriptionLabel }}
+
+
+
+
{{ ' ' }}
-
-
+
CAPTCHA
-
CAPTCHA TYPE
VALID
@@ -152,11 +102,7 @@
>
{{ $t('admin_dash.instance.kocaptcha') }}
-
-
+
cockAPTCHA ENDPOINT
diff --git a/src/components/settings_modal/helpers/choice_setting.js b/src/components/settings_modal/helpers/choice_setting.js
index 3ff81bc9..bdeece76 100644
--- a/src/components/settings_modal/helpers/choice_setting.js
+++ b/src/components/settings_modal/helpers/choice_setting.js
@@ -22,8 +22,7 @@ export default {
computed: {
...Setting.computed,
realOptions () {
- if (this.source === 'admin') {
- console.log(this.backendDescriptionSuggestions)
+ if (this.realSource === 'admin') {
return this.backendDescriptionSuggestions.map(x => ({
key: x,
value: x,
diff --git a/src/components/settings_modal/helpers/choice_setting.vue b/src/components/settings_modal/helpers/choice_setting.vue
index 55f9a62c..8713acf5 100644
--- a/src/components/settings_modal/helpers/choice_setting.vue
+++ b/src/components/settings_modal/helpers/choice_setting.vue
@@ -11,7 +11,7 @@
{{ ' ' }}
+
+
+
+
{{ $t('admin_dash.instance.access') }}
+
-
PUBLIC
+ -
+
{{ $t('admin_dash.instance.restrict.header') }}
+
+ -
+
+ SEARCH RESTRICTION
+
+
+ -
+
{{ $t('admin_dash.instance.restrict.timelines') }}
+
+ -
+
+ LOCAL TIMELINES
+
+
+ -
+
+ FED TIMELINES
+
+
+ -
+
{{ $t('admin_dash.instance.restrict.profiles') }}
+
+ -
+
+ LOCAL PROFILES
+
+
+ -
+
+ FED PROFILES
+
+
+ -
+
{{ $t('admin_dash.instance.restrict.activities') }}
+
+ -
+
+ LOCAL STATUSES
+
+
+ -
+
+ FED STATUSES
+
+
@@ -52,13 +122,28 @@
INVITES ENABLED
+
-
+
+ BDEY REQUIRED
+
+
+ -
+
+ BDEY age of consent
+
+
+
+
-
ACTIVATION REQUIRED
diff --git a/src/components/settings_modal/helpers/boolean_setting.js b/src/components/settings_modal/helpers/boolean_setting.js
index 0df01d31..199d3d0f 100644
--- a/src/components/settings_modal/helpers/boolean_setting.js
+++ b/src/components/settings_modal/helpers/boolean_setting.js
@@ -3,13 +3,28 @@ import Setting from './setting.js'
export default {
...Setting,
+ props: {
+ ...Setting.props,
+ indeterminateState: [String, Object]
+ },
components: {
...Setting.components,
Checkbox
},
+ computed: {
+ ...Setting.computed,
+ isIndeterminate () {
+ return this.visibleState === this.indeterminateState
+ }
+ },
methods: {
...Setting.methods,
getValue (e) {
+ // Basic tri-state toggle implementation
+ if (!!this.indeterminateState && !e && this.visibleState === true) {
+ // If we have indeterminate state, switching from true to false first goes through indeterminate
+ return this.indeterminateState
+ }
return e
}
}
diff --git a/src/components/settings_modal/helpers/boolean_setting.vue b/src/components/settings_modal/helpers/boolean_setting.vue
index 07971b00..6307d526 100644
--- a/src/components/settings_modal/helpers/boolean_setting.vue
+++ b/src/components/settings_modal/helpers/boolean_setting.vue
@@ -4,13 +4,15 @@
class="BooleanSetting"
>
{{ backendDescriptionLabel }}
@@ -29,6 +31,7 @@
{{ backendDescriptionDescription + ' ' }}
diff --git a/src/components/settings_modal/helpers/draft_buttons.vue b/src/components/settings_modal/helpers/draft_buttons.vue
index 9e972b14..80da92e8 100644
--- a/src/components/settings_modal/helpers/draft_buttons.vue
+++ b/src/components/settings_modal/helpers/draft_buttons.vue
@@ -49,13 +49,13 @@
-
+
-
+
+ TIMELINES
+
+
-
{{ $t('admin_dash.instance.restrict.profiles') }}
@@ -89,6 +94,11 @@
FED PROFILES
+
-
+
+ PROFILES
+
+
-
{{ $t('admin_dash.instance.restrict.activities') }}
@@ -108,6 +118,11 @@
FED STATUSES
+
-
+
+ STATUSES
+
+
diff --git a/src/components/settings_modal/helpers/group_setting.js b/src/components/settings_modal/helpers/group_setting.js
new file mode 100644
index 00000000..12a49000
--- /dev/null
+++ b/src/components/settings_modal/helpers/group_setting.js
@@ -0,0 +1,14 @@
+import { isEqual } from 'lodash'
+
+import Setting from './setting.js'
+
+export default {
+ ...Setting,
+ computed: {
+ ...Setting.computed,
+ isDirty () {
+ console.log(this.state, this.draft)
+ return !isEqual(this.state, this.draft)
+ }
+ }
+}
diff --git a/src/components/settings_modal/helpers/group_setting.vue b/src/components/settings_modal/helpers/group_setting.vue
new file mode 100644
index 00000000..a4df4bf3
--- /dev/null
+++ b/src/components/settings_modal/helpers/group_setting.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js
index d42ae763..d2e1a6f4 100644
--- a/src/components/settings_modal/helpers/setting.js
+++ b/src/components/settings_modal/helpers/setting.js
@@ -48,15 +48,32 @@ export default {
},
data () {
return {
- draft: null
+ localDraft: null
}
},
created () {
- if (this.realDraftMode) {
+ if (this.realDraftMode && this.realSource !== 'admin') {
this.draft = this.state
}
},
computed: {
+ draft: {
+ // TODO allow passing shared draft object?
+ get () {
+ if (this.realSource === 'admin') {
+ return get(this.$store.state.adminSettings.draft, this.path)
+ } else {
+ return this.localDraft
+ }
+ },
+ set (value) {
+ if (this.realSource === 'admin') {
+ this.$store.commit('updateAdminDraft', { path: this.canonPath, value })
+ } else {
+ this.localDraft = value
+ }
+ }
+ },
state () {
const value = get(this.configSource, this.path)
if (value === undefined) {
@@ -130,11 +147,18 @@ export default {
return this.state !== this.defaultState
}
},
+ canonPath () {
+ return Array.isArray(this.path) ? this.path : this.path.split('.')
+ },
isDirty () {
- return this.realDraftMode && this.draft !== this.state
+ if (this.realSource === 'admin' && this.canonPath.length > 3) {
+ return false // should not show draft buttons for "grouped" values
+ } else {
+ return this.realDraftMode && this.draft !== this.state
+ }
},
canHardReset () {
- return this.realSource === 'admin' && this.$store.state.adminSettings.modifiedPaths.has(this.path)
+ return this.realSource === 'admin' && this.$store.state.adminSettings.modifiedPaths.has(this.canonPath.join(' -> '))
},
matchesExpertLevel () {
return (this.expert || 0) <= this.$store.state.config.expertLevel > 0
diff --git a/src/modules/adminSettings.js b/src/modules/adminSettings.js
index a84fadbf..27d5b37d 100644
--- a/src/modules/adminSettings.js
+++ b/src/modules/adminSettings.js
@@ -1,10 +1,11 @@
-import { set, cloneDeep } from 'lodash'
+import { set, get, cloneDeep } from 'lodash'
export const defaultState = {
needsReboot: null,
config: null,
modifiedPaths: null,
- descriptions: null
+ descriptions: null,
+ draft: null
}
export const newUserFlags = {
@@ -22,6 +23,20 @@ const adminSettingsStorage = {
},
updateAdminDescriptions (state, { descriptions }) {
state.descriptions = descriptions
+ },
+ updateAdminDraft (state, { path, value }) {
+ const [group, key, subkey] = path
+ const parent = [group, key, subkey]
+
+ set(state.draft, path, value)
+
+ // force-updating grouped draft to trigger refresh of group settings
+ if (path.length > parent.length) {
+ set(state.draft, parent, cloneDeep(get(state.draft, parent)))
+ }
+ },
+ resetAdminDraft (state) {
+ state.draft = cloneDeep(state.config)
}
},
actions: {
@@ -31,7 +46,9 @@ const adminSettingsStorage = {
backendDbConfig.configs.forEach(c => {
const path = [c.group, c.key]
if (c.db) {
- c.db.forEach(x => modifiedPaths.add(path + '.' + x))
+ // Path elements can contain dot, therefore we use ' -> ' as a separator instead
+ // Using strings for modified paths for easier searching
+ c.db.forEach(x => modifiedPaths.add([...path, x].join(' -> ')))
}
const convert = (value) => {
if (Array.isArray(value) && value.length > 0 && value[0].tuple) {
@@ -46,6 +63,7 @@ const adminSettingsStorage = {
})
console.log(config[':pleroma'])
commit('updateAdminSettings', { config, modifiedPaths })
+ commit('resetAdminDraft')
},
setInstanceAdminDescriptions ({ state, commit, dispatch }, { backendDescriptions }) {
const convert = ({ children, description, label, key = '
', group, suggestions }, path, acc) => {
--
cgit v1.2.3-70-g09d2
From ac75d051b720da2c47393de6b35663afe50d37cc Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Wed, 29 Mar 2023 23:26:57 +0300
Subject: better frontends tab, now you can set default frontend
---
src/App.scss | 1 +
.../settings_modal/admin_tabs/frontends_tab.js | 6 +
.../settings_modal/admin_tabs/frontends_tab.scss | 2 +-
.../settings_modal/admin_tabs/frontends_tab.vue | 204 +++++++++++++++------
.../settings_modal/helpers/group_setting.js | 1 -
src/components/settings_modal/helpers/setting.js | 4 +-
.../helpers/shared_computed_object.js | 3 +
src/components/settings_modal/settings_modal.scss | 3 +
.../settings_modal/settings_modal_admin_content.js | 3 +
.../settings_modal_admin_content.vue | 1 +
src/i18n/en.json | 11 +-
11 files changed, 177 insertions(+), 62 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/App.scss b/src/App.scss
index 149d640f..ef68ac50 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -646,6 +646,7 @@ option {
}
.cards-list {
+ list-style: none;
display: grid;
grid-auto-flow: row dense;
grid-template-columns: 1fr 1fr;
diff --git a/src/components/settings_modal/admin_tabs/frontends_tab.js b/src/components/settings_modal/admin_tabs/frontends_tab.js
index a5d33cbe..a2c27c2a 100644
--- a/src/components/settings_modal/admin_tabs/frontends_tab.js
+++ b/src/components/settings_modal/admin_tabs/frontends_tab.js
@@ -51,6 +51,12 @@ const FrontendsTab = {
.then((externalUser) => {
this.$store.dispatch('loadFrontendsStuff')
})
+ },
+ setDefault (frontend, suggestRef) {
+ const ref = suggestRef || frontend.refs[0]
+ const { name } = frontend
+
+ this.$store.commit('updateAdminDraft', { path: [':pleroma', ':frontends', ':primary'], value: { name, ref } })
}
}
}
diff --git a/src/components/settings_modal/admin_tabs/frontends_tab.scss b/src/components/settings_modal/admin_tabs/frontends_tab.scss
index 1e1881ff..e3e04bc6 100644
--- a/src/components/settings_modal/admin_tabs/frontends_tab.scss
+++ b/src/components/settings_modal/admin_tabs/frontends_tab.scss
@@ -8,6 +8,6 @@
word-wrap: nowrap;
white-space: nowrap;
overflow-x: hidden;
- max-width: 80%;
+ max-width: 10em;
}
}
diff --git a/src/components/settings_modal/admin_tabs/frontends_tab.vue b/src/components/settings_modal/admin_tabs/frontends_tab.vue
index 48649dfb..71bbfa69 100644
--- a/src/components/settings_modal/admin_tabs/frontends_tab.vue
+++ b/src/components/settings_modal/admin_tabs/frontends_tab.vue
@@ -2,67 +2,157 @@
{{ $t('admin_dash.tabs.frontends') }}
-
- -
- {{ frontend.name }}
-
- - {{ $t('admin_dash.frontend.repository') }}
- - {{ frontend.git }}
- - {{ $t('admin_dash.frontend.versions') }}
- - {{ frontend.refs }}
- - {{ $t('admin_dash.frontend.build_url') }}
- - {{ frontend.build_url }}
-
-
-
-
- {{
- frontend.installed
- ? $t('admin_dash.frontend.reinstall')
- : $t('admin_dash.frontend.install')
- }}
-
- {{ $t('admin_dash.frontend.wip_notice') }}
+
+
+
{{ $t('admin_dash.frontend.available_frontends') }}
+
+ -
+ {{ frontend.name }}
+ {{ ' ' }}
+
+
+
-
-
-
-
+
+
+
+
+
+ {{
+ $t('admin_dash.frontend.set_default')
+ }}
+
+ {{ ' ' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/settings_modal/helpers/group_setting.js b/src/components/settings_modal/helpers/group_setting.js
index 12a49000..23a2a202 100644
--- a/src/components/settings_modal/helpers/group_setting.js
+++ b/src/components/settings_modal/helpers/group_setting.js
@@ -7,7 +7,6 @@ export default {
computed: {
...Setting.computed,
isDirty () {
- console.log(this.state, this.draft)
return !isEqual(this.state, this.draft)
}
}
diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js
index d2e1a6f4..4f0be448 100644
--- a/src/components/settings_modal/helpers/setting.js
+++ b/src/components/settings_modal/helpers/setting.js
@@ -61,7 +61,7 @@ export default {
// TODO allow passing shared draft object?
get () {
if (this.realSource === 'admin') {
- return get(this.$store.state.adminSettings.draft, this.path)
+ return get(this.$store.state.adminSettings.draft, this.canonPath)
} else {
return this.localDraft
}
@@ -75,7 +75,7 @@ export default {
}
},
state () {
- const value = get(this.configSource, this.path)
+ const value = get(this.configSource, this.canonPath)
if (value === undefined) {
return this.defaultState
} else {
diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js
index d02db542..bb3d36ac 100644
--- a/src/components/settings_modal/helpers/shared_computed_object.js
+++ b/src/components/settings_modal/helpers/shared_computed_object.js
@@ -10,6 +10,9 @@ const SharedComputedObject = () => ({
},
adminConfig () {
return this.$store.state.adminSettings.config
+ },
+ adminDraft () {
+ return this.$store.state.adminSettings.draft
}
})
diff --git a/src/components/settings_modal/settings_modal.scss b/src/components/settings_modal/settings_modal.scss
index 98de736b..49ef83e0 100644
--- a/src/components/settings_modal/settings_modal.scss
+++ b/src/components/settings_modal/settings_modal.scss
@@ -43,6 +43,9 @@
.btn {
min-height: 2em;
+ }
+
+ .btn:not(.dropdown-button) {
padding: 0 2em;
}
}
diff --git a/src/components/settings_modal/settings_modal_admin_content.js b/src/components/settings_modal/settings_modal_admin_content.js
index b7c0de57..f94721ec 100644
--- a/src/components/settings_modal/settings_modal_admin_content.js
+++ b/src/components/settings_modal/settings_modal_admin_content.js
@@ -51,6 +51,9 @@ const SettingsModalAdminContent = {
adminDbLoaded () {
return this.$store.state.adminSettings.loaded
},
+ adminDescriptionsLoaded () {
+ return this.$store.state.adminSettings.descriptions !== null
+ },
noDb () {
return this.$store.state.adminSettings.dbConfigEnabled === false
}
diff --git a/src/components/settings_modal/settings_modal_admin_content.vue b/src/components/settings_modal/settings_modal_admin_content.vue
index ae670a90..a7a2ac9a 100644
--- a/src/components/settings_modal/settings_modal_admin_content.vue
+++ b/src/components/settings_modal/settings_modal_admin_content.vue
@@ -1,5 +1,6 @@
Date: Wed, 12 Apr 2023 23:58:21 +0300
Subject: more i18n stuff, added missing labels and such
---
.../settings_modal/admin_tabs/instance_tab.vue | 12 +++++++
.../settings_modal/helpers/boolean_setting.vue | 2 +-
.../settings_modal/helpers/choice_setting.vue | 2 +-
.../settings_modal/helpers/number_setting.vue | 2 +-
src/components/settings_modal/helpers/setting.js | 41 ++++++++++++++++++++--
.../settings_modal/helpers/string_setting.vue | 2 +-
src/i18n/en.json | 23 +++++++++++-
7 files changed, 77 insertions(+), 7 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/admin_tabs/instance_tab.vue b/src/components/settings_modal/admin_tabs/instance_tab.vue
index fc41af65..40e33495 100644
--- a/src/components/settings_modal/admin_tabs/instance_tab.vue
+++ b/src/components/settings_modal/admin_tabs/instance_tab.vue
@@ -58,6 +58,8 @@
LOCAL TIMELINES
@@ -66,6 +68,8 @@
FED TIMELINES
@@ -82,6 +86,8 @@
LOCAL PROFILES
@@ -90,6 +96,8 @@
FED PROFILES
@@ -106,6 +114,8 @@
LOCAL STATUSES
@@ -114,6 +124,8 @@
FED STATUSES
diff --git a/src/components/settings_modal/helpers/boolean_setting.vue b/src/components/settings_modal/helpers/boolean_setting.vue
index 6307d526..3089c3b3 100644
--- a/src/components/settings_modal/helpers/boolean_setting.vue
+++ b/src/components/settings_modal/helpers/boolean_setting.vue
@@ -14,7 +14,7 @@
class="label"
:class="{ 'faint': shouldBeDisabled }"
>
-
+
{{ backendDescriptionLabel }}
diff --git a/src/components/settings_modal/helpers/choice_setting.vue b/src/components/settings_modal/helpers/choice_setting.vue
index 8713acf5..114e9b7d 100644
--- a/src/components/settings_modal/helpers/choice_setting.vue
+++ b/src/components/settings_modal/helpers/choice_setting.vue
@@ -3,7 +3,7 @@
v-if="matchesExpertLevel"
class="ChoiceSetting"
>
-
+
{{ backendDescriptionLabel }}
diff --git a/src/components/settings_modal/helpers/number_setting.vue b/src/components/settings_modal/helpers/number_setting.vue
index 2b90c336..ce168570 100644
--- a/src/components/settings_modal/helpers/number_setting.vue
+++ b/src/components/settings_modal/helpers/number_setting.vue
@@ -4,7 +4,7 @@
class="NumberSetting"
>
-
+
{{ backendDescriptionLabel + ' ' }}
diff --git a/src/components/settings_modal/helpers/setting.js b/src/components/settings_modal/helpers/setting.js
index 4f0be448..fec1b947 100644
--- a/src/components/settings_modal/helpers/setting.js
+++ b/src/components/settings_modal/helpers/setting.js
@@ -33,6 +33,18 @@ export default {
type: String,
default: undefined
},
+ hideDescription: {
+ type: Boolean
+ },
+ swapDescriptionAndLabel: {
+ type: Boolean
+ },
+ overrideBackendDescription: {
+ type: Boolean
+ },
+ overrideBackendDescriptionLabel: {
+ type: Boolean
+ },
draftMode: {
type: Boolean,
default: undefined
@@ -95,10 +107,35 @@ export default {
return get(this.$store.state.adminSettings.descriptions, this.path)
},
backendDescriptionLabel () {
- return this.backendDescription?.label
+ if (this.realSource !== 'admin') return ''
+ if (!this.backendDescription || this.overrideBackendDescriptionLabel) {
+ return this.$t([
+ 'admin_dash',
+ 'temp_overrides',
+ ...this.canonPath.map(p => p.replace(/\./g, '_DOT_')),
+ 'label'
+ ].join('.'))
+ } else {
+ return this.swapDescriptionAndLabel
+ ? this.backendDescription?.description
+ : this.backendDescription?.label
+ }
},
backendDescriptionDescription () {
- return this.backendDescription?.description
+ if (this.realSource !== 'admin') return ''
+ if (this.hideDescription) return null
+ if (!this.backendDescription || this.overrideBackendDescription) {
+ return this.$t([
+ 'admin_dash',
+ 'temp_overrides',
+ ...this.canonPath.map(p => p.replace(/\./g, '_DOT_')),
+ 'description'
+ ].join('.'))
+ } else {
+ return this.swapDescriptionAndLabel
+ ? this.backendDescription?.label
+ : this.backendDescription?.description
+ }
},
backendDescriptionSuggestions () {
return this.backendDescription?.suggestions
diff --git a/src/components/settings_modal/helpers/string_setting.vue b/src/components/settings_modal/helpers/string_setting.vue
index 5ee75a84..7e70b82f 100644
--- a/src/components/settings_modal/helpers/string_setting.vue
+++ b/src/components/settings_modal/helpers/string_setting.vue
@@ -4,7 +4,7 @@
class="StringSetting"
>
-
+
{{ backendDescriptionLabel + ' ' }}
diff --git a/src/i18n/en.json b/src/i18n/en.json
index f4c2df3e..082ad826 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -864,7 +864,14 @@
"instance": "Instance information",
"registrations": "User sign-ups",
"captcha_header": "CAPTCHA",
- "kocaptcha": "KoCaptcha settings"
+ "kocaptcha": "KoCaptcha settings",
+ "access": "Instance access",
+ "restrict": {
+ "header": "Restrict access",
+ "timelines": "Timelines access",
+ "profiles": "User profiles access",
+ "activities": "Statues/activities access"
+ }
},
"limits": {
"arbitrary_limits": "Arbitrary limits",
@@ -890,6 +897,20 @@
"default_frontend_tip": "Default front-end will be shown to all users. Currently there's no way to for a user to select personal front-end. If you switch away from PleromaFE you'll most likely have to use old and buggy AdminFE to do instance configuration until we replace it.",
"default_frontend_tip2": "WIP: Since Pleroma backend doesn't properly list all installed frontends you'll have to enter name and reference manually. List below provides shortcuts to fill the values.",
"available_frontends": "Available for install"
+ },
+ "temp_overrides": {
+ ":pleroma": {
+ ":instance": {
+ ":description_limit": {
+ "label": "Limit",
+ "description": "Character limit for attachment descriptions"
+ },
+ ":background_image": {
+ "label": "Background image",
+ "description": "Background image (primarily used by PleromaFE)"
+ }
+ }
+ }
}
},
"time": {
--
cgit v1.2.3-70-g09d2
From 9aaa8a86f52bc97838c768a8859919a3ad6fd54f Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 13 Apr 2023 01:11:20 +0300
Subject: initial implementation of attachmentsetting
---
.../settings_modal/admin_tabs/instance_tab.js | 2 +
.../settings_modal/admin_tabs/instance_tab.vue | 8 +--
.../settings_modal/helpers/attachment_setting.js | 42 +++++++++++++
.../settings_modal/helpers/attachment_setting.vue | 70 ++++++++++++++++++++++
.../settings_modal/helpers/string_setting.vue | 1 -
src/services/file_type/file_type.service.js | 18 +++++-
6 files changed, 134 insertions(+), 7 deletions(-)
create mode 100644 src/components/settings_modal/helpers/attachment_setting.js
create mode 100644 src/components/settings_modal/helpers/attachment_setting.vue
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/admin_tabs/instance_tab.js b/src/components/settings_modal/admin_tabs/instance_tab.js
index f702afcf..b07bafe8 100644
--- a/src/components/settings_modal/admin_tabs/instance_tab.js
+++ b/src/components/settings_modal/admin_tabs/instance_tab.js
@@ -3,6 +3,7 @@ import ChoiceSetting from '../helpers/choice_setting.vue'
import IntegerSetting from '../helpers/integer_setting.vue'
import StringSetting from '../helpers/string_setting.vue'
import GroupSetting from '../helpers/group_setting.vue'
+import AttachmentSetting from '../helpers/attachment_setting.vue'
import SharedComputedObject from '../helpers/shared_computed_object.js'
import { library } from '@fortawesome/fontawesome-svg-core'
@@ -26,6 +27,7 @@ const InstanceTab = {
ChoiceSetting,
IntegerSetting,
StringSetting,
+ AttachmentSetting,
GroupSetting
},
computed: {
diff --git a/src/components/settings_modal/admin_tabs/instance_tab.vue b/src/components/settings_modal/admin_tabs/instance_tab.vue
index 535e4132..e519e135 100644
--- a/src/components/settings_modal/admin_tabs/instance_tab.vue
+++ b/src/components/settings_modal/admin_tabs/instance_tab.vue
@@ -24,14 +24,14 @@
-
-
+
INSTANCE THUMBNAIL
-
+
-
-
+
BACKGROUND IMAGE
-
+
diff --git a/src/components/settings_modal/helpers/attachment_setting.js b/src/components/settings_modal/helpers/attachment_setting.js
new file mode 100644
index 00000000..a0a12ead
--- /dev/null
+++ b/src/components/settings_modal/helpers/attachment_setting.js
@@ -0,0 +1,42 @@
+import Setting from './setting.js'
+import { fileTypeExt } from 'src/services/file_type/file_type.service.js'
+import MediaUpload from 'src/components/media_upload/media_upload.vue'
+import Attachment from 'src/components/attachment/attachment.vue'
+
+export default {
+ ...Setting,
+ props: {
+ ...Setting.props,
+ type: {
+ type: Array,
+ required: false,
+ default: []
+ }
+ },
+ components: {
+ ...Setting.components,
+ MediaUpload,
+ Attachment
+ },
+ computed: {
+ ...Setting.computed,
+ attachment () {
+ const path = this.realDraftMode ? this.draft : this.state
+ const url = path.includes('://') ? path : this.$store.state.instance.server + path
+ return {
+ mimetype: fileTypeExt(url),
+ url
+ }
+ }
+ },
+ methods: {
+ ...Setting.methods,
+ setMediaFile (fileInfo) {
+ if (this.realDraftMode) {
+ this.draft = fileInfo.url
+ } else {
+ this.configSink(this.path, fileInfo.url)
+ }
+ }
+ }
+}
diff --git a/src/components/settings_modal/helpers/attachment_setting.vue b/src/components/settings_modal/helpers/attachment_setting.vue
new file mode 100644
index 00000000..3a933511
--- /dev/null
+++ b/src/components/settings_modal/helpers/attachment_setting.vue
@@ -0,0 +1,70 @@
+
+
+
+
+ {{ backendDescriptionLabel + ' ' }}
+
+
+
+
+
+
+
+ {{ backendDescriptionDescription + ' ' }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/settings_modal/helpers/string_setting.vue b/src/components/settings_modal/helpers/string_setting.vue
index 7e70b82f..84d0a9d6 100644
--- a/src/components/settings_modal/helpers/string_setting.vue
+++ b/src/components/settings_modal/helpers/string_setting.vue
@@ -14,7 +14,6 @@
{
+export const fileType = mimetype => {
if (mimetype.match(/flash/)) {
return 'flash'
}
@@ -25,11 +25,25 @@ const fileType = mimetype => {
return 'unknown'
}
-const fileMatchesSomeType = (types, file) =>
+export const fileTypeExt = url => {
+ if (url.match(/\.(png|jpe?g|gif|webp|avif)$/)) {
+ return 'image'
+ }
+ if (url.match(/\.(ogv|mp4|webm|mov)$/)) {
+ return 'video'
+ }
+ if (url.match(/\.(it|s3m|mod|umx|mp3|aac|m4a|flac|alac|ogg|oga|opus|wav|ape|midi?)$/)) {
+ return 'audio'
+ }
+ return 'unknown'
+}
+
+export const fileMatchesSomeType = (types, file) =>
types.some(type => fileType(file.mimetype) === type)
const fileTypeService = {
fileType,
+ fileTypeExt,
fileMatchesSomeType
}
--
cgit v1.2.3-70-g09d2
From e0fbeee88edb29f04a3260560d10d1a812f84029 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 24 Apr 2023 21:57:31 +0300
Subject: finish up attachment setting (right now only for admin section only)
---
src/components/media_upload/media_upload.js | 18 ++++++--
src/components/media_upload/media_upload.vue | 22 ++++++---
.../settings_modal/helpers/attachment_setting.js | 7 +--
.../settings_modal/helpers/attachment_setting.vue | 53 +++++++++++++++-------
src/i18n/en.json | 2 +
5 files changed, 73 insertions(+), 29 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/media_upload/media_upload.js b/src/components/media_upload/media_upload.js
index cfd42d4c..8c9e5f71 100644
--- a/src/components/media_upload/media_upload.js
+++ b/src/components/media_upload/media_upload.js
@@ -23,6 +23,11 @@ const mediaUpload = {
}
},
methods: {
+ onClick () {
+ if (this.uploadReady) {
+ this.$refs.input.click()
+ }
+ },
uploadFile (file) {
const self = this
const store = this.$store
@@ -69,10 +74,15 @@ const mediaUpload = {
this.multiUpload(target.files)
}
},
- props: [
- 'dropFiles',
- 'disabled'
- ],
+ props: {
+ dropFiles: Object,
+ disabled: Boolean,
+ normalButton: Boolean,
+ acceptTypes: {
+ type: String,
+ default: '*/*'
+ }
+ },
watch: {
dropFiles: function (fileInfos) {
if (!this.uploading) {
diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue
index 2799495b..c761b94f 100644
--- a/src/components/media_upload/media_upload.vue
+++ b/src/components/media_upload/media_upload.vue
@@ -1,8 +1,10 @@
-
+
+ {{ ' ' }}
+ {{ uploading ? $t('general.loading') : $t('tool_tip.media_upload') }}
+
-
+
@@ -32,10 +40,12 @@
@import "../../variables";
.media-upload {
- cursor: pointer; // We use for interactivity... i wonder if it's fine
-
.hidden-input-file {
display: none;
}
}
-
+
+label.media-upload {
+ cursor: pointer; // We use for interactivity... i wonder if it's fine
+}
+
diff --git a/src/components/settings_modal/helpers/attachment_setting.js b/src/components/settings_modal/helpers/attachment_setting.js
index a0a12ead..ac5c6f86 100644
--- a/src/components/settings_modal/helpers/attachment_setting.js
+++ b/src/components/settings_modal/helpers/attachment_setting.js
@@ -7,10 +7,10 @@ export default {
...Setting,
props: {
...Setting.props,
- type: {
- type: Array,
+ acceptTypes: {
+ type: String,
required: false,
- default: []
+ default: 'image/*'
}
},
components: {
@@ -22,6 +22,7 @@ export default {
...Setting.computed,
attachment () {
const path = this.realDraftMode ? this.draft : this.state
+ // The "server" part is primarily for local dev, but could be useful for alt-domain or multiuser usage.
const url = path.includes('://') ? path : this.$store.state.instance.server + path
return {
mimetype: fileTypeExt(url),
diff --git a/src/components/settings_modal/helpers/attachment_setting.vue b/src/components/settings_modal/helpers/attachment_setting.vue
index 3a933511..cc2278b0 100644
--- a/src/components/settings_modal/helpers/attachment_setting.vue
+++ b/src/components/settings_modal/helpers/attachment_setting.vue
@@ -20,6 +20,23 @@
{{ backendDescriptionDescription + ' ' }}
@@ -63,8 +68,24 @@
.AttachmentSetting {
.attachment {
display: block;
- width: 20em;
+ width: 100%;
height: 15em;
+ margin-bottom: 0.5em;
+ }
+
+ .attachment-input {
+ margin-left: 1em;
+ display: flex;
+ flex-direction: column;
+ width: 20em;
+ }
+
+ .controls {
+ margin-bottom: 0.5em;
+
+ input, button {
+ width: 100%;
+ }
}
}
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 082ad826..44998453 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -519,6 +519,8 @@
"loop_video_silent_only": "Loop only videos without sound (i.e. Mastodon's \"gifs\")",
"mutes_tab": "Mutes",
"play_videos_in_modal": "Play videos in a popup frame",
+ "url": "URL",
+ "preview": "Preview",
"file_export_import": {
"backup_restore": "Settings backup",
"backup_settings": "Backup settings to file",
--
cgit v1.2.3-70-g09d2
From 1492937a7e8e27a31699879dc710d3e36c67b953 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 24 Apr 2023 23:01:29 +0300
Subject: lint
---
src/components/media_upload/media_upload.vue | 6 +--
.../settings_modal/admin_tabs/frontends_tab.vue | 56 ++++++++++++++++------
.../settings_modal/helpers/attachment_setting.vue | 9 ++--
.../settings_modal/helpers/number_setting.vue | 5 +-
.../settings_modal/helpers/string_setting.vue | 5 +-
src/components/settings_modal/settings_modal.vue | 13 +++--
6 files changed, 66 insertions(+), 28 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue
index c761b94f..993c01a4 100644
--- a/src/components/media_upload/media_upload.vue
+++ b/src/components/media_upload/media_upload.vue
@@ -1,7 +1,7 @@
diff --git a/src/components/settings_modal/admin_tabs/frontends_tab.vue b/src/components/settings_modal/admin_tabs/frontends_tab.vue
index 71bbfa69..e108a963 100644
--- a/src/components/settings_modal/admin_tabs/frontends_tab.vue
+++ b/src/components/settings_modal/admin_tabs/frontends_tab.vue
@@ -1,5 +1,8 @@
-
+
{{ $t('admin_dash.tabs.frontends') }}
{{ $t('admin_dash.frontend.wip_notice') }}
@@ -20,23 +23,26 @@
-
+
{{ $t('admin_dash.frontend.available_frontends') }}
- -
+
-
{{ frontend.name }}
{{ ' ' }}
{{ adminDraft[':pleroma'][':frontends'][':primary'].ref }}
@@ -45,13 +51,30 @@
- {{ $t('admin_dash.frontend.repository') }}
- - {{ frontend.git }}
+ -
+ {{ frontend.git }}
+
- {{ $t('admin_dash.frontend.versions') }}
- {{ ref }}
+ -
+
{{ ref }}
+
- - {{ $t('admin_dash.frontend.build_url') }}
- - {{ frontend.build_url }}
+ -
+ {{ $t('admin_dash.frontend.build_url') }}
+
+ -
+ {{ frontend.build_url }}
+
@@ -62,7 +85,7 @@
@click="update(frontend)"
>
{{
- frontend.installed
+ frontend.installed
? $t('admin_dash.frontend.reinstall')
: $t('admin_dash.frontend.install')
}}
@@ -100,19 +123,22 @@
-
+
{{
- $t('admin_dash.frontend.set_default')
+ $t('admin_dash.frontend.set_default')
}}
{{ ' ' }}
diff --git a/src/components/settings_modal/helpers/attachment_setting.vue b/src/components/settings_modal/helpers/attachment_setting.vue
index cc2278b0..0bede2c2 100644
--- a/src/components/settings_modal/helpers/attachment_setting.vue
+++ b/src/components/settings_modal/helpers/attachment_setting.vue
@@ -3,7 +3,10 @@
v-if="matchesExpertLevel"
class="AttachmentSetting"
>
-
+
{{ backendDescriptionLabel + ' ' }}
@@ -51,10 +54,10 @@
ref="mediaUpload"
class="media-upload-icon"
:drop-files="dropFiles"
- @uploaded="setMediaFile"
- @upload-failed="uploadFailed"
normal-button
:accept-types="acceptTypes"
+ @uploaded="setMediaFile"
+ @upload-failed="uploadFailed"
/>
diff --git a/src/components/settings_modal/helpers/number_setting.vue b/src/components/settings_modal/helpers/number_setting.vue
index ce168570..065cfbcf 100644
--- a/src/components/settings_modal/helpers/number_setting.vue
+++ b/src/components/settings_modal/helpers/number_setting.vue
@@ -3,7 +3,10 @@
v-if="matchesExpertLevel"
class="NumberSetting"
>
-
+
{{ backendDescriptionLabel + ' ' }}
diff --git a/src/components/settings_modal/helpers/string_setting.vue b/src/components/settings_modal/helpers/string_setting.vue
index 84d0a9d6..9de99d78 100644
--- a/src/components/settings_modal/helpers/string_setting.vue
+++ b/src/components/settings_modal/helpers/string_setting.vue
@@ -3,7 +3,10 @@
v-if="matchesExpertLevel"
class="StringSetting"
>
-
+
{{ backendDescriptionLabel + ' ' }}
diff --git a/src/components/settings_modal/settings_modal.vue b/src/components/settings_modal/settings_modal.vue
index 57ec5535..4e7fd931 100644
--- a/src/components/settings_modal/settings_modal.vue
+++ b/src/components/settings_modal/settings_modal.vue
@@ -125,21 +125,24 @@
id="unscrolled-content"
class="extra-content"
/>
-
+
- {{ $t("admin_dash.reset_all") }}
+ {{ $t("admin_dash.reset_all") }}
{{ ' ' }}
- {{ $t("admin_dash.commit_all") }}
+ {{ $t("admin_dash.commit_all") }}
--
cgit v1.2.3-70-g09d2
From 05a7e612aa6d9f2a44eea22266b325933da6f5ad Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 8 May 2023 21:10:06 +0300
Subject: show warning for developer for missing labels
---
.../settings_modal/helpers/attachment_setting.vue | 5 +++--
.../settings_modal/helpers/boolean_setting.vue | 16 +++++++++++++---
src/components/settings_modal/helpers/number_setting.vue | 5 +++--
src/components/settings_modal/helpers/string_setting.vue | 5 +++--
4 files changed, 22 insertions(+), 9 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/helpers/attachment_setting.vue b/src/components/settings_modal/helpers/attachment_setting.vue
index 0bede2c2..447fa172 100644
--- a/src/components/settings_modal/helpers/attachment_setting.vue
+++ b/src/components/settings_modal/helpers/attachment_setting.vue
@@ -10,9 +10,10 @@
{{ backendDescriptionLabel + ' ' }}
-
-
+
+ MISSING LABEL FOR {{ path }}
+
{{ backendDescriptionLabel }}
-
-
+
+ MISSING LABEL FOR {{ path }}
+
{{ backendDescriptionDescription + ' ' }}
+
+
diff --git a/src/components/settings_modal/helpers/number_setting.vue b/src/components/settings_modal/helpers/number_setting.vue
index 065cfbcf..93f11331 100644
--- a/src/components/settings_modal/helpers/number_setting.vue
+++ b/src/components/settings_modal/helpers/number_setting.vue
@@ -10,9 +10,10 @@
{{ backendDescriptionLabel + ' ' }}
-
-
+
+ MISSING LABEL FOR {{ path }}
+
{{ backendDescriptionLabel + ' ' }}
-
-
+
+ MISSING LABEL FOR {{ path }}
+
Date: Mon, 8 May 2023 21:13:07 +0300
Subject: reintroduce width limit on number input but only for sizesetting
---
.../settings_modal/helpers/size_setting.vue | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/settings_modal/helpers/size_setting.vue b/src/components/settings_modal/helpers/size_setting.vue
index 5a78f100..6c3fbaeb 100644
--- a/src/components/settings_modal/helpers/size_setting.vue
+++ b/src/components/settings_modal/helpers/size_setting.vue
@@ -45,11 +45,18 @@
--
cgit v1.2.3-70-g09d2
From b79f297692eeca5e774a1dd124cec2b3bc41b977 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 8 May 2023 22:04:05 +0300
Subject: fix double pushbuttons in the draft buttons
---
src/components/popover/popover.js | 3 ++
src/components/popover/popover.vue | 3 +-
.../settings_modal/helpers/draft_buttons.vue | 40 +++++++---------------
3 files changed, 18 insertions(+), 28 deletions(-)
(limited to 'src/components/settings_modal/helpers')
diff --git a/src/components/popover/popover.js b/src/components/popover/popover.js
index d44b266b..bc078533 100644
--- a/src/components/popover/popover.js
+++ b/src/components/popover/popover.js
@@ -45,6 +45,9 @@ const Popover = {
// Lets hover popover stay when clicking inside of it
stayOnClick: Boolean,
+ // Use styled button (to avoid nested buttons)
+ normalButton: Boolean,
+
triggerAttrs: {
type: Object,
default: {}
diff --git a/src/components/popover/popover.vue b/src/components/popover/popover.vue
index fd0fd821..1a4bffd9 100644
--- a/src/components/popover/popover.vue
+++ b/src/components/popover/popover.vue
@@ -5,7 +5,8 @@
>
-
-
- {{ $t('settings.commit_value') }}
-
+ {{ $t('settings.commit_value') }}