ngx-vflow 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/esm2022/lib/vflow/components/custom-node-base/custom-node-base.component.mjs +2 -2
  2. package/esm2022/lib/vflow/components/node/node.component.mjs +5 -4
  3. package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +11 -10
  4. package/esm2022/lib/vflow/directives/connection-controller.directive.mjs +5 -5
  5. package/esm2022/lib/vflow/directives/node-resize-controller.directive.mjs +4 -1
  6. package/esm2022/lib/vflow/directives/template.directive.mjs +18 -1
  7. package/esm2022/lib/vflow/interfaces/node.interface.mjs +7 -1
  8. package/esm2022/lib/vflow/interfaces/template-context.interface.mjs +1 -1
  9. package/esm2022/lib/vflow/models/handle.model.mjs +2 -2
  10. package/esm2022/lib/vflow/models/node.model.mjs +48 -70
  11. package/esm2022/lib/vflow/public-components/minimap/minimap.component.mjs +5 -5
  12. package/esm2022/lib/vflow/public-components/resizable/resizable.component.mjs +105 -44
  13. package/esm2022/lib/vflow/services/draggable.service.mjs +2 -4
  14. package/esm2022/lib/vflow/services/flow-entities.service.mjs +2 -2
  15. package/esm2022/lib/vflow/services/node-changes.service.mjs +6 -6
  16. package/esm2022/lib/vflow/services/overlays.service.mjs +4 -3
  17. package/esm2022/lib/vflow/services/viewport.service.mjs +2 -2
  18. package/esm2022/lib/vflow/testing-utils/directive-mocks/template-mock.directive.mjs +15 -1
  19. package/esm2022/lib/vflow/utils/add-nodes-to-edges.mjs +2 -2
  20. package/esm2022/lib/vflow/utils/align-number.mjs +4 -0
  21. package/esm2022/lib/vflow/utils/identity-checker/reference-identity-checker.mjs +31 -0
  22. package/esm2022/lib/vflow/utils/is-group-node.mjs +2 -2
  23. package/esm2022/lib/vflow/utils/to-unified-node.mjs +24 -0
  24. package/esm2022/lib/vflow/vflow.mjs +3 -2
  25. package/fesm2022/ngx-vflow.mjs +251 -147
  26. package/fesm2022/ngx-vflow.mjs.map +1 -1
  27. package/lib/vflow/components/node/node.component.d.ts +3 -2
  28. package/lib/vflow/components/vflow/vflow.component.d.ts +4 -3
  29. package/lib/vflow/directives/node-resize-controller.directive.d.ts +3 -0
  30. package/lib/vflow/directives/template.directive.d.ts +7 -1
  31. package/lib/vflow/interfaces/node.interface.d.ts +16 -2
  32. package/lib/vflow/interfaces/template-context.interface.d.ts +8 -0
  33. package/lib/vflow/models/node.model.d.ts +13 -17
  34. package/lib/vflow/public-components/minimap/minimap.component.d.ts +1 -1
  35. package/lib/vflow/public-components/resizable/resizable.component.d.ts +2 -0
  36. package/lib/vflow/services/overlays.service.d.ts +2 -2
  37. package/lib/vflow/testing-utils/directive-mocks/template-mock.directive.d.ts +5 -0
  38. package/lib/vflow/utils/align-number.d.ts +1 -0
  39. package/lib/vflow/utils/{reference-keeper.d.ts → identity-checker/reference-identity-checker.d.ts} +5 -5
  40. package/lib/vflow/utils/to-unified-node.d.ts +2 -0
  41. package/lib/vflow/vflow.d.ts +2 -2
  42. package/package.json +1 -1
  43. package/esm2022/lib/vflow/utils/reference-keeper.mjs +0 -31
