ngx-vflow 0.9.1 → 0.11.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 (39) hide show
  1. package/esm2022/lib/vflow/components/custom-node-base/custom-node-base.component.mjs +48 -0
  2. package/esm2022/lib/vflow/components/node/node.component.mjs +16 -13
  3. package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +29 -6
  4. package/esm2022/lib/vflow/directives/template.directive.mjs +12 -1
  5. package/esm2022/lib/vflow/interfaces/component-node-event.interface.mjs +1 -1
  6. package/esm2022/lib/vflow/interfaces/node.interface.mjs +39 -2
  7. package/esm2022/lib/vflow/interfaces/optimization.interface.mjs +2 -0
  8. package/esm2022/lib/vflow/models/handle.model.mjs +22 -9
  9. package/esm2022/lib/vflow/models/node.model.mjs +103 -17
  10. package/esm2022/lib/vflow/public-components/custom-dynamic-node.component.mjs +19 -0
  11. package/esm2022/lib/vflow/public-components/custom-node.component.mjs +9 -41
  12. package/esm2022/lib/vflow/services/draggable.service.mjs +25 -10
  13. package/esm2022/lib/vflow/services/handle.service.mjs +7 -2
  14. package/esm2022/lib/vflow/services/node-rendering.service.mjs +12 -3
  15. package/esm2022/lib/vflow/utils/reference-keeper.mjs +1 -1
  16. package/esm2022/lib/vflow/vflow.module.mjs +5 -2
  17. package/esm2022/public-api.mjs +3 -1
  18. package/fesm2022/ngx-vflow.mjs +301 -71
  19. package/fesm2022/ngx-vflow.mjs.map +1 -1
  20. package/lib/vflow/components/custom-node-base/custom-node-base.component.d.ts +21 -0
  21. package/lib/vflow/components/node/node.component.d.ts +3 -2
  22. package/lib/vflow/components/vflow/vflow.component.d.ts +14 -9
  23. package/lib/vflow/directives/template.directive.d.ts +5 -0
  24. package/lib/vflow/interfaces/component-node-event.interface.d.ts +2 -1
  25. package/lib/vflow/interfaces/node.interface.d.ts +64 -5
  26. package/lib/vflow/interfaces/optimization.interface.d.ts +3 -0
  27. package/lib/vflow/models/edge.model.d.ts +17 -1
  28. package/lib/vflow/models/handle.model.d.ts +2 -1
  29. package/lib/vflow/models/node.model.d.ts +31 -22
  30. package/lib/vflow/public-components/custom-dynamic-node.component.d.ts +13 -0
  31. package/lib/vflow/public-components/custom-node.component.d.ts +6 -13
  32. package/lib/vflow/services/draggable.service.d.ts +9 -3
  33. package/lib/vflow/services/handle.service.d.ts +1 -1
  34. package/lib/vflow/services/node-changes.service.d.ts +1 -4
  35. package/lib/vflow/services/node-rendering.service.d.ts +1 -0
  36. package/lib/vflow/utils/reference-keeper.d.ts +2 -2
  37. package/lib/vflow/vflow.module.d.ts +1 -1
  38. package/package.json +1 -1
  39. package/public-api.d.ts +2 -0
@@ -0,0 +1,21 @@
1
+ import { DestroyRef, OnInit } from "@angular/core";
2
+ import { ComponentDynamicNode, ComponentNode } from "../../interfaces/node.interface";
3
+ import * as i0 from "@angular/core";
4
+ export declare abstract class CustomNodeBaseComponent<T = unknown> implements OnInit {
5
+ private eventBus;
6
+ protected destroyRef: DestroyRef;
7
+ /**
8
+ * Reference to node bound to this component
9
+ */
10
+ protected node: ComponentNode | ComponentDynamicNode;
11
+ set _selected(value: boolean);
12
+ /**
13
+ * Signal with selected state of node
14
+ */
15
+ selected: import("@angular/core").WritableSignal<boolean>;
16
+ data: import("@angular/core").WritableSignal<T | undefined>;
17
+ ngOnInit(): void;
18
+ private trackEvents;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<CustomNodeBaseComponent<any>, never>;
20
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CustomNodeBaseComponent<any>, never, never, { "_selected": { "alias": "_selected"; "required": false; }; }, {}, never, never, false, never>;
21
+ }
@@ -15,7 +15,8 @@ export declare class NodeComponent implements OnInit, AfterViewInit, OnDestroy,
15
15
  private hostRef;
