widget.qw 1.0.98 → 1.1.1

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.1",
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,8 +16,9 @@
16
16
  </template>
17
17
  </van-field>
18
18
 
19
- <CascaderPop v-model:show="data.isShowPop" v-model="data.selectedNodeId" :placeholder="props.placeholder"
20
- @select="onSelect" :keywordQueryNode="props.keywordQueryNode" :idQueryNode="props.idQueryNode" />
19
+ <CascaderPop :multiple="props.multiple" v-model:show="data.isShowPop" v-model="data.selectedNodeIds"
20
+ :placeholder="props.placeholder" @select="onSelect" :keywordQueryNode="props.keywordQueryNode"
21
+ :idQueryNode="props.idQueryNode" />
21
22
  </template>
22
23
 
23
24
  <script setup>
@@ -73,7 +74,7 @@ const props = defineProps({
73
74
  const data = reactive({
74
75
  isShowPop: false,
75
76
  selectedNodes: [],
76
- selectedNodeId: null
77
+ selectedNodeIds: null
77
78
  })
78
79
 
79
80
  // 定义emit
@@ -85,21 +86,21 @@ const { isRequired, isReadonly, isGone, isDisabled, rules } = util.props2auth(pr
85
86
  onMounted(() => {
86
87
  })
87
88
 
88
- const onSelect = (node) => {
89
- if(!node){
89
+ const onSelect = (nodes) => {
90
+ if (!nodes) {
90
91
  emit('select', null)
91
92
  return
92
93
  }
93
94
 
95
+ //单选
94
96
  if (!props.multiple) {
95
- data.selectedNodes = [node]
97
+ data.selectedNodes = nodes
96
98
  emit('select', data.selectedNodes[0])
97
- modelValue.value = node.id
99
+ modelValue.value = data.selectedNodes[0].id
98
100
  }
101
+ //多选
99
102
  else {
100
- let one = data.selectedNodes.find(item => item.id === node.id)
101
- if (!one)
102
- data.selectedNodes = [...data.selectedNodes, node]
103
+ data.selectedNodes = nodes
103
104
  emit('select', data.selectedNodes)
104
105
  modelValue.value = data.selectedNodes.map(item => item.id)
105
106
  }
@@ -113,30 +114,50 @@ const onDelete = (idx) => {
113
114
  }
114
115
  }
115
116
 
117
+ const ids2nodes = async () => {
118
+ let ids = []
119
+ if(!props.multiple){
120
+ if(modelValue.value)
121
+ ids = [modelValue.value]
122
+ }
123
+ else if(modelValue.value && modelValue.value.length>0)
124
+ ids = modelValue.value
125
+
126
+ if (ids.length < 1)
127
+ return []
128
+
129
+ let promises = ids.map(async (nodeId) => {
130
+ let params = {}
131
+ params.id = nodeId
132
+ params.isReturnParent = true
133
+ params.hasChildren = false
134
+ params.hasPaths = true
135
+
136
+ let selectNode = null
137
+ await props.idQueryNode(params, (node) => {
138
+ data.parentNode = node
139
+ selectNode = util.findNode(nodeId, data.parentNode.children)
140
+ })
141
+ return selectNode
142
+ })
143
+
144
+ let selectNodes = await Promise.all(promises)
145
+
146
+ return selectNodes
147
+ }
148
+
116
149
  watch(() => JSON.stringify(modelValue.value), async (n, o) => {
117
- //单用户选择时,将用户id记录在selectedNodeId,用户对象存入selectedNodes的第一个元素
118
150
  if (!props.multiple) {
119
- data.selectedNodeId = modelValue.value
120
- }
121
- //多用户选择时,遍历回调接口获取多用户对象列表,记录在selectedNodes
151
+ data.selectedNodeIds = modelValue.value
152
+ }
122
153
  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
- })
154
+ if (modelValue.value && modelValue.value.length > 0)
155
+ data.selectedNodeIds = modelValue.value
156
+ else
157
+ data.selectedNodeIds = []
139
158
  }
159
+
160
+ data.selectedNodes = await ids2nodes()
140
161
  }, {
141
162
  immediate: true
142
163
  })
@@ -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,14 @@ const onCancel = () => {
163
201
  }
164
202
 
165
203
  const onToggle = (node) => {
166
- if (data.selectedNodeId == node.id)
167
- data.selectedNodeId = ''
168
- else
169
- data.selectedNodeId = node.id
204
+ if (data.selectedNodeIds.includes(node.id))
205
+ data.selectedNodeIds = data.selectedNodeIds.filter(item => item != node.id)
206
+ else{
207
+ if(props.multiple)
208
+ data.selectedNodeIds.push(node.id)
209
+ else
210
+ data.selectedNodeIds = [node.id]
211
+ }
170
212
  }
171
213
 
172
214
  const onNextLevel = (node) => {
@@ -176,70 +218,33 @@ const onNextLevel = (node) => {
176
218
  }
177
219
 
178
220
  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
221
+ let params = {}
222
+ if (data.selectedNodeIds.length > 0)
223
+ params.id = data.selectedNodeIds[0]
224
+ params.isReturnParent = true
225
+ params.hasChildren = true
226
+ params.hasPaths = true
227
+
228
+ await props.idQueryNode(params, (node) => {
229
+ data.parentNode = node
230
+ })
231
+ }
189
232
 
190
- if (!modelValue.value)
191
- return
233
+ //根据id查询详情对象
234
+ watch(() => [props.show], async (n, o) => {
235
+ if(!props.show)
236
+ return
192
237
 
193
- let childNode = util.findNode(modelValue.value, data.parentNode.children)
194
- emit('select', childNode)
195
- })
238
+ if (!props.multiple) {
239
+ data.selectedNodeIds = [modelValue.value]
196
240
  }
197
- //选中节点时
198
241
  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
- }
242
+ if (modelValue.value && modelValue.value.length > 0)
243
+ data.selectedNodeIds = modelValue.value
244
+ else
245
+ data.selectedNodeIds = []
229
246
  }