@@ -17,9 +17,10 @@ export declare class NodeComponent implements OnInit, OnDestroy {
17
17
  private connectionController;
18
18
  model: import("@angular/core").InputSignal<NodeModel<unknown>>;
19
19
  nodeTemplate: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
20
+ nodeSvgTemplate: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
20
21
  groupNodeTemplate: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
21
22
  protected showMagnet: import("@angular/core").Signal<boolean>;
22
- protected toolbar: import("@angular/core").Signal<import("../../models/toolbar.model").ToolbarModel | undefined>;
23
+ protected toolbars: import("@angular/core").Signal<import("../../models/toolbar.model").ToolbarModel[] | undefined>;
23
24
  ngOnInit(): void;
24
25
  ngOnDestroy(): void;
25
26
  protected startConnection(event: Event, handle: HandleModel): void;
@@ -29,5 +30,5 @@ export declare class NodeComponent implements OnInit, OnDestroy {
29
30
  protected pullNode(): void;
30
31
  protected selectNode(): void;
31
32
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeComponent, never>;
32
- static ɵcmp: i0.ɵɵComponentDeclaration<NodeComponent, "g[node]", never, { "model": { "alias": "model"; "required": true; "isSignal": true; }; "nodeTemplate": { "alias": "nodeTemplate"; "required": false; "isSignal": true; }; "groupNodeTemplate": { "alias": "groupNodeTemplate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<NodeComponent, "g[node]", never, { "model": { "alias": "model"; "required": true; "isSignal": true; }; "nodeTemplate": { "alias": "nodeTemplate"; "required": false; "isSignal": true; }; "nodeSvgTemplate": { "alias": "nodeSvgTemplate"; "required": false; "isSignal": true; }; "groupNodeTemplate": { "alias": "groupNodeTemplate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
33
34
  }
@@ -4,7 +4,7 @@ import { MapContextDirective } from '../../directives/map-context.directive';
4
4
  import { NodeModel } from '../../models/node.model';
5
5
  import { Edge } from '../../interfaces/edge.interface';
6
6
  import { EdgeModel } from '../../models/edge.model';
7
- import { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, NodeHtmlTemplateDirective } from '../../directives/template.directive';
7
+ import { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, NodeHtmlTemplateDirective, NodeSvgTemplateDirective } from '../../directives/template.directive';
8
8
  import { Point } from '../../interfaces/point.interface';
9
9
  import { ViewportState } from '../../interfaces/viewport.interface';
10
10
  import { ConnectionModel } from '../../models/connection.model';
@@ -99,6 +99,7 @@ export declare class VflowComponent implements OnInit {
99
99
  */
100
100
  readonly onComponentNodeEvent: import("@angular/core").OutputRef<any>;
101
101
  protected nodeTemplateDirective: import("@angular/core").Signal<NodeHtmlTemplateDirective | undefined>;
102
+ protected nodeSvgTemplateDirective: import("@angular/core").Signal<NodeSvgTemplateDirective | undefined>;
102
103
  protected groupNodeTemplateDirective: import("@angular/core").Signal<GroupNodeTemplateDirective | undefined>;
103
104
  protected edgeTemplateDirective: import("@angular/core").Signal<EdgeTemplateDirective | undefined>;
104
105
  protected edgeLabelHtmlDirective: import("@angular/core").Signal<EdgeLabelHtmlTemplateDirective | undefined>;
@@ -165,10 +166,10 @@ export declare class VflowComponent implements OnInit {
165
166
  * Convert point received from document to point on the flow
166
167
  */
167
168
  documentPointToFlowPoint(point: Point): Point;
168
- protected trackNodes(idx: number, { node }: NodeModel): Node<unknown> | DynamicNode<unknown>;
169
+ protected trackNodes(idx: number, { rawNode: node }: NodeModel): Node<unknown> | DynamicNode<unknown>;
169
170
  protected trackEdges(idx: number, { edge }: EdgeModel): Edge<unknown>;
170
171
  private setInitialNodesOrder;
171
172
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowComponent, never>;
172
- static ɵcmp: i0.ɵɵComponentDeclaration<VflowComponent, "vflow", never, { "view": { "alias": "view"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "background": { "alias": "background"; "required": false; }; "optimization": { "alias": "optimization"; "required": false; "isSignal": true; }; "entitiesSelectable": { "alias": "entitiesSelectable"; "required": false; }; "keyboardShortcuts": { "alias": "keyboardShortcuts"; "required": false; }; "connection": { "alias": "connection"; "required": false; }; "snapGrid": { "alias": "snapGrid"; "required": false; }; "elevateNodesOnSelect": { "alias": "elevateNodesOnSelect"; "required": false; }; "elevateEdgesOnSelect": { "alias": "elevateEdgesOnSelect"; "required": false; }; "nodes": { "alias": "nodes"; "required": true; }; "edges": { "alias": "edges"; "required": false; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], never, true, [{ directive: typeof i1.ChangesControllerDirective; inputs: {}; outputs: { "onNodesChange": "onNodesChange"; "onNodesChange.position": "onNodesChange.position"; "onNodesChange.position.single": "onNodesChange.position.single"; "onNodesChange.position.many": "onNodesChange.position.many"; "onNodesChange.size": "onNodesChange.size"; "onNodesChange.size.single": "onNodesChange.size.single"; "onNodesChange.size.many": "onNodesChange.size.many"; "onNodesChange.add": "onNodesChange.add"; "onNodesChange.add.single": "onNodesChange.add.single"; "onNodesChange.add.many": "onNodesChange.add.many"; "onNodesChange.remove": "onNodesChange.remove"; "onNodesChange.remove.single": "onNodesChange.remove.single"; "onNodesChange.remove.many": "onNodesChange.remove.many"; "onNodesChange.select": "onNodesChange.select"; "onNodesChange.select.single": "onNodesChange.select.single"; "onNodesChange.select.many": "onNodesChange.select.many"; "onEdgesChange": "onEdgesChange"; "onEdgesChange.detached": "onEdgesChange.detached"; "onEdgesChange.detached.single": "onEdgesChange.detached.single"; "onEdgesChange.detached.many": "onEdgesChange.detached.many"; "onEdgesChange.add": "onEdgesChange.add"; "onEdgesChange.add.single": "onEdgesChange.add.single"; "onEdgesChange.add.many": "onEdgesChange.add.many"; "onEdgesChange.remove": "onEdgesChange.remove"; "onEdgesChange.remove.single": "onEdgesChange.remove.single"; "onEdgesChange.remove.many": "onEdgesChange.remove.many"; "onEdgesChange.select": "onEdgesChange.select"; "onEdgesChange.select.single": "onEdgesChange.select.single"; "onEdgesChange.select.many": "onEdgesChange.select.many"; }; }]>;
173
+ static ɵcmp: i0.ɵɵComponentDeclaration<VflowComponent, "vflow", never, { "view": { "alias": "view"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "background": { "alias": "background"; "required": false; }; "optimization": { "alias": "optimization"; "required": false; "isSignal": true; }; "entitiesSelectable": { "alias": "entitiesSelectable"; "required": false; }; "keyboardShortcuts": { "alias": "keyboardShortcuts"; "required": false; }; "connection": { "alias": "connection"; "required": false; }; "snapGrid": { "alias": "snapGrid"; "required": false; }; "elevateNodesOnSelect": { "alias": "elevateNodesOnSelect"; "required": false; }; "elevateEdgesOnSelect": { "alias": "elevateEdgesOnSelect"; "required": false; }; "nodes": { "alias": "nodes"; "required": true; }; "edges": { "alias": "edges"; "required": false; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeTemplateDirective", "nodeSvgTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], never, true, [{ directive: typeof i1.ChangesControllerDirective; inputs: {}; outputs: { "onNodesChange": "onNodesChange"; "onNodesChange.position": "onNodesChange.position"; "onNodesChange.position.single": "onNodesChange.position.single"; "onNodesChange.position.many": "onNodesChange.position.many"; "onNodesChange.size": "onNodesChange.size"; "onNodesChange.size.single": "onNodesChange.size.single"; "onNodesChange.size.many": "onNodesChange.size.many"; "onNodesChange.add": "onNodesChange.add"; "onNodesChange.add.single": "onNodesChange.add.single"; "onNodesChange.add.many": "onNodesChange.add.many"; "onNodesChange.remove": "onNodesChange.remove"; "onNodesChange.remove.single": "onNodesChange.remove.single"; "onNodesChange.remove.many": "onNodesChange.remove.many"; "onNodesChange.select": "onNodesChange.select"; "onNodesChange.select.single": "onNodesChange.select.single"; "onNodesChange.select.many": "onNodesChange.select.many"; "onEdgesChange": "onEdgesChange"; "onEdgesChange.detached": "onEdgesChange.detached"; "onEdgesChange.detached.single": "onEdgesChange.detached.single"; "onEdgesChange.detached.many": "onEdgesChange.detached.many"; "onEdgesChange.add": "onEdgesChange.add"; "onEdgesChange.add.single": "onEdgesChange.add.single"; "onEdgesChange.add.many": "onEdgesChange.add.many"; "onEdgesChange.remove": "onEdgesChange.remove"; "onEdgesChange.remove.single": "onEdgesChange.remove.single"; "onEdgesChange.remove.many": "onEdgesChange.remove.many"; "onEdgesChange.select": "onEdgesChange.select"; "onEdgesChange.select.single": "onEdgesChange.select.single"; "onEdgesChange.select.many": "onEdgesChange.select.many"; }; }]>;
173
174
  static ngAcceptInputType_connection: i2.ConnectionSettings;
174
175
  }
@@ -1,5 +1,8 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
+ /**
4
+ * Only suitable for HTML nodes
5
+ */
3
6
  export declare class NodeResizeControllerDirective implements OnInit {
4
7
  private nodeAccessor;
5
8
  private zone;
@@ -1,5 +1,5 @@
1
1
  import { TemplateRef } from '@angular/core';
2
- import { ConnectionContext, EdgeContext, GroupNodeContext, HtmlEdgeLabelContext, NodeContext } from '../interfaces/template-context.interface';
2
+ import { ConnectionContext, EdgeContext, GroupNodeContext, HtmlEdgeLabelContext, NodeContext, SvgNodeContext } from '../interfaces/template-context.interface';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class EdgeTemplateDirective {
5
5
  templateRef: TemplateRef<EdgeContext>;
@@ -25,6 +25,12 @@ export declare class NodeHtmlTemplateDirective {
25
25
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeHtmlTemplateDirective, never>;
26
26
  static ɵdir: i0.ɵɵDirectiveDeclaration<NodeHtmlTemplateDirective, "ng-template[nodeHtml]", never, {}, {}, never, never, true, never>;
27
27
  }
28
+ export declare class NodeSvgTemplateDirective {
29
+ templateRef: TemplateRef<any>;
30
+ static ngTemplateContextGuard(dir: NodeSvgTemplateDirective, ctx: unknown): ctx is SvgNodeContext;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<NodeSvgTemplateDirective, never>;
32
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NodeSvgTemplateDirective, "ng-template[nodeSvg]", never, {}, {}, never, never, true, never>;
33
+ }
28
34
  export declare class GroupNodeTemplateDirective {
29
35
  templateRef: TemplateRef<any>;
30
36
  static ngTemplateContextGuard(dir: GroupNodeTemplateDirective, ctx: unknown): ctx is GroupNodeContext;
@@ -2,8 +2,8 @@ import { Type, WritableSignal } from '@angular/core';
2
2
  import { Point } from './point.interface';
3
3
  import { CustomNodeComponent } from '../public-components/custom-node/custom-node.component';
4
4
  import { CustomDynamicNodeComponent } from '../public-components/custom-dynamic-node/custom-dynamic-node.component';
5
- export type Node<T = any> = DefaultNode | HtmlTemplateNode<T> | ComponentNode<T> | DefaultGroupNode | TemplateGroupNode<T>;
6
- export type DynamicNode<T = any> = DefaultDynamicNode | HtmlTemplateDynamicNode<T> | ComponentDynamicNode<T> | DefaultDynamicGroupNode | TemplateDynamicGroupNode<T>;
5
+ export type Node<T = any> = DefaultNode | HtmlTemplateNode<T> | SvgTemplateNode<T> | ComponentNode<T> | DefaultGroupNode | TemplateGroupNode<T>;
6
+ export type DynamicNode<T = any> = DefaultDynamicNode | HtmlTemplateDynamicNode<T> | SvgTemplateDynamicNode<T> | ComponentDynamicNode<T> | DefaultDynamicGroupNode | TemplateDynamicGroupNode<T>;
7
7
  export interface SharedNode {
8
8
  id: string;
9
9
  point: Point;
@@ -34,12 +34,24 @@ export interface HtmlTemplateNode<T = any> extends SharedNode {
34
34
  width?: number;
35
35
  height?: number;
36
36
  }
37
+ export interface SvgTemplateNode<T = any> extends SharedNode {
38
+ type: 'svg-template';
39
+ width: number;
40
+ height: number;
41
+ data?: T;
42
+ }
37
43
  export interface HtmlTemplateDynamicNode<T = any> extends SharedDynamicNode {
38
44
  type: 'html-template';
39
45
  data?: WritableSignal<T>;
40
46
  width?: WritableSignal<number>;
41
47
  height?: WritableSignal<number>;
42
48
  }
49
+ export interface SvgTemplateDynamicNode<T = any> extends SharedDynamicNode {
50
+ type: 'svg-template';
51
+ width: WritableSignal<number>;
52
+ height: WritableSignal<number>;
53
+ data?: WritableSignal<T>;
54
+ }
43
55
  export interface DefaultGroupNode extends SharedNode {
44
56
  type: 'default-group';
45
57
  width: number;
@@ -84,6 +96,8 @@ export declare function isComponentStaticNode<T>(node: Node<T>): node is Compone
84
96
  export declare function isComponentDynamicNode<T>(node: DynamicNode<T>): node is ComponentDynamicNode<T>;
85
97
  export declare function isTemplateStaticNode<T>(node: Node<T>): node is HtmlTemplateNode<T>;
86
98
  export declare function isTemplateDynamicNode<T>(node: DynamicNode<T>): node is HtmlTemplateDynamicNode<T>;
99
+ export declare function isSvgTemplateStaticNode<T>(node: Node<T>): node is SvgTemplateNode<T>;
100
+ export declare function isSvgTemplateDynamicNode<T>(node: DynamicNode<T>): node is SvgTemplateDynamicNode<T>;
87
101
  export declare function isDefaultStaticNode(node: Node): node is DefaultNode;
88
102
  export declare function isDefaultDynamicNode(node: DynamicNode): node is DefaultDynamicNode;
89
103
  export declare function isDefaultStaticGroupNode(node: Node): node is DefaultGroupNode;
@@ -18,6 +18,14 @@ export interface NodeContext {
18
18
  selected: Signal<boolean>;
19
19
  };
20
20
  }
21
+ export interface SvgNodeContext {
22
+ $implicit: {
23
+ node: any;
24
+ selected: Signal<boolean>;
25
+ width: Signal<number>;
26
+ height: Signal<number>;
27
+ };
28
+ }
21
29
  export interface GroupNodeContext {
22
30
  $implicit: {
23
31
  node: any;
@@ -1,4 +1,4 @@
1
- import { Signal, TemplateRef } from '@angular/core';
1
+ import { TemplateRef } from '@angular/core';
2
2
  import { DynamicNode, Node } from '../interfaces/node.interface';
3
3
  import { HandleModel } from './handle.model';
4
4
  import { FlowEntity } from '../interfaces/flow-entity.interface';
@@ -8,7 +8,7 @@ import { GroupNodeContext, NodeContext } from '../interfaces/template-context.in
8
8
  export declare class NodeModel<T = unknown> implements FlowEntity, Contextable<NodeContext | GroupNodeContext | {
9
9
  $implicit: object;
10
10
  }> {
11
- node: Node<T> | DynamicNode<T>;
11
+ rawNode: Node<T> | DynamicNode<T>;
12
12
  private static defaultWidth;
13
13
  private static defaultHeight;
14
14
  private static defaultColor;
@@ -22,7 +22,7 @@ export declare class NodeModel<T = unknown> implements FlowEntity, Contextable<N
22
22
  /**
23
23
  * @deprecated use width or height signals
24
24
  */
25
- size: Signal<{
25
+ size: import("@angular/core").Signal<{
26
26
  width: number;
27
27
  height: number;
28
28
  }>;
@@ -33,30 +33,30 @@ export declare class NodeModel<T = unknown> implements FlowEntity, Contextable<N
33
33
  width: number;
34
34
  height: number;
35
35
  }>;
36
- styleWidth: Signal<string>;
37
- styleHeight: Signal<string>;
38
- foWidth: Signal<number>;
39
- foHeight: Signal<number>;
36
+ styleWidth: import("@angular/core").Signal<string>;
37
+ styleHeight: import("@angular/core").Signal<string>;
38
+ foWidth: import("@angular/core").Signal<number>;
39
+ foHeight: import("@angular/core").Signal<number>;
40
40
  renderOrder: import("@angular/core").WritableSignal<number>;
41
41
  selected: import("@angular/core").WritableSignal<boolean>;
42
42
  selected$: import("rxjs").Observable<boolean>;
43
- globalPoint: Signal<{
43
+ globalPoint: import("@angular/core").Signal<{
44
44
  x: number;
45
45
  y: number;
46
46
  }>;
47
- pointTransform: Signal<string>;
47
+ pointTransform: import("@angular/core").Signal<string>;
48
48
  handles: import("@angular/core").WritableSignal<HandleModel[]>;
49
49
  handles$: import("rxjs").Observable<HandleModel[]>;
50
50
  draggable: import("@angular/core").WritableSignal<boolean>;
51
51
  dragHandlesCount: import("@angular/core").WritableSignal<number>;
52
52
  readonly magnetRadius = 20;
53
53
  isComponentType: boolean;
54
- text: Signal<string>;
54
+ text: import("@angular/core").WritableSignal<string>;
55
55
  componentTypeInputs: {
56
56
  node: Node<T> | DynamicNode<T>;
57
57
  };
58
- parent: Signal<NodeModel<unknown> | null>;
59
- children: Signal<NodeModel<unknown>[]>;
58
+ parent: import("@angular/core").Signal<NodeModel<unknown> | null>;
59
+ children: import("@angular/core").Signal<NodeModel<unknown>[]>;
60
60
  color: import("@angular/core").WritableSignal<string>;
61
61
  resizable: import("@angular/core").WritableSignal<boolean>;
62
62
  resizing: import("@angular/core").WritableSignal<boolean>;
@@ -65,10 +65,6 @@ export declare class NodeModel<T = unknown> implements FlowEntity, Contextable<N
65
65
  $implicit: {};
66
66
  };
67
67
  private parentId;
68
- constructor(node: Node<T> | DynamicNode<T>);
68
+ constructor(rawNode: Node<T> | DynamicNode<T>);
69
69
  setPoint(point: Point): void;
70
- private createTextSignal;
71
- private createInternalPointSignal;
72
- private createWidthSignal;
73
- private createHeightSignal;
74
70
  }
@@ -41,7 +41,7 @@ export declare class MiniMapComponent implements OnInit {
41
41
  protected boundsViewport: import("@angular/core").Signal<import("ngx-vflow").ViewportState>;
42
42
  protected minimapTransform: import("@angular/core").Signal<string>;
43
43
  ngOnInit(): void;
44
- protected trackNodes(idx: number, { node }: NodeModel): import("ngx-vflow").Node<unknown> | import("ngx-vflow").DynamicNode<unknown>;
44
+ protected trackNodes(idx: number, { rawNode }: NodeModel): import("ngx-vflow").Node<unknown> | import("ngx-vflow").DynamicNode<unknown>;
45
45
  static ɵfac: i0.ɵɵFactoryDeclaration<MiniMapComponent, never>;
46
46
  static ɵcmp: i0.ɵɵComponentDeclaration<MiniMapComponent, "mini-map", never, { "maskColor": { "alias": "maskColor"; "required": false; "isSignal": true; }; "strokeColor": { "alias": "strokeColor"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "scaleOnHover": { "alias": "scaleOnHover"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
47
47
  }
@@ -8,6 +8,7 @@ export declare class ResizableComponent implements OnInit, AfterViewInit {
8
8
  private rootPointer;
9
9
  private viewportService;
10
10
  private spacePointContext;
11
+ private settingsService;
11
12
  private hostRef;
12
13
  resizable: import("@angular/core").InputSignal<boolean | "" | undefined>;
13
14
  resizerColor: import("@angular/core").InputSignal<string>;
@@ -29,6 +30,7 @@ export declare class ResizableComponent implements OnInit, AfterViewInit {
29
30
  protected resize(event: PointerEvent): void;
30
31
  protected endResize(): void;
31
32
  private getDistanceToEdge;
33
+ private applyResize;
32
34
  static ɵfac: i0.ɵɵFactoryDeclaration<ResizableComponent, never>;
33
35
  static ɵcmp: i0.ɵɵComponentDeclaration<ResizableComponent, "[resizable]", never, { "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "resizerColor": { "alias": "resizerColor"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
34
36
  }
@@ -2,8 +2,8 @@ import { ToolbarModel } from '../models/toolbar.model';
2
2
  import { NodeModel } from '../models/node.model';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class OverlaysService {
5
- private toolbars;
6
- nodeToolbars: import("@angular/core").Signal<Map<NodeModel<unknown>, ToolbarModel>>;
5
+ private readonly toolbars;
6
+ nodeToolbarsMap: import("@angular/core").Signal<Map<NodeModel<unknown>, ToolbarModel[]>>;
7
7
  addToolbar(toolbar: ToolbarModel): void;
8
8
  removeToolbar(toolbar: ToolbarModel): void;
9
9
  static ɵfac: i0.ɵɵFactoryDeclaration<OverlaysService, never>;
@@ -22,6 +22,11 @@ export declare class NodeHtmlTemplateMockDirective implements AsInterface<NodeHt
22
22
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeHtmlTemplateMockDirective, never>;
23
23
  static ɵdir: i0.ɵɵDirectiveDeclaration<NodeHtmlTemplateMockDirective, "ng-template[nodeHtml]", never, {}, {}, never, never, true, never>;
24
24
  }
25
+ export declare class NodeSvgTemplateMockDirective implements AsInterface<NodeSvgTemplateMockDirective> {
26
+ templateRef: TemplateRef<any>;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<NodeSvgTemplateMockDirective, never>;
28
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NodeSvgTemplateMockDirective, "ng-template[nodeSvg]", never, {}, {}, never, never, true, never>;
29
+ }
25
30
  export declare class GroupNodeTemplateMockDirective implements AsInterface<GroupNodeTemplateDirective> {
26
31
  templateRef: TemplateRef<any>;
27
32
  static ɵfac: i0.ɵɵFactoryDeclaration<GroupNodeTemplateMockDirective, never>;
@@ -0,0 +1 @@
1
+ export declare function align(num: number, constant: number): number;
@@ -1,8 +1,8 @@
1
- import { NodeModel } from '../models/node.model';
2
- import { DynamicNode, Node } from '../interfaces/node.interface';
3
- import { EdgeModel } from '../models/edge.model';
4
- import { Edge } from '../interfaces/edge.interface';
5
- export declare class ReferenceKeeper {
1
+ import { NodeModel } from '../../models/node.model';
2
+ import { DynamicNode, Node } from '../../interfaces/node.interface';
3
+ import { EdgeModel } from '../../models/edge.model';
4
+ import { Edge } from '../../interfaces/edge.interface';
5
+ export declare class ReferenceIdentityChecker {
6
6
  /**
7
7
  * Create new models for new node references and keep old models for old node references
8
8
  */
@@ -0,0 +1,2 @@
1
+ import { DynamicNode, Node } from '../interfaces/node.interface';
2
+ export declare function toUnifiedNode<T>(node: Node<T> | DynamicNode<T>): DynamicNode<T>;
@@ -1,11 +1,11 @@
1
1
  import { VflowComponent } from './components/vflow/vflow.component';
2
2
  import { DragHandleDirective } from './directives/drag-handle.directive';
3
3
  import { SelectableDirective } from './directives/selectable.directive';
4
- import { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, HandleTemplateDirective, NodeHtmlTemplateDirective } from './directives/template.directive';
4
+ import { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, HandleTemplateDirective, NodeHtmlTemplateDirective, NodeSvgTemplateDirective } from './directives/template.directive';
5
5
  import { ConnectionControllerDirective } from './directives/connection-controller.directive';
6
6
  import { MiniMapComponent } from './public-components/minimap/minimap.component';
7
7
  import { NodeToolbarComponent } from './public-components/node-toolbar/node-toolbar.component';
8
8
  import { ResizableComponent } from './public-components/resizable/resizable.component';
9
9
  import { HandleComponent } from './public-components/handle/handle.component';
10
10
  import { CustomTemplateEdgeComponent } from './public-components/custom-template-edge/custom-template-edge.component';
11
- export declare const Vflow: readonly [typeof VflowComponent, typeof HandleComponent, typeof ResizableComponent, typeof SelectableDirective, typeof MiniMapComponent, typeof NodeToolbarComponent, typeof CustomTemplateEdgeComponent, typeof DragHandleDirective, typeof ConnectionControllerDirective, typeof NodeHtmlTemplateDirective, typeof GroupNodeTemplateDirective, typeof EdgeLabelHtmlTemplateDirective, typeof EdgeTemplateDirective, typeof ConnectionTemplateDirective, typeof HandleTemplateDirective];
11
+ export declare const Vflow: readonly [typeof VflowComponent, typeof HandleComponent, typeof ResizableComponent, typeof SelectableDirective, typeof MiniMapComponent, typeof NodeToolbarComponent, typeof CustomTemplateEdgeComponent, typeof DragHandleDirective, typeof ConnectionControllerDirective, typeof NodeHtmlTemplateDirective, typeof NodeSvgTemplateDirective, typeof GroupNodeTemplateDirective, typeof EdgeLabelHtmlTemplateDirective, typeof EdgeTemplateDirective, typeof ConnectionTemplateDirective, typeof HandleTemplateDirective];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-vflow",
3
- "version": "1.6.1",
3
+ "version": "1.7.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://www.ngx-vflow.org/",
6
6
  "author": "Artem Mangilev",
@@ -1,31 +0,0 @@
1
- import { NodeModel } from '../models/node.model';
2
- import { EdgeModel } from '../models/edge.model';
3
- export class ReferenceKeeper {
4
- /**
5
- * Create new models for new node references and keep old models for old node references
6
- */
7
- static nodes(newNodes, oldNodeModels) {
8
- const oldNodesMap = new Map();
9
- oldNodeModels.forEach((model) => oldNodesMap.set(model.node, model));
10
- return newNodes.map((newNode) => {
11
- if (oldNodesMap.has(newNode))
12
- return oldNodesMap.get(newNode);
13
- else
14
- return new NodeModel(newNode);
15
- });
16
- }
17
- /**
18
- * Create new models for new edge references and keep old models for old edge references
19
- */
20
- static edges(newEdges, oldEdgeModels) {
21
- const oldEdgesMap = new Map();
22
- oldEdgeModels.forEach((model) => oldEdgesMap.set(model.edge, model));
23
- return newEdges.map((newEdge) => {
24
- if (oldEdgesMap.has(newEdge))
25
- return oldEdgesMap.get(newEdge);
26
- else
27
- return new EdgeModel(newEdge);
28
- });
29
- }
30
- }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLWtlZXBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy91dGlscy9yZWZlcmVuY2Uta2VlcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHakQsTUFBTSxPQUFPLGVBQWU7SUFDMUI7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQWdDLEVBQUUsYUFBMEI7UUFDOUUsTUFBTSxXQUFXLEdBQXVDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFckUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLENBQUM7O2dCQUMxRCxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFnQixFQUFFLGFBQTBCO1FBQzlELE1BQU0sV0FBVyxHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BELGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlCLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBRSxDQUFDOztnQkFDMUQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGVNb2RlbCB9IGZyb20gJy4uL21vZGVscy9ub2RlLm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNOb2RlLCBOb2RlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ub2RlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFZGdlTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvZWRnZS5tb2RlbCc7XG5pbXBvcnQgeyBFZGdlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lZGdlLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBSZWZlcmVuY2VLZWVwZXIge1xuICAvKipcbiAgICogQ3JlYXRlIG5ldyBtb2RlbHMgZm9yIG5ldyBub2RlIHJlZmVyZW5jZXMgYW5kIGtlZXAgb2xkIG1vZGVscyBmb3Igb2xkIG5vZGUgcmVmZXJlbmNlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub2RlcyhuZXdOb2RlczogTm9kZVtdIHwgRHluYW1pY05vZGVbXSwgb2xkTm9kZU1vZGVsczogTm9kZU1vZGVsW10pIHtcbiAgICBjb25zdCBvbGROb2Rlc01hcDogTWFwPE5vZGUgfCBEeW5hbWljTm9kZSwgTm9kZU1vZGVsPiA9IG5ldyBNYXAoKTtcbiAgICBvbGROb2RlTW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiBvbGROb2Rlc01hcC5zZXQobW9kZWwubm9kZSwgbW9kZWwpKTtcblxuICAgIHJldHVybiBuZXdOb2Rlcy5tYXAoKG5ld05vZGUpID0+IHtcbiAgICAgIGlmIChvbGROb2Rlc01hcC5oYXMobmV3Tm9kZSkpIHJldHVybiBvbGROb2Rlc01hcC5nZXQobmV3Tm9kZSkhO1xuICAgICAgZWxzZSByZXR1cm4gbmV3IE5vZGVNb2RlbChuZXdOb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbmV3IG1vZGVscyBmb3IgbmV3IGVkZ2UgcmVmZXJlbmNlcyBhbmQga2VlcCBvbGQgbW9kZWxzIGZvciBvbGQgZWRnZSByZWZlcmVuY2VzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVkZ2VzKG5ld0VkZ2VzOiBFZGdlW10sIG9sZEVkZ2VNb2RlbHM6IEVkZ2VNb2RlbFtdKTogRWRnZU1vZGVsW10ge1xuICAgIGNvbnN0IG9sZEVkZ2VzTWFwOiBNYXA8RWRnZSwgRWRnZU1vZGVsPiA9IG5ldyBNYXAoKTtcbiAgICBvbGRFZGdlTW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiBvbGRFZGdlc01hcC5zZXQobW9kZWwuZWRnZSwgbW9kZWwpKTtcblxuICAgIHJldHVybiBuZXdFZGdlcy5tYXAoKG5ld0VkZ2UpID0+IHtcbiAgICAgIGlmIChvbGRFZGdlc01hcC5oYXMobmV3RWRnZSkpIHJldHVybiBvbGRFZGdlc01hcC5nZXQobmV3RWRnZSkhO1xuICAgICAgZWxzZSByZXR1cm4gbmV3IEVkZ2VNb2RlbChuZXdFZGdlKTtcbiAgICB9KTtcbiAgfVxufVxuIl19