From f230bd19a15c80421b5c965973304e8cbec7a5f5 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 14 Jun 2025 16:14:56 +0000 Subject: [PATCH] Add clean button and functionality Implement a "clean" button to delete signatures not in the pasted list. --- src/pages/SystemView.tsx | 51 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/src/pages/SystemView.tsx b/src/pages/SystemView.tsx index 4c6581c..727f555 100644 --- a/src/pages/SystemView.tsx +++ b/src/pages/SystemView.tsx @@ -1,10 +1,12 @@ import { useParams, useNavigate } from "react-router-dom"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { toast } from "@/hooks/use-toast"; import { useQueryClient } from "@tanstack/react-query"; import SystemTracker from "@/components/SystemTracker"; import RegionMap from "@/components/RegionMap"; +import { Switch } from "@/components/ui/switch"; +import { Label } from "@/components/ui/label"; import pb from "@/lib/pocketbase"; interface Signature { @@ -21,6 +23,7 @@ const SystemView = () => { const { system, region } = useParams(); const navigate = useNavigate(); const queryClient = useQueryClient(); + const [cleanMode, setCleanMode] = useState(false); if (!system) { navigate("/"); @@ -90,6 +93,15 @@ const SystemView = () => { } }; + const deleteSignature = async (signatureId: string): Promise => { + try { + await pb.collection('signature').delete(signatureId); + } catch (error) { + console.error('Failed to delete signature:', error); + throw error; + } + }; + const handlePaste = async (e: ClipboardEvent) => { const pastedText = e.clipboardData?.getData('text'); if (!pastedText?.trim()) return; @@ -120,6 +132,24 @@ const SystemView = () => { return; } + // If clean mode is enabled, delete signatures not in the pasted list + if (cleanMode) { + const existingSignatures = await pb.collection('signature').getFullList({ + filter: `system='${systemId}'` + }); + + const pastedIdentifiers = new Set(parsedSignatures.map(sig => sig.identifier)); + const signaturesToDelete = existingSignatures.filter(sig => !pastedIdentifiers.has(sig.identifier)); + + for (const sig of signaturesToDelete) { + await deleteSignature(sig.id); + } + + if (signaturesToDelete.length > 0) { + console.log(`Deleted ${signaturesToDelete.length} signatures not in pasted data`); + } + } + // Save all new/updated signatures for (const signature of parsedSignatures) { await saveSignature(signature); @@ -128,9 +158,10 @@ const SystemView = () => { // Invalidate queries to refresh the data queryClient.invalidateQueries({ queryKey: ['signatures', system] }); + const cleanText = cleanMode ? ` (${cleanMode ? 'cleaned' : ''})` : ''; toast({ title: "Success", - description: `${parsedSignatures.length} signatures processed.` + description: `${parsedSignatures.length} signatures processed${cleanText}.` }); } catch (error) { @@ -148,14 +179,26 @@ const SystemView = () => { return () => { document.removeEventListener('paste', handlePaste); }; - }, [system]); + }, [system, cleanMode]); return (

System: {system}

-

Viewing signatures and regional overview • Press Ctrl+V to paste signatures

+
+

Viewing signatures and regional overview • Press Ctrl+V to paste signatures

+
+ + +
+