"use client"; import { FormEvent, useState } from "react"; import { Pencil, Plus, Power } from "lucide-react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import type { ApiResult } from "@/modules/core/server/api"; import type { Permission, RoleDefinition } from "@/modules/core/types"; type PermissionDefinition = { id: Permission; label: string; category: string; description: string; }; type RoleManagementClientProps = { permissions: PermissionDefinition[]; }; export function RoleManagementClient({ permissions }: RoleManagementClientProps): React.ReactElement { const router = useRouter(); const [message, setMessage] = useState(""); const [isPending, setIsPending] = useState(false); async function handleSubmit(event: FormEvent): Promise { event.preventDefault(); setMessage(""); setIsPending(true); const formData = new FormData(event.currentTarget); const response = await fetch("/api/settings/roles", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ label: String(formData.get("label") ?? ""), key: String(formData.get("key") ?? ""), description: String(formData.get("description") ?? ""), permissions: formData.getAll("permissions").map(String), }), }); const result = (await response.json()) as ApiResult<{ role: RoleDefinition }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } setMessage(result.reason); event.currentTarget.reset(); router.refresh(); } return ( 新增角色 角色由系统注册权限点组合而成。
{permissions.map((permission) => ( ))}
{message ? (

{message}

) : null}
); } type RoleRowActionsProps = { permissions: PermissionDefinition[]; role: RoleDefinition; }; export function RoleRowActions({ permissions, role }: RoleRowActionsProps): React.ReactElement { const router = useRouter(); const [isEditOpen, setIsEditOpen] = useState(false); const [message, setMessage] = useState(""); const [isPending, setIsPending] = useState(false); async function updateRole(payload: Record): Promise { setMessage(""); setIsPending(true); const response = await fetch(`/api/settings/roles/${role.id}`, { method: "PATCH", headers: { "content-type": "application/json" }, body: JSON.stringify(payload), }); const result = (await response.json()) as ApiResult<{ role: RoleDefinition }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } setMessage(result.reason); setIsEditOpen(false); router.refresh(); } async function disableRole(): Promise { setMessage(""); setIsPending(true); const response = await fetch(`/api/settings/roles/${role.id}`, { method: "DELETE", }); const result = (await response.json()) as ApiResult<{ role: RoleDefinition }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } router.refresh(); } async function handleSubmit(event: FormEvent): Promise { event.preventDefault(); const formData = new FormData(event.currentTarget); await updateRole({ label: String(formData.get("label") ?? ""), key: String(formData.get("key") ?? ""), description: String(formData.get("description") ?? ""), isEnabled: String(formData.get("isEnabled") ?? "") === "true", permissions: formData.getAll("permissions").map(String), }); } if (role.isSystem) { return 内置只读; } return (
{role.isEnabled ? ( ) : ( )} setIsEditOpen(false)} open={isEditOpen} title="编辑角色" >
{permissions.map((permission) => ( ))}
{message ? (

{message}

) : null}
); }