16
16
  private connectionController;
17
17
  nodeModel: NodeModel;
18
- nodeHtmlTemplate?: TemplateRef<any>;
18
+ nodeTemplate?: TemplateRef<any>;
19
+ groupNodeTemplate?: TemplateRef<any>;
19
20
  nodeContentRef: ElementRef<SVGGraphicsElement>;
20
21
  htmlWrapperRef: ElementRef<HTMLDivElement>;
21
22
  protected showMagnet: import("@angular/core").Signal<boolean>;
@@ -31,5 +32,5 @@ export declare class NodeComponent implements OnInit, AfterViewInit, OnDestroy,
31
32
  protected pullNode(): void;
32
33
  protected selectNode(): void;
33
34
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeComponent, never>;
34
- static ɵcmp: i0.ɵɵComponentDeclaration<NodeComponent, "g[node]", never, { "nodeModel": { "alias": "nodeModel"; "required": false; }; "nodeHtmlTemplate": { "alias": "nodeHtmlTemplate"; "required": false; }; }, {}, never, never, false, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<NodeComponent, "g[node]", never, { "nodeModel": { "alias": "nodeModel"; "required": false; }; "nodeTemplate": { "alias": "nodeTemplate"; "required": false; }; "groupNodeTemplate": { "alias": "groupNodeTemplate"; "required": false; }; }, {}, never, never, false, never>;
35
36
  }
@@ -1,10 +1,10 @@
1
- import { Signal } from '@angular/core';
2
- import { Node } from '../../interfaces/node.interface';
1
+ import { OnInit, Signal } from '@angular/core';
2
+ import { DynamicNode, Node } from '../../interfaces/node.interface';
3
3
  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, NodeHtmlTemplateDirective } from '../../directives/template.directive';
7
+ import { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, NodeHtmlTemplateDirective } from '../../directives/template.directive';
8
8
  import { HandlePositions } from '../../interfaces/handle-positions.interface';
9
9
  import { Point } from '../../interfaces/point.interface';
10
10
  import { ViewportState } from '../../interfaces/viewport.interface';
@@ -14,11 +14,12 @@ import { EdgeChange } from '../../types/edge-change.type';
14
14
  import { Background } from '../../types/background.type';
15
15
  import { SpacePointContextDirective } from '../../directives/space-point-context.directive';
16
16
  import { FitViewOptions } from '../../interfaces/fit-view-options.interface';
17
+ import { Optimization } from '../../interfaces/optimization.interface';
17
18
  import * as i0 from "@angular/core";
18
19
  import * as i1 from "../../directives/connection-controller.directive";
19
20
  import * as i2 from "../../directives/changes-controller.directive";
20
21
  import * as i3 from "../../interfaces/connection-settings.interface";
