2019-11-03 17:37:56 +00:00
|
|
|
<template>
|
2019-11-08 12:30:44 +00:00
|
|
|
<el-form-item :label="setting.label">
|
2019-11-03 17:37:56 +00:00
|
|
|
<el-input
|
|
|
|
v-if="setting.type === 'string'"
|
|
|
|
:value="data[setting.key]"
|
|
|
|
:placeholder="setting.suggestions[0]"
|
|
|
|
@input="updateSetting($event, settingsGroup.key, setting.key)"/>
|
|
|
|
<el-switch
|
|
|
|
v-if="setting.type === 'boolean'"
|
|
|
|
:value="data[setting.key]"
|
|
|
|
@change="updateSetting($event, settingsGroup.key, setting.key)"/>
|
|
|
|
<el-input-number
|
|
|
|
v-if="setting.type === 'integer'"
|
|
|
|
:value="data[setting.key]"
|
|
|
|
:placeholder="setting.suggestions[0].toString()"
|
|
|
|
:min="0"
|
|
|
|
size="large"
|
|
|
|
class="top-margin"
|
|
|
|
@change="updateSetting($event, settingsGroup.key, setting.key)"/>
|
|
|
|
<el-select
|
2019-11-11 02:36:10 +00:00
|
|
|
v-if="setting.type === 'module' || (setting.type.includes('atom') && setting.type.includes(false))"
|
2019-11-08 12:33:39 +00:00
|
|
|
:value="data[setting.key]"
|
2019-11-03 17:37:56 +00:00
|
|
|
clearable
|
2019-11-08 12:33:39 +00:00
|
|
|
@change="updateSetting($event, settingsGroup.key, setting.key)">
|
2019-11-03 17:37:56 +00:00
|
|
|
<el-option
|
2019-11-11 02:36:10 +00:00
|
|
|
v-for="(option, index) in setting.suggestions"
|
2019-11-03 17:37:56 +00:00
|
|
|
:value="option"
|
2019-11-11 02:36:10 +00:00
|
|
|
:key="index"/>
|
2019-11-03 17:37:56 +00:00
|
|
|
</el-select>
|
|
|
|
<el-select
|
2019-11-12 10:39:38 +00:00
|
|
|
v-if="renderMultipleSelect(setting.type)"
|
2019-11-03 17:37:56 +00:00
|
|
|
:value="data[setting.key]"
|
|
|
|
multiple
|
|
|
|
filterable
|
|
|
|
allow-create
|
|
|
|
@change="updateSetting($event, settingsGroup.key, setting.key)">
|
2019-11-11 02:36:10 +00:00
|
|
|
<el-option v-for="(option, index) in setting.suggestions" :key="index" :value="option"/>
|
2019-11-03 17:37:56 +00:00
|
|
|
</el-select>
|
|
|
|
<editor
|
|
|
|
v-if="Array.isArray(setting.type)
|
|
|
|
&& setting.type.includes('list')
|
|
|
|
&& (setting.type.includes('tuple')
|
|
|
|
)"
|
2019-11-03 19:44:55 +00:00
|
|
|
v-model="editorContent"
|
2019-11-03 17:37:56 +00:00
|
|
|
height="150"
|
|
|
|
width="100%"
|
|
|
|
lang="elixir"
|
|
|
|
theme="chrome"/>
|
2019-11-03 19:44:55 +00:00
|
|
|
<el-input
|
|
|
|
v-if="setting.type === 'tuple'"
|
2019-11-10 01:17:57 +00:00
|
|
|
:placeholder="setting.key === ':ip' ? 'xxx.xxx.xxx.xx' : setting.suggestions[0]"
|
2019-11-03 19:44:55 +00:00
|
|
|
:value="data[setting.key]"
|
|
|
|
@input="updateSetting($event, settingsGroup.key, setting.key)"/>
|
2019-11-08 12:33:39 +00:00
|
|
|
<el-input
|
|
|
|
v-if="setting.type === 'atom'"
|
|
|
|
:value="data[setting.key]"
|
|
|
|
:placeholder="setting.suggestions[0]"
|
|
|
|
@input="updateSetting($event, settingsGroup.key, setting.key)">
|
|
|
|
<template slot="prepend">:</template>
|
|
|
|
</el-input>
|
2019-11-11 13:47:54 +00:00
|
|
|
<div v-if="editableKeywordWithSelect(setting.type)">
|
2019-11-10 11:05:34 +00:00
|
|
|
<div v-for="([key, value], index) in editableKeywordData(data)" :key="index" class="setting-input">
|
|
|
|
<el-input :value="key" placeholder="key" class="name-input" @input="parseEditableKeyword($event, 'key', index)"/> :
|
|
|
|
<el-select :value="value" multiple filterable allow-create class="value-input" @change="parseEditableKeyword($event, 'value', index)"/>
|
|
|
|
<el-button icon="el-icon-minus" circle @click="deleteEditableKeywordRow(index)"/>
|
|
|
|
</div>
|
|
|
|
<el-button icon="el-icon-plus" circle @click="addRowToEditableKeyword"/>
|
|
|
|
</div>
|
2019-11-11 13:47:54 +00:00
|
|
|
<div v-if="editableKeywordWithInteger(setting.type)">
|
|
|
|
<div v-for="([key, value], index) in editableKeywordData(data)" :key="index" class="setting-input">
|
|
|
|
<el-input :value="key" placeholder="key" class="name-input" @input="parseEditableKeyword($event, 'key', index)"/> :
|
|
|
|
<el-input-number :value="value" :min="0" size="large" class="value-input" @change="parseEditableKeyword($event, 'value', index)"/>
|
|
|
|
<el-button icon="el-icon-minus" circle @click="deleteEditableKeywordRow(index)"/>
|
|
|
|
</div>
|
|
|
|
<el-button icon="el-icon-plus" circle @click="addRowToEditableKeyword"/>
|
|
|
|
</div>
|
|
|
|
<div v-if="setting.key === ':prune'">
|
|
|
|
<el-radio-group v-model="prune">
|
|
|
|
<el-radio label=":disabled">Disabled</el-radio>
|
|
|
|
<el-radio label=":maxlen">Limit-based</el-radio>
|
|
|
|
<el-radio label=":maxage">Time-based</el-radio>
|
|
|
|
</el-radio-group>
|
|
|
|
<el-form-item v-if="prune === ':maxlen'" label="max length" label-width="100" label-position="left">
|
|
|
|
<el-input-number
|
|
|
|
:value="data[setting.key][':maxlen']"
|
|
|
|
:min="0"
|
|
|
|
placeholder="1500"
|
|
|
|
size="large"
|
|
|
|
class="top-margin"
|
|
|
|
@change="updateSetting($event, settingsGroup.key, setting.key)"/>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item v-if="prune === ':maxage'" label="max age" label-width="100" label-position="left">
|
|
|
|
<el-input-number
|
|
|
|
:value="data[setting.key][':maxage']"
|
|
|
|
:min="0"
|
|
|
|
placeholder="3600"
|
|
|
|
size="large"
|
|
|
|
class="top-margin"
|
|
|
|
@change="updateSetting($event, settingsGroup.key, setting.key)"/>
|
|
|
|
</el-form-item>
|
|
|
|
</div>
|
2019-11-03 17:37:56 +00:00
|
|
|
<p class="expl">{{ setting.description }}</p>
|
|
|
|
</el-form-item>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import AceEditor from 'vue2-ace-editor'
|
|
|
|
import 'brace/mode/elixir'
|
|
|
|
import 'default-passive-events'
|
|
|
|
|
|
|
|
export default {
|
|
|
|
name: 'Inputs',
|
|
|
|
components: {
|
|
|
|
editor: AceEditor
|
|
|
|
},
|
|
|
|
props: {
|
|
|
|
settingsGroup: {
|
|
|
|
type: Object,
|
|
|
|
default: function() {
|
|
|
|
return {}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
data: {
|
2019-11-10 01:17:57 +00:00
|
|
|
type: Object || Array,
|
2019-11-03 17:37:56 +00:00
|
|
|
default: function() {
|
|
|
|
return {}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setting: {
|
|
|
|
type: Object,
|
|
|
|
default: function() {
|
|
|
|
return {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computed: {
|
2019-11-03 19:44:55 +00:00
|
|
|
editorContent: {
|
|
|
|
get: function() {
|
2019-11-10 01:17:57 +00:00
|
|
|
return this.data[this.setting.key] ? this.data[this.setting.key][0] : ''
|
2019-11-03 19:44:55 +00:00
|
|
|
},
|
|
|
|
set: function(value) {
|
|
|
|
this.processNestedData([value], this.settingsGroup.key, this.setting.key, this.data[this.setting.key])
|
|
|
|
}
|
2019-11-11 13:47:54 +00:00
|
|
|
},
|
|
|
|
prune() {
|
|
|
|
return this.data[this.setting.key] === ':disabled'
|
|
|
|
? ':disabled'
|
|
|
|
: Object.keys(this.data[this.setting.key])[0]
|
2019-11-03 19:44:55 +00:00
|
|
|
}
|
2019-11-03 17:37:56 +00:00
|
|
|
},
|
|
|
|
methods: {
|
2019-11-10 11:05:34 +00:00
|
|
|
addRowToEditableKeyword() {
|
|
|
|
console.log(this.settingsGroup.key, this.setting.key)
|
|
|
|
const updatedValue = this.editableKeywordData(this.data).reduce((acc, el, i) => {
|
|
|
|
return { ...acc, [el[0]]: el[1] }
|
|
|
|
}, {})
|
|
|
|
this.updateSetting({ ...updatedValue, '': [] }, this.settingsGroup.key, this.setting.key)
|
|
|
|
},
|
|
|
|
deleteEditableKeywordRow(index) {
|
|
|
|
const filteredValues = this.editableKeywordData(this.data).filter((el, i) => index !== i)
|
|
|
|
const updatedValue = filteredValues.reduce((acc, el, i) => {
|
|
|
|
return { ...acc, [el[0]]: el[1] }
|
|
|
|
}, {})
|
|
|
|
console.log(updatedValue)
|
|
|
|
this.updateSetting(updatedValue, this.settingsGroup.key, this.setting.key)
|
|
|
|
},
|
2019-11-11 13:47:54 +00:00
|
|
|
editableKeywordWithInteger(type) {
|
|
|
|
return Array.isArray(type)
|
|
|
|
? type.includes('keyword') && type.includes('integer')
|
|
|
|
: false
|
|
|
|
},
|
|
|
|
editableKeywordWithSelect(type) {
|
2019-11-10 11:05:34 +00:00
|
|
|
return Array.isArray(type)
|
|
|
|
? type.includes('keyword') && type.findIndex(el => el.includes('list') && el.includes('string')) !== -1
|
|
|
|
: false
|
|
|
|
},
|
|
|
|
editableKeywordData(data) {
|
|
|
|
return Object.keys(data).map(key => [key, data[key]])
|
|
|
|
},
|
|
|
|
parseEditableKeyword(value, inputType, index) {
|
|
|
|
const updatedValue = this.editableKeywordData(this.data).reduce((acc, el, i) => {
|
|
|
|
if (index === i) {
|
|
|
|
return inputType === 'key' ? { ...acc, [value]: el[1] } : { ...acc, [el[0]]: value }
|
|
|
|
}
|
|
|
|
return { ...acc, [el[0]]: el[1] }
|
|
|
|
}, {})
|
|
|
|
console.log(updatedValue)
|
|
|
|
this.updateSetting(updatedValue, this.settingsGroup.key, this.setting.key)
|
|
|
|
},
|
2019-11-03 19:44:55 +00:00
|
|
|
processNestedData(value, tab, inputName, childName) {
|
|
|
|
const updatedValue = { ...this.$store.state.settings.settings[tab][inputName], ...{ [childName]: value }}
|
|
|
|
this.updateSetting(updatedValue, tab, inputName)
|
|
|
|
},
|
2019-11-12 10:39:38 +00:00
|
|
|
renderMultipleSelect(type) {
|
|
|
|
return Array.isArray(type) && (
|
|
|
|
(type.includes('list') && type.includes('string')) ||
|
|
|
|
(type.includes('list') && type.includes('atom')) ||
|
|
|
|
(type.includes('list') && type.includes('module')) ||
|
|
|
|
(type.includes('module') && type.includes('atom'))
|
|
|
|
)
|
|
|
|
},
|
2019-11-11 13:47:54 +00:00
|
|
|
toggleAtomTuple(value, tab, input) {
|
|
|
|
console.log(value)
|
|
|
|
},
|
2019-11-03 17:37:56 +00:00
|
|
|
updateSetting(value, tab, input) {
|
|
|
|
this.$store.dispatch('UpdateSettings', { tab, data: { [input]: value }})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style rel='stylesheet/scss' lang='scss'>
|
|
|
|
@import '../styles/main';
|
|
|
|
@include settings
|
|
|
|
</style>
|