"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import { Edit, Plus, Trash2 } from "lucide-react"; import ConfirmDialog from "@/components/common/ConfirmDialog"; import DataTable, { type DataTableColumn } from "@/components/common/DataTable"; import SearchInput from "@/components/common/SearchInput"; import { useToast } from "@/components/common/ToastProvider"; import { ManufacturerFormDialog } from "@/components/knowledge/KnowledgeForms"; import { Button } from "@/components/ui/button"; import { api } from "@/lib/api"; import type { KnowledgeManufacturer, ManufacturerPayload } from "@/types/knowledge"; function errorMessage(error: unknown) { if (typeof error === "object" && error !== null && "response" in error) { return (error as { response?: { data?: { detail?: string } } }).response?.data?.detail ?? "Aktion fehlgeschlagen"; } return "Aktion fehlgeschlagen"; } export default function KnowledgeManufacturersPage() { const { showToast } = useToast(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [formError, setFormError] = useState(""); const [pending, setPending] = useState(false); const [search, setSearch] = useState(""); const [sortKey, setSortKey] = useState("name"); const [sortDirection, setSortDirection] = useState<"asc" | "desc">("asc"); const [formOpen, setFormOpen] = useState(false); const [selected, setSelected] = useState(null); const [deleteItem, setDeleteItem] = useState(null); const loadItems = useCallback(async () => { setLoading(true); try { const response = await api.get("/knowledge/manufacturers?limit=100"); setItems(response.data); setError(""); } catch (err) { setError(errorMessage(err)); } finally { setLoading(false); } }, []); useEffect(() => { queueMicrotask(() => { void loadItems(); }); }, [loadItems]); const rows = useMemo(() => items .filter((item) => item.name.toLowerCase().includes(search.toLowerCase())) .sort((a, b) => { const av = String(a[sortKey as keyof KnowledgeManufacturer] ?? "").toLowerCase(); const bv = String(b[sortKey as keyof KnowledgeManufacturer] ?? "").toLowerCase(); const result = av > bv ? 1 : av < bv ? -1 : 0; return sortDirection === "asc" ? result : -result; }), [items, search, sortDirection, sortKey]); const columns: DataTableColumn[] = [ { key: "name", label: "Name", sortable: true, render: (item) => {item.name} }, { key: "website", label: "Website", sortable: true, render: (item) => item.website || "-" }, { key: "notes", label: "Notizen", render: (item) => item.notes || "-" }, { key: "actions", label: "Aktionen", className: "px-4 py-3 text-right", render: (item) => (
), }, ]; async function save(payload: ManufacturerPayload) { setPending(true); setFormError(""); try { if (selected) { await api.put(`/knowledge/manufacturers/${selected.id}`, payload); showToast({ type: "success", title: "Hersteller aktualisiert", description: payload.name }); } else { await api.post("/knowledge/manufacturers", payload); showToast({ type: "success", title: "Hersteller erstellt", description: payload.name }); } setFormOpen(false); await loadItems(); } catch (err) { const message = errorMessage(err); setFormError(message); showToast({ type: "error", title: "Hersteller konnte nicht gespeichert werden", description: message }); } finally { setPending(false); } } async function confirmDelete() { if (!deleteItem) return; setPending(true); try { await api.delete(`/knowledge/manufacturers/${deleteItem.id}`); showToast({ type: "success", title: "Hersteller gelöscht", description: deleteItem.name }); setDeleteItem(null); await loadItems(); } catch (err) { showToast({ type: "error", title: "Hersteller konnte nicht gelöscht werden", description: errorMessage(err) }); } finally { setPending(false); } } return (

Hersteller

{rows.length} Einträge

item.id} sortKey={sortKey} sortDirection={sortDirection} loading={loading} error={error} emptyTitle="Keine Hersteller" emptyDescription="Lege den ersten Hersteller an." onSort={(key) => { setSortKey(key); setSortDirection((current) => sortKey === key && current === "asc" ? "desc" : "asc"); }} /> !open && setDeleteItem(null)} onConfirm={confirmDelete}> {deleteItem &&

{deleteItem.name}

}
); }