230
- }
231
-
232
- watch(() => props.show, () => {
233
- if (!props.show)
234
- return
235
-
236
- query()
237
- }, {
238
- immediate: true
239
- })
240
247
 
241
- //根据id查询详情对象
242
- watch(() => modelValue.value, async (n, o) => {
243
248
  query()
244
249
  }, {
245
250
  immediate: true
@@ -295,7 +300,7 @@ watch(() => modelValue.value, async (n, o) => {
295
300
  .current-path {
296
301
  flex: 1;
297
302
  font-size: 14px;
298
- margin-left:5px;
303
+ margin-left: 5px;
299
304
  color: #323233;
300
305
  white-space: nowrap;
301
306
  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="data.multiple" v-model="data.userids" :auth="data.auth" />
4
4
  </div>
5
5
  </template>
6
6
 
@@ -9,8 +9,9 @@ import { reactive, onMounted } from "vue";
9
9
  import UserPicker from '../cascaderpicker/userpicker.vue'
10
10
 
11
11
  const data = reactive({
12
+ multiple:true,
12
13
  auth: 'require',
13
- userids: ["HouMu"]
14
+ userids: []
14
15
  })
15
16
 
16
17
  onMounted(() => {
@@ -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>
@@ -1,118 +0,0 @@
1
- <template>
2
- <van-field v-if="!isGone"
3
- :label="props.label" :required="isRequired" :rules="rules" :disabled="isDisabled" :modelValue="modelValue"
4
- :placeholder="props.placeholder" :is-link="isReadonly ? false : true" @click="data.isShowPop = !isReadonly"
5
- label-class="label">
6
- <template #input>
7
- <div class="user-list">
8
- <van-tag class="user-item" :closeable="!isDisabled" type="primary" plain v-for="(item, i) in data.users"
9
- :key="item" @close.stop="onDelete(item)">
10
- {{ item.name }}
11
- </van-tag>
12
- </div>
13
- </template>
14
- </van-field>
15
-
16
- <UserPop v-model:show="data.isShowPop"
17
- :rootDeptId="props.rootDeptId"
18
- :deptRangeId="props.deptRangeId"
19
- @select="onSelectUser" />
20
-
21
- </template>
22
- <script setup>
23
- import { reactive, onMounted, watch } from "vue";
24
- import util from "../util"
25
- import { useVModel } from '@vueuse/core'
26
- import UserPop from './widget/UserPop.vue'
27
-
28
- const props = defineProps({
29
- modelValue: {
30
- type: Array,
31
- default: [],
32
- },
33
- label: {
34
- type: String,
35
- default: "选择人员",
36
- },
37
- placeholder: {
38
- type: String,
39
- default: "请选择人员",
40
- },
41
- required: {
42
- type: Boolean,
43
- default: false,
44
- },
45
- readonly: {
46
- type: Boolean,
47
- default: false,
48
- },
49
- rules: {
50
- type: Array,
51
- default: () => [],
52
- },
53
- // 默认查询所有组织机构
54
- rootDeptId: {
55
- type: String,
56
- default: "1", //组织机构id
57
- },
58
- // 二级部门取值范围字典id
59
- // 取dictionary库.dict的配置id
60
- deptRangeId: {
61
- type: String,
62
- default: ''
63
- },
64
- auth: {
65
- type: String,
66
- default: "",
67
- },
68
- });
69
-
70
- // 弹出层
71
- const data = reactive({
72
- isShowPop: false,
73
- users: []
74
- })
75
-
76
- // 定义emit
77
- const emit = defineEmits(["update:modelValue", "select"]);
78
- const modelValue = useVModel(props, 'modelValue', emit)
79
- const { isRequired, isReadonly, isGone, isDisabled, rules } = util.props2auth(props);
80
-
81
- //首页加载
82
- onMounted(() => {
83
- })
84
-
85
- const onSelectUser = (userId) => {
86
- let newAry = [...(modelValue.value || []), userId]
87
- modelValue.value = util.uniq(newAry)
88
- }
89
-
90
- const onDelete=(user)=>{
91
- modelValue.value = (modelValue.value || []).filter(item=>{
92
- return item != user.userid
93
- })
94
- }
95
-
96
- watch(() => modelValue.value, async(n, o) => {
97
- if(!modelValue.value || modelValue.value.length<1){
98
- data.users = []
99
- return
100
- }
101
-
102
- let ary = []
103
- for(var i=0;i<modelValue.value.length;i++){
104
- let res = await util.get_wxuser_by_id({userId:modelValue.value[i]})
105
- ary.push(res.data)
106
- }
107
- data.users = ary
108
- emit('select', data.users)
109
- }, {
110
- immediate: true
111
- })
112
- </script>
113
-
114
- <style scoped>
115
- .user-item{
116
- margin:3px;
117
- }
118
- </style>