diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js index facc27d5e0be6eaae87a3f11483327d1e4908de2..838bf1fd7b8cc438ee198cab907e474e9c1313a8 100644 --- a/src/store/modules/settings.js +++ b/src/store/modules/settings.js @@ -1,5 +1,5 @@ import { fetchDescription, fetchSettings, migrateToDB, updateSettings, uploadMedia } from '@/api/settings' -import { parseTuples, parseValue, valueHasTuples } from './normalizers' +import { parseTuples, valueHasTuples } from './normalizers' const settings = { state: { @@ -42,14 +42,14 @@ const settings = { state.settings = newSettings }, UPDATE_SETTINGS: (state, { group, key, input, value, type }) => { + const updatedSetting = state.updatedSettings[group] + ? { [key]: { ...state.updatedSettings[group][key], ...{ [input]: [type, value] }}} + : { [key]: { [input]: [type, value] }} + state.updatedSettings[group] = { ...state.updatedSettings[group], ...updatedSetting } + }, + UPDATE_STATE: (state, { group, key, input, value }) => { const updatedState = { [key]: { ...state.settings[group][key], ...{ [input]: value }}} state.settings[group] = { ...state.settings[group], ...updatedState } - - const settingKey = `${group}/${key}/${input}` - state.updatedSettings = { - ...state.updatedSettings, - ...{ [settingKey]: { group, key, value: parseValue(input, value, type) }} - } } }, actions: { @@ -72,12 +72,19 @@ const settings = { commit('REWRITE_CONFIG', { tab, data }) }, async SubmitChanges({ getters, commit, state }) { - const configs = Object.values(state.updatedSettings) + const configs = state.updatedSettings const response = await updateSettings(configs, getters.authHost, getters.token) commit('SET_SETTINGS', response.data.configs) }, UpdateSettings({ commit }, { group, key, input, value, type }) { - commit('UPDATE_SETTINGS', { group, key, input, value, type }) + key + ? commit('UPDATE_SETTINGS', { group, key, input, value, type }) + : commit('UPDATE_SETTINGS', { group, key: input, input: 'value', value, type }) + }, + UpdateState({ commit }, { group, key, input, value }) { + key + ? commit('UPDATE_STATE', { group, key, input, value }) + : commit('UPDATE_STATE', { group, key: input, input: 'value', value }) }, async UploadMedia({ dispatch, getters, state }, { file, tab, inputName, childName }) { const response = await uploadMedia(file, getters.authHost, getters.token) diff --git a/src/views/settings/components/Inputs.vue b/src/views/settings/components/Inputs.vue index 95b7ac0615bdd0598f564d1bd6aa903d8cec344d..3fa248f21fcf39b95d0722f0f60a7086f6cfe261 100644 --- a/src/views/settings/components/Inputs.vue +++ b/src/views/settings/components/Inputs.vue @@ -4,11 +4,11 @@ v-if="setting.type === 'string'" :value="inputValue" :placeholder="setting.suggestions ? setting.suggestions[0] : null" - @input="updateSetting($event, settingGroup.group, settingGroup.key, setting.key, setting.type)"/> + @input="update($event, settingGroup.group, settingGroup.key, settingParent, setting.key, setting.type, nested)"/> <el-switch v-if="setting.type === 'boolean'" :value="inputValue" - @change="updateSetting($event, settingGroup.group, settingGroup.key, setting.key, setting.type)"/> + @change="update($event, settingGroup.group, settingGroup.key, settingParent, setting.key, setting.type, nested)"/> <el-input-number v-if="setting.type === 'integer'" :value="inputValue" @@ -16,33 +16,33 @@ :min="0" size="large" class="top-margin" - @change="updateSetting($event, settingGroup.group, settingGroup.key, setting.key, setting.type)"/> + @change="update($event, settingGroup.group, settingGroup.key, settingParent, setting.key, setting.type, nested)"/> <el-select v-if="setting.type === 'module' || (setting.type.includes('atom') && setting.type.includes(false))" :value="inputValue" clearable - @change="updateSetting($event, settingGroup.group, settingGroup.key, setting.key)"> + @change="update($event, settingGroup.group, settingGroup.key, settingParent, setting.key, setting.type, nested)"> <el-option v-for="(option, index) in setting.suggestions" :value="option" :key="index"/> </el-select> - <div v-if="setting.type === 'keyword'"> + <!-- <div v-if="setting.type === 'keyword'"> <div v-for="subSetting in setting.children" :key="subSetting.key"> <inputs :setting-group="settingGroup" :setting="subSetting" - :data="data[setting.key]" + :data="data" :custom-label-width="'100px'"/> </div> - </div> + </div> --> <el-select v-if="renderMultipleSelect(setting.type)" :value="setting.key === ':rewrite_policy' ? rewritePolicyValue : inputValue" multiple filterable allow-create - @change="updateSetting($event, settingGroup.group, settingGroup.key, setting.key)"> + @change="update($event, settingGroup.group, settingGroup.key, settingParent, setting.key, setting.type, nested)"> <el-option v-for="(option, index) in setting.suggestions" :key="index" :value="option"/> </el-select> <editor @@ -62,9 +62,9 @@ @input="updateSetting($event, settingGroup.group, settingGroup.key, setting.key)"/> <el-input v-if="setting.type === 'atom'" - :value="inputValue ? inputValue.substr(1) : null" - :placeholder="setting.suggestions[0]" - @input="updateSetting($event, settingGroup.group, settingGroup.key, setting.key)"> + :value="inputValue" + :placeholder="setting.suggestions[0] ? setting.suggestions[0].substr(1) : ''" + @input="update($event, settingGroup.group, settingGroup.key, settingParent, setting.key, setting.type, nested)"> <template slot="prepend">:</template> </el-input> <div v-if="editableKeywordWithInput(setting.key)"> @@ -212,6 +212,12 @@ export default { return {} } }, + nested: { + type: Boolean, + default: function() { + return false + } + }, setting: { type: Object, default: function() { @@ -247,9 +253,11 @@ export default { : null }, inputValue() { - if ([':esshd', ':cors_plug', ':quack', ':http_signatures'].includes(this.settingGroup.group) && this.data[this.setting.key]) { + if ([':esshd', ':cors_plug', ':quack', ':http_signatures'].includes(this.settingGroup.group) && + this.data[this.setting.key]) { return this.data[this.setting.key].value - } else if (this.settingGroup.group === ':logger' && this.setting.key === ':backends') { + } else if ((this.settingGroup.group === ':logger' && this.setting.key === ':backends') || + this.setting.key === 'Pleroma.Web.Auth.Authenticator') { return this.data.value } else { return this.data[this.setting.key] @@ -399,9 +407,13 @@ export default { }, processAutoLinker(value, tab, inputName, childName) { }, - processNestedData(value, tab, inputName, childName) { - const updatedValue = { ...this.$store.state.settings.settings[tab][inputName], ...{ [childName]: value }} - this.updateSetting(updatedValue, this.settingGroup.group, tab, inputName) + processNestedData(value, group, key, parentInput, parentType, childInput, childType) { + const updatedValueForState = { ...this.$store.state.settings.settings[group][key][parentInput], ...{ [childInput]: value }} + const updatedValue = this.$store.state.settings.updatedSettings[group] + ? { ...this.$store.state.settings.updatedSettings[group][key][parentInput][1], ...{ [childInput]: [childType, value] }} + : { [childInput]: [childType, value] } + this.$store.dispatch('UpdateSettings', { group, key, input: parentInput, value: updatedValue, type: parentType }) + this.$store.dispatch('UpdateState', { group, key, input: parentInput, value: updatedValueForState }) }, renderMultipleSelect(type) { return Array.isArray(type) && ( @@ -418,8 +430,14 @@ export default { toggleLimits(value, input) { this.updateSetting(value, this.settingGroup.group, 'rate_limit', input) }, + update(value, group, key, parent, input, type, nested) { + nested + ? this.processNestedData(value, group, key, parent.key, parent.type, input, type) + : this.updateSetting(value, group, key, input, type) + }, updateSetting(value, group, key, input, type) { this.$store.dispatch('UpdateSettings', { group, key, input, value, type }) + this.$store.dispatch('UpdateState', { group, key, input, value }) } } } diff --git a/src/views/settings/components/Setting.vue b/src/views/settings/components/Setting.vue index ac984e97fa771dded5a2af6b2216a48aee5cea46..f664138221c77b81d69950fa3c78e2e6b3d664c7 100644 --- a/src/views/settings/components/Setting.vue +++ b/src/views/settings/components/Setting.vue @@ -26,7 +26,8 @@ <inputs :setting-group="settingGroup" :setting="setting" - :data="data"/> + :data="data" + :nested="false"/> </div> <div v-if="compound(setting)"> <el-form-item :label="`${setting.label}:`"/> @@ -36,7 +37,7 @@ :setting-parent="setting" :setting="subSetting" :data="data[setting.key]" - /> + :nested="true"/> </div> <div v-if="!setting.children"> <inputs :setting-group="settingGroup" :setting="setting" :data="data[setting.key]"/>