From 6577376642bb9f109fa6c31f5dcd779de10059e5 Mon Sep 17 00:00:00 2001 From: Angelina Filippova <linakirsanova@gmail.com> Date: Sat, 11 Jul 2020 19:42:38 +0300 Subject: [PATCH] Move rendering Crontab settings to Editable keywords after updating its type --- src/store/modules/normalizers.js | 18 ++-- src/views/settings/components/Inputs.vue | 3 - .../inputComponents/CrontabInput.vue | 86 ------------------- .../inputComponents/EditableKeywordInput.vue | 39 ++++++++- .../components/inputComponents/index.js | 1 - 5 files changed, 47 insertions(+), 100 deletions(-) delete mode 100644 src/views/settings/components/inputComponents/CrontabInput.vue diff --git a/src/store/modules/normalizers.js b/src/store/modules/normalizers.js index 927d3d65..2fec92ab 100644 --- a/src/store/modules/normalizers.js +++ b/src/store/modules/normalizers.js @@ -93,14 +93,16 @@ export const parseTuples = (tuples, key) => { return [...acc, { [mascot.tuple[0]]: { ...mascot.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] }, []) } else if (Array.isArray(item.tuple[1]) && - (item.tuple[0] === ':groups' || item.tuple[0] === ':replace' || item.tuple[0] === ':retries' || item.tuple[0] === ':headers' || item.tuple[0] === ':params')) { - accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => { - return [...acc, { [group.tuple[0]]: { value: group.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] - }, []) - } else if (item.tuple[0] === ':crontab') { - accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => { - return { ...acc, [group.tuple[1]]: group.tuple[0] } - }, {}) + (item.tuple[0] === ':groups' || item.tuple[0] === ':replace' || item.tuple[0] === ':retries' || item.tuple[0] === ':headers' || item.tuple[0] === ':params' || item.tuple[0] === ':crontab')) { + if (item.tuple[0] === ':crontab') { + accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => { + return [...acc, { [group.tuple[1]]: { value: group.tuple[0], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] + }, []) + } else { + accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => { + return [...acc, { [group.tuple[0]]: { value: group.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] + }, []) + } } else if (item.tuple[0] === ':match_actor') { accum[item.tuple[0]] = Object.keys(item.tuple[1]).reduce((acc, regex) => { return [...acc, { [regex]: { value: item.tuple[1][regex], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}] diff --git a/src/views/settings/components/Inputs.vue b/src/views/settings/components/Inputs.vue index ef4bf246..0ba74f55 100644 --- a/src/views/settings/components/Inputs.vue +++ b/src/views/settings/components/Inputs.vue @@ -95,7 +95,6 @@ </el-input> <!-- special inputs --> <auto-linker-input v-if="settingGroup.group === ':auto_linker'" :data="data" :setting-group="settingGroup" :setting="setting"/> - <crontab-input v-if="setting.key === ':crontab'" :data="data[setting.key]" :setting-group="settingGroup" :setting="setting"/> <editable-keyword-input v-if="editableKeyword(setting.key, setting.type)" :data="keywordData" :setting-group="settingGroup" :setting="setting" :parents="settingParent"/> <icons-input v-if="setting.key === ':icons'" :data="iconsData" :setting-group="settingGroup" :setting="setting"/> <mascots-input v-if="setting.key === ':mascots'" :data="keywordData" :setting-group="settingGroup" :setting="setting"/> @@ -122,7 +121,6 @@ import i18n from '@/lang' import { AutoLinkerInput, - CrontabInput, EditableKeywordInput, IconsInput, MascotsInput, @@ -140,7 +138,6 @@ export default { name: 'Inputs', components: { AutoLinkerInput, - CrontabInput, EditableKeywordInput, IconsInput, MascotsInput, diff --git a/src/views/settings/components/inputComponents/CrontabInput.vue b/src/views/settings/components/inputComponents/CrontabInput.vue deleted file mode 100644 index 89a14915..00000000 --- a/src/views/settings/components/inputComponents/CrontabInput.vue +++ /dev/null @@ -1,86 +0,0 @@ -<template> - <el-form :label-width="labelWidth" :label-position="isMobile ? 'top' : 'right'" class="crontab"> - <el-form-item v-for="worker in workers" :key="worker" :label="worker" :data-search="setting.key" class="crontab-container"> - <el-input - :value="data[worker]" - :placeholder="getSuggestion(worker) || null" - class="input setting-input" - @input="update($event, worker)"/> - </el-form-item> - </el-form> -</template> - -<script> -export default { - name: 'CrontabInput', - props: { - data: { - type: Object, - default: function() { - return {} - } - }, - setting: { - type: Object, - default: function() { - return {} - } - }, - settingGroup: { - type: Object, - default: function() { - return {} - } - } - }, - computed: { - isDesktop() { - return this.$store.state.app.device === 'desktop' - }, - isMobile() { - return this.$store.state.app.device === 'mobile' - }, - isTablet() { - return this.$store.state.app.device === 'tablet' - }, - labelWidth() { - if (this.isMobile) { - return '100%' - } else { - return '380px' - } - }, - workers() { - return this.setting.suggestions.map(worker => worker[1]) - } - }, - methods: { - getSuggestion(worker) { - return this.setting.suggestions.find(suggestion => suggestion[1] === worker)[0] - }, - update(value, worker) { - const currentValue = this.$store.state.settings.settings[this.settingGroup.group][this.settingGroup.key][this.setting.key] - const updatedValue = { ...currentValue, [worker]: value } - const updatedValueWithType = Object.keys(currentValue).reduce((acc, key) => { - if (key === worker) { - return { ...acc, [key]: ['reversed_tuple', value] } - } else { - return { ...acc, [key]: ['reversed_tuple', currentValue[key]] } - } - }, {}) - - this.$store.dispatch('UpdateSettings', - { group: this.settingGroup.group, key: this.settingGroup.key, input: this.setting.key, value: updatedValueWithType, type: this.setting.type } - ) - this.$store.dispatch('UpdateState', - { group: this.settingGroup.group, key: this.settingGroup.key, input: this.setting.key, value: updatedValue } - ) - } - } -} -</script> - -<style rel='stylesheet/scss' lang='scss'> -@import '../../styles/main'; -@include settings -</style> diff --git a/src/views/settings/components/inputComponents/EditableKeywordInput.vue b/src/views/settings/components/inputComponents/EditableKeywordInput.vue index ff641756..6939547a 100644 --- a/src/views/settings/components/inputComponents/EditableKeywordInput.vue +++ b/src/views/settings/components/inputComponents/EditableKeywordInput.vue @@ -1,6 +1,15 @@ <template> <div class="editable-keyword-container"> - <div v-if="editableKeywordWithInteger" :data-search="setting.key || setting.group"> + <div v-if="setting.key === ':crontab'" :data-search="setting.key" class="crontab"> + <el-form-item v-for="worker in data" :key="getId(worker)" :label="getCrontabWorkerLabel(worker)" class="crontab-container"> + <el-input + :value="getValue(worker)" + :placeholder="getSuggestion(worker) || null" + class="input setting-input" + @input="updateCrontab($event, 'value', worker)"/> + </el-form-item> + </div> + <div v-else-if="editableKeywordWithInteger" :data-search="setting.key || setting.group"> <div v-for="element in data" :key="getId(element)" class="setting-input"> <el-input :value="getKey(element)" placeholder="key" class="name-input" @input="parseEditableKeyword($event, 'key', element)"/> : <el-input-number :value="getValue(element)" :min="0" size="large" class="value-input" @change="parseEditableKeyword($event, 'value', element)"/> @@ -64,7 +73,7 @@ export default { return Array.isArray(this.setting.type) && this.setting.type.includes('keyword') && this.setting.type.includes('integer') }, editableKeywordWithString() { - return Array.isArray(this.setting.type) && ( + return Array.isArray(this.setting.type) && this.setting.key !== ':crontab' && ( (this.setting.type.includes('keyword') && this.setting.type.includes('string')) || (this.setting.type.includes('tuple') && this.setting.type.includes('list')) ) @@ -98,6 +107,10 @@ export default { generateID() { return `f${(~~(Math.random() * 1e8)).toString(16)}` }, + getCrontabWorkerLabel(worker) { + const workerKey = this.getKey(worker) + return workerKey.includes('Pleroma.Workers.Cron.') ? workerKey.replace('Pleroma.Workers.Cron.', '') : workerKey + }, getKey(element) { return Object.keys(element)[0] }, @@ -105,6 +118,9 @@ export default { const { id } = Object.values(element)[0] return id }, + getSuggestion(worker) { + return this.setting.suggestions.find(suggestion => suggestion[1] === this.getKey(worker))[0] + }, getValue(element) { const { value } = Object.values(element)[0] return value @@ -122,6 +138,25 @@ export default { this.updateSetting(updatedValue, this.settingGroup.group, this.settingGroup.key, this.setting.key, this.setting.type) }, + updateCrontab(value, inputType, worker) { + const updatedId = this.getId(worker) + const updatedValue = this.data.map((worker, index) => { + if (Object.values(worker)[0].id === updatedId) { + return { [Object.keys(worker)[0]]: { ...Object.values(this.data[index])[0], value }} + } + return worker + }) + const updatedValueWithType = updatedValue.reduce((acc, worker) => { + return { ...acc, [Object.keys(worker)[0]]: ['reversed_tuple', Object.values(worker)[0].value] } + }, {}) + + this.$store.dispatch('UpdateSettings', + { group: this.settingGroup.group, key: this.settingGroup.key, input: this.setting.key, value: updatedValueWithType, type: this.setting.type } + ) + this.$store.dispatch('UpdateState', + { group: this.settingGroup.group, key: this.settingGroup.key, input: this.setting.key, value: updatedValue } + ) + }, updateSetting(value, group, key, input, type) { const wrappedSettings = this.wrapUpdatedSettings(value, input, type) diff --git a/src/views/settings/components/inputComponents/index.js b/src/views/settings/components/inputComponents/index.js index 3b9bc788..d95ebd05 100644 --- a/src/views/settings/components/inputComponents/index.js +++ b/src/views/settings/components/inputComponents/index.js @@ -1,6 +1,5 @@ export { default as AutoLinkerInput } from './AutoLinkerInput' export { default as EditableKeywordInput } from './EditableKeywordInput' -export { default as CrontabInput } from './CrontabInput' export { default as IconsInput } from './IconsInput' export { default as MascotsInput } from './MascotsInput' export { default as ProxyUrlInput } from './ProxyUrlInput' -- GitLab