frontend: fix document deletion
This commit is contained in:
@@ -4037,6 +4037,96 @@ const AppLayout = () => {
|
|||||||
return map;
|
return map;
|
||||||
}, [documents, searchResults]);
|
}, [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,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
const orderedSelectedDocuments = useMemo(() => {
|
const orderedSelectedDocuments = useMemo(() => {
|
||||||
const ordered = [];
|
const ordered = [];
|
||||||
const seen = new Set();
|
const seen = new Set();
|
||||||
@@ -4235,6 +4325,7 @@ const AppLayout = () => {
|
|||||||
onFolderDelete: handleFolderDelete,
|
onFolderDelete: handleFolderDelete,
|
||||||
onDocumentRowClick: handleDocumentRowClick,
|
onDocumentRowClick: handleDocumentRowClick,
|
||||||
onDocumentOpen: openDocumentPreview,
|
onDocumentOpen: openDocumentPreview,
|
||||||
|
onDocumentDelete: handleDocumentDelete,
|
||||||
selectedDocumentIds,
|
selectedDocumentIds,
|
||||||
focusedDocumentId,
|
focusedDocumentId,
|
||||||
draggingDocumentIds: draggedDocumentIds,
|
draggingDocumentIds: draggedDocumentIds,
|
||||||
|
|||||||
Reference in New Issue
Block a user