Newer
Older
mcms / ms-basic / src / main / webapp / WEB-INF / manager / component / ms-search.ftl
StephanieGitHub on 16 Dec 2020 8 KB first commit
<template id="ms-search">
    <el-dialog id="search" title="筛选" :visible.sync="searchVisible" width="70%" v-cloak>
        <el-row>
            <el-col :span="24">
                <el-scrollbar class="ms-scrollbar" style="height: 100%;">
                <el-form ref="form" label-width="120px" size="mini">
                    <el-form-item label="添加筛选条件:">
                        <el-select
                                @change="select">
                            <el-option v-for='(item,index) in condition' :key="item.index" :value="index"
                                       :label="item.name"></el-option>
                        </el-select>
                    </el-form-item>
                </el-form>
                </el-scrollbar>
            </el-col>
        </el-row>
        <el-table size="mini" :show-header="false"
                  :data="list"
                  style="width: 100%">
            <el-table-column
                    prop="name"
                    width="110">
            </el-table-column>
            <el-table-column width="130">
                <template slot-scope="scope">
                    <el-select v-model="scope.row.el" size="mini" v-if="scope.row.type=='input'||scope.row.type=='textarea'">
                        <el-option label="等于" value="eq"></el-option>
                        <el-option label="包含" value="like"></el-option>
                        <el-option label="左等于" value="likeLeft"></el-option>
                        <el-option label="右等于" value="likeRight"></el-option>
                    </el-select>
                    <el-select v-model="scope.row.el" size="mini" v-if="scope.row.type=='number'">
                        <el-option label="大于" value="gt"></el-option>
                        <el-option label="小于" value="lt"></el-option>
                        <el-option label="等于" value="eq"></el-option>
                        <el-option label="大于等于" value="gte"></el-option>
                        <el-option label="小于等于" value="lte"></el-option>
                    </el-select>
                    <el-select v-model="scope.row.el" size="mini" v-if="scope.row.type=='date'||scope.row.type=='time'" @change="dateChange(scope.row)">
                        <el-option label="大于" value="gt"></el-option>
                        <el-option label="等于" value="eq"></el-option>
                        <el-option label="小于" value="lt"></el-option>
                        <el-option label="范围" value="range"></el-option>
                    </el-select>
                    <span v-if="scope.row.hasOwnProperty('multiple')||scope.row.type=='switch' || scope.row.type=='role'">是</span>
                </template>
            </el-table-column>
            <el-table-column >
                <template slot-scope="scope">
                    <el-input  style="width: 200px" v-model="scope.row.value" size="mini"
                               v-if="scope.row.type=='input'||scope.row.type=='number'||scope.row.type=='textarea'">
                    </el-input>
                    <el-select  style="width: 200px" v-model="scope.row.value" size="mini" v-if="scope.row.hasOwnProperty('multiple')">
                        <el-option v-for='item in $root[scope.row.model+"Options"]' :key="item[scope.row.key]" :value="item[scope.row.key]"
                                   :label="item[scope.row.title]"></el-option>
                    </el-select>
                    <el-switch v-if="scope.row.type=='switch'" v-model="scope.row.value">
                    </el-switch>
                    <ms-employee v-if="scope.row.type=='role'"
                                      size="mini"
                                      v-model="scope.row.value">
                    </ms-employee>
                    <template v-if="scope.row.type=='time'">
                        <el-time-picker
                                size="mini"
                                v-if="scope.row.el=='range'"
                                clearable
                                is-range
                                range-separator="至"
                                start-placeholder="请选择开始时间"
                                end-placeholder="请选择结束时间"
                                v-model="scope.row.value">
                        </el-time-picker>
                        <el-time-picker
                                size="mini"
                                v-else
                                clearable
                                v-model="scope.row.value">
                        </el-time-picker>
                    </template>
                    <template v-if="scope.row.type=='date'">
                        <el-date-picker
                                size="mini"
                                v-if="scope.row.el=='range'"
                                v-model="scope.row.value"
                                type="datetimerange"
                                start-placeholder="请选择开始日期"
                                end-placeholder="请选择结束日期">
                        </el-date-picker>
                        <el-date-picker
                                size="mini"
                                v-else
                                clearable
                                v-model="scope.row.value">
                        </el-date-picker>
                    </template>
                </template>
            </el-table-column>
            <el-table-column align="center" width="130">
                <template slot-scope="scope">
                    <el-select v-model="scope.row.action" size="mini" v-if="scope.$index != list.length-1">
                        <el-option label="与" value="and"></el-option>
                        <el-option label="或" value="or"></el-option>
                    </el-select>
                </template>
            </el-table-column>
            <el-table-column align="center" width="60">
                <template slot-scope="scope">
                    <el-link type="primary" :underline="false"  @click="delField(scope.$index)">删除</el-link>
                </template>
            </el-table-column>
        </el-table>
        <span slot="footer" class="dialog-footer">
    <el-button type="primary" size="mini" @click="search">查询</el-button>
  </span>
    </el-dialog>
</template>
<script>
    Vue.component('ms-search', {
        template: '#ms-search',
        props: {
            conditionData:{
                type:Array,
                default: []
            },
            conditions:{
                type:Array,
                default: []
            },
            close: {
                type: Boolean,
                default: true
            },
        },
        watch:{
            list:{
                handler: function(nv) {
                    this.$emit("update:conditions",nv)
                },
                deep: true
            }
        },
        data: function () {
            return{
                searchVisible:false,
                condition:this.conditionData,
                list:this.conditions,
            }
        },
        methods: {
            delField: function (index) {
                this.list.splice(index, 1);
            },
            //选择条件
            select: function (val) {
                this.list.push(Object.assign({},
                    this.condition[val],{
                        value: this.condition[val].type=='switch'?false:'',
                    }
                ));
            },
            open: function(){
                this.searchVisible = true;
            },
            close: function(){
                this.searchVisible = false;
            },
            dateChange: function(data){
                //时间数据转换,不然会报错
                if(data.el==='range'){
                    data.value=[]
                }else {
                    data.value=''
                }
            },
            search: function(){
                if(this.close){
                    this.close();
                }
                var data = []
                this.list.forEach(function(x){
                    if(x.el==='range'){
                        if(x.value.length){
                            data.push(x)
                        }
                    }else {
                        if(x.value){
                            data.push(x)
                        }
                    }
                })
                this.$emit("search",data)
            },
        }
    });
</script>
<style>
    #search .el-date-editor,
    #search .el-select,
    #search .el-input{
        width: 100% !important;
    }
</style>