widget.qw 1.0.98 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "widget.qw",
3
3
  "private": false,
4
- "version": "1.0.98",
4
+ "version": "1.1.0",
5
5
  "description": "marqstree Vue3组件库",
6
6
  "main": "build/widget.qw.es.js",
7
7
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <van-field v-if="!isGone" :label="props.label" :modelValue="modelValue" readonly :required="isRequired" :rules="rules"
3
- :disabled="isDisabled" :placeholder="props.placeholder" :is-link="isReadonly ? false : true"
2
+ <van-field v-if="!isGone" :label="props.label" :modelValue="modelValue" readonly :required="isRequired"
3
+ :rules="rules" :disabled="isDisabled" :placeholder="props.placeholder" :is-link="isReadonly ? false : true"
4
4
  @click="data.isShowPop = !isReadonly" label-class="label">
5
5
  <template #input v-if="modelValue">
6
6
  <div style="display: flex; align-items: center; flex-wrap: wrap;">
@@ -16,7 +16,7 @@
16
16
  </template>
17
17
  </van-field>
18
18
 
19
- <CascaderPop v-model:show="data.isShowPop" v-model="data.selectedNodeId" :placeholder="props.placeholder"
19
+ <CascaderPop :multiple="props.multiple" v-model:show="data.isShowPop" v-model="data.selectedNodeIds" :placeholder="props.placeholder"
20
20
  @select="onSelect" :keywordQueryNode="props.keywordQueryNode" :idQueryNode="props.idQueryNode" />
21
21
  </template>
22
22
 
