From c48b08efee3bc3c30a82cdcbdb088073697264ac Mon Sep 17 00:00:00 2001 From: Angelina Filippova Date: Fri, 3 Jan 2020 17:00:20 +0700 Subject: [PATCH] Improve processing multiple selects with array values --- src/store/modules/normalizers.js | 22 +++++-- src/store/modules/settings.js | 2 +- src/views/settings/components/Inputs.vue | 8 +-- .../inputComponents/BackendsLoggerInput.vue | 49 --------------- .../inputComponents/MultipleSelect.vue | 63 +++++++++++++++++++ .../components/inputComponents/index.js | 4 +- src/views/settings/index.vue | 8 +-- 7 files changed, 91 insertions(+), 65 deletions(-) delete mode 100644 src/views/settings/components/inputComponents/BackendsLoggerInput.vue create mode 100644 src/views/settings/components/inputComponents/MultipleSelect.vue diff --git a/src/store/modules/normalizers.js b/src/store/modules/normalizers.js index 120c3874..d4dcbc1f 100644 --- a/src/store/modules/normalizers.js +++ b/src/store/modules/normalizers.js @@ -31,9 +31,14 @@ export const parseNonTuples = (key, value) => { if (key === ':backends') { const index = value.findIndex(el => typeof el === 'object' && el.tuple.includes(':ex_syslogger')) const updated = value.map((el, i) => i === index ? ':ex_syslogger' : el) - return { value: updated } + return updated } - return { value } + if (key === ':args') { + const index = value.findIndex(el => typeof el === 'object' && el.tuple.includes('implode')) + const updated = value.map((el, i) => i === index ? 'implode' : el) + return updated + } + return value } // REFACTOR export const parseTuples = (tuples, key) => { @@ -64,9 +69,11 @@ export const parseTuples = (tuples, key) => { accum[item.tuple[0]] = item.tuple[1] === ':disabled' ? [item.tuple[1]] : item.tuple[1].tuple } else if (item.tuple[0] === ':proxy_url') { accum[item.tuple[0]] = parseProxyUrl(item.tuple[1]) - } else if ((item.tuple[0] === ':sslopts' && item.tuple[1].length === 0) || // should be removed + } else if ((item.tuple[0] === ':sslopts' && item.tuple[1].length === 0) || (item.tuple[0] === ':tlsopts' && item.tuple[1].length === 0)) { accum[item.tuple[0]] = {} + } else if (item.tuple[0] === ':args') { + accum[item.tuple[0]] = parseNonTuples(item.tuple[0], item.tuple[1]) } else if (Array.isArray(item.tuple[1]) && (typeof item.tuple[1][0] === 'object' && !Array.isArray(item.tuple[1][0])) && item.tuple[1][0]['tuple']) { accum[item.tuple[0]] = parseTuples(item.tuple[1], item.tuple[0]) @@ -193,7 +200,7 @@ export const wrapUpdatedSettings = (group, settings, currentState) => { const wrapValues = (settings, currentState) => { return Object.keys(settings).map(setting => { - const [type, value] = Array.isArray(settings[setting]) ? settings[setting] : ['', settings[setting]] + const [type, value] = settings[setting] if (type === 'keyword' || type.includes('keyword') || setting === ':replace') { return { 'tuple': [setting, wrapValues(value, currentState)] } } else if (type === 'atom' && value.length > 0) { @@ -218,6 +225,13 @@ const wrapValues = (settings, currentState) => { return { 'tuple': [setting, { 'tuple': ip }] } } else if (setting === ':ssl_options') { return { 'tuple': [setting, wrapValues(value, currentState)] } + } else if (setting === ':args') { + const index = value.findIndex(el => el === 'implode') + const updatedArray = value.slice() + if (index !== -1) { + updatedArray[index] = { 'tuple': ['implode', '1'] } + } + return { 'tuple': [setting, updatedArray] } } else { return { 'tuple': [setting, value] } } diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js index f7d1df79..406bd46d 100644 --- a/src/store/modules/settings.js +++ b/src/store/modules/settings.js @@ -36,7 +36,7 @@ const settings = { SET_SETTINGS: (state, data) => { const newSettings = data.reduce((acc, { group, key, value }) => { const parsedValue = valueHasTuples(key, value) - ? parseNonTuples(key, value) + ? { value: parseNonTuples(key, value) } : parseTuples(value, key) acc[group][key] = { ...acc[group][key], ...parsedValue } return acc diff --git a/src/views/settings/components/Inputs.vue b/src/views/settings/components/Inputs.vue index c707b859..90d66e46 100644 --- a/src/views/settings/components/Inputs.vue +++ b/src/views/settings/components/Inputs.vue @@ -75,7 +75,7 @@ - + @@ -87,7 +87,7 @@ import AceEditor from 'vue2-ace-editor' import 'brace/mode/elixir' import 'default-passive-events' -import { AutoLinkerInput, BackendsLoggerInput, EditableKeywordInput, IconsInput, MascotsInput, ProxyUrlInput, PruneInput, RateLimitInput, SslOptionsInput } from './inputComponents' +import { AutoLinkerInput, EditableKeywordInput, IconsInput, MascotsInput, MultipleSelect, ProxyUrlInput, PruneInput, RateLimitInput, SslOptionsInput } from './inputComponents' import { processNested } from '@/store/modules/normalizers' export default { @@ -95,10 +95,10 @@ export default { components: { editor: AceEditor, AutoLinkerInput, - BackendsLoggerInput, EditableKeywordInput, IconsInput, MascotsInput, + MultipleSelect, ProxyUrlInput, PruneInput, RateLimitInput, @@ -216,7 +216,7 @@ export default { { group, key: parentKey, input: setting.key, value: valueForState }) }, renderMultipleSelect(type) { - return Array.isArray(type) && this.setting.key !== ':backends' && ( + return Array.isArray(type) && this.setting.key !== ':backends' && this.setting.key !== ':args' && ( type.includes('module') || (type.includes('list') && type.includes('string')) || (type.includes('list') && type.includes('atom')) || diff --git a/src/views/settings/components/inputComponents/BackendsLoggerInput.vue b/src/views/settings/components/inputComponents/BackendsLoggerInput.vue deleted file mode 100644 index da6af188..00000000 --- a/src/views/settings/components/inputComponents/BackendsLoggerInput.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - - diff --git a/src/views/settings/components/inputComponents/MultipleSelect.vue b/src/views/settings/components/inputComponents/MultipleSelect.vue new file mode 100644 index 00000000..bcb766fa --- /dev/null +++ b/src/views/settings/components/inputComponents/MultipleSelect.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/views/settings/components/inputComponents/index.js b/src/views/settings/components/inputComponents/index.js index 601f47d0..faf7c1f8 100644 --- a/src/views/settings/components/inputComponents/index.js +++ b/src/views/settings/components/inputComponents/index.js @@ -1,8 +1,8 @@ export { default as AutoLinkerInput } from './AutoLinkerInput' -export { default as BackendsLoggerInput } from './BackendsLoggerInput' -export { default as MascotsInput } from './MascotsInput' export { default as EditableKeywordInput } from './EditableKeywordInput' export { default as IconsInput } from './IconsInput' +export { default as MascotsInput } from './MascotsInput' +export { default as MultipleSelect } from './MultipleSelect' export { default as ProxyUrlInput } from './ProxyUrlInput' export { default as PruneInput } from './PruneInput' export { default as RateLimitInput } from './RateLimitInput' diff --git a/src/views/settings/index.vue b/src/views/settings/index.vue index 91c73493..5be2da66 100644 --- a/src/views/settings/index.vue +++ b/src/views/settings/index.vue @@ -65,14 +65,12 @@ - - - - + + +