Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions public/locales/de-DE/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,8 @@
"empty-response": "Leere Antwort",
"form-preview": "Formularvorschau",
"raw-data-json": "Rohdaten (JSON)",
"delete": "Deployment löschen",
"confirm-delete": "Dieses Deployment und alle zugehörigen Prozessinstanzen, historischen Prozessinstanzen und Jobs löschen?",
"sort": {
"deploymentTime": "Deployment-Zeit",
"name": "Name",
Expand Down
2 changes: 2 additions & 0 deletions public/locales/en-US/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,8 @@
"empty-response": "Empty response",
"form-preview": "Form preview",
"raw-data-json": "Raw data (JSON)",
"delete": "Delete deployment",
"confirm-delete": "Delete this deployment and all process instances, historic process instances, and jobs for it?",
"sort": {
"deploymentTime": "Deployment time",
"name": "Name",
Expand Down
2 changes: 2 additions & 0 deletions public/locales/es-ES/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,8 @@
"no-process-name": "N/A – El nombre del proceso no está definido",
"instance-count": "Cantidad de instancias",
"empty-response": "Respuesta vacía",
"delete": "Eliminar despliegue",
"confirm-delete": "¿Eliminar este despliegue y todas sus instancias de proceso, instancias históricas y jobs?",
"sort": {
"deploymentTime": "Hora de despliegue",
"name": "Nombre",
Expand Down
2 changes: 2 additions & 0 deletions public/locales/fr-FR/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,8 @@
"no-process-name": "N/A – Le nom du processus n'est pas défini",
"instance-count": "Nombre d'instances",
"empty-response": "Réponse vide",
"delete": "Supprimer le déploiement",
"confirm-delete": "Supprimer ce déploiement ainsi que toutes ses instances de processus, instances historiques et jobs ?",
"sort": {
"deploymentTime": "Heure de déploiement",
"name": "Nom",
Expand Down
2 changes: 2 additions & 0 deletions public/locales/nl-NL/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,8 @@
"no-process-name": "N.v.t. – Procesnaam is niet gedefinieerd",
"instance-count": "Aantal instanties",
"empty-response": "Leeg antwoord",
"delete": "Deployment verwijderen",
"confirm-delete": "Deze deployment en alle bijbehorende procesinstanties, historische instanties en jobs verwijderen?",
"sort": {
"deploymentTime": "Deployment-tijd",
"name": "Naam",
Expand Down
31 changes: 30 additions & 1 deletion src/pages/Deployments.jsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { useSignal } from "@preact/signals";
import { useContext, useEffect } from "preact/hooks";
import { useTranslation } from "react-i18next";
import { AppState } from "../state.js";
import { useLocation, useRoute } from "preact-iso";
import engine_rest, { RequestState } from "../api/engine_rest.jsx";
import { BPMNViewer } from "../components/BPMNViewer.jsx";
import { CamundaForm } from "../components/CamundaForm.jsx";
import { ConfirmDialog } from "../components/Dialog.jsx";
import { DmnViewer } from "../components/DMNViewer.jsx";
import { formatRelativeDate } from "../helper/date_formatter.js";
import { ListFilter } from "../components/ListFilter.jsx";
Expand Down Expand Up @@ -217,7 +219,19 @@ const DeploymentsList = () => {
const ResourcesList = () => {
const state = useContext(AppState),
{ params } = useRoute(),
[t] = useTranslation();
{ route } = useLocation(),
[t] = useTranslation(),
confirm_delete = useSignal(false);

const remove = async () => {
await engine_rest.deployment.delete(state, params.deployment_id, {
cascade: true,
});
state.api.deployment.resources.value = null;
state.api.deployment.resource.value = null;
route("/deployments", true);
void engine_rest.deployment.all(state);
};

if (!params.deployment_id) {
return (
Expand All @@ -227,6 +241,21 @@ const ResourcesList = () => {

return (
<div>
<div class="button-group">
<button
type="button"
class="danger"
onClick={() => (confirm_delete.value = true)}
>
{t("deployments.delete")}
</button>
</div>
<ConfirmDialog
open={confirm_delete}
message={t("deployments.confirm-delete")}
confirm_label={t("deployments.delete")}
on_confirm={remove}
/>
<table>
<thead>
<tr>
Expand Down
20 changes: 19 additions & 1 deletion src/pages/Deployments.test.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { h } from "preact";
import { render, cleanup } from "@testing-library/preact";
import { render, cleanup, fireEvent } from "@testing-library/preact";

// Spy all engine_rest API functions but keep RequestState/RESPONSE_STATE real.
vi.mock("../api/engine_rest.jsx", async (importOriginal) => {
Expand Down Expand Up @@ -88,6 +88,24 @@ describe("DeploymentsPage", () => {
expect(engine_rest.deployment.resources.mock.lastCall[1]).toBe("dep1");
});

it("deletes the selected deployment after confirmation", async () => {
mockParams = { deployment_id: "dep1" };
signal_response(state.api.deployment.resources, []);
const { getAllByText } = renderPage(state);

const deleteButtons = getAllByText("deployments.delete");
fireEvent.click(deleteButtons[0]);
fireEvent.click(deleteButtons[deleteButtons.length - 1]);
await Promise.resolve();

expect(engine_rest.deployment.delete).toHaveBeenCalled();
const call = engine_rest.deployment.delete.mock.lastCall;
expect(call[0]).toBe(state);
expect(call[1]).toBe("dep1");
expect(call[2]).toEqual({ cascade: true });
expect(routeFn).toHaveBeenCalledWith("/deployments", true);
});

it("renders the resource list for the active deployment", () => {
mockParams = { deployment_id: "dep1" };
signal_response(state.api.deployment.all, [
Expand Down