'use client' import React, { useState } from 'react' import { trpc } from '@/lib/trpc' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { Badge } from '@/components/ui/badge' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' import { AdvancedSelect, SelectPopover, SelectTrigger, SelectContent, SelectInput, SelectItemList, SelectedBadges } from '@/components/common/advanced-select' import { Settings, Edit, Trash2, Save, X, Plus, Check } from 'lucide-react' import { toast } from 'sonner' interface RoleData { id: number name: string userCount: number permissions: Array<{ id: number; name: string }> } interface EditingRole { id: number | null name: string permissionIds: number[] } export function RoleManagementDialog() { const [isOpen, setIsOpen] = useState(false) const [editingRole, setEditingRole] = useState(null) const [isAddingNew, setIsAddingNew] = useState(false) const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(null) const utils = trpc.useUtils() // 获取角色列表和权限列表 const { data: roles = [], refetch: refetchRoles } = trpc.users.getRolesWithStats.useQuery(undefined, { enabled: isOpen }) const { data: permissions = [] } = trpc.users.getPermissions.useQuery(undefined, { enabled: isOpen }) // 创建角色 const createRoleMutation = trpc.users.createRole.useMutation({ onSuccess: () => { toast.success('角色创建成功') refetchRoles() utils.users.getRoles.invalidate() setIsAddingNew(false) setEditingRole(null) }, onError: (error) => { toast.error(error.message || '创建角色失败') } }) // 更新角色 const updateRoleMutation = trpc.users.updateRole.useMutation({ onSuccess: () => { toast.success('角色更新成功') refetchRoles() utils.users.getRoles.invalidate() setEditingRole(null) }, onError: (error) => { toast.error(error.message || '更新角色失败') } }) // 删除角色 const deleteRoleMutation = trpc.users.deleteRole.useMutation({ onSuccess: () => { toast.success('角色删除成功') refetchRoles() utils.users.getRoles.invalidate() setDeleteConfirmOpen(null) }, onError: (error) => { toast.error(error.message || '删除角色失败') } }) // 开始编辑角色 const handleEditRole = (role: RoleData) => { setEditingRole({ id: role.id, name: role.name, permissionIds: role.permissions.map(p => p.id) }) setIsAddingNew(false) } // 开始新增角色 const handleAddNewRole = () => { setEditingRole({ id: null, name: '', permissionIds: [] }) setIsAddingNew(true) } // 取消编辑 const handleCancelEdit = () => { setEditingRole(null) setIsAddingNew(false) } // 保存角色 const handleSaveRole = () => { if (!editingRole) return if (!editingRole.name.trim()) { toast.error('角色名称不能为空') return } if (editingRole.id === null) { // 新增角色 createRoleMutation.mutate({ name: editingRole.name.trim(), permissionIds: editingRole.permissionIds }) } else { // 更新角色 updateRoleMutation.mutate({ id: editingRole.id, name: editingRole.name.trim(), permissionIds: editingRole.permissionIds }) } } // 删除角色 const handleDeleteRole = (roleId: number) => { deleteRoleMutation.mutate({ id: roleId }) } // 处理权限选择变化 const handlePermissionChange = (permissionIds: string | undefined | string[]) => { if (!editingRole) return const ids = Array.isArray(permissionIds) ? permissionIds : [] setEditingRole(prev => { if (!prev) return prev return { ...prev, permissionIds: ids.map(Number) } }) } return ( 角色管理 管理系统中的角色和权限分配 ID 角色名称 用户数量 权限 操作 {roles.map((role) => ( {role.id} {editingRole?.id === role.id ? ( setEditingRole(prev => prev ? { ...prev, name: e.target.value } : null) } placeholder="输入角色名称" className="w-full" /> ) : ( role.name )} {role.userCount} {editingRole?.id === role.id ? ( ({ ...p, id: p.id.toString() }))} value={editingRole.permissionIds.map(String)} onChange={handlePermissionChange} multiple={{ enable: true, limit: 1 }} > ) : (
{role.permissions.map((perm) => ( {perm.name} ))}
)}
{editingRole?.id === role.id ? (
) : (
{role.userCount === 0 && ( setDeleteConfirmOpen(open ? role.id : null)} >

确认删除

确定要删除角色 "{role.name}" 吗?

)}
)}
))} {/* 新增角色行 */} {isAddingNew && editingRole ? ( <> setEditingRole(prev => prev ? { ...prev, name: e.target.value } : null) } placeholder="输入角色名称" className="w-full" /> 0 ({ ...p, id: p.id.toString() }))} value={editingRole.permissionIds.map(String)} onChange={handlePermissionChange} multiple={{ enable: true }} >
) : ( <> 点击+新增角色 - - - )}
) }