150 lines
4.2 KiB
Vue
150 lines
4.2 KiB
Vue
<template>
|
|
<div v-for="item in columnList" :key="item">
|
|
<div class="searchItem" v-if="item.type == 'date' && ((item.isOpen && item.show) || item.show)">
|
|
<label class="name">{{item.name}}</label>
|
|
<scDatePicker :size="size" v-model:activation_date="params[item.code]" @visible-change="getSelect(item,$event)" start-placeholder="开始日期" end-placeholder="结束日期"></scDatePicker>
|
|
</div>
|
|
<div class="searchItem" v-if="item.type =='multiple' && ((item.isOpen && item.show) || item.show)">
|
|
<label class="name">{{item.name}}</label>
|
|
<scMultipleSelect :size="size" v-model:activation_select="params[item.code]" @fetchData="getSelect(item,$event)" :placeholder="item.placeholder" multiple collapse-tags filterable clearable>
|
|
<el-option v-for="em in item.data" :key="em" :label="em.label" :value="em.id"></el-option>
|
|
</scMultipleSelect>
|
|
</div>
|
|
<div class="searchItem" v-if="item.type == 'select' && ((item.isOpen && item.show) || item.show)">
|
|
<label class="name">{{item.name}}</label>
|
|
|
|
<el-select class="input" :size="size" v-model="params[item.code]" @visible-change="getSelect(item,$event)" :placeholder="item.placeholder" filterable clearable>
|
|
<el-option v-for="em in item.data" :key="em" :label="em.label" :value="em[item.code[0]] || em.active_status"></el-option>
|
|
</el-select>
|
|
</div>
|
|
<div class="searchItem" v-if="item.type == 'text' && ((item.isOpen && item.show) || item.show)">
|
|
<label class="name">{{item.name}}</label>
|
|
<div v-if="item.keyword">
|
|
<scInput class="input" v-model:activation_text="keywordParams" @fetchData="getText(item,$event)" :placeholder="item.placeholder" :size="size"></scInput>
|
|
</div>
|
|
<div v-else>
|
|
<div v-if="typeof item.code == 'string'">
|
|
<scInput class="input" v-model:activation_text="params[item.code]" @fetchData="getText(item,$event)" :placeholder="item.placeholder" :size="size"></scInput>
|
|
</div>
|
|
<div v-else>
|
|
<scVgInput class="input" v-model:activation_text="params[item.code]" @fetchData="getText(item,$event)" :placeholder="item.placeholder" :size="size"></scVgInput>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<slot></slot>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: "index",
|
|
emits: ['fetchSelectData'],
|
|
props:{
|
|
searchList:{type: Array},
|
|
},
|
|
watch:{
|
|
searchList:{
|
|
handler(val){
|
|
if(val && val.length>0){
|
|
this.params = this.groupByType(val);
|
|
}
|
|
},
|
|
immediate:true,
|
|
},
|
|
keywordParams:{
|
|
handler(val) {
|
|
for(let i in this.params){
|
|
if(this.params[i].keyword){
|
|
this.params[i].value = val===""?"":'%'+val+'%';
|
|
}
|
|
}
|
|
},
|
|
immediate:true
|
|
}
|
|
},
|
|
data(){
|
|
return{
|
|
size:"small",
|
|
columnList:this.searchList,
|
|
selectItem:'',
|
|
selectShow:false,
|
|
|
|
params:{},
|
|
keywordParams:"",
|
|
}
|
|
},
|
|
mounted() {
|
|
|
|
},
|
|
methods:{
|
|
getSelect(item,e){
|
|
if(!e) return
|
|
this.$emit('fetchSelectData',{data:item,params:this.params});
|
|
},
|
|
getText(item){
|
|
this.$emit('fetchSelectData',{data:item,params:this.params});
|
|
},
|
|
|
|
reload(){
|
|
this.keywordParams = "";
|
|
for(let i in this.params){
|
|
if(typeof this.params[i] === "object" && this.params[i] !=null){
|
|
if(typeof this.params[i].value == "string"){
|
|
this.params[i].value = "";
|
|
}else{
|
|
this.params[i].value = [];
|
|
}
|
|
}else{
|
|
this.params[i] = "";
|
|
}
|
|
}
|
|
},
|
|
|
|
groupByType(list){
|
|
const grouped = {};
|
|
list.forEach(item=>{
|
|
if (!grouped[item.code]) {
|
|
if(typeof item.code == 'string'){
|
|
grouped[item.code] = {};
|
|
}
|
|
}
|
|
if (item.type === 'text' && Array.isArray(item.code)) {
|
|
item.code.forEach(code => {
|
|
if(!grouped[code]){
|
|
grouped[code] = {};
|
|
}
|
|
|
|
let params = {};
|
|
if(item.keyword){
|
|
params = {
|
|
keyword:true,
|
|
operator:'like',
|
|
value:""
|
|
}
|
|
}else{
|
|
params = {
|
|
operator:'like',
|
|
value:""
|
|
}
|
|
}
|
|
grouped[code] = params;
|
|
});
|
|
} else {
|
|
let operator = item.type == 'date'?'between':item.type == 'multiple'?'in':item.type == 'text'?'link':'';
|
|
let params = {
|
|
operator:operator,
|
|
value:operator=='link'?"":[]
|
|
}
|
|
grouped[item.code] = operator=='' || operator== 'link'?"":params;
|
|
}
|
|
})
|
|
return grouped
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
|
|
</style>
|