{"version":3,"file":"ngx-workflow-designer.mjs","sources":["../../../projects/alert-workflow/src/lib/core/workflow-lib.config.ts","../../../projects/alert-workflow/src/lib/core/workflow-node-types.token.ts","../../../projects/alert-workflow/src/lib/core/providers.ts","../../../projects/alert-workflow/src/lib/core/services/workflow-api.service.ts","../../../projects/alert-workflow/src/lib/workflow-designer/workflow-designer.interfaces.ts","../../../projects/alert-workflow/src/lib/workflow-designer/workflow-history.service.ts","../../../projects/alert-workflow/src/lib/workflow-designer/workflow-variables.service.ts","../../../projects/alert-workflow/src/lib/workflow-designer/special-markers.service.ts","../../../projects/alert-workflow/src/lib/workflow-designer/config/workflow-nodes-config.data.ts","../../../projects/alert-workflow/src/lib/workflow-designer/workflow-nodes-config.service.ts","../../../projects/alert-workflow/src/lib/workflow-designer/workflow-designer.service.ts","../../../projects/alert-workflow/src/lib/workflow-designer/components/workflow-header.component.ts","../../../projects/alert-workflow/src/lib/workflow-designer/components/workflow-palette.component.ts","../../../projects/alert-workflow/src/lib/workflow-designer/components/workflow-node.component.ts","../../../projects/alert-workflow/src/lib/core/services/side-page.service.ts","../../../projects/alert-workflow/src/lib/workflow-designer/components/workflow-history-panel.component.ts","../../../projects/alert-workflow/src/lib/workflow-designer/components/workflow-canvas.component.ts","../../../projects/alert-workflow/src/lib/workflow-designer/components/workflow-inspector.component.ts","../../../projects/alert-workflow/src/lib/workflow-designer/components/workflow-validation-dialog.component.ts","../../../projects/alert-workflow/src/lib/workflow-designer/workflow-designer.component.ts","../../../projects/alert-workflow/src/lib/workflow-designer/workflow-designer.component.html","../../../projects/alert-workflow/src/public-api.ts","../../../projects/alert-workflow/src/ngx-workflow-designer.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport type { PaletteCategoryConfig, NodeTypeConfig } from '../workflow-designer/workflow-designer.interfaces';\r\n\r\nexport interface WorkflowDesignerFeatureFlags {\r\n  import: boolean;\r\n  export: boolean;\r\n  new: boolean;\r\n  templates: boolean;\r\n  save: boolean;\r\n  workflowList: boolean;\r\n  backButton?: boolean;\r\n  backUrl?: string;\r\n}\r\n\r\nexport interface WorkflowDesignerApiConfig {\r\n  baseUrl: string;\r\n  token?: string;\r\n  templatesUrl?: string;\r\n}\r\n\r\nexport interface WorkflowNodesConfigOptions {\r\n  source?: 'ts' | 'json';\r\n  jsonUrl?: string;\r\n}\r\n\r\nexport interface WorkflowDesignerLibConfig {\r\n  features: WorkflowDesignerFeatureFlags;\r\n  api: WorkflowDesignerApiConfig;\r\n  nodesConfig?: WorkflowNodesConfigOptions;\r\n  palette?: {\r\n    categories?: PaletteCategoryConfig[];\r\n    /**\r\n     * Optional: Provide node type configurations directly from the host app.\r\n     * If provided, these take precedence over JSON/TS defaults and will be\r\n     * merged with WORKFLOW_NODE_TYPES (if any) by type.\r\n     */\r\n    nodeTypes?: NodeTypeConfig[];\r\n  };\r\n}\r\n\r\nexport const WORKFLOW_LIB_CONFIG = new InjectionToken<WorkflowDesignerLibConfig>(\r\n  'WORKFLOW_LIB_CONFIG'\r\n);\r\n","import { InjectionToken } from '@angular/core';\r\nimport type { NodeTypeConfig } from '../workflow-designer/workflow-designer.interfaces';\r\n\r\n/**\r\n * Provide this token with an array of NodeTypeConfig to override or extend\r\n * the default node types at runtime. Types are matched by `type` string.\r\n * - If a provided type matches an existing one, it will shallow-merge over it.\r\n * - If it is new, it will be added to the palette.\r\n */\r\nexport const WORKFLOW_NODE_TYPES = new InjectionToken<NodeTypeConfig[]>(\r\n  'WORKFLOW_NODE_TYPES'\r\n);\r\n","import { Provider } from '@angular/core';\r\nimport { WORKFLOW_LIB_CONFIG, WorkflowDesignerLibConfig } from './workflow-lib.config';\r\nimport { WORKFLOW_NODE_TYPES } from './workflow-node-types.token';\r\nimport type { NodeTypeConfig } from '../workflow-designer/workflow-designer.interfaces';\r\n\r\n/** Helper to wire library configuration and optional node types in the host app. */\r\nexport function provideAlertWorkflow(\r\n  config: WorkflowDesignerLibConfig,\r\n  extraNodeTypes: NodeTypeConfig[] = []\r\n): Provider[] {\r\n  return [\r\n    { provide: WORKFLOW_LIB_CONFIG, useValue: config },\r\n    { provide: WORKFLOW_NODE_TYPES, useValue: extraNodeTypes }\r\n  ];\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { WORKFLOW_LIB_CONFIG, WorkflowDesignerLibConfig } from '../workflow-lib.config';\r\n\r\nexport interface ApiWorkflow {\r\n  workflowId: number;\r\n  name: string;\r\n  description?: string;\r\n  nodes: Array<{\r\n    id: string;\r\n    type: string;\r\n    position: { x: number; y: number };\r\n    data: {\r\n      label: string;\r\n      icon?: string;\r\n      params?: Record<string, any>;\r\n    };\r\n  }>;\r\n  edges: Array<{\r\n    id: string;\r\n    source: string;\r\n    target: string;\r\n    data?: Record<string, any>;\r\n  }>;\r\n  variables?: Record<string, string>;\r\n  metadata?: {\r\n    category?: string;\r\n    priority?: string;\r\n    author?: string;\r\n    version?: string;\r\n    approved?: boolean;\r\n    tags?: string[];\r\n  };\r\n  createdAt: string;\r\n  modifiedAt: string;\r\n  isDeleted: boolean;\r\n}\r\n\r\nexport interface ApiResponse<T> {\r\n  errors: string[];\r\n  totalRecords: number;\r\n  results: T;\r\n}\r\n\r\nexport interface WorkflowQueryParams {\r\n  page?: number;\r\n  limit?: number;\r\n  search?: string;\r\n  sortBy?: string;\r\n  sortOrder?: 'asc' | 'desc';\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkflowApiService {\r\n  private workflowEndpoint: string;\r\n  private templatesEndpoint: string;\r\n  private headers: HttpHeaders | undefined;\r\n  private isConfigured: boolean = false;\r\n\r\n  private http = inject(HttpClient);\r\n  private libConfig = inject(WORKFLOW_LIB_CONFIG, { optional: true }) as WorkflowDesignerLibConfig | null;\r\n\r\n  constructor() {\r\n    const baseFromConfig = this.libConfig?.api?.baseUrl;\r\n    const tokenFromConfig = this.libConfig?.api?.token;\r\n    const templatesFromConfig = this.libConfig?.api?.templatesUrl;\r\n\r\n    // Allow empty/missing baseUrl for standalone mode (no backend)\r\n    if (!baseFromConfig || baseFromConfig.trim() === '') {\r\n      console.warn('WorkflowApiService: No baseUrl configured. API features will be disabled.');\r\n      this.workflowEndpoint = '';\r\n      this.templatesEndpoint = '';\r\n      this.isConfigured = false;\r\n      return;\r\n    }\r\n\r\n    this.isConfigured = true;\r\n    const base = baseFromConfig.replace(/\\/$/, '');\r\n    this.workflowEndpoint = base;\r\n    this.templatesEndpoint = (templatesFromConfig || base).replace(/\\/$/, '');\r\n\r\n    const token = tokenFromConfig;\r\n    this.headers = token ? new HttpHeaders({ Authorization: token }) : undefined;\r\n  }\r\n\r\n  private checkConfiguration(): void {\r\n    if (!this.isConfigured) {\r\n      throw new Error('WorkflowApiService: API not configured. Set api.baseUrl in provideAlertWorkflow() or disable API-dependent features (templates, save, workflowList).');\r\n    }\r\n  }\r\n\r\n  /** Check if API is configured and available */\r\n  isApiConfigured(): boolean {\r\n    return this.isConfigured;\r\n  }\r\n\r\n  getWorkflows(params?: WorkflowQueryParams): Observable<ApiResponse<ApiWorkflow[]>> {\r\n    this.checkConfiguration();\r\n    let httpParams = new HttpParams();\r\n    if (params) {\r\n      if (params.page) httpParams = httpParams.set('page', params.page.toString());\r\n      if (params.limit) httpParams = httpParams.set('limit', params.limit.toString());\r\n      if (params.search) httpParams = httpParams.set('search', params.search);\r\n      if (params.sortBy) httpParams = httpParams.set('sortBy', params.sortBy);\r\n      if (params.sortOrder) httpParams = httpParams.set('sortOrder', params.sortOrder);\r\n    }\r\n    return this.http.get<ApiResponse<ApiWorkflow[]>>(this.workflowEndpoint, {\r\n      params: httpParams,\r\n      headers: this.headers\r\n    });\r\n  }\r\n\r\n  getWorkflow(id: string | number): Observable<ApiResponse<ApiWorkflow>> {\r\n    this.checkConfiguration();\r\n    return this.http.get<ApiResponse<ApiWorkflow>>(`${this.workflowEndpoint}/${id}`, {\r\n      headers: this.headers\r\n    });\r\n  }\r\n\r\n  createWorkflow(workflow: Omit<ApiWorkflow, 'workflowId' | 'createdAt' | 'modifiedAt' | 'isDeleted'>): Observable<ApiResponse<ApiWorkflow>> {\r\n    this.checkConfiguration();\r\n    return this.http.post<ApiResponse<ApiWorkflow>>(this.workflowEndpoint, workflow, {\r\n      headers: this.headers\r\n    });\r\n  }\r\n\r\n  updateWorkflow(id: string | number, workflow: Partial<Omit<ApiWorkflow, 'workflowId' | 'createdAt' | 'modifiedAt' | 'isDeleted'>>): Observable<ApiResponse<ApiWorkflow>> {\r\n    this.checkConfiguration();\r\n    const payload = { ...workflow, workflowId: id };\r\n    return this.http.put<ApiResponse<ApiWorkflow>>(this.workflowEndpoint, payload, {\r\n      headers: this.headers\r\n    });\r\n  }\r\n\r\n  deleteWorkflow(id: string): Observable<ApiResponse<void>> {\r\n    this.checkConfiguration();\r\n    return this.http.delete<ApiResponse<void>>(`${this.workflowEndpoint}/${id}`, {\r\n      headers: this.headers\r\n    });\r\n  }\r\n\r\n  getTemplates(): Observable<ApiWorkflow[]> {\r\n    this.checkConfiguration();\r\n    return this.http.get<ApiResponse<any>>(this.templatesEndpoint, { headers: this.headers }).pipe(\r\n      map((response) => {\r\n        const res = response?.results as any;\r\n        if (!res) return [] as ApiWorkflow[];\r\n        const list = Array.isArray(res) ? res : Array.isArray((res as any).data) ? (res as any).data : [];\r\n        return list as ApiWorkflow[];\r\n      })\r\n    );\r\n  }\r\n}\r\n","// Alert Workflow Designer Interfaces - migrated to library\r\n\r\nexport interface NodeSize {\r\n  w: number;\r\n  h: number;\r\n}\r\n\r\nexport interface WorkflowNode {\r\n  id: string;\r\n  type: string;\r\n  label: string;\r\n  description?: string;\r\n  x: number;\r\n  y: number;\r\n  params: Record<string, any>;\r\n}\r\n\r\nexport interface WorkflowEdge {\r\n  id: string;\r\n  from: string;\r\n  to: string;\r\n  exitPoint?: string; // Which output point: 'next', 'onTrue', 'onFalse', 'case1', etc.\r\n}\r\n\r\nexport interface PaletteItem {\r\n  type: string;\r\n  label: string;\r\n  color: string;\r\n}\r\n\r\nexport interface PaletteCategoryConfig {\r\n  id: string;\r\n  label: string;\r\n  icon: string;\r\n  headerClass: string;\r\n  filterPrefix: string | string[]; // Type prefix(es) to filter nodes (e.g., 'trigger.' or ['var.', 'audit.', 'utility.'])\r\n}\r\n\r\nexport interface NodeProperty {\r\n  key: string;\r\n  label: string;\r\n  type: 'text' | 'textarea' | 'number' | 'select' | 'json';\r\n  required: boolean;\r\n  placeholder?: string;\r\n  helpText?: string;\r\n  options?: string[];\r\n  default?: any;\r\n}\r\n\r\nexport interface NodeTypeConfig {\r\n  type: string;\r\n  category: 'trigger' | 'control' | 'action' | 'terminal' | 'utility';\r\n  label: string;\r\n  description: string;\r\n  icon: string; // Icon for node type - emoji (e.g., '⚡', '📧') or HTML markup (e.g., '<i class=\"fa fa-bolt\"></i>', '<svg>...</svg>')\r\n  color: string;\r\n  nodeColor: string;\r\n  properties: NodeFieldConfig[];\r\n  exits: string[];\r\n}\r\n\r\nexport interface WorkflowNodesConfig {\r\n  nodeTypes: NodeTypeConfig[];\r\n}\r\n\r\nexport interface DragState {\r\n  draggingId: string | null;\r\n  dx: number;\r\n  dy: number;\r\n}\r\n\r\nexport interface WorkflowExport {\r\n  workflowId: string;\r\n  version: number;\r\n  nodes: {\r\n    id: string;\r\n    type: string;\r\n    label: string;\r\n    params: Record<string, any>;\r\n    next: string[];\r\n  }[];\r\n  variables: Record<string, any>;\r\n}\r\n\r\n// Generic options interface for field-specific configurations\r\nexport interface GenericSelectorOptions {\r\n  endpoint: string; // API endpoint URL\r\n  valueField?: string; // Field to use as value (default: 'id')\r\n  primaryDisplayField?: string; // Field to display as primary text (default: 'name')\r\n  secondaryDisplayField?: string; // Optional field for secondary text\r\n  searchFields?: string[]; // Fields to search on\r\n  searchLabel?: string; // Label for search field\r\n  searchPlaceholder?: string; // Placeholder for search field\r\n  selectedLabel?: string; // Label for selected items list\r\n  emptyStateMessage?: string; // Message when no items selected\r\n  responseDataPath?: string; // Path to data in response (e.g., 'results', 'data.items')\r\n}\r\n\r\nexport interface DynamicSelectOptions {\r\n  // Mode 1: Static array\r\n  options?: string[] | any[]; // Static options array\r\n  \r\n  // Mode 2: Dynamic endpoint\r\n  endpoint?: string; // API endpoint URL\r\n  valueField?: string; // Field to use as value (default: 'id')\r\n  displayField?: string; // Field to display as text (default: 'name')\r\n  secondaryDisplayField?: string; // Optional field for secondary text\r\n  responseDataPath?: string; // Path to data in response (e.g., 'results', 'data.items')\r\n  \r\n  // Append static options to endpoint results (e.g., \"Other\", \"Custom\")\r\n  appendOptions?: Array<{\r\n    value: string | number;           // Value to store\r\n    label: string;                     // Display text\r\n    secondaryLabel?: string;           // Optional secondary text\r\n    icon?: string;                     // Optional icon\r\n    separator?: boolean;               // Show separator before this option\r\n  }>;\r\n  \r\n  // Auto-set other field values when specific option is selected\r\n  autoSetFields?: Array<{\r\n    triggerValue: string | number;    // When this value is selected\r\n    fieldUpdates: Record<string, any>; // Fields to update: { fieldKey: value }\r\n  }>;\r\n  \r\n  // Common options\r\n  showSearch?: boolean; // Enable search/filter (default: false)\r\n}\r\n\r\n// Conditional visibility configuration for any field\r\nexport interface FieldCondition {\r\n  watchField: string; // The field key to watch for changes\r\n  operator: 'equals' | 'notEquals' | 'includes' | 'notIncludes' | 'greaterThan' | 'lessThan'; // Comparison operator\r\n  value: any; // Value to compare against (can be single value or array for 'includes'/'notIncludes')\r\n}\r\n\r\n// Base interface for node field configuration\r\nexport interface NodeFieldConfig<T = any> {\r\n  // Required/Common fields (used by all field types)\r\n  key: string;\r\n  label: string;\r\n  type: 'text' | 'number' | 'textarea' | 'select' | 'switch-cases' | 'user-selector' | 'user-group-selector' | 'generic-selector';\r\n  \r\n  // Optional common fields\r\n  required?: boolean;\r\n  placeholder?: string;\r\n  help?: string;\r\n  helpText?: string; // Alias for 'help' (for compatibility with NodeProperty)\r\n  icon?: string; // Icon to display - emoji (e.g., '📋', '👤') or HTML markup (e.g., '<i class=\"fa fa-user\"></i>', '<svg>...</svg>')\r\n  default?: any;\r\n  readonly?: boolean; // Make field read-only (user cannot edit). Useful for auto-generated values like UUIDs.\r\n  // Show this field value in the node's compact summary (node card)\r\n  showInNode?: boolean;\r\n  \r\n  // Type-specific options (generic)\r\n  options?: T;\r\n  \r\n  // Conditional visibility - show/hide field based on other field values\r\n  showIf?: FieldCondition | FieldCondition[]; // Single condition or array of conditions (AND logic)\r\n}\r\n\r\nexport const NODE_SIZE: NodeSize = { w: 220, h: 92 };\r\n\r\n// Undo/Redo History State\r\nexport interface WorkflowHistoryState {\r\n  nodes: WorkflowNode[];\r\n  edges: WorkflowEdge[];\r\n  selectedNodeId: string | null;\r\n  selectedEdgeId: string | null;\r\n  description?: string; // Optional description of the change\r\n  timestamp?: Date; // Optional timestamp when state was saved\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { WorkflowHistoryState } from './workflow-designer.interfaces';\r\n\r\n/**\r\n * Service for managing undo/redo history for workflow designer\r\n * Maintains a stack of workflow states and provides navigation\r\n */\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class WorkflowHistoryService {\r\n  // History stack and current position\r\n  private historyStack: WorkflowHistoryState[] = [];\r\n  private historyIndex = signal<number>(-1);\r\n  private readonly MAX_HISTORY_SIZE = 50;\r\n  private isRestoringState = false;\r\n\r\n  // Computed properties for UI state\r\n  canUndo = computed(() => this.historyIndex() > 0);\r\n  canRedo = computed(() => this.historyIndex() < this.historyStack.length - 1);\r\n\r\n  saveState(state: WorkflowHistoryState, description?: string): void {\r\n    if (this.isRestoringState) return; // Don't save during undo/redo\r\n\r\n    const clonedState: WorkflowHistoryState = {\r\n      nodes: JSON.parse(JSON.stringify(state.nodes)),\r\n      edges: JSON.parse(JSON.stringify(state.edges)),\r\n      selectedNodeId: state.selectedNodeId,\r\n      selectedEdgeId: state.selectedEdgeId,\r\n      description: description || state.description,\r\n      timestamp: new Date()\r\n    };\r\n\r\n    const currentIndex = this.historyIndex();\r\n    if (currentIndex < this.historyStack.length - 1) {\r\n      this.historyStack = this.historyStack.slice(0, currentIndex + 1);\r\n    }\r\n\r\n    this.historyStack.push(clonedState);\r\n\r\n    if (this.historyStack.length > this.MAX_HISTORY_SIZE) {\r\n      this.historyStack.shift();\r\n    } else {\r\n      this.historyIndex.update(idx => idx + 1);\r\n    }\r\n  }\r\n\r\n  undo(): WorkflowHistoryState | null {\r\n    if (!this.canUndo()) return null;\r\n\r\n    this.isRestoringState = true;\r\n    const newIndex = this.historyIndex() - 1;\r\n    this.historyIndex.set(newIndex);\r\n    const state = this.historyStack[newIndex];\r\n    this.isRestoringState = false;\r\n    return this.cloneState(state);\r\n  }\r\n\r\n  redo(): WorkflowHistoryState | null {\r\n    if (!this.canRedo()) return null;\r\n\r\n    this.isRestoringState = true;\r\n    const newIndex = this.historyIndex() + 1;\r\n    this.historyIndex.set(newIndex);\r\n    const state = this.historyStack[newIndex];\r\n    this.isRestoringState = false;\r\n    return this.cloneState(state);\r\n  }\r\n\r\n  clearHistory(): void {\r\n    this.historyStack = [];\r\n    this.historyIndex.set(-1);\r\n  }\r\n\r\n  getHistoryInfo(): { size: number; index: number; canUndo: boolean; canRedo: boolean } {\r\n    return {\r\n      size: this.historyStack.length,\r\n      index: this.historyIndex(),\r\n      canUndo: this.canUndo(),\r\n      canRedo: this.canRedo()\r\n    };\r\n  }\r\n\r\n  getHistoryStack(): Array<{ description?: string; timestamp?: Date; index: number; isCurrent: boolean }> {\r\n    return this.historyStack.map((state, index) => ({\r\n      description: state.description,\r\n      timestamp: state.timestamp,\r\n      index,\r\n      isCurrent: index === this.historyIndex()\r\n    }));\r\n  }\r\n\r\n  getCurrentDescription(): string | undefined {\r\n    const currentIndex = this.historyIndex();\r\n    if (currentIndex >= 0 && currentIndex < this.historyStack.length) {\r\n      return this.historyStack[currentIndex].description;\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private cloneState(state: WorkflowHistoryState): WorkflowHistoryState {\r\n    return {\r\n      nodes: JSON.parse(JSON.stringify(state.nodes)),\r\n      edges: JSON.parse(JSON.stringify(state.edges)),\r\n      selectedNodeId: state.selectedNodeId,\r\n      selectedEdgeId: state.selectedEdgeId,\r\n      description: state.description,\r\n      timestamp: state.timestamp\r\n    };\r\n  }\r\n\r\n  isRestoring(): boolean {\r\n    return this.isRestoringState;\r\n  }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\n\r\nexport interface WorkflowVariable {\r\n  key: string;\r\n  value: string;\r\n  description?: string;\r\n}\r\n\r\nexport interface WorkflowConstant {\r\n  key: string;\r\n  value: string;\r\n  description?: string;\r\n}\r\n\r\nexport interface TemplateVariable {\r\n  key: string;           // Variable key (e.g., 'alert.id', 'user.name')\r\n  label: string;         // Display label\r\n  description?: string;  // Optional description/help text\r\n  category?: string;     // Optional category for grouping\r\n}\r\n\r\nexport const DEFAULT_TEMPLATE_VARIABLES: TemplateVariable[] = [\r\n  { key: 'alert.id', label: 'Alert ID', description: 'Unique identifier of the alert', category: 'Alert' },\r\n  { key: 'alert.type', label: 'Alert Type', description: 'Type of alert (e.g., FIRE, MEDICAL)', category: 'Alert' },\r\n  { key: 'alert.severity', label: 'Alert Severity', description: 'Severity level (CRITICAL, HIGH, MEDIUM, LOW)', category: 'Alert' },\r\n  { key: 'alert.message', label: 'Alert Message', description: 'Alert message text', category: 'Alert' },\r\n  { key: 'alert.location', label: 'Alert Location', description: 'Location where alert was triggered', category: 'Alert' },\r\n  { key: 'alert.timestamp', label: 'Alert Timestamp', description: 'When the alert was created', category: 'Alert' },\r\n  { key: 'alert.source', label: 'Alert Source', description: 'Source system or device', category: 'Alert' },\r\n  { key: 'user.id', label: 'User ID', description: 'Current user identifier', category: 'User' },\r\n  { key: 'user.name', label: 'User Name', description: 'Current user full name', category: 'User' },\r\n  { key: 'user.email', label: 'User Email', description: 'Current user email address', category: 'User' },\r\n  { key: 'user.role', label: 'User Role', description: 'Current user role', category: 'User' },\r\n  { key: 'user.department', label: 'User Department', description: 'Current user department', category: 'User' },\r\n  { key: 'workflow.id', label: 'Workflow ID', description: 'Current workflow instance ID', category: 'Workflow' },\r\n  { key: 'workflow.name', label: 'Workflow Name', description: 'Name of the workflow', category: 'Workflow' },\r\n  { key: 'workflow.startTime', label: 'Workflow Start Time', description: 'When workflow execution started', category: 'Workflow' },\r\n  { key: 'system.date', label: 'Current Date', description: 'Current system date', category: 'System' },\r\n  { key: 'system.time', label: 'Current Time', description: 'Current system time', category: 'System' },\r\n  { key: 'system.datetime', label: 'Current DateTime', description: 'Current system date and time', category: 'System' },\r\n  { key: 'system.timezone', label: 'System Timezone', description: 'System timezone', category: 'System' },\r\n  { key: 'node.output', label: 'Previous Node Output', description: 'Output from previous node', category: 'Node Data' },\r\n  { key: 'node.status', label: 'Previous Node Status', description: 'Status of previous node execution', category: 'Node Data' },\r\n];\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkflowVariablesService {\r\n  private _variables = signal<Record<string, string>>({});\r\n  private _constants = signal<Record<string, string>>({});\r\n\r\n  variables = computed(() => this._variables());\r\n  constants = computed(() => this._constants());\r\n\r\n  getVariablesArray(): WorkflowVariable[] {\r\n    const vars = this._variables();\r\n    return Object.entries(vars).map(([key, value]) => ({ key, value }));\r\n  }\r\n\r\n  getConstantsArray(): WorkflowConstant[] {\r\n    const consts = this._constants();\r\n    return Object.entries(consts).map(([key, value]) => ({ key, value }));\r\n  }\r\n\r\n  setVariables(variables: Record<string, string>): void {\r\n    this._variables.set(variables || {});\r\n  }\r\n\r\n  setConstants(constants: Record<string, string>): void {\r\n    this._constants.set(constants || {});\r\n  }\r\n\r\n  setVariable(key: string, value: string): void {\r\n    this._variables.update(vars => ({ ...vars, [key]: value }));\r\n  }\r\n\r\n  setConstant(key: string, value: string): void {\r\n    this._constants.update(consts => ({ ...consts, [key]: value }));\r\n  }\r\n\r\n  removeVariable(key: string): void {\r\n    this._variables.update(vars => {\r\n      const { [key]: removed, ...rest } = vars;\r\n      return rest;\r\n    });\r\n  }\r\n\r\n  removeConstant(key: string): void {\r\n    this._constants.update(consts => {\r\n      const { [key]: removed, ...rest } = consts;\r\n      return rest;\r\n    });\r\n  }\r\n\r\n  getVariable(key: string): string | undefined {\r\n    return this._variables()[key];\r\n  }\r\n\r\n  getConstant(key: string): string | undefined {\r\n    return this._constants()[key];\r\n  }\r\n\r\n  hasVariable(key: string): boolean {\r\n    return key in this._variables();\r\n  }\r\n\r\n  hasConstant(key: string): boolean {\r\n    return key in this._constants();\r\n  }\r\n\r\n  clearVariables(): void {\r\n    this._variables.set({});\r\n  }\r\n\r\n  clearConstants(): void {\r\n    this._constants.set({});\r\n  }\r\n\r\n  clearAll(): void {\r\n    this.clearVariables();\r\n    this.clearConstants();\r\n  }\r\n\r\n  validateKey(key: string, type: 'variable' | 'constant'): string | undefined {\r\n    if (!key || key.trim().length === 0) return 'Key cannot be empty';\r\n    if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\r\n      return 'Key must start with a letter or underscore and contain only letters, numbers, and underscores';\r\n    }\r\n    const reserved = ['if', 'else', 'switch', 'case', 'default', 'for', 'while', 'do', 'function', 'return', 'var', 'let', 'const'];\r\n    if (reserved.includes(key.toLowerCase())) return `\"${key}\" is a reserved keyword`;\r\n    return undefined;\r\n  }\r\n\r\n  getVariableKeys(): string[] {\r\n    return Object.keys(this._variables());\r\n  }\r\n\r\n  getConstantKeys(): string[] {\r\n    return Object.keys(this._constants());\r\n  }\r\n\r\n  interpolate(text: string, useConstants: boolean = true): string {\r\n    if (!text) return text;\r\n    let result = text;\r\n    const vars = this._variables();\r\n    Object.entries(vars).forEach(([key, value]) => {\r\n      const pattern = new RegExp(`\\\\$\\\\{${key}\\\\}`, 'g');\r\n      result = result.replace(pattern, value);\r\n    });\r\n\r\n    if (useConstants) {\r\n      const consts = this._constants();\r\n      Object.entries(consts).forEach(([key, value]) => {\r\n        const pattern = new RegExp(`\\\\$\\\\{${key}\\\\}`, 'g');\r\n        result = result.replace(pattern, value);\r\n      });\r\n    }\r\n\r\n    return result;\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nexport interface MarkerContext {\r\n  workflowId?: string;\r\n  userId?: string;\r\n  organizationId?: string;\r\n  timestamp?: Date;\r\n  [key: string]: any;\r\n}\r\n\r\nexport type MarkerProcessor = (context?: MarkerContext) => any;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SpecialMarkersService {\r\n  private readonly markers: Record<string, MarkerProcessor> = {\r\n    'AUTO_GENERATE_UUID': () => {\r\n      const uuid = this.generateUUID();\r\n      return `/api/workflow/${uuid}`;\r\n    },\r\n    'UUID': () => this.generateUUID(),\r\n    'CURRENT_TIMESTAMP': () => new Date().toISOString(),\r\n    'CURRENT_DATE': () => new Date().toISOString().split('T')[0],\r\n    'WORKFLOW_ID': (context?: MarkerContext) => context?.workflowId ?? '',\r\n    'USER_ID': (context?: MarkerContext) => context?.userId ?? '',\r\n    'ORGANIZATION_ID': (context?: MarkerContext) => context?.organizationId ?? '',\r\n    'RANDOM_NUMBER': () => Math.floor(Math.random() * 9000) + 1000,\r\n    'EMPTY_STRING': () => '',\r\n    'NULL': () => null\r\n  };\r\n\r\n  processValue(value: any, context?: MarkerContext): any {\r\n    if (!this.isSpecialMarker(value)) return value;\r\n    const markerName = value.slice(2, -2).trim();\r\n    const processor = this.markers[markerName];\r\n    return processor ? processor(context) : value;\r\n  }\r\n\r\n  processNodeDefaults(properties: any[], context?: MarkerContext): Record<string, any> {\r\n    const defaults: Record<string, any> = {};\r\n    properties.forEach(field => {\r\n      if (field?.default !== undefined) {\r\n        defaults[field.key] = this.processValue(field.default, context);\r\n      }\r\n    });\r\n    return defaults;\r\n  }\r\n\r\n  processObject(obj: Record<string, any>, context?: MarkerContext): Record<string, any> {\r\n    const result: Record<string, any> = {};\r\n    for (const [key, value] of Object.entries(obj)) {\r\n      if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n        result[key] = this.processObject(value, context);\r\n      } else if (Array.isArray(value)) {\r\n        result[key] = value.map(item => typeof item === 'object' ? this.processObject(item, context) : this.processValue(item, context));\r\n      } else {\r\n        result[key] = this.processValue(value, context);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  isSpecialMarker(value: any): boolean {\r\n    return typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}') && value.length > 4;\r\n  }\r\n\r\n  getAvailableMarkers(): string[] {\r\n    return Object.keys(this.markers);\r\n  }\r\n\r\n  hasMarker(markerName: string): boolean {\r\n    return markerName in this.markers;\r\n  }\r\n\r\n  private generateUUID(): string {\r\n    if (typeof crypto !== 'undefined' && (crypto as any).randomUUID) {\r\n      return (crypto as any).randomUUID();\r\n    }\r\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n      const r = Math.random() * 16 | 0;\r\n      const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n      return v.toString(16);\r\n    });\r\n  }\r\n\r\n  registerMarker(name: string, processor: MarkerProcessor): void {\r\n    this.markers[name] = processor;\r\n  }\r\n}\r\n","import {\r\n  NodeTypeConfig,\r\n  GenericSelectorOptions,\r\n  DynamicSelectOptions,\r\n  PaletteCategoryConfig,\r\n} from '../workflow-designer.interfaces';\r\n\r\nexport const PALETTE_CATEGORIES: PaletteCategoryConfig[] = [\r\n  { id: 'triggers', label: 'Triggers', icon: '⚡', headerClass: 'text-amber-700', filterPrefix: 'trigger.' },\r\n  { id: 'controls', label: 'Controls', icon: '🧭', headerClass: 'text-sky-700', filterPrefix: 'control.' },\r\n  { id: 'actions', label: 'Actions', icon: '🎯', headerClass: 'text-emerald-700', filterPrefix: 'action.' },\r\n  { id: 'terminals', label: 'Terminals', icon: '⛔', headerClass: 'text-slate-700', filterPrefix: 'end.' },\r\n  { id: 'utility', label: 'Utility', icon: '🔧', headerClass: 'text-purple-700', filterPrefix: ['var.', 'audit.', 'utility.'] },\r\n];\r\n\r\n// Minimal starter set. Full set remains in the app copy until we swap imports.\r\nexport const WORKFLOW_NODES_CONFIG: NodeTypeConfig[] = [\r\n  {\r\n    type: 'trigger.manual',\r\n    category: 'trigger',\r\n    label: 'Manual Trigger',\r\n    description: 'Start workflow manually by user action',\r\n    icon: \"<span class='material-icons'>play_arrow</span>\",\r\n    color: 'bg-amber-100 border-amber-300 text-amber-800',\r\n    nodeColor: 'bg-amber-50 border-amber-200',\r\n    properties: [\r\n      { key: 'label', label: 'Trigger Name', type: 'text', required: true, placeholder: 'Emergency Alert', default: 'Manual Trigger' }\r\n    ],\r\n    exits: ['next']\r\n  },\r\n  {\r\n    type: 'control.if',\r\n    category: 'control',\r\n    label: 'If / Else',\r\n    description: 'Conditional branching based on expression',\r\n    icon: \"<span class='material-icons'>call_split</span>\",\r\n    color: 'bg-sky-100 border-sky-300 text-sky-800',\r\n    nodeColor: 'bg-sky-50 border-sky-200',\r\n    properties: [\r\n      { key: 'condition', label: 'Condition', type: 'text', required: true, placeholder: 'a > b', helpText: 'JavaScript expression that evaluates to true/false' }\r\n    ],\r\n    exits: ['onTrue', 'onFalse']\r\n  },\r\n  {\r\n    type: 'action.sms',\r\n    category: 'action',\r\n    label: 'SMS',\r\n    description: 'Send SMS message to recipients',\r\n    icon: \"<span class='material-icons'>sms</span>\",\r\n    color: 'bg-emerald-100 border-emerald-300 text-emerald-800',\r\n    nodeColor: 'bg-emerald-50 border-emerald-200',\r\n    properties: [\r\n      { key: 'message', label: 'Message', type: 'textarea', required: true, placeholder: 'Alert message' }\r\n    ],\r\n    exits: ['onSuccess', 'onFailure']\r\n  },\r\n  {\r\n    type: 'end.terminate',\r\n    category: 'terminal',\r\n    label: 'End',\r\n    description: 'Terminate workflow',\r\n    icon: \"<span class='material-icons'>stop</span>\",\r\n    color: 'bg-slate-100 border-slate-300 text-slate-800',\r\n    nodeColor: 'bg-slate-50 border-slate-200',\r\n    properties: [],\r\n    exits: []\r\n  }\r\n];\r\n","import { Injectable, signal, computed, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { NodeTypeConfig, WorkflowNodesConfig, PaletteItem } from './workflow-designer.interfaces';\r\nimport { WORKFLOW_NODES_CONFIG } from './config/workflow-nodes-config.data';\r\nimport { WORKFLOW_NODE_TYPES } from '../core/workflow-node-types.token';\r\nimport { WORKFLOW_LIB_CONFIG, WorkflowDesignerLibConfig } from '../core/workflow-lib.config';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkflowNodesConfigService {\r\n  private http = inject(HttpClient);\r\n  private libConfig = inject(WORKFLOW_LIB_CONFIG, { optional: true }) as WorkflowDesignerLibConfig | null;\r\n\r\n  private nodeTypesConfig = signal<NodeTypeConfig[]>([]);\r\n  private configLoaded = signal<boolean>(false);\r\n\r\n  // Optional extra node types provided by host application\r\n  private extraNodeTypes = inject(WORKFLOW_NODE_TYPES, { optional: true }) as NodeTypeConfig[] | null;\r\n\r\n  constructor() { this.loadConfiguration(); }\r\n\r\n  private async loadConfiguration(): Promise<void> {\r\n    const source = (this.libConfig as any)?.nodesConfig?.source as 'ts' | 'json' | undefined;\r\n    const jsonUrl = (this.libConfig as any)?.nodesConfig?.jsonUrl as string | undefined;\r\n    const providedNodeTypes = (this.libConfig as any)?.palette?.nodeTypes as NodeTypeConfig[] | undefined;\r\n\r\n    // Highest precedence: node types provided directly via lib config (palette.nodeTypes)\r\n    if (Array.isArray(providedNodeTypes) && providedNodeTypes.length > 0) {\r\n      this.nodeTypesConfig.set(this.mergeWithExtraTypes(providedNodeTypes));\r\n      this.configLoaded.set(true);\r\n      return;\r\n    }\r\n\r\n    if (source === 'json' && jsonUrl) {\r\n      try {\r\n        const config = await firstValueFrom(this.http.get<WorkflowNodesConfig>(jsonUrl));\r\n        this.nodeTypesConfig.set(this.mergeWithExtraTypes(config.nodeTypes));\r\n        this.configLoaded.set(true);\r\n        return;\r\n      } catch (error) {\r\n        console.error('Failed to load workflow nodes configuration from JSON, falling back to TS:', error);\r\n      }\r\n    }\r\n\r\n    // Default: TypeScript configuration\r\n    const base = WORKFLOW_NODES_CONFIG;\r\n    this.nodeTypesConfig.set(this.mergeWithExtraTypes(base));\r\n    this.configLoaded.set(true);\r\n  }\r\n\r\n  private mergeWithExtraTypes(base: NodeTypeConfig[]): NodeTypeConfig[] {\r\n  const extras = (this.extraNodeTypes as NodeTypeConfig[] | null) || [];\r\n    if (!extras.length) return base;\r\n\r\n    const byType = new Map(base.map((c) => [c.type, c] as const));\r\n    for (const ext of extras) {\r\n      const existing = byType.get(ext.type);\r\n      if (existing) byType.set(ext.type, { ...existing, ...ext });\r\n      else byType.set(ext.type, ext);\r\n    }\r\n    return Array.from(byType.values());\r\n  }\r\n\r\n  getNodeTypesConfig(): NodeTypeConfig[] {\r\n    return this.nodeTypesConfig();\r\n  }\r\n\r\n  getNodeTypeConfig(type: string): NodeTypeConfig | undefined {\r\n    return this.nodeTypesConfig().find(config => config.type === type);\r\n  }\r\n\r\n  getPalette = computed<PaletteItem[]>(() =>\r\n    this.nodeTypesConfig().map(config => ({ type: config.type, label: config.label, color: config.color }))\r\n  );\r\n\r\n  getTypeIcons = computed<Record<string, string>>(() => {\r\n    const icons: Record<string, string> = {};\r\n    this.nodeTypesConfig().forEach(config => { icons[config.type] = config.icon; });\r\n    return icons;\r\n  });\r\n\r\n  getNodeColors = computed<Record<string, string>>(() => {\r\n    const colors: Record<string, string> = {};\r\n    this.nodeTypesConfig().forEach(config => { colors[config.type] = config.nodeColor; });\r\n    return colors;\r\n  });\r\n\r\n  isConfigLoaded(): boolean { return this.configLoaded(); }\r\n\r\n  getNodesByCategory(category: 'trigger' | 'control' | 'action' | 'terminal' | 'utility'): NodeTypeConfig[] {\r\n    return this.nodeTypesConfig().filter(config => config.category === category);\r\n  }\r\n}\r\n","import { Injectable, signal, computed, inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport {\r\n  WorkflowNode,\r\n  WorkflowEdge,\r\n  PaletteItem,\r\n  DragState,\r\n  WorkflowExport,\r\n  WorkflowHistoryState,\r\n  NODE_SIZE,\r\n} from './workflow-designer.interfaces';\r\nimport { WorkflowApiService, ApiWorkflow } from '../core/services/workflow-api.service';\r\nimport { WorkflowHistoryService } from './workflow-history.service';\r\nimport { WorkflowNodesConfigService } from './workflow-nodes-config.service';\r\nimport { WorkflowVariablesService } from './workflow-variables.service';\r\nimport { SpecialMarkersService } from './special-markers.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkflowDesignerService {\r\n  // State management with Angular signals\r\n  nodes = signal<WorkflowNode[]>([]);\r\n  edges = signal<WorkflowEdge[]>([]);\r\n  selectedNodeId = signal<string | null>(null);\r\n  selectedEdgeId = signal<string | null>(null);\r\n  connectFrom = signal<string | null>(null);\r\n  connectFromExitPoint = signal<string | null>(null); // Track which exit point was clicked\r\n  isConnectMode = signal<boolean>(false);\r\n  zoom = signal<number>(1);\r\n  showTemplatesDropdown = signal<boolean>(false);\r\n  panOffsetX = signal<number>(0);\r\n  panOffsetY = signal<number>(0);\r\n  currentWorkflowId = signal<string>('workflow');\r\n  currentWorkflow = signal<Partial<ApiWorkflow> | null>(null);\r\n  templateIds = signal<string[]>([]);\r\n  templates = signal<ApiWorkflow[]>([]);\r\n  isFullscreen = signal<boolean>(false);\r\n\r\n  // Validation state\r\n  showValidationDialog = signal<boolean>(false);\r\n  validationResult = signal<{ success: boolean; errors: string[] } | null>(null);\r\n  invalidFields = signal<Map<string, string[]>>(new Map());\r\n  unconnectedExits = signal<Map<string, string[]>>(new Map());\r\n  unconnectedInputs = signal<Set<string>>(new Set());\r\n\r\n  // Services\r\n  private router = inject(Router, { optional: true });\r\n\r\n  // Drag state\r\n  private dragState: DragState = { draggingId: null, dx: 0, dy: 0 };\r\n  private panState = { isPanning: false, startX: 0, startY: 0, lastPanX: 0, lastPanY: 0 };\r\n\r\n  // Zoom constraints\r\n  private readonly MIN_ZOOM = 0.25;\r\n  private readonly MAX_ZOOM = 2.5;\r\n  private readonly ZOOM_STEP = 1.1; // multiplicative step\r\n\r\n  // Constants\r\n  readonly NODE_SIZE = NODE_SIZE;\r\n\r\n  // Computed properties from configuration service\r\n  readonly PALETTE = computed<PaletteItem[]>(() => {\r\n    if (this.configService.isConfigLoaded()) {\r\n      return this.configService.getPalette();\r\n    }\r\n    return [\r\n      { type: 'trigger.manual', label: 'Manual Trigger', color: 'bg-amber-100 border-amber-300' },\r\n      { type: 'control.if', label: 'If / Else', color: 'bg-sky-100 border-sky-300' },\r\n      { type: 'control.switch', label: 'Switch', color: 'bg-sky-100 border-sky-300' },\r\n      { type: 'action.sms', label: 'SMS', color: 'bg-emerald-100 border-emerald-300' },\r\n      { type: 'end.terminate', label: 'End', color: 'bg-slate-100 border-slate-300' },\r\n    ];\r\n  });\r\n\r\n  readonly TYPE_ICONS = computed<Record<string, string>>(() => {\r\n    if (this.configService.isConfigLoaded()) {\r\n      return this.configService.getTypeIcons();\r\n    }\r\n    return {\r\n      'trigger.manual': '⚡',\r\n      'trigger.webhook': '🔗',\r\n      'control.if': '�',\r\n      'control.switch': '🧭',\r\n      'action.sms': '💬',\r\n      'action.email': '✉️',\r\n      'end.terminate': '⛔',\r\n    };\r\n  });\r\n\r\n  // Computed properties\r\n  selectedNode = computed(() => {\r\n    const id = this.selectedNodeId();\r\n    return this.nodes().find((n: WorkflowNode) => n.id === id) || null;\r\n  });\r\n\r\n  selectedEdge = computed(() => {\r\n    const id = this.selectedEdgeId();\r\n    return this.edges().find((e: WorkflowEdge) => e.id === id) || null;\r\n  });\r\n\r\n  constructor(\r\n    private workflowApi: WorkflowApiService,\r\n    private historyService: WorkflowHistoryService,\r\n    private configService: WorkflowNodesConfigService,\r\n    private variablesService: WorkflowVariablesService,\r\n    private specialMarkersService: SpecialMarkersService,\r\n  ) {\r\n    this.setupMouseListeners();\r\n    this.loadTemplateIds();\r\n    this.saveStateToHistory('Initial state');\r\n  }\r\n\r\n  // History service capabilities\r\n  canUndo = computed(() => this.historyService.canUndo());\r\n  canRedo = computed(() => this.historyService.canRedo());\r\n\r\n  // Conversion methods between API and internal formats\r\n  private convertApiWorkflowToInternal(apiWorkflow: ApiWorkflow, preserveIdentity: boolean = false): void {\r\n    const nodes: WorkflowNode[] = apiWorkflow.nodes.map((node) => ({\r\n      id: node.id,\r\n      type: node.type,\r\n      label: node.data.label,\r\n      x: node.position.x,\r\n      y: node.position.y,\r\n      params: node.data.params || {},\r\n    }));\r\n\r\n    const edges: WorkflowEdge[] = apiWorkflow.edges.map((edge) => ({\r\n      id: edge.id,\r\n      from: edge.source,\r\n      to: edge.target,\r\n      exitPoint: edge.data?.['exitPoint'],\r\n    }));\r\n\r\n    this.nodes.set(nodes);\r\n    this.edges.set(edges);\r\n\r\n    if (!preserveIdentity) {\r\n      this.currentWorkflowId.set(apiWorkflow.workflowId.toString());\r\n      this.currentWorkflow.set(apiWorkflow);\r\n    } else {\r\n      const currentWorkflow = this.currentWorkflow();\r\n      if (currentWorkflow) {\r\n        this.currentWorkflow.set({\r\n          ...currentWorkflow,\r\n          metadata: apiWorkflow.metadata,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (apiWorkflow.variables) {\r\n      this.variablesService.setVariables(apiWorkflow.variables);\r\n    } else {\r\n      this.variablesService.clearVariables();\r\n    }\r\n  }\r\n\r\n  private convertInternalToApiWorkflow(\r\n    name: string,\r\n    description?: string,\r\n  ): Omit<ApiWorkflow, 'workflowId' | 'createdAt' | 'modifiedAt' | 'isDeleted'> {\r\n    const currentNodes = this.nodes();\r\n    const currentEdges = this.edges();\r\n    const variables = this.variablesService.variables();\r\n\r\n    return {\r\n      name,\r\n      description,\r\n      nodes: currentNodes.map((node) => ({\r\n        id: node.id,\r\n        type: node.type,\r\n        position: { x: node.x, y: node.y },\r\n        data: {\r\n          label: node.label,\r\n          icon: this.getTypeIcon(node.type),\r\n          params: node.params,\r\n        },\r\n      })),\r\n      edges: currentEdges.map((edge) => ({\r\n        id: edge.id,\r\n        source: edge.from,\r\n        target: edge.to,\r\n        data: edge.exitPoint ? { exitPoint: edge.exitPoint } : {},\r\n      })),\r\n      variables,\r\n      metadata: {\r\n        category: 'user-created',\r\n        priority: 'medium',\r\n        author: 'workflow-designer',\r\n        version: '1.0',\r\n      },\r\n    };\r\n  }\r\n\r\n  // Helper methods\r\n  private uid(prefix = 'n'): string {\r\n    return `${prefix}_${Math.random().toString(36).slice(2, 8)}`;\r\n  }\r\n\r\n  addNode(type: string, opts: Partial<WorkflowNode> = {}): void {\r\n    const meta = this.PALETTE().find((p: PaletteItem) => p.type === type);\r\n    const id = this.uid('node');\r\n    const currentNodes = this.nodes();\r\n    const baseX = 120 + currentNodes.length * 24;\r\n    const baseY = 80 + currentNodes.length * 16;\r\n\r\n    const nodeTypeConfig = this.configService.getNodeTypeConfig(type);\r\n\r\n    let processedDefaults = {} as Record<string, any>;\r\n    if (nodeTypeConfig && nodeTypeConfig.properties) {\r\n      processedDefaults = this.specialMarkersService.processNodeDefaults(nodeTypeConfig.properties, {\r\n        workflowId: this.currentWorkflowId(),\r\n        timestamp: new Date(),\r\n      });\r\n    }\r\n\r\n    const node: WorkflowNode = {\r\n      id,\r\n      type,\r\n      label: opts.label || meta?.label || type,\r\n      x: opts.x ?? baseX,\r\n      y: opts.y ?? baseY,\r\n      params: { ...processedDefaults, ...(opts.params || {}) },\r\n    };\r\n\r\n    this.nodes.update((nodes: WorkflowNode[]) => [...nodes, node]);\r\n    this.selectedNodeId.set(id);\r\n    this.saveStateToHistory(`Added node: ${node.label}`);\r\n  }\r\n\r\n  removeNode(id: string): void {\r\n    const nodeToRemove = this.nodes().find((n) => n.id === id);\r\n    const nodeLabel = nodeToRemove?.label || 'node';\r\n    this.nodes.update((nodes: WorkflowNode[]) => nodes.filter((n) => n.id !== id));\r\n    this.edges.update((edges: WorkflowEdge[]) => edges.filter((e) => e.from !== id && e.to !== id));\r\n    if (this.selectedNodeId() === id) {\r\n      this.selectedNodeId.set(null);\r\n    }\r\n    this.saveStateToHistory(`Removed node: ${nodeLabel}`);\r\n  }\r\n\r\n  duplicateNode(id: string): void {\r\n    const currentNodes = this.nodes();\r\n    const nodeToDuplicate = currentNodes.find((n) => n.id === id);\r\n    if (!nodeToDuplicate) return;\r\n\r\n    const newId = this.uid('node');\r\n    const duplicatedNode: WorkflowNode = {\r\n      ...nodeToDuplicate,\r\n      id: newId,\r\n      x: nodeToDuplicate.x + 150,\r\n      y: nodeToDuplicate.y + 50,\r\n      label: `${nodeToDuplicate.label} (Copy)`,\r\n    };\r\n\r\n    this.nodes.update((nodes: WorkflowNode[]) => [...nodes, duplicatedNode]);\r\n    this.selectedNodeId.set(newId);\r\n    this.saveStateToHistory(`Duplicated node: ${nodeToDuplicate.label}`);\r\n  }\r\n\r\n  removeEdge(id: string): void {\r\n    this.edges.update((edges: WorkflowEdge[]) => edges.filter((e) => e.id !== id));\r\n    if (this.selectedEdgeId() === id) {\r\n      this.selectedEdgeId.set(null);\r\n    }\r\n    this.saveStateToHistory('Removed connection');\r\n  }\r\n\r\n  startConnect(fromId: string, exitPoint?: string): void {\r\n    if (!this.isConnectMode()) return;\r\n\r\n    const currentConnectFrom = this.connectFrom();\r\n    if (currentConnectFrom && currentConnectFrom !== fromId) {\r\n      const currentEdges = this.edges();\r\n      const fromNode = this.nodes().find((n) => n.id === currentConnectFrom);\r\n      const toNode = this.nodes().find((n) => n.id === fromId);\r\n\r\n      const storedExitPoint = this.connectFromExitPoint();\r\n\r\n      const sameExitExists = currentEdges.some(\r\n        (e: WorkflowEdge) => e.from === currentConnectFrom && e.to === fromId && e.exitPoint === storedExitPoint,\r\n      );\r\n      const reverseExists = currentEdges.some((e: WorkflowEdge) => e.from === fromId && e.to === currentConnectFrom);\r\n\r\n      if (!sameExitExists && !reverseExists) {\r\n        this.edges.update((edges: WorkflowEdge[]) => [\r\n          ...edges,\r\n          {\r\n            id: this.uid('edge'),\r\n            from: currentConnectFrom,\r\n            to: fromId,\r\n            exitPoint: storedExitPoint || 'next',\r\n          },\r\n        ]);\r\n        const fromLabel = fromNode?.label || 'node';\r\n        const toLabel = toNode?.label || 'node';\r\n        const exitLabel = storedExitPoint ? ` (${storedExitPoint})` : '';\r\n        this.saveStateToHistory(`Connected ${fromLabel}${exitLabel} → ${toLabel}`);\r\n      }\r\n      this.connectFrom.set(null);\r\n      this.connectFromExitPoint.set(null);\r\n      this.isConnectMode.set(false);\r\n      return;\r\n    }\r\n\r\n    this.connectFrom.set(fromId);\r\n    this.connectFromExitPoint.set(exitPoint || 'next');\r\n  }\r\n\r\n  cancelConnection(): void {\r\n    this.connectFrom.set(null);\r\n    this.connectFromExitPoint.set(null);\r\n    this.isConnectMode.set(false);\r\n  }\r\n\r\n  setDragState(nodeId: string, offsetX: number, offsetY: number): void {\r\n    this.dragState = { draggingId: nodeId, dx: offsetX, dy: offsetY };\r\n  }\r\n\r\n  getDragState(): DragState {\r\n    return this.dragState;\r\n  }\r\n\r\n  clearDragState(): void {\r\n    const wasDragging = this.dragState.draggingId !== null;\r\n    const draggedNodeId = this.dragState.draggingId;\r\n    this.dragState.draggingId = null;\r\n\r\n    if (wasDragging && draggedNodeId) {\r\n      const movedNode = this.nodes().find((n) => n.id === draggedNodeId);\r\n      const nodeLabel = movedNode?.label || 'node';\r\n      this.saveStateToHistory(`Moved ${nodeLabel}`);\r\n    }\r\n  }\r\n\r\n  updateNodePosition(nodeId: string, x: number, y: number): void {\r\n    this.nodes.update((nodes: WorkflowNode[]) => nodes.map((n) => (n.id === nodeId ? { ...n, x, y } : n)));\r\n  }\r\n\r\n  // Pan methods\r\n  startPan(clientX: number, clientY: number): void {\r\n    this.panState.isPanning = true;\r\n    this.panState.startX = clientX;\r\n    this.panState.startY = clientY;\r\n    this.panState.lastPanX = this.panOffsetX();\r\n    this.panState.lastPanY = this.panOffsetY();\r\n  }\r\n\r\n  updatePan(clientX: number, clientY: number): void {\r\n    if (!this.panState.isPanning) return;\r\n\r\n    const deltaX = clientX - this.panState.startX;\r\n    const deltaY = clientY - this.panState.startY;\r\n\r\n    this.panOffsetX.set(this.panState.lastPanX + deltaX);\r\n    this.panOffsetY.set(this.panState.lastPanY + deltaY);\r\n  }\r\n\r\n  stopPan(): void {\r\n    this.panState.isPanning = false;\r\n  }\r\n\r\n  isPanning(): boolean {\r\n    return this.panState.isPanning;\r\n  }\r\n\r\n  // New zoom helper keeping cursor focus stable\r\n  zoomAt(deltaY: number, worldX: number, worldY: number): void {\r\n    const current = this.zoom();\r\n    const direction = deltaY < 0 ? 1 : -1; // wheel up => zoom in\r\n    let target = direction > 0 ? current * this.ZOOM_STEP : current / this.ZOOM_STEP;\r\n    target = Math.min(this.MAX_ZOOM, Math.max(this.MIN_ZOOM, target));\r\n    if (target === current) return;\r\n\r\n    const panX = this.panOffsetX();\r\n    const panY = this.panOffsetY();\r\n    const scaleRatio = current / target;\r\n\r\n    const newPanX = (panX + worldX) * scaleRatio - worldX;\r\n    const newPanY = (panY + worldY) * scaleRatio - worldY;\r\n\r\n    this.zoom.set(target);\r\n    this.panOffsetX.set(newPanX);\r\n    this.panOffsetY.set(newPanY);\r\n  }\r\n\r\n  zoomIn(centerWorldX = 0, centerWorldY = 0): void {\r\n    this.zoomAt(-100, centerWorldX, centerWorldY);\r\n  }\r\n  zoomOut(centerWorldX = 0, centerWorldY = 0): void {\r\n    this.zoomAt(100, centerWorldX, centerWorldY);\r\n  }\r\n\r\n  private setupMouseListeners(): void {\r\n    // kept for backwards compatibility; canvas handles listeners\r\n  }\r\n\r\n  exportJson(): void {\r\n    const currentNodes = this.nodes();\r\n    const currentEdges = this.edges();\r\n    const workflowId = this.currentWorkflowId() || 'workflow';\r\n\r\n    const graph: WorkflowExport = {\r\n      workflowId: workflowId,\r\n      version: 1,\r\n      nodes: currentNodes.map((n: WorkflowNode) => ({\r\n        id: n.id,\r\n        type: n.type,\r\n        label: n.label,\r\n        params: n.params,\r\n        next: currentEdges.filter((e: WorkflowEdge) => e.from === n.id).map((e: WorkflowEdge) => e.to),\r\n      })),\r\n      variables: {},\r\n    };\r\n\r\n    const blob = new Blob([JSON.stringify(graph, null, 2)], { type: 'application/json' });\r\n    const url = URL.createObjectURL(blob);\r\n    const a = document.createElement('a');\r\n    a.href = url;\r\n    a.download = `${workflowId}.json`;\r\n    a.click();\r\n    URL.revokeObjectURL(url);\r\n  }\r\n\r\n  importJson(workflowData: WorkflowExport | ApiWorkflow): void {\r\n    try {\r\n      if ('nodes' in workflowData && Array.isArray(workflowData.nodes) && workflowData.nodes.length > 0) {\r\n        const firstNode = workflowData.nodes[0] as any;\r\n\r\n        if (firstNode.position && typeof firstNode.position.x === 'number') {\r\n          this.convertApiWorkflowToInternal(workflowData as ApiWorkflow, true);\r\n          this.saveStateToHistory('Imported workflow from JSON');\r\n          return;\r\n        }\r\n\r\n        if (typeof firstNode.x === 'number' && typeof firstNode.y === 'number') {\r\n          this.resetAll();\r\n\r\n          const nodes: WorkflowNode[] = workflowData.nodes.map((n: any) => ({\r\n            id: n.id,\r\n            type: n.type,\r\n            label: n.label || n.type.split('.').pop() || 'Node',\r\n            params: n.params || {},\r\n            x: n.x || 100,\r\n            y: n.y || 100,\r\n          }));\r\n\r\n          const edges: WorkflowEdge[] = [];\r\n          (workflowData as any).nodes.forEach((n: any) => {\r\n            if (n.next && Array.isArray(n.next)) {\r\n              n.next.forEach((targetId: string, index: number) => {\r\n                edges.push({ id: `edge_${n.id}_${targetId}_${index}`, from: n.id, to: targetId });\r\n              });\r\n            }\r\n          });\r\n\r\n          this.nodes.set(nodes);\r\n          this.edges.set(edges);\r\n          this.saveStateToHistory('Imported workflow from JSON (legacy format with positions)');\r\n          return;\r\n        }\r\n\r\n        const exportData = workflowData as WorkflowExport;\r\n        this.resetAll();\r\n\r\n        const nodes: WorkflowNode[] = exportData.nodes.map((n: any, index: number) => ({\r\n          id: n.id,\r\n          type: n.type,\r\n          label: n.label || n.type.split('.').pop() || 'Node',\r\n          params: n.params || {},\r\n          x: 100 + (index % 3) * 200,\r\n          y: 100 + Math.floor(index / 3) * 150,\r\n        }));\r\n\r\n        const edges: WorkflowEdge[] = [];\r\n        exportData.nodes.forEach((n: any) => {\r\n          if (n.next && Array.isArray(n.next)) {\r\n            n.next.forEach((targetId: string, index: number) => {\r\n              edges.push({ id: `edge_${n.id}_${targetId}_${index}`, from: n.id, to: targetId });\r\n            });\r\n          }\r\n        });\r\n\r\n        this.nodes.set(nodes);\r\n        this.edges.set(edges);\r\n        this.saveStateToHistory('Imported workflow from JSON (legacy format)');\r\n      } else {\r\n        console.error('Invalid workflow format - no nodes found');\r\n        throw new Error('Invalid workflow format');\r\n      }\r\n    } catch (error) {\r\n      console.error('Error importing workflow:', error);\r\n      if (error instanceof Error && error.message === 'Invalid workflow format') {\r\n        throw error;\r\n      }\r\n      console.warn('Import completed with warnings:', error);\r\n    }\r\n  }\r\n\r\n  toggleFullscreen(): void {\r\n    this.isFullscreen.update((current) => !current);\r\n  }\r\n\r\n  async saveToApi(): Promise<{ success: boolean; message: string }> {\r\n    const validation = this.validateWorkflow();\r\n    if (!validation.isValid) {\r\n      return { success: false, message: `Validation failed: ${validation.errors.join(', ')}` };\r\n    }\r\n\r\n    const workflow = this.currentWorkflow();\r\n    if (!workflow) return { success: false, message: 'No workflow data available' };\r\n\r\n    const success = await this.saveWorkflow(workflow.name || 'Untitled Workflow', workflow.description);\r\n\r\n    if (success) {\r\n      await this.loadTemplateIds();\r\n      return { success: true, message: `Workflow \"${workflow.name}\" saved successfully` };\r\n    } else {\r\n      return { success: false, message: `Failed to save workflow \"${workflow.name}\"` };\r\n    }\r\n  }\r\n\r\n  async refreshTemplateIds(): Promise<void> {\r\n    await this.loadTemplateIds();\r\n  }\r\n\r\n  validate(): string[] {\r\n    const errors: string[] = [];\r\n    const currentNodes = this.nodes();\r\n    const currentEdges = this.edges();\r\n\r\n    const triggers = currentNodes.filter((n: WorkflowNode) => n.type.startsWith('trigger.'));\r\n    if (triggers.length === 0) errors.push('No trigger node found. Workflow must start with at least one trigger.');\r\n\r\n    const manualTriggers = currentNodes.filter((n: WorkflowNode) => n.type === 'trigger.manual');\r\n    if (manualTriggers.length > 1) errors.push(`Multiple manual triggers found (${manualTriggers.length}). Only one trigger.manual is allowed per workflow.`);\r\n\r\n    if (currentNodes.length === 0) {\r\n      errors.push('Workflow is empty. Add at least one node to continue.');\r\n      return errors;\r\n    }\r\n\r\n    const adjacency = new Map(currentNodes.map((n: WorkflowNode) => [n.id, [] as string[]]));\r\n    currentEdges.forEach((e: WorkflowEdge) => adjacency.get(e.from)?.push(e.to));\r\n\r\n    const visited = new Set<string>();\r\n    const queue = [...triggers.map((t) => t.id)];\r\n\r\n    while (queue.length) {\r\n      const cur = queue.shift()!;\r\n      if (visited.has(cur)) continue;\r\n      visited.add(cur);\r\n      for (const nxt of adjacency.get(cur) || []) queue.push(nxt);\r\n    }\r\n\r\n    const orphan = currentNodes.filter((n: WorkflowNode) => !visited.has(n.id));\r\n    if (orphan.length > 0) errors.push(`Orphan nodes not connected to any trigger: ${orphan.map((o) => o.label).join(', ')}`);\r\n\r\n    const unconnectedInputsSet = new Set<string>();\r\n    const nodesWithInputs = currentNodes.filter((n: WorkflowNode) => !n.type.startsWith('trigger.'));\r\n    nodesWithInputs.forEach((node: WorkflowNode) => {\r\n      const hasIncomingEdge = currentEdges.some((e: WorkflowEdge) => e.to === node.id);\r\n      if (!hasIncomingEdge) unconnectedInputsSet.add(node.id);\r\n    });\r\n    this.unconnectedInputs.set(unconnectedInputsSet);\r\n\r\n    const invalidFieldsMap = new Map<string, string[]>();\r\n    currentNodes.forEach((node: WorkflowNode) => {\r\n      const config = this.configService.getNodeTypeConfig(node.type);\r\n      if (!config) return;\r\n      const requiredFields = (config.properties || []).filter((p) => p.required);\r\n      const nodeInvalidFields: string[] = [];\r\n      requiredFields.forEach((field) => {\r\n        const value = node.params[field.key];\r\n        if (value === undefined || value === null || value === '') {\r\n          errors.push(`Node \"${node.label}\" is missing required field: ${field.label}`);\r\n          nodeInvalidFields.push(field.key);\r\n        }\r\n      });\r\n      if (nodeInvalidFields.length > 0) invalidFieldsMap.set(node.id, nodeInvalidFields);\r\n    });\r\n    this.invalidFields.set(invalidFieldsMap);\r\n\r\n    const terminalNodes = currentNodes.filter((n: WorkflowNode) => n.type.startsWith('end.'));\r\n    terminalNodes.forEach((node: WorkflowNode) => {\r\n      const outgoing = currentEdges.filter((e: WorkflowEdge) => e.from === node.id);\r\n      if (outgoing.length > 0) errors.push(`Terminal node \"${node.label}\" should not have outgoing connections`);\r\n    });\r\n\r\n    const unconnectedExitsMap = new Map<string, string[]>();\r\n    const nonTerminalNodes = currentNodes.filter((n: WorkflowNode) => !n.type.startsWith('end.') && !n.type.startsWith('trigger.'));\r\n    nonTerminalNodes.forEach((node: WorkflowNode) => {\r\n      const outgoing = currentEdges.filter((e: WorkflowEdge) => e.from === node.id);\r\n      const config = this.configService.getNodeTypeConfig(node.type);\r\n      const expectedExits = config?.exits || [];\r\n      if (expectedExits.length > 0 && outgoing.length === 0) errors.push(`Node \"${node.label}\" has no outgoing connections`);\r\n      if (expectedExits.length > 0) {\r\n        const connectedExits = new Set(outgoing.map((e) => e.exitPoint || 'next'));\r\n        const missingExits = expectedExits.filter((exitName) => !connectedExits.has(exitName));\r\n        if (missingExits.length > 0) {\r\n          errors.push(`Node \"${node.label}\" has unconnected exit points: ${missingExits.join(', ')}`);\r\n          unconnectedExitsMap.set(node.id, missingExits);\r\n        }\r\n      }\r\n    });\r\n    this.unconnectedExits.set(unconnectedExitsMap);\r\n\r\n    const labelCounts = new Map<string, number>();\r\n    currentNodes.forEach((node: WorkflowNode) => {\r\n      const count = labelCounts.get(node.label) || 0;\r\n      labelCounts.set(node.label, count + 1);\r\n    });\r\n    labelCounts.forEach((count, label) => {\r\n      if (count > 1) errors.push(`Duplicate node label \"${label}\" found ${count} times. Consider using unique labels.`);\r\n    });\r\n\r\n    currentEdges.forEach((edge: WorkflowEdge) => {\r\n      const sourceExists = currentNodes.some((n) => n.id === edge.from);\r\n      const targetExists = currentNodes.some((n) => n.id === edge.to);\r\n      if (!sourceExists) errors.push(`Edge ${edge.id} has missing source node`);\r\n      if (!targetExists) errors.push(`Edge ${edge.id} has missing target node`);\r\n    });\r\n\r\n    const detectCycle = (): boolean => {\r\n      const visited = new Set<string>();\r\n      const recStack = new Set<string>();\r\n      const hasCycle = (nodeId: string): boolean => {\r\n        if (!visited.has(nodeId)) {\r\n          visited.add(nodeId);\r\n          recStack.add(nodeId);\r\n          const neighbors = adjacency.get(nodeId) || [];\r\n          for (const neighbor of neighbors) {\r\n            if (!visited.has(neighbor) && hasCycle(neighbor)) return true;\r\n            else if (recStack.has(neighbor)) return true;\r\n          }\r\n        }\r\n        recStack.delete(nodeId);\r\n        return false;\r\n      };\r\n      for (const node of currentNodes) if (hasCycle(node.id)) return true;\r\n      return false;\r\n    };\r\n\r\n    if (detectCycle()) errors.push('Circular dependency detected. Workflow contains an infinite loop.');\r\n\r\n    if (terminalNodes.length === 0) errors.push('No terminal/end node found. Workflow should have at least one end point.');\r\n\r\n    return errors;\r\n  }\r\n\r\n  runValidate(): void {\r\n    const errors = this.validate();\r\n    this.validationResult.set({ success: errors.length === 0, errors });\r\n    this.showValidationDialog.set(true);\r\n    if (errors.length === 0) {\r\n      this.invalidFields.set(new Map());\r\n      this.unconnectedExits.set(new Map());\r\n      this.unconnectedInputs.set(new Set());\r\n    }\r\n  }\r\n\r\n  isFieldInvalid(nodeId: string, fieldKey: string): boolean {\r\n    const nodeInvalidFields = this.invalidFields().get(nodeId);\r\n    return nodeInvalidFields ? nodeInvalidFields.includes(fieldKey) : false;\r\n  }\r\n\r\n  isExitUnconnected(nodeId: string, exitPoint: string): boolean {\r\n    const nodeUnconnectedExits = this.unconnectedExits().get(nodeId);\r\n    return nodeUnconnectedExits ? nodeUnconnectedExits.includes(exitPoint) : false;\r\n  }\r\n\r\n  isInputUnconnected(nodeId: string): boolean {\r\n    return this.unconnectedInputs().has(nodeId);\r\n  }\r\n\r\n  clearInputHighlight(nodeId: string): void {\r\n    const currentSet = this.unconnectedInputs();\r\n    if (currentSet.has(nodeId)) {\r\n      const newSet = new Set(currentSet);\r\n      newSet.delete(nodeId);\r\n      this.unconnectedInputs.set(newSet);\r\n    }\r\n  }\r\n\r\n  clearExitHighlight(nodeId: string, exitPoint: string): void {\r\n    const currentMap = this.unconnectedExits();\r\n    const nodeExits = currentMap.get(nodeId);\r\n    if (nodeExits && nodeExits.includes(exitPoint)) {\r\n      const newMap = new Map(currentMap);\r\n      const filteredExits = nodeExits.filter((e) => e !== exitPoint);\r\n      if (filteredExits.length > 0) newMap.set(nodeId, filteredExits);\r\n      else newMap.delete(nodeId);\r\n      this.unconnectedExits.set(newMap);\r\n    }\r\n  }\r\n\r\n  clearFieldHighlight(nodeId: string, fieldKey: string): void {\r\n    const currentMap = this.invalidFields();\r\n    const nodeFields = currentMap.get(nodeId);\r\n    if (nodeFields && nodeFields.includes(fieldKey)) {\r\n      const newMap = new Map(currentMap);\r\n      const filteredFields = nodeFields.filter((f) => f !== fieldKey);\r\n      if (filteredFields.length > 0) newMap.set(nodeId, filteredFields);\r\n      else newMap.delete(nodeId);\r\n      this.invalidFields.set(newMap);\r\n    }\r\n  }\r\n\r\n  resetAll(): void {\r\n    this.nodes.set([]);\r\n    this.edges.set([]);\r\n    this.selectedNodeId.set(null);\r\n    this.selectedEdgeId.set(null);\r\n    this.connectFrom.set(null);\r\n    this.isConnectMode.set(false);\r\n    this.showTemplatesDropdown.set(false);\r\n\r\n    this.currentWorkflowId.set('new');\r\n\r\n    this.variablesService.clearAll();\r\n\r\n    const newWorkflow = {\r\n      id: 'new-workflow',\r\n      name: '',\r\n      description: '',\r\n      nodes: [],\r\n      edges: [],\r\n      metadata: { category: '', priority: '', author: '', version: '', approved: undefined, tags: [] },\r\n      createdAt: new Date().toISOString(),\r\n      updatedAt: new Date().toISOString(),\r\n    } as any;\r\n    this.currentWorkflow.set(newWorkflow);\r\n\r\n    this.historyService.clearHistory();\r\n  }\r\n\r\n  saveStateToHistory(description?: string): void {\r\n    const state: WorkflowHistoryState = {\r\n      nodes: this.nodes(),\r\n      edges: this.edges(),\r\n      selectedNodeId: this.selectedNodeId(),\r\n      selectedEdgeId: this.selectedEdgeId(),\r\n    };\r\n    this.historyService.saveState(state, description);\r\n  }\r\n\r\n  undo(): void {\r\n    const state = this.historyService.undo();\r\n    if (state) this.restoreState(state);\r\n  }\r\n\r\n  redo(): void {\r\n    const state = this.historyService.redo();\r\n    if (state) this.restoreState(state);\r\n  }\r\n\r\n  getHistoryStack() {\r\n    return this.historyService.getHistoryStack();\r\n  }\r\n\r\n  logHistory(): void {\r\n    const history = this.historyService.getHistoryStack();\r\n    console.group('📜 Workflow History');\r\n    console.log(`Total entries: ${history.length}`);\r\n    console.table(\r\n      history.map((h) => ({ '#': h.index, Current: h.isCurrent ? '→' : '', Description: h.description || '(no description)', Timestamp: h.timestamp ? new Date(h.timestamp).toLocaleTimeString() : '' })),\r\n    );\r\n    console.groupEnd();\r\n  }\r\n\r\n  private restoreState(state: WorkflowHistoryState): void {\r\n    this.nodes.set(state.nodes);\r\n    this.edges.set(state.edges);\r\n    this.selectedNodeId.set(state.selectedNodeId);\r\n    this.selectedEdgeId.set(state.selectedEdgeId);\r\n  }\r\n\r\n  clearHistory(): void {\r\n    this.historyService.clearHistory();\r\n  }\r\n\r\n  async loadTemplate(name: string): Promise<void> {\r\n    try {\r\n      const response = await firstValueFrom(this.workflowApi.getWorkflow(name));\r\n      if (response.errors.length === 0 && response.results) {\r\n        const workflow = (response.results as any).data || response.results;\r\n        this.resetAll();\r\n        this.convertApiWorkflowToInternal(workflow);\r\n        this.saveStateToHistory(`Loaded template: ${workflow.name || name}`);\r\n      } else {\r\n        console.warn('Template not found:', name, response.errors);\r\n      }\r\n    } catch (error) {\r\n      console.error('Error loading template:', error);\r\n    }\r\n  }\r\n\r\n  async listTemplateIds(): Promise<string[]> {\r\n    try {\r\n      const response = await firstValueFrom(this.workflowApi.getTemplates());\r\n      return response.map((workflow) => workflow.workflowId.toString());\r\n    } catch (error) {\r\n      console.error('Error fetching templates:', error);\r\n      return [];\r\n    }\r\n  }\r\n\r\n  private async loadTemplateIds(): Promise<void> {\r\n    try {\r\n      const templates = await firstValueFrom(this.workflowApi.getTemplates());\r\n      this.templates.set(templates);\r\n      this.templateIds.set(templates.map((t) => t.workflowId.toString()));\r\n    } catch (error) {\r\n      console.error('Error loading templates:', error);\r\n      this.templateIds.set([]);\r\n      this.templates.set([]);\r\n    }\r\n  }\r\n\r\n  getTemplateIds(): string[] {\r\n    return this.templateIds();\r\n  }\r\n\r\n  getTemplates(): ApiWorkflow[] {\r\n    return this.templates();\r\n  }\r\n\r\n  async saveWorkflow(name: string, description?: string): Promise<boolean> {\r\n    try {\r\n      const workflowData = this.convertInternalToApiWorkflow(name, description);\r\n      const currentId = this.currentWorkflowId();\r\n\r\n      if (currentId && currentId !== 'workflow' && currentId !== 'new') {\r\n        const response = await firstValueFrom(this.workflowApi.updateWorkflow(currentId, workflowData));\r\n        if (response.errors.length === 0 && response.results) {\r\n          const workflow = (response.results as any).data || response.results;\r\n          this.currentWorkflow.set(workflow);\r\n        }\r\n        return response.errors.length === 0;\r\n      } else {\r\n        const response = await firstValueFrom(this.workflowApi.createWorkflow(workflowData));\r\n        if (response.errors.length === 0 && response.results) {\r\n          const workflow = (response.results as any).data || response.results;\r\n          this.currentWorkflowId.set(workflow.workflowId.toString());\r\n          this.currentWorkflow.set(workflow);\r\n          // Update URL if router is available\r\n          if (this.router) {\r\n            this.router.navigate(['/'], { queryParams: { id: workflow.workflowId }, replaceUrl: true });\r\n          }\r\n        }\r\n        return response.errors.length === 0;\r\n      }\r\n    } catch (error) {\r\n      console.error('Error saving workflow:', error);\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async loadWorkflow(id: string): Promise<boolean> {\r\n    try {\r\n      const response = await firstValueFrom(this.workflowApi.getWorkflow(id));\r\n      if (response.errors.length === 0 && response.results) {\r\n        const workflow = (response.results as any).data || response.results;\r\n        this.resetAll();\r\n        this.convertApiWorkflowToInternal(workflow);\r\n        this.saveStateToHistory(`Loaded workflow: ${workflow.name || id}`);\r\n        return true;\r\n      }\r\n      return false;\r\n    } catch (error) {\r\n      console.error('Error loading workflow:', error);\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async deleteWorkflow(id: string): Promise<boolean> {\r\n    try {\r\n      const response = await firstValueFrom(this.workflowApi.deleteWorkflow(id));\r\n      if (response.errors.length === 0 && this.currentWorkflowId() === id) {\r\n        this.resetAll();\r\n        this.saveStateToHistory();\r\n      }\r\n      return response.errors.length === 0;\r\n    } catch (error) {\r\n      console.error('Error deleting workflow:', error);\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async getAllWorkflows(): Promise<ApiWorkflow[]> {\r\n    try {\r\n      const response = await firstValueFrom(this.workflowApi.getWorkflows({ limit: 100 }));\r\n      if (response.errors.length !== 0) return [];\r\n      let results: any = response.results;\r\n      if (results && Array.isArray(results.data)) results = results.data;\r\n      return (Array.isArray(results) ? results : []) as ApiWorkflow[];\r\n    } catch (error) {\r\n      console.error('Error fetching workflows:', error);\r\n      return [];\r\n    }\r\n  }\r\n\r\n  updateNode(id: string, patch: Partial<WorkflowNode>): void {\r\n    const node = this.nodes().find((n) => n.id === id);\r\n    const nodeLabel = node?.label || 'node';\r\n    this.nodes.update((nodes: WorkflowNode[]) => nodes.map((n) => (n.id === id ? { ...n, ...patch } : n)));\r\n    const fieldName = Object.keys(patch)[0] || 'field';\r\n    this.saveStateToHistory(`Updated ${nodeLabel} ${fieldName}`);\r\n  }\r\n\r\n  updateNodeSilent(id: string, patch: Partial<WorkflowNode>): void {\r\n    this.nodes.update((nodes: WorkflowNode[]) => nodes.map((n) => (n.id === id ? { ...n, ...patch } : n)));\r\n  }\r\n\r\n  updateParam(id: string, key: string, value: any): void {\r\n    const node = this.nodes().find((n) => n.id === id);\r\n    const nodeLabel = node?.label || 'node';\r\n    this.nodes.update((nodes: WorkflowNode[]) => nodes.map((n) => (n.id === id ? { ...n, params: { ...n.params, [key]: value } } : n)));\r\n    this.saveStateToHistory(`Updated ${nodeLabel} ${key}`);\r\n  }\r\n\r\n  updateParamSilent(id: string, key: string, value: any): void {\r\n    this.nodes.update((nodes: WorkflowNode[]) => nodes.map((n) => (n.id === id ? { ...n, params: { ...n.params, [key]: value } } : n)));\r\n  }\r\n\r\n  cssForType(type: string): string {\r\n    if (this.configService.isConfigLoaded()) {\r\n      const nodeColors = this.configService.getNodeColors();\r\n      if (nodeColors[type]) return nodeColors[type];\r\n    }\r\n    if (type.startsWith('trigger.')) return 'bg-amber-50 border-amber-200';\r\n    if (type.startsWith('control.')) return 'bg-sky-50 border-sky-200';\r\n    if (type.startsWith('action.')) return 'bg-emerald-50 border-emerald-200';\r\n    if (type.startsWith('end.')) return 'bg-slate-50 border-slate-200';\r\n    if (type.startsWith('var.') || type.startsWith('audit.') || type.startsWith('utility.')) return 'bg-purple-50 border-purple-200';\r\n    return 'bg-white border-slate-200';\r\n  }\r\n\r\n  getTypeIcon(type: string): string {\r\n    return this.TYPE_ICONS()[type] || '•';\r\n  }\r\n\r\n  renderSummary(node: WorkflowNode): string {\r\n    try {\r\n      // 1) Dynamic summary from node type config: look for first field marked showInNode\r\n      const cfg = this.configService.getNodeTypeConfig(node.type);\r\n      if (cfg && Array.isArray(cfg.properties)) {\r\n        const field = cfg.properties.find((p: any) => p && (p as any).showInNode === true) as any;\r\n        if (field && field.key) {\r\n          const raw = node.params?.[field.key];\r\n          if (raw !== undefined && raw !== null && String(raw).trim() !== '') {\r\n            const val = typeof raw === 'object' ? JSON.stringify(raw) : String(raw);\r\n            // Truncate to keep node compact\r\n            const short = val.length > 40 ? val.slice(0, 37) + '…' : val;\r\n            return `<b>${field.label || field.key}</b>: ${short}`;\r\n          }\r\n        }\r\n      }\r\n\r\n      // 2) Smarter generic fallback when no showInNode field is configured\r\n      // Prefer the first param (excluding 'label') with a non-empty value; else use the node label\r\n      const params = node.params || {};\r\n      const firstEntry = Object.entries(params).find(([k, v]) => k !== 'label' && v !== undefined && v !== null && String(v).trim() !== '');\r\n      if (firstEntry) {\r\n        const [k, v] = firstEntry;\r\n        const val = typeof v === 'object' ? JSON.stringify(v) : String(v);\r\n        const short = val.length > 40 ? val.slice(0, 37) + '…' : val;\r\n        return `<b>${k}</b>: ${short}`;\r\n      } \r\n      return node.label || node.type;\r\n    } catch {\r\n      return node.type;\r\n    }\r\n  }\r\n\r\n  toggleTemplatesDropdown(): void {\r\n    this.showTemplatesDropdown.update((show: boolean) => !show);\r\n  }\r\n\r\n  private getNodeExits(node: WorkflowNode): string[] {\r\n    const config = this.configService.getNodeTypeConfig(node.type);\r\n    const exits = config?.exits || [];\r\n    if (node.type === 'control.switch') {\r\n      const casesValue = node.params?.['cases'];\r\n      const cases: string[] = [];\r\n      if (casesValue) {\r\n        if (typeof casesValue === 'string') {\r\n          const parsed = casesValue.split(',').map((c) => c.trim()).filter((c) => c.length > 0);\r\n          cases.push(...parsed);\r\n        } else if (Array.isArray(casesValue)) {\r\n          cases.push(...casesValue);\r\n        }\r\n      }\r\n      return [...cases, 'default'];\r\n    }\r\n    return exits;\r\n  }\r\n\r\n  getEdgePoints(edge: WorkflowEdge): { x1: number; y1: number; x2: number; y2: number; mx: number } | null {\r\n    const fromNode = this.nodes().find((n: WorkflowNode) => n.id === edge.from);\r\n    const toNode = this.nodes().find((n: WorkflowNode) => n.id === edge.to);\r\n    if (!fromNode || !toNode) return null;\r\n\r\n    const exits = this.getNodeExits(fromNode);\r\n    let exitY = this.NODE_SIZE.h / 2;\r\n    if (exits.length > 0 && edge.exitPoint) {\r\n      const exitIndex = exits.indexOf(edge.exitPoint);\r\n      if (exitIndex !== -1) {\r\n        if (exits.length === 1) exitY = this.NODE_SIZE.h / 2;\r\n        else {\r\n          const padding = 20;\r\n          const availableHeight = this.NODE_SIZE.h - padding * 2;\r\n          const spacing = availableHeight / (exits.length - 1);\r\n          exitY = padding + exitIndex * spacing;\r\n        }\r\n      }\r\n    }\r\n    const x1 = fromNode.x + this.NODE_SIZE.w;\r\n    const y1 = fromNode.y + exitY;\r\n    const x2 = toNode.x;\r\n    const y2 = toNode.y + this.NODE_SIZE.h / 2;\r\n    const mx = (x1 + x2) / 2;\r\n    return { x1, y1, x2, y2, mx };\r\n  }\r\n\r\n  getEdgePath(edge: WorkflowEdge): string {\r\n    const points = this.getEdgePoints(edge);\r\n    if (!points) return '';\r\n    return `M ${points.x1} ${points.y1} C ${points.mx} ${points.y1}, ${points.mx - 20} ${points.y2}, ${points.x2 - 16} ${points.y2}`;\r\n  }\r\n\r\n  runSimulation(): void {\r\n    alert('This is a mock. Attach to your engine for live runs.');\r\n  }\r\n\r\n  viewLastRun(): void {\r\n    alert('This is a mock log view.');\r\n  }\r\n\r\n  updateWorkflowField(field: string, value: any): void {\r\n    const currentWorkflow = this.currentWorkflow();\r\n    if (currentWorkflow) {\r\n      const updatedWorkflow = { ...currentWorkflow, [field]: value } as any;\r\n      this.currentWorkflow.set(updatedWorkflow);\r\n      this.saveStateToHistory(`Updated workflow ${field}`);\r\n    }\r\n  }\r\n\r\n  updateWorkflowFieldSilent(field: string, value: any): void {\r\n    const currentWorkflow = this.currentWorkflow();\r\n    if (currentWorkflow) {\r\n      const updatedWorkflow = { ...currentWorkflow, [field]: value } as any;\r\n      this.currentWorkflow.set(updatedWorkflow);\r\n    }\r\n  }\r\n\r\n  updateWorkflowMetadata(field: string, value: any): void {\r\n    const currentWorkflow = this.currentWorkflow();\r\n    if (currentWorkflow) {\r\n      const metadata = (currentWorkflow as any).metadata || {};\r\n      const updatedMetadata = { ...metadata, [field]: value };\r\n      const updatedWorkflow = { ...currentWorkflow, metadata: updatedMetadata } as any;\r\n      this.currentWorkflow.set(updatedWorkflow);\r\n      this.saveStateToHistory(`Updated metadata ${field}`);\r\n    }\r\n  }\r\n\r\n  updateWorkflowMetadataSilent(field: string, value: any): void {\r\n    const currentWorkflow = this.currentWorkflow();\r\n    if (currentWorkflow) {\r\n      const metadata = (currentWorkflow as any).metadata || {};\r\n      const updatedMetadata = { ...metadata, [field]: value };\r\n      const updatedWorkflow = { ...currentWorkflow, metadata: updatedMetadata } as any;\r\n      this.currentWorkflow.set(updatedWorkflow);\r\n    }\r\n  }\r\n\r\n  updateWorkflowVariables(variables: Record<string, string>): void {\r\n    this.variablesService.setVariables(variables);\r\n    const currentWorkflow = this.currentWorkflow();\r\n    if (currentWorkflow) {\r\n      const updatedWorkflow = { ...currentWorkflow, variables } as any;\r\n      this.currentWorkflow.set(updatedWorkflow);\r\n      this.saveStateToHistory('Updated workflow variables');\r\n    }\r\n  }\r\n\r\n  validateWorkflow(): { isValid: boolean; errors: string[] } {\r\n    const workflow = this.currentWorkflow();\r\n    const errors: string[] = [];\r\n    if (!workflow) return { isValid: false, errors: ['No workflow data available'] };\r\n    if (!workflow.name || (workflow.name as string).trim() === '') errors.push('Workflow name is required');\r\n    const nodes = this.nodes();\r\n    if (nodes.length === 0) errors.push('Workflow must contain at least one node');\r\n    return { isValid: errors.length === 0, errors };\r\n  }\r\n}\r\n","import { Component, inject, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { WorkflowDesignerService } from '../workflow-designer.service';\r\nimport { ApiWorkflow } from '../../core/services/workflow-api.service';\r\nimport { MessageService } from 'primeng/api';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { WORKFLOW_LIB_CONFIG, WorkflowDesignerLibConfig } from '../../core/workflow-lib.config';\r\n\r\n@Component({\r\n  selector: 'app-workflow-header',\r\n  standalone: true,\r\n  imports: [CommonModule, ToastModule],\r\n  providers: [MessageService],\r\n  template: `\r\n      <p-toast></p-toast>\r\n      <div class=\"flex items-center gap-2 justify-between w-full\">\r\n         <div class=\"flex items-center gap-2\">\r\n        <button *ngIf=\"showBack\"\r\n          class=\"text-sm px-1 py-1 rounded-md border hover:bg-slate-50 flex items-center gap-1\" \r\n          (click)=\"goBackToList()\"\r\n          title=\"Back\">\r\n          <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"></path>\r\n          </svg>\r\n        </button>\r\n        \r\n        <span class=\"text-sm font-semibold px-2 \">Alert Workflow Designer</span>\r\n       </div>\r\n        \r\n        <div class=\"flex items-center gap-2\">\r\n        <button *ngIf=\"showNew\"\r\n          class=\"text-sm px-3 py-1 rounded-md border hover:bg-slate-50 flex items-center gap-1\" \r\n          (click)=\"createNewWorkflow()\">\r\n          New\r\n        </button>\r\n               <!-- Templates Dropdown -->\r\n        <div class=\"relative\" *ngIf=\"showTemplates\">\r\n          <button \r\n            class=\"text-sm px-3 py-1 rounded-md border hover:bg-slate-50 flex items-center gap-1\" \r\n            (click)=\"workflowService.toggleTemplatesDropdown()\">\r\n            Templates ({{ getWorkflowDisplayName() }}) ▾\r\n          </button>\r\n          <div \r\n            *ngIf=\"workflowService.showTemplatesDropdown()\" \r\n            class=\"absolute mt-1 w-48 rounded-md border bg-white shadow z-10 max-h-72 overflow-auto\">\r\n            <ng-container *ngFor=\"let template of workflowService.getTemplates(); trackBy: trackTemplate\">\r\n              <button \r\n                class=\"w-full text-left px-3 py-2 hover:bg-slate-50 text-sm flex justify-between items-center\"\r\n                [class.bg-indigo-50]=\"template.workflowId.toString() === workflowService.currentWorkflowId()\"\r\n                (click)=\"selectTemplate(template.workflowId.toString())\">\r\n                <span>{{ template.name }}</span>\r\n                <span *ngIf=\"template.workflowId.toString() === workflowService.currentWorkflowId()\" class=\"text-indigo-500 text-xs\">active</span>\r\n              </button>\r\n            </ng-container>\r\n            <div class=\"border-t mt-1 pt-1 px-3 pb-2 text-[10px] text-slate-400\">Click a template to load</div>\r\n          </div>\r\n        </div>\r\n        \r\n        <!-- Workflows Dropdown (optional) -->\r\n        <div class=\"relative\" *ngIf=\"showWorkflowList\">\r\n          <button \r\n            class=\"text-sm px-3 py-1 rounded-md border hover:bg-slate-50 flex items-center gap-1\" \r\n            (click)=\"toggleWorkflowsDropdown()\">\r\n            Workflows ▾\r\n          </button>\r\n          <div \r\n            *ngIf=\"showWorkflowsDropdown()\" \r\n            class=\"absolute mt-1 w-56 rounded-md border bg-white shadow z-10 max-h-72 overflow-auto\">\r\n            <div *ngIf=\"loadingWorkflows()\" class=\"px-3 py-2 text-sm text-slate-500\">Loading…</div>\r\n            <ng-container *ngIf=\"!loadingWorkflows()\">\r\n              <ng-container *ngFor=\"let wf of workflows(); trackBy: trackWorkflow\">\r\n                <button \r\n                  class=\"w-full text-left px-3 py-2 hover:bg-slate-50 text-sm flex justify-between items-center\"\r\n                  [class.bg-indigo-50]=\"wf.workflowId.toString() === workflowService.currentWorkflowId()\"\r\n                  (click)=\"selectWorkflow(wf.workflowId.toString())\">\r\n                  <span>{{ wf.name }}</span>\r\n                  <span *ngIf=\"wf.workflowId.toString() === workflowService.currentWorkflowId()\" class=\"text-indigo-500 text-xs\">active</span>\r\n                </button>\r\n              </ng-container>\r\n              <div class=\"border-t mt-1 pt-1 px-3 pb-2 text-[10px] text-slate-400\">Select a workflow to load</div>\r\n            </ng-container>\r\n          </div>\r\n        </div>\r\n        <button \r\n          class=\"text-sm px-3 py-1 rounded-md border hover:bg-slate-50 flex items-center gap-1.5\" \r\n          (click)=\"workflowService.runValidate()\"\r\n          title=\"Validate workflow structure\">\r\n          <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"></path>\r\n          </svg>\r\n          Validate\r\n        </button>\r\n        <button *ngIf=\"showImport\" class=\"text-sm px-3 py-1 rounded-md border hover:bg-slate-50\" (click)=\"importJson()\">Import JSON</button>\r\n        <button *ngIf=\"showExport\" class=\"text-sm px-3 py-1 rounded-md border hover:bg-slate-50\" (click)=\"workflowService.exportJson()\">Export JSON</button>\r\n        <button *ngIf=\"showSave\" class=\"text-sm px-3 py-1 rounded-md border bg-green-50 border-green-300 hover:bg-green-100 text-green-700\" (click)=\"saveToApi()\">\r\n          {{ getSaveButtonText() }}\r\n        </button>\r\n        </div>\r\n        <!-- Hidden file input for JSON import -->\r\n        <input \r\n          #fileInput \r\n          type=\"file\" \r\n          accept=\".json\" \r\n          (change)=\"onFileSelected($event)\" \r\n          style=\"display: none\"\r\n        />\r\n      </div>\r\n  `,\r\n  styles: [`\r\n  :host{\r\n      grid-column: span 3;\r\n      grid-row: 1;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: space-between;\r\n      padding-left: 0.75rem;\r\n      padding-right: 0.75rem;\r\n  }\r\n  `]\r\n})\r\nexport class WorkflowHeaderComponent {\r\n  libConfig = inject(WORKFLOW_LIB_CONFIG, { optional: true }) as WorkflowDesignerLibConfig | undefined;\r\n  private router = inject(Router, { optional: true });\r\n\r\n  constructor(\r\n    public workflowService: WorkflowDesignerService,\r\n    private messageService: MessageService,\r\n  ) {}\r\n\r\n  // Feature flag helpers (default true when not provided)\r\n  get showNew() { return this.libConfig?.features?.new ?? true; }\r\n  get showTemplates() { return this.libConfig?.features?.templates ?? true; }\r\n  get showImport() { return this.libConfig?.features?.import ?? true; }\r\n  get showExport() { return this.libConfig?.features?.export ?? true; }\r\n  get showSave() { return this.libConfig?.features?.save ?? true; }\r\n  get showWorkflowList() { return this.libConfig?.features?.workflowList ?? false; }\r\n  get showBack() { return this.libConfig?.features?.backButton ?? true; }\r\n\r\n  // Workflows dropdown state (signals for zoneless change detection)\r\n  showWorkflowsDropdown = signal<boolean>(false);\r\n  loadingWorkflows = signal<boolean>(false);\r\n  workflows = signal<ApiWorkflow[]>([]);\r\n\r\n  goBackToList() {\r\n    const backUrl = this.libConfig?.features?.backUrl ?? '/';\r\n    if (/^https?:\\/\\//i.test(backUrl)) {\r\n      window.location.href = backUrl;\r\n      return;\r\n    }\r\n    if (this.router) {\r\n      this.router.navigate([backUrl]);\r\n    }\r\n  }\r\n\r\n  async selectTemplate(id: string) {\r\n    try {\r\n      // Close dropdown first\r\n      this.workflowService.showTemplatesDropdown.set(false);\r\n      \r\n      // Check if router has any configured routes\r\n      const hasRoutes = this.router && this.router.config && this.router.config.length > 0;\r\n      \r\n      // If router is available AND has routes, navigate with query params\r\n      if (hasRoutes) {\r\n        this.router!.navigate(['/'], {\r\n          queryParams: { id },\r\n          replaceUrl: true\r\n        });\r\n      } else {\r\n        // If no router or no routes, directly load the workflow\r\n        const success = await this.workflowService.loadWorkflow(id);\r\n        if (!success) {\r\n          this.messageService.add({\r\n            severity: 'error',\r\n            summary: 'Error',\r\n            detail: 'Failed to load template.',\r\n            life: 5000\r\n          });\r\n        } else {\r\n          this.messageService.add({\r\n            severity: 'success',\r\n            summary: 'Success',\r\n            detail: 'Template loaded successfully.',\r\n            life: 2000\r\n          });\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.error('Error loading template:', error);\r\n      this.messageService.add({\r\n        severity: 'error',\r\n        summary: 'Error',\r\n        detail: 'Unexpected error loading workflow template.',\r\n        life: 5000\r\n      });\r\n    }\r\n  }\r\n\r\n  async toggleWorkflowsDropdown() {\r\n    this.showWorkflowsDropdown.update(v => !v);\r\n    if (this.showWorkflowsDropdown()) {\r\n      this.workflowService.showTemplatesDropdown.set(false);\r\n      this.loadingWorkflows.set(true);\r\n      await this.loadWorkflows();\r\n    }\r\n  }\r\n\r\n  private async loadWorkflows() {\r\n    this.loadingWorkflows.set(true);\r\n    try {\r\n      const list = await this.workflowService.getAllWorkflows();\r\n      this.workflows.set(list);\r\n    } catch (e) {\r\n      console.error('Error loading workflows list:', e);\r\n      this.messageService.add({\r\n        severity: 'error',\r\n        summary: 'Error',\r\n        detail: 'Failed to load workflows list.',\r\n        life: 4000\r\n      });\r\n    } finally {\r\n      this.loadingWorkflows.set(false);\r\n    }\r\n  }\r\n\r\n  async selectWorkflow(id: string) {\r\n    try {\r\n      // Close dropdown first\r\n      this.showWorkflowsDropdown.set(false);\r\n      \r\n      // Check if router has any configured routes\r\n      const hasRoutes = this.router && this.router.config && this.router.config.length > 0;\r\n      \r\n      // If router is available AND has routes, navigate with query params\r\n      if (hasRoutes) {\r\n        this.router!.navigate(['/'], { queryParams: { id }, replaceUrl: true });\r\n      } else {\r\n        // If no router or no routes, directly load the workflow\r\n        const success = await this.workflowService.loadWorkflow(id);\r\n        if (!success) {\r\n          this.messageService.add({\r\n            severity: 'error',\r\n            summary: 'Error',\r\n            detail: 'Failed to load workflow.',\r\n            life: 5000\r\n          });\r\n        } else {\r\n          this.messageService.add({\r\n            severity: 'success',\r\n            summary: 'Success',\r\n            detail: 'Workflow loaded successfully.',\r\n            life: 2000\r\n          });\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.error('Error loading workflow:', error);\r\n      this.messageService.add({\r\n        severity: 'error',\r\n        summary: 'Error',\r\n        detail: 'Unexpected error loading workflow.',\r\n        life: 5000\r\n      });\r\n    }\r\n  }\r\n\r\n  trackWorkflow = (index: number, wf: ApiWorkflow) => wf.workflowId;\r\n\r\n  async saveToApi() {\r\n    const result = await this.workflowService.saveToApi();\r\n    \r\n    if (result.success) {\r\n      this.messageService.add({\r\n        severity: 'success',\r\n        summary: 'Success',\r\n        detail: result.message,\r\n        life: 3000\r\n      });\r\n    } else {\r\n      this.messageService.add({\r\n        severity: 'error',\r\n        summary: 'Validation Error',\r\n        detail: result.message,\r\n        life: 5000\r\n      });\r\n    }\r\n  }\r\n\r\n  trackTemplate = (index: number, template: ApiWorkflow) => template.workflowId;\r\n\r\n  getSaveButtonText(): string {\r\n    const currentId = this.workflowService.currentWorkflowId();\r\n    const currentWorkflow = this.workflowService.currentWorkflow();\r\n    \r\n    const isNewWorkflow = !currentId || \r\n                          currentId === 'workflow' || \r\n                          currentId === 'new' ||\r\n                          !currentWorkflow?.workflowId;\r\n    \r\n    return isNewWorkflow ? 'Save' : 'Update';\r\n  }\r\n\r\n  getWorkflowDisplayName(): string {\r\n    const currentId = this.workflowService.currentWorkflowId();\r\n    if (currentId === 'workflow') {\r\n      return 'New Workflow';\r\n    }\r\n    \r\n    const templates = this.workflowService.getTemplates();\r\n    const currentTemplate = templates.find(t => t.workflowId.toString() === currentId);\r\n    return currentTemplate ? currentTemplate.name : currentId;\r\n  }\r\n\r\n  createNewWorkflow() {\r\n    const hasRoutes = this.router && this.router.config && this.router.config.length > 0;\r\n    \r\n    if (hasRoutes) {\r\n      this.router!.navigate(['/'], { queryParams: { id: 'new' } });\r\n    } else {\r\n      // If no router or no routes, reset to create new workflow\r\n      this.workflowService.resetAll();\r\n      this.workflowService.saveStateToHistory();\r\n    }\r\n  }\r\n\r\n  importJson() {\r\n    const fileInput = document.querySelector('input[type=\"file\"]') as HTMLInputElement;\r\n    if (fileInput) {\r\n      fileInput.click();\r\n    }\r\n  }\r\n\r\n  onFileSelected(event: Event) {\r\n    const input = event.target as HTMLInputElement;\r\n    if (!input.files || input.files.length === 0) {\r\n      return;\r\n    }\r\n\r\n    const file = input.files[0];\r\n    const reader = new FileReader();\r\n\r\n    reader.onload = (e) => {\r\n      try {\r\n        const jsonContent = e.target?.result as string;\r\n        const workflowData = JSON.parse(jsonContent);\r\n        \r\n        this.workflowService.importJson(workflowData);\r\n        \r\n        const nodesCount = this.workflowService.nodes().length;\r\n        const edgesCount = this.workflowService.edges().length;\r\n        \r\n        this.messageService.add({\r\n          severity: 'success',\r\n          summary: 'Import Successful',\r\n          detail: `Loaded ${nodesCount} node(s) and ${edgesCount} edge(s)`,\r\n          life: 3000\r\n        });\r\n      } catch (error) {\r\n        console.error('❌ Error importing JSON:', error);\r\n        let errorMessage = 'Failed to import JSON. Please ensure the file is valid.';\r\n        if (error instanceof Error) {\r\n          errorMessage = error.message;\r\n        }\r\n        \r\n        this.messageService.add({\r\n          severity: 'error',\r\n          summary: 'Import Failed',\r\n          detail: errorMessage,\r\n          life: 5000\r\n        });\r\n      }\r\n    };\r\n\r\n    reader.onerror = () => {\r\n      console.error('❌ Error reading file');\r\n      this.messageService.add({\r\n        severity: 'error',\r\n        summary: 'File Read Error',\r\n        detail: 'Failed to read the file. Please try again.',\r\n        life: 5000\r\n      });\r\n    };\r\n\r\n    reader.readAsText(file);\r\n    \r\n    input.value = '';\r\n  }\r\n}\r\n","import { Component, Inject, Optional, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { WorkflowDesignerService } from '../workflow-designer.service';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { PALETTE_CATEGORIES } from '../config/workflow-nodes-config.data';\r\nimport { PaletteCategoryConfig } from '../workflow-designer.interfaces';\r\nimport { WORKFLOW_LIB_CONFIG, WorkflowDesignerLibConfig } from '../../core/workflow-lib.config';\r\n\r\n@Component({\r\n  selector: 'app-workflow-palette',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  template: `\r\n            <div class=\"px-3 pt-3 pb-2 border-b\">\r\n                <h3 class=\"text-sm font-semibold\">Palette</h3>\r\n                <p class=\"text-xs text-slate-500\">Click to add a node</p>\r\n            </div>\r\n            <div class=\"p-3 space-y-4 overflow-auto\">\r\n                @for (category of this.categories; track category.id) {\r\n                    <div>\r\n                        <h4 class=\"text-xs font-semibold mb-2 px-1\" [ngClass]=\"category.headerClass\">\r\n                            {{ category.icon }} {{ category.label }}\r\n                        </h4>\r\n                        <div class=\"space-y-1\">\r\n                            <button\r\n                                    *ngFor=\"let item of category.nodes\"\r\n                                    (click)=\"workflowService.addNode(item.type)\"\r\n                                    class=\"w-full text-left px-3 py-2 rounded-lg border hover:bg-white/60 text-sm flex items-center gap-2\"\r\n                                    [ngClass]=\"item.color\">\r\n                                @if (isHtmlIcon(workflowService.getTypeIcon(item.type))) {\r\n                                    <div class=\"flex items-center smaller-icon\" [innerHTML]=\"getSafeIcon(workflowService.getTypeIcon(item.type))\"></div>\r\n                                } @else {\r\n                                    {{ workflowService.getTypeIcon(item.type) }}\r\n                                }\r\n                                {{ item.label }}\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n                }\r\n            </div>\r\n    `,\r\n  styles: [`\r\n        :host {\r\n            grid-column: 1;\r\n            grid-row: 2;\r\n            border-radius: 0.75rem;\r\n            background-color: white;\r\n            border-width: 1px;\r\n            overflow: hidden;\r\n            display: flex;\r\n            flex-direction: column;\r\n            }\r\n        ::ng-deep .smaller-icon .material-icons {\r\n                    font-size: 1.2rem !important;\r\n                }\r\n            `],\r\n})\r\nexport class WorkflowPaletteComponent {\r\n  workflowService = inject(WorkflowDesignerService);\r\n  private sanitizer = inject(DomSanitizer);\r\n  private libConfig = inject(WORKFLOW_LIB_CONFIG, { optional: true }) as WorkflowDesignerLibConfig | undefined;\r\n\r\n  // Dynamic categories configuration from centralized data\r\n  get categories() {\r\n    const categories = this.libConfig?.palette?.categories ?? PALETTE_CATEGORIES;\r\n    return categories\r\n      .map((category) => ({\r\n        ...category,\r\n        nodes: this.getNodesForCategory(category),\r\n      }))\r\n      .filter((category) => category.nodes.length > 0); // Only show categories with nodes\r\n  }\r\n\r\n  // Helper method to get nodes for a specific category\r\n  private getNodesForCategory(category: PaletteCategoryConfig) {\r\n    const prefixes = Array.isArray(category.filterPrefix) ? category.filterPrefix : [category.filterPrefix];\r\n\r\n    return this.workflowService\r\n      .PALETTE()\r\n      .filter((item) => prefixes.some((prefix) => item.type.startsWith(prefix)));\r\n  }\r\n\r\n  // Check if icon contains HTML markup\r\n  isHtmlIcon(icon: string): boolean {\r\n    if (!icon) return false;\r\n    return icon.includes('<') || icon.includes('>');\r\n  }\r\n\r\n  // Get sanitized HTML icon\r\n  getSafeIcon(icon: string): SafeHtml {\r\n    if (!icon) return '';\r\n    return this.sanitizer.sanitize(1, icon) || '';\r\n  }\r\n}\r\n","import { Component, Input, Output, EventEmitter, HostBinding, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { WorkflowNode } from '../workflow-designer.interfaces';\r\nimport { WorkflowDesignerService } from '../workflow-designer.service';\r\nimport { WorkflowNodesConfigService } from '../workflow-nodes-config.service';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\n\r\n@Component({\r\n  selector: 'app-workflow-node',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  template: `\r\n    <div \r\n      (mousedown)=\"onMouseDown($event)\"\r\n      (dblclick)=\"onDoubleClick()\"\r\n      class=\"rounded-xl border shadow-sm h-full w-full select-none relative group isolate\"\r\n      [class.ring-2]=\"node.id === workflowService.selectedNodeId()\"\r\n      [class.ring-indigo-400]=\"node.id === workflowService.selectedNodeId()\"\r\n      [ngClass]=\"workflowService.cssForType(node.type)\">\r\n      \r\n      <!-- Input connection point (left side) - hidden for trigger nodes -->\r\n      @if (!isTriggerNode()) {\r\n        <div class=\"absolute left-0 top-1/2 -translate-y-1/2 -translate-x-1/2 \r\n                    p-2 cursor-pointer z-[1]\"\r\n             (click)=\"onInputClick($event)\"\r\n             title=\"Input\">\r\n          <div class=\"w-3 h-3 rounded-full bg-white border-2 transition-all duration-200\"\r\n               [class.border-red-600]=\"isInputUnconnected() && !isValidConnectionTarget()\"\r\n               [class.bg-red-50]=\"isInputUnconnected() && !isValidConnectionTarget()\"\r\n               [class.border-slate-400]=\"!isInputUnconnected() && !isValidConnectionTarget()\"\r\n               [class.hover:border-indigo-500]=\"!isInputUnconnected() && !isValidConnectionTarget()\"\r\n               [class.hover:bg-indigo-50]=\"!isInputUnconnected() && !isValidConnectionTarget()\"\r\n               [class.border-green-500]=\"isValidConnectionTarget()\"\r\n               [class.bg-green-50]=\"isValidConnectionTarget()\"\r\n               [class.animate-pulse]=\"isValidConnectionTarget()\"\r\n               [class.scale-125]=\"isValidConnectionTarget()\">\r\n          </div>\r\n        </div>\r\n      }\r\n\r\n      <!-- Output connection points (right side) -->\r\n      @for (exit of nodeExits(); track exit; let i = $index) {\r\n        <div class=\"absolute right-0 p-2 z-[1] transition-all duration-200\"\r\n             [style.top.px]=\"getExitPointY(i)\"\r\n             [style.transform]=\"'translate(50%, -50%)'\"\r\n             [class.cursor-not-allowed]=\"isOutputPointDisabled()\"\r\n             [class.cursor-pointer]=\"!isOutputPointDisabled()\"\r\n             (click)=\"onExitClick($event, exit)\"\r\n             [title]=\"isOutputPointDisabled() ? 'Cannot connect output to output' : getExitLabel(exit)\">\r\n          <div class=\"w-3 h-3 rounded-full bg-white border-2 transition-all duration-200\"\r\n               [class.border-red-600]=\"isExitUnconnected(exit) && !isOutputPointDisabled()\"\r\n               [class.bg-red-50]=\"isExitUnconnected(exit) && !isOutputPointDisabled()\"\r\n               [class.border-green-500]=\"!isExitUnconnected(exit) && exit === 'onTrue' && !isOutputPointDisabled()\"\r\n               [class.border-red-500]=\"!isExitUnconnected(exit) && exit === 'onFalse' && !isOutputPointDisabled()\"\r\n               [class.border-blue-500]=\"!isExitUnconnected(exit) && exit === 'next' && !isOutputPointDisabled()\"\r\n               [class.border-amber-500]=\"!isExitUnconnected(exit) && exit === 'default' && !isOutputPointDisabled()\"\r\n               [class.border-purple-500]=\"!isExitUnconnected(exit) && isSwitchCase(exit) && !isOutputPointDisabled()\"\r\n               [class.border-gray-300]=\"isOutputPointDisabled()\"\r\n               [class.bg-gray-100]=\"isOutputPointDisabled()\"\r\n               [class.opacity-50]=\"isOutputPointDisabled()\"\r\n               [class.hover:border-indigo-500]=\"!isOutputPointDisabled() && !isOutputPointActive(exit) && !isExitUnconnected(exit)\"\r\n               [class.hover:bg-indigo-50]=\"!isOutputPointDisabled() && !isOutputPointActive(exit) && !isExitUnconnected(exit)\"\r\n               [class.ring-2]=\"isOutputPointActive(exit)\"\r\n               [class.ring-indigo-300]=\"isOutputPointActive(exit)\"\r\n               [class.scale-110]=\"isOutputPointActive(exit)\">\r\n          </div> \r\n          <!-- Label for exit point (only visible when multiple exits) -->\r\n          @if (nodeExits().length > 1 && !isOutputPointDisabled()) {\r\n            <span class=\"absolute right-full mr-2 top-1/2 -translate-y-1/2 \r\n                         text-[10px] font-medium whitespace-nowrap \r\n                         bg-white/95 text-slate-700 px-1.5 py-0.5 rounded border border-slate-200 \r\n                         pointer-events-none shadow-sm z-[2] max-w-16 truncate\">\r\n              {{ getExitLabel(exit) }}\r\n            </span>\r\n          }\r\n        </div>\r\n      }\r\n      \r\n      <div class=\"h-full w-full p-3 flex flex-col\">\r\n        <div class=\"flex items-center gap-2\">\r\n          @if (isHtmlIcon(workflowService.getTypeIcon(node.type))) {\r\n            <div class=\"text-base select-none flex items-center\" [innerHTML]=\"getSafeIcon(workflowService.getTypeIcon(node.type))\"></div>\r\n          } @else {\r\n            <span class=\"text-base select-none\">{{ workflowService.getTypeIcon(node.type) }}</span>\r\n          }\r\n          <span class=\"font-medium text-sm line-clamp-1\">{{ node.label }}</span>\r\n        </div>\r\n        <div class=\"text-[11px] text-slate-600 mt-1 truncate\" [innerHTML]=\"workflowService.renderSummary(node) \">\r\n        </div>\r\n        <div class=\"mt-auto flex items-center justify-between text-[11px] text-slate-500\">\r\n          <span>ID: {{ node.id.slice(-4) }}</span>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  `,\r\n  styles: [`\r\n    :host {\r\n      position: absolute;\r\n      user-select: none;\r\n      -webkit-user-select: none;\r\n      -moz-user-select: none;\r\n      -ms-user-select: none;\r\n      z-index: 1; /* Base z-index for nodes */\r\n    }\r\n\r\n    /* Selected nodes get higher z-index */\r\n    :host:has(.ring-2) {\r\n      z-index: 2;\r\n    }\r\n\r\n    /* Prevent text selection during drag */\r\n    * {\r\n      user-select: none;\r\n      -webkit-user-select: none;\r\n      -moz-user-select: none;\r\n      -ms-user-select: none;\r\n    }\r\n\r\n    /* Ensure proper line clamping for node labels */\r\n    .line-clamp-1 {\r\n      overflow: hidden;\r\n      display: -webkit-box;\r\n      -webkit-box-orient: vertical;\r\n      -webkit-line-clamp: 1;\r\n      line-clamp: 1;\r\n    }\r\n\r\n    /* Ensure cursor changes for draggable nodes */\r\n    .rounded-xl.border.shadow-sm {\r\n      cursor: move;\r\n    }\r\n\r\n    .rounded-xl.border.shadow-sm:hover {\r\n      cursor: grab;\r\n    }\r\n\r\n    .rounded-xl.border.shadow-sm:active {\r\n      cursor: grabbing;\r\n    }\r\n\r\n    /* Ensure connection point labels don't overflow canvas */\r\n    .absolute.right-full {\r\n      max-width: fit-content;\r\n      overflow: hidden;\r\n    }\r\n\r\n    /* Isolate stacking context for each node */\r\n    .isolate {\r\n      isolation: isolate;\r\n    }\r\n  `],\r\n})\r\nexport class WorkflowNodeComponent {\r\n  @Input({ required: true }) node!: WorkflowNode;\r\n  @Output() mouseDown = new EventEmitter<{ event: MouseEvent; nodeId: string }>();\r\n  @Output() doubleClick = new EventEmitter<string>();\r\n\r\n  @HostBinding('style.left.px') get nodeX() {\r\n    return this.node.x;\r\n  }\r\n  @HostBinding('style.top.px') get nodeY() {\r\n    return this.node.y;\r\n  }\r\n  @HostBinding('style.width.px') get nodeWidth() {\r\n    return this.workflowService.NODE_SIZE.w;\r\n  }\r\n  @HostBinding('style.height.px') get nodeHeight() {\r\n    return this.calculateNodeHeight();\r\n  }\r\n\r\n  /**\r\n   * Calculate dynamic node height based on number of exit points\r\n   * Base height: 92px\r\n   * If exits > 4: add 20px per additional exit point\r\n   */\r\n  private calculateNodeHeight(): number {\r\n    const baseHeight = this.workflowService.NODE_SIZE.h;\r\n    const exitCount = this.nodeExits().length;\r\n    \r\n    if (exitCount <= 4) {\r\n      return baseHeight;\r\n    }\r\n    \r\n    // Add 20px for each exit point beyond 4\r\n    const additionalHeight = (exitCount - 4) * 26;\r\n    return baseHeight + additionalHeight;\r\n  }\r\n\r\n  // Computed property to get exits for this node type\r\n  nodeExits = computed(() => {\r\n    const config = this.configService.getNodeTypeConfig(this.node.type);\r\n\r\n    if (this.node.type === 'control.switch') {\r\n      return this.getSwitchExits();\r\n    }\r\n\r\n    return config?.exits || [];\r\n  });\r\n\r\n  // Computed property to check if this is a trigger node\r\n  isTriggerNode = computed(() => {\r\n    const config = this.configService.getNodeTypeConfig(this.node.type);\r\n    return config?.category === 'trigger';\r\n  });\r\n\r\n  constructor(\r\n    public workflowService: WorkflowDesignerService,\r\n    private configService: WorkflowNodesConfigService,\r\n    private sanitizer: DomSanitizer,\r\n  ) {}\r\n\r\n  private getSwitchExits(): string[] {\r\n    const casesParam = this.node.params?.['cases'];\r\n\r\n    if (typeof casesParam === 'string' && casesParam.trim()) {\r\n      const cases = casesParam\r\n        .split(',')\r\n        .map((c) => c.trim())\r\n        .filter((c) => c.length > 0);\r\n\r\n      if (cases.length > 0) {\r\n        return [...cases, 'default'];\r\n      }\r\n    } else if (Array.isArray(casesParam) && casesParam.length > 0) {\r\n      return [...casesParam.map((c) => String(c).trim()), 'default'];\r\n    }\r\n\r\n    return ['default'];\r\n  }\r\n\r\n  isSwitchCase(exit: string): boolean {\r\n    return this.node.type === 'control.switch' && exit !== 'default';\r\n  }\r\n\r\n  getExitPointY(index: number): number {\r\n    const exits = this.nodeExits();\r\n    const nodeHeight = this.calculateNodeHeight();\r\n    \r\n    if (exits.length === 0) return nodeHeight / 2;\r\n    if (exits.length === 1) return nodeHeight / 2;\r\n\r\n    const padding = 20;\r\n    const availableHeight = nodeHeight - padding * 2;\r\n    const spacing = exits.length > 1 ? availableHeight / (exits.length - 1) : 0;\r\n\r\n    return padding + index * spacing;\r\n  }\r\n\r\n  getExitLabel(exitPoint: string): string {\r\n    if (this.node.type === 'control.switch' && exitPoint !== 'default') {\r\n      return exitPoint;\r\n    }\r\n\r\n    const labels: Record<string, string> = {\r\n      next: 'Next',\r\n      onTrue: 'True',\r\n      onFalse: 'False',\r\n      cases: 'Cases',\r\n      default: 'Default',\r\n      onSuccess: 'Success',\r\n      onFailure: 'Failure',\r\n      onTimeout: 'Timeout',\r\n      onApproved: 'Approved',\r\n      onRejected: 'Rejected',\r\n    };\r\n    return labels[exitPoint] || exitPoint;\r\n  }\r\n\r\n  isValidConnectionTarget(): boolean {\r\n    const connectFrom = this.workflowService.connectFrom();\r\n    const connectFromExitPoint = this.workflowService.connectFromExitPoint();\r\n    const isConnectMode = this.workflowService.isConnectMode();\r\n\r\n    return (\r\n      isConnectMode &&\r\n      connectFrom !== null &&\r\n      connectFrom !== this.node.id &&\r\n      connectFromExitPoint !== null\r\n    );\r\n  }\r\n\r\n  isOutputPointActive(exitPoint: string): boolean {\r\n    const connectFrom = this.workflowService.connectFrom();\r\n    const connectFromExitPoint = this.workflowService.connectFromExitPoint();\r\n    const isConnectMode = this.workflowService.isConnectMode();\r\n\r\n    return isConnectMode && connectFrom === this.node.id && connectFromExitPoint === exitPoint;\r\n  }\r\n\r\n  isOutputPointDisabled(): boolean {\r\n    const connectFrom = this.workflowService.connectFrom();\r\n    const connectFromExitPoint = this.workflowService.connectFromExitPoint();\r\n    const isConnectMode = this.workflowService.isConnectMode();\r\n\r\n    return isConnectMode && connectFrom !== null && connectFromExitPoint === null;\r\n  }\r\n\r\n  isExitUnconnected(exitPoint: string): boolean {\r\n    return this.workflowService.isExitUnconnected(this.node.id, exitPoint);\r\n  }\r\n\r\n  isInputUnconnected(): boolean {\r\n    return this.workflowService.isInputUnconnected(this.node.id);\r\n  }\r\n\r\n  onInputClick(event: MouseEvent): void {\r\n    event.stopPropagation();\r\n\r\n    if (this.isInputUnconnected()) {\r\n      this.workflowService.clearInputHighlight(this.node.id);\r\n    }\r\n\r\n    const connectFrom = this.workflowService.connectFrom();\r\n    const connectFromExitPoint = this.workflowService.connectFromExitPoint();\r\n\r\n    if (\r\n      this.workflowService.isConnectMode() &&\r\n      connectFrom &&\r\n      connectFrom !== this.node.id &&\r\n      connectFromExitPoint !== null\r\n    ) {\r\n      this.workflowService.startConnect(this.node.id);\r\n    }\r\n  }\r\n\r\n  onExitClick(event: MouseEvent, exitPoint: string): void {\r\n    event.stopPropagation();\r\n\r\n    if (this.isExitUnconnected(exitPoint)) {\r\n      this.workflowService.clearExitHighlight(this.node.id, exitPoint);\r\n    }\r\n\r\n    const connectFrom = this.workflowService.connectFrom();\r\n    const connectFromExitPoint = this.workflowService.connectFromExitPoint();\r\n\r\n    if (this.workflowService.isConnectMode() && connectFrom && connectFromExitPoint !== null) {\r\n      return;\r\n    }\r\n\r\n    if (!this.workflowService.isConnectMode()) {\r\n      this.workflowService.isConnectMode.set(true);\r\n    }\r\n\r\n    this.workflowService.startConnect(this.node.id, exitPoint);\r\n  }\r\n\r\n  onMouseDown(event: MouseEvent): void {\r\n    event.stopPropagation();\r\n    this.mouseDown.emit({ event, nodeId: this.node.id });\r\n  }\r\n\r\n  onDoubleClick(): void {\r\n    this.doubleClick.emit(this.node.id);\r\n  }\r\n\r\n  onEditClick(event: MouseEvent): void {\r\n    event.stopPropagation();\r\n    this.workflowService.selectedNodeId.set(this.node.id);\r\n  }\r\n\r\n  isHtmlIcon(icon: string): boolean {\r\n    if (!icon) return false;\r\n    return icon.includes('<') || icon.includes('>');\r\n  }\r\n\r\n  getSafeIcon(icon: string): SafeHtml {\r\n    if (!icon) return '';\r\n    return this.sanitizer.sanitize(1, icon) || '';\r\n  }\r\n}\r\n","import { Injectable, InjectionToken } from '@angular/core';\r\n\r\nexport interface SidePageRef<T = any> {\r\n  close(result?: T): void;\r\n  data?: any;\r\n}\r\n\r\nexport interface SidePageData {\r\n  [key: string]: any;\r\n}\r\n\r\nexport const SIDE_PAGE_DATA = new InjectionToken<any>('SIDE_PAGE_DATA');\r\nexport const SIDE_PAGE_REF = new InjectionToken<SidePageRef>('SIDE_PAGE_REF');\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SidePageService {\r\n  open(component: any, config?: any): SidePageRef {\r\n    // Mock implementation for now\r\n    console.log('Opening side page with component:', component, 'config:', config);\r\n    return {\r\n      close: (result?: any) => {\r\n        console.log('Closing side page with result:', result);\r\n      },\r\n      data: config?.data,\r\n    };\r\n  }\r\n\r\n  openSidePage(id: string, component: any, config?: any): SidePageRef {\r\n    console.log('Opening side page with id:', id, 'component:', component, 'config:', config);\r\n    return this.open(component, config);\r\n  }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SidePageRef, SidePageData, SIDE_PAGE_DATA, SIDE_PAGE_REF } from '../../core/services/side-page.service';\r\nimport { WorkflowDesignerService } from '../workflow-designer.service';\r\n\r\n@Component({\r\n  selector: 'app-workflow-history-panel',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  template: `\r\n    <div class=\"h-full flex flex-col bg-white\">\r\n      <div class=\"flex items-center justify-between p-4 border-b border-gray-200\">\r\n        <h2 class=\"text-lg font-semibold text-gray-800\">Workflow History</h2>\r\n        <button \r\n          (click)=\"close()\"\r\n          class=\"p-2 rounded-md hover:bg-gray-100 text-gray-500 hover:text-gray-700 transition-colors\">\r\n          <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\r\n          </svg>\r\n        </button>\r\n      </div>\r\n\r\n      <div class=\"flex-1 overflow-y-auto p-4\">\r\n        <div *ngIf=\"historyStack.length === 0\" class=\"text-center text-gray-500 py-8\">\r\n          No history available\r\n        </div>\r\n\r\n        <div *ngFor=\"let entry of historyStack; let i = index\" \r\n             class=\"mb-3 group cursor-pointer\"\r\n             (click)=\"jumpToState(entry.index)\"\r\n             [class.bg-blue-50]=\"entry.isCurrent\"\r\n             [class.hover:bg-gray-50]=\"!entry.isCurrent\">\r\n          <div class=\"flex items-start gap-3 p-3 rounded-lg border\"\r\n               [class.border-blue-300]=\"entry.isCurrent\"\r\n               [class.border-gray-200]=\"!entry.isCurrent\">\r\n            \r\n            <div class=\"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-xs font-semibold\"\r\n                 [class.bg-blue-500]=\"entry.isCurrent\"\r\n                 [class.text-white]=\"entry.isCurrent\"\r\n                 [class.bg-gray-100]=\"!entry.isCurrent\"\r\n                 [class.text-gray-600]=\"!entry.isCurrent\">\r\n              {{ entry.index }}\r\n            </div>\r\n\r\n            <div class=\"flex-1 min-w-0\">\r\n              <div class=\"flex items-center justify-between mb-1\">\r\n                <span class=\"text-sm font-medium text-gray-900\">\r\n                  {{ entry.description || 'Untitled change' }}\r\n                </span>\r\n                <span *ngIf=\"entry.isCurrent\" \r\n                      class=\"px-2 py-0.5 text-xs bg-blue-100 text-blue-700 rounded-full\">\r\n                  Current\r\n                </span>\r\n              </div>\r\n              <div class=\"text-xs text-gray-500\" *ngIf=\"entry.timestamp\">\r\n                {{ formatTime(entry.timestamp) }}\r\n              </div>\r\n            </div>\r\n\r\n            <div *ngIf=\"entry.isCurrent\" class=\"flex-shrink-0 text-blue-500\">\r\n              <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n                <path fill-rule=\"evenodd\" d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\" clip-rule=\"evenodd\"></path>\r\n              </svg>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"p-4 border-t border-gray-200 bg-gray-50\">\r\n        <div class=\"text-xs text-gray-600 space-y-1\">\r\n          <p>💡 <strong>Tip:</strong> Click any entry to jump to that state</p>\r\n          <p class=\"text-gray-500\">Total states: {{ historyStack.length }}</p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  `,\r\n  styles: [`\r\n    :host {\r\n      display: block;\r\n      height: 100%;\r\n    }\r\n\r\n    .overflow-y-auto::-webkit-scrollbar {\r\n      width: 6px;\r\n    }\r\n\r\n    .overflow-y-auto::-webkit-scrollbar-track {\r\n      background: transparent;\r\n    }\r\n\r\n    .overflow-y-auto::-webkit-scrollbar-thumb {\r\n      background: #cbd5e1;\r\n      border-radius: 3px;\r\n    }\r\n\r\n    .overflow-y-auto::-webkit-scrollbar-thumb:hover {\r\n      background: #94a3b8;\r\n    }\r\n  `]\r\n})\r\nexport class WorkflowHistoryPanelComponent {\r\n  readonly data: SidePageData | null = inject(SIDE_PAGE_DATA, { optional: true });\r\n  readonly ref: SidePageRef<WorkflowHistoryPanelComponent> = inject(SIDE_PAGE_REF, {\r\n    optional: true,\r\n  }) || {\r\n    close: () => undefined,\r\n    data: this.data || {},\r\n  } as SidePageRef<WorkflowHistoryPanelComponent>;\r\n  \r\n  constructor(private workflowService: WorkflowDesignerService) {}\r\n\r\n  get historyStack() {\r\n    return this.workflowService.getHistoryStack();\r\n  }\r\n\r\n  formatTime(timestamp: Date): string {\r\n    if (!timestamp) return '';\r\n    const date = new Date(timestamp);\r\n    return date.toLocaleTimeString('en-US', { \r\n      hour: '2-digit', \r\n      minute: '2-digit',\r\n      second: '2-digit'\r\n    });\r\n  }\r\n\r\n  jumpToState(targetIndex: number) {\r\n    const currentHistory = this.workflowService.getHistoryStack();\r\n    const currentIndex = currentHistory.findIndex((h) => h.isCurrent);\r\n    \r\n    const diff = targetIndex - currentIndex;\r\n    \r\n    if (diff > 0) {\r\n      for (let i = 0; i < diff; i++) {\r\n        this.workflowService.redo();\r\n      }\r\n    } else if (diff < 0) {\r\n      for (let i = 0; i < Math.abs(diff); i++) {\r\n        this.workflowService.undo();\r\n      }\r\n    }\r\n  }\r\n\r\n  close() {\r\n    this.ref.close();\r\n  }\r\n}\r\n","import { Component, ElementRef, ViewChild, HostListener } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { WorkflowDesignerService } from '../workflow-designer.service';\r\nimport { WorkflowNodeComponent } from './workflow-node.component';\r\nimport { SidePageService } from '../../core/services/side-page.service';\r\nimport { WorkflowHistoryPanelComponent } from './workflow-history-panel.component';\r\n\r\n@Component({\r\n  selector: 'app-workflow-canvas',\r\n  standalone: true,\r\n  imports: [CommonModule, WorkflowNodeComponent],\r\n  template: `\r\n        <!-- Connection Mode Indicator Banner (Top-Right) -->\r\n        <div \r\n            *ngIf=\"workflowService.isConnectMode()\"\r\n            class=\"absolute top-4 right-4 z-50 bg-blue-500 text-white px-3 py-1.5 rounded-lg shadow-lg flex items-center gap-2 animate-pulse text-sm\">\r\n            <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"></path>\r\n            </svg>\r\n            <span class=\"font-medium\">Connection Mode</span>\r\n            <span class=\"text-blue-100 text-xs\">• ESC to cancel</span>\r\n        </div>\r\n\r\n        <!-- Unified Toolbar (Fixed position at top-center of canvas) -->\r\n        <div class=\"absolute top-4 left-1/2 -translate-x-1/2 z-50 bg-white border border-gray-200 rounded-lg shadow-md px-3 py-2 flex items-center gap-2\">\r\n            <!-- Undo button -->\r\n            <button\r\n                (click)=\"onUndoClick()\"\r\n                [disabled]=\"!workflowService.canUndo()\"\r\n                [class.opacity-50]=\"!workflowService.canUndo()\"\r\n                [class.cursor-not-allowed]=\"!workflowService.canUndo()\"\r\n                class=\"p-2 rounded-md hover:bg-blue-50 hover:text-blue-600 text-gray-600 transition-colors disabled:hover:bg-transparent disabled:hover:text-gray-600\"\r\n                title=\"Undo (Ctrl+Z)\">\r\n                <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 10h10a8 8 0 018 8v2M3 10l6 6m-6-6l6-6\"></path>\r\n                </svg>\r\n            </button>\r\n\r\n            <!-- Redo button -->\r\n            <button\r\n                (click)=\"onRedoClick()\"\r\n                [disabled]=\"!workflowService.canRedo()\"\r\n                [class.opacity-50]=\"!workflowService.canRedo()\"\r\n                [class.cursor-not-allowed]=\"!workflowService.canRedo()\"\r\n                class=\"p-2 rounded-md hover:bg-blue-50 hover:text-blue-600 text-gray-600 transition-colors disabled:hover:bg-transparent disabled:hover:text-gray-600\"\r\n                title=\"Redo (Ctrl+Y)\">\r\n                <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 10H11a8 8 0 00-8 8v2m18-10l-6 6m6-6l-6-6\"></path>\r\n                </svg>\r\n            </button>\r\n\r\n            <div class=\"w-px h-6 bg-gray-200\"></div>\r\n\r\n            <!-- History Panel button -->\r\n            <button\r\n                (click)=\"onHistoryPanelClick()\"\r\n                class=\"p-2 rounded-md hover:bg-purple-50 hover:text-purple-600 text-gray-600 transition-colors\"\r\n                title=\"Open history panel\">\r\n                <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"></path>\r\n                </svg>\r\n            </button>\r\n\r\n            <div class=\"w-px h-6 bg-gray-200\"></div>\r\n\r\n            <!-- Zoom Controls -->\r\n            <button\r\n                (click)=\"onZoomOut()\"\r\n                class=\"p-2 rounded-md hover:bg-gray-50 hover:text-gray-800 text-gray-600 transition-colors\"\r\n                title=\"Zoom Out\">\r\n                <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM13 10H7\"></path>\r\n                </svg>\r\n            </button>\r\n\r\n            <button\r\n                (click)=\"onZoomIn()\"\r\n                class=\"p-2 rounded-md hover:bg-gray-50 hover:text-gray-800 text-gray-600 transition-colors\"\r\n                title=\"Zoom In\">\r\n                <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 00-14 0 7 7 0 0014 0zM10 7v6m3-3H7\"></path>\r\n                </svg>\r\n            </button>\r\n\r\n            <button\r\n                (click)=\"onZoomReset()\"\r\n                class=\"p-2 rounded-md hover:bg-gray-50 hover:text-gray-800 text-gray-600 transition-colors text-xs\"\r\n                title=\"Reset Zoom\">\r\n                <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"></path>\r\n                </svg>\r\n            </button>\r\n\r\n            <div class=\"w-px h-6 bg-gray-200\"></div>\r\n\r\n            <!-- Fullscreen toggle button -->\r\n            <button\r\n                (click)=\"onFullscreenToggle()\"\r\n                class=\"p-2 rounded-md hover:bg-blue-50 hover:text-blue-600 text-gray-600 transition-colors\"\r\n                [title]=\"workflowService.isFullscreen() ? 'Exit Fullscreen' : 'Enter Fullscreen'\">\r\n                <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" *ngIf=\"!workflowService.isFullscreen()\">\r\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4\"></path>\r\n                </svg>\r\n                <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\" *ngIf=\"workflowService.isFullscreen()\">\r\n                    <path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"></path>\r\n                </svg>\r\n            </button>\r\n\r\n            <!-- Conditional separator and selection tools -->\r\n            <ng-container *ngIf=\"workflowService.selectedNodeId() || workflowService.selectedEdgeId()\">\r\n                <div class=\"w-px h-6 bg-gray-200\"></div>\r\n\r\n                <!-- Delete button -->\r\n                <button\r\n                    (click)=\"onDeleteClick()\"\r\n                    class=\"p-2 rounded-md hover:bg-red-50 hover:text-red-600 text-gray-600 transition-colors\"\r\n                    title=\"Delete selected item\">\r\n                    <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"></path>\r\n                    </svg>\r\n                </button>\r\n\r\n                <!-- Duplicate button (only show for nodes) -->\r\n                <button\r\n                    *ngIf=\"workflowService.selectedNodeId()\"\r\n                    (click)=\"onDuplicateClick()\"\r\n                    class=\"p-2 rounded-md hover:bg-blue-50 hover:text-blue-600 text-gray-600 transition-colors\"\r\n                    title=\"Duplicate selected node\">\r\n                    <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"></path>\r\n                    </svg>\r\n                </button>\r\n            </ng-container>\r\n        </div>\r\n\r\n        <!-- Canvas content that moves with pan/zoom (including grid background) -->\r\n        <div\r\n                #canvas\r\n                class=\"absolute inset-0\"\r\n                (mousedown)=\"onCanvasMouseDown($event)\"\r\n                (contextmenu)=\"onCanvasContextMenu($event)\"\r\n                (wheel)=\"onCanvasWheel($event)\"\r\n                [style.transform]=\"'translate(' + workflowService.panOffsetX() + 'px, ' + workflowService.panOffsetY() + 'px) scale(' + workflowService.zoom() + ')'\"\r\n                [style.transform-origin]=\"'top left'\"\r\n                [style.cursor]=\"workflowService.isConnectMode() ? 'crosshair' : 'default'\">\r\n\r\n            <!-- Large Grid background that moves with pan -->\r\n            <svg class=\"absolute\" style=\"left: -5000px; top: -5000px; width: 10000px; height: 10000px;\">\r\n                <defs>\r\n                    <pattern id=\"grid\" width=\"32\" height=\"32\" patternUnits=\"userSpaceOnUse\">\r\n                        <path d=\"M 32 0 L 0 0 0 32\" fill=\"none\" stroke=\"#e5e7eb\" stroke-width=\"1\"/>\r\n                    </pattern>\r\n                </defs>\r\n                <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\"/>\r\n            </svg>\r\n\r\n            <!-- Edges -->\r\n            <svg class=\"absolute\"\r\n                 style=\"left: -5000px; top: -5000px; width: 10000px; height: 10000px;\">\r\n                <g transform=\"translate(5000, 5000)\">\r\n                    <!-- Invisible wider paths for easier clicking -->\r\n                    <path\r\n                            *ngFor=\"let edge of workflowService.edges()\"\r\n                            [attr.d]=\"workflowService.getEdgePath(edge)\"\r\n                            stroke=\"transparent\"\r\n                            stroke-width=\"12\"\r\n                            fill=\"none\"\r\n                            class=\"cursor-pointer\"\r\n                            (click)=\"onEdgeClick($event, edge.id)\"/>\r\n                    <!-- Visible paths -->\r\n                    <path\r\n                            *ngFor=\"let edge of workflowService.edges()\"\r\n                            [attr.d]=\"workflowService.getEdgePath(edge)\"\r\n                            [attr.stroke]=\"workflowService.selectedEdgeId() === edge.id ? '#3672f3ff' : '#74faffff'\"\r\n                            [attr.stroke-width]=\"workflowService.selectedEdgeId() === edge.id ? '2' : '2'\"\r\n                            fill=\"none\"\r\n                            marker-end=\"url(#arrow)\"\r\n                            class=\"pointer-events-none\"/>\r\n                </g>\r\n                <defs>\r\n                    <marker id=\"arrow\" markerWidth=\"10\" markerHeight=\"10\" refX=\"0\" refY=\"3\" markerUnits=\"strokeWidth\">\r\n                        <path d=\"M0,0 L0,6 L9,3 z\" fill=\"#64748b\"/>\r\n                    </marker>\r\n                </defs>\r\n            </svg>\r\n\r\n            <!-- Nodes -->\r\n            <app-workflow-node\r\n                    *ngFor=\"let node of workflowService.nodes()\"\r\n                    [node]=\"node\"\r\n                    (mouseDown)=\"onMouseDownNode($event.event, $event.nodeId)\"\r\n                    (doubleClick)=\"onNodeDoubleClick($event)\">\r\n            </app-workflow-node>\r\n        </div>\r\n\r\n    `,\r\n  styles: [\r\n    `\r\n        :host {\r\n            grid-column: 2;\r\n            grid-row: 2;\r\n            border-radius: 0.75rem;\r\n            background-color: white;\r\n            border-width: 1px;\r\n            position: relative;\r\n            overflow: hidden;\r\n        }\r\n    `,\r\n  ],\r\n})\r\nexport class WorkflowCanvasComponent {\r\n  @ViewChild('canvas', { static: true }) canvasRef!: ElementRef<HTMLDivElement>;\r\n\r\n  constructor(\r\n    public workflowService: WorkflowDesignerService,\r\n    private sidePageService: SidePageService,\r\n  ) {\r\n    this.setupMouseListeners();\r\n  }\r\n\r\n  onMouseDownNode(event: MouseEvent, id: string): void {\r\n    event.stopPropagation();\r\n    this.workflowService.selectedNodeId.set(id);\r\n    this.workflowService.selectedEdgeId.set(null);\r\n\r\n    const rect = this.canvasRef.nativeElement.getBoundingClientRect();\r\n    const node = this.workflowService.nodes().find((n: any) => n.id === id);\r\n    if (!rect || !node) return;\r\n\r\n    const zoom = this.workflowService.zoom();\r\n    const panX = this.workflowService.panOffsetX();\r\n    const panY = this.workflowService.panOffsetY();\r\n\r\n    const offsetX = (event.clientX - rect.left - panX) / zoom - node.x;\r\n    const offsetY = (event.clientY - rect.top - panY) / zoom - node.y;\r\n    this.workflowService.setDragState(id, offsetX, offsetY);\r\n  }\r\n\r\n  onCanvasMouseDown(event: MouseEvent): void {\r\n    if (event.button === 2) {\r\n      if (this.workflowService.isConnectMode()) {\r\n        event.preventDefault();\r\n        this.workflowService.cancelConnection();\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (this.workflowService.isConnectMode()) {\r\n      this.workflowService.cancelConnection();\r\n    }\r\n\r\n    this.workflowService.selectedNodeId.set(null);\r\n    this.workflowService.selectedEdgeId.set(null);\r\n    this.workflowService.startPan(event.clientX, event.clientY);\r\n  }\r\n\r\n  onCanvasContextMenu(event: MouseEvent): void {\r\n    if (this.workflowService.isConnectMode()) {\r\n      event.preventDefault();\r\n    }\r\n  }\r\n\r\n  onNodeDoubleClick(nodeId: string): void {\r\n    this.workflowService.selectedNodeId.set(nodeId);\r\n  }\r\n\r\n  onEdgeClick(event: MouseEvent, edgeId: string): void {\r\n    event.stopPropagation();\r\n    this.workflowService.selectedNodeId.set(null);\r\n    this.workflowService.selectedEdgeId.set(edgeId);\r\n  }\r\n\r\n  onCanvasWheel(event: WheelEvent): void {\r\n    event.preventDefault();\r\n    const rect = this.canvasRef.nativeElement.getBoundingClientRect();\r\n    const screenX = event.clientX - rect.left;\r\n    const screenY = event.clientY - rect.top;\r\n    const zoom = this.workflowService.zoom();\r\n    const panX = this.workflowService.panOffsetX();\r\n    const panY = this.workflowService.panOffsetY();\r\n    const worldX = screenX / zoom - panX;\r\n    const worldY = screenY / zoom - panY;\r\n    this.workflowService.zoomAt(event.deltaY, worldX, worldY);\r\n  }\r\n\r\n  private setupMouseListeners(): void {\r\n    const onMove = (ev: MouseEvent) => {\r\n      const dragState = this.workflowService.getDragState();\r\n      const { draggingId, dx, dy } = dragState;\r\n\r\n      if (draggingId) {\r\n        const rect = this.canvasRef.nativeElement.getBoundingClientRect();\r\n        if (!rect) return;\r\n\r\n        const zoom = this.workflowService.zoom();\r\n        const panX = this.workflowService.panOffsetX();\r\n        const panY = this.workflowService.panOffsetY();\r\n\r\n        const x = ev.clientX - rect.left - panX;\r\n        const y = ev.clientY - rect.top - panY;\r\n\r\n        const nx = x / zoom - dx;\r\n        const ny = y / zoom - dy;\r\n\r\n        this.workflowService.updateNodePosition(draggingId, nx, ny);\r\n        return;\r\n      }\r\n\r\n      if (this.workflowService.isPanning()) {\r\n        this.workflowService.updatePan(ev.clientX, ev.clientY);\r\n      }\r\n    };\r\n\r\n    const onUp = () => {\r\n      this.workflowService.clearDragState();\r\n      this.workflowService.stopPan();\r\n    };\r\n\r\n    window.addEventListener('mousemove', onMove);\r\n    window.addEventListener('mouseup', onUp);\r\n  }\r\n\r\n  onDeleteClick(): void {\r\n    const selectedNodeId = this.workflowService.selectedNodeId();\r\n    const selectedEdgeId = this.workflowService.selectedEdgeId();\r\n\r\n    if (selectedNodeId) {\r\n      this.workflowService.removeNode(selectedNodeId);\r\n    } else if (selectedEdgeId) {\r\n      this.workflowService.removeEdge(selectedEdgeId);\r\n    }\r\n  }\r\n\r\n  onDuplicateClick(): void {\r\n    const selectedNodeId = this.workflowService.selectedNodeId();\r\n    if (selectedNodeId) {\r\n      this.workflowService.duplicateNode(selectedNodeId);\r\n    }\r\n  }\r\n\r\n  onUndoClick(): void {\r\n    this.workflowService.undo();\r\n  }\r\n\r\n  onRedoClick(): void {\r\n    this.workflowService.redo();\r\n  }\r\n\r\n  onHistoryPanelClick(): void {\r\n    this.sidePageService.openSidePage('workflow-history', WorkflowHistoryPanelComponent, {\r\n      position: 'end',\r\n      disableClose: false,\r\n      showCloseBtn: false,\r\n      width: '400px',\r\n      maxWidth: '90%',\r\n      minWidth: '300px',\r\n      panelClass: 'history-side-panel',\r\n      backdropClass: '',\r\n      hasBackdrop: true,\r\n      zIndex: 10000,\r\n      data: { title: 'Workflow History' },\r\n    });\r\n  }\r\n\r\n  onLogHistoryClick(): void {\r\n    this.workflowService.logHistory();\r\n  }\r\n\r\n  onZoomIn(): void {\r\n    this.workflowService.zoomIn();\r\n  }\r\n\r\n  onZoomOut(): void {\r\n    this.workflowService.zoomOut();\r\n  }\r\n\r\n  onZoomReset(): void {\r\n    this.workflowService.zoom.set(1);\r\n    this.workflowService.panOffsetX.set(0);\r\n    this.workflowService.panOffsetY.set(0);\r\n  }\r\n\r\n  onFullscreenToggle(): void {\r\n    this.workflowService.toggleFullscreen();\r\n  }\r\n\r\n  @HostListener('window:keydown', ['$event'])\r\n  handleKeyboardEvent(event: KeyboardEvent): void {\r\n    if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey) {\r\n      event.preventDefault();\r\n      this.workflowService.undo();\r\n    } else if (\r\n      ((event.ctrlKey || event.metaKey) && event.key === 'y') ||\r\n      ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === 'z')\r\n    ) {\r\n      event.preventDefault();\r\n      this.workflowService.redo();\r\n    }\r\n  }\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { InputText } from 'primeng/inputtext';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { WorkflowDesignerService } from '../workflow-designer.service';\r\nimport { WorkflowVariablesService } from '../workflow-variables.service';\r\nimport { WorkflowNodesConfigService } from '../workflow-nodes-config.service';\r\nimport { NodeFieldConfig } from '../workflow-designer.interfaces';\r\n\r\n@Component({\r\n  selector: 'app-workflow-inspector',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule, InputText, FloatLabelModule],\r\n  template: `\r\n\r\n      <div class=\"h-full p-4 overflow-y-auto\" *ngIf=\"selectedNode; else noSelection\">\r\n        <div class=\"flex items-center justify-between\">\r\n          <h3 class=\"text-base font-semibold\">{{ selectedNode.label }}</h3>\r\n          <button \r\n            class=\"text-red-600 text-xs\" \r\n            (click)=\"removeNode()\">\r\n            Remove\r\n          </button>\r\n        </div>\r\n        \r\n        <div class=\"mt-3 space-y-4\">\r\n          <div>\r\n            <p-floatlabel variant=\"on\">\r\n              <input\r\n                pInputText\r\n                class=\"w-full\"\r\n                [value]=\"selectedNode.label\"\r\n                (input)=\"updateLabelSilent($event)\"\r\n                (blur)=\"updateLabel($event)\" />\r\n              <label>Label</label>\r\n            </p-floatlabel>\r\n          </div>\r\n\r\n          <ng-container *ngFor=\"let field of fields; trackBy: trackField\">\r\n            <div>\r\n              <label class=\"block text-xs text-slate-600 mb-1\">{{ field.label }}</label>\r\n              <ng-container [ngSwitch]=\"field.type\">\r\n                <select *ngSwitchCase=\"'select'\"\r\n                        class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                        [value]=\"selectedNodeParams[field.key] ?? ''\"\r\n                        (change)=\"updateField(field, $event)\">\r\n                  <option value=\"\" disabled *ngIf=\"!selectedNodeParams[field.key]\">-- select --</option>\r\n                  <option *ngFor=\"let opt of field.options\" [value]=\"opt\">{{ opt }}</option>\r\n                </select>\r\n                \r\n                <div *ngSwitchCase=\"'switch-cases'\" class=\"space-y-2\">\r\n                  <div *ngFor=\"let caseValue of getSwitchCases(); let i = index; trackBy: trackByIndex\" \r\n                       class=\"flex items-center gap-2\">\r\n                    <input type=\"text\"\r\n                           class=\"flex-1 rounded-md border px-2 py-1 text-sm\"\r\n                           [value]=\"caseValue\"\r\n                           (input)=\"updateSwitchCase(i, $event)\"\r\n                           (blur)=\"saveSwitchCases()\"\r\n                           placeholder=\"Case value\" />\r\n                    <button type=\"button\"\r\n                            class=\"px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm\"\r\n                            (click)=\"removeSwitchCase(i)\"\r\n                            title=\"Remove case\">\r\n                      ✕\r\n                    </button>\r\n                  </div>\r\n                  <button type=\"button\"\r\n                          class=\"w-full px-2 py-1 border border-dashed border-slate-300 rounded text-sm text-slate-600 hover:bg-slate-50\"\r\n                          (click)=\"addSwitchCase()\">\r\n                    + Add Case\r\n                  </button>\r\n                </div>\r\n                \r\n                <textarea *ngSwitchCase=\"'textarea'\"\r\n                          rows=\"3\"\r\n                          class=\"w-full rounded-md border px-2 py-1 text-sm resize-y\"\r\n                          [placeholder]=\"field.placeholder || ''\"\r\n                          (input)=\"updateFieldSilent(field, $event)\"\r\n                          (blur)=\"updateField(field, $event)\">{{ selectedNodeParams[field.key] || '' }}</textarea>\r\n                <input *ngSwitchCase=\"'number'\"\r\n                       type=\"number\"\r\n                       class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                       [placeholder]=\"field.placeholder || ''\"\r\n                       [value]=\"selectedNodeParams[field.key] ?? ''\"\r\n                       (input)=\"updateFieldSilent(field, $event)\"\r\n                       (blur)=\"updateField(field, $event)\" />\r\n                <input *ngSwitchDefault\r\n                       type=\"text\"\r\n                       class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                       [placeholder]=\"field.placeholder || ''\"\r\n                       [value]=\"selectedNodeParams[field.key] ?? ''\"\r\n                       (input)=\"updateFieldSilent(field, $event)\"\r\n                       (blur)=\"updateField(field, $event)\" />\r\n              </ng-container>\r\n              <p *ngIf=\"field.help\" class=\"text-[10px] text-slate-400 mt-1\">{{ field.help }}</p>\r\n            </div>\r\n          </ng-container>\r\n\r\n          <div class=\"pt-2 border-t text-[11px] space-y-1\">\r\n            <p class=\"text-slate-500\">ID: {{ selectedNode.id }}</p>\r\n            <p class=\"text-slate-500\">Type: {{ selectedNode.type }}</p>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <ng-template #noSelection>\r\n        <div class=\"flex border-b\">\r\n          <button \r\n            class=\"flex-1 px-3 py-2 text-sm font-medium transition-colors\"\r\n            [class.text-indigo-600]=\"activeTab === 'properties'\"\r\n            [class.border-b-2]=\"activeTab === 'properties'\"\r\n            [class.border-indigo-600]=\"activeTab === 'properties'\"\r\n            [class.text-slate-600]=\"activeTab !== 'properties'\"\r\n            (click)=\"activeTab = 'properties'\">\r\n            Properties\r\n          </button>\r\n          <button \r\n            class=\"flex-1 px-3 py-2 text-sm font-medium transition-colors\"\r\n            [class.text-indigo-600]=\"activeTab === 'variables'\"\r\n            [class.border-b-2]=\"activeTab === 'variables'\"\r\n            [class.border-indigo-600]=\"activeTab === 'variables'\"\r\n            [class.text-slate-600]=\"activeTab !== 'variables'\"\r\n            (click)=\"activeTab = 'variables'\">\r\n            Variables\r\n          </button>\r\n        </div>\r\n\r\n        <div class=\"p-3 space-y-4 overflow-auto\" *ngIf=\"currentWorkflow && activeTab === 'properties'\">\r\n\r\n               <div>\r\n              <label class=\"block text-xs text-slate-600 mb-1\">ID</label>\r\n              <div class=\"w-full rounded-md border px-2 py-1 bg-slate-50 font-mono text-xs\"\r\n                   [class.text-slate-400]=\"!currentWorkflow.workflowId\"\r\n                   [class.italic]=\"!currentWorkflow.workflowId\">\r\n                {{ currentWorkflow.workflowId || 'Not saved yet' }}\r\n              </div>\r\n            </div>\r\n\r\n\r\n            \r\n            <div>\r\n              <label class=\"block text-xs text-slate-600 mb-1\">\r\n                Name <span class=\"text-red-500\">*</span>\r\n              </label>\r\n              <input\r\n                class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                [class.border-red-300]=\"!workflowValidation.isValid && (!currentWorkflow.name || currentWorkflow.name.trim() === '')\"\r\n                [value]=\"currentWorkflow.name || ''\"\r\n                (input)=\"updateWorkflowFieldSilent('name', $event)\"\r\n                (blur)=\"updateWorkflowField('name', $event)\"\r\n                placeholder=\"Enter workflow name (required)\" />\r\n              <p *ngIf=\"!workflowValidation.isValid && (!currentWorkflow.name || currentWorkflow.name.trim() === '')\" \r\n                 class=\"text-red-500 text-xs mt-1\">\r\n                Workflow name is required\r\n              </p>\r\n            </div>       \r\n\r\n            <div>\r\n              <label class=\"block text-xs text-slate-600 mb-1\">Description</label>\r\n              <textarea\r\n                rows=\"3\"\r\n                class=\"w-full rounded-md border px-2 py-1 text-sm resize-y\"\r\n                [value]=\"currentWorkflow.description || ''\"\r\n                (input)=\"updateWorkflowFieldSilent('description', $event)\"\r\n                (blur)=\"updateWorkflowField('description', $event)\"\r\n                placeholder=\"Enter workflow description\"></textarea>\r\n            </div>\r\n\r\n            <div class=\"space-y-3\">\r\n              <h4 class=\"text-sm font-medium text-slate-700 pt-2 border-t\">Metadata</h4>\r\n              \r\n              <div>\r\n                <label class=\"block text-xs text-slate-600 mb-1\">Category</label>\r\n                <input\r\n                  class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                  [value]=\"currentWorkflow.metadata?.category || ''\"\r\n                  (input)=\"updateMetadataFieldSilent('category', $event)\"\r\n                  (blur)=\"updateMetadataField('category', $event)\"\r\n                  placeholder=\"Enter category\" />\r\n              </div>\r\n\r\n              <div>\r\n                <label class=\"block text-xs text-slate-600 mb-1\">Priority</label>\r\n                <select\r\n                  class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                  [value]=\"currentWorkflow.metadata?.priority || ''\"\r\n                  (change)=\"updateMetadataField('priority', $event)\">\r\n                  <option value=\"\">-- Select Priority --</option>\r\n                  <option value=\"Low\">Low</option>\r\n                  <option value=\"Medium\">Medium</option>\r\n                  <option value=\"High\">High</option>\r\n                  <option value=\"Critical\">Critical</option>\r\n                </select>\r\n              </div>\r\n\r\n              <div>\r\n                <label class=\"block text-xs text-slate-600 mb-1\">Author</label>\r\n                <input\r\n                  class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                  [value]=\"currentWorkflow.metadata?.author || ''\"\r\n                  (input)=\"updateMetadataFieldSilent('author', $event)\"\r\n                  (blur)=\"updateMetadataField('author', $event)\"\r\n                  placeholder=\"Enter author name\" />\r\n              </div>\r\n\r\n              <div>\r\n                <label class=\"block text-xs text-slate-600 mb-1\">Version</label>\r\n                <input\r\n                  class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                  [value]=\"currentWorkflow.metadata?.version || ''\"\r\n                  (input)=\"updateMetadataFieldSilent('version', $event)\"\r\n                  (blur)=\"updateMetadataField('version', $event)\"\r\n                  placeholder=\"e.g., 1.0.0\" />\r\n              </div>\r\n\r\n              <div>\r\n                <label class=\"block text-xs text-slate-600 mb-1\">Approval Status</label>\r\n                <select\r\n                  class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                  [value]=\"currentWorkflow.metadata?.approved ?? ''\"\r\n                  (change)=\"updateMetadataFieldBoolean('approved', $event)\">\r\n                  <option value=\"\">-- Select Status --</option>\r\n                  <option value=\"true\">✅ Approved</option>\r\n                  <option value=\"false\">⏳ Pending</option>\r\n                </select>\r\n              </div>\r\n\r\n              <div>\r\n                <label class=\"block text-xs text-slate-600 mb-1\">Tags</label>\r\n                <input\r\n                  class=\"w-full rounded-md border px-2 py-1 text-sm\"\r\n                  [value]=\"(currentWorkflow.metadata?.tags || []).join(', ')\"\r\n                  (input)=\"updateMetadataFieldArraySilent('tags', $event)\"\r\n                  (blur)=\"updateMetadataFieldArray('tags', $event)\"\r\n                  placeholder=\"Enter tags separated by commas\" />\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"pt-2 border-t text-[11px] space-y-1\">\r\n              <p class=\"text-slate-500\" *ngIf=\"currentWorkflow.createdAt\">\r\n                Created: {{ currentWorkflow.createdAt | date:'short' }}\r\n              </p>\r\n              <p class=\"text-slate-500\" *ngIf=\"currentWorkflow.modifiedAt\">\r\n                Updated: {{ currentWorkflow.modifiedAt | date:'short' }}\r\n              </p>\r\n            </div>\r\n          </div>\r\n\r\n        <div class=\"p-3 space-y-3 overflow-auto\" *ngIf=\"currentWorkflow && activeTab === 'variables'\">\r\n          <div class=\"text-xs text-slate-600 mb-2\">\r\n            Define global variables that can be referenced throughout the workflow.\r\n          </div>\r\n\r\n          <div class=\"space-y-2\">\r\n            <div *ngFor=\"let varEntry of getWorkflowVariables(); let i = index; trackBy: trackByIndex\" \r\n                 class=\"flex items-center gap-2 min-w-0\">\r\n              <input type=\"text\"\r\n                     class=\"flex-1 min-w-0 rounded-md border px-2 py-1 text-sm font-mono\"\r\n                     [value]=\"varEntry.key\"\r\n                     (input)=\"updateVariableKey(i, $event)\"\r\n                     (blur)=\"saveVariables()\"\r\n                     placeholder=\"variableName\" />\r\n              <input type=\"text\"\r\n                     class=\"flex-1 min-w-0 rounded-md border px-2 py-1 text-sm\"\r\n                     [value]=\"varEntry.value\"\r\n                     (input)=\"updateVariableValue(i, $event)\"\r\n                     (blur)=\"saveVariables()\"\r\n                     placeholder=\"value\" />\r\n              <button type=\"button\"\r\n                      class=\"px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm\"\r\n                      (click)=\"removeVariable(i)\"\r\n                      title=\"Remove variable\">\r\n                ✕\r\n              </button>\r\n            </div>\r\n          </div>\r\n\r\n          <button type=\"button\"\r\n                  class=\"w-full px-2 py-1 border border-dashed border-slate-300 rounded text-sm text-slate-600 hover:bg-slate-50\"\r\n                  (click)=\"addVariable()\">\r\n            + Add Variable\r\n          </button>\r\n        </div>\r\n\r\n      </ng-template>\r\n\r\n  `,\r\n  styles: [`\r\n      :host {\r\n          grid-column: 3;\r\n          grid-row: 2;\r\n          border-radius: 0.75rem;\r\n          background-color: white;\r\n          border-width: 1px;\r\n          overflow: hidden;\r\n          display: flex;\r\n          flex-direction: column;\r\n      }\r\n    .overflow-auto::-webkit-scrollbar {\r\n      width: 6px;\r\n    }\r\n\r\n    .overflow-auto::-webkit-scrollbar-track {\r\n      background: transparent;\r\n    }\r\n\r\n    .overflow-auto::-webkit-scrollbar-thumb {\r\n      background: #cbd5e1;\r\n      border-radius: 3px;\r\n    }\r\n\r\n    .overflow-auto::-webkit-scrollbar-thumb:hover {\r\n      background: #94a3b8;\r\n    }\r\n  `]\r\n})\r\nexport class WorkflowInspectorComponent {\r\n  activeTab: 'properties' | 'variables' = 'properties';\r\n  \r\n  constructor(\r\n    public workflowService: WorkflowDesignerService,\r\n    public variablesService: WorkflowVariablesService,\r\n    private configService: WorkflowNodesConfigService\r\n  ) {}\r\n\r\n  get selectedNode() {\r\n    return this.workflowService.selectedNode();\r\n  }\r\n\r\n  get currentWorkflow() {\r\n    return this.workflowService.currentWorkflow();\r\n  }\r\n\r\n  get workflowValidation() {\r\n    return this.workflowService.validateWorkflow();\r\n  }\r\n\r\n  get selectedNodeParams() {\r\n    const node = this.selectedNode;\r\n    return node ? (node.params || {}) : {};\r\n  }\r\n\r\n  get fields(): NodeFieldConfig[] {\r\n    if (!this.selectedNode) return [];\r\n    const config = this.configService.getNodeTypeConfig(this.selectedNode.type);\r\n    return config?.properties || [];\r\n  }\r\n\r\n  trackField(index: number, field: NodeFieldConfig) { return field.key; }\r\n\r\n  trackByIndex(index: number) { return index; }\r\n\r\n  removeNode() {\r\n    const node = this.selectedNode;\r\n    if (node) {\r\n      this.workflowService.removeNode(node.id);\r\n    }\r\n  }\r\n\r\n  updateLabel(event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement;\r\n    const node = this.selectedNode;\r\n    if (node) {\r\n      this.workflowService.updateNode(node.id, { label: target.value });\r\n    }\r\n  }\r\n\r\n  updateLabelSilent(event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement;\r\n    const node = this.selectedNode;\r\n    if (node) {\r\n      this.workflowService.updateNodeSilent(node.id, { label: target.value });\r\n    }\r\n  }\r\n\r\n  updateField(field: NodeFieldConfig, event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n    let value: any = target.value;\r\n    if (field.type === 'number') {\r\n      value = value === '' ? null : Number(value);\r\n    }\r\n    const node = this.selectedNode;\r\n    if (node) {\r\n      this.workflowService.updateParam(node.id, field.key, value);\r\n    }\r\n  }\r\n\r\n  updateFieldSilent(field: NodeFieldConfig, event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n    let value: any = target.value;\r\n    if (field.type === 'number') {\r\n      value = value === '' ? null : Number(value);\r\n    }\r\n    const node = this.selectedNode;\r\n    if (node) {\r\n      this.workflowService.updateParamSilent(node.id, field.key, value);\r\n    }\r\n  }\r\n\r\n  updateWorkflowField(field: string, event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement;\r\n    const value = target.value;\r\n    this.workflowService.updateWorkflowField(field, value);\r\n  }\r\n\r\n  updateWorkflowFieldSilent(field: string, event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement;\r\n    const value = target.value;\r\n    this.workflowService.updateWorkflowFieldSilent(field, value);\r\n  }\r\n\r\n  updateMetadataField(field: string, event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLSelectElement;\r\n    const value = target.value;\r\n    this.workflowService.updateWorkflowMetadata(field, value);\r\n  }\r\n\r\n  updateMetadataFieldSilent(field: string, event: Event) {\r\n    const target = event.target as HTMLInputElement | HTMLSelectElement;\r\n    const value = target.value;\r\n    this.workflowService.updateWorkflowMetadataSilent(field, value);\r\n  }\r\n\r\n  updateMetadataFieldBoolean(field: string, event: Event) {\r\n    const target = event.target as HTMLSelectElement;\r\n    const value = target.value === '' ? undefined : target.value === 'true';\r\n    this.workflowService.updateWorkflowMetadata(field, value);\r\n  }\r\n\r\n  updateMetadataFieldArray(field: string, event: Event) {\r\n    const target = event.target as HTMLInputElement;\r\n    const value = target.value\r\n      .split(',')\r\n      .map(tag => tag.trim())\r\n      .filter(tag => tag.length > 0);\r\n    this.workflowService.updateWorkflowMetadata(field, value);\r\n  }\r\n\r\n  updateMetadataFieldArraySilent(field: string, event: Event) {\r\n    const target = event.target as HTMLInputElement;\r\n    const value = target.value\r\n      .split(',')\r\n      .map(tag => tag.trim())\r\n      .filter(tag => tag.length > 0);\r\n    this.workflowService.updateWorkflowMetadataSilent(field, value);\r\n  }\r\n\r\n  updateParam(paramName: string, event: Event) {\r\n    const target = event.target as HTMLInputElement;\r\n    const node = this.selectedNode;\r\n    if (node) {\r\n      this.workflowService.updateParam(node.id, paramName, target.value);\r\n    }\r\n  }\r\n\r\n  private switchCasesTemp: string[] = [];\r\n  private lastNodeId: string | null = null;\r\n  private switchCasesInitialized = false;\r\n\r\n  getSwitchCases(): string[] {\r\n    const node = this.selectedNode;\r\n    if (!node) {\r\n      this.switchCasesInitialized = false;\r\n      return [];\r\n    }\r\n    \r\n    if (this.lastNodeId !== node.id) {\r\n      this.switchCasesTemp = [];\r\n      this.lastNodeId = node.id;\r\n      this.switchCasesInitialized = false;\r\n    }\r\n    \r\n    const casesValue = node.params?.['cases'];\r\n    \r\n    if (!this.switchCasesInitialized) {\r\n      if (!casesValue) {\r\n        this.switchCasesTemp = [''];\r\n      } else if (typeof casesValue === 'string') {\r\n        this.switchCasesTemp = casesValue\r\n          .split(',')\r\n          .map(c => c.trim())\r\n          .filter(c => c.length > 0);\r\n        if (this.switchCasesTemp.length === 0) {\r\n          this.switchCasesTemp = [''];\r\n        }\r\n      } else if (Array.isArray(casesValue)) {\r\n        this.switchCasesTemp = [...casesValue];\r\n      }\r\n      this.switchCasesInitialized = true;\r\n    }\r\n    \r\n    return this.switchCasesTemp;\r\n  }\r\n\r\n  updateSwitchCase(index: number, event: Event) {\r\n    const target = event.target as HTMLInputElement;\r\n    this.switchCasesTemp[index] = target.value;\r\n  }\r\n\r\n  saveSwitchCases() {\r\n    const node = this.selectedNode;\r\n    if (!node) return;\r\n\r\n    const validCases = this.switchCasesTemp.filter(c => c.trim().length > 0);\r\n    const casesString = validCases.join(', ');\r\n\r\n    this.workflowService.updateParam(node.id, 'cases', casesString);\r\n  }\r\n\r\n  addSwitchCase() {\r\n    this.switchCasesTemp.push('');\r\n    this.switchCasesTemp = [...this.switchCasesTemp];\r\n  }\r\n\r\n  removeSwitchCase(index: number) {\r\n    const node = this.selectedNode;\r\n    if (!node) return;\r\n\r\n    this.switchCasesTemp.splice(index, 1);\r\n    \r\n    if (this.switchCasesTemp.length === 0) {\r\n      this.switchCasesTemp = [''];\r\n    }\r\n\r\n    const validCases = this.switchCasesTemp.filter(c => c.trim().length > 0);\r\n    const casesString = validCases.join(', ');\r\n    \r\n    this.workflowService.updateParam(node.id, 'cases', casesString);\r\n  }\r\n\r\n  private variablesTemp: Array<{ key: string; value: string }> = [];\r\n  private variablesInitialized = false;\r\n  private lastWorkflowId: number | string | null | undefined = null;\r\n\r\n  getWorkflowVariables(): Array<{ key: string; value: string }> {\r\n    const workflow = this.currentWorkflow;\r\n    if (!workflow) {\r\n      this.variablesInitialized = false;\r\n      this.lastWorkflowId = null;\r\n      return [];\r\n    }\r\n\r\n    const workflowChanged = this.lastWorkflowId !== workflow.workflowId;\r\n    if (workflowChanged) {\r\n      this.variablesInitialized = false;\r\n      this.lastWorkflowId = workflow.workflowId;\r\n    }\r\n\r\n    if (!this.variablesInitialized) {\r\n      this.variablesTemp = this.variablesService.getVariablesArray();\r\n      \r\n      if (this.variablesTemp.length === 0) {\r\n        this.variablesTemp = [{ key: '', value: '' }];\r\n      }\r\n      this.variablesInitialized = true;\r\n    }\r\n\r\n    return this.variablesTemp;\r\n  }\r\n\r\n  updateVariableKey(index: number, event: Event) {\r\n    const target = event.target as HTMLInputElement;\r\n    this.variablesTemp[index].key = target.value;\r\n  }\r\n\r\n  updateVariableValue(index: number, event: Event) {\r\n    const target = event.target as HTMLInputElement;\r\n    this.variablesTemp[index].value = target.value;\r\n  }\r\n\r\n  saveVariables() {\r\n    const workflow = this.currentWorkflow;\r\n    if (!workflow) return;\r\n\r\n    const validVariables = this.variablesTemp\r\n      .filter(v => v.key.trim().length > 0)\r\n      .reduce((obj, v) => {\r\n        obj[v.key.trim()] = v.value;\r\n        return obj;\r\n      }, {} as Record<string, string>);\r\n\r\n    this.workflowService.updateWorkflowVariables(validVariables);\r\n  }\r\n\r\n  addVariable() {\r\n    this.variablesTemp.push({ key: '', value: '' });\r\n    this.variablesTemp = [...this.variablesTemp];\r\n  }\r\n\r\n  removeVariable(index: number) {\r\n    this.variablesTemp.splice(index, 1);\r\n    \r\n    if (this.variablesTemp.length === 0) {\r\n      this.variablesTemp = [{ key: '', value: '' }];\r\n    }\r\n\r\n    this.saveVariables();\r\n  }\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { WorkflowDesignerService } from '../workflow-designer.service';\r\n\r\n@Component({\r\n  selector: 'app-workflow-validation-dialog',\r\n  standalone: true,\r\n  imports: [CommonModule, DialogModule, ButtonModule],\r\n  template: `\r\n    <p-dialog\r\n      [(visible)]=\"isVisible\"\r\n      [modal]=\"true\"\r\n      [closable]=\"true\"\r\n      [dismissableMask]=\"true\"\r\n      [draggable]=\"false\"\r\n      [resizable]=\"false\"\r\n      styleClass=\"validation-dialog\"\r\n      [style]=\"{ width: '500px', maxWidth: '90vw' }\">\r\n      \r\n      <ng-template pTemplate=\"header\">\r\n        <div class=\"flex items-center gap-3\">\r\n          @if (validationResult()?.success) {\r\n            <svg class=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"></path>\r\n            </svg>\r\n          } @else {\r\n            <svg class=\"w-6 h-6 text-red-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"></path>\r\n            </svg>\r\n          }\r\n          <span class=\"text-lg font-semibold\">\r\n            {{ validationResult()?.success ? 'Validation Passed' : 'Validation Failed' }}\r\n          </span>\r\n        </div>\r\n      </ng-template>\r\n      \r\n      <div class=\"py-2\">\r\n        @if (validationResult()?.success) {\r\n          <div class=\"flex items-start gap-3 p-4 bg-green-50 border border-green-200 rounded-lg\">\r\n            <svg class=\"w-5 h-5 text-green-600 mt-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n            </svg>\r\n            <div>\r\n              <p class=\"font-medium text-green-900\">All validation checks passed!</p>\r\n              <p class=\"text-sm text-green-700 mt-1\">Your workflow is ready to be saved and executed.</p>\r\n            </div>\r\n          </div>\r\n        } @else {\r\n          <div class=\"space-y-2\">\r\n            <p class=\"text-sm text-slate-600 mb-3\">\r\n              Found {{ validationResult()?.errors?.length || 0 }} issue(s) that need to be fixed:\r\n            </p>\r\n            \r\n            @for (error of validationResult()?.errors || []; track error) {\r\n              <div class=\"flex items-start gap-2 p-3 bg-red-50 border border-red-200 rounded-lg hover:bg-red-100 transition-colors\">\r\n                <svg class=\"w-4 h-4 text-red-600 mt-0.5 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\r\n                </svg>\r\n                <span class=\"text-sm text-red-900\">{{ error }}</span>\r\n              </div>\r\n            }\r\n          </div>\r\n        }\r\n      </div>\r\n      \r\n      <ng-template pTemplate=\"footer\">\r\n        <div class=\"flex justify-end gap-2\">\r\n          @if (validationResult()?.success) {\r\n            <button \r\n              pButton \r\n              label=\"Close\" \r\n              icon=\"pi pi-check\"\r\n              class=\"p-button-success\"\r\n              (click)=\"closeDialog()\">\r\n            </button>\r\n          } @else {\r\n            <button \r\n              pButton \r\n              label=\"Close\" \r\n              icon=\"pi pi-times\"\r\n              class=\"p-button-secondary\"\r\n              (click)=\"closeDialog()\">\r\n            </button>\r\n          }\r\n        </div>\r\n      </ng-template>\r\n    </p-dialog>\r\n  `,\r\n  styles: [`\r\n    :host ::ng-deep .validation-dialog {\r\n      .p-dialog-header {\r\n        padding: 1.25rem 1.5rem;\r\n        border-bottom: 1px solid #e2e8f0;\r\n      }\r\n      \r\n      .p-dialog-content {\r\n        padding: 1.5rem;\r\n      }\r\n      \r\n      .p-dialog-footer {\r\n        padding: 1rem 1.5rem;\r\n        border-top: 1px solid #e2e8f0;\r\n      }\r\n    }\r\n  `]\r\n})\r\nexport class WorkflowValidationDialogComponent {\r\n  constructor(public workflowService: WorkflowDesignerService) {}\r\n\r\n  get isVisible(): boolean {\r\n    return this.workflowService.showValidationDialog();\r\n  }\r\n\r\n  set isVisible(value: boolean) {\r\n    this.workflowService.showValidationDialog.set(value);\r\n  }\r\n\r\n  get validationResult() {\r\n    return this.workflowService.validationResult;\r\n  }\r\n\r\n  closeDialog(): void {\r\n    this.workflowService.showValidationDialog.set(false);\r\n  }\r\n}\r\n","import { Component, OnInit, OnDestroy, HostListener, signal, Optional, Inject, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { WorkflowHeaderComponent } from './components/workflow-header.component';\r\nimport { WorkflowPaletteComponent } from './components/workflow-palette.component';\r\nimport { WorkflowCanvasComponent } from './components/workflow-canvas.component';\r\nimport { WorkflowInspectorComponent } from './components/workflow-inspector.component';\r\nimport { WorkflowValidationDialogComponent } from './components/workflow-validation-dialog.component';\r\nimport { WorkflowDesignerService } from './workflow-designer.service';\r\n\r\n@Component({\r\n  selector: 'workflow-designer',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    WorkflowHeaderComponent,\r\n    WorkflowPaletteComponent,\r\n    WorkflowCanvasComponent,\r\n    WorkflowInspectorComponent,\r\n    WorkflowValidationDialogComponent,\r\n  ],\r\n  templateUrl: './workflow-designer.component.html',\r\n  styleUrls: ['./workflow-designer.component.css'],\r\n})\r\nexport class WorkflowDesignerComponent implements OnInit, OnDestroy {\r\n  @Input() workflowId?: string;\r\n  \r\n  private destroy$ = new Subject<void>();\r\n  loading = signal<boolean>(false);\r\n  error = signal<string | null>(null);\r\n\r\n  constructor(\r\n    @Optional() private route: ActivatedRoute | null,\r\n    @Optional() private router: Router | null,\r\n    public workflowService: WorkflowDesignerService,\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    // Support for Input workflowId (when used without router)\r\n    if (this.workflowId) {\r\n      this.loadWorkflow(this.workflowId);\r\n      return;\r\n    }\r\n\r\n    // Support for route-based loading (when used with router)\r\n    if (this.route) {\r\n      this.route.queryParams.pipe(takeUntil(this.destroy$)).subscribe((queryParams) => {\r\n        const workflowId = queryParams['id'];\r\n\r\n        if (workflowId && workflowId !== 'new') {\r\n          this.loadWorkflow(workflowId);\r\n        } else {\r\n          this.error.set(null);\r\n          this.loading.set(false);\r\n          this.workflowService.resetAll();\r\n          this.workflowService.saveStateToHistory();\r\n        }\r\n      });\r\n    } else {\r\n      // No router - try to parse URL query params manually\r\n      const urlParams = new URLSearchParams(window.location.search);\r\n      const workflowId = urlParams.get('id');\r\n      \r\n      if (workflowId && workflowId !== 'new') {\r\n        this.loadWorkflow(workflowId);\r\n      } else {\r\n        this.error.set(null);\r\n        this.loading.set(false);\r\n        this.workflowService.resetAll();\r\n        this.workflowService.saveStateToHistory();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  private async loadWorkflow(id: string) {\r\n    this.loading.set(true);\r\n    this.error.set(null);\r\n\r\n    try {\r\n      const success = await this.workflowService.loadWorkflow(id);\r\n      if (!success) {\r\n        this.error.set('Failed to load workflow. It may not exist or be accessible.');\r\n      }\r\n    } catch (error) {\r\n      this.error.set('An error occurred while loading the workflow.');\r\n      console.error('Error loading workflow:', error);\r\n    } finally {\r\n      this.loading.set(false);\r\n    }\r\n  }\r\n\r\n  goBackToList() {\r\n    if (this.router) {\r\n      this.router.navigate(['/']);\r\n    }\r\n  }\r\n\r\n  @HostListener('window:keydown', ['$event'])\r\n  onKeyDown(event: KeyboardEvent) {\r\n    if (event.key === 'Escape') {\r\n      if (this.workflowService.isConnectMode()) {\r\n        this.workflowService.cancelConnection();\r\n        event.preventDefault();\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (event.key === 'Delete') {\r\n      const selectedNodeId = this.workflowService.selectedNodeId();\r\n      const selectedEdgeId = this.workflowService.selectedEdgeId();\r\n\r\n      if (selectedEdgeId) {\r\n        this.workflowService.removeEdge(selectedEdgeId);\r\n        event.preventDefault();\r\n      } else if (selectedNodeId) {\r\n        this.workflowService.removeNode(selectedNodeId);\r\n        event.preventDefault();\r\n      }\r\n    }\r\n  }\r\n}\r\n","<!-- Loading State -->\r\n@if (loading()) {\r\n  <div class=\"h-screen w-full flex items-center justify-center bg-slate-50\">\r\n    <div class=\"text-center\">\r\n      <div class=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4\"></div>\r\n      <p class=\"text-gray-600\">Loading workflow...</p>\r\n    </div>\r\n  </div>\r\n}\r\n\r\n<!-- Error State -->\r\n@if (error() && !loading()) {\r\n  <div class=\"h-screen w-full flex items-center justify-center bg-slate-50\">\r\n    <div class=\"text-center max-w-md\">\r\n      <div class=\"bg-red-50 border border-red-200 rounded-md p-6\">\r\n        <svg class=\"mx-auto h-12 w-12 text-red-400 mb-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n          <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\"></path>\r\n        </svg>\r\n        <h3 class=\"text-lg font-medium text-red-800 mb-2\">Error Loading Workflow</h3>\r\n        <p class=\"text-red-700 mb-4\">{{ error() }}</p>\r\n        <div class=\"space-x-3\">\r\n          <button \r\n            (click)=\"goBackToList()\"\r\n            class=\"bg-red-100 hover:bg-red-200 text-red-800 px-4 py-2 rounded border border-red-300 transition-colors duration-200\">\r\n            Back to Workflows\r\n          </button>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n}\r\n\r\n<!-- Main Workflow Designer -->\r\n@if (!loading() && !error()) {\r\n  <div class=\"h-[90vh] w-full px-3\">\r\n  <div class=\"h-full w-full grid gap-2 grid-rows-[56px_1fr]\"\r\n       [class.grid-cols-[280px_1fr_360px]]=\"!workflowService.isFullscreen()\"\r\n       [class.grid-cols-[0px_1fr_0px]]=\"workflowService.isFullscreen()\">\r\n    <!-- Header -->\r\n    <app-workflow-header \r\n      [class.col-span-3]=\"!workflowService.isFullscreen()\" \r\n      [class.col-span-1]=\"workflowService.isFullscreen()\" \r\n      class=\"row-[1]\"></app-workflow-header>\r\n\r\n    <!-- Left Sidebar - Node Palette (hidden in fullscreen) -->\r\n    <app-workflow-palette *ngIf=\"!workflowService.isFullscreen()\" class=\"col-[1] row-[2]\"></app-workflow-palette>\r\n\r\n    <!-- Main Canvas -->\r\n    <app-workflow-canvas \r\n      [class.col-[2]]=\"!workflowService.isFullscreen()\" \r\n      [class.col-[1]]=\"workflowService.isFullscreen()\" \r\n      class=\"row-[2]\"></app-workflow-canvas>\r\n\r\n    <!-- Right Sidebar - Property Inspector (hidden in fullscreen) -->\r\n    @if (!workflowService.isFullscreen()) {\r\n      <app-workflow-inspector class=\"col-[3] row-[2]\"></app-workflow-inspector>\r\n    }\r\n\r\n    <!-- Bottom Panel - Simulation & Logs - Hidden for now -->\r\n    <!-- <app-workflow-logs class=\"col-span-3 row-[3]\"></app-workflow-logs> -->\r\n  </div>\r\n  \r\n  <!-- Validation Dialog -->\r\n  <app-workflow-validation-dialog></app-workflow-validation-dialog>\r\n  </div>\r\n}\r\n","// Public API Surface of ngx-workflow-designer\r\n\r\nexport * from './lib/core/workflow-lib.config';\r\nexport * from './lib/core/workflow-node-types.token';\r\nexport * from './lib/core/providers';\r\nexport * from './lib/core/services/workflow-api.service';\r\nexport * from './lib/workflow-designer/workflow-designer.interfaces';\r\nexport * from './lib/workflow-designer/workflow-history.service';\r\nexport * from './lib/workflow-designer/workflow-variables.service';\r\nexport * from './lib/workflow-designer/special-markers.service';\r\nexport * from './lib/workflow-designer/workflow-nodes-config.service';\r\nexport * from './lib/workflow-designer/workflow-designer.service';\r\nexport * from './lib/workflow-designer/workflow-designer.component';\r\nexport * from './lib/workflow-designer/config/workflow-nodes-config.data';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WorkflowApiService","i2.WorkflowHistoryService","i3.WorkflowNodesConfigService","i4.WorkflowVariablesService","i5.SpecialMarkersService","i1.WorkflowDesignerService","i4","i1","i2.WorkflowNodesConfigService","i2","i2.SidePageService","i2.WorkflowVariablesService","i3","i2.WorkflowDesignerService"],"mappings":"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"}