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) =>
{canManage ? : null}{canManage ? : null}{canManage ? : null}
}, ]} />
{editingRole !== undefined ? (
角色名称 *}> setRoleForm({ ...roleForm, name: event.target.value })} placeholder="请输入角色名称" disabled={Boolean(editingRole?.builtIn)} required />