mirror of
https://github.com/jumpserver/lina.git
synced 2025-09-20 10:46:35 +00:00
perf(tagSearch): 优化搜索组件增加编辑选项功能 (#286)
* perf(tagSearch): 优化搜索组件增加编辑选项功能 * 优化Tag细节 * 优化Tag细节 Co-authored-by: OrangeM21 <orangemtony@gmail.com>
This commit is contained in:
@@ -47,7 +47,9 @@ export default {
|
|||||||
}
|
}
|
||||||
const option = {
|
const option = {
|
||||||
label: field.label,
|
label: field.label,
|
||||||
|
type: field.type,
|
||||||
value: name
|
value: name
|
||||||
|
|
||||||
}
|
}
|
||||||
if (field.type === 'choice' && field.choices) {
|
if (field.type === 'choice' && field.choices) {
|
||||||
option.children = field.choices.map(item => {
|
option.children = field.choices.map(item => {
|
||||||
|
@@ -1,14 +1,35 @@
|
|||||||
<template>
|
<template>
|
||||||
|
|
||||||
<div class="filter-field">
|
<div class="filter-field">
|
||||||
<el-cascader ref="Cascade" :options="options" :props="config" @change="handleMenuItemChange" />
|
<el-cascader ref="Cascade" :options="options" :props="config" @change="handleMenuItemChange" />
|
||||||
<el-tag v-for="(v, k) in filterTags" :key="k" :name="k" closable size="small" class="filter-tag" type="info" @close="handleTagClose(k)">
|
<el-tag
|
||||||
|
v-for="(v, k) in filterTags"
|
||||||
|
:key="k"
|
||||||
|
:name="k"
|
||||||
|
closable
|
||||||
|
size="small"
|
||||||
|
class="filter-tag"
|
||||||
|
type="info"
|
||||||
|
:disable-transitions="true"
|
||||||
|
@close="handleTagClose(k)"
|
||||||
|
@click="handleTagClick(v,k)"
|
||||||
|
>
|
||||||
<strong v-if="v.label">{{ v.label + ':' }}</strong>
|
<strong v-if="v.label">{{ v.label + ':' }}</strong>
|
||||||
<span v-if="v.valueLabel">{{ v.valueLabel }}</span>
|
<span v-if="v.valueLabel">{{ v.valueLabel }}</span>
|
||||||
<span v-else>{{ v.value }}</span>
|
<span v-else>{{ v.value }}</span>
|
||||||
</el-tag>
|
</el-tag>
|
||||||
<span v-if="keyLabel" slot="prefix" class="filterTitle">{{ keyLabel + ':' }}</span>
|
<span v-if="keyLabel" slot="prefix" class="filterTitle">{{ keyLabel + ':' }}</span>
|
||||||
<el-input ref="SearchInput" v-model="filterValue" :placeholder="placeholder" class="search-input" @blur="focus = false" @focus="focus = true" @change="handleConfirm" />
|
<el-input
|
||||||
|
ref="SearchInput"
|
||||||
|
v-model="filterValue"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
class="search-input"
|
||||||
|
@blur="focus = false"
|
||||||
|
@focus="focus = true"
|
||||||
|
@change="handleConfirm"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -65,13 +86,13 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
filterTags: {
|
// filterTags: {
|
||||||
handler(val) {
|
// handler(val) {
|
||||||
this.$nextTick(() => this.$emit('tagSearch', this.filterMaps))
|
// this.$nextTick(() => this.$emit('tagSearch', this.filterMaps))
|
||||||
// this.$emit('tagSearch', this.filterMaps)
|
// // this.$emit('tagSearch', this.filterMaps)
|
||||||
},
|
// },
|
||||||
deep: true
|
// deep: true
|
||||||
}
|
// }
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -116,6 +137,7 @@ export default {
|
|||||||
},
|
},
|
||||||
handleTagClose(evt) {
|
handleTagClose(evt) {
|
||||||
this.$delete(this.filterTags, evt)
|
this.$delete(this.filterTags, evt)
|
||||||
|
this.$emit('tagSearch', this.filterMaps)
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
handleConfirm() {
|
handleConfirm() {
|
||||||
@@ -124,9 +146,33 @@ export default {
|
|||||||
}
|
}
|
||||||
const tag = { key: this.filterKey, label: this.keyLabel, value: this.filterValue, valueLabel: this.valueLabel }
|
const tag = { key: this.filterKey, label: this.keyLabel, value: this.filterValue, valueLabel: this.valueLabel }
|
||||||
this.$set(this.filterTags, this.filterKey, tag)
|
this.$set(this.filterTags, this.filterKey, tag)
|
||||||
|
this.$emit('tagSearch', this.filterMaps)
|
||||||
this.filterKey = ''
|
this.filterKey = ''
|
||||||
this.filterValue = ''
|
this.filterValue = ''
|
||||||
this.valueLabel = ''
|
this.valueLabel = ''
|
||||||
|
},
|
||||||
|
handleTagClick(v, k) {
|
||||||
|
let unableChange = false
|
||||||
|
for (const field of this.options) {
|
||||||
|
if (field.value === v.key) {
|
||||||
|
if (field.type === 'choice') {
|
||||||
|
unableChange = true
|
||||||
|
}
|
||||||
|
if (field.type === 'boolean') {
|
||||||
|
unableChange = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (unableChange) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.filterValue.length !== 0) {
|
||||||
|
this.handleConfirm()
|
||||||
|
}
|
||||||
|
this.$delete(this.filterTags, k)
|
||||||
|
this.filterKey = v.key
|
||||||
|
this.filterValue = v.value
|
||||||
|
this.$refs.SearchInput.focus()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user