1
1
<template >
2
- <Dialog v-model =" dialogVisible" title =" 人员选择" width =" 900 " >
3
- <el-row >
2
+ <Dialog v-model =" dialogVisible" title =" 人员选择" width =" 800 " >
3
+ <el-row class = " gap2 " v-loading = " formLoading " >
4
4
<el-col :span =" 6" >
5
- <el-tree
6
- ref =" treeRef"
7
- :data =" deptList"
8
- :expand-on-click-node =" false"
9
- :props =" defaultProps"
10
- default-expand-all
11
- highlight-current
12
- node-key =" id"
13
- @node-click =" handleNodeClick"
14
- />
5
+ <ContentWrap class =" h-1/1" >
6
+ <el-tree
7
+ ref =" treeRef"
8
+ :data =" deptList"
9
+ :expand-on-click-node =" false"
10
+ :props =" defaultProps"
11
+ default-expand-all
12
+ highlight-current
13
+ node-key =" id"
14
+ @node-click =" handleNodeClick"
15
+ />
16
+ </ContentWrap >
15
17
</el-col >
16
- <el-col :span =" 17" :offset = " 1 " >
18
+ <el-col :span =" 17" >
17
19
<el-transfer
18
20
v-model =" selectedUserIdList"
19
21
:titles =" ['未选', '已选']"
20
22
filterable
21
23
filter-placeholder =" 搜索成员"
22
- :data =" userList "
24
+ :data =" transferUserList "
23
25
:props =" { label: 'nickname', key: 'id' }"
24
26
/>
25
27
</el-col >
@@ -47,62 +49,87 @@ const emit = defineEmits<{
47
49
}>()
48
50
const { t } = useI18n () // 国际
49
51
const message = useMessage () // 消息弹窗
50
-
51
52
const deptList = ref <Tree []>([]) // 部门树形结构化
52
- const userList: any = ref ([]) // 用户列表
53
+ const allUserList = ref <UserApi .UserVO []>([]) // 所有用户列表
54
+ const filteredUserList = ref <UserApi .UserVO []>([]) // 当前部门过滤后的用户列表
53
55
const selectedUserIdList: any = ref ([]) // 选中的用户列表
54
56
const dialogVisible = ref (false ) // 弹窗的是否展示
55
57
const formLoading = ref (false ) // 表单的加载中
56
- const activityId = ref () // 关联的主键编号 TODO @goldenzqqq:这个 activityId 有没可能不传递。在使用 @submitForm="xxx()" 时,传递的参数。目的是,更加解耦一些。
58
+ const activityId = ref ()
59
+
60
+ // 计算属性:合并已选择的用户和当前部门过滤后的用户
61
+ const transferUserList = computed (() => {
62
+ // 获取所有已选择的用户
63
+ const selectedUsers = allUserList .value .filter ((user : any ) =>
64
+ selectedUserIdList .value .includes (user .id )
65
+ )
66
+
67
+ // 获取当前部门过滤后的未选择用户
68
+ const filteredUnselectedUsers = filteredUserList .value .filter (
69
+ (user : any ) => ! selectedUserIdList .value .includes (user .id )
70
+ )
71
+
72
+ // 合并并去重
73
+ return [... selectedUsers , ... filteredUnselectedUsers ]
74
+ })
57
75
58
76
/** 打开弹窗 */
59
77
const open = async (id : number , selectedList ? : any []) => {
60
78
activityId .value = id
61
- // 重置表单
62
79
resetForm ()
63
80
64
- // 加载相关数据
65
81
deptList .value = handleTree (await DeptApi .getSimpleDeptList ())
66
- await getUserList ()
67
- // 设置选中的用户列表
68
- selectedUserIdList . value = selectedList ?. map (( item : any ) => item . id )
69
-
70
- // 设置可见
82
+ // 初始加载所有用户
83
+ await getAllUserList ()
84
+ // 初始状态下,过滤列表等于所有用户列表
85
+ filteredUserList . value = [ ... allUserList . value ]
86
+ selectedUserIdList . value = selectedList ?. map (( item : any ) => item . id ) || []
71
87
dialogVisible .value = true
72
88
}
89
+ /** 获取所有用户列表 */
90
+ const getAllUserList = async () => {
91
+ try {
92
+ // @ts-ignore
93
+ const data = await UserApi .getSimpleUserList ()
94
+ allUserList .value = data
95
+ } finally {
96
+ }
97
+ }
73
98
74
- /** 获取用户列表 */
99
+ /** 获取部门过滤后的用户列表 */
75
100
const getUserList = async (deptId ? : number ) => {
101
+ formLoading .value = true
76
102
try {
77
103
// @ts-ignore
78
- // TODO @芋艿:替换到 simple List
104
+ // TODO @芋艿:替换到 simple List 暂不支持 deptId 过滤
79
105
const data = await UserApi .getUserPage ({ pageSize: 100 , pageNo: 1 , deptId })
80
- userList .value = data .list
106
+ // 更新过滤后的用户列表
107
+ filteredUserList .value = data .list
81
108
} finally {
109
+ formLoading .value = false
82
110
}
83
111
}
84
112
85
113
/** 提交选择 */
86
114
const submitForm = async () => {
87
- // 提交请求
88
- formLoading .value = true
89
115
try {
90
116
message .success (t (' common.updateSuccess' ))
91
117
dialogVisible .value = false
92
- const emitUserList = userList .value .filter ((user : any ) =>
118
+ // 从所有用户列表中筛选出已选择的用户
119
+ const emitUserList = allUserList .value .filter ((user : any ) =>
93
120
selectedUserIdList .value .includes (user .id )
94
121
)
95
122
// 发送操作成功的事件
96
123
emit (' confirm' , activityId .value , emitUserList )
97
124
} finally {
98
- formLoading .value = false
99
125
}
100
126
}
101
127
102
128
/** 重置表单 */
103
129
const resetForm = () => {
104
130
deptList .value = []
105
- userList .value = []
131
+ allUserList .value = []
132
+ filteredUserList .value = []
106
133
selectedUserIdList .value = []
107
134
}
108
135
@@ -113,3 +140,20 @@ const handleNodeClick = (row: { [key: string]: any }) => {
113
140
114
141
defineExpose ({ open }) // 提供 open 方法,用于打开弹窗
115
142
</script >
143
+
144
+ <style lang="scss" scoped>
145
+ :deep() {
146
+ .el-transfer {
147
+ display : flex ;
148
+ }
149
+ .el-transfer__buttons {
150
+ display : flex !important ;
151
+ flex-direction : column-reverse ;
152
+ justify-content : center ;
153
+ gap : 20px ;
154
+ .el-transfer__button :nth-child (2 ) {
155
+ margin : 0 ;
156
+ }
157
+ }
158
+ }
159
+ </style >
0 commit comments