@masterteam/structure-builder 0.0.13 → 0.0.14

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Component, input, ChangeDetectionStrategy, output, viewChild, model, contentChild, signal, computed, effect } from '@angular/core';
2
+ import { inject, Component, input, ChangeDetectionStrategy, output, viewChild, model, contentChild, signal, computed, effect, untracked } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i2 from '@angular/forms';
@@ -183,11 +183,11 @@ class StructureBuilder {
183
183
  const fields = this.fields();
184
184
  const pos = this.positions();
185
185
  return this.nodes().map((node) => {
186
- const _computedId = this.getNestedValue(node, fields.id);
186
+ const _computedId = String(this.getNestedValue(node, fields.id));
187
187
  const _computedName = this.getNestedValue(node, fields.name);
188
188
  const _computedIcon = this.getNestedValue(node, fields.icon);
189
189
  const _computedColor = this.getNestedValue(node, fields.color);
190
- const id = _computedId ? String(_computedId) : '';
190
+ const id = _computedId;
191
191
  const configuration = (id && pos[id]) ?? node.configuration ?? undefined;
192
192
  return {
193
193
  ...node,
@@ -199,6 +199,11 @@ class StructureBuilder {
199
199
  };
200
200
  });
201
201
  }, ...(ngDevMode ? [{ debugName: "nodesWithComputedProps" }] : []));
