"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 { Organization } from "@/modules/core/types"; export function OrganizationManagementClient(): 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/organizations", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ name: String(formData.get("name") ?? ""), slug: String(formData.get("slug") ?? ""), }), }); const result = (await response.json()) as ApiResult<{ organization: Organization }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } setMessage(result.reason); event.currentTarget.reset(); router.refresh(); } return ( 新增机构 创建后会自动初始化机构内置角色。
{message ? (

{message}

) : null}
); } type OrganizationRowActionsProps = { organization: Organization; }; export function OrganizationRowActions({ organization }: OrganizationRowActionsProps): React.ReactElement { const router = useRouter(); const [isEditOpen, setIsEditOpen] = useState(false); const [message, setMessage] = useState(""); const [isPending, setIsPending] = useState(false); async function updateOrganization(payload: Record): Promise { setMessage(""); setIsPending(true); const response = await fetch(`/api/organizations/${organization.id}`, { method: "PATCH", headers: { "content-type": "application/json" }, body: JSON.stringify(payload), }); const result = (await response.json()) as ApiResult<{ organization: Organization }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } setMessage(result.reason); setIsEditOpen(false); router.refresh(); } async function disableOrganization(): Promise { setMessage(""); setIsPending(true); const response = await fetch(`/api/organizations/${organization.id}`, { method: "DELETE", }); const result = (await response.json()) as ApiResult<{ organization: Organization }>; 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 updateOrganization({ name: String(formData.get("name") ?? ""), slug: String(formData.get("slug") ?? ""), status: String(formData.get("status") ?? ""), }); } return (
{organization.status === "disabled" ? ( ) : ( )} setIsEditOpen(false)} open={isEditOpen} title="编辑机构" >
{message ? (

{message}

) : null}
); }