From c90b81da82f8df85060fdcbdf361320445732c45 Mon Sep 17 00:00:00 2001 From: timothycarambat Date: Tue, 27 Feb 2024 11:52:26 -0800 Subject: [PATCH] Do bulk deletion on backend --- .../Documents/Directory/index.jsx | 51 +++++++++++++++++-- .../Documents/UploadFile/index.jsx | 2 +- frontend/src/models/system.js | 12 +++++ server/endpoints/system.js | 15 ++++++ 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/Modals/MangeWorkspace/Documents/Directory/index.jsx b/frontend/src/components/Modals/MangeWorkspace/Documents/Directory/index.jsx index 158719445ac..95a1ecd07b5 100644 --- a/frontend/src/components/Modals/MangeWorkspace/Documents/Directory/index.jsx +++ b/frontend/src/components/Modals/MangeWorkspace/Documents/Directory/index.jsx @@ -3,6 +3,7 @@ import PreLoader from "@/components/Preloader"; import { memo, useEffect, useState } from "react"; import FolderRow from "./FolderRow"; import pluralize from "pluralize"; +import System from "@/models/system"; function Directory({ files, @@ -19,6 +20,40 @@ function Directory({ }) { const [amountSelected, setAmountSelected] = useState(0); + const deleteFiles = async (event) => { + event.stopPropagation(); + if ( + !window.confirm( + "Are you sure you want to delete these files?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible." + ) + ) { + return false; + } + + try { + const toRemove = []; + for (const itemId of Object.keys(selectedItems)) { + for (const folder of files.items) { + const foundItem = folder.items.find((file) => file.id === itemId); + if (foundItem) { + toRemove.push(`${folder.name}/${foundItem.name}`); + break; + } + } + } + setLoading(true); + setLoadingMessage(`Removing ${toRemove.length} documents. Please wait.`); + await System.deleteDocuments(toRemove); + await fetchKeys(true); + setSelectedItems({}); + } catch (error) { + console.error("Failed to delete the document:", error); + } finally { + setLoading(false); + setSelectedItems({}); + } + }; + const toggleSelection = (item) => { setSelectedItems((prevSelectedItems) => { const newSelectedItems = { ...prevSelectedItems }; @@ -119,18 +154,24 @@ function Directory({ {amountSelected !== 0 && ( -
-
-
+
+
+
+
)}
diff --git a/frontend/src/components/Modals/MangeWorkspace/Documents/UploadFile/index.jsx b/frontend/src/components/Modals/MangeWorkspace/Documents/UploadFile/index.jsx index 182cebcd214..93c68c1777e 100644 --- a/frontend/src/components/Modals/MangeWorkspace/Documents/UploadFile/index.jsx +++ b/frontend/src/components/Modals/MangeWorkspace/Documents/UploadFile/index.jsx @@ -35,7 +35,7 @@ export default function UploadFile({ workspace, fetchKeys, setLoading }) { const handleUploadSuccess = () => { fetchKeys(true); - showToast("File uploaded successfully", "success"); + showToast("File uploaded successfully", "success", { clear: true }); }; const handleUploadError = (message) => { diff --git a/frontend/src/models/system.js b/frontend/src/models/system.js index 70e7568568c..89deda75dd1 100644 --- a/frontend/src/models/system.js +++ b/frontend/src/models/system.js @@ -152,6 +152,18 @@ const System = { return false; }); }, + deleteDocuments: async (names = []) => { + return await fetch(`${API_BASE}/system/remove-documents`, { + method: "DELETE", + headers: baseHeaders(), + body: JSON.stringify({ names }), + }) + .then((res) => res.ok) + .catch((e) => { + console.error(e); + return false; + }); + }, deleteFolder: async (name) => { return await fetch(`${API_BASE}/system/remove-folder`, { method: "DELETE", diff --git a/server/endpoints/system.js b/server/endpoints/system.js index 11aeb8cbb22..a36777c8f5c 100644 --- a/server/endpoints/system.js +++ b/server/endpoints/system.js @@ -260,6 +260,21 @@ function systemEndpoints(app) { } ); + app.delete( + "/system/remove-documents", + [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])], + async (request, response) => { + try { + const { names } = reqBody(request); + for await (const name of names) await purgeDocument(name); + response.sendStatus(200).end(); + } catch (e) { + console.log(e.message, e); + response.sendStatus(500).end(); + } + } + ); + app.delete( "/system/remove-folder", [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])],