import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Checkbox } from '@/components/ui/checkbox'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Shield } from 'lucide-react'; export interface RoleFormData { name: string; code: string; description: string; permission_ids: number[]; } export interface PermissionOption { id: number; name: string; code: string; type?: string; } interface RoleFormDialogProps { open: boolean; onOpenChange: (open: boolean) => void; editingRole: any | null; form: RoleFormData; setForm: React.Dispatch>; saving: boolean; onSubmit: () => void; permissions: PermissionOption[]; } // 权限按模块分组 const MODULE_GROUPS: { key: string; label: string; prefixes: string[] }[] = [ { key: 'dashboard', label: '📊 仪表盘', prefixes: ['dashboard:'] }, { key: 'server', label: '🖥️ 资产管理', prefixes: ['server:'] }, { key: 'cloud', label: '☁️ 云资源', prefixes: ['cloud:'] }, { key: 'k8s', label: '☸️ Kubernetes', prefixes: ['k8s:'] }, { key: 'deploy', label: '🚀 应用发布', prefixes: ['deploy:'] }, { key: 'monitor', label: '📡 监控告警', prefixes: ['monitor:', 'agent:'] }, { key: 'auto', label: '⚙️ 自动化运维', prefixes: ['auto:'] }, { key: 'aiops', label: '🤖 AIOps智能', prefixes: ['aiops:'] }, { key: 'approval', label: '✅ 资源申请', prefixes: ['approval:'] }, { key: 'audit', label: '🔍 安全审计', prefixes: ['audit:'] }, { key: 'system', label: '🔧 系统管理', prefixes: ['system:'] }, ]; function groupPermissions(perms: PermissionOption[]): { key: string; label: string; items: PermissionOption[] }[] { const grouped = MODULE_GROUPS.map(g => ({ key: g.key, label: g.label, items: perms.filter(p => g.prefixes.some(pre => p.code.startsWith(pre))), })).filter(g => g.items.length > 0); // 未分类的权限 const classified = new Set(grouped.flatMap(g => g.items.map(p => p.id))); const uncategorized = perms.filter(p => !classified.has(p.id)); if (uncategorized.length > 0) { grouped.push({ key: 'other', label: '📌 其他', items: uncategorized }); } return grouped; } export function RoleFormDialog({ open, onOpenChange, editingRole, form, setForm, saving, onSubmit, permissions, }: RoleFormDialogProps) { const togglePermission = (id: number, checked: boolean) => { setForm((prev) => { const set = new Set(prev.permission_ids); checked ? set.add(id) : set.delete(id); return { ...prev, permission_ids: Array.from(set) }; }); }; // 全选/取消某个分组 const toggleGroup = (items: PermissionOption[], checked: boolean) => { setForm((prev) => { const set = new Set(prev.permission_ids); items.forEach(p => checked ? set.add(p.id) : set.delete(p.id)); return { ...prev, permission_ids: Array.from(set) }; }); }; const grouped = groupPermissions(permissions); return ( {editingRole ? '编辑角色' : '新建角色'} {editingRole ? '修改角色信息与权限' : '创建新的系统角色并分配权限'}
setForm({ ...form, name: e.target.value })} className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)]" placeholder="如:运维工程师" />
setForm({ ...form, code: e.target.value })} disabled={!!editingRole} className="bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)] disabled:opacity-60" placeholder="如:ops_engineer" />