From 213276c3f01b1333c3eab0e29bf89c492a55d91a Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Sun, 12 Oct 2025 16:24:10 +0200 Subject: [PATCH] frontend: fix document deletion --- frontend/src/index.jsx | 93 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/frontend/src/index.jsx b/frontend/src/index.jsx index 39f2c8b..5e3adf6 100644 --- a/frontend/src/index.jsx +++ b/frontend/src/index.jsx @@ -4037,6 +4037,98 @@ const AppLayout = () => { return map; }, [documents, searchResults]); + const handleDocumentDelete = useCallback( + async (documentId) => { + if (!documentId) return; + if (!token) { + setStatusMessage('Log in to manage documents.', 'error'); + return; + } + + const doc = documentLookup.get(documentId) || documentDetails.get(documentId)?.document || null; + const label = doc?.title || doc?.original_name || 'this document'; + + const confirmed = window.confirm(`Delete "${label}"? This action cannot be undone.`); + if (!confirmed) { + return; + } + + setLoading(true); + try { + await api.delete(`/documents/${documentId}`); + + setDocuments((prev) => prev.filter((item) => item.id !== documentId)); + + setSearchResults((prev) => (prev ? prev.filter((item) => item.id !== documentId) : null)); + + setDocumentDetails((prev) => { + if (!prev.has(documentId)) { + return prev; + } + const next = new Map(prev); + next.delete(documentId); + documentDetailsRef.current = next; + return next; + }); + + setFolderContents((prev) => { + let changed = false; + const next = new Map(); + prev.forEach((contents, key) => { + if (!contents?.documents) { + next.set(key, contents); + return; + } + const filteredDocs = contents.documents.filter((item) => item.id !== documentId); + if (filteredDocs.length !== contents.documents.length) { + changed = true; + next.set(key, { ...contents, documents: filteredDocs }); + } else { + next.set(key, contents); + } + }); + return changed ? next : prev; + }); + + previewCacheRef.current.delete(documentId); + + if (selectedDocumentIds.includes(documentId)) { + const remaining = selectedDocumentIds.filter((id) => id !== documentId); + applySelection(remaining, { anchor: null, interactedIds: [documentId] }); + } + + if (previewDocumentId === documentId) { + closeDocumentPreview(); + } + + setStatusMessage('Document deleted.', 'success'); + } catch (error) { + console.error(error); + const message = error.response?.data?.error || 'Failed to delete document.'; + setStatusMessage(message, 'error'); + } finally { + setLoading(false); + } + }, + [ + api, + token, + documentLookup, + documentDetails, + setStatusMessage, + setDocuments, + setSearchResults, + setDocumentDetails, + setFolderContents, + previewDocumentId, + closeDocumentPreview, + selectedDocumentIds, + applySelection, + setLoading, + previewCacheRef, + ], + ); + const orderedSelectedDocuments = useMemo(() => { const ordered = []; const seen = new Set(); @@ -4235,6 +4327,7 @@ const AppLayout = () => { onFolderDelete: handleFolderDelete, onDocumentRowClick: handleDocumentRowClick, onDocumentOpen: openDocumentPreview, + onDocumentDelete: handleDocumentDelete, selectedDocumentIds, focusedDocumentId, draggingDocumentIds: draggedDocumentIds,