From e47835c1e856731a1054a66bf3f31907613b7442 Mon Sep 17 00:00:00 2001 From: David Kaya Date: Sun, 5 Apr 2026 21:37:01 +0200 Subject: [PATCH] fix(workflows): disable start/end palette buttons when node already exists Prevents users from adding duplicate start or end nodes, which made the workflow invalid with no way to recover since those node kinds are protected from deletion. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/renderer/components/WorkflowEditor.tsx | 9 ++++++++- .../components/workflow/WorkflowNodePalette.tsx | 12 ++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/WorkflowEditor.tsx b/src/renderer/components/WorkflowEditor.tsx index 9b1f1d2..66835f5 100644 --- a/src/renderer/components/WorkflowEditor.tsx +++ b/src/renderer/components/WorkflowEditor.tsx @@ -182,6 +182,13 @@ export function WorkflowEditor({ const issues = validateWorkflowDefinition(activeWorkflow); + const disabledPaletteKinds = useMemo(() => { + const disabled = new Set(); + if (activeWorkflow.graph.nodes.some((n) => n.kind === 'start')) disabled.add('start'); + if (activeWorkflow.graph.nodes.some((n) => n.kind === 'end')) disabled.add('end'); + return disabled; + }, [activeWorkflow.graph.nodes]); + /* ── Change propagation ─────────────────────────────────── */ function propagateActiveChange(updatedActive: WorkflowDefinition) { @@ -482,7 +489,7 @@ export function WorkflowEditor({
{/* Left palette */}
- +
{/* Center column: validation + canvas + settings */} diff --git a/src/renderer/components/workflow/WorkflowNodePalette.tsx b/src/renderer/components/workflow/WorkflowNodePalette.tsx index 3a46ebd..6788bde 100644 --- a/src/renderer/components/workflow/WorkflowNodePalette.tsx +++ b/src/renderer/components/workflow/WorkflowNodePalette.tsx @@ -4,6 +4,7 @@ import type { WorkflowNodeKind } from '@shared/domain/workflow'; interface WorkflowNodePaletteProps { onAddNode: (kind: WorkflowNodeKind) => void; + disabledKinds?: ReadonlySet; } interface PaletteItem { @@ -48,7 +49,7 @@ const paletteGroups: PaletteGroup[] = [ }, ]; -export function WorkflowNodePalette({ onAddNode }: WorkflowNodePaletteProps) { +export function WorkflowNodePalette({ onAddNode, disabledKinds }: WorkflowNodePaletteProps) { return (

@@ -62,11 +63,18 @@ export function WorkflowNodePalette({ onAddNode }: WorkflowNodePaletteProps) {
{group.items.map((item) => { const Icon = item.icon; + const disabled = disabledKinds?.has(item.kind) ?? false; return (