Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
d03fdecc
authored
Nov 12, 2024
by
GoldenZqqq
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: 人选选择穿梭框组件切换部门不过滤已选中数据逻辑,优化布局样式
parent
e451f483
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
76 additions
and
32 deletions
+76
-32
src/components/UserSelectForm/index.vue
+76
-32
No files found.
src/components/UserSelectForm/index.vue
View file @
d03fdecc
<
template
>
<
template
>
<Dialog
v-model=
"dialogVisible"
title=
"人员选择"
width=
"
9
00"
>
<Dialog
v-model=
"dialogVisible"
title=
"人员选择"
width=
"
8
00"
>
<el-row>
<el-row
class=
"gap2"
v-loading=
"formLoading"
>
<el-col
:span=
"6"
>
<el-col
:span=
"6"
>
<el-tree
<ContentWrap
class=
"h-1/1"
>
ref=
"treeRef"
<el-tree
:data=
"deptList"
ref=
"treeRef"
:expand-on-click-node=
"false"
:data=
"deptList"
:props=
"defaultProps"
:expand-on-click-node=
"false"
default-expand-all
:props=
"defaultProps"
highlight-current
default-expand-all
node-key=
"id"
highlight-current
@
node-click=
"handleNodeClick"
node-key=
"id"
/>
@
node-click=
"handleNodeClick"
/>
</ContentWrap>
</el-col>
</el-col>
<el-col
:span=
"17"
:offset=
"1"
>
<el-col
:span=
"17"
>
<el-transfer
<el-transfer
v-model=
"selectedUserIdList"
v-model=
"selectedUserIdList"
:titles=
"['未选', '已选']"
:titles=
"['未选', '已选']"
filterable
filterable
filter-placeholder=
"搜索成员"
filter-placeholder=
"搜索成员"
:data=
"
u
serList"
:data=
"
transferU
serList"
:props=
"
{ label: 'nickname', key: 'id' }"
:props=
"
{ label: 'nickname', key: 'id' }"
/>
/>
</el-col>
</el-col>
...
@@ -47,62 +49,87 @@ const emit = defineEmits<{
...
@@ -47,62 +49,87 @@ const emit = defineEmits<{
}
>
()
}
>
()
const
{
t
}
=
useI18n
()
// 国际
const
{
t
}
=
useI18n
()
// 国际
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
deptList
=
ref
<
Tree
[]
>
([])
// 部门树形结构化
const
deptList
=
ref
<
Tree
[]
>
([])
// 部门树形结构化
const
userList
:
any
=
ref
([])
// 用户列表
const
allUserList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 所有用户列表
const
filteredUserList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 当前部门过滤后的用户列表
const
selectedUserIdList
:
any
=
ref
([])
// 选中的用户列表
const
selectedUserIdList
:
any
=
ref
([])
// 选中的用户列表
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
activityId
=
ref
()
// 关联的主键编号 TODO @goldenzqqq:这个 activityId 有没可能不传递。在使用 @submitForm="xxx()" 时,传递的参数。目的是,更加解耦一些。
const
activityId
=
ref
()
// 计算属性:合并已选择的用户和当前部门过滤后的用户
const
transferUserList
=
computed
(()
=>
{
// 获取所有已选择的用户
const
selectedUsers
=
allUserList
.
value
.
filter
((
user
:
any
)
=>
selectedUserIdList
.
value
.
includes
(
user
.
id
)
)
// 获取当前部门过滤后的未选择用户
const
filteredUnselectedUsers
=
filteredUserList
.
value
.
filter
(
(
user
:
any
)
=>
!
selectedUserIdList
.
value
.
includes
(
user
.
id
)
)
// 合并并去重
return
[...
selectedUsers
,
...
filteredUnselectedUsers
]
})
/** 打开弹窗 */
/** 打开弹窗 */
const
open
=
async
(
id
:
number
,
selectedList
?:
any
[])
=>
{
const
open
=
async
(
id
:
number
,
selectedList
?:
any
[])
=>
{
activityId
.
value
=
id
activityId
.
value
=
id
// 重置表单
resetForm
()
resetForm
()
// 加载相关数据
deptList
.
value
=
handleTree
(
await
DeptApi
.
getSimpleDeptList
())
deptList
.
value
=
handleTree
(
await
DeptApi
.
getSimpleDeptList
())
await
getUserList
()
// 初始加载所有用户
// 设置选中的用户列表
await
getAllUserList
()
selectedUserIdList
.
value
=
selectedList
?.
map
((
item
:
any
)
=>
item
.
id
)
// 初始状态下,过滤列表等于所有用户列表
filteredUserList
.
value
=
[...
allUserList
.
value
]
// 设置可见
selectedUserIdList
.
value
=
selectedList
?.
map
((
item
:
any
)
=>
item
.
id
)
||
[]
dialogVisible
.
value
=
true
dialogVisible
.
value
=
true
}
}
/** 获取所有用户列表 */
const
getAllUserList
=
async
()
=>
{
try
{
// @ts-ignore
const
data
=
await
UserApi
.
getSimpleUserList
()
allUserList
.
value
=
data
}
finally
{
}
}
/** 获取用户列表 */
/** 获取
部门过滤后的
用户列表 */
const
getUserList
=
async
(
deptId
?:
number
)
=>
{
const
getUserList
=
async
(
deptId
?:
number
)
=>
{
formLoading
.
value
=
true
try
{
try
{
// @ts-ignore
// @ts-ignore
// TODO @芋艿:替换到 simple List
// TODO @芋艿:替换到 simple List
暂不支持 deptId 过滤
const
data
=
await
UserApi
.
getUserPage
({
pageSize
:
100
,
pageNo
:
1
,
deptId
})
const
data
=
await
UserApi
.
getUserPage
({
pageSize
:
100
,
pageNo
:
1
,
deptId
})
userList
.
value
=
data
.
list
// 更新过滤后的用户列表
filteredUserList
.
value
=
data
.
list
}
finally
{
}
finally
{
formLoading
.
value
=
false
}
}
}
}
/** 提交选择 */
/** 提交选择 */
const
submitForm
=
async
()
=>
{
const
submitForm
=
async
()
=>
{
// 提交请求
formLoading
.
value
=
true
try
{
try
{
message
.
success
(
t
(
'common.updateSuccess'
))
message
.
success
(
t
(
'common.updateSuccess'
))
dialogVisible
.
value
=
false
dialogVisible
.
value
=
false
const
emitUserList
=
userList
.
value
.
filter
((
user
:
any
)
=>
// 从所有用户列表中筛选出已选择的用户
const
emitUserList
=
allUserList
.
value
.
filter
((
user
:
any
)
=>
selectedUserIdList
.
value
.
includes
(
user
.
id
)
selectedUserIdList
.
value
.
includes
(
user
.
id
)
)
)
// 发送操作成功的事件
// 发送操作成功的事件
emit
(
'confirm'
,
activityId
.
value
,
emitUserList
)
emit
(
'confirm'
,
activityId
.
value
,
emitUserList
)
}
finally
{
}
finally
{
formLoading
.
value
=
false
}
}
}
}
/** 重置表单 */
/** 重置表单 */
const
resetForm
=
()
=>
{
const
resetForm
=
()
=>
{
deptList
.
value
=
[]
deptList
.
value
=
[]
userList
.
value
=
[]
allUserList
.
value
=
[]
filteredUserList
.
value
=
[]
selectedUserIdList
.
value
=
[]
selectedUserIdList
.
value
=
[]
}
}
...
@@ -113,3 +140,20 @@ const handleNodeClick = (row: { [key: string]: any }) => {
...
@@ -113,3 +140,20 @@ const handleNodeClick = (row: { [key: string]: any }) => {
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
:deep
()
{
.el-transfer
{
display
:
flex
;
}
.el-transfer__buttons
{
display
:
flex
!important
;
flex-direction
:
column-reverse
;
justify-content
:
center
;
gap
:
20px
;
.
el-transfer__button
:
nth-child
(
2
)
{
margin
:
0
;
}
}
}
</
style
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment