Portal Community

Three Canvas Modes

ModeValueDescription
Design"design"Default — user can add, move, connect, and configure nodes
Execution"execution"Watching a live or past run — canvas is read-only, node statuses overlaid
Readonly"readonly"Locked canvas — no editing permitted (shared view, embedded viewer)

What Changes Per Mode

FeatureDesignExecutionReadonly
Add / remove nodesEnabledDisabledDisabled
Connect edgesEnabledDisabledDisabled
Node config formsEditableRead-onlyRead-only
Canvas panningEnabledEnabledEnabled
Node status overlaysHiddenVisibleHidden
Run progress barHiddenVisibleHidden

Store Architecture

// designerModeStore.ts
import { create } from 'zustand';

export type CanvasMode = 'design' | 'execution' | 'readonly';

export interface DesignerModeState {
    currentMode   : CanvasMode;
    executionId   : string | null;
    nodeStatuses  : Record<string, NodeExecutionStatus>;
    runProgress   : RunProgress;
    isReadonly    : boolean;
}

export interface DesignerModeActions {
    enterExecutionMode : (executionId: string) => void;
    exitExecutionMode  : () => void;
    enterReadonly      : () => void;
    exitReadonly       : () => void;
    setNodeStatus      : (nodeId: string, status: NodeExecutionStatus) => void;
    updateRunProgress  : (progress: RunProgress) => void;
}

export const useDesignerModeStore =
    create<DesignerModeState & DesignerModeActions>()((set) => ({
        currentMode : 'design',
        executionId : null,
        nodeStatuses: {},
        runProgress : { totalNodes: 0, completedNodes: 0, failedNodes: 0 },
        isReadonly  : false,
        // ... actions
    }));