import { useState, useEffect } from 'react'; import { Table, Button, Space, Form, Input, Tag, Popconfirm, Checkbox, } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, SafetyCertificateOutlined } from '@ant-design/icons'; import { listRoles, createRole, updateRole, deleteRole, assignPermissions, getRolePermissions, listPermissions, type RoleInfo, type PermissionInfo, } from '../api/roles'; import { PageContainer } from '../components/PageContainer'; import { DrawerForm } from '../components/DrawerForm'; import { useCrudDrawer } from '../hooks/useCrudDrawer'; import { useApiRequest } from '../hooks/useApiRequest'; import { useThemeMode } from '../hooks/useThemeMode'; import { useListData } from '../hooks/useListData'; export default function Roles() { const isDark = useThemeMode(); const { execute } = useApiRequest(); const { data: roles, loading, refresh } = useListData(async () => { const result = await listRoles(); return result.data; }); const [permissions, setPermissions] = useState([]); const [permDrawerOpen, setPermDrawerOpen] = useState(false); const [selectedRole, setSelectedRole] = useState(null); const [selectedPermIds, setSelectedPermIds] = useState([]); useEffect(() => { listPermissions().then(setPermissions).catch(() => {}); }, []); const roleDrawer = useCrudDrawer({ getId: (r) => r.id, onCreate: async (values) => { await createRole(values as unknown as { name: string; code: string; description?: string }); }, onUpdate: async (id, values) => { await updateRole(id, values as unknown as { name: string; code: string; description?: string; version: number }); }, onSuccess: refresh, }); const handleDelete = async (id: string) => { await execute(() => deleteRole(id), '角色已删除'); refresh(); }; const openPermDrawer = async (role: RoleInfo) => { setSelectedRole(role); try { const rolePerms = await getRolePermissions(role.id); setSelectedPermIds(rolePerms.map((p) => p.id)); } catch { setSelectedPermIds([]); } setPermDrawerOpen(true); }; const savePermissions = async () => { if (!selectedRole) return; await execute(() => assignPermissions(selectedRole.id, selectedPermIds), '权限分配成功'); setPermDrawerOpen(false); }; const columns = [ { title: '角色名称', dataIndex: 'name', key: 'name', render: (v: string, record: RoleInfo) => (
{v}
), }, { title: '编码', dataIndex: 'code', key: 'code', render: (v: string) => {v}, }, { title: '描述', dataIndex: 'description', key: 'description', ellipsis: true, render: (v?: string) => {v || '-'}, }, { title: '类型', dataIndex: 'is_system', key: 'is_system', width: 100, render: (v: boolean) => ( {v ? '系统' : '自定义'} ), }, { title: '操作', key: 'actions', width: 180, render: (_: unknown, record: RoleInfo) => ( {!record.is_system && ( <> } > `共 ${t} 条记录` }} /> {/* 新建/编辑角色 Drawer */} {/* 权限分配 Drawer */} setPermDrawerOpen(false)} onSubmit={savePermissions} initialValues={{}} loading={false} width={600} columns={1} >
{Object.entries(groupedPermissions).map(([resource, perms]) => (
{resource}
setSelectedPermIds(values as string[])} style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }} > {perms.map((p) => ( {p.name} ))}
))}
); }