202
+ connectionsComputed = computed(() => this.connections()?.map((c) => ({
203
+ ...c,
204
+ from: String(c.from),
205
+ to: String(c.to),
206
+ })), ...(ngDevMode ? [{ debugName: "connectionsComputed" }] : []));
202
207
  coreFields = computed(() => {
203
208
  const fields = this.fields();
204
209
  return new Set([
@@ -214,11 +219,11 @@ class StructureBuilder {
214
219
  effect(() => {
215
220
  const list = this.nodes();
216
221
  const fields = this.fields();
217
- const next = { ...this.positions() };
222
+ const next = untracked(() => this.positions());
218
223
  const liveIds = new Set();
219
224
  for (const n of list) {
220
225
  const id = String(this.getNestedValue(n, fields.id) ?? '');
221
- if (!id)
226
+ if (!id || n?.loading)
222
227
  continue;
223
228
  liveIds.add(id);
224
229
  if (next[id] == null) {
@@ -287,7 +292,7 @@ class StructureBuilder {
287
292
  if (!event.fInputId || !event.fOutputId) {
288
293
  return;
289
294
  }
290
- const exists = this.connections().some((conn) => conn.from === newConnection.from && conn.to === newConnection.to);
295
+ const exists = this.connectionsComputed().some((conn) => conn.from === newConnection.from && conn.to === newConnection.to);
291
296
  if (!exists) {
292
297
  this.action.emit({ action: 'createConnection', data: newConnection });
293
298
  }
@@ -358,7 +363,8 @@ class StructureBuilder {
358
363
  }
359
364
  }
360
365
  fitToScreen() {
361
- this.fCanvasComponent()?.fitToScreen(PointExtensions.initialize(200, 200), false);
366
+ const area = this.nodes()?.length * 70;
367
+ this.fCanvasComponent()?.fitToScreen(PointExtensions.initialize(area, area), false);
362
368
  }
363
369
  getData(graph, direction) {
364
370
  this.direction.set(direction);
@@ -378,9 +384,9 @@ class StructureBuilder {
378
384
  height: SIZE.height,
379
385
  });
380
386
  });
381
- this.connections().forEach((c) => {
382
- const fromId = this.extractNodeId(c.from);
383
- const toId = this.extractNodeId(c.to);
387
+ this.connectionsComputed().forEach((c) => {
388
+ const fromId = c.from;
389
+ const toId = c.to;
384
390
  if (fromId && toId && fromId !== toId) {
385
391
  graph.setEdge(fromId, toId, {});
386
392
  }
@@ -429,7 +435,7 @@ class StructureBuilder {
429
435
  return (connectionEndId || '').replace(/-(in|out)$/, '');
430
436
  }
431
437
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: StructureBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
432
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.3", type: StructureBuilder, isStandalone: true, selector: "mt-structure-builder", inputs: { availableNodes: { classPropertyName: "availableNodes", publicName: "availableNodes", isSignal: true, isRequired: false, transformFunction: null }, nodeForm: { classPropertyName: "nodeForm", publicName: "nodeForm", isSignal: true, isRequired: false, transformFunction: null }, connectionForm: { classPropertyName: "connectionForm", publicName: "connectionForm", isSignal: true, isRequired: false, transformFunction: null }, nodeActions: { classPropertyName: "nodeActions", publicName: "nodeActions", isSignal: true, isRequired: false, transformFunction: null }, nodeFields: { classPropertyName: "nodeFields", publicName: "nodeFields", isSignal: true, isRequired: false, transformFunction: null }, isAutoLayout: { classPropertyName: "isAutoLayout", publicName: "isAutoLayout", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, connections: { classPropertyName: "connections", publicName: "connections", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeActionsEvent: "nodeActionsEvent", action: "action", nodes: "nodesChange", connections: "connectionsChange" }, host: { classAttribute: "flex h-full bg-surface-100 dark:bg-surface-700 relative rounded-2xl" }, providers: [DialogService], queries: [{ propertyName: "nodeDialogTemplate", first: true, predicate: ["nodeDialog"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "fCanvas", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fFlowComponent", first: true, predicate: FFlowComponent, descendants: true, isSignal: true }, { propertyName: "fCanvasComponent", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fZoomDirective", first: true, predicate: FZoomDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- structure-builder.html -->\n<mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n>\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">Level templates</h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs [(value)]=\"activeTab\" styleClass=\"structure-tabs\">\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0!\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n Drag to add item to your Structure:\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.name\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">All {{ tab }} items are in use</p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n</mt-card>\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connections(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (action of nodeActions(); track action.key) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14);--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: FFlowModule }, { kind: "component", type: i2$1.FFlowComponent, selector: "f-flow", inputs: ["fFlowId"], outputs: ["fLoaded"] }, { kind: "component", type: i2$1.FCanvasComponent, selector: "f-canvas", inputs: ["position", "scale", "debounceTime"], outputs: ["fCanvasChange"] }, { kind: "component", type: i2$1.FBackgroundComponent, selector: "f-background" }, { kind: "component", type: i2$1.FCirclePatternComponent, selector: "f-circle-pattern", inputs: ["id", "color", "radius"] }, { kind: "directive", type: i2$1.FZoomDirective, selector: "f-canvas[fZoom]", inputs: ["fZoom", "fWheelTrigger", "fDblClickTrigger", "fZoomMinimum", "fZoomMaximum", "fZoomStep", "fZoomDblClickStep"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FExternalItemDirective, selector: "[fExternalItem]", inputs: ["fExternalItemId", "fData", "fDisabled", "fPreview", "fPreviewMatchSize", "fPlaceholder"] }, { kind: "component", type: i2$1.FConnectionComponent, selector: "f-connection", inputs: ["fConnectionId", "fText", "fTextStartOffset", "fStartColor", "fEndColor", "fOutputId", "fInputId", "fRadius", "fOffset", "fBehavior", "fType", "fReassignableStart", "fReassignDisabled", "fSelectionDisabled"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FConnectionCenterDirective, selector: "[fConnectionCenter]" }, { kind: "component", type: i2$1.FConnectionForCreateComponent, selector: "f-connection-for-create", inputs: ["fStartColor", "fEndColor", "fRadius", "fOffset", "fBehavior", "fType"] }, { kind: "directive", type: i2$1.FMarkerDirective, selector: "svg[fMarker]", inputs: ["hostElement", "width", "height", "refX", "refY", "type", "orient", "markerUnits"] }, { kind: "component", type: i2$1.FSnapConnectionComponent, selector: "f-snap-connection", inputs: ["fStartColor", "fEndColor", "fSnapThreshold", "fRadius", "fOffset", "fBehavior", "fType"] }, { kind: "directive", type: i2$1.FNodeInputDirective, selector: "[fNodeInput]", inputs: ["fInputId", "fInputMultiple", "fInputDisabled", "fInputConnectableSide"], exportAs: ["fNodeInput"] }, { kind: "directive", type: i2$1.FNodeOutputDirective, selector: "[fNodeOutput]", inputs: ["fOutputId", "fOutputMultiple", "fOutputDisabled", "fOutputConnectableSide", "isSelfConnectable", "fCanBeConnectedInputs"], exportAs: ["fNodeOutput"] }, { kind: "directive", type: i2$1.FNodeDirective, selector: "[fNode]", inputs: ["fNodeId", "fNodeParentId", "fNodePosition", "fNodeSize", "fNodeRotate", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fIncludePadding", "fConnectOnNode", "fMinimapClass"], outputs: ["fNodePositionChange", "fNodeRotateChange", "fNodeSizeChange"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FDragHandleDirective, selector: "[fDragHandle]" }, { kind: "directive", type: i2$1.FDraggableDirective, selector: "f-flow[fDraggable]", inputs: ["fDraggableDisabled", "fMultiSelectTrigger", "fReassignConnectionTrigger", "fCreateConnectionTrigger", "fNodeResizeTrigger", "fNodeRotateTrigger", "fNodeMoveTrigger", "fCanvasMoveTrigger", "fExternalItemTrigger", "fEmitOnNodeIntersect", "vCellSize", "hCellSize", "fCellSizeWhileDragging"], outputs: ["fSelectionChange", "fNodeIntersectedWithConnections", "fCreateNode", "fMoveNodes", "fReassignConnection", "fCreateConnection", "fDropToGroup", "fDragStarted", "fDragEnded"], exportAs: ["fDraggable"] }, { kind: "ngmodule", type: DynamicDialogModule }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i3.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i3.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i3.TabPanel, selector: "p-tabpanel", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: i3.TabList, selector: "p-tablist" }, { kind: "component", type: i3.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Toolbar, selector: "mt-toolbar", inputs: ["size"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }] });
438
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.3", type: StructureBuilder, isStandalone: true, selector: "mt-structure-builder", inputs: { availableNodes: { classPropertyName: "availableNodes", publicName: "availableNodes", isSignal: true, isRequired: false, transformFunction: null }, nodeForm: { classPropertyName: "nodeForm", publicName: "nodeForm", isSignal: true, isRequired: false, transformFunction: null }, connectionForm: { classPropertyName: "connectionForm", publicName: "connectionForm", isSignal: true, isRequired: false, transformFunction: null }, nodeActions: { classPropertyName: "nodeActions", publicName: "nodeActions", isSignal: true, isRequired: false, transformFunction: null }, nodeFields: { classPropertyName: "nodeFields", publicName: "nodeFields", isSignal: true, isRequired: false, transformFunction: null }, isAutoLayout: { classPropertyName: "isAutoLayout", publicName: "isAutoLayout", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, connections: { classPropertyName: "connections", publicName: "connections", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeActionsEvent: "nodeActionsEvent", action: "action", nodes: "nodesChange", connections: "connectionsChange" }, host: { classAttribute: "flex h-full bg-surface-100 dark:bg-surface-700 relative rounded-2xl" }, providers: [DialogService], queries: [{ propertyName: "nodeDialogTemplate", first: true, predicate: ["nodeDialog"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "fCanvas", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fFlowComponent", first: true, predicate: FFlowComponent, descendants: true, isSignal: true }, { propertyName: "fCanvasComponent", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fZoomDirective", first: true, predicate: FZoomDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- structure-builder.html -->\n<mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n>\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">Level templates</h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs [(value)]=\"activeTab\" styleClass=\"structure-tabs\">\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0!\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n Drag to add item to your Structure:\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.name\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">All {{ tab }} items are in use</p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n</mt-card>\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connectionsComputed(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (action of nodeActions(); track action.key) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14);--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: FFlowModule }, { kind: "component", type: i2$1.FFlowComponent, selector: "f-flow", inputs: ["fFlowId"], outputs: ["fLoaded"] }, { kind: "component", type: i2$1.FCanvasComponent, selector: "f-canvas", inputs: ["position", "scale", "debounceTime"], outputs: ["fCanvasChange"] }, { kind: "component", type: i2$1.FBackgroundComponent, selector: "f-background" }, { kind: "component", type: i2$1.FCirclePatternComponent, selector: "f-circle-pattern", inputs: ["id", "color", "radius"] }, { kind: "directive", type: i2$1.FZoomDirective, selector: "f-canvas[fZoom]", inputs: ["fZoom", "fWheelTrigger", "fDblClickTrigger", "fZoomMinimum", "fZoomMaximum", "fZoomStep", "fZoomDblClickStep"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FExternalItemDirective, selector: "[fExternalItem]", inputs: ["fExternalItemId", "fData", "fDisabled", "fPreview", "fPreviewMatchSize", "fPlaceholder"] }, { kind: "component", type: i2$1.FConnectionComponent, selector: "f-connection", inputs: ["fConnectionId", "fText", "fTextStartOffset", "fStartColor", "fEndColor", "fOutputId", "fInputId", "fRadius", "fOffset", "fBehavior", "fType", "fReassignableStart", "fReassignDisabled", "fSelectionDisabled"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FConnectionCenterDirective, selector: "[fConnectionCenter]" }, { kind: "component", type: i2$1.FConnectionForCreateComponent, selector: "f-connection-for-create", inputs: ["fStartColor", "fEndColor", "fRadius", "fOffset", "fBehavior", "fType"] }, { kind: "directive", type: i2$1.FMarkerDirective, selector: "svg[fMarker]", inputs: ["hostElement", "width", "height", "refX", "refY", "type", "orient", "markerUnits"] }, { kind: "component", type: i2$1.FSnapConnectionComponent, selector: "f-snap-connection", inputs: ["fStartColor", "fEndColor", "fSnapThreshold", "fRadius", "fOffset", "fBehavior", "fType"] }, { kind: "directive", type: i2$1.FNodeInputDirective, selector: "[fNodeInput]", inputs: ["fInputId", "fInputMultiple", "fInputDisabled", "fInputConnectableSide"], exportAs: ["fNodeInput"] }, { kind: "directive", type: i2$1.FNodeOutputDirective, selector: "[fNodeOutput]", inputs: ["fOutputId", "fOutputMultiple", "fOutputDisabled", "fOutputConnectableSide", "isSelfConnectable", "fCanBeConnectedInputs"], exportAs: ["fNodeOutput"] }, { kind: "directive", type: i2$1.FNodeDirective, selector: "[fNode]", inputs: ["fNodeId", "fNodeParentId", "fNodePosition", "fNodeSize", "fNodeRotate", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fIncludePadding", "fConnectOnNode", "fMinimapClass"], outputs: ["fNodePositionChange", "fNodeRotateChange", "fNodeSizeChange"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FDragHandleDirective, selector: "[fDragHandle]" }, { kind: "directive", type: i2$1.FDraggableDirective, selector: "f-flow[fDraggable]", inputs: ["fDraggableDisabled", "fMultiSelectTrigger", "fReassignConnectionTrigger", "fCreateConnectionTrigger", "fNodeResizeTrigger", "fNodeRotateTrigger", "fNodeMoveTrigger", "fCanvasMoveTrigger", "fExternalItemTrigger", "fEmitOnNodeIntersect", "vCellSize", "hCellSize", "fCellSizeWhileDragging"], outputs: ["fSelectionChange", "fNodeIntersectedWithConnections", "fCreateNode", "fMoveNodes", "fReassignConnection", "fCreateConnection", "fDropToGroup", "fDragStarted", "fDragEnded"], exportAs: ["fDraggable"] }, { kind: "ngmodule", type: DynamicDialogModule }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i3.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i3.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i3.TabPanel, selector: "p-tabpanel", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: i3.TabList, selector: "p-tablist" }, { kind: "component", type: i3.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Toolbar, selector: "mt-toolbar", inputs: ["size"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }] });
433
439
  }
434
440
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: StructureBuilder, decorators: [{
435
441
  type: Component,
@@ -446,7 +452,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
446
452
  Skeleton,
447
453
  ], providers: [DialogService], host: {
448
454
  class: 'flex h-full bg-surface-100 dark:bg-surface-700 relative rounded-2xl',
449
- }, template: "<!-- structure-builder.html -->\n<mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n>\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">Level templates</h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs [(value)]=\"activeTab\" styleClass=\"structure-tabs\">\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0!\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n Drag to add item to your Structure:\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.name\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">All {{ tab }} items are in use</p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n</mt-card>\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connections(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (action of nodeActions(); track action.key) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14);--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"] }]
455
+ }, template: "<!-- structure-builder.html -->\n<mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n>\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">Level templates</h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs [(value)]=\"activeTab\" styleClass=\"structure-tabs\">\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0!\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n Drag to add item to your Structure:\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.name\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">All {{ tab }} items are in use</p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n</mt-card>\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connectionsComputed(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (action of nodeActions(); track action.key) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14);--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"] }]
450
456
  }], ctorParameters: () => [] });
451
457
 
452
458
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-structure-builder.mjs","sources":["../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.ts","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.html","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.ts","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.html","../../../../packages/masterteam/structure-builder/src/public-api.ts","../../../../packages/masterteam/structure-builder/src/masterteam-structure-builder.ts"],"sourcesContent":["import { Component, inject, AfterViewInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { Button } from '@masterteam/components/button';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\n\nexport interface NodeFormData {\n id: string;\n label: string;\n description?: string;\n [key: string]: any;\n}\n\n@Component({\n selector: 'mt-node-form-dialog',\n standalone: true,\n imports: [CommonModule, DynamicForm, Button, ReactiveFormsModule],\n templateUrl: './node-form-dialog.html',\n styleUrls: ['./node-form-dialog.scss'],\n})\nexport class NodeFormDialogComponent implements AfterViewInit {\n private ref = inject(DynamicDialogRef);\n private config = inject(DynamicDialogConfig);\n dynamicFormControl = new FormControl();\n\n nodeData: NodeFormData = this.config.data?.node || {};\n data = this.config.data || {};\n\n formSchema = this.config.data?.formSchema || [];\n ngAfterViewInit(): void {\n this.dynamicFormControl.setValue(this.nodeData);\n }\n get templateContext() {\n return {\n node: this.nodeData,\n save: (item: any = {}) => this.onSave(item),\n cancel: () => this.onCancel(),\n close: () => this.onCancel(),\n };\n }\n onSave(item: any = {}) {\n const updatedNode = {\n ...this.nodeData,\n ...this.dynamicFormControl.value,\n ...item,\n };\n this.ref.close(updatedNode);\n }\n\n onCancel() {\n this.ref.close();\n }\n}\n","@if (this.data?.template) {\n <ng-container\n *ngTemplateOutlet=\"data.template; context: templateContext\"\n ></ng-container>\n} @else {\n @if (nodeData) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n\n <div\n class=\"flex justify-end gap-3 mt-6 pt-4 border-t border-(--p-content-border-color)\"\n >\n <mt-button [label]=\"'Cancel'\" severity=\"secondary\" (onClick)=\"onCancel()\">\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'Save Changes'\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n </div>\n}\n","import { Component, inject, AfterViewInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { Button } from '@masterteam/components/button';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'mt-connection-form-dialog',\n standalone: true,\n imports: [CommonModule, DynamicForm, Button, ReactiveFormsModule],\n templateUrl: './connection-form-dialog.html',\n styleUrls: ['./connection-form-dialog.scss'],\n})\nexport class ConnectionFormDialogComponent implements AfterViewInit {\n private config = inject(DynamicDialogConfig);\n private ref = inject(DynamicDialogRef);\n dynamicFormControl = new FormControl();\n\n connectionData = this.config.data?.connection || {};\n formSchema = this.config.data?.formSchema || [];\n ngAfterViewInit(): void {\n this.dynamicFormControl.setValue(this.connectionData);\n }\n\n onSave(): void {\n if (this.dynamicFormControl.valid) {\n this.ref.close({\n ...this.connectionData,\n ...this.dynamicFormControl.value,\n });\n }\n }\n\n onCancel(): void {\n this.ref.close();\n }\n}\n","@if (connectionData && formSchema?.sections.length > 0) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n}\n\n<div\n class=\"flex justify-end gap-3 mt-6 pt-4 border-t border-(--p-content-border-color)\"\n>\n <mt-button [label]=\"'Cancel'\" severity=\"secondary\" (onClick)=\"onCancel()\">\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'Save Changes'\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from '@angular/core';\nimport { Button } from '@masterteam/components/button';\nimport { ButtonGroup } from '@masterteam/components/button-group';\nimport { PointExtensions } from '@foblex/2d';\nimport { StructureBuilder } from '../structure-builder';\n\n@Component({\n selector: 'mt-toolbar',\n imports: [Button, ButtonGroup],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './toolbar.html',\n styleUrl: './toolbar.css',\n})\nexport class Toolbar {\n readonly size = input<'small' | 'large' | undefined>();\n\n private builderComponent = inject(StructureBuilder);\n\n public onZoomIn(): void {\n this.builderComponent.fZoomDirective()?.zoomIn();\n }\n\n public onZoomOut(): void {\n this.builderComponent.fZoomDirective()?.zoomOut();\n }\n\n public onFitToScreen(): void {\n this.builderComponent\n .fCanvasComponent()\n ?.fitToScreen(PointExtensions.initialize(250, 250), true);\n }\n\n public onOneToOne(): void {\n this.builderComponent.fCanvasComponent()?.resetScaleAndCenter();\n }\n public autoLayout(): void {\n this.builderComponent.maybeAutoLayout();\n }\n}\n","<mt-button\n (onClick)=\"autoLayout()\"\n class=\"bg-content rounded-(--p-button-border-radius)\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"arrow.refresh-cw-05\"\n></mt-button>\n\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\n <mt-button\n (onClick)=\"onZoomOut()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.minus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onZoomIn()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.plus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onFitToScreen()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"layout.grid-02\"\n ></mt-button>\n</mt-buttongroup>\n","import {\n Component,\n input,\n model,\n signal,\n computed,\n inject,\n contentChild,\n TemplateRef,\n viewChild,\n output,\n OnInit,\n effect,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DynamicDialogModule, DialogService } from 'primeng/dynamicdialog';\nimport { TabsModule } from 'primeng/tabs';\nimport {\n EFMarkerType,\n FCanvasComponent,\n FCreateConnectionEvent,\n FCreateNodeEvent,\n FFlowComponent,\n FFlowModule,\n FZoomDirective,\n} from '@foblex/flow';\nimport { Button } from '@masterteam/components/button';\nimport { Card } from '@masterteam/components/card';\nimport { Icon } from '@masterteam/icons';\nimport { NodeFormDialogComponent } from './node-form-dialog/node-form-dialog';\nimport { ConnectionFormDialogComponent } from './connection-form-dialog/connection-form-dialog';\nimport { DynamicFormConfig } from '@masterteam/components';\nimport { Toolbar } from './toolbar/toolbar';\n\n// 🔁 dagre & helpers – same approach as lib sample\nimport * as dagre from 'dagre';\nimport { graphlib } from 'dagre';\nimport Graph = graphlib.Graph;\nimport { IPoint, PointExtensions } from '@foblex/2d';\nimport { Skeleton } from 'primeng/skeleton'; // TO DO\n\nexport interface Node {\n configuration?: {\n x?: number;\n y?: number;\n };\n [key: string]: any;\n}\n\nexport interface NodeFieldsMapping {\n id?: string;\n name?: string;\n icon?: string;\n color?: string;\n}\n\nexport interface AvailableNode {\n id: string;\n name: string;\n icon: string;\n color: string;\n tab: string[];\n [key: string]: any;\n}\n\nexport interface Connection {\n id: string;\n from: string;\n to: string;\n [key: string]: any;\n}\n\nexport interface Actions {\n key: string;\n icon: string;\n variant: string;\n size: string;\n severity?: string;\n tooltip?: string;\n}\n\nexport interface NodeActionEvent {\n action: Actions;\n node: AvailableNode;\n}\n\nexport type SBActionType =\n | 'createNode'\n | 'updateNode'\n | 'deleteNode'\n | 'createConnection'\n | 'updateConnection'\n | 'deleteConnection';\n\nexport interface SBAction {\n action: SBActionType;\n data?: any;\n}\n\n// ✨ Direction & config — mirrors lib sample\nenum Direction {\n LEFT_TO_RIGHT = 'LR',\n TOP_TO_BOTTOM = 'TB',\n}\n\nconst CONFIGURATION = {\n [Direction.LEFT_TO_RIGHT]: {\n // kept for parity; sides aren’t directly used here but available if needed\n outputSide: 'RIGHT',\n inputSide: 'LEFT',\n },\n [Direction.TOP_TO_BOTTOM]: {\n outputSide: 'BOTTOM',\n inputSide: 'TOP',\n },\n} as const;\n\n@Component({\n selector: 'mt-structure-builder',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n FFlowModule,\n DynamicDialogModule,\n TabsModule,\n Button,\n Icon,\n Card,\n Toolbar,\n Skeleton,\n ],\n templateUrl: './structure-builder.html',\n styleUrl: './structure-builder.scss',\n providers: [DialogService],\n host: {\n class:\n 'flex h-full bg-surface-100 dark:bg-surface-700 relative rounded-2xl',\n },\n})\nexport class StructureBuilder implements OnInit {\n public dialogService = inject(DialogService);\n nodeActionsEvent = output<NodeActionEvent>();\n action = output<SBAction>();\n availableNodes = input<AvailableNode[]>([]);\n protected fCanvas = viewChild(FCanvasComponent);\n public fFlowComponent = viewChild(FFlowComponent);\n public fCanvasComponent = viewChild(FCanvasComponent);\n public fZoomDirective = viewChild(FZoomDirective);\n nodeForm = input<DynamicFormConfig>({ sections: [] });\n connectionForm = input<DynamicFormConfig>({ sections: [] });\n nodeActions = input<Actions[]>([]);\n nodeFields = input<NodeFieldsMapping>({\n id: 'id',\n name: 'name',\n icon: 'icon',\n color: 'color',\n });\n\n protected isAutoLayout = input<boolean>(true);\n nodes = model<Node[]>([]);\n connections = model<Connection[]>([]);\n nodeDialogTemplate = contentChild<TemplateRef<any>>('nodeDialog');\n\n activeTab = signal('0');\n protected readonly eMarkerType = EFMarkerType;\n\n protected configuration = signal(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\n protected direction = signal<Direction>(Direction.TOP_TO_BOTTOM);\n\n private positions = signal<Record<string, IPoint>>({});\n\n protected fields = computed(() => {\n const inputFields = this.nodeFields();\n return {\n id: inputFields.id || 'id',\n name: inputFields.name || 'name',\n icon: inputFields.icon || 'icon',\n color: inputFields.color || 'color',\n } as any;\n });\n\n availableTabs = computed(() => {\n const tabsSet = new Set<string>();\n this.availableNodes().forEach((node) => {\n node.tab.forEach((tab) => tabsSet.add(tab));\n });\n return Array.from(tabsSet).sort();\n });\n\n currentTabNodes = computed(() => {\n const tabs = this.availableTabs();\n const currentTabIndex = parseInt(this.activeTab());\n if (currentTabIndex >= tabs.length) return [];\n const currentTab = tabs[currentTabIndex];\n return this.availableNodes().filter((node) =>\n node.tab.includes(currentTab),\n );\n });\n\n nodesWithComputedProps = computed(() => {\n const fields = this.fields();\n const pos = this.positions();\n return this.nodes().map((node) => {\n const _computedId = this.getNestedValue(node, fields.id) as\n | string\n | undefined;\n const _computedName = this.getNestedValue(node, fields.name) as\n | string\n | undefined;\n const _computedIcon = this.getNestedValue(node, fields.icon) as\n | string\n | undefined;\n const _computedColor = this.getNestedValue(node, fields.color) as\n | string\n | undefined;\n const id = _computedId ? String(_computedId) : '';\n const configuration = (id && pos[id]) ?? node.configuration ?? undefined;\n return {\n ...node,\n _computedId,\n _computedName,\n _computedIcon,\n _computedColor,\n configuration,\n };\n });\n });\n\n coreFields = computed(() => {\n const fields = this.fields();\n return new Set([\n ...Object.values(fields),\n 'configuration',\n '_computedId',\n '_computedName',\n '_computedIcon',\n '_computedColor',\n ]);\n });\n\n constructor() {\n effect(() => {\n const list = this.nodes();\n const fields = this.fields();\n const next: Record<string, IPoint> = { ...this.positions() };\n const liveIds = new Set<string>();\n for (const n of list) {\n const id = String(this.getNestedValue(n, fields.id) ?? '');\n if (!id) continue;\n liveIds.add(id);\n if (next[id] == null) {\n const c = n.configuration;\n if (c?.x != null && c?.y != null) {\n next[id] = { x: c.x, y: c.y };\n }\n }\n }\n for (const k of Object.keys(next)) {\n if (!liveIds.has(k)) delete next[k];\n }\n this.positions.set(next);\n });\n }\n\n public ngOnInit(): void {\n this.getData(new dagre.graphlib.Graph(), this.direction());\n }\n\n protected onLoaded(): void {\n this.fitToScreen();\n }\n\n onCreateNode(event: FCreateNodeEvent): void {\n const nodeData = event.data as AvailableNode;\n if (!nodeData) return;\n\n const fields = this.fields();\n const newNode: Node = {\n [fields.id]: nodeData.id,\n [fields.name]: nodeData.name,\n [fields.icon]: nodeData.icon,\n [fields.color]: nodeData.color,\n configuration: {\n x: event.rect.x,\n y: event.rect.y,\n },\n };\n\n if (this.nodeForm()?.sections.length > 0) {\n this.openNodeDialog(newNode, true);\n } else {\n this.action.emit({ action: 'createNode', data: newNode });\n }\n }\n\n onNodePositionChange(event: any): void {\n const nodeId = event.nodeId || event.detail?.nodeId;\n const position = event.position || event.detail?.position || event.rect;\n\n if (nodeId && position) {\n this.nodes.update((nodes) =>\n nodes.map((node) => {\n return node[this.fields().id] === nodeId\n ? { ...node, configuration: { x: position.x, y: position.y } }\n : node;\n }),\n );\n this.positions.update((p) => ({\n ...p,\n [nodeId]: { x: position.x, y: position.y },\n }));\n }\n }\n\n onCreateConnection(event: FCreateConnectionEvent): void {\n const newConnection: Connection = {\n id: this.generateConnectionId(),\n from: event.fOutputId!,\n to: event.fInputId!,\n };\n if (!event.fInputId! || !event.fOutputId!) {\n return;\n }\n const exists = this.connections().some(\n (conn) =>\n conn.from === newConnection.from && conn.to === newConnection.to,\n );\n\n if (!exists) {\n this.action.emit({ action: 'createConnection', data: newConnection });\n }\n }\n\n openNodeDialog(node: Node, isNewNode: boolean = false): void {\n const ref = this.dialogService.open(NodeFormDialogComponent, {\n header: 'Edit Node Properties',\n width: '600px',\n focusOnShow: this.nodeDialogTemplate() ? false : true,\n data: {\n node: node,\n formSchema: this.nodeForm(),\n template: this.nodeDialogTemplate(),\n },\n });\n\n ref.onClose.subscribe((result) => {\n if (result) {\n if (isNewNode) {\n const newNodeWithFormData = { ...node, ...result };\n this.action.emit({ action: 'createNode', data: newNodeWithFormData });\n } else {\n this.onNodeFormSubmit(result);\n }\n }\n });\n }\n\n openConnectionDialog(connection: Connection): void {\n const ref = this.dialogService.open(ConnectionFormDialogComponent, {\n header: 'Edit Connection Properties',\n width: '600px',\n data: {\n connection: connection,\n formSchema: this.connectionForm(),\n },\n });\n\n ref.onClose.subscribe((result) => {\n if (result) {\n this.onConnectionFormSubmit(result);\n }\n });\n }\n\n onNodeFormSubmit(formData: any): void {\n const nodeId = formData[this.fields().id];\n if (nodeId) {\n this.action.emit({ action: 'updateNode', data: formData });\n }\n }\n\n onConnectionFormSubmit(formData: any): void {\n const connectionId = formData.id;\n if (connectionId) {\n this.action.emit({ action: 'updateConnection', data: formData });\n }\n }\n\n removeNode(node: any): void {\n this.action.emit({ action: 'deleteNode', data: node });\n }\n\n removeConnection(connection: any): void {\n this.action.emit({ action: 'deleteConnection', data: connection });\n }\n\n buttonAction(action: any, node: any) {\n this.nodeActionsEvent.emit({ action, node });\n if (action.key === 'edit') {\n this.openNodeDialog(node);\n } else if (action.key === 'delete') {\n this.removeNode(node);\n }\n }\n\n protected fitToScreen(): void {\n this.fCanvasComponent()?.fitToScreen(\n PointExtensions.initialize(200, 200),\n false,\n );\n }\n\n private getData(graph: Graph, direction: Direction): void {\n this.direction.set(direction);\n if (this.isAutoLayout()) {\n this.fFlowComponent()?.reset();\n }\n this.updateGraph(graph, direction);\n this.applyGraphPositions(graph);\n }\n\n private updateGraph(graph: Graph, direction: Direction): void {\n this.configuration.set(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\n graph.setGraph({ rankdir: direction });\n\n const SIZE = { width: 300, height: 200 };\n this.nodes().forEach((n) => {\n graph.setNode(n[this.fields().id], {\n width: SIZE.width,\n height: SIZE.height,\n });\n });\n\n this.connections().forEach((c) => {\n const fromId = this.extractNodeId(c.from);\n const toId = this.extractNodeId(c.to);\n if (fromId && toId && fromId !== toId) {\n graph.setEdge(fromId, toId, {});\n }\n });\n\n dagre.layout(graph);\n }\n\n private applyGraphPositions(graph: Graph): void {\n const positionsById: Record<string, IPoint> = {};\n graph.nodes().forEach((key) => {\n const gNode = graph.node(key);\n positionsById[key] = { x: gNode.x, y: gNode.y };\n });\n\n this.nodes.update((nodes) =>\n nodes.map((node) => {\n const pos = positionsById[node[this.fields().id]];\n if (!pos) return node;\n return {\n ...node,\n configuration: {\n x: pos.x,\n y: pos.y,\n },\n };\n }),\n );\n this.positions.update((old) => ({ ...old, ...positionsById }));\n }\n\n private getNestedValue(obj: unknown, path?: string | null): unknown {\n if (!path) return undefined;\n const keys = path\n .replace(/\\[(\\w+)\\]/g, '.$1')\n .replace(/^\\./, '')\n .split('.')\n .filter(Boolean);\n\n return keys.reduce<unknown>(\n (acc, k) => (acc == null ? undefined : (acc as any)[k]),\n obj,\n );\n }\n\n maybeAutoLayout(): void {\n if (!this.isAutoLayout() || this.nodes().length === 0) return;\n this.getData(new dagre.graphlib.Graph(), this.direction());\n }\n\n private generateConnectionId(): string {\n return `conn-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private extractNodeId(connectionEndId: string): string {\n return (connectionEndId || '').replace(/-(in|out)$/, '');\n }\n}\n","<!-- structure-builder.html -->\n<mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n>\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">Level templates</h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs [(value)]=\"activeTab\" styleClass=\"structure-tabs\">\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0!\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n Drag to add item to your Structure:\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.name\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">All {{ tab }} items are in use</p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n</mt-card>\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connections(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (action of nodeActions(); track action.key) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n","/*\n * Public API Surface of structure-builder\n */\n\nexport * from './lib/structure-builder';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-structure-builder.mjs","sources":["../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.ts","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.html","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.ts","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.html","../../../../packages/masterteam/structure-builder/src/public-api.ts","../../../../packages/masterteam/structure-builder/src/masterteam-structure-builder.ts"],"sourcesContent":["import { Component, inject, AfterViewInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { Button } from '@masterteam/components/button';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\n\nexport interface NodeFormData {\n id: string;\n label: string;\n description?: string;\n [key: string]: any;\n}\n\n@Component({\n selector: 'mt-node-form-dialog',\n standalone: true,\n imports: [CommonModule, DynamicForm, Button, ReactiveFormsModule],\n templateUrl: './node-form-dialog.html',\n styleUrls: ['./node-form-dialog.scss'],\n})\nexport class NodeFormDialogComponent implements AfterViewInit {\n private ref = inject(DynamicDialogRef);\n private config = inject(DynamicDialogConfig);\n dynamicFormControl = new FormControl();\n\n nodeData: NodeFormData = this.config.data?.node || {};\n data = this.config.data || {};\n\n formSchema = this.config.data?.formSchema || [];\n ngAfterViewInit(): void {\n this.dynamicFormControl.setValue(this.nodeData);\n }\n get templateContext() {\n return {\n node: this.nodeData,\n save: (item: any = {}) => this.onSave(item),\n cancel: () => this.onCancel(),\n close: () => this.onCancel(),\n };\n }\n onSave(item: any = {}) {\n const updatedNode = {\n ...this.nodeData,\n ...this.dynamicFormControl.value,\n ...item,\n };\n this.ref.close(updatedNode);\n }\n\n onCancel() {\n this.ref.close();\n }\n}\n","@if (this.data?.template) {\n <ng-container\n *ngTemplateOutlet=\"data.template; context: templateContext\"\n ></ng-container>\n} @else {\n @if (nodeData) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n\n <div\n class=\"flex justify-end gap-3 mt-6 pt-4 border-t border-(--p-content-border-color)\"\n >\n <mt-button [label]=\"'Cancel'\" severity=\"secondary\" (onClick)=\"onCancel()\">\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'Save Changes'\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n </div>\n}\n","import { Component, inject, AfterViewInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { Button } from '@masterteam/components/button';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: 'mt-connection-form-dialog',\n standalone: true,\n imports: [CommonModule, DynamicForm, Button, ReactiveFormsModule],\n templateUrl: './connection-form-dialog.html',\n styleUrls: ['./connection-form-dialog.scss'],\n})\nexport class ConnectionFormDialogComponent implements AfterViewInit {\n private config = inject(DynamicDialogConfig);\n private ref = inject(DynamicDialogRef);\n dynamicFormControl = new FormControl();\n\n connectionData = this.config.data?.connection || {};\n formSchema = this.config.data?.formSchema || [];\n ngAfterViewInit(): void {\n this.dynamicFormControl.setValue(this.connectionData);\n }\n\n onSave(): void {\n if (this.dynamicFormControl.valid) {\n this.ref.close({\n ...this.connectionData,\n ...this.dynamicFormControl.value,\n });\n }\n }\n\n onCancel(): void {\n this.ref.close();\n }\n}\n","@if (connectionData && formSchema?.sections.length > 0) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n}\n\n<div\n class=\"flex justify-end gap-3 mt-6 pt-4 border-t border-(--p-content-border-color)\"\n>\n <mt-button [label]=\"'Cancel'\" severity=\"secondary\" (onClick)=\"onCancel()\">\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'Save Changes'\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from '@angular/core';\nimport { Button } from '@masterteam/components/button';\nimport { ButtonGroup } from '@masterteam/components/button-group';\nimport { PointExtensions } from '@foblex/2d';\nimport { StructureBuilder } from '../structure-builder';\n\n@Component({\n selector: 'mt-toolbar',\n imports: [Button, ButtonGroup],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './toolbar.html',\n styleUrl: './toolbar.css',\n})\nexport class Toolbar {\n readonly size = input<'small' | 'large' | undefined>();\n\n private builderComponent = inject(StructureBuilder);\n\n public onZoomIn(): void {\n this.builderComponent.fZoomDirective()?.zoomIn();\n }\n\n public onZoomOut(): void {\n this.builderComponent.fZoomDirective()?.zoomOut();\n }\n\n public onFitToScreen(): void {\n this.builderComponent\n .fCanvasComponent()\n ?.fitToScreen(PointExtensions.initialize(250, 250), true);\n }\n\n public onOneToOne(): void {\n this.builderComponent.fCanvasComponent()?.resetScaleAndCenter();\n }\n public autoLayout(): void {\n this.builderComponent.maybeAutoLayout();\n }\n}\n","<mt-button\n (onClick)=\"autoLayout()\"\n class=\"bg-content rounded-(--p-button-border-radius)\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"arrow.refresh-cw-05\"\n></mt-button>\n\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\n <mt-button\n (onClick)=\"onZoomOut()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.minus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onZoomIn()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.plus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onFitToScreen()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"layout.grid-02\"\n ></mt-button>\n</mt-buttongroup>\n","import {\n Component,\n input,\n model,\n signal,\n computed,\n inject,\n contentChild,\n TemplateRef,\n viewChild,\n output,\n OnInit,\n effect,\n untracked,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DynamicDialogModule, DialogService } from 'primeng/dynamicdialog';\nimport { TabsModule } from 'primeng/tabs';\nimport {\n EFMarkerType,\n FCanvasComponent,\n FCreateConnectionEvent,\n FCreateNodeEvent,\n FFlowComponent,\n FFlowModule,\n FZoomDirective,\n} from '@foblex/flow';\nimport { Button } from '@masterteam/components/button';\nimport { Card } from '@masterteam/components/card';\nimport { Icon } from '@masterteam/icons';\nimport { NodeFormDialogComponent } from './node-form-dialog/node-form-dialog';\nimport { ConnectionFormDialogComponent } from './connection-form-dialog/connection-form-dialog';\nimport { DynamicFormConfig } from '@masterteam/components';\nimport { Toolbar } from './toolbar/toolbar';\n\n// 🔁 dagre & helpers – same approach as lib sample\nimport * as dagre from 'dagre';\nimport { graphlib } from 'dagre';\nimport Graph = graphlib.Graph;\nimport { IPoint, PointExtensions } from '@foblex/2d';\nimport { Skeleton } from 'primeng/skeleton'; // TO DO\n\nexport interface Node {\n configuration?: {\n x?: number;\n y?: number;\n };\n [key: string]: any;\n loading?: boolean;\n}\n\nexport interface NodeFieldsMapping {\n id?: string;\n name?: string;\n icon?: string;\n color?: string;\n}\n\nexport interface AvailableNode {\n id: string;\n name: string;\n icon: string;\n color: string;\n tab: string[];\n [key: string]: any;\n}\n\nexport interface Connection {\n id: string;\n from: string;\n to: string;\n [key: string]: any;\n}\n\nexport interface Actions {\n key: string;\n icon: string;\n variant: string;\n size: string;\n severity?: string;\n tooltip?: string;\n}\n\nexport interface NodeActionEvent {\n action: Actions;\n node: AvailableNode;\n}\n\nexport type SBActionType =\n | 'createNode'\n | 'updateNode'\n | 'deleteNode'\n | 'createConnection'\n | 'updateConnection'\n | 'deleteConnection';\n\nexport interface SBAction {\n action: SBActionType;\n data?: any;\n}\n\n// ✨ Direction & config — mirrors lib sample\nenum Direction {\n LEFT_TO_RIGHT = 'LR',\n TOP_TO_BOTTOM = 'TB',\n}\n\nconst CONFIGURATION = {\n [Direction.LEFT_TO_RIGHT]: {\n // kept for parity; sides aren’t directly used here but available if needed\n outputSide: 'RIGHT',\n inputSide: 'LEFT',\n },\n [Direction.TOP_TO_BOTTOM]: {\n outputSide: 'BOTTOM',\n inputSide: 'TOP',\n },\n} as const;\n\n@Component({\n selector: 'mt-structure-builder',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n FFlowModule,\n DynamicDialogModule,\n TabsModule,\n Button,\n Icon,\n Card,\n Toolbar,\n Skeleton,\n ],\n templateUrl: './structure-builder.html',\n styleUrl: './structure-builder.scss',\n providers: [DialogService],\n host: {\n class:\n 'flex h-full bg-surface-100 dark:bg-surface-700 relative rounded-2xl',\n },\n})\nexport class StructureBuilder implements OnInit {\n public dialogService = inject(DialogService);\n nodeActionsEvent = output<NodeActionEvent>();\n action = output<SBAction>();\n availableNodes = input<AvailableNode[]>([]);\n protected fCanvas = viewChild(FCanvasComponent);\n public fFlowComponent = viewChild(FFlowComponent);\n public fCanvasComponent = viewChild(FCanvasComponent);\n public fZoomDirective = viewChild(FZoomDirective);\n nodeForm = input<DynamicFormConfig>({ sections: [] });\n connectionForm = input<DynamicFormConfig>({ sections: [] });\n nodeActions = input<Actions[]>([]);\n nodeFields = input<NodeFieldsMapping>({\n id: 'id',\n name: 'name',\n icon: 'icon',\n color: 'color',\n });\n\n protected isAutoLayout = input<boolean>(true);\n nodes = model<Node[]>([]);\n connections = model<Connection[]>([]);\n nodeDialogTemplate = contentChild<TemplateRef<any>>('nodeDialog');\n\n activeTab = signal('0');\n protected readonly eMarkerType = EFMarkerType;\n\n protected configuration = signal(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\n protected direction = signal<Direction>(Direction.TOP_TO_BOTTOM);\n\n private positions = signal<Record<string, IPoint>>({});\n\n protected fields = computed(() => {\n const inputFields = this.nodeFields();\n return {\n id: inputFields.id || 'id',\n name: inputFields.name || 'name',\n icon: inputFields.icon || 'icon',\n color: inputFields.color || 'color',\n } as any;\n });\n\n availableTabs = computed(() => {\n const tabsSet = new Set<string>();\n this.availableNodes().forEach((node) => {\n node.tab.forEach((tab) => tabsSet.add(tab));\n });\n return Array.from(tabsSet).sort();\n });\n\n currentTabNodes = computed(() => {\n const tabs = this.availableTabs();\n const currentTabIndex = parseInt(this.activeTab());\n if (currentTabIndex >= tabs.length) return [];\n const currentTab = tabs[currentTabIndex];\n return this.availableNodes().filter((node) =>\n node.tab.includes(currentTab),\n );\n });\n\n nodesWithComputedProps = computed(() => {\n const fields = this.fields();\n const pos = this.positions();\n return this.nodes().map((node) => {\n const _computedId = String(this.getNestedValue(node, fields.id));\n const _computedName = this.getNestedValue(node, fields.name);\n const _computedIcon = this.getNestedValue(node, fields.icon);\n const _computedColor = this.getNestedValue(node, fields.color);\n const id = _computedId;\n const configuration = (id && pos[id]) ?? node.configuration ?? undefined;\n return {\n ...node,\n _computedId,\n _computedName,\n _computedIcon,\n _computedColor,\n configuration,\n };\n });\n });\n connectionsComputed = computed(() =>\n this.connections()?.map((c) => ({\n ...c,\n from: String(c.from),\n to: String(c.to),\n })),\n );\n coreFields = computed(() => {\n const fields = this.fields();\n return new Set([\n ...Object.values(fields),\n 'configuration',\n '_computedId',\n '_computedName',\n '_computedIcon',\n '_computedColor',\n ]);\n });\n\n constructor() {\n effect(() => {\n const list = this.nodes();\n const fields = this.fields();\n const next: Record<string, IPoint> = untracked(() => this.positions());\n const liveIds = new Set<string>();\n for (const n of list) {\n const id = String(this.getNestedValue(n, fields.id) ?? '');\n if (!id || n?.loading) continue;\n liveIds.add(id);\n if (next[id] == null) {\n const c = n.configuration;\n if (c?.x != null && c?.y != null) {\n next[id] = { x: c.x, y: c.y };\n }\n }\n }\n for (const k of Object.keys(next)) {\n if (!liveIds.has(k)) delete next[k];\n }\n this.positions.set(next);\n });\n }\n\n public ngOnInit(): void {\n this.getData(new dagre.graphlib.Graph(), this.direction());\n }\n\n protected onLoaded(): void {\n this.fitToScreen();\n }\n\n onCreateNode(event: FCreateNodeEvent): void {\n const nodeData = event.data as AvailableNode;\n if (!nodeData) return;\n\n const fields = this.fields();\n const newNode: Node = {\n [fields.id]: nodeData.id,\n [fields.name]: nodeData.name,\n [fields.icon]: nodeData.icon,\n [fields.color]: nodeData.color,\n configuration: {\n x: event.rect.x,\n y: event.rect.y,\n },\n };\n\n if (this.nodeForm()?.sections.length > 0) {\n this.openNodeDialog(newNode, true);\n } else {\n this.action.emit({ action: 'createNode', data: newNode });\n }\n }\n\n onNodePositionChange(event: any): void {\n const nodeId = event.nodeId || event.detail?.nodeId;\n const position = event.position || event.detail?.position || event.rect;\n\n if (nodeId && position) {\n this.nodes.update((nodes) =>\n nodes.map((node) => {\n return node[this.fields().id] === nodeId\n ? { ...node, configuration: { x: position.x, y: position.y } }\n : node;\n }),\n );\n this.positions.update((p) => ({\n ...p,\n [nodeId]: { x: position.x, y: position.y },\n }));\n }\n }\n\n onCreateConnection(event: FCreateConnectionEvent): void {\n const newConnection: Connection = {\n id: this.generateConnectionId(),\n from: event.fOutputId!,\n to: event.fInputId!,\n };\n if (!event.fInputId! || !event.fOutputId!) {\n return;\n }\n const exists = this.connectionsComputed().some(\n (conn) =>\n conn.from === newConnection.from && conn.to === newConnection.to,\n );\n\n if (!exists) {\n this.action.emit({ action: 'createConnection', data: newConnection });\n }\n }\n\n openNodeDialog(node: Node, isNewNode: boolean = false): void {\n const ref = this.dialogService.open(NodeFormDialogComponent, {\n header: 'Edit Node Properties',\n width: '600px',\n focusOnShow: this.nodeDialogTemplate() ? false : true,\n data: {\n node: node,\n formSchema: this.nodeForm(),\n template: this.nodeDialogTemplate(),\n },\n });\n\n ref.onClose.subscribe((result) => {\n if (result) {\n if (isNewNode) {\n const newNodeWithFormData = { ...node, ...result };\n this.action.emit({ action: 'createNode', data: newNodeWithFormData });\n } else {\n this.onNodeFormSubmit(result);\n }\n }\n });\n }\n\n openConnectionDialog(connection: Connection): void {\n const ref = this.dialogService.open(ConnectionFormDialogComponent, {\n header: 'Edit Connection Properties',\n width: '600px',\n data: {\n connection: connection,\n formSchema: this.connectionForm(),\n },\n });\n\n ref.onClose.subscribe((result) => {\n if (result) {\n this.onConnectionFormSubmit(result);\n }\n });\n }\n\n onNodeFormSubmit(formData: any): void {\n const nodeId = formData[this.fields().id];\n if (nodeId) {\n this.action.emit({ action: 'updateNode', data: formData });\n }\n }\n\n onConnectionFormSubmit(formData: any): void {\n const connectionId = formData.id;\n if (connectionId) {\n this.action.emit({ action: 'updateConnection', data: formData });\n }\n }\n\n removeNode(node: any): void {\n this.action.emit({ action: 'deleteNode', data: node });\n }\n\n removeConnection(connection: any): void {\n this.action.emit({ action: 'deleteConnection', data: connection });\n }\n\n buttonAction(action: any, node: any) {\n this.nodeActionsEvent.emit({ action, node });\n if (action.key === 'edit') {\n this.openNodeDialog(node);\n } else if (action.key === 'delete') {\n this.removeNode(node);\n }\n }\n\n protected fitToScreen(): void {\n const area = this.nodes()?.length * 70;\n this.fCanvasComponent()?.fitToScreen(\n PointExtensions.initialize(area, area),\n false,\n );\n }\n\n private getData(graph: Graph, direction: Direction): void {\n this.direction.set(direction);\n if (this.isAutoLayout()) {\n this.fFlowComponent()?.reset();\n }\n this.updateGraph(graph, direction);\n this.applyGraphPositions(graph);\n }\n\n private updateGraph(graph: Graph, direction: Direction): void {\n this.configuration.set(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\n graph.setGraph({ rankdir: direction });\n\n const SIZE = { width: 300, height: 200 };\n this.nodes().forEach((n) => {\n graph.setNode(n[this.fields().id], {\n width: SIZE.width,\n height: SIZE.height,\n });\n });\n\n this.connectionsComputed().forEach((c) => {\n const fromId = c.from;\n const toId = c.to;\n if (fromId && toId && fromId !== toId) {\n graph.setEdge(fromId, toId, {});\n }\n });\n\n dagre.layout(graph);\n }\n\n private applyGraphPositions(graph: Graph): void {\n const positionsById: Record<string, IPoint> = {};\n graph.nodes().forEach((key) => {\n const gNode = graph.node(key);\n positionsById[key] = { x: gNode.x, y: gNode.y };\n });\n\n this.nodes.update((nodes) =>\n nodes.map((node) => {\n const pos = positionsById[node[this.fields().id]];\n if (!pos) return node;\n return {\n ...node,\n configuration: {\n x: pos.x,\n y: pos.y,\n },\n };\n }),\n );\n this.positions.update((old) => ({ ...old, ...positionsById }));\n }\n\n private getNestedValue(obj: unknown, path?: string | null): unknown {\n if (!path) return undefined;\n const keys = path\n .replace(/\\[(\\w+)\\]/g, '.$1')\n .replace(/^\\./, '')\n .split('.')\n .filter(Boolean);\n\n return keys.reduce<unknown>(\n (acc, k) => (acc == null ? undefined : (acc as any)[k]),\n obj,\n );\n }\n\n maybeAutoLayout(): void {\n if (!this.isAutoLayout() || this.nodes().length === 0) return;\n this.getData(new dagre.graphlib.Graph(), this.direction());\n }\n\n private generateConnectionId(): string {\n return `conn-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private extractNodeId(connectionEndId: string): string {\n return (connectionEndId || '').replace(/-(in|out)$/, '');\n }\n}\n","<!-- structure-builder.html -->\n<mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n>\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">Level templates</h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs [(value)]=\"activeTab\" styleClass=\"structure-tabs\">\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0!\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n Drag to add item to your Structure:\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.name\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">All {{ tab }} items are in use</p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n</mt-card>\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connectionsComputed(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (action of nodeActions(); track action.key) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n","/*\n * Public API Surface of structure-builder\n */\n\nexport * from './lib/structure-builder';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -11,6 +11,7 @@ interface Node {
11
11
  y?: number;
12
12
  };
13
13
  [key: string]: any;
14
+ loading?: boolean;
14
15
  }
15
16
  interface NodeFieldsMapping {
16
17
  id?: string;
@@ -82,11 +83,17 @@ declare class StructureBuilder implements OnInit {
82
83
  availableTabs: _angular_core.Signal<string[]>;
83
84
  currentTabNodes: _angular_core.Signal<AvailableNode[]>;
84
85
  nodesWithComputedProps: _angular_core.Signal<{
85
- _computedId: string | undefined;
86
- _computedName: string | undefined;
87
- _computedIcon: string | undefined;
88
- _computedColor: string | undefined;
86
+ _computedId: string;
87
+ _computedName: unknown;
88
+ _computedIcon: unknown;
89
+ _computedColor: unknown;
89
90
  configuration: "" | IPoint;
91
+ loading?: boolean;
92
+ }[]>;
93
+ connectionsComputed: _angular_core.Signal<{
94
+ from: string;
95
+ to: string;
96
+ id: string;
90
97
  }[]>;
91
98
  coreFields: _angular_core.Signal<Set<unknown>>;
92
99
  constructor();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/structure-builder",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
4
4
  "publishConfig": {
5
5
  "directory": ".",
6
6
  "linkDirectory": false,