import type { Kennzahl } from "@/types/kpi"; import EditIcon from "@mui/icons-material/Edit"; import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; import SearchIcon from "@mui/icons-material/Search"; import { Box, Link, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Tooltip, } from "@mui/material"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useNavigate } from "@tanstack/react-router"; import { useState } from "react"; import type { KeyboardEvent } from "react"; import { fetchPutKPI } from "../util/api"; interface KennzahlenTableProps { onPageClick?: (page: number, text: string) => void; pdfId: string; settings: Kennzahl[]; data: { [key: string]: { label: string; entity: string; page: number; status: string; source: string; }[]; }; } export default function KennzahlenTable({ onPageClick, data, pdfId, settings, }: KennzahlenTableProps) { const [editingIndex, setEditingIndex] = useState(""); const [editValue, setEditValue] = useState(""); const navigate = useNavigate({ from: "/extractedResult/$pitchBook" }); const queryClient = useQueryClient(); const { mutate } = useMutation({ mutationFn: (id: string) => { const key = id.toUpperCase(); const updatedData = { ...data }; updatedData[key] = data[key]?.map((item) => ({ ...item, entity: editValue, })) || [{ label: key, entity: editValue }]; return fetchPutKPI(Number(pdfId), updatedData); }, onMutate: async (id: string) => { await queryClient.cancelQueries({ queryKey: ["pitchBookKPI", pdfId], }); const snapshot = queryClient.getQueryData(["pitchBookKPI", pdfId]); const key = id.toUpperCase(); queryClient.setQueryData(["pitchBookKPI", pdfId], () => { const updatedData = { ...data }; updatedData[key] = data[key]?.map((item) => ({ ...item, entity: editValue, })) || [{ label: key, entity: editValue }]; return updatedData; }); return () => { queryClient.setQueryData(["pitchBookKPI", pdfId], snapshot); }; }, onError: (error, _variables, rollback) => { console.log("error", error); rollback?.(); }, onSettled: () => { return queryClient.invalidateQueries({ queryKey: ["pitchBookKPI", pdfId], }); }, }); // Bearbeitung starten const startEditing = (value: string, index: string) => { setEditingIndex(index); setEditValue(value); }; // Bearbeitung beenden und Wert speichern const handleSave = async (index: string) => { // await updateKennzahl(rows[index].label, editValue); mutate(index); setEditingIndex(""); }; // Tastatureingaben verarbeiten const handleKeyPress = (e: KeyboardEvent, index: string) => { if (e.key === "Enter") { handleSave(index); } else if (e.key === "Escape") { setEditingIndex("null"); } }; const handleNavigateToDetail = (settingName: string) => { navigate({ to: "/extractedResult/$pitchBook/$kpi", params: { pitchBook: pdfId, kpi: settingName, }, }); }; return ( Kennzahl Wert Seite {settings .filter((setting) => setting.active) .sort((a, b) => a.position - b.position) .map((setting) => ({ setting: setting, extractedValues: data[setting.name.toUpperCase()] || [], })) .map((row) => { let borderColor = "transparent"; const hasMultipleValues = row.extractedValues.length > 1; const hasNoValue = row.setting.mandatory && (row.extractedValues.length === 0 || row.extractedValues.at(0)?.entity === ""); if (hasNoValue) { borderColor = "red"; } else if (hasMultipleValues) { borderColor = "#f6ed48"; } return ( {row.setting.name} { // Only allow inline editing for non-multiple value cells if (!hasMultipleValues) { startEditing( row.extractedValues.at(0)?.entity || "", row.setting.name, ); } else { // Navigate to detail page for multiple values handleNavigateToDetail(row.setting.name); } }} > {hasMultipleValues ? ( Problem
Mehrere Werte für die Kennzahl gefunden. } placement="bottom" arrow > {row.extractedValues.at(0)?.entity || "—"}
) : ( {hasNoValue && ( )} {editingIndex === row.setting.name ? ( setEditValue(e.target.value)} onKeyDown={(e) => handleKeyPress(e, row.setting.name) } onBlur={() => handleSave(row.setting.name)} autoFocus size="small" fullWidth variant="standard" sx={{ margin: "-8px 0" }} /> ) : ( {row.extractedValues.at(0)?.entity || "—"} )} { e.stopPropagation(); startEditing( row.extractedValues.at(0)?.entity || "", row.setting.name, ); }} /> )}
onPageClick?.( Number(row.extractedValues.at(0)?.page), row.extractedValues.at(0)?.entity || "", ) } sx={{ cursor: "pointer" }} > {row.extractedValues.at(0)?.page}
); })}
); }