Browse Source

定向包 - 地域封装 - 选择的还未完成

liuxiaona 1 year ago
parent
commit
742db278af

+ 8 - 53
src/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/cascader.ts

@@ -1,8 +1,9 @@
1 1
 import {computed, getCurrentInstance, reactive, ref} from "vue";
2 2
 import SubList from '@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subList.vue'
3 3
 import {reactiveTableAndAny} from "@/api/ApiModel";
4
+import _ from "lodash";
4 5
 
5
-export function cascaderTs(propsParams:any,emitParams:any){
6
+export function cascaderTs(propsParams:any){
6 7
 
7 8
     const { proxy } = getCurrentInstance() as any;
8 9
 // 全局方法定义
@@ -15,6 +16,7 @@ export function cascaderTs(propsParams:any,emitParams:any){
15 16
     })
16 17
 
17 18
     const acIdx = ref<number>(-1)
19
+
18 20
     //全选
19 21
     const isAllCheck = computed(()=>{
20 22
         let flag:boolean = true
@@ -27,38 +29,12 @@ export function cascaderTs(propsParams:any,emitParams:any){
27 29
     })
28 30
 
29 31
     const pageInfo = reactive<reactiveTableAndAny>({
30
-        chooseOpions:[],
31 32
         subOpions:[],
32 33
         subId:'',
34
+        chooseIds:[],
33 35
     })
34 36
 
35 37
 
36
-//已选的个数
37
-    const chooseNum = computed(()=>{
38
-        let num:number = 0
39
-        opionsList.value.forEach(item=>{
40
-            if(item.isCheck){
41
-                num+=1
42
-            }else{
43
-                item.child.forEach(sub=>{
44
-                    if(sub.isCheck){
45
-                        num+=1
46
-                    }
47
-                })
48
-            }
49
-        })
50
-        return num
51
-    })
52
-
53
-//最高级添加至已选列表
54
-    const addToChooseList = (item:any) => {
55
-        if(item.isCheck){
56
-            pageInfo.chooseOpions.push(item)
57
-        }else{
58
-            let idx:number = pageInfo.chooseOpions.findIndex(n=>n.id == item.id)
59
-            pageInfo.chooseOpions.splice(idx,1)
60
-        }
61
-    }
62 38
 
63 39
     //设置下级是否全选或全不选
64 40
     const set_check = (arr:any,val:boolean) => {
@@ -73,12 +49,12 @@ export function cascaderTs(propsParams:any,emitParams:any){
73 49
 //全选
74 50
     const allEvent = (val:boolean) => {
75 51
         set_check(opionsList.value,val)
76
-        pageInfo.chooseOpions = JSON.parse(JSON.stringify(opionsList.value))
77 52
         if(!val){ //清空子选项
78 53
             pageInfo.subOpions = []
79 54
             acIdx.value = -1
80 55
         }
81 56
     }
57
+
82 58
     //根据子全选 - 设置父级以及爷级是否选中
83 59
     const setParentItemCheckEvent = (checked: any,parentId:number|string) => {
84 60
         opionsList.value.forEach(item=>{
@@ -102,45 +78,24 @@ export function cascaderTs(propsParams:any,emitParams:any){
102 78
     }
103 79
 
104 80
 
81
+    const updateKey=ref<number>(1)
105 82
 
106 83
 //个别点击,选中的时候
107 84
     const ItemClickEvent = (itemIdx:number,item:any) => {
108 85
         //展示子选项
109 86
         ItemClickShowSubEvent(itemIdx,item)
110
-        pageInfo.chooseOpions = JSON.parse(JSON.stringify(opionsList.value))
111 87
     }
112 88
 
113 89
 
114
-//全选回显
115
-    const echoEvent = (obj:any) => {
116
-        let idx:number = opionsList.value.findIndex(n=>n.id == obj.id)
117
-        opionsList.value[idx].isCheck = obj.flag
118
-    }
119
-
120
-
121
-
122
-//已选框中的 删除
123
-    const deleEvent = (item:any) => {
124
-        item.isCheck = false
125
-        item.child.forEach(sub=>{
126
-            sub.isCheck = false
127
-        })
128
-    }
129
-
130
-
131
-
132 90
     return{
133 91
         acIdx,
134 92
         isAllCheck,
135 93
         pageInfo,
136
-        chooseNum,
137
-        addToChooseList,
138 94
         opionsList,
139 95
         allEvent,
96
+        updateKey,
140 97
         ItemClickShowSubEvent,
141 98
         ItemClickEvent,
142
-        echoEvent,
143
-        deleEvent,
144
-        setParentItemCheckEvent
99
+        setParentItemCheckEvent,
145 100
     }
146 101
 }

+ 87 - 44
src/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/index.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
   <div class="flexWrap" style="align-items: flex-start">
3
-
3
+    {{testList.list}}
4 4
     <div class="panel" >
5 5
       <div class="title">{{title||'-'}}</div>
6 6
       <div class="content">
@@ -8,7 +8,7 @@
8 8
           <el-checkbox v-model="isAllCheck" size="default" @change="val=>allEvent(val)">全选</el-checkbox>
9 9
         </div>
10 10
         <div class="cItem" v-for="(item,itemIdx) in opionsList" :class="itemIdx == acIdx ? 'active' : ''" @click.stop="ItemClickShowSubEvent(itemIdx,item)">
11
-          <el-checkbox v-model="item.isCheck" size="default" @change="ItemClickEvent(itemIdx,item)">{{item.name}}</el-checkbox>
11
+          <el-checkbox v-model="item.isCheck" size="default" @change="val=>ItemClickEvent(itemIdx,item)">{{item.name}}</el-checkbox>
12 12
           <el-icon class="lMarauto" color="#606266" :size="14" v-if="item.child&&item.child.length>0"><i-ep-ArrowRight/></el-icon>
13 13
         </div>
14 14
       </div>
@@ -17,62 +17,35 @@
17 17
     <template v-if="pageInfo.subOpions&&pageInfo.subOpions.length>0">
18 18
       <SubList title="选项" :list="pageInfo.subOpions"
19 19
                :subId="pageInfo.subId"
20
-               @setParentItemCheck="setParentItemCheckEvent"
21
-               @echoVal="echoEvent"></SubList>
20
+               @setParentItemCheck="setParentItemCheckEvent"></SubList>
22 21
     </template>
23 22
 
24 23
 
25
-<!--
26
-    <div class="panel">
27
-      <div class="title c-000 f12">已选<span>({{pageInfo.chooseOpions&&pageInfo.chooseOpions.length}})</span></div>
28
-      <div class="content">
29
-        <template v-for="(item,idx) in pageInfo.chooseOpions">
30
-          <div class="cItem active tMar8"  v-if="item.isCheck">
31
-            {{item.name}}
32
-            <el-icon class="lMarauto" color="#606266" :size="14" @click="deleEvent(item)"><i-ep-Close/></el-icon>
33
-          </div>
34
-          <template v-else>
35
-            <template v-for="sub in item.child">
36
-              <div class="cItem active tMar8" v-if="sub.isCheck">
37
-                {{sub.name}}
38
-                <el-icon class="lMarauto" color="#606266" :size="14" @click="sub.isCheck = false"><i-ep-Close/></el-icon>
39
-              </div>
40
-            </template>
41
-          </template>
42
-        </template>
43
-      </div>
44
-    </div>
45
--->
46
-
47
-<!--    写到已选-->
48 24
     <div class="panel">
49
-      <div class="title c-000 f12">已选<span>({{pageInfo.chooseOpions&&pageInfo.chooseOpions.length}})</span></div>
25
+      <div class="title c-000 f12">已选<span>({{chooseNum}})</span></div>
50 26
       <div class="content">
51 27
         <template v-for="(item,idx) in opionsList">
52 28
           <div class="cItem active tMar8"  v-if="item.isCheck">
53
-            {{item.name}}
29
+            {{item.name}}-{{item.id}}}
54 30
             <el-icon class="lMarauto" color="#606266" :size="14" @click="deleEvent(item)"><i-ep-Close/></el-icon>
55 31
           </div>
56 32
           <template v-else>
57 33
             <template v-for="sub in item.child">
58
-              <div class="cItem active tMar8" v-if="sub.isCheck">
59
-                {{sub.name}}
60
-                <el-icon class="lMarauto" color="#606266" :size="14" @click="sub.isCheck = false"><i-ep-Close/></el-icon>
61
-              </div>
34
+              <SubChooseItem :ITEM="sub"></SubChooseItem>
62 35
             </template>
63 36
           </template>
64 37
         </template>
65 38
       </div>
66 39
     </div>
40
+
41
+
67 42
   </div>
68 43
 </template>
69 44
 <script setup lang="ts">
70
-import {cascaderTs} from "@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/cascader";
71
-import {computed, defineEmits, defineProps, withDefaults} from "vue";
72
-
73
-const emit = defineEmits<{
74
-  (event: "echoVal", val: any): void;
75
-}>();
45
+import SubChooseItem from '@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subChooseItem.vue'
46
+import {cascaderTs} from "@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/index";
47
+import {subChooseTs} from "@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subChoose";
48
+import {computed, defineProps, withDefaults, watch, reactive} from "vue";
76 49
 
77 50
 
78 51
 const props = withDefaults(defineProps<{
@@ -85,20 +58,90 @@ const props = withDefaults(defineProps<{
85 58
   subId:''
86 59
 })
87 60
 
61
+
62
+//已选的个数
63
+const chooseNum = computed(()=>{
64
+  let num:number = 0
65
+  opionsList.value.forEach(item=>{
66
+    if(item.isCheck){
67
+      num+=1
68
+    }else{
69
+      if(item.child&&item.child.length>0){
70
+        item.child.forEach(sub=>{
71
+          if(sub.isCheck){
72
+            num+=1
73
+          }else{
74
+            if(sub.child&&sub.child.length>0){
75
+              sub.child.forEach(sun=>{
76
+                if(sun.isCheck){
77
+                  num+=1
78
+                }else{
79
+                  if(sun.child&&sun.child.length>0){
80
+                    sun.child.forEach(cSun=>{
81
+                      if(cSun.isCheck){
82
+                        num+=1
83
+                      }
84
+                    })
85
+                  }
86
+                }
87
+              })
88
+            }
89
+          }
90
+        })
91
+      }
92
+    }
93
+  })
94
+  return num
95
+})
96
+
97
+const subChooseNum = (arr:any,numProp:number) => {
98
+ if(arr&&arr.length>0){
99
+   arr.forEach(sub=>{
100
+     if(sub.isCheck){
101
+       numProp+=1
102
+     }else{
103
+       if(sub.child&&sub.child.length>0){
104
+         subChooseNum(sub.child,numProp)
105
+       }
106
+     }
107
+   })
108
+ }
109
+ return numProp
110
+}
111
+
112
+
113
+
114
+
88 115
 const {
89 116
   acIdx,
90 117
   isAllCheck,
91 118
   pageInfo,
92
-  chooseNum,
93
-  addToChooseList,
94 119
   opionsList,
95 120
   allEvent,
121
+  updateKey,
96 122
   ItemClickShowSubEvent,
97 123
   ItemClickEvent,
98
-  echoEvent,
99
-  deleEvent,
100 124
   setParentItemCheckEvent
101
-}  = cascaderTs(props,emit)
125
+}  = cascaderTs(props)
126
+
127
+
128
+const {deleEvent} = subChooseTs()
129
+
130
+
131
+// const testList = reactive<any>({
132
+//   list:[]
133
+// })
134
+// //获取选中的集合
135
+// const get_chooseItem = (item:any)=>{
136
+//   if(item.isCheck){
137
+//     // pageInfo.chooseIds.push(item.id)
138
+//     testList.list.push(item.id)
139
+//   }else{
140
+//     if(item.child&&item.child.length>0){
141
+//       get_chooseItem(item.child)
142
+//     }
143
+//   }
144
+// }
102 145
 
103 146
 </script>
104 147
 <style lang="scss" scoped>

+ 32 - 0
src/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subChoose.ts

@@ -0,0 +1,32 @@
1
+import {computed, getCurrentInstance, reactive, ref} from "vue";
2
+import SubChooseItem from '@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subChooseItem.vue'
3
+import {reactiveTableAndAny} from "@/api/ApiModel";
4
+
5
+export function subChooseTs(){
6
+
7
+    const { proxy } = getCurrentInstance() as any;
8
+    // 全局方法定义
9
+    const NumberHandle = proxy.$NumberHandle
10
+
11
+
12
+    //已选框中的 删除
13
+    const deleEvent = (item:any) => {
14
+        item.isCheck = false
15
+        if(item.child&&item.child.length>0){
16
+            set_check(item.child,false)
17
+        }
18
+    }
19
+    //设置下级是否全选或全不选
20
+    const set_check = (arr:any,val:boolean) => {
21
+        arr.forEach(item=>{
22
+            item.isCheck = val
23
+            if(item.child&&item.child.length>0){
24
+                set_check(item.child,val)
25
+            }
26
+        })
27
+    }
28
+
29
+    return{
30
+        deleEvent
31
+    }
32
+}

+ 62 - 0
src/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subChooseItem.vue

@@ -0,0 +1,62 @@
1
+<template>
2
+  <div class="cItem active tMar8"  v-if="ITEM.isCheck">
3
+    {{ITEM.name}}-{{ITEM.id}}
4
+    <el-icon class="lMarauto" color="#606266" :size="14" @click="deleEvent(ITEM)"><i-ep-Close/></el-icon>
5
+  </div>
6
+  <template v-else>
7
+    <template v-for="sub in ITEM.child">
8
+      <SubChooseItem :ITEM="sub"></SubChooseItem>
9
+    </template>
10
+  </template>
11
+</template>
12
+<script setup lang="ts">
13
+import {defineProps, withDefaults} from "vue";
14
+import {subChooseTs} from "@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subChoose";
15
+
16
+const props = withDefaults(defineProps<{
17
+  ITEM?:any,
18
+  subId?:string|number,
19
+}>(), {
20
+  ITEM:{},
21
+  subId:''
22
+})
23
+
24
+const {deleEvent} = subChooseTs()
25
+</script>
26
+<style lang="scss" scoped>
27
+.panel{
28
+  border: 1px solid #dee4f5;
29
+  font-size: 14px;
30
+  width: 200px;
31
+  margin-right: 20px;
32
+  flex-shrink: 0;
33
+  margin-bottom: 10px;
34
+  .title{
35
+    height: 40px;
36
+    padding: 0 12px;
37
+    font-size: 14px;
38
+    line-height: 40px;
39
+    color: #333;
40
+    background-color: #fafbfe;
41
+    border-bottom: 1px solid #dee4f5;
42
+  }
43
+  .content{
44
+    height: 250px;
45
+    overflow-y: auto;
46
+    .cItem{
47
+      display: flex;
48
+      align-items: center;
49
+      cursor: pointer;
50
+      padding: 0 12px;
51
+      height: 32px;
52
+      line-height: 32px;
53
+      &:hover{
54
+        background-color: #f8f8f8;
55
+      }
56
+      &.active{
57
+        background-color: #f8f8f8;
58
+      }
59
+    }
60
+  }
61
+}
62
+</style>

+ 8 - 11
src/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/subList.vue

@@ -1,23 +1,23 @@
1 1
 <template>
2 2
   <div class="flex">
3 3
     <div class="panel" >
4
-      <div class="title">{{title||'-'}}{{props.subId}}</div>
4
+      <div class="title">{{title||'-'}}subId:{{subId}}</div>
5 5
       <div class="content">
6 6
         <div class="cItem">
7
-          <el-checkbox v-model="isAllCheck" size="default" @change="val=>allEvent(val)">全选{{acIdx}}</el-checkbox>
7
+          <el-checkbox v-model="isAllCheck" size="default" @change="val=>allEvent(val)">全选</el-checkbox>
8 8
         </div>
9 9
         <div class="cItem"
10 10
              v-for="(item,itemIdx) in opionsList"
11 11
              @click.stop="ItemClickShowSubEvent(itemIdx,item)"
12 12
              :class="itemIdx == acIdx ? 'active' : ''">
13
-          <el-checkbox v-model="item.isCheck" size="default" @change="val=>ItemClickEvent(itemIdx,item)">{{item.name}}</el-checkbox>
13
+          <el-checkbox v-model="item.isCheck" size="default" @change="val=>ItemClickEvent(itemIdx,item)">{{item.name}}-{{item.id}}</el-checkbox>
14 14
           <el-icon class="lMarauto" color="#606266" :size="14" v-if="item.child&&item.child.length>0"><i-ep-ArrowRight/></el-icon>
15 15
         </div>
16 16
       </div>
17 17
     </div>
18 18
 
19 19
     <template v-if="pageInfo.subOpions&&pageInfo.subOpions.length>0">
20
-      <SubList title="选项"
20
+      <SubList title=""
21 21
                @setParentItemCheck="setParentItemCheckEvent"
22 22
                :list="pageInfo.subOpions"
23 23
                :subId="pageInfo.subId" ></SubList>
@@ -25,8 +25,9 @@
25 25
   </div>
26 26
 </template>
27 27
 <script setup lang="ts">
28
-import {computed, defineEmits, defineProps, watch, withDefaults} from "vue";
29
-import {cascaderTs} from "@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/cascader";
28
+import {computed, defineEmits, defineProps, reactive, watch, withDefaults} from "vue";
29
+import {cascaderTs} from "@/components/businessMoudle/batchGdt/configArea/directPacket/common/Cascader/index";
30
+import {reactiveTableAndAny} from "@/api/ApiModel";
30 31
 
31 32
 const props = withDefaults(defineProps<{
32 33
   title?: string,
@@ -38,7 +39,6 @@ const props = withDefaults(defineProps<{
38 39
   subId:''
39 40
 })
40 41
 const emit = defineEmits<{
41
-  (event: "echoVal", val: any): void;
42 42
   (event: "setParentItemCheck", checked: any,parentId:number|string): void;//设置父级显隐
43 43
 }>();
44 44
 
@@ -53,16 +53,13 @@ const {
53 53
   acIdx,
54 54
   isAllCheck,
55 55
   pageInfo,
56
-  chooseNum,
57
-  addToChooseList,
58 56
   opionsList,
59 57
   allEvent,
60 58
   ItemClickShowSubEvent,
61 59
   ItemClickEvent,
62
-  echoEvent,
63 60
   deleEvent,
64 61
   setParentItemCheckEvent
65
-}  = cascaderTs(props,emit)
62
+}  = cascaderTs(props)
66 63
 
67 64
 //监听本页全选是否选中
68 65
 watch(()=>isAllCheck.value,(val)=>{