Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ui/src/components/COMPONENT_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1031,7 +1031,7 @@ Skills 场景传入 `[TOOL_TYPE.SKILL]`,并通过 `title` 指定标题。两
### UserGroupMembersDrawer

手动导入 `business/resource-authorization-drawer/user-group/UserGroupMembersDrawer.vue`,通过 `open(userGroup)` 传入
`SystemUserGroup`,按其 `workspace_id` 查询成员。支持用户名、姓名搜索和分页,角色使用
`SystemUserGroup`,按其 `workspace_id` 查询成员。支持姓名、用户名搜索,用户来源表头筛选和分页,角色使用
`MkTagGroup` 展示;供系统资源授权页面和资源授权抽屉共同复用。

### RelatedResourcesDrawer
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<script setup lang="ts">
import { ref } from 'vue'
import { computed, ref } from 'vue'
import UserGroupsApi from '@/api/admin/system/user-groups'
import type { Dict, OptionItem, SystemUserGroup, SystemUserGroupMember } from '@/api/types'
import { LOGIN_METHOD } from '@/api/enums'
import { LOGIN_METHOD_LABELS } from '@/constants'
import type { Dict, LoginMethod, OptionItem, SystemUserGroup, SystemUserGroupMember } from '@/api/types'

defineOptions({ name: 'UserGroupMembersDrawer' })

Expand All @@ -13,20 +15,31 @@ const userGroupMembers = ref<SystemUserGroupMember[]>([])
const paginationConfig = ref({ currentPage: 1, pageSize: 10, total: 0 })
const memberSearchQuery = ref<Dict<unknown>>()
const memberSearchFields: OptionItem<string>[] = [
{ label: '用户名', value: 'username' },
{ label: '姓名', value: 'nick_name' },
{ label: '用户名', value: 'username' },
]

/* 表头筛选 */
const selectedMemberSource = ref<string | null>(null)
const memberSourceOptions: OptionItem<string>[] = Object.entries(LOGIN_METHOD_LABELS).map(([value, label]) => ({
label: value === LOGIN_METHOD.LOCAL ? '系统用户' : label,
value,
}))
const memberListQuery = computed<Dict<unknown>>(() => ({
...memberSearchQuery.value,
...(selectedMemberSource.value !== null ? { source: selectedMemberSource.value } : {}),
}))

function loadUserGroupMembers() {
const group = currentGroup.value
if (!group) return

loadingMembers.value = true
return UserGroupsApi.getSystemUserGroupMembers(group.workspace_id, group.id, paginationConfig.value, memberSearchQuery.value)
return UserGroupsApi.getSystemUserGroupMembers(group.workspace_id, group.id, paginationConfig.value, memberListQuery.value)
.then(({ records, total }) => {
userGroupMembers.value = records
paginationConfig.value.total = total
if (!memberSearchQuery.value) group.count = total
if (!memberSearchQuery.value && selectedMemberSource.value === null) group.count = total
})
.finally(() => {
loadingMembers.value = false
Expand All @@ -39,6 +52,11 @@ function handleMemberSearch(query?: Dict<unknown>) {
loadUserGroupMembers()
}

function handleMemberFilterChange() {
paginationConfig.value.currentPage = 1
loadUserGroupMembers()
}

function open(userGroup: SystemUserGroup) {
resetData()
currentGroup.value = { ...userGroup }
Expand All @@ -53,6 +71,7 @@ function resetData() {
userGroupMembers.value = []
paginationConfig.value = { currentPage: 1, pageSize: 10, total: 0 }
memberSearchQuery.value = undefined
selectedMemberSource.value = null
}

defineExpose({ open })
Expand Down Expand Up @@ -82,6 +101,20 @@ defineExpose({ open })
>
<el-table-column prop="nick_name" label="姓名" show-overflow-tooltip />
<el-table-column prop="username" label="用户名" show-overflow-tooltip />
<el-table-column prop="source" label="用户来源">
<template #header>
<MkTableFilter
mode="single"
v-model="selectedMemberSource"
label="用户来源"
:options="memberSourceOptions"
@change="handleMemberFilterChange"
/>
</template>
<template #default="{ row }">
{{ row.source === LOGIN_METHOD.LOCAL ? '系统用户' : LOGIN_METHOD_LABELS[row.source as LoginMethod] }}
</template>
</el-table-column>
<el-table-column label="角色">
<template #default="{ row }">
<MkTagGroup v-if="row.roles?.length" :tags="row.roles" />
Expand Down
2 changes: 1 addition & 1 deletion ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ src/views/system/identity/users/
`index.vue` 只组合入口组件。

资源授权页面的 `UserGroupAuthorizationList` 通过人数链接打开共享业务组件
`components/business/resource-authorization-drawer/user-group/UserGroupMembersDrawer.vue`,按用户组所属工作空间查询成员,提供用户名、姓名搜索和分页,
`components/business/resource-authorization-drawer/user-group/UserGroupMembersDrawer.vue`,按用户组所属工作空间查询成员,提供姓名、用户名搜索、用户来源表头筛选和分页,
并使用 `MkTagGroup` 折叠展示角色;点击人数不切换当前授权对象。

## 文件命名
Expand Down
18 changes: 9 additions & 9 deletions ui/src/views/system/identity/groups/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -116,26 +116,26 @@ const loadingMembers = ref(false)
const paginationConfig = ref({ currentPage: 1, pageSize: 10, total: 0 })
const memberSearchQuery = ref<Dict<unknown>>()
const memberSearchFields: OptionItem<string>[] = [
{ label: '用户名', value: 'username' },
{ label: '姓名', value: 'nick_name' },
{ label: '用户名', value: 'username' },
]
const userGroupMembers = ref<SystemUserGroupMember[]>([])
function handleMemberSearch(query?: Dict<unknown>) {
memberSearchQuery.value = query
paginationConfig.value.currentPage = 1
loadUserGroupMembers()
}

/* 表头用户来源筛选 */
/* 表头筛选 */
const selectedMemberSource = ref<string | null>(null)
const memberSourceOptions: OptionItem<string>[] = Object.entries(LOGIN_METHOD_LABELS).map(([value, label]) => ({
label: value === LOGIN_METHOD.LOCAL ? '本地创建' : label,
label: value === LOGIN_METHOD.LOCAL ? '系统用户' : label,
value,
}))
const memberListQuery = computed<Dict<unknown>>(() => ({
...memberSearchQuery.value,
...(selectedMemberSource.value !== null ? { source: selectedMemberSource.value } : {}),
}))
const userGroupMembers = ref<SystemUserGroupMember[]>([])
function handleMemberSearch(query?: Dict<unknown>) {
memberSearchQuery.value = query
paginationConfig.value.currentPage = 1
loadUserGroupMembers()
}

function handleMemberFilterChange() {
loadUserGroupMembers(true)
Expand Down
Loading