You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lvyuou/select-list.vue

177 lines
5.7 KiB

<template>
<div class="e-select-list">
<div class="select-update">
<div>
<el-select @change="$emit('input' , $event)" :value="value" filterable>
<el-option :value="0" label="请选择"></el-option>
<el-option :value="v.id" :label="getLabel(v)" v-for="v in list" :key="v.id"></el-option>
</el-select>
</div>
<div>
关键词:
<el-input style="width: 150px" v-model="searchMsg.keyword" />
</div>
<div>
<slot name="search"></slot>
</div>
<!--<div class="search-list" ref="search">
</div>-->
<div class="search-btn">
<el-button icon="el-icon-search" @click="searchTable(true)">
搜索
</el-button>
</div>
</div>
<div class="" v-if="value!=0">
<slot>
</slot>
</div>
</div>
</template>
<style type="text/scss" lang="scss">
.e-select-list{
.select-update{
display: flex;
flex-wrap:wrap;
>div{
margin-right: 10px;
}
>div:last-child{
margin-right: 0px;
}
}
.search-list{
}
}
</style>
<script>
import api from "@/api";
import { empty, isArray ,isObject} from "@/utils/extend";
import {findObject} from "@/utils/utils";
export default {
name: "e-select-list",
data() {
return {
list:[],
searchMsg:{
keyword:''
}
}
},
props:{
value:[String,Number],
model:{
type:Object,
required:true
},
module:{
type:String,
required: true
},
selectUpdate:[String,Array],
searchUpdate:{
type:[String,Array],
default:''
},
showField:{
type:[String,Array]
}
},
watch: {
value(val){
this.selectOption(val);
}
},
computed: {
},
methods: {
selectOption(value){
var v = findObject(this.list , r=>r.id == value );
if( v !== false ){
this.updateModel(v);
}else{
if(value == 0){
this.updateModel({});
}else{
this.$post(api.search.table , {id:value}).then(res=>{
if(!empty(res) && isObject(res)){
this.list.push(res);
this.updateModel(res);
}
}).catch(err=>{
this.$message.error(err.message)
})
}
}
},
updateModel(v){
var field = isArray(this.selectUpdate) ? this.selectUpdate : this.selectUpdate.split(',');
for (var i=0;i<field.length;i++)
{
var f = field[i];
if( f ){
var def = /(^[0-9]+$)/.test(this.model[f]) && this.model[f].length<11 ? 0 : '';
this.model[f] = v[f] !== undefined ? v[f] : def;
}
}
},
getLabel(v){
var result = '';
var field = [];
if(this.showField){
field = isArray(this.showField) ? this.showField : this.showField.split(',').filter(v=>!empty(v))
}else{
field = isArray(this.selectUpdate) ? this.selectUpdate : this.selectUpdate.split(',')
}
//var field = isArray(this.selectUpdate) ? this.selectUpdate : this.selectUpdate.split(',')
for (var i=0;i<field.length;i++)
{
var f = field[i];
if(f && v[f]){
result += v[f]+' - ';
}
}
return result;
},
searchTable(isEmit){
var where = {};
var field = isArray(this.selectUpdate) ? this.selectUpdate : this.selectUpdate.split(',')
var ext = isArray(this.searchUpdate) ? this.searchUpdate : this.searchUpdate.split(',')
var fs = field.concat(ext).filter(f=>f!='');
where[fs.join('|')] = [ 'like' , '%'+this.searchMsg.keyword+'%'];
this.$emit('update-where' , where);
return new Promise((resolve, reject) => {
this.$post(api.search.select , {
table:this.module,
where:JSON.stringify(where)
}).then(res=>{
if(isEmit){
this.$emit('input' , 0);
}
this.list = res;
resolve(res)
}).catch(err=>{
reject(err.message);
});
});
}
},
created() {
this.searchTable().then(res=>{
if(this.value){
this.selectOption(this.value)
}
});
},
mounted() {
},
destroyed() {
}
}
</script>