From 2f70a3905264cf2d2ff402713889e41a1689ad7f Mon Sep 17 00:00:00 2001 From: Lars Date: Sat, 4 Apr 2026 21:16:15 +0200 Subject: [PATCH] fix: Phase 5 - Workflow Editor UX Fixes (Round 3) Frontend Fixes: - AdminPromptsPage: Edit button navigates to workflow-editor for workflow type prompts - WorkflowEditorPage: Fixed save navigation (alert before navigate) - WorkflowEditorPage: selectedNode derived from selectedNodeId (eliminates stale state) - FallbackConfig: Show node labels instead of IDs in fallback edge dropdown - WorkflowCanvas: Enable edge deletion with deletable: true - WorkflowEditorPage: Hide sidebar when config panel is open Bugs Fixed: - C1: Save error "Method Not Allowed" after success - C2: Edit button in admin doesn't open workflow editor - H1: Prompt selection not displayed when re-editing node - H2: Fallback edge dropdown shows node_1/node_2 instead of names - H3: Cannot delete edges - M1: Sidebar takes space when config panel open Technical Changes: - Replaced useState(selectedNode) with useState(selectedNodeId) + derived selectedNode - Removed sync useEffect (no longer needed with derived state) - Added nodes prop to FallbackConfig for label lookup - Swapped alert/navigate order to prevent navigation errors Testing: Manual testing required (see manual test cases) --- .../components/workflow/WorkflowCanvas.jsx | 3 +- .../workflow/panels/FallbackConfig.jsx | 11 ++++-- frontend/src/pages/AdminPromptsPage.jsx | 8 ++++- frontend/src/pages/WorkflowEditorPage.jsx | 35 +++++++------------ 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/frontend/src/components/workflow/WorkflowCanvas.jsx b/frontend/src/components/workflow/WorkflowCanvas.jsx index 91ca62d..447d68c 100644 --- a/frontend/src/components/workflow/WorkflowCanvas.jsx +++ b/frontend/src/components/workflow/WorkflowCanvas.jsx @@ -41,7 +41,8 @@ export function WorkflowCanvas({ maxZoom={2} defaultEdgeOptions={{ animated: false, - style: { strokeWidth: 2 } + style: { strokeWidth: 2 }, + deletable: true }} > void */ -export function FallbackConfig({ node, edges, onChange }) { +export function FallbackConfig({ node, edges, nodes, onChange }) { const fallbackStrategy = node.data.fallback_strategy || 'conservative_skip' const fallbackEdge = node.data.fallback_edge || null // Outgoing Edges von diesem Node const outgoingEdges = edges.filter(e => e.source === node.id) + // Helper: Get node label by ID + const getNodeLabel = (nodeId) => { + const targetNode = nodes.find(n => n.id === nodeId) + return targetNode?.data?.label || nodeId + } + const handleStrategyChange = (e) => { const strategy = e.target.value onChange(node.id, { fallback_strategy: strategy }) @@ -53,7 +60,7 @@ export function FallbackConfig({ node, edges, onChange }) { {outgoingEdges.map(e => ( ))} diff --git a/frontend/src/pages/AdminPromptsPage.jsx b/frontend/src/pages/AdminPromptsPage.jsx index 67cb553..f4c5845 100644 --- a/frontend/src/pages/AdminPromptsPage.jsx +++ b/frontend/src/pages/AdminPromptsPage.jsx @@ -530,7 +530,13 @@ export default function AdminPromptsPage() { justifyContent: 'flex-end' }}>