import { Button, Card, TextInput } from "@cv/ui"; import { keepPreviousData, useQueryClient } from "@tanstack/react-query"; import { useState } from "react"; import { useAdminCreateLookupEntityMutation, useAdminDeleteLookupEntityMutation, useAdminLookupEntitiesQuery, useAdminUpdateLookupEntityMutation, } from "@/generated/graphql"; interface AdminLookupTableProps { entityType: string; title: string; } type LookupEntity = { id: string; name: string; description: string | null; createdAt: string; updatedAt: string; }; const formatDate = (iso: string) => new Date(iso).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric", }); export const AdminLookupTable = ({ entityType, title, }: AdminLookupTableProps) => { const queryClient = useQueryClient(); const [searchTerm, setSearchTerm] = useState(""); const [newName, setNewName] = useState(""); const [newDescription, setNewDescription] = useState(""); const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(""); const [editDescription, setEditDescription] = useState(""); const [deleteConfirmId, setDeleteConfirmId] = useState(null); const queryKey = ["AdminLookupEntities", { entityType, searchTerm }]; const { data, isLoading } = useAdminLookupEntitiesQuery( { entityType: entityType as never, searchTerm: searchTerm || undefined, }, { placeholderData: keepPreviousData }, ); const invalidate = () => queryClient.invalidateQueries({ queryKey: ["AdminLookupEntities"] }); const createMutation = useAdminCreateLookupEntityMutation({ onSuccess: () => { invalidate(); setNewName(""); setNewDescription(""); }, }); const updateMutation = useAdminUpdateLookupEntityMutation({ onSuccess: () => { invalidate(); setEditingId(null); }, }); const deleteMutation = useAdminDeleteLookupEntityMutation({ onSuccess: () => { invalidate(); setDeleteConfirmId(null); }, }); const handleCreate = (e: React.FormEvent) => { e.preventDefault(); if (!newName.trim()) return; createMutation.mutate({ entityType: entityType as never, name: newName.trim(), description: newDescription.trim() || undefined, }); }; const handleUpdate = (id: string) => { updateMutation.mutate({ entityType: entityType as never, id, name: editName.trim() || undefined, description: editDescription, }); }; const handleDelete = (id: string) => { deleteMutation.mutate({ entityType: entityType as never, id }); }; const startEditing = (entity: LookupEntity) => { setEditingId(entity.id); setEditName(entity.name); setEditDescription(entity.description ?? ""); }; const entities = (data?.adminLookupEntities ?? []) as LookupEntity[]; return (

{title}

{entities.length} {entities.length === 1 ? "item" : "items"}
{isLoading ? (

Loading...

) : entities.length === 0 ? (

No entities found

) : (
{entities.map((entity) => ( {editingId === entity.id ? ( <> ) : ( <> )} ))}
Name Description Created Actions
{formatDate(entity.createdAt)}
{entity.name} {entity.description ?? "-"} {formatDate(entity.createdAt)} {deleteConfirmId === entity.id ? (
) : (
)}
)}
); };