From 96aac19684266dbb63c3ebc9b59edccaabb19882 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Tue, 6 Jan 2026 08:48:28 +0100 Subject: [PATCH] Add diagram delete support --- .../servlet/DiagramStorageServlet.java | 26 +++++++++- .../diagram-storage/diagram-storage.jsp | 1 + src/main/webapp/js/storage.js | 47 ++++++++++++++++++- 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/sourceforge/plantuml/servlet/DiagramStorageServlet.java b/src/main/java/net/sourceforge/plantuml/servlet/DiagramStorageServlet.java index b27f97c..4a09a85 100644 --- a/src/main/java/net/sourceforge/plantuml/servlet/DiagramStorageServlet.java +++ b/src/main/java/net/sourceforge/plantuml/servlet/DiagramStorageServlet.java @@ -118,7 +118,31 @@ public class DiagramStorageServlet extends HttpServlet { final HttpServletRequest req, final HttpServletResponse resp ) throws ServletException, IOException { - writeError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Delete is disabled"); + if (!isAuthorized(req)) { + writeError(resp, HttpServletResponse.SC_UNAUTHORIZED, "Missing or invalid token"); + return; + } + final String id = extractId(req); + if (id == null || id.isBlank()) { + writeError(resp, HttpServletResponse.SC_BAD_REQUEST, "Diagram id is required"); + return; + } + if (!storage.isValidId(id)) { + writeError(resp, HttpServletResponse.SC_BAD_REQUEST, "Invalid diagram id"); + return; + } + final boolean deleted; + try { + deleted = storage.delete(id); + } catch (IOException e) { + writeError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Unable to delete diagram"); + return; + } + if (!deleted) { + writeError(resp, HttpServletResponse.SC_NOT_FOUND, "Diagram not found"); + return; + } + writeJson(resp, HttpServletResponse.SC_OK, Map.of("id", id, "deleted", true)); } private String extractId(final HttpServletRequest req) { diff --git a/src/main/webapp/components/modals/diagram-storage/diagram-storage.jsp b/src/main/webapp/components/modals/diagram-storage/diagram-storage.jsp index 917d1a9..0a0cfe0 100644 --- a/src/main/webapp/components/modals/diagram-storage/diagram-storage.jsp +++ b/src/main/webapp/components/modals/diagram-storage/diagram-storage.jsp @@ -17,6 +17,7 @@
+

diff --git a/src/main/webapp/js/storage.js b/src/main/webapp/js/storage.js index 6f30359..60c5594 100644 --- a/src/main/webapp/js/storage.js +++ b/src/main/webapp/js/storage.js @@ -280,6 +280,48 @@ }); } + function deleteDiagram(pathValue) { + log("delete click", pathValue || dom.path.value); + const path = validatePath(pathValue || dom.path.value); + if (!path) { + return; + } + const confirmMessage = `Supprimer le diagramme "${path}" ?`; + if (!window.confirm(confirmMessage)) { + return; + } + if (dom.del) { + dom.del.disabled = true; + } + const headers = authHeaders({}); + fetch(`${API_BASE}/${encodeURIComponent(path)}`, { method: "DELETE", headers }) + .then(handleResponse) + .then(() => { + setStatus(`Diagramme "${path}" supprime.`, "success"); + if (dom.path) { + dom.path.value = ""; + } + if (dom.name) { + dom.name.value = ""; + } + refreshList(); + closeModal("diagram-storage"); + }) + .catch(err => { + if (err.status === 401) { + setToken(); + } else { + setStatus(`Echec de la suppression : ${err.message}`, "error"); + console.error("[diagram-storage] delete error", err); + } + }) + .finally(() => { + if (dom.del) { + dom.del.disabled = false; + } + }); + } + function bindMenuButtons() { const candidates = [ { id: "menu-item-editor-save", label: "menu save click" }, @@ -326,7 +368,10 @@ dom.load.addEventListener("click", () => loadDiagram()); } if (dom.del) { - dom.del.addEventListener("click", () => {}); + const freshDelete = dom.del.cloneNode(true); + dom.del.parentNode.replaceChild(freshDelete, dom.del); + dom.del = freshDelete; + dom.del.addEventListener("click", () => deleteDiagram()); } if (dom.refresh) { dom.refresh.addEventListener("click", () => refreshList(true));