@memberjunction/ng-flow-editor 5.28.0 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -87,7 +87,7 @@ export declare class FlowAgentEditorComponent implements OnInit, OnChanges, OnDe
87
87
  /** Write current FlowNode positions back to the underlying step entities.
88
88
  * Called on every node move so that rebuildFlowModel() never loses drag changes. */
89
89
  private syncPositionsToEntities;
90
- private deleteRemovedEntities;
90
+ private queueRemovedEntitiesForDelete;
91
91
  protected onNodeAdded(event: FlowNodeAddedEvent): Promise<void>;
92
92
  protected onConnectionCreated(event: FlowConnectionCreatedEvent): Promise<void>;
93
93
  protected onNodeSelected(node: FlowNode | null): void;
@@ -1 +1 @@
1
- {"version":3,"file":"flow-agent-editor.component.d.ts","sourceRoot":"","sources":["../../../src/lib/agent-editor/flow-agent-editor.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flow-agent-editor.component.d.ts","sourceRoot":"","sources":["../../../src/lib/agent-editor/flow-agent-editor.component.ts"],"names":[],"mappings":"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"}
@@ -403,22 +403,25 @@ export class FlowAgentEditorComponent {
403
403
  try {
404
404
  // Update positions from canvas to entities
405
405
  this.syncPositionsFromCanvas();
406
- // Delete removed items first
407
- await this.deleteRemovedEntities();
408
- // Save all steps
406
+ // Bundle deletes and saves for steps + paths into one transaction so a partial save
407
+ // can never leave the flow in an inconsistent state.
408
+ const md = new Metadata();
409
+ const tg = await md.CreateTransactionGroup();
410
+ await this.queueRemovedEntitiesForDelete(tg);
409
411
  for (const step of this.steps) {
410
- const result = await step.Save();
411
- if (!result) {
412
- console.error(`Failed to save step: ${step.Name}`, step.LatestResult);
413
- }
412
+ step.TransactionGroup = tg;
413
+ await step.Save();
414
414
  }
415
- // Save all paths
416
415
  for (const path of this.paths) {
417
- const result = await path.Save();
418
- if (!result) {
419
- console.error(`Failed to save path: ${path.ID}`, path.LatestResult);
420
- }
416
+ path.TransactionGroup = tg;
417
+ await path.Save();
418
+ }
419
+ if (!await tg.Submit()) {
420
+ console.error('Failed to save flow — all changes have been rolled back');
421
+ return;
421
422
  }
423
+ this.deletedPathIDs = [];
424
+ this.deletedStepIDs = [];
422
425
  this.hasUnsavedChanges = false;
423
426
  this.lastSaved = new Date();
424
427
  // Exit self-contained fullscreen edit mode after successful save
@@ -448,20 +451,20 @@ export class FlowAgentEditorComponent {
448
451
  }
449
452
  }
450
453
  }
451
- async deleteRemovedEntities() {
454
+ async queueRemovedEntitiesForDelete(tg) {
452
455
  const md = new Metadata();
453
456
  for (const pathId of this.deletedPathIDs) {
454
457
  const pathEntity = await md.GetEntityObject('MJ: AI Agent Step Paths');
455
458
  await pathEntity.InnerLoad(CompositeKey.FromID(pathId));
459
+ pathEntity.TransactionGroup = tg;
456
460
  await pathEntity.Delete();
457
461
  }
458
462
  for (const stepId of this.deletedStepIDs) {
459
463
  const stepEntity = await md.GetEntityObject('MJ: AI Agent Steps');
460
464
  await stepEntity.InnerLoad(CompositeKey.FromID(stepId));
465
+ stepEntity.TransactionGroup = tg;
461
466
  await stepEntity.Delete();
462
467
  }
463
- this.deletedPathIDs = [];
464
- this.deletedStepIDs = [];
465
468
  }
466
469
  // ── Flow Editor Event Handlers ──────────────────────────────
467
470
  async onNodeAdded(event) {
@@ -1 +1 @@
1
- {"version":3,"file":"flow-agent-editor.component.js","sourceRoot":"","sources":["../../../src/lib/agent-editor/flow-agent-editor.component.ts","../../../src/lib/agent-editor/flow-agent-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnChanges, OnDestroy,\n SimpleChanges, ChangeDetectorRef, ViewEncapsulation, HostListener, HostBinding,\n ElementRef, Renderer2\n} from '@angular/core';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJAIAgentStepEntity, MJAIAgentStepPathEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { FlowNode, FlowConnection, FlowNodeAddedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent, FlowNodeTypeConfig } from '../interfaces/flow-types';\nimport { FlowEditorComponent } from '../components/flow-editor.component';\nimport { AgentFlowTransformerService, AGENT_STEP_TYPE_CONFIGS } from './agent-flow-transformer.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/** View mode for the agent editor */\nexport type AgentEditorViewMode = 'diagram' | 'list';\n\n/**\n * Flow Agent Editor — wraps the generic FlowEditorComponent with\n * MJ agent-specific CRUD, properties panel, and data transformation.\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-agent-editor',\n templateUrl: './flow-agent-editor.component.html',\n styleUrls: ['./flow-agent-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n providers: [AgentFlowTransformerService]\n})\nexport class FlowAgentEditorComponent implements OnInit, OnChanges, OnDestroy {\n // ── Host Bindings ─────────────────────────────────────────────\n @HostBinding('class.mj-flow-agent-editor--fullscreen') get HostFullScreen(): boolean { return this.FullScreen; }\n\n // ── Inputs ──────────────────────────────────────────────────\n @Input() AgentID: string | null = null;\n @Input() EditMode = true;\n @Input() FullScreen = false;\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() FlowSaved = new EventEmitter<void>();\n @Output() FlowChanged = new EventEmitter<boolean>();\n @Output() FullScreenToggled = new EventEmitter<boolean>();\n @Output() StepSelected = new EventEmitter<MJAIAgentStepEntity | null>();\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild('flowEditor') protected flowEditor: FlowEditorComponent | undefined;\n\n // ── State ───────────────────────────────────────────────────\n protected nodes: FlowNode[] = [];\n protected connections: FlowConnection[] = [];\n protected nodeTypes: FlowNodeTypeConfig[] = AGENT_STEP_TYPE_CONFIGS;\n protected viewMode: AgentEditorViewMode = 'diagram';\n protected isLoading = true;\n protected isSaving = false;\n protected hasUnsavedChanges = false;\n protected lastSaved: Date | null = null;\n\n // Fullscreen self-contained edit mode\n protected fullscreenEditMode = false;\n protected showUnsavedDialog = false;\n\n // Entity data\n protected steps: MJAIAgentStepEntity[] = [];\n protected paths: MJAIAgentStepPathEntity[] = [];\n protected deletedStepIDs: string[] = [];\n protected deletedPathIDs: string[] = [];\n\n // Selected items\n protected selectedStep: MJAIAgentStepEntity | null = null;\n protected selectedConnection: FlowConnection | null = null;\n protected selectedPathEntity: MJAIAgentStepPathEntity | null = null;\n protected showPropertiesPanel = false;\n\n // Picker data (includes icon fields for node rendering)\n protected availableActions: Array<{ ID: string; Name: string; IconClass?: string | null }> = [];\n protected availablePrompts: Array<{ ID: string; Name: string }> = [];\n protected availableAgents: Array<{ ID: string; Name: string; IconClass?: string | null; LogoURL?: string | null }> = [];\n\n // Permission state — cached once on init\n protected userCanUpdate = false;\n\n // User view preferences (persisted via UserInfoEngine)\n protected prefShowGrid = true;\n protected prefShowMinimap = true;\n protected prefShowLegend = true;\n\n private static readonly PREF_KEY = 'flow-editor/view-prefs';\n\n // Initial zoom state\n private needsInitialZoom = false;\n private resizeObserver: ResizeObserver | null = null;\n\n // Fullscreen DOM relocation state\n private originalParent: HTMLElement | null = null;\n private originalNextSibling: Node | null = null;\n private backdropElement: HTMLElement | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private transformer: AgentFlowTransformerService,\n private elRef: ElementRef<HTMLElement>,\n private renderer: Renderer2\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.loadViewPreferences();\n this.checkUpdatePermission();\n if (this.AgentID) {\n this.loadAll();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['AgentID'] && !changes['AgentID'].firstChange && this.AgentID) {\n this.loadAll();\n }\n }\n\n ngOnDestroy(): void {\n this.teardownResizeObserver();\n // Restore element to original parent if still in fullscreen\n if (this.FullScreen) {\n this.restoreFromFullscreen();\n }\n }\n\n // ── Data Loading ────────────────────────────────────────────\n\n private async loadAll(): Promise<void> {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n await Promise.all([\n this.loadStepsAndPaths(),\n this.loadPickerData()\n ]);\n this.rebuildFlowModel();\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n\n // Flag that we need an initial zoom; it will fire when the host element\n // first becomes visible (e.g. Kendo PanelBar expands)\n this.setupInitialZoomObserver();\n }\n }\n\n private async loadStepsAndPaths(): Promise<void> {\n if (!this.AgentID) return;\n const rv = new RunView();\n const [stepsResult, pathsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Steps',\n ExtraFilter: `AgentID='${this.AgentID}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: AI Agent Step Paths',\n ExtraFilter: `OriginStepID IN (SELECT ID FROM [__mj].[AIAgentStep] WHERE AgentID='${this.AgentID}')`,\n OrderBy: 'Priority DESC',\n ResultType: 'entity_object'\n }\n ]);\n\n this.steps = stepsResult.Success ? (stepsResult.Results as MJAIAgentStepEntity[]) : [];\n this.paths = pathsResult.Success ? (pathsResult.Results as MJAIAgentStepPathEntity[]) : [];\n this.deletedStepIDs = [];\n this.deletedPathIDs = [];\n }\n\n private async loadPickerData(): Promise<void> {\n const rv = new RunView();\n const [actionsResult, promptsResult, agentsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n Fields: ['ID', 'Name', 'IconClass'],\n ExtraFilter: `Status='Active'`,\n OrderBy: 'Name ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompts',\n Fields: ['ID', 'Name'],\n ExtraFilter: '',\n OrderBy: 'Name ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name', 'IconClass', 'LogoURL'],\n ExtraFilter: this.AgentID ? `ID <> '${this.AgentID}'` : '',\n OrderBy: 'Name ASC',\n ResultType: 'simple'\n }\n ]);\n\n this.availableActions = actionsResult.Success\n ? (actionsResult.Results as Array<{ ID: string; Name: string; IconClass?: string | null }>)\n : [];\n this.availablePrompts = promptsResult.Success\n ? (promptsResult.Results as Array<{ ID: string; Name: string }>)\n : [];\n this.availableAgents = agentsResult.Success\n ? (agentsResult.Results as Array<{ ID: string; Name: string; IconClass?: string | null; LogoURL?: string | null }>)\n : [];\n }\n\n private rebuildFlowModel(): void {\n this.nodes = this.transformer.StepsToNodes(this.steps, this.availableActions, this.availableAgents);\n this.connections = this.transformer.PathsToConnections(this.paths);\n }\n\n /**\n * Observe the host element's size. When it transitions from zero to non-zero height\n * (i.e. the collapsed Kendo panel expands), trigger the initial auto-arrange or zoom-to-fit.\n */\n private setupInitialZoomObserver(): void {\n if (this.nodes.length === 0) return;\n\n this.needsInitialZoom = true;\n this.teardownResizeObserver();\n\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.contentRect.height;\n if (height > 0 && this.needsInitialZoom) {\n this.needsInitialZoom = false;\n this.teardownResizeObserver();\n // Short delay for Foblex canvas to finish its own init after becoming visible\n setTimeout(() => this.applyInitialZoom(), 100);\n }\n }\n });\n\n this.resizeObserver.observe(this.elRef.nativeElement);\n }\n\n private applyInitialZoom(): void {\n if (!this.flowEditor || this.nodes.length === 0) return;\n const allAtOrigin = this.nodes.every(n => n.Position.X === 0 && n.Position.Y === 0);\n if (allAtOrigin) {\n this.flowEditor.AutoArrange();\n } else {\n this.flowEditor.ZoomToFit();\n }\n }\n\n private teardownResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n // ── Save ────────────────────────────────────────────────────\n\n async Save(): Promise<void> {\n if (this.isSaving || !this.AgentID) return;\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n // Update positions from canvas to entities\n this.syncPositionsFromCanvas();\n\n // Delete removed items first\n await this.deleteRemovedEntities();\n\n // Save all steps\n for (const step of this.steps) {\n const result = await step.Save();\n if (!result) {\n console.error(`Failed to save step: ${step.Name}`, step.LatestResult);\n }\n }\n\n // Save all paths\n for (const path of this.paths) {\n const result = await path.Save();\n if (!result) {\n console.error(`Failed to save path: ${path.ID}`, path.LatestResult);\n }\n }\n\n this.hasUnsavedChanges = false;\n this.lastSaved = new Date();\n\n // Exit self-contained fullscreen edit mode after successful save\n if (this.fullscreenEditMode) {\n this.fullscreenEditMode = false;\n }\n\n this.FlowSaved.emit();\n } catch (err) {\n console.error('Error saving flow:', err);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n private syncPositionsFromCanvas(): void {\n this.syncPositionsToEntities();\n }\n\n /** Write current FlowNode positions back to the underlying step entities.\n * Called on every node move so that rebuildFlowModel() never loses drag changes. */\n private syncPositionsToEntities(): void {\n for (const node of this.nodes) {\n const step = this.steps.find(s => UUIDsEqual(s.ID, node.ID));\n if (step) {\n this.transformer.ApplyNodePosition(step, node);\n }\n }\n }\n\n private async deleteRemovedEntities(): Promise<void> {\n const md = new Metadata();\n\n for (const pathId of this.deletedPathIDs) {\n const pathEntity = await md.GetEntityObject<MJAIAgentStepPathEntity>('MJ: AI Agent Step Paths');\n await pathEntity.InnerLoad(CompositeKey.FromID(pathId));\n await pathEntity.Delete();\n }\n\n for (const stepId of this.deletedStepIDs) {\n const stepEntity = await md.GetEntityObject<MJAIAgentStepEntity>('MJ: AI Agent Steps');\n await stepEntity.InnerLoad(CompositeKey.FromID(stepId));\n await stepEntity.Delete();\n }\n\n this.deletedPathIDs = [];\n this.deletedStepIDs = [];\n }\n\n // ── Flow Editor Event Handlers ──────────────────────────────\n\n protected async onNodeAdded(event: FlowNodeAddedEvent): Promise<void> {\n if (!this.AgentID) return;\n\n const md = new Metadata();\n const step = await md.GetEntityObject<MJAIAgentStepEntity>('MJ: AI Agent Steps');\n step.NewRecord(); // This generates a UUID immediately - available before Save()\n step.AgentID = this.AgentID;\n step.Name = event.Node.Label;\n step.StepType = event.Node.Type as 'Action' | 'Prompt' | 'Sub-Agent' | 'ForEach' | 'While';\n step.Status = 'Active';\n step.StartingStep = this.steps.length === 0; // First step is starting step\n step.PositionX = Math.round(event.DropPosition.X);\n step.PositionY = Math.round(event.DropPosition.Y);\n step.OnErrorBehavior = 'fail';\n step.RetryCount = 0;\n step.TimeoutSeconds = 600;\n\n // Add the unsaved step to the array - it already has a UUID from NewRecord()\n // This allows connections to be drawn immediately without waiting for a database save\n this.steps.push(step);\n\n // Build a FlowNode using the entity's pre-generated ID so Foblex can track it\n const newNode = this.transformer.StepToNode(step, this.availableActions, this.availableAgents);\n this.nodes.push(newNode);\n this.markDirty();\n\n // Select the new node\n setTimeout(() => {\n this.flowEditor?.SelectNode(step.ID);\n this.onNodeSelected(newNode);\n }, 100);\n\n this.cdr.detectChanges();\n }\n\n protected async onConnectionCreated(event: FlowConnectionCreatedEvent): Promise<void> {\n if (!this.AgentID) return;\n\n // Prevent duplicate\n const exists = this.paths.some(\n p => UUIDsEqual(p.OriginStepID, event.SourceNodeID) && UUIDsEqual(p.DestinationStepID, event.TargetNodeID)\n );\n if (exists) return;\n\n const md = new Metadata();\n const path = await md.GetEntityObject<MJAIAgentStepPathEntity>('MJ: AI Agent Step Paths');\n path.NewRecord(); // Generates UUID immediately - available before Save()\n path.OriginStepID = event.SourceNodeID;\n path.DestinationStepID = event.TargetNodeID;\n path.Priority = 0;\n\n // Add unsaved path to the array - save will happen on main Save() button\n this.paths.push(path);\n this.rebuildFlowModel();\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n protected onNodeSelected(node: FlowNode | null): void {\n if (node) {\n this.selectedStep = this.steps.find(s => UUIDsEqual(s.ID, node.ID)) ?? null;\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n this.showPropertiesPanel = true;\n this.StepSelected.emit(this.selectedStep);\n } else {\n this.selectedStep = null;\n // Only hide the panel if no connection is currently selected.\n // When the user clicks a connection, Foblex fires NodeSelected(null) AND\n // ConnectionSelected(conn) — we must not let the null-node event hide\n // the panel that the connection event just opened.\n if (!this.selectedConnection) {\n this.showPropertiesPanel = false;\n }\n this.StepSelected.emit(null);\n }\n this.cdr.detectChanges();\n }\n\n protected onConnectionSelected(conn: FlowConnection | null): void {\n if (conn) {\n this.selectedConnection = conn;\n this.selectedPathEntity = this.paths.find(p => UUIDsEqual(p.ID, conn.ID)) ?? null;\n this.selectedStep = null;\n this.showPropertiesPanel = true;\n } else {\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n }\n this.cdr.detectChanges();\n }\n\n protected onNodeRemoved(node: FlowNode): void {\n const step = this.steps.find(s => UUIDsEqual(s.ID, node.ID));\n if (step) {\n // Track for deletion on save (only if it was previously saved)\n if (step.IsSaved) {\n this.deletedStepIDs.push(step.ID);\n // Also mark paths connected to this step for deletion\n const connectedPaths = this.paths.filter(\n p => UUIDsEqual(p.OriginStepID, step.ID) || UUIDsEqual(p.DestinationStepID, step.ID)\n );\n for (const path of connectedPaths) {\n if (path.IsSaved) {\n this.deletedPathIDs.push(path.ID);\n }\n }\n }\n this.steps = this.steps.filter(s => !UUIDsEqual(s.ID, node.ID));\n this.paths = this.paths.filter(\n p => !UUIDsEqual(p.OriginStepID, node.ID) && !UUIDsEqual(p.DestinationStepID, node.ID)\n );\n this.markDirty();\n }\n }\n\n protected onConnectionRemoved(conn: FlowConnection): void {\n const path = this.paths.find(p => UUIDsEqual(p.ID, conn.ID));\n if (path) {\n if (path.IsSaved) {\n this.deletedPathIDs.push(path.ID);\n }\n this.paths = this.paths.filter(p => !UUIDsEqual(p.ID, conn.ID));\n this.markDirty();\n }\n }\n\n protected onConnectionReassigned(event: FlowConnectionReassignedEvent): void {\n const path = this.paths.find(p => UUIDsEqual(p.ID, event.ConnectionID));\n if (!path) return;\n\n // Update the entity's origin/destination to match the new visual endpoints\n path.OriginStepID = event.NewSourceNodeID;\n path.DestinationStepID = event.NewTargetNodeID;\n\n // Rebuild all connections so sibling-based visual logic recalculates\n // (e.g., Default vs Duplicate Default labels depend on sibling analysis)\n this.rebuildFlowModel();\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n protected onNodesChanged(nodes: FlowNode[]): void {\n this.nodes = nodes;\n // Sync canvas positions back to entities immediately so that\n // any subsequent rebuildFlowModel() preserves drag changes.\n this.syncPositionsToEntities();\n this.markDirty(); \n }\n\n protected onConnectionsChanged(connections: FlowConnection[]): void {\n this.connections = connections;\n this.markDirty();\n }\n\n // ── Properties Panel Events ─────────────────────────────────\n\n protected onStepChanged(step: MJAIAgentStepEntity): void {\n // Update the corresponding flow node in-place and push to generic editor\n const node = this.nodes.find(n => UUIDsEqual(n.ID, step.ID));\n if (node) {\n const newLabel = step.Name;\n const newSubtitle = this.transformer.BuildStepSubtitle(step);\n const baseStatus = this.transformer.MapStepStatus(step.Status);\n const warningMessage = (baseStatus !== 'disabled') ? this.transformer.BuildConfigWarningMessage(step) : null;\n const newStatus = warningMessage ? 'warning' : baseStatus;\n const newIsStart = step.StartingStep === true;\n\n node.Label = newLabel;\n node.Subtitle = newSubtitle;\n node.Status = newStatus;\n node.StatusMessage = warningMessage ?? undefined;\n node.IsStartNode = newIsStart;\n\n // Update input port disabled state for starting steps\n const inputPort = node.Ports.find(p => p.Direction === 'input');\n if (inputPort) {\n inputPort.Disabled = newIsStart;\n }\n\n // Re-resolve icon from picker data (handles action/agent assignment changes)\n const resolved = this.transformer.ResolveStepIcon(step, this.availableActions, this.availableAgents);\n node.Icon = resolved.Icon;\n if (!node.Data) node.Data = {};\n node.Data['LogoURL'] = resolved.LogoURL ?? null;\n\n // For loop nodes, rebuild the loop-specific Data properties so the\n // inner body card updates immediately when the user changes body type / config\n if (step.StepType === 'ForEach' || step.StepType === 'While') {\n this.updateLoopNodeData(step, node);\n }\n\n // Push visual update to the generic flow editor (creates new object ref for OnPush)\n this.flowEditor?.UpdateNode(step.ID, {\n Label: newLabel,\n Subtitle: newSubtitle,\n Status: newStatus,\n StatusMessage: warningMessage ?? undefined,\n IsStartNode: newIsStart,\n Icon: resolved.Icon,\n Data: node.Data\n });\n }\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n /** Update loop-specific data fields on a FlowNode from the step entity */\n private updateLoopNodeData(step: MJAIAgentStepEntity, node: FlowNode): void {\n if (!node.Data) node.Data = {};\n // Delegate to the transformer's public methods for consistency\n const bodyType = step.LoopBodyType;\n node.Data['LoopBodyType'] = bodyType ?? null;\n node.Data['LoopBodyName'] = this.resolveLoopBodyNameFromStep(step);\n node.Data['LoopBodyIcon'] = this.getBodyTypeIcon(bodyType);\n node.Data['LoopBodyColor'] = this.getBodyTypeColor(bodyType);\n node.Data['LoopIterationSummary'] = this.transformer.BuildLoopIterationSummary(step);\n }\n\n private resolveLoopBodyNameFromStep(step: MJAIAgentStepEntity): string | null {\n switch (step.LoopBodyType) {\n case 'Action': return step.Action ?? null;\n case 'Prompt': return step.Prompt ?? null;\n case 'Sub-Agent': return step.SubAgent ?? null;\n default: return null;\n }\n }\n\n private getBodyTypeIcon(bodyType: string | null): string {\n switch (bodyType) {\n case 'Action': return 'fa-bolt';\n case 'Prompt': return 'fa-comment-dots';\n case 'Sub-Agent': return 'fa-robot';\n default: return 'fa-circle-nodes';\n }\n }\n\n private getBodyTypeColor(bodyType: string | null): string {\n switch (bodyType) {\n case 'Action': return '#3B82F6';\n case 'Prompt': return '#8B5CF6';\n case 'Sub-Agent': return '#10B981';\n default: return '#6B7280';\n }\n }\n\n protected onPathChanged(path: MJAIAgentStepPathEntity): void {\n // Rebuild all connections from the same origin since always/conditional logic\n // depends on sibling paths (e.g., \"Default\" label only appears when siblings exist)\n this.rebuildFlowModel();\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n protected onDeleteStepRequested(step: MJAIAgentStepEntity): void {\n const node = this.nodes.find(n => UUIDsEqual(n.ID, step.ID));\n if (node) {\n this.flowEditor?.SelectNode(step.ID);\n this.flowEditor?.DeleteSelected();\n }\n this.showPropertiesPanel = false;\n this.selectedStep = null;\n this.cdr.detectChanges();\n }\n\n protected onDeletePathRequested(path: MJAIAgentStepPathEntity): void {\n const conn = this.connections.find(c => UUIDsEqual(c.ID, path.ID));\n if (conn) {\n if (path.IsSaved) {\n this.deletedPathIDs.push(path.ID);\n }\n this.paths = this.paths.filter(p => !UUIDsEqual(p.ID, path.ID));\n this.rebuildFlowModel();\n this.markDirty();\n }\n this.showPropertiesPanel = false;\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n this.cdr.detectChanges();\n }\n\n protected onCloseProperties(): void {\n this.showPropertiesPanel = false;\n this.flowEditor?.ClearSelection();\n }\n\n // ── View & UI Controls ──────────────────────────────────────\n\n protected toggleViewMode(): void {\n this.viewMode = this.viewMode === 'diagram' ? 'list' : 'diagram';\n this.cdr.detectChanges();\n }\n\n /** Whether editing is currently allowed — combines parent EditMode + fullscreen self-contained edit */\n get isEditingActive(): boolean {\n return this.EditMode || this.fullscreenEditMode;\n }\n\n protected toggleFullscreenEditMode(): void {\n this.fullscreenEditMode = !this.fullscreenEditMode;\n this.cdr.detectChanges();\n }\n\n protected cancelFullscreenEdit(): void {\n if (this.hasUnsavedChanges) {\n // Reload to discard changes\n this.fullscreenEditMode = false;\n this.hasUnsavedChanges = false;\n this.loadAll();\n } else {\n this.fullscreenEditMode = false;\n this.cdr.detectChanges();\n }\n }\n\n protected toggleFullScreen(): void {\n if (this.FullScreen && this.hasUnsavedChanges) {\n this.showUnsavedDialog = true;\n this.cdr.detectChanges();\n return;\n }\n this.performFullscreenToggle();\n }\n\n protected onUnsavedDialogSave(): void {\n this.showUnsavedDialog = false;\n this.Save().then(() => this.performFullscreenToggle());\n }\n\n protected onUnsavedDialogDiscard(): void {\n this.showUnsavedDialog = false;\n this.hasUnsavedChanges = false;\n this.fullscreenEditMode = false;\n this.performFullscreenToggle();\n // Reload original data\n this.loadAll();\n }\n\n protected onUnsavedDialogCancel(): void {\n this.showUnsavedDialog = false;\n this.cdr.detectChanges();\n }\n\n private performFullscreenToggle(): void {\n this.FullScreen = !this.FullScreen;\n\n if (this.FullScreen) {\n this.moveToBodyForFullscreen();\n } else {\n this.fullscreenEditMode = false;\n this.restoreFromFullscreen();\n }\n\n this.FullScreenToggled.emit(this.FullScreen);\n this.cdr.detectChanges();\n // Re-fit after layout change\n setTimeout(() => this.flowEditor?.ZoomToFit(), 200);\n }\n\n private moveToBodyForFullscreen(): void {\n const hostEl = this.elRef.nativeElement;\n this.originalParent = hostEl.parentElement;\n this.originalNextSibling = hostEl.nextSibling;\n\n // Create backdrop as a separate body-level element so it covers everything\n this.backdropElement = this.renderer.createElement('div');\n this.renderer.addClass(this.backdropElement, 'mj-agent-editor-backdrop');\n this.renderer.listen(this.backdropElement, 'click', () => this.toggleFullScreen());\n this.renderer.appendChild(document.body, this.backdropElement);\n\n // Move the host element to body — @HostBinding applies the fixed-position class\n this.renderer.appendChild(document.body, hostEl);\n }\n\n private restoreFromFullscreen(): void {\n // Remove backdrop\n if (this.backdropElement) {\n this.renderer.removeChild(document.body, this.backdropElement);\n this.backdropElement = null;\n }\n\n // Restore host element to original position\n if (!this.originalParent) return;\n const hostEl = this.elRef.nativeElement;\n if (this.originalNextSibling) {\n this.renderer.insertBefore(this.originalParent, hostEl, this.originalNextSibling);\n } else {\n this.renderer.appendChild(this.originalParent, hostEl);\n }\n this.originalParent = null;\n this.originalNextSibling = null;\n }\n\n protected onStepClickedInList(step: MJAIAgentStepEntity): void {\n this.selectedStep = step;\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n this.showPropertiesPanel = true;\n this.StepSelected.emit(step);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('document:keydown.escape')\n protected onEscapeKey(): void {\n if (this.showUnsavedDialog) {\n this.onUnsavedDialogCancel();\n } else if (this.FullScreen) {\n this.toggleFullScreen();\n }\n }\n\n // ── Permission Check ────────────────────────────────────────\n\n private checkUpdatePermission(): void {\n const md = new Metadata();\n const entity = md.EntityByName('MJ: AI Agents');\n if (entity) {\n const perms = entity.GetUserPermisions(md.CurrentUser);\n this.userCanUpdate = perms?.CanUpdate === true;\n }\n }\n\n // ── View Preference Persistence ─────────────────────────────\n\n private loadViewPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(FlowAgentEditorComponent.PREF_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw) as { grid?: boolean; minimap?: boolean; legend?: boolean };\n if (prefs.grid != null) this.prefShowGrid = prefs.grid;\n if (prefs.minimap != null) this.prefShowMinimap = prefs.minimap;\n if (prefs.legend != null) this.prefShowLegend = prefs.legend;\n } catch {\n // Ignore malformed preference data\n }\n }\n }\n\n private saveViewPreferences(): void {\n const prefs = JSON.stringify({\n grid: this.prefShowGrid,\n minimap: this.prefShowMinimap,\n legend: this.prefShowLegend\n });\n // Fire-and-forget — preference save errors are non-critical\n UserInfoEngine.Instance.SetSetting(FlowAgentEditorComponent.PREF_KEY, prefs);\n }\n\n protected onGridPrefChanged(show: boolean): void {\n this.prefShowGrid = show;\n this.saveViewPreferences();\n }\n\n protected onMinimapPrefChanged(show: boolean): void {\n this.prefShowMinimap = show;\n this.saveViewPreferences();\n }\n\n protected onLegendPrefChanged(show: boolean): void {\n this.prefShowLegend = show;\n this.saveViewPreferences();\n }\n\n // ── Helpers ─────────────────────────────────────────────────\n\n private markDirty(): void {\n if (!this.hasUnsavedChanges) {\n this.hasUnsavedChanges = true;\n this.FlowChanged.emit(true);\n }\n }\n}\n","<div class=\"mj-agent-editor\">\n\n <!-- ── Toolbar ─────────────────────────────────────────────── -->\n <div class=\"mj-agent-editor-toolbar\" [class.mj-agent-editor-toolbar--editing]=\"isEditingActive\">\n <div class=\"mj-agent-editor-toolbar-left\">\n <!-- Undo / Redo (edit mode only) -->\n @if (isEditingActive) {\n <button class=\"mj-agent-editor-btn\"\n [disabled]=\"!flowEditor?.CanUndo\" (click)=\"flowEditor?.Undo()\" title=\"Undo (Ctrl+Z)\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n </button>\n }\n @if (isEditingActive) {\n <button class=\"mj-agent-editor-btn\"\n [disabled]=\"!flowEditor?.CanRedo\" (click)=\"flowEditor?.Redo()\" title=\"Redo (Ctrl+Y)\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n </button>\n }\n </div>\n\n <div class=\"mj-agent-editor-toolbar-center\">\n <!-- Fullscreen title -->\n <span class=\"mj-agent-editor-title\">\n <i class=\"fa-solid fa-diagram-project\"></i> Flow Configuration\n </span>\n\n <!-- View Mode Toggle -->\n <div class=\"mj-agent-editor-view-toggle\">\n <button class=\"mj-agent-editor-view-btn\"\n [class.mj-agent-editor-view-btn--active]=\"viewMode === 'diagram'\"\n (click)=\"viewMode = 'diagram'\">\n <i class=\"fa-solid fa-diagram-project\"></i> Diagram\n </button>\n <button class=\"mj-agent-editor-view-btn\"\n [class.mj-agent-editor-view-btn--active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\">\n <i class=\"fa-solid fa-list\"></i> List\n </button>\n </div>\n\n <!-- Mode indicator badge -->\n @if (isEditingActive) {\n <span class=\"mj-agent-editor-mode-badge mj-agent-editor-mode-badge--editing\">\n <i class=\"fa-solid fa-pen\"></i> Editing\n </span>\n }\n @if (!isEditingActive) {\n <span class=\"mj-agent-editor-mode-badge mj-agent-editor-mode-badge--readonly\">\n <i class=\"fa-solid fa-lock\"></i> Read Only\n </span>\n }\n </div>\n\n <div class=\"mj-agent-editor-toolbar-right\">\n <!-- Status indicators -->\n @if (hasUnsavedChanges) {\n <span class=\"mj-agent-editor-status mj-agent-editor-status--unsaved\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved\n </span>\n }\n @if (lastSaved) {\n <span class=\"mj-agent-editor-status\">\n Saved {{ lastSaved | date:'shortTime' }}\n </span>\n }\n\n <!-- Save + Cancel (when editing) -->\n @if (isEditingActive) {\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--primary\"\n [disabled]=\"isSaving || !hasUnsavedChanges\" (click)=\"Save()\">\n <i class=\"fa-solid\" [ngClass]=\"isSaving ? 'fa-spinner fa-spin' : 'fa-floppy-disk'\"></i>\n {{ isSaving ? 'Saving...' : 'Save' }}\n </button>\n }\n @if (fullscreenEditMode && !EditMode) {\n <button\n class=\"mj-agent-editor-btn\"\n (click)=\"cancelFullscreenEdit()\" title=\"Cancel editing\">\n <i class=\"fa-solid fa-xmark\"></i> Cancel\n </button>\n }\n\n @if (isEditingActive) {\n <div class=\"mj-agent-editor-btn-divider\"></div>\n }\n\n <!-- Fullscreen edit toggle (only when parent is NOT in edit mode) -->\n @if (!EditMode && !fullscreenEditMode && userCanUpdate) {\n <button\n class=\"mj-agent-editor-btn mj-agent-editor-btn--edit\"\n (click)=\"toggleFullscreenEditMode()\" title=\"Edit flow\">\n <i class=\"fa-solid fa-pen-to-square\"></i> Edit\n </button>\n }\n\n <!-- Expand / Close fullscreen -->\n @if (!FullScreen) {\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--expand\"\n (click)=\"toggleFullScreen()\" title=\"Expand to full screen\">\n <i class=\"fa-solid fa-up-right-and-down-left-from-center\"></i> Expand\n </button>\n }\n @if (FullScreen) {\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--close\"\n (click)=\"toggleFullScreen()\" title=\"Close full screen (Esc)\">\n <i class=\"fa-solid fa-xmark\"></i> Close\n </button>\n }\n </div>\n </div>\n\n <!-- ── Loading State ─────────────────────────────────────── -->\n @if (isLoading) {\n <div class=\"mj-agent-editor-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading flow...</span>\n </div>\n }\n\n <!-- ── Main Content ──────────────────────────────────────── -->\n @if (!isLoading) {\n <div class=\"mj-agent-editor-body\">\n <!-- Diagram View -->\n @if (viewMode === 'diagram') {\n <div class=\"mj-agent-editor-diagram\">\n <mj-flow-editor #flowEditor\n [Nodes]=\"nodes\"\n [Connections]=\"connections\"\n [NodeTypes]=\"nodeTypes\"\n [ReadOnly]=\"!isEditingActive\"\n [ShowMinimap]=\"prefShowMinimap\"\n [ShowPalette]=\"isEditingActive\"\n [ShowGrid]=\"prefShowGrid\"\n [ShowLegend]=\"prefShowLegend\"\n [ShowStatusBar]=\"true\"\n [ShowToolbar]=\"true\"\n [AutoLayoutDirection]=\"'vertical'\"\n (NodeSelected)=\"onNodeSelected($event)\"\n (NodeAdded)=\"onNodeAdded($event)\"\n (NodeRemoved)=\"onNodeRemoved($event)\"\n (ConnectionCreated)=\"onConnectionCreated($event)\"\n (ConnectionRemoved)=\"onConnectionRemoved($event)\"\n (ConnectionReassigned)=\"onConnectionReassigned($event)\"\n (ConnectionSelected)=\"onConnectionSelected($event)\"\n (NodesChanged)=\"onNodesChanged($event)\"\n (ConnectionsChanged)=\"onConnectionsChanged($event)\"\n (GridToggled)=\"onGridPrefChanged($event)\"\n (MinimapToggled)=\"onMinimapPrefChanged($event)\"\n (LegendToggled)=\"onLegendPrefChanged($event)\">\n </mj-flow-editor>\n <!-- Properties Panel -->\n <div class=\"mj-agent-editor-properties\"\n [class.mj-agent-editor-properties--visible]=\"showPropertiesPanel\">\n <mj-agent-properties-panel\n [Step]=\"selectedStep\"\n [SelectedConnection]=\"selectedConnection\"\n [PathEntity]=\"selectedPathEntity\"\n [ReadOnly]=\"!isEditingActive\"\n [Actions]=\"availableActions\"\n [Prompts]=\"availablePrompts\"\n [Agents]=\"availableAgents\"\n [AllSteps]=\"steps\"\n (StepChanged)=\"onStepChanged($event)\"\n (PathChanged)=\"onPathChanged($event)\"\n (DeleteStepRequested)=\"onDeleteStepRequested($event)\"\n (DeletePathRequested)=\"onDeletePathRequested($event)\"\n (CloseRequested)=\"onCloseProperties()\">\n </mj-agent-properties-panel>\n </div>\n </div>\n }\n <!-- List View -->\n @if (viewMode === 'list') {\n <div class=\"mj-agent-editor-list\">\n <mj-agent-step-list\n [Steps]=\"steps\"\n [Paths]=\"paths\"\n [SelectedStepID]=\"selectedStep?.ID || null\"\n (StepClicked)=\"onStepClickedInList($event)\">\n </mj-agent-step-list>\n <!-- Properties Panel in list mode too -->\n <div class=\"mj-agent-editor-properties\"\n [class.mj-agent-editor-properties--visible]=\"showPropertiesPanel\">\n <mj-agent-properties-panel\n [Step]=\"selectedStep\"\n [SelectedConnection]=\"selectedConnection\"\n [PathEntity]=\"selectedPathEntity\"\n [ReadOnly]=\"!isEditingActive\"\n [Actions]=\"availableActions\"\n [Prompts]=\"availablePrompts\"\n [Agents]=\"availableAgents\"\n [AllSteps]=\"steps\"\n (StepChanged)=\"onStepChanged($event)\"\n (PathChanged)=\"onPathChanged($event)\"\n (DeleteStepRequested)=\"onDeleteStepRequested($event)\"\n (DeletePathRequested)=\"onDeletePathRequested($event)\"\n (CloseRequested)=\"onCloseProperties()\">\n </mj-agent-properties-panel>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- ── Unsaved Changes Dialog ──────────────────────────── -->\n @if (showUnsavedDialog) {\n <div class=\"mj-agent-editor-dialog-overlay\">\n <div class=\"mj-agent-editor-dialog\">\n <div class=\"mj-agent-editor-dialog-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3 class=\"mj-agent-editor-dialog-title\">Unsaved Changes</h3>\n <p class=\"mj-agent-editor-dialog-message\">\n You have unsaved changes to this flow. What would you like to do?\n </p>\n <div class=\"mj-agent-editor-dialog-actions\">\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--primary\" (click)=\"onUnsavedDialogSave()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save & Close\n </button>\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--danger-outline\" (click)=\"onUnsavedDialogDiscard()\">\n Discard Changes\n </button>\n <button class=\"mj-agent-editor-btn\" (click)=\"onUnsavedDialogCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"flow-agent-editor.component.js","sourceRoot":"","sources":["../../../src/lib/agent-editor/flow-agent-editor.component.ts","../../../src/lib/agent-editor/flow-agent-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnChanges, OnDestroy,\n SimpleChanges, ChangeDetectorRef, ViewEncapsulation, HostListener, HostBinding,\n ElementRef, Renderer2\n} from '@angular/core';\nimport { Metadata, RunView, CompositeKey, TransactionGroupBase } from '@memberjunction/core';\nimport { MJAIAgentStepEntity, MJAIAgentStepPathEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { FlowNode, FlowConnection, FlowNodeAddedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent, FlowNodeTypeConfig } from '../interfaces/flow-types';\nimport { FlowEditorComponent } from '../components/flow-editor.component';\nimport { AgentFlowTransformerService, AGENT_STEP_TYPE_CONFIGS } from './agent-flow-transformer.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/** View mode for the agent editor */\nexport type AgentEditorViewMode = 'diagram' | 'list';\n\n/**\n * Flow Agent Editor — wraps the generic FlowEditorComponent with\n * MJ agent-specific CRUD, properties panel, and data transformation.\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-agent-editor',\n templateUrl: './flow-agent-editor.component.html',\n styleUrls: ['./flow-agent-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n providers: [AgentFlowTransformerService]\n})\nexport class FlowAgentEditorComponent implements OnInit, OnChanges, OnDestroy {\n // ── Host Bindings ─────────────────────────────────────────────\n @HostBinding('class.mj-flow-agent-editor--fullscreen') get HostFullScreen(): boolean { return this.FullScreen; }\n\n // ── Inputs ──────────────────────────────────────────────────\n @Input() AgentID: string | null = null;\n @Input() EditMode = true;\n @Input() FullScreen = false;\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() FlowSaved = new EventEmitter<void>();\n @Output() FlowChanged = new EventEmitter<boolean>();\n @Output() FullScreenToggled = new EventEmitter<boolean>();\n @Output() StepSelected = new EventEmitter<MJAIAgentStepEntity | null>();\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild('flowEditor') protected flowEditor: FlowEditorComponent | undefined;\n\n // ── State ───────────────────────────────────────────────────\n protected nodes: FlowNode[] = [];\n protected connections: FlowConnection[] = [];\n protected nodeTypes: FlowNodeTypeConfig[] = AGENT_STEP_TYPE_CONFIGS;\n protected viewMode: AgentEditorViewMode = 'diagram';\n protected isLoading = true;\n protected isSaving = false;\n protected hasUnsavedChanges = false;\n protected lastSaved: Date | null = null;\n\n // Fullscreen self-contained edit mode\n protected fullscreenEditMode = false;\n protected showUnsavedDialog = false;\n\n // Entity data\n protected steps: MJAIAgentStepEntity[] = [];\n protected paths: MJAIAgentStepPathEntity[] = [];\n protected deletedStepIDs: string[] = [];\n protected deletedPathIDs: string[] = [];\n\n // Selected items\n protected selectedStep: MJAIAgentStepEntity | null = null;\n protected selectedConnection: FlowConnection | null = null;\n protected selectedPathEntity: MJAIAgentStepPathEntity | null = null;\n protected showPropertiesPanel = false;\n\n // Picker data (includes icon fields for node rendering)\n protected availableActions: Array<{ ID: string; Name: string; IconClass?: string | null }> = [];\n protected availablePrompts: Array<{ ID: string; Name: string }> = [];\n protected availableAgents: Array<{ ID: string; Name: string; IconClass?: string | null; LogoURL?: string | null }> = [];\n\n // Permission state — cached once on init\n protected userCanUpdate = false;\n\n // User view preferences (persisted via UserInfoEngine)\n protected prefShowGrid = true;\n protected prefShowMinimap = true;\n protected prefShowLegend = true;\n\n private static readonly PREF_KEY = 'flow-editor/view-prefs';\n\n // Initial zoom state\n private needsInitialZoom = false;\n private resizeObserver: ResizeObserver | null = null;\n\n // Fullscreen DOM relocation state\n private originalParent: HTMLElement | null = null;\n private originalNextSibling: Node | null = null;\n private backdropElement: HTMLElement | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private transformer: AgentFlowTransformerService,\n private elRef: ElementRef<HTMLElement>,\n private renderer: Renderer2\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.loadViewPreferences();\n this.checkUpdatePermission();\n if (this.AgentID) {\n this.loadAll();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['AgentID'] && !changes['AgentID'].firstChange && this.AgentID) {\n this.loadAll();\n }\n }\n\n ngOnDestroy(): void {\n this.teardownResizeObserver();\n // Restore element to original parent if still in fullscreen\n if (this.FullScreen) {\n this.restoreFromFullscreen();\n }\n }\n\n // ── Data Loading ────────────────────────────────────────────\n\n private async loadAll(): Promise<void> {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n await Promise.all([\n this.loadStepsAndPaths(),\n this.loadPickerData()\n ]);\n this.rebuildFlowModel();\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n\n // Flag that we need an initial zoom; it will fire when the host element\n // first becomes visible (e.g. Kendo PanelBar expands)\n this.setupInitialZoomObserver();\n }\n }\n\n private async loadStepsAndPaths(): Promise<void> {\n if (!this.AgentID) return;\n const rv = new RunView();\n const [stepsResult, pathsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Agent Steps',\n ExtraFilter: `AgentID='${this.AgentID}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: AI Agent Step Paths',\n ExtraFilter: `OriginStepID IN (SELECT ID FROM [__mj].[AIAgentStep] WHERE AgentID='${this.AgentID}')`,\n OrderBy: 'Priority DESC',\n ResultType: 'entity_object'\n }\n ]);\n\n this.steps = stepsResult.Success ? (stepsResult.Results as MJAIAgentStepEntity[]) : [];\n this.paths = pathsResult.Success ? (pathsResult.Results as MJAIAgentStepPathEntity[]) : [];\n this.deletedStepIDs = [];\n this.deletedPathIDs = [];\n }\n\n private async loadPickerData(): Promise<void> {\n const rv = new RunView();\n const [actionsResult, promptsResult, agentsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n Fields: ['ID', 'Name', 'IconClass'],\n ExtraFilter: `Status='Active'`,\n OrderBy: 'Name ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompts',\n Fields: ['ID', 'Name'],\n ExtraFilter: '',\n OrderBy: 'Name ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Agents',\n Fields: ['ID', 'Name', 'IconClass', 'LogoURL'],\n ExtraFilter: this.AgentID ? `ID <> '${this.AgentID}'` : '',\n OrderBy: 'Name ASC',\n ResultType: 'simple'\n }\n ]);\n\n this.availableActions = actionsResult.Success\n ? (actionsResult.Results as Array<{ ID: string; Name: string; IconClass?: string | null }>)\n : [];\n this.availablePrompts = promptsResult.Success\n ? (promptsResult.Results as Array<{ ID: string; Name: string }>)\n : [];\n this.availableAgents = agentsResult.Success\n ? (agentsResult.Results as Array<{ ID: string; Name: string; IconClass?: string | null; LogoURL?: string | null }>)\n : [];\n }\n\n private rebuildFlowModel(): void {\n this.nodes = this.transformer.StepsToNodes(this.steps, this.availableActions, this.availableAgents);\n this.connections = this.transformer.PathsToConnections(this.paths);\n }\n\n /**\n * Observe the host element's size. When it transitions from zero to non-zero height\n * (i.e. the collapsed Kendo panel expands), trigger the initial auto-arrange or zoom-to-fit.\n */\n private setupInitialZoomObserver(): void {\n if (this.nodes.length === 0) return;\n\n this.needsInitialZoom = true;\n this.teardownResizeObserver();\n\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.contentRect.height;\n if (height > 0 && this.needsInitialZoom) {\n this.needsInitialZoom = false;\n this.teardownResizeObserver();\n // Short delay for Foblex canvas to finish its own init after becoming visible\n setTimeout(() => this.applyInitialZoom(), 100);\n }\n }\n });\n\n this.resizeObserver.observe(this.elRef.nativeElement);\n }\n\n private applyInitialZoom(): void {\n if (!this.flowEditor || this.nodes.length === 0) return;\n const allAtOrigin = this.nodes.every(n => n.Position.X === 0 && n.Position.Y === 0);\n if (allAtOrigin) {\n this.flowEditor.AutoArrange();\n } else {\n this.flowEditor.ZoomToFit();\n }\n }\n\n private teardownResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n // ── Save ────────────────────────────────────────────────────\n\n async Save(): Promise<void> {\n if (this.isSaving || !this.AgentID) return;\n this.isSaving = true;\n this.cdr.detectChanges();\n\n try {\n // Update positions from canvas to entities\n this.syncPositionsFromCanvas();\n\n // Bundle deletes and saves for steps + paths into one transaction so a partial save\n // can never leave the flow in an inconsistent state.\n const md = new Metadata();\n const tg = await md.CreateTransactionGroup();\n\n await this.queueRemovedEntitiesForDelete(tg);\n\n for (const step of this.steps) {\n step.TransactionGroup = tg;\n await step.Save();\n }\n\n for (const path of this.paths) {\n path.TransactionGroup = tg;\n await path.Save();\n }\n\n if (!await tg.Submit()) {\n console.error('Failed to save flow — all changes have been rolled back');\n return;\n }\n\n this.deletedPathIDs = [];\n this.deletedStepIDs = [];\n this.hasUnsavedChanges = false;\n this.lastSaved = new Date();\n\n // Exit self-contained fullscreen edit mode after successful save\n if (this.fullscreenEditMode) {\n this.fullscreenEditMode = false;\n }\n\n this.FlowSaved.emit();\n } catch (err) {\n console.error('Error saving flow:', err);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n private syncPositionsFromCanvas(): void {\n this.syncPositionsToEntities();\n }\n\n /** Write current FlowNode positions back to the underlying step entities.\n * Called on every node move so that rebuildFlowModel() never loses drag changes. */\n private syncPositionsToEntities(): void {\n for (const node of this.nodes) {\n const step = this.steps.find(s => UUIDsEqual(s.ID, node.ID));\n if (step) {\n this.transformer.ApplyNodePosition(step, node);\n }\n }\n }\n\n private async queueRemovedEntitiesForDelete(tg: TransactionGroupBase): Promise<void> {\n const md = new Metadata();\n\n for (const pathId of this.deletedPathIDs) {\n const pathEntity = await md.GetEntityObject<MJAIAgentStepPathEntity>('MJ: AI Agent Step Paths');\n await pathEntity.InnerLoad(CompositeKey.FromID(pathId));\n pathEntity.TransactionGroup = tg;\n await pathEntity.Delete();\n }\n\n for (const stepId of this.deletedStepIDs) {\n const stepEntity = await md.GetEntityObject<MJAIAgentStepEntity>('MJ: AI Agent Steps');\n await stepEntity.InnerLoad(CompositeKey.FromID(stepId));\n stepEntity.TransactionGroup = tg;\n await stepEntity.Delete();\n }\n }\n\n // ── Flow Editor Event Handlers ──────────────────────────────\n\n protected async onNodeAdded(event: FlowNodeAddedEvent): Promise<void> {\n if (!this.AgentID) return;\n\n const md = new Metadata();\n const step = await md.GetEntityObject<MJAIAgentStepEntity>('MJ: AI Agent Steps');\n step.NewRecord(); // This generates a UUID immediately - available before Save()\n step.AgentID = this.AgentID;\n step.Name = event.Node.Label;\n step.StepType = event.Node.Type as 'Action' | 'Prompt' | 'Sub-Agent' | 'ForEach' | 'While';\n step.Status = 'Active';\n step.StartingStep = this.steps.length === 0; // First step is starting step\n step.PositionX = Math.round(event.DropPosition.X);\n step.PositionY = Math.round(event.DropPosition.Y);\n step.OnErrorBehavior = 'fail';\n step.RetryCount = 0;\n step.TimeoutSeconds = 600;\n\n // Add the unsaved step to the array - it already has a UUID from NewRecord()\n // This allows connections to be drawn immediately without waiting for a database save\n this.steps.push(step);\n\n // Build a FlowNode using the entity's pre-generated ID so Foblex can track it\n const newNode = this.transformer.StepToNode(step, this.availableActions, this.availableAgents);\n this.nodes.push(newNode);\n this.markDirty();\n\n // Select the new node\n setTimeout(() => {\n this.flowEditor?.SelectNode(step.ID);\n this.onNodeSelected(newNode);\n }, 100);\n\n this.cdr.detectChanges();\n }\n\n protected async onConnectionCreated(event: FlowConnectionCreatedEvent): Promise<void> {\n if (!this.AgentID) return;\n\n // Prevent duplicate\n const exists = this.paths.some(\n p => UUIDsEqual(p.OriginStepID, event.SourceNodeID) && UUIDsEqual(p.DestinationStepID, event.TargetNodeID)\n );\n if (exists) return;\n\n const md = new Metadata();\n const path = await md.GetEntityObject<MJAIAgentStepPathEntity>('MJ: AI Agent Step Paths');\n path.NewRecord(); // Generates UUID immediately - available before Save()\n path.OriginStepID = event.SourceNodeID;\n path.DestinationStepID = event.TargetNodeID;\n path.Priority = 0;\n\n // Add unsaved path to the array - save will happen on main Save() button\n this.paths.push(path);\n this.rebuildFlowModel();\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n protected onNodeSelected(node: FlowNode | null): void {\n if (node) {\n this.selectedStep = this.steps.find(s => UUIDsEqual(s.ID, node.ID)) ?? null;\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n this.showPropertiesPanel = true;\n this.StepSelected.emit(this.selectedStep);\n } else {\n this.selectedStep = null;\n // Only hide the panel if no connection is currently selected.\n // When the user clicks a connection, Foblex fires NodeSelected(null) AND\n // ConnectionSelected(conn) — we must not let the null-node event hide\n // the panel that the connection event just opened.\n if (!this.selectedConnection) {\n this.showPropertiesPanel = false;\n }\n this.StepSelected.emit(null);\n }\n this.cdr.detectChanges();\n }\n\n protected onConnectionSelected(conn: FlowConnection | null): void {\n if (conn) {\n this.selectedConnection = conn;\n this.selectedPathEntity = this.paths.find(p => UUIDsEqual(p.ID, conn.ID)) ?? null;\n this.selectedStep = null;\n this.showPropertiesPanel = true;\n } else {\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n }\n this.cdr.detectChanges();\n }\n\n protected onNodeRemoved(node: FlowNode): void {\n const step = this.steps.find(s => UUIDsEqual(s.ID, node.ID));\n if (step) {\n // Track for deletion on save (only if it was previously saved)\n if (step.IsSaved) {\n this.deletedStepIDs.push(step.ID);\n // Also mark paths connected to this step for deletion\n const connectedPaths = this.paths.filter(\n p => UUIDsEqual(p.OriginStepID, step.ID) || UUIDsEqual(p.DestinationStepID, step.ID)\n );\n for (const path of connectedPaths) {\n if (path.IsSaved) {\n this.deletedPathIDs.push(path.ID);\n }\n }\n }\n this.steps = this.steps.filter(s => !UUIDsEqual(s.ID, node.ID));\n this.paths = this.paths.filter(\n p => !UUIDsEqual(p.OriginStepID, node.ID) && !UUIDsEqual(p.DestinationStepID, node.ID)\n );\n this.markDirty();\n }\n }\n\n protected onConnectionRemoved(conn: FlowConnection): void {\n const path = this.paths.find(p => UUIDsEqual(p.ID, conn.ID));\n if (path) {\n if (path.IsSaved) {\n this.deletedPathIDs.push(path.ID);\n }\n this.paths = this.paths.filter(p => !UUIDsEqual(p.ID, conn.ID));\n this.markDirty();\n }\n }\n\n protected onConnectionReassigned(event: FlowConnectionReassignedEvent): void {\n const path = this.paths.find(p => UUIDsEqual(p.ID, event.ConnectionID));\n if (!path) return;\n\n // Update the entity's origin/destination to match the new visual endpoints\n path.OriginStepID = event.NewSourceNodeID;\n path.DestinationStepID = event.NewTargetNodeID;\n\n // Rebuild all connections so sibling-based visual logic recalculates\n // (e.g., Default vs Duplicate Default labels depend on sibling analysis)\n this.rebuildFlowModel();\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n protected onNodesChanged(nodes: FlowNode[]): void {\n this.nodes = nodes;\n // Sync canvas positions back to entities immediately so that\n // any subsequent rebuildFlowModel() preserves drag changes.\n this.syncPositionsToEntities();\n this.markDirty(); \n }\n\n protected onConnectionsChanged(connections: FlowConnection[]): void {\n this.connections = connections;\n this.markDirty();\n }\n\n // ── Properties Panel Events ─────────────────────────────────\n\n protected onStepChanged(step: MJAIAgentStepEntity): void {\n // Update the corresponding flow node in-place and push to generic editor\n const node = this.nodes.find(n => UUIDsEqual(n.ID, step.ID));\n if (node) {\n const newLabel = step.Name;\n const newSubtitle = this.transformer.BuildStepSubtitle(step);\n const baseStatus = this.transformer.MapStepStatus(step.Status);\n const warningMessage = (baseStatus !== 'disabled') ? this.transformer.BuildConfigWarningMessage(step) : null;\n const newStatus = warningMessage ? 'warning' : baseStatus;\n const newIsStart = step.StartingStep === true;\n\n node.Label = newLabel;\n node.Subtitle = newSubtitle;\n node.Status = newStatus;\n node.StatusMessage = warningMessage ?? undefined;\n node.IsStartNode = newIsStart;\n\n // Update input port disabled state for starting steps\n const inputPort = node.Ports.find(p => p.Direction === 'input');\n if (inputPort) {\n inputPort.Disabled = newIsStart;\n }\n\n // Re-resolve icon from picker data (handles action/agent assignment changes)\n const resolved = this.transformer.ResolveStepIcon(step, this.availableActions, this.availableAgents);\n node.Icon = resolved.Icon;\n if (!node.Data) node.Data = {};\n node.Data['LogoURL'] = resolved.LogoURL ?? null;\n\n // For loop nodes, rebuild the loop-specific Data properties so the\n // inner body card updates immediately when the user changes body type / config\n if (step.StepType === 'ForEach' || step.StepType === 'While') {\n this.updateLoopNodeData(step, node);\n }\n\n // Push visual update to the generic flow editor (creates new object ref for OnPush)\n this.flowEditor?.UpdateNode(step.ID, {\n Label: newLabel,\n Subtitle: newSubtitle,\n Status: newStatus,\n StatusMessage: warningMessage ?? undefined,\n IsStartNode: newIsStart,\n Icon: resolved.Icon,\n Data: node.Data\n });\n }\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n /** Update loop-specific data fields on a FlowNode from the step entity */\n private updateLoopNodeData(step: MJAIAgentStepEntity, node: FlowNode): void {\n if (!node.Data) node.Data = {};\n // Delegate to the transformer's public methods for consistency\n const bodyType = step.LoopBodyType;\n node.Data['LoopBodyType'] = bodyType ?? null;\n node.Data['LoopBodyName'] = this.resolveLoopBodyNameFromStep(step);\n node.Data['LoopBodyIcon'] = this.getBodyTypeIcon(bodyType);\n node.Data['LoopBodyColor'] = this.getBodyTypeColor(bodyType);\n node.Data['LoopIterationSummary'] = this.transformer.BuildLoopIterationSummary(step);\n }\n\n private resolveLoopBodyNameFromStep(step: MJAIAgentStepEntity): string | null {\n switch (step.LoopBodyType) {\n case 'Action': return step.Action ?? null;\n case 'Prompt': return step.Prompt ?? null;\n case 'Sub-Agent': return step.SubAgent ?? null;\n default: return null;\n }\n }\n\n private getBodyTypeIcon(bodyType: string | null): string {\n switch (bodyType) {\n case 'Action': return 'fa-bolt';\n case 'Prompt': return 'fa-comment-dots';\n case 'Sub-Agent': return 'fa-robot';\n default: return 'fa-circle-nodes';\n }\n }\n\n private getBodyTypeColor(bodyType: string | null): string {\n switch (bodyType) {\n case 'Action': return '#3B82F6';\n case 'Prompt': return '#8B5CF6';\n case 'Sub-Agent': return '#10B981';\n default: return '#6B7280';\n }\n }\n\n protected onPathChanged(path: MJAIAgentStepPathEntity): void {\n // Rebuild all connections from the same origin since always/conditional logic\n // depends on sibling paths (e.g., \"Default\" label only appears when siblings exist)\n this.rebuildFlowModel();\n this.markDirty();\n this.cdr.detectChanges();\n }\n\n protected onDeleteStepRequested(step: MJAIAgentStepEntity): void {\n const node = this.nodes.find(n => UUIDsEqual(n.ID, step.ID));\n if (node) {\n this.flowEditor?.SelectNode(step.ID);\n this.flowEditor?.DeleteSelected();\n }\n this.showPropertiesPanel = false;\n this.selectedStep = null;\n this.cdr.detectChanges();\n }\n\n protected onDeletePathRequested(path: MJAIAgentStepPathEntity): void {\n const conn = this.connections.find(c => UUIDsEqual(c.ID, path.ID));\n if (conn) {\n if (path.IsSaved) {\n this.deletedPathIDs.push(path.ID);\n }\n this.paths = this.paths.filter(p => !UUIDsEqual(p.ID, path.ID));\n this.rebuildFlowModel();\n this.markDirty();\n }\n this.showPropertiesPanel = false;\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n this.cdr.detectChanges();\n }\n\n protected onCloseProperties(): void {\n this.showPropertiesPanel = false;\n this.flowEditor?.ClearSelection();\n }\n\n // ── View & UI Controls ──────────────────────────────────────\n\n protected toggleViewMode(): void {\n this.viewMode = this.viewMode === 'diagram' ? 'list' : 'diagram';\n this.cdr.detectChanges();\n }\n\n /** Whether editing is currently allowed — combines parent EditMode + fullscreen self-contained edit */\n get isEditingActive(): boolean {\n return this.EditMode || this.fullscreenEditMode;\n }\n\n protected toggleFullscreenEditMode(): void {\n this.fullscreenEditMode = !this.fullscreenEditMode;\n this.cdr.detectChanges();\n }\n\n protected cancelFullscreenEdit(): void {\n if (this.hasUnsavedChanges) {\n // Reload to discard changes\n this.fullscreenEditMode = false;\n this.hasUnsavedChanges = false;\n this.loadAll();\n } else {\n this.fullscreenEditMode = false;\n this.cdr.detectChanges();\n }\n }\n\n protected toggleFullScreen(): void {\n if (this.FullScreen && this.hasUnsavedChanges) {\n this.showUnsavedDialog = true;\n this.cdr.detectChanges();\n return;\n }\n this.performFullscreenToggle();\n }\n\n protected onUnsavedDialogSave(): void {\n this.showUnsavedDialog = false;\n this.Save().then(() => this.performFullscreenToggle());\n }\n\n protected onUnsavedDialogDiscard(): void {\n this.showUnsavedDialog = false;\n this.hasUnsavedChanges = false;\n this.fullscreenEditMode = false;\n this.performFullscreenToggle();\n // Reload original data\n this.loadAll();\n }\n\n protected onUnsavedDialogCancel(): void {\n this.showUnsavedDialog = false;\n this.cdr.detectChanges();\n }\n\n private performFullscreenToggle(): void {\n this.FullScreen = !this.FullScreen;\n\n if (this.FullScreen) {\n this.moveToBodyForFullscreen();\n } else {\n this.fullscreenEditMode = false;\n this.restoreFromFullscreen();\n }\n\n this.FullScreenToggled.emit(this.FullScreen);\n this.cdr.detectChanges();\n // Re-fit after layout change\n setTimeout(() => this.flowEditor?.ZoomToFit(), 200);\n }\n\n private moveToBodyForFullscreen(): void {\n const hostEl = this.elRef.nativeElement;\n this.originalParent = hostEl.parentElement;\n this.originalNextSibling = hostEl.nextSibling;\n\n // Create backdrop as a separate body-level element so it covers everything\n this.backdropElement = this.renderer.createElement('div');\n this.renderer.addClass(this.backdropElement, 'mj-agent-editor-backdrop');\n this.renderer.listen(this.backdropElement, 'click', () => this.toggleFullScreen());\n this.renderer.appendChild(document.body, this.backdropElement);\n\n // Move the host element to body — @HostBinding applies the fixed-position class\n this.renderer.appendChild(document.body, hostEl);\n }\n\n private restoreFromFullscreen(): void {\n // Remove backdrop\n if (this.backdropElement) {\n this.renderer.removeChild(document.body, this.backdropElement);\n this.backdropElement = null;\n }\n\n // Restore host element to original position\n if (!this.originalParent) return;\n const hostEl = this.elRef.nativeElement;\n if (this.originalNextSibling) {\n this.renderer.insertBefore(this.originalParent, hostEl, this.originalNextSibling);\n } else {\n this.renderer.appendChild(this.originalParent, hostEl);\n }\n this.originalParent = null;\n this.originalNextSibling = null;\n }\n\n protected onStepClickedInList(step: MJAIAgentStepEntity): void {\n this.selectedStep = step;\n this.selectedConnection = null;\n this.selectedPathEntity = null;\n this.showPropertiesPanel = true;\n this.StepSelected.emit(step);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('document:keydown.escape')\n protected onEscapeKey(): void {\n if (this.showUnsavedDialog) {\n this.onUnsavedDialogCancel();\n } else if (this.FullScreen) {\n this.toggleFullScreen();\n }\n }\n\n // ── Permission Check ────────────────────────────────────────\n\n private checkUpdatePermission(): void {\n const md = new Metadata();\n const entity = md.EntityByName('MJ: AI Agents');\n if (entity) {\n const perms = entity.GetUserPermisions(md.CurrentUser);\n this.userCanUpdate = perms?.CanUpdate === true;\n }\n }\n\n // ── View Preference Persistence ─────────────────────────────\n\n private loadViewPreferences(): void {\n const raw = UserInfoEngine.Instance.GetSetting(FlowAgentEditorComponent.PREF_KEY);\n if (raw) {\n try {\n const prefs = JSON.parse(raw) as { grid?: boolean; minimap?: boolean; legend?: boolean };\n if (prefs.grid != null) this.prefShowGrid = prefs.grid;\n if (prefs.minimap != null) this.prefShowMinimap = prefs.minimap;\n if (prefs.legend != null) this.prefShowLegend = prefs.legend;\n } catch {\n // Ignore malformed preference data\n }\n }\n }\n\n private saveViewPreferences(): void {\n const prefs = JSON.stringify({\n grid: this.prefShowGrid,\n minimap: this.prefShowMinimap,\n legend: this.prefShowLegend\n });\n // Fire-and-forget — preference save errors are non-critical\n UserInfoEngine.Instance.SetSetting(FlowAgentEditorComponent.PREF_KEY, prefs);\n }\n\n protected onGridPrefChanged(show: boolean): void {\n this.prefShowGrid = show;\n this.saveViewPreferences();\n }\n\n protected onMinimapPrefChanged(show: boolean): void {\n this.prefShowMinimap = show;\n this.saveViewPreferences();\n }\n\n protected onLegendPrefChanged(show: boolean): void {\n this.prefShowLegend = show;\n this.saveViewPreferences();\n }\n\n // ── Helpers ─────────────────────────────────────────────────\n\n private markDirty(): void {\n if (!this.hasUnsavedChanges) {\n this.hasUnsavedChanges = true;\n this.FlowChanged.emit(true);\n }\n }\n}\n","<div class=\"mj-agent-editor\">\n\n <!-- ── Toolbar ─────────────────────────────────────────────── -->\n <div class=\"mj-agent-editor-toolbar\" [class.mj-agent-editor-toolbar--editing]=\"isEditingActive\">\n <div class=\"mj-agent-editor-toolbar-left\">\n <!-- Undo / Redo (edit mode only) -->\n @if (isEditingActive) {\n <button class=\"mj-agent-editor-btn\"\n [disabled]=\"!flowEditor?.CanUndo\" (click)=\"flowEditor?.Undo()\" title=\"Undo (Ctrl+Z)\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n </button>\n }\n @if (isEditingActive) {\n <button class=\"mj-agent-editor-btn\"\n [disabled]=\"!flowEditor?.CanRedo\" (click)=\"flowEditor?.Redo()\" title=\"Redo (Ctrl+Y)\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n </button>\n }\n </div>\n\n <div class=\"mj-agent-editor-toolbar-center\">\n <!-- Fullscreen title -->\n <span class=\"mj-agent-editor-title\">\n <i class=\"fa-solid fa-diagram-project\"></i> Flow Configuration\n </span>\n\n <!-- View Mode Toggle -->\n <div class=\"mj-agent-editor-view-toggle\">\n <button class=\"mj-agent-editor-view-btn\"\n [class.mj-agent-editor-view-btn--active]=\"viewMode === 'diagram'\"\n (click)=\"viewMode = 'diagram'\">\n <i class=\"fa-solid fa-diagram-project\"></i> Diagram\n </button>\n <button class=\"mj-agent-editor-view-btn\"\n [class.mj-agent-editor-view-btn--active]=\"viewMode === 'list'\"\n (click)=\"viewMode = 'list'\">\n <i class=\"fa-solid fa-list\"></i> List\n </button>\n </div>\n\n <!-- Mode indicator badge -->\n @if (isEditingActive) {\n <span class=\"mj-agent-editor-mode-badge mj-agent-editor-mode-badge--editing\">\n <i class=\"fa-solid fa-pen\"></i> Editing\n </span>\n }\n @if (!isEditingActive) {\n <span class=\"mj-agent-editor-mode-badge mj-agent-editor-mode-badge--readonly\">\n <i class=\"fa-solid fa-lock\"></i> Read Only\n </span>\n }\n </div>\n\n <div class=\"mj-agent-editor-toolbar-right\">\n <!-- Status indicators -->\n @if (hasUnsavedChanges) {\n <span class=\"mj-agent-editor-status mj-agent-editor-status--unsaved\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved\n </span>\n }\n @if (lastSaved) {\n <span class=\"mj-agent-editor-status\">\n Saved {{ lastSaved | date:'shortTime' }}\n </span>\n }\n\n <!-- Save + Cancel (when editing) -->\n @if (isEditingActive) {\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--primary\"\n [disabled]=\"isSaving || !hasUnsavedChanges\" (click)=\"Save()\">\n <i class=\"fa-solid\" [ngClass]=\"isSaving ? 'fa-spinner fa-spin' : 'fa-floppy-disk'\"></i>\n {{ isSaving ? 'Saving...' : 'Save' }}\n </button>\n }\n @if (fullscreenEditMode && !EditMode) {\n <button\n class=\"mj-agent-editor-btn\"\n (click)=\"cancelFullscreenEdit()\" title=\"Cancel editing\">\n <i class=\"fa-solid fa-xmark\"></i> Cancel\n </button>\n }\n\n @if (isEditingActive) {\n <div class=\"mj-agent-editor-btn-divider\"></div>\n }\n\n <!-- Fullscreen edit toggle (only when parent is NOT in edit mode) -->\n @if (!EditMode && !fullscreenEditMode && userCanUpdate) {\n <button\n class=\"mj-agent-editor-btn mj-agent-editor-btn--edit\"\n (click)=\"toggleFullscreenEditMode()\" title=\"Edit flow\">\n <i class=\"fa-solid fa-pen-to-square\"></i> Edit\n </button>\n }\n\n <!-- Expand / Close fullscreen -->\n @if (!FullScreen) {\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--expand\"\n (click)=\"toggleFullScreen()\" title=\"Expand to full screen\">\n <i class=\"fa-solid fa-up-right-and-down-left-from-center\"></i> Expand\n </button>\n }\n @if (FullScreen) {\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--close\"\n (click)=\"toggleFullScreen()\" title=\"Close full screen (Esc)\">\n <i class=\"fa-solid fa-xmark\"></i> Close\n </button>\n }\n </div>\n </div>\n\n <!-- ── Loading State ─────────────────────────────────────── -->\n @if (isLoading) {\n <div class=\"mj-agent-editor-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading flow...</span>\n </div>\n }\n\n <!-- ── Main Content ──────────────────────────────────────── -->\n @if (!isLoading) {\n <div class=\"mj-agent-editor-body\">\n <!-- Diagram View -->\n @if (viewMode === 'diagram') {\n <div class=\"mj-agent-editor-diagram\">\n <mj-flow-editor #flowEditor\n [Nodes]=\"nodes\"\n [Connections]=\"connections\"\n [NodeTypes]=\"nodeTypes\"\n [ReadOnly]=\"!isEditingActive\"\n [ShowMinimap]=\"prefShowMinimap\"\n [ShowPalette]=\"isEditingActive\"\n [ShowGrid]=\"prefShowGrid\"\n [ShowLegend]=\"prefShowLegend\"\n [ShowStatusBar]=\"true\"\n [ShowToolbar]=\"true\"\n [AutoLayoutDirection]=\"'vertical'\"\n (NodeSelected)=\"onNodeSelected($event)\"\n (NodeAdded)=\"onNodeAdded($event)\"\n (NodeRemoved)=\"onNodeRemoved($event)\"\n (ConnectionCreated)=\"onConnectionCreated($event)\"\n (ConnectionRemoved)=\"onConnectionRemoved($event)\"\n (ConnectionReassigned)=\"onConnectionReassigned($event)\"\n (ConnectionSelected)=\"onConnectionSelected($event)\"\n (NodesChanged)=\"onNodesChanged($event)\"\n (ConnectionsChanged)=\"onConnectionsChanged($event)\"\n (GridToggled)=\"onGridPrefChanged($event)\"\n (MinimapToggled)=\"onMinimapPrefChanged($event)\"\n (LegendToggled)=\"onLegendPrefChanged($event)\">\n </mj-flow-editor>\n <!-- Properties Panel -->\n <div class=\"mj-agent-editor-properties\"\n [class.mj-agent-editor-properties--visible]=\"showPropertiesPanel\">\n <mj-agent-properties-panel\n [Step]=\"selectedStep\"\n [SelectedConnection]=\"selectedConnection\"\n [PathEntity]=\"selectedPathEntity\"\n [ReadOnly]=\"!isEditingActive\"\n [Actions]=\"availableActions\"\n [Prompts]=\"availablePrompts\"\n [Agents]=\"availableAgents\"\n [AllSteps]=\"steps\"\n (StepChanged)=\"onStepChanged($event)\"\n (PathChanged)=\"onPathChanged($event)\"\n (DeleteStepRequested)=\"onDeleteStepRequested($event)\"\n (DeletePathRequested)=\"onDeletePathRequested($event)\"\n (CloseRequested)=\"onCloseProperties()\">\n </mj-agent-properties-panel>\n </div>\n </div>\n }\n <!-- List View -->\n @if (viewMode === 'list') {\n <div class=\"mj-agent-editor-list\">\n <mj-agent-step-list\n [Steps]=\"steps\"\n [Paths]=\"paths\"\n [SelectedStepID]=\"selectedStep?.ID || null\"\n (StepClicked)=\"onStepClickedInList($event)\">\n </mj-agent-step-list>\n <!-- Properties Panel in list mode too -->\n <div class=\"mj-agent-editor-properties\"\n [class.mj-agent-editor-properties--visible]=\"showPropertiesPanel\">\n <mj-agent-properties-panel\n [Step]=\"selectedStep\"\n [SelectedConnection]=\"selectedConnection\"\n [PathEntity]=\"selectedPathEntity\"\n [ReadOnly]=\"!isEditingActive\"\n [Actions]=\"availableActions\"\n [Prompts]=\"availablePrompts\"\n [Agents]=\"availableAgents\"\n [AllSteps]=\"steps\"\n (StepChanged)=\"onStepChanged($event)\"\n (PathChanged)=\"onPathChanged($event)\"\n (DeleteStepRequested)=\"onDeleteStepRequested($event)\"\n (DeletePathRequested)=\"onDeletePathRequested($event)\"\n (CloseRequested)=\"onCloseProperties()\">\n </mj-agent-properties-panel>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- ── Unsaved Changes Dialog ──────────────────────────── -->\n @if (showUnsavedDialog) {\n <div class=\"mj-agent-editor-dialog-overlay\">\n <div class=\"mj-agent-editor-dialog\">\n <div class=\"mj-agent-editor-dialog-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3 class=\"mj-agent-editor-dialog-title\">Unsaved Changes</h3>\n <p class=\"mj-agent-editor-dialog-message\">\n You have unsaved changes to this flow. What would you like to do?\n </p>\n <div class=\"mj-agent-editor-dialog-actions\">\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--primary\" (click)=\"onUnsavedDialogSave()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save & Close\n </button>\n <button class=\"mj-agent-editor-btn mj-agent-editor-btn--danger-outline\" (click)=\"onUnsavedDialogDiscard()\">\n Discard Changes\n </button>\n <button class=\"mj-agent-editor-btn\" (click)=\"onUnsavedDialogCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-flow-editor",
3
- "version": "5.28.0",
3
+ "version": "5.30.0",
4
4
  "description": "MemberJunction: Generic visual flow editor component powered by Foblex Flow, with an agent-specific Flow Agent Editor",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -42,10 +42,10 @@
42
42
  "@foblex/mediator": "1.1.3",
43
43
  "@foblex/platform": "1.0.4",
44
44
  "@foblex/utils": "1.1.1",
45
- "@memberjunction/core": "5.28.0",
46
- "@memberjunction/core-entities": "5.28.0",
47
- "@memberjunction/global": "5.28.0",
48
- "@memberjunction/ng-code-editor": "5.28.0",
45
+ "@memberjunction/core": "5.30.0",
46
+ "@memberjunction/core-entities": "5.30.0",
47
+ "@memberjunction/global": "5.30.0",
48
+ "@memberjunction/ng-code-editor": "5.30.0",
49
49
  "rxjs": "^7.8.2",
50
50
  "tslib": "^2.8.1"
51
51
  },