@@ -73,7 +73,7 @@ const props = defineProps({
73
73
  const data = reactive({
74
74
  isShowPop: false,
75
75
  selectedNodes: [],
76
- selectedNodeId: null
76
+ selectedNodeIds: null
77
77
  })
78
78
 
79
79
  // 定义emit
@@ -85,23 +85,29 @@ const { isRequired, isReadonly, isGone, isDisabled, rules } = util.props2auth(pr
85
85
  onMounted(() => {
86
86
  })
87
87
 
88
- const onSelect = (node) => {
89
- if(!node){
88
+ const onSelect = (nodes) => {
89
+ if (!nodes) {
90
90
  emit('select', null)
91
91
  return
92
92
  }
93
93
 
94
+ //单选
94
95
  if (!props.multiple) {
95
- data.selectedNodes = [node]
96
+ data.selectedNodes = nodes
96
97
  emit('select', data.selectedNodes[0])
97
- modelValue.value = node.id
98
+ modelValue.value = data.selectedNodes[0].id
98
99
  }
100
+ //多选
99
101
  else {
100
- let one = data.selectedNodes.find(item => item.id === node.id)
101
- if (!one)
102
- data.selectedNodes = [...data.selectedNodes, node]
102
+ data.selectedNodes = nodes
103
103
  emit('select', data.selectedNodes)
104
104
  modelValue.value = data.selectedNodes.map(item => item.id)
105
+
106
+ // let one = data.selectedNodes.find(item => item.id === node.id)
107
+ // if (!one)
108
+ // data.selectedNodes = [...data.selectedNodes, node]
109
+ // emit('select', data.selectedNodes)
110
+ // modelValue.value = data.selectedNodes.map(item => item.id)
105
111
  }
106
112
  }
107
113
 
@@ -113,29 +119,41 @@ const onDelete = (idx) => {
113
119
  }
114
120
  }
115
121
 
116
- watch(() => JSON.stringify(modelValue.value), async (n, o) => {
117
- //单用户选择时,将用户id记录在selectedNodeId,用户对象存入selectedNodes的第一个元素
122
+ const ids2nodes = async() => {
123
+ if(!data.selectedNodeIds || data.selectedNodeIds.length<1)
124
+ return []
125
+
126
+ let promises = data.selectedNodeIds.map(async(nodeId) => {
127
+ let params = {}
128
+ params.id = nodeId
129
+ params.isReturnParent = true
130
+ params.hasChildren = false
131
+ params.hasPaths = true
132
+
133
+ let selectNode = null
134
+ await props.idQueryNode(params, (node) => {
135
+ data.parentNode = node
136
+ selectNode = util.findNode(nodeId, data.parentNode.children)
137
+ })
138
+ return selectNode
139
+ })
140
+
141
+ let selectNodes = await Promise.all(promises)
142
+
143
+ return selectNodes
144
+ }
145
+
146
+ watch(() => JSON.stringify(modelValue.value), async(n, o) => {
147
+ data.selectedNodeIds = modelValue.value
148
+ data.selectedNodes = await ids2nodes()
149
+
150
+ //单用户选择时,将用户id记录在selectedNodeIds,用户对象存入selectedNodes的第一个元素
118
151
  if (!props.multiple) {
119
- data.selectedNodeId = modelValue.value
120
- }
152
+ data.selectedNodeIds = modelValue.value
153
+ }
121
154
  //多用户选择时,遍历回调接口获取多用户对象列表,记录在selectedNodes
122
155
  else {
123
- data.selectedNodes = []
124
- let ids = modelValue.value || []
125
- ids.forEach(async (id) => {
126
- let params = {}
127
- params.id = id
128
- params.isReturnParent = false
129
- params.hasChildren = false
130
- params.hasPaths= true
131
- await props.idQueryNode(params, (node) => {
132
- //在部门的children中查找id对应的用户
133
- //部门的children中既有子部门又有部门的员工
134
- let selectNode = util.findNode(id, node.children)
135
- //将用户对象放入选中用户列表中
136
- data.selectedNodes = [...data.selectedNodes, selectNode]
137
- })
138
- })
156
+ data.selectedNodeIds = modelValue.value
139
157
  }
140
158
  }, {
141
159
  immediate: true
@@ -31,9 +31,9 @@
31
31
  <template #title>
32
32
  <div class="cell-content">
33
33
  <div class="circle-selector" v-if="item.canCheck" @click.stop="onToggle(item)">
34
- <van-icon v-if="data.selectedNodeId === item.id" name="success" size="20"
34
+ <van-icon v-if="data.selectedNodeIds.includes(item.id)" name="success" size="20"
35
35
  color="#409eff" />
36
- <van-icon v-if="data.selectedNodeId != item.id" name="circle" size="20"
36
+ <van-icon v-if="!data.selectedNodeIds.includes(item.id)" name="circle" size="20"
37
37
  color="#e0e0e0" />
38
38
  </div>
39
39
  <span class="name">{{ item.label }}</span>
@@ -56,8 +56,12 @@ import { useVModel } from '@vueuse/core'
56
56
 
57
57
  const props = defineProps({
58
58
  modelValue: {
59
- type: String,
60
- default: ''
59
+ type: [String, Array, Number],
60
+ default: null,
61
+ },
62
+ multiple: {
63
+ type: Boolean,
64
+ default: false
61
65
  },
62
66
  show: {
63
67
  type: Boolean,
@@ -86,8 +90,8 @@ const data = reactive({
86
90
  parentNode: null,
87
91
  // 搜索关键字
88
92
  keyword: "",
89
- //勾选的子节点id
90
- selectedNodeId: ''
93
+ //记录临时勾选的子节点id
94
+ selectedNodeIds: []
91
95
  })
92
96
 
93
97
  onMounted(() => {
@@ -141,16 +145,50 @@ const onClear = () => {
141
145
  const reset = () => {
142
146
  // 搜索关键字
143
147
  data.keyword = ""
148
+ data.selectedNodeIds = []
149
+ }
150
+
151
+ const ids2nodes = async() => {
152
+ if(!data.selectedNodeIds || data.selectedNodeIds.length<1)
153
+ return []
154
+
155
+ let promises = data.selectedNodeIds.map(async(nodeId) => {
156
+ let params = {}
157
+ params.id = nodeId
158
+ params.isReturnParent = true
159
+ params.hasChildren = false
160
+ params.hasPaths = true
161
+
162
+ let selectNode = null
163
+ await props.idQueryNode(params, (node) => {
164
+ data.parentNode = node
165
+ selectNode = util.findNode(nodeId, data.parentNode.children)
166
+ })
167
+ return selectNode
168
+ })
169
+
170
+ let selectNodes = await Promise.all(promises)
171
+
172
+ return selectNodes
144
173
  }
145
174
 
146
175
  // 确认按钮
147
- const onSubmit = () => {
148
- if (!data.selectedNodeId) {
176
+ const onSubmit = async() => {
177
+ if (!data.selectedNodeIds || data.selectedNodeIds.length < 1) {
149
178
  util.warnToast("请选择")
150
179
  return
151
180
  }
152
181
 
153
- modelValue.value = data.selectedNodeId
182
+ let selectNodes = await ids2nodes()
183
+ emit('select', selectNodes)
184
+
185
+ if (!props.multiple) {
186
+ modelValue.value = data.selectedNodeIds[0]
187
+ }
188
+ else {
189
+ modelValue.value = data.selectedNodeIds
190
+ }
191
+
154
192
  show.value = false
155
193
 
156
194
  reset()
@@ -163,10 +201,10 @@ const onCancel = () => {
163
201
  }
164
202
 
165
203
  const onToggle = (node) => {
166
- if (data.selectedNodeId == node.id)
167
- data.selectedNodeId = ''
204
+ if (data.selectedNodeIds.includes(node.id))
205
+ data.selectedNodeIds = data.selectedNodeIds.filter(item => item != node.id)
168
206
  else
169
- data.selectedNodeId = node.id
207
+ data.selectedNodeIds.push(node.id)
170
208
  }
171
209
 
172
210
  const onNextLevel = (node) => {
@@ -176,74 +214,153 @@ const onNextLevel = (node) => {
176
214
  }
177
215
 
178
216
  const query = async () => {
179
- data.selectedNodeId = modelValue.value
180
- //空id时,查带子节点的虚拟根节点
181
- if (!modelValue.value) {
182
- let params = {}
183
- params.isReturnParent = true
184
- params.hasChildren = true
185
- params.hasPaths = true
186
-
187
- await props.idQueryNode(params, (node) => {
188
- data.parentNode = node
217
+ if (!props.multiple)
218
+ if (modelValue.value)
219
+ data.selectedNodeIds = [modelValue.value]
220
+ else
221
+ data.selectedNodeIds = []
222
+ else
223
+ if (modelValue.value && modelValue.value.length > 0)
224
+ data.selectedNodeIds = modelValue.value
225
+ else
226
+ data.selectedNodeIds = []
227
+
228
+ let params = {}
229
+ if (data.selectedNodeIds.length > 0)
230
+ params.id = data.selectedNodeIds[0]
231
+ params.isReturnParent = true
232
+ params.hasChildren = true
233
+ params.hasPaths = true
234
+
235
+ await props.idQueryNode(params, (node) => {
236
+ data.parentNode = node
237
+ })
189
238
 
190
- if (!modelValue.value)
191
- return
192
239
 
193
- let childNode = util.findNode(modelValue.value, data.parentNode.children)
194
- emit('select', childNode)
195
- })
196
- }
197
- //选中节点时
198
- else {
199
- //未显示底部弹窗时,只查节点本身
200
- if (!props.show) {
201
- let params = {}
202
- params.id = modelValue.value
203
- params.isReturnParent = true
204
- params.hasChildren = false
205
- params.hasPaths = true
206
-
207
- await props.idQueryNode(params, (node) => {
208
- data.parentNode = node
209
- let childNode = util.findNode(modelValue.value, data.parentNode.children)
210
- emit('select', childNode)
211
- })
212
- }
213
- //显示底部弹窗时,查询带子节点的父节点
214
- else{
215
- let params = {}
216
- params.id = modelValue.value
217
- params.isReturnParent = true
218
- params.hasChildren = true
219
- params.hasPaths = true
220
-
221
- await props.idQueryNode(params, (node) => {
222
- data.parentNode = node
223
- if (!modelValue.value)
224
- return
225
- let childNode = util.findNode(modelValue.value, data.parentNode.children)
226
- emit('select', childNode)
227
- })
228
- }
229
- }
240
+ // if (!props.multiple) {
241
+ // //空id时,查带子节点的虚拟根节点
242
+ // if (!data.selectedNodeIds) {
243
+ // let params = {}
244
+ // params.isReturnParent = true
245
+ // params.hasChildren = true
246
+ // params.hasPaths = true
247
+
248
+ // await props.idQueryNode(params, (node) => {
249
+ // data.parentNode = node
250
+
251
+ // // if (!data.selectedNodeIds)
252
+ // // return
253
+
254
+ // // let childNode = util.findNode(modelValue.value, data.parentNode.children)
255
+ // // emit('select', childNode)
256
+ // })
257
+ // }
258
+ // //选中节点时
259
+ // else {
260
+ // //未显示底部弹窗时,只查节点本身
261
+ // if (!props.show) {
262
+ // let params = {}
263
+ // params.id = modelValue.value
264
+ // params.isReturnParent = true
265
+ // params.hasChildren = false
266
+ // params.hasPaths = true
267
+
268
+ // await props.idQueryNode(params, (node) => {
269
+ // data.parentNode = node
270
+ // let childNode = util.findNode(modelValue.value, data.parentNode.children)
271
+ // emit('select', childNode)
272
+ // })
273
+ // }
274
+ // //显示底部弹窗时,查询带子节点的父节点
275
+ // else {
276
+ // let params = {}
277
+ // params.id = modelValue.value
278
+ // params.isReturnParent = true
279
+ // params.hasChildren = true
280
+ // params.hasPaths = true
281
+
282
+ // await props.idQueryNode(params, (node) => {
283
+ // data.parentNode = node
284
+ // if (!modelValue.value)
285
+ // return
286
+ // let childNode = util.findNode(modelValue.value, data.parentNode.children)
287
+ // emit('select', childNode)
288
+ // })
289
+ // }
290
+ // }
291
+ // } else {
292
+ // //空数组时,查带子节点的虚拟根节点
293
+ // if (!data.selectedNodeIds || data.selectedNodeIds.length < 1) {
294
+ // let params = {}
295
+ // params.isReturnParent = true
296
+ // params.hasChildren = true
297
+ // params.hasPaths = true
298
+
299
+ // await props.idQueryNode(params, (node) => {
300
+ // data.parentNode = node
301
+
302
+ // if (!modelValue.value)
303
+ // return
304
+
305
+ // let childNode = util.findNode(modelValue.value, data.parentNode.children)
306
+ // emit('select', childNode)
307
+ // })
308
+ // }
309
+ // //选中节点时
310
+ // else {
311
+ // //未显示底部弹窗时,只查节点本身
312
+ // if (!props.show) {
313
+ // let selectNodes = data.selectedNodeIds.map(async(nodeId) => {
314
+ // let params = {}
315
+ // params.id = nodeId
316
+ // params.isReturnParent = true
317
+ // params.hasChildren = false
318
+ // params.hasPaths = true
319
+
320
+ // let selectNode = await props.idQueryNode(params, (node) => {
321
+ // data.parentNode = node
322
+ // let childNode = util.findNode(nodeId, data.parentNode.children)
323
+ // return childNode
324
+ // })
325
+ // return selectNode
326
+ // })
327
+ // // emit('select', selectNodes)
328
+ // }
329
+ // //显示底部弹窗时,查询第一个选中节点的的父节点
330
+ // else {
331
+ // let params = {}
332
+ // params.id = data.selectedNodeIds[0]
333
+ // params.isReturnParent = true
334
+ // params.hasChildren = true
335
+ // params.hasPaths = true
336
+
337
+ // await props.idQueryNode(params, (node) => {
338
+ // data.parentNode = node
339
+ // if (!data.selectedNodeIds[0])
340
+ // return
341
+ // let childNode = util.findNode(data.selectedNodeIds[0], data.parentNode.children)
342
+ // // emit('select', childNode)
343
+ // })
344
+ // }
345
+ // }
346
+ // }
230
347
  }
231
348
 
232
- watch(() => props.show, () => {
233
- if (!props.show)
234
- return
235
-
236
- query()
237
- }, {
238
- immediate: true
239
- })
240
-
241
349
  //根据id查询详情对象
242
- watch(() => modelValue.value, async (n, o) => {
350
+ watch(() => [modelValue.value, props.show], async (n, o) => {
243
351
  query()
244
352
  }, {
245
353
  immediate: true
246
354
  })
355
+
356
+ // watch(() => props.show, () => {
357
+ // if (!props.show)
358
+ // return
359
+
360
+ // query()
361
+ // }, {
362
+ // immediate: true
363
+ // })
247
364
  </script>
248
365
 
249
366
  <style scoped>
@@ -295,7 +412,7 @@ watch(() => modelValue.value, async (n, o) => {
295
412
  .current-path {
296
413
  flex: 1;
297
414
  font-size: 14px;
298
- margin-left:5px;
415
+ margin-left: 5px;
299
416
  color: #323233;
300
417
  white-space: nowrap;
301
418
  overflow: hidden;
@@ -16,8 +16,6 @@ import ImagePicker from "./image_picker.vue";
16
16
  import ImagesPicker from "./images_picker.vue";
17
17
  import FilePicker from "./FilePicker.vue";
18
18
  import SingleUserSelector from "./SingleUserSelector.vue";
19
- import UsersPicker from "./UsersPicker.vue"
20
- import UserPicker from "./UserPicker.vue"
21
19
  import UserProfile from "./UserProfile.vue"
22
20
  import BillCard from './BillCard.vue'
23
21
  import YearDropdown from "./YearDropdown.vue";
@@ -100,14 +98,6 @@ const components = [
100
98
  name: 'WidgetQwUserSelector',
101
99
  widget: UserSelector
102
100
  },
103
- {
104
- name: 'WidgetQwUsersPicker',
105
- widget: UsersPicker
106
- },
107
- {
108
- name: 'WidgetQwUserPicker',
109
- widget: UserPicker
110
- },
111
101
  {
112
102
  name: 'WidgetQwUserProfile',
113
103
  widget: UserProfile
@@ -100,11 +100,6 @@ const routes: Array<RouteRecordRaw> = [
100
100
  name: "billcard",
101
101
  component: () => import("../views/billcard/index.vue"),
102
102
  },
103
- {
104
- path: "/userspicker",
105
- name: "userspicker",
106
- component: () => import("../views/userspicker/index.vue"),
107
- },
108
103
  {
109
104
  path: "/userpicker",
110
105
  name: "userpicker",
@@ -13,8 +13,8 @@ import { useVModel } from "@vueuse/core"
13
13
 
14
14
  const props = defineProps({
15
15
  modelValue: {
16
- type: String,
17
- default: ''
16
+ type: [String, Array, Number],
17
+ default: null,
18
18
  },
19
19
  multiple: {
20
20
  type: Boolean,
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="page">
3
- <UserPicker label="项目经理" multiple v-model="data.userids" />
3
+ <UserPicker label="项目经理" multiple v-model="data.userids" :auth="data.auth" />
4
4
  </div>
5
5
  </template>
6
6
 
@@ -9,7 +9,7 @@ import { reactive, onMounted } from "vue";
9
9
  import UserPicker from '../cascaderpicker/userpicker.vue'
10
10
 
11
11
  const data = reactive({
12
- auth: 'require',
12
+ auth: 'readonly',
13
13
  userids: ["HouMu"]
14
14
  })
15
15
 
@@ -1,107 +0,0 @@
1
- <template>
2
- <van-field v-if="!isGone" :label="props.label" :required="isRequired" :rules="rules" :disabled="isDisabled"
3
- :placeholder="props.placeholder" :is-link="isReadonly ? false : true" @click="data.isShowPop = !isReadonly"
4
- label-class="label" :modelValue="modelValue">
5
- <template #input>
6
- <van-tag class="user" v-if="modelValue" :closeable="!isDisabled" type="primary" plain
7
- @close.stop="onDelete">
8
- {{ data.user.name }}
9
- </van-tag>
10
- </template>
11
- </van-field>
12
-
13
- <UserPop v-model:show="data.isShowPop" :rootDeptId="props.rootDeptId" :deptRangeId="props.deptRangeId"
14
- @select="onSelectUser" />
15
-
16
- </template>
17
- <script setup>
18
- import { reactive, onMounted, watch } from "vue";
19
- import util from "../util"
20
- import { useVModel } from '@vueuse/core'
21
- import UserPop from './widget/UserPop.vue'
22
-
23
- const props = defineProps({
24
- modelValue: {
25
- type: String,
26
- default: '',
27
- },
28
- label: {
29
- type: String,
30
- default: "选择人员",
31
- },
32
- placeholder: {
33
- type: String,
34
- default: "请选择人员",
35
- },
36
- required: {
37
- type: Boolean,
38
- default: false,
39
- },
40
- readonly: {
41
- type: Boolean,
42
- default: false,
43
- },
44
- rules: {
45
- type: Array,
46
- default: [],
47
- },
48
- // 默认查询所有组织机构
49
- rootDeptId: {
50
- type: String,
51
- default: "1", //组织机构id
52
- },
53
- // 二级部门取值范围字典id
54
- // 取dictionary库.dict的配置id
55
- deptRangeId: {
56
- type: String,
57
- default: ''
58
- },
59
- auth: {
60
- type: String,
61
- default: "",
62
- },
63
- });
64
-
65
- // 弹出层
66
- const data = reactive({
67
- isShowPop: false,
68
- user: {}
69
- })
70
-
71
- // 定义emit
72
- const emit = defineEmits(["update:modelValue", "select"]);
73
- const modelValue = useVModel(props, 'modelValue', emit)
74
- const { isRequired, isReadonly, isGone, isDisabled, rules } = util.props2auth(props);
75
-
76
- //首页加载
77
- onMounted(() => {
78
- })
79
-
80
- const onSelectUser = (userId) => {
81
- modelValue.value = userId
82
- }
83
-
84
- const onDelete=()=>{
85
- data.user={}
86
- modelValue.value = null
87
- }
88
-
89
- watch(() => modelValue.value, async (n, o) => {
90
- if (!n) {
91
- data.user = {}
92
- return
93
- }
94
-
95
- let res = await util.get_wxuser_by_id({ userId: n })
96
- data.user = res.data
97
- emit('select', data.user)
98
- }, {
99
- immediate: true
100
- })
101
- </script>
102
-
103
- <style scoped>
104
- .user{
105
- padding:4px 8px;
106
- }
107
- </style>