diff --git a/src/store/modules/normalizers.js b/src/store/modules/normalizers.js index e647a4a78dc4a0d08900551554aa35b5f1d3dd71..ed0d04b84021c7951b2ae4a662e9e0661cb0aa73 100644 --- a/src/store/modules/normalizers.js +++ b/src/store/modules/normalizers.js @@ -57,10 +57,18 @@ export const parseNonTuples = (key, value) => { // REFACTOR export const parseTuples = (tuples, key) => { return tuples.reduce((accum, item) => { - if (key === ':rate_limit') { - accum[item.tuple[0]] = Array.isArray(item.tuple[1]) - ? item.tuple[1].map(el => el.tuple) - : item.tuple[1].tuple + if (key === ':rate_limit' || + (key === 'Pleroma.Web.Endpoint.MetricsExporter' && item.tuple[0] === ':auth')) { + const getValue = () => { + if (typeof item.tuple[1] === 'boolean') { + return item.tuple[1] + } else if (Array.isArray(item.tuple[1])) { + return item.tuple[1].map(el => el.tuple) + } else { + return item.tuple[1].tuple + } + } + accum[item.tuple[0]] = getValue() } else if (item.tuple[0] === ':mascots') { accum[item.tuple[0]] = item.tuple[1].reduce((acc, mascot) => { return [...acc, { [mascot.tuple[0]]: { ...mascot.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] @@ -237,8 +245,9 @@ const wrapValues = (settings, currentState) => { return { 'tuple': [setting, wrapValues(value, currentState)] } } else if (prependWithСolon(type, value)) { return { 'tuple': [setting, `:${value}`] } - } else if (type.includes('tuple') && (type.includes('string') || type.includes('atom'))) { - return typeof value === 'string' + } else if (type.includes('tuple') && + (type.includes('string') || type.includes('atom') || type.includes('boolean'))) { + return typeof value === 'string' || typeof value === 'boolean' ? { 'tuple': [setting, value] } : { 'tuple': [setting, { 'tuple': value }] } } else if (type === 'reversed_tuple') { diff --git a/src/views/settings/components/inputComponents/BooleanCombinedInput.vue b/src/views/settings/components/inputComponents/BooleanCombinedInput.vue index 7f7e9d902b7c6d4083fb8bf13faf91ed92e7f5f5..b7e90402e19b9658b2a0fbf9f3a49740fc726e11 100644 --- a/src/views/settings/components/inputComponents/BooleanCombinedInput.vue +++ b/src/views/settings/components/inputComponents/BooleanCombinedInput.vue @@ -1,28 +1,39 @@ <template> <div> <div v-if="setting.type.includes('string')" :data-search="setting.key || setting.group"> - <el-switch :value="autoLinkerBooleanValue" @change="processTwoTypeValue($event, setting.key)"/> + <el-switch :value="booleanValue" @change="processTwoTypeValue($event, setting.key)"/> <el-input - v-if="autoLinkerBooleanValue" - :value="autoLinkerStringValue" + v-if="booleanValue" + :value="stringValue" @input="processTwoTypeValue($event, setting.key)"/> </div> <div v-if="setting.type.includes('integer')" :data-search="setting.key || setting.group"> - <el-switch :value="autoLinkerBooleanValue" @change="processTwoTypeValue($event, setting.key)"/> + <el-switch :value="booleanValue" @change="processTwoTypeValue($event, setting.key)"/> <el-input-number - v-if="autoLinkerBooleanValue" - :value="autoLinkerIntegerValue" + v-if="booleanValue" + :value="integerValue" @input="processTwoTypeValue($event, setting.key)"/> </div> <div v-if="setting.type.includes('atom')" :data-search="setting.key || setting.group"> - <el-switch :value="autoLinkerBooleanValue" @change="processTwoTypeValue($event, setting.key)"/> + <el-switch :value="booleanValue" @change="processTwoTypeValue($event, setting.key)"/> <el-input - v-if="autoLinkerBooleanValue" - :value="autoLinkerAtomValue" + v-if="booleanValue" + :value="atomValue" @input="processTwoTypeValue($event, setting.key)"> <template slot="prepend">:</template> </el-input> </div> + <div v-if="setting.type.includes('tuple')" :data-search="setting.key || setting.group"> + <el-switch :value="booleanValue" @change="processTupleTwoTypeValue($event, setting.key)"/> + <div v-if="booleanValue" class="tuple-input-container"> + <el-input + v-for="(item, index) in tupleValue" + :value="item" + :key="index" + class="tuple-input" + @input="processTupleTwoTypeValue($event, setting.key, index)"/> + </div> + </div> </div> </template> @@ -50,24 +61,39 @@ export default { } }, computed: { - autoLinkerAtomValue() { + atomValue() { return this.data[this.setting.key] && this.data[this.setting.key][0] === ':' ? this.data[this.setting.key].substr(1) : this.data[this.setting.key] }, - autoLinkerBooleanValue() { + booleanValue() { const value = this.data[this.setting.key] - return typeof value === 'string' || typeof value === 'number' + return typeof value !== 'boolean' }, - autoLinkerIntegerValue() { + integerValue() { const value = this.data[this.setting.key] return value || 0 }, - autoLinkerStringValue() { + stringValue() { const value = this.data[this.setting.key] return value || '' + }, + tupleValue() { + const value = this.data[this.setting.key] + return value || ['', '', ''] } }, methods: { + processTupleTwoTypeValue(value, input, _index) { + if (value === false) { + this.updateSetting(value, this.settingGroup.group, this.settingGroup.key, input, this.setting.type) + } else if (value === true) { + this.updateSetting(['', '', ''], this.settingGroup.group, this.settingGroup.key, input, this.setting.type) + } else { + const data = [...this.tupleValue] + data[_index] = value + this.updateSetting(data, this.settingGroup.group, this.settingGroup.key, input, this.setting.type) + } + }, processTwoTypeValue(value, input) { if (value === true) { const data = input === ':truncate' ? 0 : '' diff --git a/src/views/settings/styles/main.scss b/src/views/settings/styles/main.scss index db55ac707aab9e54948b0e4b0aed6e19daa68c59..c55208ad22c33523707066a6970bede0b685e858 100644 --- a/src/views/settings/styles/main.scss +++ b/src/views/settings/styles/main.scss @@ -352,6 +352,15 @@ line-height: 20px; margin-right: 15px } + .tuple-input { + margin-right: 15px; + } + .tuple-input:last-child { + margin-right: 0; + } + .tuple-input-container { + display: flex; + } .upload-container { display: flex; align-items: baseline;