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/.env.development +1 -1
- package/build/style.css +20 -88
- package/build/widget.qw.es.js +280 -784
- package/build/widget.qw.umd.js +280 -784
- package/package.json +1 -1
- package/src/components/CascaderPicker.vue +53 -32
- package/src/components/CascaderPop.vue +77 -72
- package/src/components/index.js +0 -10
- package/src/router/index.ts +0 -5
- package/src/views/cascaderpicker/userpicker.vue +2 -2
- package/src/views/userpicker/index.vue +3 -2
- package/src/components/UserPicker.vue +0 -107
- package/src/components/UsersPicker.vue +0 -118
- package/src/components/widget/UserPop.vue +0 -346
- package/src/views/userspicker/index.vue +0 -43
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<van-field v-if="!isGone" :label="props.label" :modelValue="modelValue" readonly :required="isRequired"
|
|
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.
|
|
20
|
-
@select="onSelect" :keywordQueryNode="props.keywordQueryNode"
|
|
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
|
-
|
|
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 = (
|
|
89
|
-
if(!
|
|
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 =
|
|
97
|
+
data.selectedNodes = nodes
|
|
96
98
|
emit('select', data.selectedNodes[0])
|
|
97
|
-
modelValue.value =
|
|
99
|
+
modelValue.value = data.selectedNodes[0].id
|
|
98
100
|
}
|
|
101
|
+
//多选
|
|
99
102
|
else {
|
|
100
|
-
|
|
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.
|
|
120
|
-
}
|
|
121
|
-
//多用户选择时,遍历回调接口获取多用户对象列表,记录在selectedNodes
|
|
151
|
+
data.selectedNodeIds = modelValue.value
|
|
152
|
+
}
|
|
122
153
|
else {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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.
|
|
34
|
+
<van-icon v-if="data.selectedNodeIds.includes(item.id)" name="success" size="20"
|
|
35
35
|
color="#409eff" />
|
|
36
|
-
<van-icon v-if="data.
|
|
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
|
-
|
|
90
|
-
|
|
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.
|
|
176
|
+
const onSubmit = async() => {
|
|
177
|
+
if (!data.selectedNodeIds || data.selectedNodeIds.length < 1) {
|
|
149
178
|
util.warnToast("请选择")
|
|
150
179
|
return
|
|
151
180
|
}
|
|
152
181
|
|
|
153
|
-
|
|
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.
|
|
167
|
-
data.
|
|
168
|
-
else
|
|
169
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
191
|
-
|
|
233
|
+
//根据id查询详情对象
|
|
234
|
+
watch(() => [props.show], async (n, o) => {
|
|
235
|
+
if(!props.show)
|
|
236
|
+
return
|
|
192
237
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
})
|
|
238
|
+
if (!props.multiple) {
|
|
239
|
+
data.selectedNodeIds = [modelValue.value]
|
|
196
240
|
}
|
|
197
|
-
//选中节点时
|
|
198
241
|
else {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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;
|
package/src/components/index.js
CHANGED
|
@@ -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
|
package/src/router/index.ts
CHANGED
|
@@ -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",
|
|
@@ -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: [
|
|
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>
|