"use client"; import { FormEvent, useMemo, useState } from "react"; import { Edit3, Plus, Trash2, X } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import type { ApiResult } from "@/modules/core/server/api"; import type { Permission } from "@/modules/core/types"; import type { Elder, ElderInput } from "@/modules/elders/types"; import { CARE_LEVEL_LABELS, ELDER_STATUS_LABELS, GENDER_LABELS } from "@/modules/elders/types"; type EldersClientProps = { initialElders: Elder[]; permissions: Permission[]; }; const emptyInput: ElderInput = { name: "", gender: "male", age: 75, careLevel: "self-care", room: "", bed: "", status: "active", primaryContact: "", phone: "", medicalNotes: "", }; function elderToInput(elder: Elder): ElderInput { return { name: elder.name, gender: elder.gender, age: elder.age, careLevel: elder.careLevel, room: elder.room, bed: elder.bed, status: elder.status, primaryContact: elder.primaryContact, phone: elder.phone, medicalNotes: elder.medicalNotes, }; } export function EldersClient({ initialElders, permissions }: EldersClientProps): React.ReactElement { const [elders, setElders] = useState(initialElders); const [editingId, setEditingId] = useState(null); const [form, setForm] = useState(emptyInput); const [message, setMessage] = useState(""); const [isPending, setIsPending] = useState(false); const canCreate = permissions.includes("elder:create"); const canUpdate = permissions.includes("elder:update"); const canDelete = permissions.includes("elder:delete"); const isEditing = editingId !== null; const canSubmit = isEditing ? canUpdate : canCreate; const metrics = useMemo(() => { const activeCount = elders.filter((elder) => elder.status === "active").length; const pendingCount = elders.filter((elder) => elder.status === "pending").length; const intensiveCount = elders.filter((elder) => elder.careLevel === "intensive").length; return { activeCount, pendingCount, intensiveCount }; }, [elders]); function updateField(key: K, value: ElderInput[K]): void { setForm((current) => ({ ...current, [key]: value })); } function beginCreate(): void { setEditingId(null); setForm(emptyInput); setMessage(""); } function beginEdit(elder: Elder): void { setEditingId(elder.id); setForm(elderToInput(elder)); setMessage(""); } async function refreshElders(): Promise { const response = await fetch("/api/elders"); const result = (await response.json()) as ApiResult<{ elders: Elder[] }>; if (result.success) { setElders(result.elders); } } async function handleSubmit(event: FormEvent): Promise { event.preventDefault(); if (!canSubmit) { setMessage("当前角色无权保存老人档案"); return; } setIsPending(true); setMessage(""); const response = await fetch(isEditing ? `/api/elders/${editingId}` : "/api/elders", { method: isEditing ? "PATCH" : "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(form), }); const result = (await response.json()) as ApiResult<{ elder: Elder }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } await refreshElders(); setEditingId(null); setForm(emptyInput); setMessage(result.reason); } async function handleDelete(elder: Elder): Promise { if (!canDelete) { setMessage("当前角色无权删除老人档案"); return; } setIsPending(true); setMessage(""); const response = await fetch(`/api/elders/${elder.id}`, { method: "DELETE" }); const result = (await response.json()) as ApiResult<{ elder: Elder }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } await refreshElders(); setMessage(result.reason); } return (
全栈 CRUD

老人档案

服务端持久化档案、权限校验和审计记录。

在院老人

{metrics.activeCount}

待入住

{metrics.pendingCount}

重点照护

{metrics.intensiveCount}

{isEditing ? "编辑档案" : "新增档案"} {isEditing ? ( ) : null}