"use client" import type React from "react" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Checkbox } from "@/components/ui/checkbox" import { Loader2, Shield } from "lucide-react" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import * as z from "zod" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" // 定义角色类型 export type Role = { id: string name: string description: string userCount: number createdAt: string status: "系统角色" | "自定义角色" permissions: Record } // 定义权限组 const permissionGroups = [ { name: "仪表盘", permissions: [ { id: "dashboard.view", label: "仪表盘查看" }, { id: "dashboard.edit", label: "仪表盘编辑" }, ], }, { name: "用户管理", permissions: [ { id: "users.view", label: "查看用户" }, { id: "users.create", label: "创建用户" }, { id: "users.edit", label: "编辑用户" }, { id: "users.delete", label: "删除用户" }, ], }, { name: "角色权限", permissions: [ { id: "roles.view", label: "查看角色" }, { id: "roles.create", label: "创建角色" }, { id: "roles.edit", label: "编辑角色" }, { id: "roles.delete", label: "删除角色" }, ], }, { name: "AI模型", permissions: [ { id: "ai.view", label: "查看AI模型" }, { id: "ai.create", label: "创建AI模型" }, { id: "ai.edit", label: "编辑AI模型" }, { id: "ai.delete", label: "删除AI模型" }, ], }, { name: "内容管理", permissions: [ { id: "outfits.view", label: "查看服装" }, { id: "outfits.create", label: "创建服装" }, { id: "outfits.edit", label: "编辑服装" }, { id: "outfits.delete", label: "删除服装" }, { id: "props.view", label: "查看道具" }, { id: "props.create", label: "创建道具" }, { id: "props.edit", label: "编辑道具" }, { id: "props.delete", label: "删除道具" }, { id: "homeDecor.view", label: "查看家居装饰" }, { id: "homeDecor.create", label: "创建家居装饰" }, { id: "homeDecor.edit", label: "编辑家居装饰" }, { id: "homeDecor.delete", label: "删除家居装饰" }, { id: "food.view", label: "查看食物" }, { id: "food.create", label: "创建食物" }, { id: "food.edit", label: "编辑食物" }, { id: "food.delete", label: "删除食物" }, { id: "songs.view", label: "查看歌曲" }, { id: "songs.create", label: "创建歌曲" }, { id: "songs.edit", label: "编辑歌曲" }, { id: "songs.delete", label: "删除歌曲" }, ], }, { name: "系统设置", permissions: [ { id: "settings.view", label: "查看设置" }, { id: "settings.edit", label: "编辑设置" }, ], }, { name: "好感度系统", permissions: [ { id: "affinity.view", label: "查看好感度系统" }, { id: "affinity.create", label: "创建好感度规则" }, { id: "affinity.edit", label: "编辑好感度规则" }, { id: "affinity.delete", label: "删除好感度规则" }, ], }, ] // 表单验证模式 const formSchema = z.object({ name: z .string() .min(2, { message: "角色名称至少需要2个字符", }) .max(30, { message: "角色名称不能超过30个字符", }), description: z .string() .min(5, { message: "描述至少需要5个字符", }) .max(200, { message: "描述不能超过200个字符", }), status: z.enum(["系统角色", "自定义角色"]), permissions: z.record(z.boolean()).refine( (data) => { // 至少选择一个权限 return Object.values(data).some((value) => value === true) }, { message: "至少需要选择一个权限", }, ), }) type RoleDialogProps = { open?: boolean onOpenChange?: (open: boolean) => void onSubmit: (data: z.infer) => Promise defaultValues?: Partial> mode: "add" | "edit" trigger?: React.ReactNode } export function RoleDialog({ open, onOpenChange, onSubmit, defaultValues, mode, trigger }: RoleDialogProps) { const [isSubmitting, setIsSubmitting] = useState(false) const [dialogOpen, setDialogOpen] = useState(open || false) // 初始化所有权限为false const initialPermissions: Record = {} permissionGroups.forEach((group) => { group.permissions.forEach((permission) => { initialPermissions[permission.id] = false }) }) const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: "", description: "", status: "自定义角色", permissions: initialPermissions, ...defaultValues, }, }) // 当defaultValues改变时重置表单 useEffect(() => { if (defaultValues) { form.reset({ name: defaultValues.name || "", description: defaultValues.description || "", status: defaultValues.status || "自定义角色", permissions: { ...initialPermissions, ...defaultValues.permissions, }, }) } }, [defaultValues, form]) // 同步内部状态和外部状态 useEffect(() => { if (open !== undefined) { setDialogOpen(open) } }, [open]) const handleOpenChange = (newOpen: boolean) => { setDialogOpen(newOpen) if (onOpenChange) { onOpenChange(newOpen) } // 如果对话框关闭,重置表单 if (!newOpen) { form.reset() } } const handleSubmit = async (data: z.infer) => { setIsSubmitting(true) try { await onSubmit(data) handleOpenChange(false) } catch (error) { console.error("提交失败:", error) } finally { setIsSubmitting(false) } } // 全选/取消全选某个组的所有权限 const toggleGroupPermissions = (groupName: string, value: boolean) => { const group = permissionGroups.find((g) => g.name === groupName) if (!group) return const updatedPermissions = { ...form.getValues().permissions } group.permissions.forEach((permission) => { updatedPermissions[permission.id] = value }) form.setValue("permissions", updatedPermissions, { shouldValidate: true }) } // 检查一个组是否所有权限都被选中 const isGroupAllChecked = (groupName: string) => { const group = permissionGroups.find((g) => g.name === groupName) if (!group) return false const permissions = form.getValues().permissions return group.permissions.every((permission) => permissions[permission.id]) } // 检查一个组是否有部分权限被选中 const isGroupPartiallyChecked = (groupName: string) => { const group = permissionGroups.find((g) => g.name === groupName) if (!group) return false const permissions = form.getValues().permissions const checkedCount = group.permissions.filter((permission) => permissions[permission.id]).length return checkedCount > 0 && checkedCount < group.permissions.length } return ( {trigger || ( )} {mode === "add" ? "添加角色" : "编辑角色"} {mode === "add" ? "创建新的系统角色并分配权限" : "修改角色信息和权限设置"}
基本信息 权限设置 ( 角色名称 角色名称将显示在系统中,请使用简洁明了的名称 )} /> ( 角色描述