feat: update role management to use RoleListRequest for improved pagination and owner inclusion

This commit is contained in:
twwu 2026-05-12 17:59:32 +08:00
parent 319e71b408
commit 7e0a3ee8fc
5 changed files with 35 additions and 13 deletions

View File

@ -1,8 +1,8 @@
import type { PaginationParameters } from '@/models/access-control'
import type { RoleListRequest } from '@/models/access-control'
import { useWorkspaceRoleList } from '@/service/access-control/use-workspace-roles'
import { formatRoleGroups } from './helpers'
export const useRoleGroups = (params?: PaginationParameters) => {
export const useRoleGroups = (params: RoleListRequest) => {
const { data: roleList, isLoading } = useWorkspaceRoleList(params)
const roleGroups = formatRoleGroups(roleList)

View File

@ -18,7 +18,11 @@ type ModalState = {
const PermissionsPage = () => {
const [modalState, setModalState] = useState<ModalState>(null)
const { roleGroups } = useRoleGroups()
const { roleGroups } = useRoleGroups({
page: 1,
limit: 20,
include_owner: 1,
})
const { mutateAsync: createWorkspaceRole } = useCreateWorkspaceRole()
const { mutateAsync: updateWorkspaceRole } = useUpdateWorkspaceRole()

View File

@ -53,6 +53,11 @@ const RowMenu = ({
})
}, [deleteRole, role.id])
const hasViewAction = roleCategory === 'global_system_default' && role.role_tag === 'owner'
const hasEditAction = roleCategory === 'global_custom' || (roleCategory === 'global_system_default' && role.role_tag !== 'owner')
const hasDuplicateAction = roleCategory === 'global_custom'
const hasDeleteAction = roleCategory === 'global_custom'
return (
<DropdownMenu open={open} onOpenChange={setOpen}>
<DropdownMenuTrigger render={<ActionButton size="l" className={open ? 'bg-state-base-hover' : ''} aria-label="More actions" />}>
@ -60,21 +65,29 @@ const RowMenu = ({
</DropdownMenuTrigger>
<DropdownMenuContent placement="bottom-end" sideOffset={4} popupClassName="min-w-[160px]">
{
roleCategory === 'global_system_default' && (
hasViewAction && (
<DropdownMenuItem className="system-sm-semibold text-text-secondary" onClick={handleView}>
View
</DropdownMenuItem>
)
}
{
roleCategory === 'global_custom' && (
hasEditAction && (
<DropdownMenuItem className="system-sm-semibold text-text-secondary" onClick={handleEdit}>
Edit
</DropdownMenuItem>
)
}
{
hasDuplicateAction && (
<DropdownMenuItem className="system-sm-semibold text-text-secondary" onClick={handleDuplicate}>
Duplicate
</DropdownMenuItem>
)
}
{
hasDeleteAction && (
<>
<DropdownMenuItem className="system-sm-semibold text-text-secondary" onClick={handleEdit}>
Edit
</DropdownMenuItem>
<DropdownMenuItem className="system-sm-semibold text-text-secondary" onClick={handleDuplicate}>
Duplicate
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive" className="system-sm-semibold" onClick={handleDelete}>
Delete

View File

@ -64,6 +64,7 @@ export type Role = {
description: string
is_builtin: boolean
permission_keys: PermissionKey[]
role_tag: 'owner' | '' // Used for identifying the unique owner role, which has some special handlings
}
export type Pagination = {
@ -79,6 +80,10 @@ export type PaginationParameters = {
reverse?: boolean
}
export type RoleListRequest = PaginationParameters & {
include_owner?: number
}
export type RoleListResponse = {
data: Role[]
pagination: Pagination

View File

@ -1,7 +1,7 @@
import type {
CreateRoleRequest,
PaginationParameters,
Role,
RoleListRequest,
RoleListResponse,
} from '@/models/access-control'
import type { CommonResponse } from '@/models/common'
@ -10,7 +10,7 @@ import { del, get, post, put } from '../base'
const NAME_SPACE = 'rbac-role-management'
export const useWorkspaceRoleList = (params?: PaginationParameters) => {
export const useWorkspaceRoleList = (params: RoleListRequest) => {
return useQuery({
queryKey: [NAME_SPACE, 'workspace-role-list', params],
queryFn: () => get<RoleListResponse>('/workspaces/current/rbac/roles', { params }),