123
123
</el-radio >
124
124
</el-radio-group >
125
125
</el-form-item >
126
- <el-form-item label =" 谁可以发起" prop =" startUserIds " >
126
+ <el-form-item label =" 谁可以发起" prop =" startUserType " >
127
127
<el-select
128
- v-model =" formData.startUserIds "
129
- multiple
130
- placeholder = " 请选择可发起人,默认(不选择)则所有人都可以发起 "
128
+ v-model =" formData.startUserType "
129
+ placeholder = " 请选择谁可以发起 "
130
+ @change = " handleStartUserTypeChange "
131
131
>
132
- <el-option
133
- v-for =" user in userList"
134
- :key =" user.id"
135
- :label =" user.nickname"
136
- :value =" user.id"
137
- />
132
+ <el-option label =" 全员" :value =" 0" />
133
+ <el-option label =" 指定人员" :value =" 1" />
134
+ <el-option label =" 均不可提交" :value =" 2" />
138
135
</el-select >
139
- </el-form-item >
140
- <el-form-item label =" 流程管理员" prop =" managerUserIds" >
141
- <el-select v-model =" formData.managerUserIds" multiple placeholder =" 请选择流程管理员" >
142
- <el-option
143
- v-for =" user in userList"
136
+ <div v-if =" formData.startUserType === 1" class =" mt-2 flex flex-wrap gap-2" >
137
+ <div
138
+ v-for =" user in selectedStartUsers"
144
139
:key =" user.id"
145
- :label =" user.nickname"
146
- :value =" user.id"
147
- />
140
+ class =" bg-gray-100 h-35px rounded-3xl flex items-center pr-8px dark:color-gray-600 position-relative"
141
+ >
142
+ <el-avatar class =" !m-5px" :size =" 28" v-if =" user.avatar" :src =" user.avatar" />
143
+ <el-avatar class =" !m-5px" :size =" 28" v-else >
144
+ {{ user.nickname.substring(0, 1) }}
145
+ </el-avatar >
146
+ {{ user.nickname }}
147
+ <Icon
148
+ icon =" ep:close"
149
+ class =" ml-2 cursor-pointer hover:text-red-500"
150
+ @click =" handleRemoveStartUser(user)"
151
+ />
152
+ </div >
153
+ <el-button type =" primary" link @click =" openStartUserSelect" >
154
+ <Icon icon =" ep:plus" />选择人员
155
+ </el-button >
156
+ </div >
157
+ </el-form-item >
158
+ <el-form-item label =" 流程管理员" prop =" managerUserType" >
159
+ <el-select
160
+ v-model =" formData.managerUserType"
161
+ placeholder =" 请选择流程管理员"
162
+ @change =" handleManagerUserTypeChange"
163
+ >
164
+ <el-option label =" 全员" :value =" 0" />
165
+ <el-option label =" 指定人员" :value =" 1" />
166
+ <el-option label =" 均不可提交" :value =" 2" />
148
167
</el-select >
168
+ <div v-if =" formData.managerUserType === 1" class =" mt-2 flex flex-wrap gap-2" >
169
+ <div
170
+ v-for =" user in selectedManagerUsers"
171
+ :key =" user.id"
172
+ class =" bg-gray-100 h-35px rounded-3xl flex items-center pr-8px dark:color-gray-600 position-relative"
173
+ >
174
+ <el-avatar class =" !m-5px" :size =" 28" v-if =" user.avatar" :src =" user.avatar" />
175
+ <el-avatar class =" !m-5px" :size =" 28" v-else >
176
+ {{ user.nickname.substring(0, 1) }}
177
+ </el-avatar >
178
+ {{ user.nickname }}
179
+ <Icon
180
+ icon =" ep:close"
181
+ class =" ml-2 cursor-pointer hover:text-red-500"
182
+ @click =" handleRemoveManagerUser(user)"
183
+ />
184
+ </div >
185
+ <el-button type =" primary" link @click =" openManagerUserSelect" >
186
+ <Icon icon =" ep:plus" />选择人员
187
+ </el-button >
188
+ </div >
149
189
</el-form-item >
150
190
</el-form >
151
191
<template #footer >
152
192
<el-button :disabled =" formLoading" type =" primary" @click =" submitForm" >确 定</el-button >
153
193
<el-button @click =" dialogVisible = false" >取 消</el-button >
154
194
</template >
155
195
</Dialog >
196
+ <UserSelectForm ref =" userSelectFormRef" @confirm =" handleUserSelectConfirm" />
156
197
</template >
157
198
<script lang="ts" setup>
158
199
import { propTypes } from ' @/utils/propTypes'
@@ -178,7 +219,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
178
219
const dialogTitle = ref (' ' ) // 弹窗的标题
179
220
const formLoading = ref (false ) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
180
221
const formType = ref (' ' ) // 表单的类型:create - 新增;update - 修改
181
- const formData = ref ({
222
+ const formData: any = ref ({
182
223
id: undefined ,
183
224
name: ' ' ,
184
225
key: ' ' ,
@@ -191,6 +232,8 @@ const formData = ref({
191
232
formCustomCreatePath: ' ' ,
192
233
formCustomViewPath: ' ' ,
193
234
visible: true ,
235
+ startUserType: undefined ,
236
+ managerUserType: undefined ,
194
237
startUserIds: [],
195
238
managerUserIds: []
196
239
})
@@ -211,6 +254,10 @@ const formRef = ref() // 表单 Ref
211
254
const formList = ref ([]) // 流程表单的下拉框的数据
212
255
const categoryList = ref ([]) // 流程分类列表
213
256
const userList = ref <UserVO []>([]) // 用户列表
257
+ const selectedStartUsers = ref <UserVO []>([]) // 已选择的发起人列表
258
+ const selectedManagerUsers = ref <UserVO []>([]) // 已选择的管理员列表
259
+ const userSelectFormRef = ref () // 用户选择弹窗ref
260
+ const currentSelectType = ref <' start' | ' manager' >(' start' ) // 当前选择的是发起人还是管理员
214
261
215
262
/** 打开弹窗 */
216
263
const open = async (type : string , id ? : string ) => {
@@ -226,6 +273,19 @@ const open = async (type: string, id?: string) => {
226
273
} finally {
227
274
formLoading .value = false
228
275
}
276
+ // 加载数据时,根据已有的用户ID列表初始化已选用户
277
+ if (formData .value .startUserIds ?.length ) {
278
+ formData .value .startUserType = 1
279
+ selectedStartUsers .value = userList .value .filter ((user ) =>
280
+ formData .value .startUserIds .includes (user .id )
281
+ )
282
+ }
283
+ if (formData .value .managerUserIds ?.length ) {
284
+ formData .value .managerUserType = 1
285
+ selectedManagerUsers .value = userList .value .filter ((user ) =>
286
+ formData .value .managerUserIds .includes (user .id )
287
+ )
288
+ }
229
289
} else {
230
290
formData .value .managerUserIds .push (userStore .getUser .id )
231
291
}
@@ -293,9 +353,85 @@ const resetForm = () => {
293
353
formCustomCreatePath: ' ' ,
294
354
formCustomViewPath: ' ' ,
295
355
visible: true ,
356
+ startUserType: undefined ,
357
+ managerUserType: undefined ,
296
358
startUserIds: [],
297
359
managerUserIds: []
298
360
}
299
361
formRef .value ?.resetFields ()
362
+ selectedStartUsers .value = []
363
+ selectedManagerUsers .value = []
364
+ }
365
+
366
+ // 处理发起人类型变化
367
+ const handleStartUserTypeChange = (value : number ) => {
368
+ if (value !== 1 ) {
369
+ selectedStartUsers .value = []
370
+ formData .value .startUserIds = []
371
+ }
372
+ }
373
+
374
+ // 处理管理员类型变化
375
+ const handleManagerUserTypeChange = (value : number ) => {
376
+ if (value !== 1 ) {
377
+ selectedManagerUsers .value = []
378
+ formData .value .managerUserIds = []
379
+ }
380
+ }
381
+
382
+ // 打开发起人选择
383
+ const openStartUserSelect = () => {
384
+ currentSelectType .value = ' start'
385
+ userSelectFormRef .value .open (0 , selectedStartUsers .value )
386
+ }
387
+
388
+ // 打开管理员选择
389
+ const openManagerUserSelect = () => {
390
+ currentSelectType .value = ' manager'
391
+ userSelectFormRef .value .open (0 , selectedManagerUsers .value )
392
+ }
393
+
394
+ // 处理用户选择确认
395
+ const handleUserSelectConfirm = (_ , users : UserVO []) => {
396
+ if (currentSelectType .value === ' start' ) {
397
+ selectedStartUsers .value = users
398
+ formData .value .startUserIds = users .map ((u ) => u .id )
399
+ } else {
400
+ selectedManagerUsers .value = users
401
+ formData .value .managerUserIds = users .map ((u ) => u .id )
402
+ }
403
+ }
404
+
405
+ // 移除发起人
406
+ const handleRemoveStartUser = (user : UserVO ) => {
407
+ selectedStartUsers .value = selectedStartUsers .value .filter ((u ) => u .id !== user .id )
408
+ formData .value .startUserIds = formData .value .startUserIds .filter ((id ) => id !== user .id )
409
+ }
410
+
411
+ // 移除管理员
412
+ const handleRemoveManagerUser = (user : UserVO ) => {
413
+ selectedManagerUsers .value = selectedManagerUsers .value .filter ((u ) => u .id !== user .id )
414
+ formData .value .managerUserIds = formData .value .managerUserIds .filter ((id ) => id !== user .id )
300
415
}
301
416
</script >
417
+
418
+ <style lang="scss" scoped>
419
+ .bg-gray-100 {
420
+ background-color : #f5f7fa ;
421
+ transition : all 0.3s ;
422
+
423
+ & :hover {
424
+ background-color : #e6e8eb ;
425
+ }
426
+
427
+ .ep-close {
428
+ font-size : 14px ;
429
+ color : #909399 ;
430
+ transition : color 0.3s ;
431
+
432
+ & :hover {
433
+ color : #f56c6c ;
434
+ }
435
+ }
436
+ }
437
+ </style >
0 commit comments