From d7c9cd75854f93a815ecfba7d4bfe8acaa3a0158 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Mon, 19 Sep 2022 19:54:36 +0100 Subject: [PATCH 1/6] add basic loading flow --- src/boot/after_store.js | 1 + .../settings_modal/helpers/shared_computed_object.js | 4 ++-- src/components/settings_modal/tabs/general_tab.js | 2 +- src/modules/api.js | 9 +++++++-- src/modules/config.js | 9 ++++++++- src/services/api/api.service.js | 11 ++++++++++- 6 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/boot/after_store.js b/src/boot/after_store.js index c12c70f1..7fed3bc3 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -399,6 +399,7 @@ const afterStoreSetup = async ({ store, i18n }) => { getTOS({ store }) getStickers({ store }) store.dispatch('getSupportedTranslationlanguages') + store.dispatch('getSettingsProfile') const router = createRouter({ history: createWebHistory(), diff --git a/src/components/settings_modal/helpers/shared_computed_object.js b/src/components/settings_modal/helpers/shared_computed_object.js index 12431dca..3f40f6e5 100644 --- a/src/components/settings_modal/helpers/shared_computed_object.js +++ b/src/components/settings_modal/helpers/shared_computed_object.js @@ -19,7 +19,7 @@ const SharedComputedObject = () => ({ .map(key => [key, { get () { return this.$store.getters.mergedConfig[key] }, set (value) { - this.$store.dispatch('setOption', { name: key, value }) + this.$store.dispatch('setOption', { name: key, value, manual: true }) } }]) .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), @@ -27,7 +27,7 @@ const SharedComputedObject = () => ({ .map(key => ['serverSide_' + key, { get () { return this.$store.state.serverSideConfig[key] }, set (value) { - this.$store.dispatch('setServerSideOption', { name: key, value }) + this.$store.dispatch('setServerSideOption', { name: key, value, manual: true }) } }]) .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 9fe47eaf..c915c32c 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -89,7 +89,7 @@ const GeneralTab = { } }, translationLanguages () { - return (this.$store.getters.mergedConfig.supportedTranslationLanguages.target || []).map(lang => ({ key: lang.code, value: lang.code, label: lang.name })) + return (this.$store.state.instance.supportedTranslationLanguages.target || []).map(lang => ({ key: lang.code, value: lang.code, label: lang.name })) }, translationLanguage: { get: function () { return this.$store.getters.mergedConfig.translationLanguage }, diff --git a/src/modules/api.js b/src/modules/api.js index 6c896c79..fb81d1b3 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -262,10 +262,15 @@ const api = { getSupportedTranslationlanguages (store) { store.state.backendInteractor.getSupportedTranslationlanguages({ store }) .then((data) => { - store.dispatch('setOption', { name: 'supportedTranslationLanguages', value: data }) + store.dispatch('setInstanceOption', { name: 'supportedTranslationLanguages', value: data }) + }) + }, + getSettingsProfile (store) { + store.state.backendInteractor.getSettingsProfile({ store }) + .then((data) => { + console.log('LOADED', data) }) }, - // Pleroma websocket setWsToken (store, token) { store.commit('setWsToken', token) diff --git a/src/modules/config.js b/src/modules/config.js index e0530101..669767b5 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -149,6 +149,7 @@ const config = { mutations: { setOption (state, { name, value }) { state[name] = value + console.log('SETOPTION', JSON.stringify(state)) }, setHighlight (state, { user, color, type }) { const data = this.state.config.highlight[user] @@ -160,6 +161,9 @@ const config = { } }, actions: { + syncSettings: ({ dispatch }) => { + dispatch('syncSettingsToServer') + }, loadSettings ({ dispatch }, data) { const knownKeys = new Set(Object.keys(defaultState)) const presentKeys = new Set(Object.keys(data)) @@ -177,8 +181,11 @@ const config = { setHighlight ({ commit, dispatch }, { user, color, type }) { commit('setHighlight', { user, color, type }) }, - setOption ({ commit, dispatch }, { name, value }) { + setOption ({ commit, dispatch }, { name, value, manual }) { commit('setOption', { name, value }) + if (manual === true) { + dispatch('syncSettingsToServer') + } switch (name) { case 'theme': setPreset(value) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 8c7f80db..0ce7937f 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -102,6 +102,7 @@ const PLEROMA_ANNOUNCEMENTS_URL = '/api/v1/pleroma/admin/announcements' const PLEROMA_POST_ANNOUNCEMENT_URL = '/api/v1/pleroma/admin/announcements' const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` +const AKKOMA_SETTING_PROFILE_URL = (name) => `/api/v1/akkoma/frontend_settings/pleroma-fe/${name}` const oldfetch = window.fetch @@ -1451,6 +1452,13 @@ const deleteAnnouncement = ({ id, credentials }) => { }) } +const getSettingsProfile = ({ profileName, credentials }) => { + return promisedRequest({ + url: AKKOMA_SETTING_PROFILE_URL(profileName), + credentials + }) +} + export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => { return Object.entries({ ...(credentials @@ -1677,7 +1685,8 @@ const apiService = { deleteAnnouncement, adminFetchAnnouncements, translateStatus, - getSupportedTranslationlanguages + getSupportedTranslationlanguages, + getSettingsProfile } export default apiService -- 2.34.1 From c82f73482ec63d2ccbe046da09d3a0958c3c71f4 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Mon, 19 Sep 2022 20:35:28 +0100 Subject: [PATCH 2/6] load settings on boot --- src/components/status_body/status_body.js | 2 +- src/modules/api.js | 6 --- src/modules/config.js | 56 +++++++++++++++++++++-- src/services/api/api.service.js | 15 +++++- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/components/status_body/status_body.js b/src/components/status_body/status_body.js index 9e380f28..19cec6c6 100644 --- a/src/components/status_body/status_body.js +++ b/src/components/status_body/status_body.js @@ -83,7 +83,7 @@ const StatusContent = { return this.status.attachments.map(file => fileType.fileType(file.mimetype)) }, translationLanguages () { - return (this.$store.getters.mergedConfig.supportedTranslationLanguages.source || []).map(lang => ({ key: lang.code, value: lang.code, label: lang.name })) + return (this.$store.state.instance.supportedTranslationLanguages.source || []).map(lang => ({ key: lang.code, value: lang.code, label: lang.name })) }, ...mapGetters(['mergedConfig']) }, diff --git a/src/modules/api.js b/src/modules/api.js index fb81d1b3..30060911 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -265,12 +265,6 @@ const api = { store.dispatch('setInstanceOption', { name: 'supportedTranslationLanguages', value: data }) }) }, - getSettingsProfile (store) { - store.state.backendInteractor.getSettingsProfile({ store }) - .then((data) => { - console.log('LOADED', data) - }) - }, // Pleroma websocket setWsToken (store, token) { store.commit('setWsToken', token) diff --git a/src/modules/config.js b/src/modules/config.js index 669767b5..ac24b99e 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -21,6 +21,8 @@ export const multiChoiceProperties = [ ] export const defaultState = { + profile: 'default', + profileVersion: 0, expertLevel: 0, // used to track which settings to show and hide colors: {}, theme: undefined, @@ -149,7 +151,6 @@ const config = { mutations: { setOption (state, { name, value }) { state[name] = value - console.log('SETOPTION', JSON.stringify(state)) }, setHighlight (state, { user, color, type }) { const data = this.state.config.highlight[user] @@ -161,8 +162,33 @@ const config = { } }, actions: { - syncSettings: ({ dispatch }) => { - dispatch('syncSettingsToServer') + syncSettings: (store) => { + store.commit('setOption', { name: 'profileVersion', value: store.state.profileVersion + 1 }) + const notice = { + level: 'warning', + messageKey: 'settingsProfile.synchronizing', + timeout: 5000 + } + store.dispatch('pushGlobalNotice', notice) + store.rootState.api.backendInteractor.saveSettingsProfile({ + settings: store.state, profileName: store.state.profile, version: store.state.profileVersion + }).then(() => { + store.dispatch('removeGlobalNotice', notice) + store.dispatch('pushGlobalNotice', { + level: 'success', + messageKey: 'settingsProfile.synchronized', + timeout: 2000 + }) + }).catch((err) => { + store.dispatch('removeGlobalNotice', notice) + store.dispatch('pushGlobalNotice', { + level: 'error', + messageKey: 'settingsProfile.synchronizationError', + messageArgs: { error: err.message }, + timeout: 5000 + }) + console.error(err) + }) }, loadSettings ({ dispatch }, data) { const knownKeys = new Set(Object.keys(defaultState)) @@ -184,7 +210,7 @@ const config = { setOption ({ commit, dispatch }, { name, value, manual }) { commit('setOption', { name, value }) if (manual === true) { - dispatch('syncSettingsToServer') + dispatch('syncSettings') } switch (name) { case 'theme': @@ -203,6 +229,28 @@ const config = { dispatch('setLayoutWidth', undefined) break } + }, + getSettingsProfile (store) { + const profile = store.state.profile + store.rootState.api.backendInteractor.getSettingsProfile({ store, profileName: profile }) + .then(({ settings, version }) => { + if (version > store.state.profileVersion) { + store.commit('setOption', { name: 'profileVersion', value: version }) + store.dispatch('loadSettings', settings) + } + }) + .catch((err) => { + console.error(`could not fetch profile ${profile}`, err) + if (err.statusCode === 404) { + // create profile + store.dispatch('pushGlobalNotice', { + level: 'warning', + messageKey: 'settingsProfile.creating', + timeout: 5000 + }) + store.dispatch('syncSettings') + } + }) } } } diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 0ce7937f..319277e3 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -1459,6 +1459,18 @@ const getSettingsProfile = ({ profileName, credentials }) => { }) } +const saveSettingsProfile = ({ profileName, credentials, settings, version }) => { + return promisedRequest({ + url: AKKOMA_SETTING_PROFILE_URL(profileName), + method: 'PUT', + credentials, + payload: { + settings, + version + } + }) +} + export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => { return Object.entries({ ...(credentials @@ -1686,7 +1698,8 @@ const apiService = { adminFetchAnnouncements, translateStatus, getSupportedTranslationlanguages, - getSettingsProfile + getSettingsProfile, + saveSettingsProfile } export default apiService -- 2.34.1 From 99b908570714df1436f666a2abdb36870b62e813 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Mon, 19 Sep 2022 20:50:57 +0100 Subject: [PATCH 3/6] add synchronisation on manual edit --- src/App.vue | 1 - src/boot/after_store.js | 2 -- src/i18n/en.json | 5 +++++ src/modules/config.js | 16 +++++++++++----- src/modules/users.js | 2 ++ 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/App.vue b/src/App.vue index e1c0f5dc..ca114c89 100644 --- a/src/App.vue +++ b/src/App.vue @@ -61,7 +61,6 @@ - diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 7fed3bc3..9f0ff4d3 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -398,8 +398,6 @@ const afterStoreSetup = async ({ store, i18n }) => { store.dispatch('startFetchingAnnouncements') getTOS({ store }) getStickers({ store }) - store.dispatch('getSupportedTranslationlanguages') - store.dispatch('getSettingsProfile') const router = createRouter({ history: createWebHistory(), diff --git a/src/i18n/en.json b/src/i18n/en.json index e168994b..af66f2ae 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -892,6 +892,11 @@ "word_filter": "Word filter", "wordfilter": "Wordfilter" }, + "settings_profile": { + "synchronizing": "Synchronizing setting profile \"{profile}\"...", + "synchronized": "Synchronized settings!", + "synchronization_error": "Could not synchronize settings: {err}" + }, "status": { "ancestor_follow": "See {numReplies} other reply under this post | See {numReplies} other replies under this post", "ancestor_follow_with_icon": "{icon} {text}", diff --git a/src/modules/config.js b/src/modules/config.js index ac24b99e..f0055c3c 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -165,8 +165,9 @@ const config = { syncSettings: (store) => { store.commit('setOption', { name: 'profileVersion', value: store.state.profileVersion + 1 }) const notice = { - level: 'warning', - messageKey: 'settingsProfile.synchronizing', + level: 'info', + messageKey: 'settings_profile.synchronizing', + messageArgs: { profile: store.state.profile }, timeout: 5000 } store.dispatch('pushGlobalNotice', notice) @@ -176,14 +177,15 @@ const config = { store.dispatch('removeGlobalNotice', notice) store.dispatch('pushGlobalNotice', { level: 'success', - messageKey: 'settingsProfile.synchronized', + messageKey: 'settings_profile.synchronized', + messageArgs: { profile: store.state.profile }, timeout: 2000 }) }).catch((err) => { store.dispatch('removeGlobalNotice', notice) store.dispatch('pushGlobalNotice', { level: 'error', - messageKey: 'settingsProfile.synchronizationError', + messageKey: 'settings_profile.synchronization_error', messageArgs: { error: err.message }, timeout: 5000 }) @@ -231,12 +233,16 @@ const config = { } }, getSettingsProfile (store) { + console.log('getSettingsProfile') const profile = store.state.profile store.rootState.api.backendInteractor.getSettingsProfile({ store, profileName: profile }) .then(({ settings, version }) => { + console.log('found settings version', version) if (version > store.state.profileVersion) { store.commit('setOption', { name: 'profileVersion', value: version }) store.dispatch('loadSettings', settings) + } else { + console.log('settings are up to date') } }) .catch((err) => { @@ -245,7 +251,7 @@ const config = { // create profile store.dispatch('pushGlobalNotice', { level: 'warning', - messageKey: 'settingsProfile.creating', + messageKey: 'settings_profile.creating', timeout: 5000 }) store.dispatch('syncSettings') diff --git a/src/modules/users.js b/src/modules/users.js index 02a9e361..f51d9717 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -581,6 +581,8 @@ const users = { store.dispatch('setLayoutWidth', windowWidth()) store.dispatch('setLayoutHeight', windowHeight()) + store.dispatch('getSupportedTranslationlanguages') + store.dispatch('getSettingsProfile') // Fetch our friends store.rootState.api.backendInteractor.fetchFriends({ id: user.id }) -- 2.34.1 From e794f079515f900379e80237f8a9eb52288cf500 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Mon, 19 Sep 2022 22:01:25 +0100 Subject: [PATCH 4/6] add ability to switch between profiles --- .../settings_modal/helpers/choice_setting.js | 3 +- .../settings_modal/helpers/choice_setting.vue | 6 +- .../settings_modal/tabs/general_tab.js | 28 ++++++++ .../settings_modal/tabs/general_tab.vue | 71 ++++++++++++++++++- src/i18n/en.json | 8 +++ src/modules/api.js | 6 ++ src/modules/config.js | 10 ++- src/modules/users.js | 1 + src/services/api/api.service.js | 11 ++- 9 files changed, 137 insertions(+), 7 deletions(-) diff --git a/src/components/settings_modal/helpers/choice_setting.js b/src/components/settings_modal/helpers/choice_setting.js index 4677d4c1..48cee348 100644 --- a/src/components/settings_modal/helpers/choice_setting.js +++ b/src/components/settings_modal/helpers/choice_setting.js @@ -12,7 +12,8 @@ export default { 'path', 'disabled', 'options', - 'expert' + 'expert', + 'hideDefaultLabel' ], computed: { pathDefault () { diff --git a/src/components/settings_modal/helpers/choice_setting.vue b/src/components/settings_modal/helpers/choice_setting.vue index 258c7422..8b1dd614 100644 --- a/src/components/settings_modal/helpers/choice_setting.vue +++ b/src/components/settings_modal/helpers/choice_setting.vue @@ -16,7 +16,11 @@ :value="option.value" > {{ option.label }} - {{ option.value === defaultState ? $t('settings.instance_default_simple') : '' }} + diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index c915c32c..025d7f1e 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -48,6 +48,8 @@ const GeneralTab = { value: tab, label: this.$t(`user_card.${tab}`) })), + profilesExpanded: false, + newProfileName: '', loopSilentAvailable: // Firefox Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') || @@ -88,6 +90,19 @@ const GeneralTab = { this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val }) } }, + settingsProfiles () { + return (this.$store.state.instance.settingsProfiles || []) + }, + settingsProfile: { + get: function () { return this.$store.getters.mergedConfig.profile }, + set: function (val) { + this.$store.dispatch('setOption', { name: 'profile', value: val }) + this.$store.dispatch('getSettingsProfile') + } + }, + settingsVersion () { + return this.$store.getters.mergedConfig.profileVersion + }, translationLanguages () { return (this.$store.state.instance.supportedTranslationLanguages.target || []).map(lang => ({ key: lang.code, value: lang.code, label: lang.name })) }, @@ -105,6 +120,19 @@ const GeneralTab = { }, setTranslationLanguage (value) { this.$store.dispatch('setOption', { name: 'translationLanguage', value }) + }, + toggleExpandedSettings () { + this.profilesExpanded = !this.profilesExpanded + }, + loadSettingsProfile (name) { + this.$store.commit('setOption', { name: 'profile', value: name }) + this.$store.dispatch('getSettingsProfile', true) + }, + createSettingsProfile () { + this.$store.dispatch('setOption', { name: 'profile', value: this.newProfileName }) + this.$store.dispatch('setOption', { name: 'profileVersion', value: 1 }) + this.$store.dispatch('syncSettings') + this.newProfileName = '' } } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 608c73af..479cb1d3 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -1,7 +1,6 @@ + diff --git a/src/i18n/en.json b/src/i18n/en.json index af66f2ae..750b41c2 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -693,6 +693,14 @@ "setting_changed": "Setting is different from default", "setting_server_side": "This setting is tied to your profile and affects all sessions and clients", "settings": "Settings", + "settings_profile": "Settings Profiles", + "settings_profile_currently": "Currently using {name} (version: {version})", + "settings_profiles_show": "Show all settings profiles", + "settings_profiles_unshow": "Hide all settings profiles", + "settings_profile_in_use": "In use", + "settings_profile_creation": "Create new profile", + "settings_profile_creation_submit": "Create", + "settings_profile_use": "Use", "show_admin_badge": "Show \"Admin\" badge in my profile", "show_moderator_badge": "Show \"Moderator\" badge in my profile", "show_nav_shortcuts": "Show extra navigation shortcuts in top panel", diff --git a/src/modules/api.js b/src/modules/api.js index 30060911..496580c1 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -265,6 +265,12 @@ const api = { store.dispatch('setInstanceOption', { name: 'supportedTranslationLanguages', value: data }) }) }, + listSettingsProfiles (store) { + store.state.backendInteractor.listSettingsProfiles({ store }) + .then((data) => { + store.commit('setInstanceOption', { name: 'settingsProfiles', value: data }) + }) + }, // Pleroma websocket setWsToken (store, token) { store.commit('setWsToken', token) diff --git a/src/modules/config.js b/src/modules/config.js index f0055c3c..81ebb031 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -232,15 +232,19 @@ const config = { break } }, - getSettingsProfile (store) { + getSettingsProfile (store, forceUpdate = false) { console.log('getSettingsProfile') const profile = store.state.profile store.rootState.api.backendInteractor.getSettingsProfile({ store, profileName: profile }) .then(({ settings, version }) => { console.log('found settings version', version) - if (version > store.state.profileVersion) { + if (forceUpdate || (version > store.state.profileVersion)) { store.commit('setOption', { name: 'profileVersion', value: version }) - store.dispatch('loadSettings', settings) + Object.entries(settings).forEach(([name, value]) => { + if (store.state[name] !== value) { + store.dispatch('setOption', { name, value }) + } + }) } else { console.log('settings are up to date') } diff --git a/src/modules/users.js b/src/modules/users.js index f51d9717..94321839 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -583,6 +583,7 @@ const users = { store.dispatch('setLayoutHeight', windowHeight()) store.dispatch('getSupportedTranslationlanguages') store.dispatch('getSettingsProfile') + store.dispatch('listSettingsProfiles') // Fetch our friends store.rootState.api.backendInteractor.fetchFriends({ id: user.id }) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 319277e3..e7a8c812 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -103,6 +103,7 @@ const PLEROMA_POST_ANNOUNCEMENT_URL = '/api/v1/pleroma/admin/announcements' const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` const AKKOMA_SETTING_PROFILE_URL = (name) => `/api/v1/akkoma/frontend_settings/pleroma-fe/${name}` +const AKKOMA_SETTING_PROFILE_LIST = `/api/v1/akkoma/frontend_settings/pleroma-fe` const oldfetch = window.fetch @@ -1471,6 +1472,13 @@ const saveSettingsProfile = ({ profileName, credentials, settings, version }) => }) } +const listSettingsProfiles = ({ credentials }) => { + return promisedRequest({ + url: AKKOMA_SETTING_PROFILE_LIST, + credentials + }) +} + export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => { return Object.entries({ ...(credentials @@ -1699,7 +1707,8 @@ const apiService = { translateStatus, getSupportedTranslationlanguages, getSettingsProfile, - saveSettingsProfile + saveSettingsProfile, + listSettingsProfiles } export default apiService -- 2.34.1 From 7bda0f4e68b0dfe016bd309bbcdcb91e1b260212 Mon Sep 17 00:00:00 2001 From: FloatingGhost Date: Sun, 2 Oct 2022 17:00:02 +0100 Subject: [PATCH 5/6] include sync, delete buttons --- .../settings_modal/tabs/general_tab.js | 19 +++++++++++-- .../settings_modal/tabs/general_tab.vue | 28 ++++++++++++++++--- src/i18n/en.json | 7 ++++- src/modules/config.js | 8 +++++- src/modules/users.js | 2 ++ src/services/api/api.service.js | 11 +++++++- .../backend_interactor_service.js | 5 ++++ .../config_fetcher/config_fetcher.service.js | 13 +++++++++ 8 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 src/services/config_fetcher/config_fetcher.service.js diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 025d7f1e..935591dc 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -8,11 +8,12 @@ import SharedComputedObject from '../helpers/shared_computed_object.js' import ServerSideIndicator from '../helpers/server_side_indicator.vue' import { library } from '@fortawesome/fontawesome-svg-core' import { - faGlobe + faGlobe, faSync } from '@fortawesome/free-solid-svg-icons' library.add( - faGlobe + faGlobe, + faSync ) const GeneralTab = { @@ -104,7 +105,8 @@ const GeneralTab = { return this.$store.getters.mergedConfig.profileVersion }, translationLanguages () { - return (this.$store.state.instance.supportedTranslationLanguages.target || []).map(lang => ({ key: lang.code, value: lang.code, label: lang.name })) + const langs = this.$store.state.instance.translationLanguages || [] + return (langs || []).map(lang => ({ key: lang.code, value: lang.code, label: lang.name })) }, translationLanguage: { get: function () { return this.$store.getters.mergedConfig.translationLanguage }, @@ -133,6 +135,17 @@ const GeneralTab = { this.$store.dispatch('setOption', { name: 'profileVersion', value: 1 }) this.$store.dispatch('syncSettings') this.newProfileName = '' + }, + forceSync () { + this.$store.dispatch('getSettingsProfile') + }, + refreshProfiles () { + this.$store.dispatch('listSettingsProfiles') + }, + deleteSettingsProfile (name) { + if (confirm(this.$t('settings.settings_profile_delete_confirm'))) { + this.$store.dispatch('deleteSettingsProfile', name) + } } } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 479cb1d3..2c7c6c01 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -13,7 +13,16 @@ v-if="user && (settingsProfiles.length > 0)" >

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

-

{{ $t('settings.settings_profile_currently', { name: settingsProfile, version: settingsVersion }) }}

+

+ {{ $t('settings.settings_profile_currently', { name: settingsProfile, version: settingsVersion }) }} + + +

@@ -36,6 +45,7 @@
+

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

- +

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

- + +