From 5bdc8c9e011f4b42df3c77bf38a8af8f834a1eeb Mon Sep 17 00:00:00 2001 From: pratyush Date: Wed, 4 Mar 2026 20:03:45 +0000 Subject: [PATCH 1/2] Rename ConfigMap from `simple-workflow-editor-secrets-dev` to `veloflow-editor-secrets-dev`. --- ...w-editor-secrets-dev.yaml => veloflow-editor-secrets-dev.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename configmap/dev/{simple-workflow-editor-secrets-dev.yaml => veloflow-editor-secrets-dev.yaml} (100%) diff --git a/configmap/dev/simple-workflow-editor-secrets-dev.yaml b/configmap/dev/veloflow-editor-secrets-dev.yaml similarity index 100% rename from configmap/dev/simple-workflow-editor-secrets-dev.yaml rename to configmap/dev/veloflow-editor-secrets-dev.yaml -- GitLab From 76e47fa7b4afe0f2635fbf74a85c89e09c8d607b Mon Sep 17 00:00:00 2001 From: pratyush Date: Sat, 7 Mar 2026 22:42:14 +0000 Subject: [PATCH 2/2] Add BPMN import/export functionality to workflows: - Implement `handleImportBpmn` and `handleExportBpmn` methods in `WorkflowsPage` for managing BPMN files. - Add file input and buttons for importing/exporting BPMN diagrams in the UI. - Extend `workflowService` with `importFromBpmn` and `exportToBpmn` methods. - Update `httpClient` to handle non-JSON responses. --- src/page/WorkflowsPage.tsx | 59 ++++++++++++++++++++++++++++++++- src/services/httpClient.ts | 2 +- src/services/workflowService.ts | 14 ++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/page/WorkflowsPage.tsx b/src/page/WorkflowsPage.tsx index d0a044c..cb05616 100644 --- a/src/page/WorkflowsPage.tsx +++ b/src/page/WorkflowsPage.tsx @@ -1,4 +1,4 @@ -import {useCallback, useEffect, useMemo, useState} from "react"; +import {useCallback, useEffect, useMemo, useRef, useState} from "react"; import {WorkflowDto, WorkflowForm, emptyWorkflowForm} from "../types/WorkflowTypes"; import {workflowService} from "../services/workflowService"; import {useAppContext} from "../elements/AppContextProvider.tsx"; @@ -16,6 +16,7 @@ export default function WorkflowsPage() { const [form, setForm] = useState(emptyWorkflowForm); const [submitting, setSubmitting] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); + const fileInputRef = useRef(null); const load = useCallback(async () => { setLoading(true); @@ -60,6 +61,43 @@ export default function WorkflowsPage() { }; + const handleImportBpmn = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + showLoader(); + try { + const bpmnXml = await file.text(); + await workflowService.importFromBpmn(bpmnXml); + await load(); + } catch (err: any) { + pushError(err?.message || "Import failed"); + } finally { + hideLoader(); + if (fileInputRef.current) fileInputRef.current.value = ""; + } + }; + + const handleExportBpmn = async (wf: WorkflowDto) => { + showLoader(); + try { + const bpmnXml = await workflowService.exportToBpmn(wf.id); + const blob = new Blob([bpmnXml], { type: "application/xml" }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `${wf.name || 'workflow'}.bpmn`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } catch (err: any) { + pushError(err?.message || "Export failed"); + } finally { + hideLoader(); + } + }; + const sortedItems = useMemo(() => [...items].sort((a, b) => b.id.localeCompare(a.id)), [items]); return ( @@ -71,6 +109,19 @@ export default function WorkflowsPage() { > Tasks + + + diff --git a/src/services/httpClient.ts b/src/services/httpClient.ts index e9d933d..e0ac798 100644 --- a/src/services/httpClient.ts +++ b/src/services/httpClient.ts @@ -17,7 +17,7 @@ export async function request(url: string, options: HttpOptions = { throw new Error(text || `HTTP ${response.status}`); } - if (!expectJson) return undefined as T; + if (!expectJson) return (await response.text()) as T; return (await response.json()) as T; } diff --git a/src/services/workflowService.ts b/src/services/workflowService.ts index 4ddb5e0..4b966e6 100644 --- a/src/services/workflowService.ts +++ b/src/services/workflowService.ts @@ -37,6 +37,20 @@ class WorkflowService { return await request(`${baseUrl}/${id}`); } + async importFromBpmn(bpmnXml: string): Promise { + return await request(`${baseUrl}/import/bpmn`, { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify(bpmnXml), + }); + } + + async exportToBpmn(id: string): Promise { + return await request(`${baseUrl}/${id}/export/bpmn`, { + expectJson: false, + }); + } + } export const workflowService = new WorkflowService(); \ No newline at end of file -- GitLab