Browse Source

查询方案-多选情况下双滚动条

002390 1 year ago
parent
commit
8ad1f338e9

+ 3 - 1
src/components/popover-select-v2/multiple.vue

@@ -244,9 +244,9 @@ export default {
     >
       <el-tag
         v-for="(tag, index) in lastSelectData"
-        :size="size"
         hit
         closable
+        :size="size"
         @close="useDelete(index)"
         style="margin-right: 5px"
       >
@@ -258,6 +258,7 @@ export default {
 <style scoped>
 .popover-select-v2 .el-input {
   width: inherit;
+  height: 100%;
 }
 .popover-select-v2 .el-input .el-icon-search {
   cursor: pointer;
@@ -273,4 +274,5 @@ export default {
 ::v-deep .el-table--mini .el-table__cell {
   height: 50px;
 }
+
 </style>

+ 1 - 1
src/components/query-scheme/colums.js

@@ -17,7 +17,7 @@ export const Columns = [
   {
     item:{
       key: 'value',
-      title:'值'
+      title:'值',
     },
     attr:{
       is:'el-input',

+ 257 - 79
src/components/query-scheme/index.vue

@@ -1,78 +1,177 @@
-
 <script>
-import { Columns } from './colums';
+import { Columns } from "./colums";
 export default {
-  name:'Inquire',
-  components:{
-    Sizer: () => import('./sizer/index.vue'),
+  name: "Inquire",
+  components: {
+    Sizer: () => import("./sizer/index.vue"),
   },
-  props:{
-    size:{
-      type:String,
-      default:'mini',
+  props: {
+    size: {
+      type: String,
+      default: "mini",
     },
     // 候选条件
-    candidate:{
-      type:Array,
-      default: () =>[]
+    candidate: {
+      type: Array,
+      default: () => [],
     },
   },
-  data(){
+  data() {
     return {
-      title: '查询方案',
+      title: "查询方案",
       visible: false,
-      tableData:[ 
-        { 
-          candidate: "orderCode", 
-          options: "like", 
-          value: "12315465416546", 
-          operators: [ { "label": "等于", "value": "eq" }, { "label": "模糊", "value": "like" } ],
-          attr:{ is: 'el-input'}
-        }, 
-        { 
-          candidate: "date", 
-          options: "range", 
-          value: "3333", 
-          operators: [ { "label": "范围", "value": "range" } ] ,
-          attr:{ is: 'el-input'}
-        }, 
-      ]
-      
-    }
+      menuVisible: false,
+      testModeCode: {},
+      CurrentRow: {},
+      schemeData: [
+        {
+          id: 1,
+          name: "方案1",
+        },
+        {
+          id: 2,
+          name: "方案2",
+        },
+        {
+          id: 3,
+          name: "方案3",
+        },
+        {
+          id: 4,
+          name: "方案4",
+        },
+      ],
+      tableData: [
+        {
+          candidate: "orderCode",
+          options: "like",
+          value: "12315465416546",
+          operators: [
+            { label: "等于", value: "eq" },
+            { label: "模糊", value: "like" },
+          ],
+          attr: { is: "el-input" },
+        },
+        {
+          candidate: "date",
+          options: "range",
+          value: "3333",
+          operators: [{ label: "范围", value: "range" }],
+          attr: { is: "el-input" },
+        },
+      ],
+    };
   },
-  computed:{
-    $dicts:{
-      get(){
-        console.log(this.tableData,'tableData');
-        console.log(this.candidate,'candidate');
-        return []
+  computed: {
+    $dicts: {
+      get() {
+        console.log(this.tableData, "tableData");
+        console.log(this.candidate, "candidate");
+        return [];
       },
-      set(){}
-    }
+      set() {},
+    },
   },
-  methods:{
-    open(){
+  methods: {
+    open() {
       this.visible = true;
     },
-    onClose(){
+    onClose() {
       this.visible = false;
     },
-    addCase(){
-      console.log('addCase');
+    // 清空值
+    onReset() {
+      this.tableData = this.tableData.map((item) => {
+        return {
+          ...item,
+          value: "",
+        };
+      });
+    },
+    // 新增方案
+    addCase() {
+      this.$prompt("请输入方案名称", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        inputPattern: /\s*\S+?/,
+        inputErrorMessage: "方案名称不能为空",
+      })
+        .then(({ value }) => {
+          let caseData = this.tableData.map((item) => {
+            return {
+              ...item,
+              value: "",
+            };
+          });
+          console.log(value, caseData, "caseData");
+        })
+        .catch(() => {});
+    },
+    // 重命名
+    renameRow(prop) {
+      console.log(prop, "renameRow");
+      this.$prompt("请输入新方案名称", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        inputPattern: /\s*\S+?/,
+        inputErrorMessage: "方案名称不能为空",
+      })
+        .then(({ value }) => {})
+        .catch(() => {});
+    },
+    // 删除方案
+    deleteRow(prop) {
+      console.log(prop, "deleteRow");
+    },
+    // 设置为默认方案
+    setRow(prop) {
+      console.log(prop, "setRow");
+    },
+    onClick(row) {
+      console.log(row);
+    },
+    // 方案右键
+    rightClick(row, column, event) {
+      this.testModeCode = row.testModeCode;
+
+      // 先把模态框关死,目的是 第二次或者第n次右键鼠标的时候 它默认的是true
+      this.menuVisible = false;
+      // 显示模态窗口,跳出自定义菜单栏
+      this.menuVisible = true;
+      //关闭浏览器右键默认事件
+      event.preventDefault();
+
+      this.CurrentRow = row;
+
+      var menu = document.querySelector(".menu");
+
+      this.styleMenu(menu, event);
+    },
+    foo() {
+      // 取消鼠标监听事件 菜单栏
+      this.menuVisible = false;
+
+      // 关掉监听
+      document.removeEventListener("click", this.foo);
+    },
+    styleMenu(menu) {
+      menu.style.left = event.offsetX + 18 + "px";
+
+      menu.style.top = event.clientY - 50 + "px";
+
+      // 给整个document新增监听鼠标事件,点击任何位置执行foo方法
+      document.addEventListener("click", this.foo);
     },
   },
-  created(){},
-}
+  created() {},
+};
 </script>
 
 <template>
-  <el-button
-    :size="size"
-    @click="open"
-  >
+  <el-button :size="size" @click="open">
     {{ title }}
     <el-dialog
-      width="72%"
+      width="850px"
       class="inquire"
       append-to-body
       :visible.sync="visible"
@@ -81,61 +180,140 @@ export default {
       :close-on-press-escape="false"
     >
       <div slot="title" style="display: flex; justify-content: space-between">
-        <h4 style="margin: 0;">{{ title }}</h4>
+        <h4 style="margin: 0">{{ title }}</h4>
         <div>
-          <el-button 
-            type="primary" 
-            :size="size" 
+          <el-button
+            type="primary"
+            :size="size"
             icon="el-icon-search"
-            @click.native.prevent="$emit('submit',tableData)"
-          >筛 选</el-button>
-          <el-button :size="size" @click.native.prevent="onClose">取 消</el-button>
+            @click.native.prevent="$emit('submit', tableData)"
+            >筛 选</el-button
+          >
+          <el-button
+            :size="size"
+            icon="el-icon-refresh-right"
+            @click.native.prevent="onReset"
+            >清 空</el-button
+          >
+          <el-button :size="size" @click.native.prevent="onClose"
+            >取 消</el-button
+          >
         </div>
       </div>
       <el-container>
-        <el-aside 
-          width="200px" 
-          style="height: 350px;
-          position: relative;
-          border-right: 1px solid rgb(228, 228, 228);
-          background-color: rgb(255, 255, 255)"
+        <el-aside
+          width="220px"
+          style="
+            height: 350px;
+            border-right: 1px solid rgb(228, 228, 228);
+            background-color: rgb(255, 255, 255);
+          "
         >
-          Aside
-          <el-row style="position: absolute; bottom: 0;left: 10;">
+          <el-table
+            :data="schemeData"
+            :show-header="false"
+            :height="320"
+            empty-text=" "
+            show-overflow-tooltip
+            highlight-current-row
+            @cell-click="onClick"
+            @row-contextmenu="rightClick"
+          >
+            <el-table-column prop="name">
+              <template slot-scope="scope">
+                <i class="el-icon-document"></i>
+                {{ scope.row.name }}
+              </template>
+            </el-table-column>
+          </el-table>
+
+          <div id="contextmenu" class="menu" v-show="menuVisible">
+            <div class="contextmenu__item" @click="renameRow(CurrentRow)">
+              重命名
+            </div>
+            <div class="contextmenu__item" @click="deleteRow(CurrentRow)">
+              删除
+            </div>
+            <div class="contextmenu__item" @click="setRow(CurrentRow)">
+              设置为默认方案
+            </div>
+          </div>
+
+          <el-row style="position: absolute; bottom: 16px; left: 10">
             <el-col>
-              <el-button 
+              <el-button
                 type="primary"
                 :size="size"
                 @click.native.prevent="addCase"
-              >保存方案
+                >保存方案
               </el-button>
             </el-col>
           </el-row>
         </el-aside>
-        
-          <Sizer
-            v-model="tableData"
-            :size="size"
-            :candidate="candidate" 
-          ></Sizer>
 
+        <Sizer v-model="tableData" :size="size" :candidate="candidate"></Sizer>
       </el-container>
-      
     </el-dialog>
   </el-button>
 </template>
 
 <style lang="scss" scoped>
-::v-deep.inquire .el-dialog__header{
+::v-deep.inquire .el-dialog__header {
   padding: 15px 15px 10px;
 }
-::v-deep.inquire .el-dialog__body{
+::v-deep.inquire .el-dialog__body {
   padding: 5px;
   .el-aside,
-  .el-main{
+  .el-main {
     padding: 0 10px;
   }
 }
 
+::v-deep.el-table::before {
+  display: none;
+}
+
+::v-deep.el-table {
+  th,
+  td,
+  th.is-leaf {
+    border: none;
+  }
+
+  .el-table__cell {
+    padding: 2px 0;
+  }
+}
 
+// 菜单样式
+.contextmenu__item {
+  display: block;
+  line-height: 28px;
+  text-align: center;
+}
+.contextmenu__item:not(:last-child) {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+}
+.menu {
+  position: absolute;
+  background-color: #fff;
+  width: 100px;
+  /*height: 106px;*/
+  font-size: 12px;
+  color: #444040;
+  border-radius: 4px;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  border-radius: 3px;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  white-space: nowrap;
+  z-index: 1000;
+}
+.contextmenu__item:hover {
+  cursor: pointer;
+  background: #66b1ff;
+  border-color: #66b1ff;
+  color: #fff;
+}
 </style>

+ 147 - 107
src/components/query-scheme/sizer/index.vue

@@ -1,20 +1,20 @@
 <script>
-import { getOperators } from './operators';
-import { Columns } from '../colums';
-import { getDicts as getDicts } from '@/api/system/dict/data'
+import { getOperators } from "./operators";
+import { Columns } from "../colums";
+import { getDicts as getDicts } from "@/api/system/dict/data";
 export default {
-  name:'Sizer',
-  props:{
-    value:{
-      type:[Array],
-      require:true,
+  name: "Sizer",
+  props: {
+    value: {
+      type: [Array],
+      require: true,
     },
-    candidate:{
-      type:[Array],
-      require:true,
+    candidate: {
+      type: [Array],
+      require: true,
     },
   },
-  components:{
+  components: {
     ElDraggable: () => import("@/components/draggable/index.vue"),
     ElFileUpload: () => import("@/components/FileUpload/index.vue"),
     ElPopoverSelectV2: () => import("@/components/popover-select-v2/index.vue"),
@@ -25,115 +25,108 @@ export default {
     ElPopoverMultipleTreeSelect: () =>
       import("@/components/popover-tree-select/multiple.vue"),
     ElDateWrapper: () => import("@/components/date-wrapper/index.vue"),
-  
   },
-  computed:{
-    innerValue:{
-      get(){
+  computed: {
+    innerValue: {
+      get() {
         return this.$props.value;
       },
-      set(value){
-        this.$emit("input",value);
+      set(value) {
+        this.$emit("input", value);
       },
-    }
+    },
   },
-  data(){
+  data() {
     return {
-      showColumns:Columns,
-    }
+      showColumns: Columns,
+    };
   },
-  methods:{
-
+  methods: {
     // 增
-    onRowAdd(){
-
+    onRowAdd() {
       this.innerValue.push({
-       ...this.$init.params([...this.showColumns]),
-       attr: {
-         is: 'el-input'
-       }
+        ...this.$init.params([...this.showColumns]),
+        attr: {
+          is: "el-input",
+        },
       });
     },
     // 删
-    onRowRemove(prop){
-      console.log(prop,'prop');
+    onRowRemove(prop) {
+      console.log(prop, "prop");
       const { $index, row } = prop;
-      this.innerValue.splice($index,1)
+      this.innerValue.splice($index, 1);
     },
     // 条件选择
-    canidateChange(prop){
-      
-      let {$index, row} = prop;
+    canidateChange(prop) {
+      let { $index, row } = prop;
 
-      let selectValue = this.candidate.filter(({item}) => item.key === row.candidate)[0];
-    
-      let operators = selectValue ? getOperators(this.judgeOperatorType(selectValue.attr)) : [];
-      
-      let attr = selectValue.attr ?  selectValue.attr : { is: 'el-input'};
-      console.log(attr.is,'attr');
+      let selectValue = this.candidate.filter(
+        ({ item }) => item.key === row.candidate
+      )[0];
 
-      // 方案存储
-      this.innerValue = this.innerValue.map((tableItem,index) =>{
+      let operators = selectValue
+        ? getOperators(this.judgeOperatorType(selectValue.attr))
+        : [];
 
-        if(row.candidate === tableItem.candidate && $index === index){
+      let attr = selectValue.attr ? selectValue.attr : { is: "el-input" };
+      console.log(attr.is, "attr");
 
-          tableItem.options = '';
+      // 方案存储
+      this.innerValue = this.innerValue.map((tableItem, index) => {
+        if (row.candidate === tableItem.candidate && $index === index) {
+          tableItem.options = "";
 
-          tableItem.value = '';
+          tableItem.value = "";
 
           tableItem.operators = operators;
 
-          tableItem.attr = attr
-        
+          tableItem.attr = attr;
         }
 
-        return tableItem
-       
-      })
+        return tableItem;
+      });
 
       // 值框的选择
       // this.showColumns = this.showColumns
-
     },
     // 操作选择
-    optionChange(prop){
-      console.log(prop,'prop');
+    optionChange(prop) {
+      console.log(prop, "prop");
       // this.$emit("update:value",this.innerValue);
     },
-    judgeOperatorType(type){
-
+    judgeOperatorType(type) {
       switch (type.is) {
+        case "el-popover-multiple-select-v2":
+          return "array";
 
-        case 'el-popover-multiple-select-v2':
-          return 'array';
-
-        case 'el-popover-multiple-tree-select':
-          return 'array';
+        case "el-popover-multiple-tree-select":
+          return "array";
 
-        case 'el-input-number':
-          return 'number';
+        case "el-input-number":
+          return "number";
 
-        case 'el-date-picker':
-          return 'datetime';
+        case "el-date-picker":
+          return "datetime";
 
-        case 'el-select':
+        case "el-select":
           let dictName = type.dictName;
-          if(dictName === 'sys_number_yes_no' 
-            || dictName === 'sys_yes_no' 
-            || dictName === 'sys_true_false' ){
-            return 'boolean';
+          if (
+            dictName === "sys_number_yes_no" ||
+            dictName === "sys_yes_no" ||
+            dictName === "sys_true_false"
+          ) {
+            return "boolean";
           }
-          return 'string';
+          return "string";
 
         default:
-          return 'string';
-
-        }
+          return "string";
+      }
     },
   },
-  created(){
-  }
-}
+  created() {},
+};
 </script>
 
 <template>
@@ -147,8 +140,8 @@ export default {
       v-bind="$attrs"
       v-on="$listeners"
     >
-      <el-table-column 
-        v-for="({item,attr},index) in showColumns"
+      <el-table-column
+        v-for="({ item, attr }, index) in showColumns"
         :key="item.key + index"
         :prop="item.key"
         :label="item.title"
@@ -157,10 +150,9 @@ export default {
         show-overflow-tooltip
       >
         <template slot-scope="scope">
-  
-          <el-select 
+          <el-select
             v-if="item.key === 'candidate'"
-            v-model="scope.row[item.key]" 
+            v-model="scope.row[item.key]"
             :size="$attrs.size"
             filterable
             placeholder="请选择"
@@ -174,9 +166,9 @@ export default {
             ></el-option>
           </el-select>
 
-          <el-select 
+          <el-select
             v-if="item.key === 'options'"
-            v-model="scope.row[item.key]" 
+            v-model="scope.row[item.key]"
             :size="$attrs.size"
             placeholder="请选择"
             @change="optionChange"
@@ -185,10 +177,11 @@ export default {
               v-for="op in scope.row['operators']"
               :key="op.value"
               :label="op.label"
-              :value="op.value">
+              :value="op.value"
+            >
             </el-option>
           </el-select>
-        
+
           <template v-if="item.key === 'value'">
             <component
               v-if="scope.row.attr.is === 'el-select'"
@@ -206,18 +199,60 @@ export default {
                 </el-option>
               </template>
             </component>
+
+            <component
+              v-if="scope.row.attr.is === 'el-popover-select-v2'"
+              v-bind="scope.row.attr"
+              v-model="scope.row[item.key]"
+              :title="item.title"
+              :size="$attrs.size"
+              :source.sync="scope.row"
+              style="width: 100%"
+            ></component>
+
             <component
-              v-else-if="scope.row.attr.is === 'el-popover-select-v2'"
+              v-if="scope.row.attr.is === 'el-popover-multiple-select-v2'"
               v-bind="scope.row.attr"
               v-model="scope.row[item.key]"
               :title="item.title"
               :size="$attrs.size"
               :source.sync="scope.row"
               style="width: 100%"
+            ></component>
+
+            <component
+              v-if="scope.row.attr.is === 'el-popover-tree-select'"
+              v-bind="scope.row.attr"
+              v-model="scope.row[item.key]"
+              :size="$attrs.size"
+              :source.sync="scope.row"
+              @change="$emit('submit')"
+              style="width: 100%"
+            >
+            </component>
+
+            <component
+              v-if="scope.row.attr.is === 'el-popover-multiple-tree-select'"
+              v-bind="scope.row.attr"
+              v-model="scope.row[item.key]"
+              :size="$attrs.size"
+              :source.sync="scope.row"
+              style="width: 100%"
+            >
+            </component>
+
+            <component
+              v-if="scope.row.attr.is === 'el-date-wrapper'"
+              v-bind="scope.row.attr"
+              v-model="scope.row[item.key]"
+              :size="$attrs.size"
+              :source.sync="scope.row"
+              style="width: 100%"
             >
             </component>
+
             <component
-              v-else
+              v-if="scope.row.attr.is === 'el-input'"
               v-bind="scope.row.attr"
               :size="$attrs.size"
               v-model="scope.row[item.key]"
@@ -225,50 +260,55 @@ export default {
             >
             </component>
           </template>
-          
         </template>
-        
-      
       </el-table-column>
       <el-table-column label="操作" width="50">
         <template slot-scope="scope">
-          <i class="el-icon-delete" 
+          <i
+            class="el-icon-delete"
             @click.prevent="onRowRemove(scope)"
-            style="cursor: pointer;"
+            style="cursor: pointer"
           ></i>
         </template>
       </el-table-column>
     </el-table>
     <el-row>
-      <el-col style="padding-left: 10px;">
-        <el-button 
-          type="text" 
-          @click.native.prevent="onRowAdd"
-        >
+      <el-col style="padding-left: 10px">
+        <el-button type="text" @click.native.prevent="onRowAdd">
           <i class="el-icon-plus"></i>
           新增筛选条件
         </el-button>
       </el-col>
     </el-row>
   </el-main>
-
 </template>
 
 <style lang="scss" scoped>
-::v-deep.el-table::before{
+::v-deep.el-table::before {
   display: none;
 }
 
 ::v-deep.el-table {
-
-  th,td,th.is-leaf{
-    border:none;
+  th,
+  td,
+  th.is-leaf {
+    border: none;
   }
 
-  .el-table__cell{
+  .el-table__cell {
     padding: 2px 0;
   }
+  .popover-select-v2 .popover-select-v2_tags,
+  .popover-tree-select .popover-tree-select_tags {
+    left: 15px;
+  }
+  .el-scrollbar__view {
+    padding: 6px 0 0 3px !important;
+  }
 
+  .el-scrollbar__wrap {
+    overflow-x: hidden;
+    margin-right: -2px !important;
+  }
 }
-
-</style>
+</style>