import { useMemo, useState } from 'react'; import { Alert, Badge, Button, Checkbox, Field, Input, Select, Textarea } from '../components/ui.jsx'; import { Icon, PageTitle, Panel, ApiNotice, Modal, ConfirmDialog, Drawer, SimpleTable } from '../components/layout.jsx'; import { permissionGroups } from '../fixtures/devFixtures.js'; import { explainApiError } from '../api.js'; export function RolesPage({ roleRows, setRoleRows, userRows, apiLoading, apiError, refreshApi, can = () => true, onDeleteRole }) { const [editingRole, setEditingRole] = useState(undefined); const [roleForm, setRoleForm] = useState(emptyRoleForm); const [permissionRole, setPermissionRole] = useState(null); const [permissionDraft, setPermissionDraft] = useState([]); const [deleteRoleTarget, setDeleteRoleTarget] = useState(null); const [actionError, setActionError] = useState(''); const canManage = can('roles.manage'); const roleUserCounts = useMemo(() => userRows.reduce((counts, user) => ({ ...counts, [user.roleId]: (counts[user.roleId] || 0) + 1 }), {}), [userRows]); const openCreateRole = () => { setEditingRole(null); setRoleForm(emptyRoleForm); }; const openEditRole = (role) => { setEditingRole(role); setRoleForm({ name: role.name, description: role.description, status: role.status }); }; const closeRoleModal = () => { setEditingRole(undefined); setRoleForm(emptyRoleForm); }; const submitRole = (event) => { event.preventDefault(); if (!roleForm.name.trim()) return; if (editingRole) { setRoleRows((rows) => rows.map((role) => role.id === editingRole.id ? { ...role, ...roleForm } : role)); } else { setRoleRows((rows) => [...rows, { id: `R${String(rows.length + 1).padStart(3, '0')}`, ...roleForm, builtIn: false, permissions: [] }]); } closeRoleModal(); }; const toggleRoleStatus = (role) => { if (role.builtIn) return; setRoleRows((rows) => rows.map((item) => item.id === role.id ? { ...item, status: item.status === '启用' ? '禁用' : '启用' } : item)); }; const deleteRole = async (role) => { try { setActionError(''); if (onDeleteRole) { await onDeleteRole(role.id); } else { setRoleRows((rows) => rows.filter((item) => item.id !== role.id)); } setDeleteRoleTarget(null); } catch (error) { setActionError(explainApiError(error)); } }; const openPermissions = (role) => { setPermissionRole(role); setPermissionDraft(role.permissions); }; const togglePermission = (permissionKey) => { setPermissionDraft((permissions) => permissions.includes(permissionKey) ? permissions.filter((key) => key !== permissionKey) : [...permissions, permissionKey]); }; const togglePermissionGroup = (group) => { const groupKeys = group.permissions.map((permission) => permission.key); const allSelected = groupKeys.every((key) => permissionDraft.includes(key)); setPermissionDraft((permissions) => allSelected ? permissions.filter((key) => !groupKeys.includes(key)) : Array.from(new Set([...permissions, ...groupKeys]))); }; const savePermissions = () => { setRoleRows((rows) => rows.map((role) => role.id === permissionRole.id ? { ...role, permissions: permissionDraft } : role)); setPermissionRole(null); }; return ( <> } onClick={openCreateRole}>新增角色 : null} /> {actionError ? {actionError} : null} {roleRows.length} 个角色} className="wide-panel"> ({ ...role, type: role.builtIn ? '系统内置' : '自定义', userCount: role.userCount ?? roleUserCounts[role.id] ?? 0, permissionCount: role.permissions.length }))} columns={[ { key: 'name', label: '角色名称' }, { key: 'type', label: '类型' }, { key: 'description', label: '角色说明' }, { key: 'userCount', label: '用户数' }, { key: 'permissionCount', label: '权限项' }, { key: 'status', label: '状态', status: true }, { key: 'actions', label: '操作', render: (row) => openPermissions(row)}>{canManage && !row.builtIn ? '配置权限' : '查看权限'}{canManage ? openEditRole(row)}>编辑 : null}{canManage ? toggleRoleStatus(row)}>{row.status === '启用' ? '禁用' : '启用'} : null}{canManage ? setDeleteRoleTarget(row)}>删除 : null} }, ]} /> {editingRole !== undefined ? ( 角色名称 *}> setRoleForm({ ...roleForm, name: event.target.value })} placeholder="请输入角色名称" disabled={Boolean(editingRole?.builtIn)} required /> setRoleForm({ ...roleForm, description: event.target.value })} placeholder="说明该角色的职责范围" /> setRoleForm({ ...roleForm, status: event.target.value })} disabled={Boolean(editingRole?.builtIn)}>启用禁用 取消保存角色 ) : null} {permissionRole ? ( {permissionRole.name}已选择 {permissionDraft.length} 项权限>} onClose={() => setPermissionRole(null)}> {permissionRole.builtIn || !canManage ? {permissionRole.builtIn ? '内置角色权限由系统维护,仅支持查看。' : '当前账号没有角色管理权限,仅支持查看。'} : null} {permissionGroups.map((group) => { const groupKeys = group.permissions.map((permission) => permission.key); const selectedCount = groupKeys.filter((key) => permissionDraft.includes(key)).length; return ( {group.name}{selectedCount}/{groupKeys.length} 已选择 togglePermissionGroup(group)} /> {group.permissions.map((permission) => togglePermission(permission.key)} />)} ); })} setPermissionRole(null)}>关闭{permissionRole.builtIn || !canManage ? null : 保存权限} ) : null} {deleteRoleTarget ? ( setDeleteRoleTarget(null)} onConfirm={() => void deleteRole(deleteRoleTarget)} > 确认删除角色「{deleteRoleTarget.name}」吗?如果仍有用户使用该角色,系统会拒绝删除。 ) : null} > ); }
确认删除角色「{deleteRoleTarget.name}」吗?如果仍有用户使用该角色,系统会拒绝删除。