From 0dd3785fdd038ac0478d872c827662f40435ddf7 Mon Sep 17 00:00:00 2001 From: Abdulraahman Dabbagh <1924466@stud.hs-mannheim.de> Date: Mon, 2 Jun 2025 12:11:53 +0200 Subject: [PATCH] =?UTF-8?q?Implementiere=20PDF-Highlighting=20f=C3=BCr=20K?= =?UTF-8?q?ennzahlen=20(Ticket=20#31)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/HighlightOverlay.tsx | 30 ++++++++++++ .../src/components/KennzahlenTable.tsx | 16 ++++++- .../frontend/src/components/highlightData.ts | 21 +++++++++ project/frontend/src/components/pdfViewer.tsx | 46 +++++++++++++++---- .../frontend/src/routes/extractedResult.tsx | 7 ++- 5 files changed, 106 insertions(+), 14 deletions(-) create mode 100644 project/frontend/src/components/HighlightOverlay.tsx create mode 100644 project/frontend/src/components/highlightData.ts diff --git a/project/frontend/src/components/HighlightOverlay.tsx b/project/frontend/src/components/HighlightOverlay.tsx new file mode 100644 index 0000000..2f30aa5 --- /dev/null +++ b/project/frontend/src/components/HighlightOverlay.tsx @@ -0,0 +1,30 @@ +import { Box } from '@mui/material'; + +type Props = { + x: number; + y: number; + width: number; + height: number; + type: 'all' | 'selected'; +}; + +// Eine farbige Box, die über dem PDF angezeigt wird +export default function HighlightOverlay({ x, y, width, height, type }: Props) { + return ( + + ); +} diff --git a/project/frontend/src/components/KennzahlenTable.tsx b/project/frontend/src/components/KennzahlenTable.tsx index 420ed8f..4d20e22 100644 --- a/project/frontend/src/components/KennzahlenTable.tsx +++ b/project/frontend/src/components/KennzahlenTable.tsx @@ -8,6 +8,7 @@ import { import SearchIcon from '@mui/icons-material/Search'; import EditIcon from '@mui/icons-material/Edit'; import { useState } from 'react'; + import { Dispatch, SetStateAction } from 'react'; // Beispiel-Daten @@ -19,7 +20,12 @@ import { ]; // React-Komponente - export default function KennzahlenTable() { + + type Props = { + setSelectedLabel: Dispatch>; + }; + export default function KennzahlenTable({ setSelectedLabel }: Props) { + // Zustand für bearbeitbare Daten const [rows, setRows] = useState(exampleData); @@ -67,7 +73,13 @@ import { else if (row.status === 'warning') borderColor = '#f6ed48'; return ( - + setSelectedLabel(row.label)} + hover + sx={{ cursor: 'pointer' }} + > + {/* Kennzahl */} {row.label} diff --git a/project/frontend/src/components/highlightData.ts b/project/frontend/src/components/highlightData.ts new file mode 100644 index 0000000..536a633 --- /dev/null +++ b/project/frontend/src/components/highlightData.ts @@ -0,0 +1,21 @@ +// Beispielhafte Highlight-Daten mit Labels +export const highlightData = [ + { + label: 'Risikoprofil', + page: 1, + x: 100, + y: 200, + width: 120, + height: 20, + type: 'all', // gelb + }, + { + label: 'Risikoprofil', + page: 1, + x: 100, + y: 300, + width: 140, + height: 25, + type: 'selected', // orange (nur wenn ausgewählt) + } +]; diff --git a/project/frontend/src/components/pdfViewer.tsx b/project/frontend/src/components/pdfViewer.tsx index 2e8f7d1..bc7ced8 100644 --- a/project/frontend/src/components/pdfViewer.tsx +++ b/project/frontend/src/components/pdfViewer.tsx @@ -6,13 +6,22 @@ import { Box, IconButton } from '@mui/material'; import ArrowCircleLeftIcon from '@mui/icons-material/ArrowCircleLeft'; import ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight'; import testPDF from '/example.pdf'; +import HighlightOverlay from './HighlightOverlay'; +import { highlightData } from './highlightData'; + + + pdfjs.GlobalWorkerOptions.workerSrc = new URL( "pdfjs-dist/build/pdf.worker.min.mjs", import.meta.url, ).toString(); -export default function PDFViewer() { +type Props = { + selectedLabel: string | null; + }; + + export default function PDFViewer({ selectedLabel }: Props) { const [numPages, setNumPages] = useState(null); const [pageNumber, setPageNumber] = useState(1); const [containerWidth, setContainerWidth] = useState(null); @@ -56,17 +65,34 @@ export default function PDFViewer() { alignItems: 'center', }} > - console.error('Es gab ein Fehler beim Laden des PDFs:', error)} - onSourceError={(error) => console.error('Ungültige PDF:', error)}> - {containerWidth && ( - console.error('Fehler beim Laden:', error)} + onSourceError={(error) => console.error('Ungültige PDF:', error)} + > + {containerWidth && ( + + + + {/* Highlights einfügen */} + {highlightData + .filter((h) => h.page === pageNumber) + .map((h, idx) => ( + - )} + + ))} + + )} + (null); const navigate = useNavigate(); const status: 'green' | 'yellow' | 'red' = 'red'; @@ -57,7 +59,8 @@ function ExtractedResultsPage() { overflow: 'auto', // Scrollen falls Tabelle zu lang }} > - + + - +