From 4339a3a9610c38e6dcd7f814ac3be0cd692e2bfc Mon Sep 17 00:00:00 2001
From: Angelina Filippova <linakirsanova@gmail.com>
Date: Sun, 26 Jul 2020 01:26:34 +0300
Subject: [PATCH] Add input for new type `['atom', 'boolean']`

---
 src/store/modules/normalizers.js              |  9 +++-
 src/views/settings/components/Inputs.vue      |  5 ++-
 .../inputComponents/LinkFormatterInput.vue    | 43 ++++++++++++++-----
 3 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/src/store/modules/normalizers.js b/src/store/modules/normalizers.js
index 8991353a..00a5968b 100644
--- a/src/store/modules/normalizers.js
+++ b/src/store/modules/normalizers.js
@@ -28,7 +28,7 @@ const getCurrentValue = (type, value, path) => {
 }
 
 const getValueWithoutKey = (key, [type, value]) => {
-  if (type === 'atom' && value.length > 1) {
+  if (prependWithСolon(type, value)) {
     return `:${value}`
   } else if (key === ':backends') {
     const index = value.findIndex(el => el === ':ex_syslogger')
@@ -132,6 +132,11 @@ const parseProxyUrl = value => {
   return { socks5: false, host: null, port: null }
 }
 
+const prependWithСolon = (type, value) => {
+  return (type === 'atom' && value.length > 0) ||
+    (Array.isArray(type) && type.includes('atom') && typeof value === 'string')
+}
+
 export const processNested = (valueForState, valueForUpdatedSettings, group, parentKey, parents, settings, updatedSettings) => {
   const [{ key, type }, ...otherParents] = parents
   const path = [group, parentKey, ...parents.reverse().map(parent => parent.key).slice(0, -1)]
@@ -216,7 +221,7 @@ const wrapValues = (settings, currentState) => {
       setting === ':replace'
     ) {
       return { 'tuple': [setting, wrapValues(value, currentState)] }
-    } else if (type === 'atom' && value.length > 0) {
+    } 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'
diff --git a/src/views/settings/components/Inputs.vue b/src/views/settings/components/Inputs.vue
index a1dd2216..8bbd8121 100644
--- a/src/views/settings/components/Inputs.vue
+++ b/src/views/settings/components/Inputs.vue
@@ -105,7 +105,7 @@
         <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"/>
         <icons-input v-if="setting.key === ':icons'" :data="iconsData" :setting-group="settingGroup" :setting="setting"/>
-        <link-formatter-input v-if="settingGroup.key === 'Pleroma.Formatter'" :data="data" :setting-group="settingGroup" :setting="setting"/>
+        <link-formatter-input v-if="booleanCombinedInput" :data="data" :setting-group="settingGroup" :setting="setting"/>
         <mascots-input v-if="setting.key === ':mascots'" :data="keywordData" :setting-group="settingGroup" :setting="setting"/>
         <proxy-url-input v-if="setting.key === ':proxy_url'" :data="data[setting.key]" :setting-group="settingGroup" :setting="setting" :parents="settingParent"/>
         <prune-input v-if="setting.key === ':prune'" :data="data[setting.key]" :setting-group="settingGroup" :setting="setting"/>
@@ -216,6 +216,9 @@ export default {
     }
   },
   computed: {
+    booleanCombinedInput() {
+      return Array.isArray(this.setting.type) && this.setting.type.includes('boolean')
+    },
     canBeDeleted() {
       const { group, key } = this.settingGroup
       return _.get(this.$store.state.settings.db, [group, key]) &&
diff --git a/src/views/settings/components/inputComponents/LinkFormatterInput.vue b/src/views/settings/components/inputComponents/LinkFormatterInput.vue
index fd3a24b5..38ec2e50 100644
--- a/src/views/settings/components/inputComponents/LinkFormatterInput.vue
+++ b/src/views/settings/components/inputComponents/LinkFormatterInput.vue
@@ -1,12 +1,27 @@
 <template>
   <div>
-    <div v-if="setting.key === ':class' || setting.key === ':rel'" :data-search="setting.key || setting.group">
-      <el-switch :value="autoLinkerBooleanValue(setting.key)" @change="processTwoTypeValue($event, setting.key)"/>
-      <el-input v-if="autoLinkerBooleanValue(setting.key)" :value="autoLinkerStringValue(setting.key)" @input="processTwoTypeValue($event, setting.key)"/>
+    <div v-if="setting.type.includes('string')" :data-search="setting.key || setting.group">
+      <el-switch :value="autoLinkerBooleanValue" @change="processTwoTypeValue($event, setting.key)"/>
+      <el-input
+        v-if="autoLinkerBooleanValue"
+        :value="autoLinkerStringValue"
+        @input="processTwoTypeValue($event, setting.key)"/>
     </div>
-    <div v-if="setting.key === ':truncate'" :data-search="setting.key || setting.group">
-      <el-switch :value="autoLinkerBooleanValue(setting.key)" @change="processTwoTypeValue($event, setting.key)"/>
-      <el-input-number v-if="autoLinkerBooleanValue(setting.key)" :value="autoLinkerIntegerValue(setting.key)" @input="processTwoTypeValue($event, setting.key)"/>
+    <div v-if="setting.type.includes('integer')" :data-search="setting.key || setting.group">
+      <el-switch :value="autoLinkerBooleanValue" @change="processTwoTypeValue($event, setting.key)"/>
+      <el-input-number
+        v-if="autoLinkerBooleanValue"
+        :value="autoLinkerIntegerValue"
+        @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-input
+        v-if="autoLinkerBooleanValue"
+        :value="autoLinkerAtomValue"
+        @input="processTwoTypeValue($event, setting.key)">
+        <template slot="prepend">:</template>
+      </el-input>
     </div>
   </div>
 </template>
@@ -34,19 +49,25 @@ export default {
       }
     }
   },
-  methods: {
-    autoLinkerBooleanValue(key) {
+  computed: {
+    autoLinkerAtomValue() {
+      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() {
       const value = this.data[this.setting.key]
       return typeof value === 'string' || typeof value === 'number'
     },
-    autoLinkerIntegerValue(key) {
+    autoLinkerIntegerValue() {
       const value = this.data[this.setting.key]
       return value || 0
     },
-    autoLinkerStringValue(key) {
+    autoLinkerStringValue() {
       const value = this.data[this.setting.key]
       return value || ''
-    },
+    }
+  },
+  methods: {
     processTwoTypeValue(value, input) {
       if (value === true) {
         const data = input === ':truncate' ? 0 : ''
-- 
GitLab