diff --git a/public/locales/de-DE/translation.json b/public/locales/de-DE/translation.json index 5f7d6a9..1bf6248 100644 --- a/public/locales/de-DE/translation.json +++ b/public/locales/de-DE/translation.json @@ -342,6 +342,14 @@ "called-definitions": { "called-process-definition": "Aufgerufene Prozessdefinition" }, + "external-tasks": { + "topic": "Thema", + "worker": "Worker", + "lock-expiration": "Sperrablauf", + "retries": "Retries", + "error-message": "Fehlermeldung", + "empty": "Keine externen Aufgaben gefunden." + }, "jobs": { "overriding-job-priority": "Überschriebene Job-Priorität", "suspend": "Anhalten", diff --git a/public/locales/en-US/translation.json b/public/locales/en-US/translation.json index ac20fbe..80ad974 100644 --- a/public/locales/en-US/translation.json +++ b/public/locales/en-US/translation.json @@ -342,6 +342,14 @@ "called-definitions": { "called-process-definition": "Called Process Definition" }, + "external-tasks": { + "topic": "Topic", + "worker": "Worker", + "lock-expiration": "Lock Expiration", + "retries": "Retries", + "error-message": "Error Message", + "empty": "No external tasks found." + }, "jobs": { "overriding-job-priority": "Overriding Job Priority", "suspend": "Suspend", diff --git a/src/api/engine_rest.jsx b/src/api/engine_rest.jsx index b1df2be..f482391 100644 --- a/src/api/engine_rest.jsx +++ b/src/api/engine_rest.jsx @@ -11,6 +11,7 @@ import tenant from "./resources/tenant.js"; import process_definition from "./resources/process_definition.js"; import process_instance from "./resources/process_instance.js"; import deployment from "./resources/deployment.js"; +import external_task from "./resources/external_task.js"; import history from "./resources/history.js"; import job_definition from "./resources/job_definition.js"; import migration from "./resources/migration.js"; @@ -26,6 +27,7 @@ const engine_rest = { decision, deployment, engine, + external_task, filter, group, history, diff --git a/src/api/resources/external_task.js b/src/api/resources/external_task.js new file mode 100644 index 0000000..94d3ff0 --- /dev/null +++ b/src/api/resources/external_task.js @@ -0,0 +1,14 @@ +import { GET } from "../helper.jsx"; + +const get_external_tasks_by_process_instance = (state, process_instance_id) => + GET( + `/external-task?processInstanceId=${process_instance_id}`, + state, + state.api.external_task.by_process_instance, + ); + +const external_task = { + by_process_instance: get_external_tasks_by_process_instance, +}; + +export default external_task; diff --git a/src/api/resources/external_task.test.js b/src/api/resources/external_task.test.js new file mode 100644 index 0000000..4033087 --- /dev/null +++ b/src/api/resources/external_task.test.js @@ -0,0 +1,25 @@ +import { describe, it, vi, beforeEach } from "vitest"; + +vi.mock("../helper.jsx", () => ({ + GET: vi.fn(), +})); + +import { GET } from "../helper.jsx"; +import { create_mock_state, expect_api_call } from "../../test/helpers.js"; +import external_task from "./external_task.js"; + +describe("api/resources/external_task", () => { + let state; + beforeEach(() => { + state = create_mock_state(); + }); + + it("by_process_instance() GETs external tasks for a process instance", () => { + external_task.by_process_instance(state, "inst-1"); + expect_api_call(GET, { + url: "/external-task?processInstanceId=inst-1", + state, + signal: state.api.external_task.by_process_instance, + }); + }); +}); diff --git a/src/pages/Processes.jsx b/src/pages/Processes.jsx index d6ac79e..9508630 100644 --- a/src/pages/Processes.jsx +++ b/src/pages/Processes.jsx @@ -686,7 +686,7 @@ const DefinitionsEmpty = () => { {t("processes.empty.how-to")} @@ -928,8 +928,7 @@ const InstanceDetails = () => { params: { selection_id, definition_id, panel }, query, } = useRoute(), - history_mode = query.history === "true", - [t] = useTranslation(); + history_mode = query.history === "true"; if (selection_id) { if ( @@ -1043,20 +1042,16 @@ const InstanceVariables = () => { ? !history_mode ? Object.entries( state.api.process.instance.variables.value.data, - ).map( - // eslint-disable-next-line react/jsx-key - ([name, { type, value }]) => ( -
Jobs
; -// TODO: create External Apps example for old Camunda apps -const InstanceExternalTasksPlaceholder = () =>External Tasks
; +const InstanceExternalTasks = () => { + const state = useContext(AppState), + { selection_id, query } = useRoute(), + history_mode = query.history === "true", + [t] = useTranslation(); + + useEffect(() => { + if (!history_mode) { + void engine_rest.external_task.by_process_instance(state, selection_id); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selection_id, history_mode]); + + if (history_mode) { + return{t("processes.history-mode-na")}
; + } + + /** @namespace state.api.external_task.by_process_instance.value.data **/ + return ( +{t("processes.external-tasks.empty")}
; + } + return ( +| {t("common.id")} | +{t("common.activity")} | +{t("processes.external-tasks.topic")} | +{t("processes.external-tasks.worker")} | +{t("processes.external-tasks.lock-expiration")} | +{t("processes.external-tasks.retries")} | +{t("tasks.task-list.table-headings.priority")} | +{t("processes.external-tasks.error-message")} | +
|---|---|---|---|---|---|---|---|
| {task.id?.substring(0, 8)} | +{task.activityId ?? "—"} | +{task.topicName ?? "—"} | +{task.workerId ?? "—"} | ++ {task.lockExpirationTime ? ( + + ) : ( + "—" + )} + | +{task.retries ?? "—"} | +{task.priority ?? "—"} | +{task.errorMessage ?? "—"} | +