21
- export declare class VflowComponent {
22
+ export declare class VflowComponent implements OnInit {
22
23
  private viewportService;
23
24
  private flowEntitiesService;
24
25
  private nodesChangeService;
@@ -59,6 +60,7 @@ export declare class VflowComponent {
59
60
  * Background for flow
60
61
  */
61
62
  background: Background | string;
63
+ optimization: Optimization;
62
64
  /**
63
65
  * Global rule if you can or can't select entities
64
66
  */
@@ -73,7 +75,7 @@ export declare class VflowComponent {
73
75
  /**
74
76
  * Nodes to render
75
77
  */
76
- set nodes(newNodes: Node[]);
78
+ set nodes(newNodes: Node[] | DynamicNode[]);
77
79
  protected nodeModels: Signal<NodeModel<unknown>[]>;
78
80
  /**
79
81
  * Edges to render
@@ -86,7 +88,8 @@ export declare class VflowComponent {
86
88
  * @experimental
87
89
  */
88
90
  onComponentNodeEvent: any;
89
- protected nodeHtmlDirective?: NodeHtmlTemplateDirective;
91
+ protected nodeTemplateDirective?: NodeHtmlTemplateDirective;
92
+ protected groupNodeTemplateDirective?: GroupNodeTemplateDirective;
90
93
  protected edgeTemplateDirective?: EdgeTemplateDirective;
91
94
  protected edgeLabelHtmlDirective?: EdgeLabelHtmlTemplateDirective;
92
95
  protected connectionTemplateDirective?: ConnectionTemplateDirective;
@@ -117,6 +120,7 @@ export declare class VflowComponent {
117
120
  */
118
121
  readonly edgesChange$: import("rxjs").Observable<EdgeChange[]>;
119
122
  protected markers: Signal<Map<number, import("ngx-vflow").Marker>>;
123
+ ngOnInit(): void;
120
124
  /**
121
125
  * Change viewport to specified state
122
126
  *
@@ -141,7 +145,7 @@ export declare class VflowComponent {
141
145
  *
142
146
  * @param id node id
143
147
  */
144
- getNode<T = unknown>(id: string): Node<T> | undefined;
148
+ getNode<T = unknown>(id: string): Node<T> | DynamicNode<T> | undefined;
145
149
  /**
146
150
  * Sync method to get detached edges
147
151
  */
@@ -150,9 +154,10 @@ export declare class VflowComponent {
150
154
  * Convert point received from document to point on the flow
151
155
  */
152
156
  documentPointToFlowPoint(point: Point): Point;
153
- protected trackNodes(idx: number, { node }: NodeModel): Node<unknown>;
157
+ protected trackNodes(idx: number, { node }: NodeModel): Node<unknown> | DynamicNode<unknown>;
154
158
  protected trackEdges(idx: number, { edge }: EdgeModel): Edge<unknown>;
159
+ private setInitialNodesOrder;
155
160
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowComponent, never>;
156
- static ɵcmp: i0.ɵɵComponentDeclaration<VflowComponent, "vflow", never, { "view": { "alias": "view"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "handlePositions": { "alias": "handlePositions"; "required": false; }; "background": { "alias": "background"; "required": false; }; "entitiesSelectable": { "alias": "entitiesSelectable"; "required": false; }; "connection": { "alias": "connection"; "required": false; }; "nodes": { "alias": "nodes"; "required": true; }; "edges": { "alias": "edges"; "required": false; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeHtmlDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], never, false, [{ directive: typeof i1.ConnectionControllerDirective; inputs: {}; outputs: { "onConnect": "onConnect"; }; }, { directive: typeof i2.ChangesControllerDirective; inputs: {}; outputs: { "onNodesChange": "onNodesChange"; "onNodesChange.position": "onNodesChange.position"; "onNodesChange.position.single": "onNodesChange.position.single"; "onNodesChange.position.many": "onNodesChange.position.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"; }; }]>;
161
+ static ɵcmp: i0.ɵɵComponentDeclaration<VflowComponent, "vflow", never, { "view": { "alias": "view"; "required": false; }; "minZoom": { "alias": "minZoom"; "required": false; }; "maxZoom": { "alias": "maxZoom"; "required": false; }; "handlePositions": { "alias": "handlePositions"; "required": false; }; "background": { "alias": "background"; "required": false; }; "optimization": { "alias": "optimization"; "required": false; }; "entitiesSelectable": { "alias": "entitiesSelectable"; "required": false; }; "connection": { "alias": "connection"; "required": false; }; "nodes": { "alias": "nodes"; "required": true; }; "edges": { "alias": "edges"; "required": false; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], never, false, [{ directive: typeof i1.ConnectionControllerDirective; inputs: {}; outputs: { "onConnect": "onConnect"; }; }, { directive: typeof i2.ChangesControllerDirective; inputs: {}; outputs: { "onNodesChange": "onNodesChange"; "onNodesChange.position": "onNodesChange.position"; "onNodesChange.position.single": "onNodesChange.position.single"; "onNodesChange.position.many": "onNodesChange.position.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"; }; }]>;
157
162
  static ngAcceptInputType_connection: i3.ConnectionSettings;
158
163
  }
@@ -21,6 +21,11 @@ export declare class NodeHtmlTemplateDirective {
21
21
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeHtmlTemplateDirective, never>;
22
22
  static ɵdir: i0.ɵɵDirectiveDeclaration<NodeHtmlTemplateDirective, "ng-template[nodeHtml]", never, {}, {}, never, never, false, never>;
23
23
  }
24
+ export declare class GroupNodeTemplateDirective {
25
+ templateRef: TemplateRef<any>;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<GroupNodeTemplateDirective, never>;
27
+ static ɵdir: i0.ɵɵDirectiveDeclaration<GroupNodeTemplateDirective, "ng-template[groupNode]", never, {}, {}, never, never, false, never>;
28
+ }
24
29
  export declare class HandleTemplateDirective {
25
30
  templateRef: TemplateRef<any>;
26
31
  static ɵfac: i0.ɵɵFactoryDeclaration<HandleTemplateDirective, never>;
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter } from "@angular/core";
2
2
  import { CustomNodeComponent } from "../public-components/custom-node.component";
3
+ import { CustomDynamicNodeComponent } from "../public-components/custom-dynamic-node.component";
3
4
  type EventInfo<T> = T extends EventEmitter<infer U> ? U : never;
4
5
  type EventKeys<T> = {
5
6
  [K in keyof T]: T[K] extends EventEmitter<any> ? K : never;
@@ -19,7 +20,7 @@ type EventsFromComponent<T> = EventShape<T, EventKeys<T>>;
19
20
  *
20
21
  * @experimental
21
22
  */
22
- export type ComponentNodeEvent<T extends CustomNodeComponent[]> = {
23
+ export type ComponentNodeEvent<T extends (CustomNodeComponent | CustomDynamicNodeComponent)[]> = {
23
24
  nodeId: string;
24
25
  } & {
25
26
  [I in keyof T]: EventsFromComponent<T[I]>;
@@ -1,23 +1,82 @@
1
- import { Type } from "@angular/core";
1
+ import { Type, WritableSignal } from "@angular/core";
2
2
  import { Point } from "./point.interface";
3
3
  import { CustomNodeComponent } from "../public-components/custom-node.component";
4
- export type Node<T = unknown> = SharedNode & (DefaultNode | HtmlTemplateNode<T> | ComponentNode<T>);
4
+ import { CustomDynamicNodeComponent } from "../public-components/custom-dynamic-node.component";
5
+ export type Node<T = unknown> = DefaultNode | HtmlTemplateNode<T> | ComponentNode<T> | DefaultGroupNode | TemplateGroupNode<T>;
6
+ export type DynamicNode<T = unknown> = DefaultDynamicNode | HtmlTemplateDynamicNode<T> | ComponentDynamicNode<T> | DefaultDynamicGroupNode | TemplateDynamicGroupNode<T>;
5
7
  export interface SharedNode {
6
8
  id: string;
7
9
  point: Point;
8
10
  draggable?: boolean;
11
+ parentId?: string | null;
9
12
  }
10
- export interface DefaultNode {
13
+ export interface SharedDynamicNode {
14
+ id: string;
15
+ point: WritableSignal<Point>;
16
+ draggable?: WritableSignal<boolean>;
17
+ parentId?: WritableSignal<string | null>;
18
+ }
19
+ export interface DefaultNode extends SharedNode {
11
20
  type: 'default';
12
21
  text?: string;
13
22
  width?: number;
14
23
  height?: number;
15
24
  }
16
- export interface HtmlTemplateNode<T = unknown> {
25
+ export interface DefaultDynamicNode extends SharedDynamicNode {
26
+ type: 'default';
27
+ text?: WritableSignal<string>;
28
+ width?: WritableSignal<number>;
29
+ height?: WritableSignal<number>;
30
+ }
31
+ export interface HtmlTemplateNode<T = unknown> extends SharedNode {
32
+ type: 'html-template';
33
+ data?: T;
34
+ }
35
+ export interface HtmlTemplateDynamicNode<T = unknown> extends SharedDynamicNode {
17
36
  type: 'html-template';
37
+ data?: WritableSignal<T>;
38
+ }
39
+ export interface DefaultGroupNode extends SharedNode {
40
+ type: 'default-group';
41
+ width: number;
42
+ height: number;
43
+ color?: string;
44
+ }
45
+ export interface DefaultDynamicGroupNode extends SharedDynamicNode {
46
+ type: 'default-group';
47
+ width: WritableSignal<number>;
48
+ height: WritableSignal<number>;
49
+ color?: WritableSignal<string>;
50
+ }
51
+ export interface TemplateGroupNode<T> extends SharedNode {
52
+ type: 'template-group';
53
+ width: number;
54
+ height: number;
18
55
  data?: T;
19
56
  }
20
- export interface ComponentNode<T = unknown> {
57
+ export interface TemplateDynamicGroupNode<T> extends SharedDynamicNode {
58
+ type: 'template-group';
59
+ width: WritableSignal<number>;
60
+ height: WritableSignal<number>;
61
+ data?: WritableSignal<T>;
62
+ }
63
+ export interface ComponentNode<T = unknown> extends SharedNode {
21
64
  type: Type<CustomNodeComponent<T>>;
22
65
  data?: T;
23
66
  }
67
+ export interface ComponentDynamicNode<T = unknown> extends SharedDynamicNode {
68
+ type: Type<CustomDynamicNodeComponent<T>>;
69
+ data?: WritableSignal<T>;
70
+ }
71
+ export declare function isStaticNode<T>(node: Node | DynamicNode): node is Node<T>;
72
+ export declare function isDynamicNode<T>(node: Node | DynamicNode): node is DynamicNode<T>;
73
+ export declare function isComponentStaticNode<T>(node: Node): node is ComponentNode<T>;
74
+ export declare function isComponentDynamicNode<T>(node: DynamicNode): node is ComponentDynamicNode<T>;
75
+ export declare function isTemplateStaticNode<T>(node: Node): node is HtmlTemplateNode<T>;
76
+ export declare function isTemplateDynamicNode<T>(node: DynamicNode): node is HtmlTemplateDynamicNode<T>;
77
+ export declare function isDefaultStaticNode(node: Node): node is DefaultNode;
78
+ export declare function isDefaultDynamicNode(node: DynamicNode): node is DefaultDynamicNode;
79
+ export declare function isDefaultStaticGroupNode(node: Node): node is DefaultGroupNode;
80
+ export declare function isDefaultDynamicGroupNode(node: DynamicNode): node is DefaultDynamicGroupNode;
81
+ export declare function isTemplateStaticGroupNode<T>(node: Node): node is TemplateGroupNode<T>;
82
+ export declare function isTemplateDynamicGroupNode<T>(node: DynamicNode): node is TemplateDynamicGroupNode<T>;
@@ -0,0 +1,3 @@
1
+ export interface Optimization {
2
+ computeLayersOnInit: boolean;
3
+ }
@@ -14,7 +14,23 @@ export declare class EdgeModel implements FlowEntity {
14
14
  selected$: import("rxjs").Observable<boolean>;
15
15
  detached: import("@angular/core").Signal<boolean>;
16
16
  detached$: import("rxjs").Observable<boolean>;
17
- path: import("@angular/core").Signal<import("../interfaces/path-data.interface").PathData>;
17
+ path: import("@angular/core").Signal<{
18
+ path: string;
19
+ points: {
20
+ start: {
21
+ x: number;
22
+ y: number;
23
+ };
24
+ center: {
25
+ x: number;
26
+ y: number;
27
+ };
28
+ end: {
29
+ x: number;
30
+ y: number;
31
+ };
32
+ };
33
+ }>;
18
34
  edgeLabels: {
19
35
  [position in EdgeLabelPosition]?: EdgeLabelModel;
20
36
  };
@@ -41,7 +41,7 @@ export declare class HandleModel {
41
41
  x: number;
42
42
  y: number;
43
43
  }>;
44
- parentReference: HTMLElement;
44
+ parentReference: Element;
45
45
  template: import("@angular/core").TemplateRef<any> | undefined;
46
46
  templateContext: {
47
47
  $implicit: {
@@ -54,4 +54,5 @@ export declare class HandleModel {
54
54
  };
55
55
  constructor(rawHandle: NodeHandle, parentNode: NodeModel);
56
56
  updateParent(): void;
57
+ private getParentSize;
57
58
  }
@@ -1,24 +1,19 @@
1
- import { Node } from '../interfaces/node.interface';
1
+ import { Signal } from '@angular/core';
2
+ import { DynamicNode, Node } from '../interfaces/node.interface';
2
3
  import { HandleModel } from './handle.model';
3
4
  import { FlowEntity } from '../interfaces/flow-entity.interface';
4
5
  import { Point } from '../interfaces/point.interface';
5
6
  export declare class NodeModel<T = unknown> implements FlowEntity {
6
- node: Node<T>;
7
- static defaultTypeSize: {
8
- width: number;
9
- height: number;
10
- };
7
+ node: Node<T> | DynamicNode<T>;
8
+ private static defaultWidth;
9
+ private static defaultHeight;
10
+ private static defaultColor;
11
11
  private flowSettingsService;
12
- private internalPoint$;
12
+ private entitiesService;
13
+ private internalPoint;
13
14
  private throttledPoint$;
14
- point: import("@angular/core").Signal<{
15
- x: number;
16
- y: number;
17
- }>;
18
- point$: import("rxjs").Observable<{
19
- x: number;
20
- y: number;
21
- }>;
15
+ point: Signal<Point>;
16
+ point$: import("rxjs").Observable<Point>;
22
17
  size: import("@angular/core").WritableSignal<{
23
18
  width: number;
24
19
  height: number;
@@ -26,18 +21,32 @@ export declare class NodeModel<T = unknown> implements FlowEntity {
26
21
  renderOrder: import("@angular/core").WritableSignal<number>;
27
22
  selected: import("@angular/core").WritableSignal<boolean>;
28
23
  selected$: import("rxjs").Observable<boolean>;
29
- pointTransform: import("@angular/core").Signal<string>;
30
- sourcePosition: import("@angular/core").Signal<import("ngx-vflow").Position>;
31
- targetPosition: import("@angular/core").Signal<import("ngx-vflow").Position>;
24
+ globalPoint: Signal<{
25
+ x: number;
26
+ y: number;
27
+ }>;
28
+ pointTransform: Signal<string>;
29
+ sourcePosition: Signal<import("ngx-vflow").Position>;
30
+ targetPosition: Signal<import("ngx-vflow").Position>;
32
31
  handles: import("@angular/core").WritableSignal<HandleModel[]>;
33
32
  handles$: import("rxjs").Observable<HandleModel[]>;
34
- draggable: boolean;
33
+ draggable: import("@angular/core").WritableSignal<boolean>;
35
34
  readonly magnetRadius = 20;
36
35
  isComponentType: boolean;
37
- componentTypeInputs: import("@angular/core").Signal<{
38
- node: Node<T>;
36
+ text: Signal<string>;
37
+ componentTypeInputs: Signal<{
38
+ node: Node<T> | DynamicNode<T>;
39
39
  _selected: boolean;
40
40
  }>;
41
- constructor(node: Node<T>);
41
+ parent: Signal<NodeModel<unknown> | null>;
42
+ color: import("@angular/core").WritableSignal<string>;
43
+ private parentId;
44
+ constructor(node: Node<T> | DynamicNode<T>);
42
45
  setPoint(point: Point): void;
46
+ /**
47
+ * TODO find the way to implement this better
48
+ */
49
+ linkDefaultNodeSizeWithModelSize(): void;
50
+ private createTextSignal;
51
+ private createInternalPointSignal;
43
52
  }
@@ -0,0 +1,13 @@
1
+ import { OnInit } from "@angular/core";
2
+ import { ComponentDynamicNode } from '../interfaces/node.interface';
3
+ import { CustomNodeBaseComponent } from "../components/custom-node-base/custom-node-base.component";
4
+ import * as i0 from "@angular/core";
5
+ export declare abstract class CustomDynamicNodeComponent<T = unknown> extends CustomNodeBaseComponent<T> implements OnInit {
6
+ /**
7
+ * Reference to node bound to this component
8
+ */
9
+ node: ComponentDynamicNode<T>;
10
+ ngOnInit(): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<CustomDynamicNodeComponent<any>, never>;
12
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CustomDynamicNodeComponent<any>, never, never, { "node": { "alias": "node"; "required": false; }; }, {}, never, never, false, never>;
13
+ }
@@ -1,20 +1,13 @@
1
- import { DestroyRef, OnInit } from "@angular/core";
2
- import { ComponentNode, SharedNode } from '../interfaces/node.interface';
1
+ import { OnInit } from "@angular/core";
2
+ import { ComponentNode } from '../interfaces/node.interface';
3
+ import { CustomNodeBaseComponent } from "../components/custom-node-base/custom-node-base.component";
3
4
  import * as i0 from "@angular/core";
4
- export declare abstract class CustomNodeComponent<T = unknown> implements OnInit {
5
- private eventBus;
6
- protected destroyRef: DestroyRef;
5
+ export declare abstract class CustomNodeComponent<T = unknown> extends CustomNodeBaseComponent<T> implements OnInit {
7
6
  /**
8
7
  * Reference to node bound to this component
9
8
  */
10
- node: SharedNode & ComponentNode<T>;
11
- set _selected(value: boolean);
12
- /**
13
- * Signal with selected state of node
14
- */
15
- selected: import("@angular/core").WritableSignal<boolean>;
9
+ node: ComponentNode<T>;
16
10
  ngOnInit(): void;
17
- private trackEvents;
18
11
  static ɵfac: i0.ɵɵFactoryDeclaration<CustomNodeComponent<any>, never>;
19
- static ɵdir: i0.ɵɵDirectiveDeclaration<CustomNodeComponent<any>, never, never, { "node": { "alias": "node"; "required": false; }; "_selected": { "alias": "_selected"; "required": false; }; }, {}, never, never, false, never>;
12
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CustomNodeComponent<any>, never, never, { "node": { "alias": "node"; "required": false; }; }, {}, never, never, false, never>;
20
13
  }
@@ -2,13 +2,19 @@ import { NodeModel } from '../models/node.model';
2
2
  import * as i0 from "@angular/core";
3
3
  export declare class DraggableService {
4
4
  /**
5
- * Enable or disable draggable behavior for element.
6
- * model contains draggable flag which declares if draggable should be enabled or not
5
+ * Enable draggable behavior for element.
7
6
  *
8
7
  * @param element target element for toggling draggable
9
8
  * @param model model with data for this element
10
9
  */
11
- toggleDraggable(element: Element, model: NodeModel): void;
10
+ enable(element: Element, model: NodeModel): void;
11
+ /**
12
+ * Disable draggable behavior for element.
13
+ *
14
+ * @param element target element for toggling draggable
15
+ * @param model model with data for this element
16
+ */
17
+ disable(element: Element): void;
12
18
  /**
13
19
  * TODO: not shure if this work, need to check
14
20
  *
@@ -8,7 +8,7 @@ export interface NodeHandle {
8
8
  position: Position;
9
9
  type: HandleType;
10
10
  id?: string;
11
- parentReference?: HTMLElement;
11
+ parentReference?: Element;
12
12
  template?: TemplateRef<any>;
13
13
  }
14
14
  export declare class HandleService {
@@ -7,10 +7,7 @@ export declare class NodesChangeService {
7
7
  protected nodesPositionChange$: Observable<{
8
8
  type: "position";
9
9
  id: string;
10
- point: {
11
- x: number;
12
- y: number;
13
- };
10
+ point: import("ngx-vflow").Point;
14
11
  }[]>;
15
12
  protected nodeAddChange$: Observable<{
16
13
  type: "add";
@@ -3,6 +3,7 @@ import * as i0 from "@angular/core";
3
3
  export declare class NodeRenderingService {
4
4
  private flowEntitiesService;
5
5
  readonly nodes: import("@angular/core").Signal<NodeModel<unknown>[]>;
6
+ private maxOrder;
6
7
  pullNode(node: NodeModel): void;
7
8
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeRenderingService, never>;
8
9
  static ɵprov: i0.ɵɵInjectableDeclaration<NodeRenderingService>;
@@ -1,12 +1,12 @@
1
1
  import { NodeModel } from "../models/node.model";
2
- import { Node } from '../interfaces/node.interface';
2
+ import { DynamicNode, Node } from '../interfaces/node.interface';
3
3
  import { EdgeModel } from "../models/edge.model";
4
4
  import { Edge } from "../interfaces/edge.interface";
5
5
  export declare class ReferenceKeeper {
6
6
  /**
7
7
  * Create new models for new node references and keep old models for old node references
8
8
  */
9
- static nodes(newNodes: Node[], oldNodeModels: NodeModel[]): NodeModel<unknown>[];
9
+ static nodes(newNodes: Node[] | DynamicNode[], oldNodeModels: NodeModel[]): NodeModel<unknown>[];
10
10
  /**
11
11
  * Create new models for new edge references and keep old models for old edge references
12
12
  */
@@ -20,6 +20,6 @@ import * as i18 from "./directives/template.directive";
20
20
  import * as i19 from "@angular/common";
21
21
  export declare class VflowModule {
22
22
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowModule, never>;
23
- static ɵmod: i0.ɵɵNgModuleDeclaration<VflowModule, [typeof i1.VflowComponent, typeof i2.NodeComponent, typeof i3.EdgeComponent, typeof i4.EdgeLabelComponent, typeof i5.ConnectionComponent, typeof i6.HandleComponent, typeof i7.DefsComponent, typeof i8.BackgroundComponent, typeof i9.SpacePointContextDirective, typeof i10.MapContextDirective, typeof i11.RootSvgReferenceDirective, typeof i12.RootSvgContextDirective, typeof i13.HandleSizeControllerDirective, typeof i14.SelectableDirective, typeof i15.PointerDirective, typeof i16.RootPointerDirective, typeof i17.FlowSizeControllerDirective, typeof i18.NodeHtmlTemplateDirective, typeof i18.EdgeLabelHtmlTemplateDirective, typeof i18.EdgeTemplateDirective, typeof i18.ConnectionTemplateDirective, typeof i18.HandleTemplateDirective], [typeof i19.CommonModule], [typeof i1.VflowComponent, typeof i6.HandleComponent, typeof i14.SelectableDirective, typeof i18.NodeHtmlTemplateDirective, typeof i18.EdgeLabelHtmlTemplateDirective, typeof i18.EdgeTemplateDirective, typeof i18.ConnectionTemplateDirective, typeof i18.HandleTemplateDirective]>;
23
+ static ɵmod: i0.ɵɵNgModuleDeclaration<VflowModule, [typeof i1.VflowComponent, typeof i2.NodeComponent, typeof i3.EdgeComponent, typeof i4.EdgeLabelComponent, typeof i5.ConnectionComponent, typeof i6.HandleComponent, typeof i7.DefsComponent, typeof i8.BackgroundComponent, typeof i9.SpacePointContextDirective, typeof i10.MapContextDirective, typeof i11.RootSvgReferenceDirective, typeof i12.RootSvgContextDirective, typeof i13.HandleSizeControllerDirective, typeof i14.SelectableDirective, typeof i15.PointerDirective, typeof i16.RootPointerDirective, typeof i17.FlowSizeControllerDirective, typeof i18.NodeHtmlTemplateDirective, typeof i18.GroupNodeTemplateDirective, typeof i18.EdgeLabelHtmlTemplateDirective, typeof i18.EdgeTemplateDirective, typeof i18.ConnectionTemplateDirective, typeof i18.HandleTemplateDirective], [typeof i19.CommonModule], [typeof i1.VflowComponent, typeof i6.HandleComponent, typeof i14.SelectableDirective, typeof i18.NodeHtmlTemplateDirective, typeof i18.GroupNodeTemplateDirective, typeof i18.EdgeLabelHtmlTemplateDirective, typeof i18.EdgeTemplateDirective, typeof i18.ConnectionTemplateDirective, typeof i18.HandleTemplateDirective]>;
24
24
  static ɵinj: i0.ɵɵInjectorDeclaration<VflowModule>;
25
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-vflow",
3
- "version": "0.9.1",
3
+ "version": "0.11.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://www.ngx-vflow.org/",
6
6
  "author": "Artem Mangilev",
package/public-api.d.ts CHANGED
@@ -11,6 +11,7 @@ export * from './lib/vflow/interfaces/marker.interface';
11
11
  export { ViewportState } from './lib/vflow/interfaces/viewport.interface';
12
12
  export * from './lib/vflow/interfaces/component-node-event.interface';
13
13
  export * from './lib/vflow/interfaces/fit-view-options.interface';
14
+ export * from './lib/vflow/interfaces/optimization.interface';
14
15
  export * from './lib/vflow/types/node-change.type';
15
16
  export * from './lib/vflow/types/edge-change.type';
16
17
  export * from './lib/vflow/types/position.type';
@@ -19,6 +20,7 @@ export * from './lib/vflow/types/connection-mode.type';
19
20
  export * from './lib/vflow/components/vflow/vflow.component';
20
21
  export * from './lib/vflow/components/handle/handle.component';
21
22
  export * from './lib/vflow/public-components/custom-node.component';
23
+ export * from './lib/vflow/public-components/custom-dynamic-node.component';
22
24
  export * from './lib/vflow/directives/template.directive';
23
25
  export * from './lib/vflow/directives/connection-controller.directive';
24
26
  export * from './lib/vflow/directives/changes-controller.directive';