229 lines
5.6 KiB
Vue
229 lines
5.6 KiB
Vue
<template>
|
|
<div class="drop-down-table">
|
|
<div class="input-tag-box">
|
|
<div id="tag-list-box">
|
|
<el-tag class="elTag" v-show="tags.length > 0" v-for="(tag,index) in tags" closable type="info" size="mini" @close="handeCloseTag(index,tag)">{{tag.name}}</el-tag>
|
|
<el-input v-model="inputValue"
|
|
:placeholder="tags.length > 0 ? '':'请选择'"
|
|
@focus="editor = true"
|
|
@keyup.backspace.native="keyup"
|
|
:style="{width:inputWidth}"/>
|
|
</div>
|
|
<i :class="editor ? iconUp : iconDown" @click="editor = !editor" style="color: #C0C4CC;"/>
|
|
</div>
|
|
<div class="popup-class" :style="{'width':width}" v-show="editor">
|
|
<el-table
|
|
border
|
|
:columns="columns"
|
|
:data="getData"
|
|
@row-click="handeRowClick"
|
|
max-height="500"
|
|
:row-class-name="tableRowClassName"
|
|
header-cell-class-name="table_header_class"
|
|
>
|
|
<el-table-column v-for="item in columns" align="center" :prop="item.key" :label="item.title" :min-width="item.minWidth"/>
|
|
</el-table>
|
|
</div>
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
value: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
height: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
width: {
|
|
type: String,
|
|
default: '400px'
|
|
},
|
|
data: {
|
|
type: Array,
|
|
default: []
|
|
// required: true
|
|
},
|
|
columns: {
|
|
type: Array,
|
|
default: []
|
|
// required: true
|
|
},
|
|
multiple: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
computed: {
|
|
getData() {
|
|
if (!this.multiple) {
|
|
return this.data
|
|
} else {
|
|
return this.data.filter(item => !this.inputValue || item.name.toLowerCase().includes(this.inputValue.toLowerCase()))
|
|
}
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
editor: false,
|
|
inputValue: '',
|
|
iconUp: 'el-select__caret el-input__icon el-icon-arrow-up',
|
|
iconDown: 'el-select__caret el-input__icon el-icon-arrow-down',
|
|
tags: [],
|
|
inputWidth: '100%'
|
|
}
|
|
},
|
|
created() {
|
|
this.inputValue = this.value
|
|
},
|
|
watch: {
|
|
editor() {
|
|
if (this.editor) {
|
|
document.getElementsByClassName('input-tag-box')[0].style.borderColor = '#409EFF'
|
|
} else {
|
|
this.inputValue = ''
|
|
document.getElementsByClassName('input-tag-box')[0].style.borderColor = '#909399'
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
},
|
|
methods: {
|
|
tableRowClassName({ row, rowIndex }) {
|
|
row.index = rowIndex
|
|
let className = 'success-row'
|
|
if (row.disabled) {
|
|
className = 'disabled-row'
|
|
}
|
|
const _index = this.tags.findIndex(item => item === row)
|
|
if (_index > -1) {
|
|
return className + ' select-row'
|
|
}
|
|
return className
|
|
},
|
|
handeRowClick(row, column, event) {
|
|
if (row.disabled) {
|
|
return
|
|
}
|
|
if (this.multiple) {
|
|
const _index = this.tags.findIndex(item => item === row)
|
|
if (_index > -1) {
|
|
this.tags.splice(_index, 1)
|
|
} else {
|
|
this.tags.push(row)
|
|
}
|
|
setTimeout(() => {
|
|
this.getInputWidth()
|
|
})
|
|
} else {
|
|
this.editor = false
|
|
this.inputValue = row.name
|
|
this.tags = [row]
|
|
}
|
|
this.$emit('rowClick', row, this.tags, column, event)
|
|
},
|
|
handeCloseTag(index, tag) {
|
|
this.tags.splice(index, 1)
|
|
this.inputValue = ''
|
|
},
|
|
keyup() {
|
|
if (this.inputValue.length <= 0 && this.tags.length > 0) {
|
|
const list = document.getElementsByClassName('elTag')
|
|
if (list[list.length - 1].style.borderColor !== '') {
|
|
this.handeCloseTag(this.tags.length - 1)
|
|
} else {
|
|
list[list.length - 1].style.borderColor = '#909399'
|
|
}
|
|
}
|
|
},
|
|
getInputWidth() {
|
|
let tagMaxWidth = 0
|
|
const offsetWidth = document.getElementById('tag-list-box').offsetWidth
|
|
const elTagName = document.getElementsByClassName('elTag')
|
|
elTagName.forEach(item => {
|
|
const width = item.offsetWidth + 5.5
|
|
if (width + tagMaxWidth < offsetWidth) {
|
|
tagMaxWidth = width + tagMaxWidth
|
|
} else {
|
|
tagMaxWidth = width
|
|
}
|
|
})
|
|
this.inputWidth = (offsetWidth - tagMaxWidth) + 'px'
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.drop-down-table{
|
|
.input-tag-box{
|
|
display: flex;
|
|
background: #fff;
|
|
align-items: center;
|
|
border-radius: 4px;
|
|
border: 1px solid #DCDFE6;
|
|
#tag-list-box{
|
|
padding: 0;
|
|
width: ~"calc(100% - 30px)";;
|
|
.elTag{
|
|
margin-left: 5px;
|
|
margin-top: 5px;
|
|
}
|
|
}
|
|
/deep/.el-input{
|
|
display: inline-block;
|
|
}
|
|
/deep/.el-input__inner{
|
|
border: 0px!important;
|
|
padding-right: 0;
|
|
}
|
|
/deep/.el-input__icon{
|
|
line-height: 34px!important;
|
|
}
|
|
}
|
|
.popup-class{
|
|
padding: 8px;
|
|
margin-top: 5px;
|
|
width: 100%;
|
|
background: white;
|
|
border: 1px solid #f0f2f5;
|
|
box-shadow: 1px 1px 10px #f0f2f5;
|
|
position: absolute;
|
|
z-index: 9;
|
|
/deep/.ivu-table-tip{
|
|
overflow-x: hidden!important;
|
|
}
|
|
}
|
|
/deep/.table_header_class{
|
|
font-weight: bolder;
|
|
color: black;
|
|
background-color: #ebeef5!important;
|
|
}
|
|
/deep/.gutter{
|
|
background-color: #ebeef5!important;
|
|
}
|
|
/deep/.el-table .success-row {
|
|
&:hover{
|
|
cursor: pointer!important;
|
|
}
|
|
}
|
|
/deep/.el-table .disabled-row {
|
|
color: #c0c4cc !important;
|
|
&:hover{
|
|
cursor: not-allowed!important;
|
|
}
|
|
&:hover>td{
|
|
background-color: #FFF!important;
|
|
}
|
|
}
|
|
/deep/.el-table .select-row {
|
|
color: #409eff;
|
|
font-weight: 700;
|
|
}
|
|
}
|
|
</style>
|