From 1846b24de836e30c4595b265157bf68c63651ff9 Mon Sep 17 00:00:00 2001 From: s8613 Date: Fri, 13 Jun 2025 16:21:41 +0200 Subject: [PATCH 1/4] added Snackbar and copy logic --- .../src/routes/extractedResult.$pitchBook.tsx | 97 ++++++++++++++++++- 1 file changed, 93 insertions(+), 4 deletions(-) diff --git a/project/frontend/src/routes/extractedResult.$pitchBook.tsx b/project/frontend/src/routes/extractedResult.$pitchBook.tsx index db7c47e..921b669 100644 --- a/project/frontend/src/routes/extractedResult.$pitchBook.tsx +++ b/project/frontend/src/routes/extractedResult.$pitchBook.tsx @@ -1,5 +1,5 @@ import ContentPasteIcon from "@mui/icons-material/ContentPaste"; -import { Box, Button, Paper, Typography } from "@mui/material"; +import { Box, Button, Paper, Typography, Snackbar, Alert } from "@mui/material"; import { useSuspenseQuery } from "@tanstack/react-query"; import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { useState } from "react"; @@ -7,6 +7,17 @@ import KennzahlenTable from "../components/KennzahlenTable"; import PDFViewer from "../components/pdfViewer"; import { kpiQueryOptions } from "../util/query"; +// SETTINGS von KennzahlenTable component (mock) +const SETTINGS = [ + { name: "Rendite", position: 1, active: true, mandatory: true }, + { name: "Ausschüttungsrendite", position: 2, active: true, mandatory: true }, + { name: "Laufzeit", position: 3, active: true, mandatory: true }, + { name: "Länderallokation", position: 4, active: true, mandatory: true }, + { name: "Managmentgebühren", position: 5, active: true, mandatory: true }, + { name: "Risikoprofil", position: 6, active: false, mandatory: true }, + { name: "Irgendwas", position: 7, active: true, mandatory: true }, +]; + export const Route = createFileRoute("/extractedResult/$pitchBook")({ component: ExtractedResultsPage, loader: ({ context: { queryClient }, params: { pitchBook } }) => @@ -18,6 +29,8 @@ function ExtractedResultsPage() { const navigate = useNavigate(); const status: "green" | "yellow" | "red" = "red"; const [currentPage, setCurrentPage] = useState(1); + const [copied, setCopied] = useState(false); + const [snackbarOpen, setSnackbarOpen] = useState(false); const statusColor = { red: "#f43131", @@ -27,6 +40,57 @@ function ExtractedResultsPage() { const { data: kpi } = useSuspenseQuery(kpiQueryOptions(pitchBook)); + const prepareClipboardData = () => { + const activeSettings = SETTINGS + .filter(setting => setting.active) + .sort((a, b) => a.position - b.position); + + const values = activeSettings.map(setting => { + const settingData = kpi[setting.name.toUpperCase()]; + if (!settingData || settingData.length === 0) { + return ""; + } + return settingData[0]?.entity || ""; + }); + return values.join('\t'); + }; + + const handleCopyToClipboard = async () => { + try { + const textToCopy = prepareClipboardData(); + + // Use the modern Clipboard API if available + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(textToCopy); + } else { + // Fallback for older browsers or non-secure contexts + const textArea = document.createElement("textarea"); + textArea.value = textToCopy; + textArea.style.position = "fixed"; + textArea.style.left = "-999999px"; + textArea.style.top = "-999999px"; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + document.execCommand('copy'); + textArea.remove(); + } + + // Show success feedback + setCopied(true); + setSnackbarOpen(true); + setTimeout(() => setCopied(false), 2000); + + } catch (err) { + console.error('Failed to copy text: ', err); + // You could show an error snackbar here if needed + } + }; + + const handleCloseSnackbar = () => { + setSnackbarOpen(false); + }; + return ( @@ -93,9 +157,19 @@ function ExtractedResultsPage() { - From 1b256e9d99e802b48bba2551d31a16dd930d4d06 Mon Sep 17 00:00:00 2001 From: s8613 Date: Sat, 14 Jun 2025 10:42:36 +0200 Subject: [PATCH 3/4] merge conflicts --- .../src/routes/extractedResult.$pitchBook.tsx | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/project/frontend/src/routes/extractedResult.$pitchBook.tsx b/project/frontend/src/routes/extractedResult.$pitchBook.tsx index 8888bd8..cfe8bae 100644 --- a/project/frontend/src/routes/extractedResult.$pitchBook.tsx +++ b/project/frontend/src/routes/extractedResult.$pitchBook.tsx @@ -7,17 +7,6 @@ import KennzahlenTable from "../components/KennzahlenTable"; import PDFViewer from "../components/pdfViewer"; import { kpiQueryOptions, settingsQueryOptions } from "../util/query"; -// SETTINGS von KennzahlenTable component (mock) -const SETTINGS = [ - { name: "Rendite", position: 1, active: true, mandatory: true }, - { name: "Ausschüttungsrendite", position: 2, active: true, mandatory: true }, - { name: "Laufzeit", position: 3, active: true, mandatory: true }, - { name: "Länderallokation", position: 4, active: true, mandatory: true }, - { name: "Managmentgebühren", position: 5, active: true, mandatory: true }, - { name: "Risikoprofil", position: 6, active: false, mandatory: true }, - { name: "Irgendwas", position: 7, active: true, mandatory: true }, -]; - export const Route = createFileRoute("/extractedResult/$pitchBook")({ component: ExtractedResultsPage, loader: ({ context: { queryClient }, params: { pitchBook } }) => @@ -45,7 +34,7 @@ function ExtractedResultsPage() { const { data: settings } = useSuspenseQuery(settingsQueryOptions()); const prepareClipboardData = () => { - const activeSettings = SETTINGS + const activeSettings = settings .filter(setting => setting.active) .sort((a, b) => a.position - b.position); From 3e6750f4177e78de7f45a7c7e88a2de999da7031 Mon Sep 17 00:00:00 2001 From: s8613 Date: Mon, 16 Jun 2025 18:54:06 +0200 Subject: [PATCH 4/4] Fixed merge conflict --- project/frontend/src/routes/extractedResult.$pitchBook.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/project/frontend/src/routes/extractedResult.$pitchBook.tsx b/project/frontend/src/routes/extractedResult.$pitchBook.tsx index 7ad03dc..63b3c96 100644 --- a/project/frontend/src/routes/extractedResult.$pitchBook.tsx +++ b/project/frontend/src/routes/extractedResult.$pitchBook.tsx @@ -64,9 +64,6 @@ function ExtractedResultsPage() { green: "#3fd942", }[status]; - const { data: kpi } = useSuspenseQuery(kpiQueryOptions(pitchBook)); - const { data: settings } = useSuspenseQuery(settingsQueryOptions()); - const prepareClipboardData = () => { const activeSettings = settings .filter(setting => setting.active)