import * as React from 'react' import { AppDataTable, type AppDataTableColumn } from '@/components/app/AppDataTable' import { AppEmptyState } from '@/components/app/AppEmptyState' import { AppPageHeader } from '@/components/app/AppPageHeader' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { createRole, listPermissions, listRoles, setRolePermissions } from './api' import type { Permission, RoleDetail } from './types' export function SystemRolesPage() { const [roles, setRoles] = React.useState([]) const [permissions, setPermissions] = React.useState([]) const [roleName, setRoleName] = React.useState('') const [editingRole, setEditingRole] = React.useState(null) const [error, setError] = React.useState('') const load = React.useCallback(async () => { try { const [nextRoles, nextPermissions] = await Promise.all([listRoles(), listPermissions()]) setRoles(nextRoles) setPermissions(nextPermissions) setError('') } catch (reason) { setError(reason instanceof Error ? reason.message : '加载失败') } }, []) React.useEffect(() => { void load() }, [load]) async function handleCreate(event: React.FormEvent) { event.preventDefault() await createRole({ name: roleName, permission_codes: [] }) setRoleName('') await load() } const columns: AppDataTableColumn[] = [ { key: 'name', header: '角色', cell: (role) => {role.name} }, { key: 'permissions', header: '权限数量', cell: (role) => {role.permission_codes.length} }, { key: 'summary', header: '权限摘要', cell: (role) => (
{role.permission_codes.slice(0, 6).map((code) => {code})} {role.permission_codes.length > 6 ? +{role.permission_codes.length - 6} : null}
) }, { key: 'actions', header: '操作', cell: (role) => } ] return (
setRoleName(event.target.value)} required />
{error ? : null} {!error ? ( role.id} emptyTitle="暂无角色" emptyDescription="创建角色后可继续配置权限。" /> ) : null} setEditingRole(null)} onSaved={load} />
) } function RolePermissionDialog({ role, permissions, onClose, onSaved }: { role: RoleDetail | null permissions: Permission[] onClose: () => void onSaved: () => Promise }) { const [selected, setSelected] = React.useState([]) React.useEffect(() => { setSelected(role?.permission_codes ?? []) }, [role]) const groupedPermissions = React.useMemo(() => { return permissions.reduce>((groups, permission) => { groups[permission.module] = groups[permission.module] ?? [] groups[permission.module].push(permission) return groups }, {}) }, [permissions]) async function handleSave() { if (!role) return await setRolePermissions(role.id, selected) await onSaved() onClose() } return ( !open && onClose()}> 配置角色权限 {role?.name} 可访问的菜单和接口能力。
{Object.entries(groupedPermissions).map(([module, modulePermissions]) => (

{module}

{modulePermissions.map((permission) => ( ))}
))}
) }