ngx-vflow 1.4.1 → 1.5.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 (52) hide show
  1. package/esm2022/lib/vflow/components/connection/connection.component.mjs +3 -3
  2. package/esm2022/lib/vflow/components/edge/edge.component.mjs +30 -5
  3. package/esm2022/lib/vflow/components/node/node.component.mjs +4 -2
  4. package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +15 -3
  5. package/esm2022/lib/vflow/directives/connection-controller.directive.mjs +55 -37
  6. package/esm2022/lib/vflow/directives/root-svg-context.directive.mjs +2 -2
  7. package/esm2022/lib/vflow/directives/selectable.directive.mjs +19 -11
  8. package/esm2022/lib/vflow/interfaces/connection.interface.mjs +1 -1
  9. package/esm2022/lib/vflow/interfaces/edge.interface.mjs +1 -1
  10. package/esm2022/lib/vflow/models/edge.model.mjs +25 -23
  11. package/esm2022/lib/vflow/public-components/handle/handle.component.mjs +18 -21
  12. package/esm2022/lib/vflow/public-components/node-toolbar/node-toolbar.component.mjs +1 -1
  13. package/esm2022/lib/vflow/services/edge-rendering.service.mjs +28 -0
  14. package/esm2022/lib/vflow/services/flow-settings.service.mjs +2 -1
  15. package/esm2022/lib/vflow/services/flow-status.service.mjs +13 -1
  16. package/esm2022/lib/vflow/testing-utils/component-mocks/handle-mock.component.mjs +3 -1
  17. package/esm2022/lib/vflow/testing-utils/component-mocks/minimap-mock.component.mjs +3 -1
  18. package/esm2022/lib/vflow/testing-utils/component-mocks/node-toolbar-mock.component.mjs +5 -1
  19. package/esm2022/lib/vflow/testing-utils/component-mocks/resizable-mock.component.mjs +5 -1
  20. package/esm2022/lib/vflow/testing-utils/component-mocks/vflow-mock.component.mjs +50 -22
  21. package/esm2022/lib/vflow/testing-utils/directive-mocks/connection-controller-mock.directive.mjs +14 -2
  22. package/esm2022/lib/vflow/testing-utils/directive-mocks/drag-handle-mock.directive.mjs +1 -1
  23. package/esm2022/lib/vflow/testing-utils/directive-mocks/selectable-mock.directive.mjs +1 -1
  24. package/esm2022/lib/vflow/testing-utils/directive-mocks/template-mock.directive.mjs +1 -1
  25. package/esm2022/lib/vflow/testing-utils/types.mjs +2 -0
  26. package/fesm2022/ngx-vflow.mjs +374 -243
  27. package/fesm2022/ngx-vflow.mjs.map +1 -1
  28. package/lib/vflow/components/edge/edge.component.d.ts +10 -2
  29. package/lib/vflow/components/vflow/vflow.component.d.ts +6 -1
  30. package/lib/vflow/directives/connection-controller.directive.d.ts +5 -2
  31. package/lib/vflow/directives/selectable.directive.d.ts +4 -1
  32. package/lib/vflow/interfaces/connection.interface.d.ts +5 -0
  33. package/lib/vflow/interfaces/edge.interface.d.ts +1 -0
  34. package/lib/vflow/models/edge.model.d.ts +4 -0
  35. package/lib/vflow/public-components/handle/handle.component.d.ts +3 -6
  36. package/lib/vflow/public-components/node-toolbar/node-toolbar.component.d.ts +1 -1
  37. package/lib/vflow/services/edge-rendering.service.d.ts +10 -0
  38. package/lib/vflow/services/flow-settings.service.d.ts +1 -0
  39. package/lib/vflow/services/flow-status.service.d.ts +24 -1
  40. package/lib/vflow/testing-utils/component-mocks/handle-mock.component.d.ts +5 -2
  41. package/lib/vflow/testing-utils/component-mocks/minimap-mock.component.d.ts +5 -2
  42. package/lib/vflow/testing-utils/component-mocks/node-toolbar-mock.component.d.ts +6 -1
  43. package/lib/vflow/testing-utils/component-mocks/resizable-mock.component.d.ts +6 -1
  44. package/lib/vflow/testing-utils/component-mocks/vflow-mock.component.d.ts +27 -13
  45. package/lib/vflow/testing-utils/directive-mocks/connection-controller-mock.directive.d.ts +12 -3
  46. package/lib/vflow/testing-utils/directive-mocks/drag-handle-mock.directive.d.ts +3 -1
  47. package/lib/vflow/testing-utils/directive-mocks/selectable-mock.directive.d.ts +3 -1
  48. package/lib/vflow/testing-utils/directive-mocks/template-mock.directive.d.ts +8 -6
  49. package/lib/vflow/testing-utils/types.d.ts +1 -0
  50. package/package.json +1 -1
  51. package/esm2022/lib/vflow/decorators/run-in-injection-context.decorator.mjs +0 -18
  52. package/lib/vflow/decorators/run-in-injection-context.decorator.d.ts +0 -5
@@ -1,19 +1,27 @@
1
- import { Injector, OnInit, TemplateRef } from '@angular/core';
1
+ import { ElementRef, Injector, OnInit, TemplateRef } from '@angular/core';
2
2
  import { EdgeModel } from '../../models/edge.model';
3
3
  import { EdgeContext } from '../../interfaces/template-context.interface';
4
+ import { HandleModel } from '../../models/handle.model';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class EdgeComponent implements OnInit {
6
7
  protected injector: Injector;
7
8
  private selectionService;
8
9
  private flowSettingsService;
10
+ private flowStatusService;
11
+ private edgeRenderingService;
12
+ private connectionController;
9
13
  model: import("@angular/core").InputSignal<EdgeModel>;
10
14
  edgeTemplate: import("@angular/core").InputSignal<TemplateRef<EdgeContext> | undefined>;
11
15
  edgeLabelHtmlTemplate: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
16
+ interactiveEdgeRef: import("@angular/core").Signal<ElementRef<Element>>;
12
17
  protected markerStartUrl: import("@angular/core").Signal<string>;
13
18
  protected markerEndUrl: import("@angular/core").Signal<string>;
19
+ protected isReconnecting: import("@angular/core").Signal<boolean>;
14
20
  protected edgeContext: EdgeContext;
15
21
  ngOnInit(): void;
16
- onEdgeMouseDown(): void;
22
+ select(): void;
23
+ pull(): void;
24
+ protected startReconnection(event: Event, handle: HandleModel): void;
17
25
  static ɵfac: i0.ɵɵFactoryDeclaration<EdgeComponent, never>;
18
26
  static ɵcmp: i0.ɵɵComponentDeclaration<EdgeComponent, "g[edge]", never, { "model": { "alias": "model"; "required": true; "isSignal": true; }; "edgeTemplate": { "alias": "edgeTemplate"; "required": false; "isSignal": true; }; "edgeLabelHtmlTemplate": { "alias": "edgeLabelHtmlTemplate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
19
27
  }
@@ -24,6 +24,7 @@ export declare class VflowComponent implements OnInit {
24
24
  private nodesChangeService;
25
25
  private edgesChangeService;
26
26
  private nodeRenderingService;
27
+ private edgeRenderingService;
27
28
  private flowSettingsService;
28
29
  private componentEventBusService;
29
30
  private keyboardService;
@@ -75,6 +76,10 @@ export declare class VflowComponent implements OnInit {
75
76
  * Raizing z-index for selected node
76
77
  */
77
78
  set elevateNodesOnSelect(value: boolean);
79
+ /**
80
+ * Raizing z-index for selected edge
81
+ */
82
+ set elevateEdgesOnSelect(value: boolean);
78
83
  /**
79
84
  * Nodes to render
80
85
  */
@@ -164,6 +169,6 @@ export declare class VflowComponent implements OnInit {
164
169
  protected trackEdges(idx: number, { edge }: EdgeModel): Edge<unknown>;
165
170
  private setInitialNodesOrder;
166
171
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowComponent, never>;
167
- 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; }; "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"; }; }]>;
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"; }; }]>;
168
173
  static ngAcceptInputType_connection: i2.ConnectionSettings;
169
174
  }
@@ -1,5 +1,6 @@
1
- import { Connection } from '../interfaces/connection.interface';
1
+ import { Connection, ReconnectionEvent } from '../interfaces/connection.interface';
2
2
  import { HandleModel } from '../models/handle.model';
3
+ import { EdgeModel } from '../models/edge.model';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class ConnectionControllerDirective {
5
6
  private statusService;
@@ -15,11 +16,13 @@ export declare class ConnectionControllerDirective {
15
16
  * @todo add connect event and deprecate onConnect
16
17
  */
17
18
  readonly onConnect: import("@angular/core").OutputRef<Connection>;
19
+ readonly onReconnect: import("@angular/core").OutputRef<ReconnectionEvent>;
18
20
  protected isStrictMode: import("@angular/core").Signal<boolean>;
19
21
  startConnection(handle: HandleModel): void;
22
+ startReconnection(handle: HandleModel, oldEdge: EdgeModel): void;
20
23
  validateConnection(handle: HandleModel): void;
21
24
  resetValidateConnection(targetHandle: HandleModel): void;
22
25
  endConnection(): void;
23
26
  static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionControllerDirective, never>;
24
- static ɵdir: i0.ɵɵDirectiveDeclaration<ConnectionControllerDirective, "[onConnect]", never, {}, { "onConnect": "onConnect"; }, never, never, true, never>;
27
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ConnectionControllerDirective, "[onConnect], [onReconnect]", never, {}, { "onConnect": "onConnect"; "onReconnect": "onReconnect"; }, never, never, true, never>;
25
28
  }
@@ -4,8 +4,11 @@ export declare class SelectableDirective {
4
4
  private selectionService;
5
5
  private parentEdge;
6
6
  private parentNode;
7
- protected onMousedown(): void;
7
+ private host;
8
+ protected selectOnEvent: import("rxjs").Subscription;
9
+ private select;
8
10
  private entity;
11
+ private getEvent$;
9
12
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectableDirective, never>;
10
13
  static ɵdir: i0.ɵɵDirectiveDeclaration<SelectableDirective, "[selectable]", never, {}, {}, never, never, true, never>;
11
14
  }
@@ -1,6 +1,11 @@
1
+ import { Edge } from './edge.interface';
1
2
  export interface Connection {
2
3
  source: string;
3
4
  target: string;
4
5
  sourceHandle?: string;
5
6
  targetHandle?: string;
6
7
  }
8
+ export interface ReconnectionEvent {
9
+ connection: Connection;
10
+ oldEdge: Edge;
11
+ }
@@ -15,4 +15,5 @@ export interface Edge<T = unknown> extends Connection {
15
15
  start?: Marker;
16
16
  end?: Marker;
17
17
  };
18
+ reconnectable?: boolean | 'source' | 'target';
18
19
  }
@@ -9,11 +9,15 @@ export declare class EdgeModel implements FlowEntity {
9
9
  target: import("@angular/core").WritableSignal<NodeModel<unknown> | undefined>;
10
10
  curve: Curve;
11
11
  type: EdgeType;
12
+ reconnectable: boolean | 'source' | 'target';
12
13
  selected: import("@angular/core").WritableSignal<boolean>;
13
14
  selected$: import("rxjs").Observable<boolean>;
15
+ renderOrder: import("@angular/core").WritableSignal<number>;
14
16
  detached: import("@angular/core").Signal<boolean>;
15
17
  detached$: import("rxjs").Observable<boolean>;
16
18
  path: import("@angular/core").Signal<import("../interfaces/path-data.interface").PathData>;
19
+ sourceHandle: import("@angular/core").Signal<import("./handle.model").HandleModel | null>;
20
+ targetHandle: import("@angular/core").Signal<import("./handle.model").HandleModel | null>;
17
21
  edgeLabels: {
18
22
  [position in EdgeLabelPosition]?: EdgeLabelModel;
19
23
  };
@@ -1,10 +1,8 @@
1
- import { Injector, OnInit, TemplateRef } from '@angular/core';
1
+ import { OnInit, TemplateRef } from '@angular/core';
2
2
  import { Position } from '../../types/position.type';
3
- import { HandleModel } from '../../models/handle.model';
4
- import { WithInjector } from '../../decorators/run-in-injection-context.decorator';
5
3
  import * as i0 from "@angular/core";
6
- export declare class HandleComponent implements OnInit, WithInjector {
7
- injector: Injector;
4
+ export declare class HandleComponent implements OnInit {
5
+ private injector;
8
6
  private handleService;
9
7
  private element;
10
8
  private destroyRef;
@@ -21,7 +19,6 @@ export declare class HandleComponent implements OnInit, WithInjector {
21
19
  */
22
20
  id: import("@angular/core").InputSignal<string | undefined>;
23
21
  template: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
24
- model: HandleModel;
25
22
  ngOnInit(): void;
26
23
  static ɵfac: i0.ɵɵFactoryDeclaration<HandleComponent, never>;
27
24
  static ɵcmp: i0.ɵɵComponentDeclaration<HandleComponent, "handle", never, { "position": { "alias": "position"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -6,7 +6,7 @@ export declare class NodeToolbarComponent implements OnInit, OnDestroy {
6
6
  private overlaysService;
7
7
  private nodeService;
8
8
  position: import("@angular/core").InputSignal<Position>;
9
- toolbarContentTemplate: import("@angular/core").Signal<TemplateRef<unknown>>;
9
+ protected toolbarContentTemplate: import("@angular/core").Signal<TemplateRef<unknown>>;
10
10
  protected model: ToolbarModel;
11
11
  constructor();
12
12
  ngOnInit(): void;
@@ -0,0 +1,10 @@
1
+ import { EdgeModel } from '../models/edge.model';
2
+ import * as i0 from "@angular/core";
3
+ export declare class EdgeRenderingService {
4
+ private flowEntitiesService;
5
+ readonly edges: import("@angular/core").Signal<EdgeModel[]>;
6
+ private maxOrder;
7
+ pull(edge: EdgeModel): void;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<EdgeRenderingService, never>;
9
+ static ɵprov: i0.ɵɵInjectableDeclaration<EdgeRenderingService>;
10
+ }
@@ -4,6 +4,7 @@ import * as i0 from "@angular/core";
4
4
  export declare class FlowSettingsService {
5
5
  entitiesSelectable: WritableSignal<boolean>;
6
6
  elevateNodesOnSelect: WritableSignal<boolean>;
7
+ elevateEdgesOnSelect: WritableSignal<boolean>;
7
8
  /**
8
9
  * @see {VflowComponent.view}
9
10
  */
@@ -1,6 +1,7 @@
1
1
  import { NodeModel } from '../models/node.model';
2
2
  import { HandleModel } from '../models/handle.model';
3
3
  import { ConnectionInternal } from '../interfaces/connection.internal.interface';
4
+ import { EdgeModel } from '../models/edge.model';
4
5
  import * as i0 from "@angular/core";
5
6
  export interface FlowStatusIdle {
6
7
  state: 'idle';
@@ -20,13 +21,35 @@ export interface FlowStatusConnectionEnd {
20
21
  state: 'connection-end';
21
22
  payload: ConnectionInternal;
22
23
  }
23
- export type FlowStatus = FlowStatusIdle | FlowStatusConnectionStart | FlowStatusConnectionValidation | FlowStatusConnectionEnd;
24
+ export interface FlowStatusReconnectionStart {
25
+ state: 'reconnection-start';
26
+ payload: Omit<ConnectionInternal, 'target' | 'targetHandle'> & {
27
+ oldEdge: EdgeModel;
28
+ };
29
+ }
30
+ export interface FlowStatusReconnectionValidation {
31
+ state: 'reconnection-validation';
32
+ payload: ConnectionInternal & {
33
+ valid: boolean;
34
+ oldEdge: EdgeModel;
35
+ };
36
+ }
37
+ export interface FlowStatusReconnectionEnd {
38
+ state: 'reconnection-end';
39
+ payload: ConnectionInternal & {
40
+ oldEdge: EdgeModel;
41
+ };
42
+ }
43
+ export type FlowStatus = FlowStatusIdle | FlowStatusConnectionStart | FlowStatusConnectionValidation | FlowStatusConnectionEnd | FlowStatusReconnectionStart | FlowStatusReconnectionValidation | FlowStatusReconnectionEnd;
24
44
  export declare class FlowStatusService {
25
45
  readonly status: import("@angular/core").WritableSignal<FlowStatus>;
26
46
  setIdleStatus(): void;
27
47
  setConnectionStartStatus(source: NodeModel, sourceHandle: HandleModel): void;
48
+ setReconnectionStartStatus(source: NodeModel, sourceHandle: HandleModel, oldEdge: EdgeModel): void;
28
49
  setConnectionValidationStatus(valid: boolean, source: NodeModel, target: NodeModel, sourceHandle: HandleModel, targetHandle: HandleModel): void;
50
+ setReconnectionValidationStatus(valid: boolean, source: NodeModel, target: NodeModel, sourceHandle: HandleModel, targetHandle: HandleModel, oldEdge: EdgeModel): void;
29
51
  setConnectionEndStatus(source: NodeModel, target: NodeModel, sourceHandle: HandleModel, targetHandle: HandleModel): void;
52
+ setReconnectionEndStatus(source: NodeModel, target: NodeModel, sourceHandle: HandleModel, targetHandle: HandleModel, oldEdge: EdgeModel): void;
30
53
  static ɵfac: i0.ɵɵFactoryDeclaration<FlowStatusService, never>;
31
54
  static ɵprov: i0.ɵɵInjectableDeclaration<FlowStatusService>;
32
55
  }
@@ -1,11 +1,14 @@
1
- import { TemplateRef } from '@angular/core';
1
+ import { TemplateRef, OnInit } from '@angular/core';
2
2
  import { Position } from '../../types/position.type';
3
+ import { HandleComponent } from '../../public-components/handle/handle.component';
4
+ import { AsInterface } from '../types';
3
5
  import * as i0 from "@angular/core";
4
- export declare class HandleMockComponent {
6
+ export declare class HandleMockComponent implements AsInterface<HandleComponent>, OnInit {
5
7
  position: import("@angular/core").InputSignal<Position>;
6
8
  type: import("@angular/core").InputSignal<"source" | "target">;
7
9
  id: import("@angular/core").InputSignal<string | undefined>;
8
10
  template: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
11
+ ngOnInit(): void;
9
12
  static ɵfac: i0.ɵɵFactoryDeclaration<HandleMockComponent, never>;
10
13
  static ɵcmp: i0.ɵɵComponentDeclaration<HandleMockComponent, "handle", never, { "position": { "alias": "position"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11
14
  }
@@ -1,10 +1,13 @@
1
- import { MiniMapPosition } from '../../public-components/minimap/minimap.component';
1
+ import { OnInit } from '@angular/core';
2
+ import { MiniMapComponent, MiniMapPosition } from '../../public-components/minimap/minimap.component';
3
+ import { AsInterface } from '../types';
2
4
  import * as i0 from "@angular/core";
3
- export declare class MiniMapMockComponent {
5
+ export declare class MiniMapMockComponent implements AsInterface<MiniMapComponent>, OnInit {
4
6
  maskColor: import("@angular/core").InputSignal<string>;
5
7
  strokeColor: import("@angular/core").InputSignal<string>;
6
8
  position: import("@angular/core").InputSignal<MiniMapPosition>;
7
9
  scaleOnHover: import("@angular/core").InputSignal<boolean>;
10
+ ngOnInit(): void;
8
11
  static ɵfac: i0.ɵɵFactoryDeclaration<MiniMapMockComponent, never>;
9
12
  static ɵcmp: i0.ɵɵComponentDeclaration<MiniMapMockComponent, "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>;
10
13
  }
@@ -1,7 +1,12 @@
1
+ import { OnInit, OnDestroy } from '@angular/core';
1
2
  import { Position } from '../../types/position.type';
3
+ import { NodeToolbarComponent } from '../../public-components/node-toolbar/node-toolbar.component';
4
+ import { AsInterface } from '../types';
2
5
  import * as i0 from "@angular/core";
3
- export declare class NodeToolbarMockComponent {
6
+ export declare class NodeToolbarMockComponent implements AsInterface<NodeToolbarComponent>, OnInit, OnDestroy {
4
7
  position: import("@angular/core").InputSignal<Position>;
8
+ ngOnInit(): void;
9
+ ngOnDestroy(): void;
5
10
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeToolbarMockComponent, never>;
6
11
  static ɵcmp: i0.ɵɵComponentDeclaration<NodeToolbarMockComponent, "node-toolbar", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
7
12
  }
@@ -1,8 +1,13 @@
1
+ import { OnInit, AfterViewInit } from '@angular/core';
2
+ import { ResizableComponent } from '../../public-components/resizable/resizable.component';
3
+ import { AsInterface } from '../types';
1
4
  import * as i0 from "@angular/core";
2
- export declare class ResizableMockComponent {
5
+ export declare class ResizableMockComponent implements AsInterface<ResizableComponent>, OnInit, AfterViewInit {
3
6
  resizable: import("@angular/core").InputSignal<boolean | "" | undefined>;
4
7
  resizerColor: import("@angular/core").InputSignal<string>;
5
8
  gap: import("@angular/core").InputSignal<number>;
9
+ ngOnInit(): void;
10
+ ngAfterViewInit(): void;
6
11
  static ɵfac: i0.ɵɵFactoryDeclaration<ResizableMockComponent, never>;
7
12
  static ɵcmp: i0.ɵɵComponentDeclaration<ResizableMockComponent, "[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>;
8
13
  }
@@ -1,28 +1,40 @@
1
- import { WritableSignal } from '@angular/core';
1
+ import { WritableSignal, OnInit } from '@angular/core';
2
2
  import { Node, DynamicNode } from '../../interfaces/node.interface';
3
3
  import { Edge } from '../../interfaces/edge.interface';
4
4
  import { Point } from '../../interfaces/point.interface';
5
5
  import { Background } from '../../types/background.type';
6
6
  import { Optimization } from '../../interfaces/optimization.interface';
7
7
  import { KeyboardShortcuts } from '../../types/keyboard-action.type';
8
- import { ConnectionSettings } from '../../interfaces/connection-settings.interface';
9
8
  import { ViewportState } from '../../interfaces/viewport.interface';
10
9
  import { NodeChange } from '../../types/node-change.type';
11
10
  import { EdgeChange } from '../../types/edge-change.type';
12
11
  import { FitViewOptions } from '../../interfaces/fit-view-options.interface';
13
12
  import { ConnectionTemplateMockDirective, EdgeLabelHtmlTemplateMockDirective, EdgeTemplateMockDirective, GroupNodeTemplateMockDirective, NodeHtmlTemplateMockDirective } from '../directive-mocks/template-mock.directive';
13
+ import { VflowComponent } from '../../components/vflow/vflow.component';
14
+ import { ConnectionModel } from '../../models/connection.model';
15
+ import { AsInterface } from '../types';
14
16
  import * as i0 from "@angular/core";
15
- export declare class VflowMockComponent {
16
- readonly nodes: import("@angular/core").InputSignal<Node[] | DynamicNode[]>;
17
- readonly edges: import("@angular/core").InputSignal<Edge<unknown>[]>;
18
- readonly view: import("@angular/core").InputSignal<[number, number] | "auto">;
19
- readonly minZoom: import("@angular/core").InputSignal<number>;
20
- readonly maxZoom: import("@angular/core").InputSignal<number>;
21
- readonly background: import("@angular/core").InputSignal<string | Background>;
17
+ import * as i1 from "../../interfaces/connection-settings.interface";
18
+ export declare class VflowMockComponent implements AsInterface<VflowComponent>, OnInit {
19
+ readonly nodes: Node[] | DynamicNode[];
20
+ readonly edges: Edge[];
21
+ readonly view: [
22
+ number,
23
+ number
24
+ ] | 'auto';
25
+ readonly minZoom = 0.5;
26
+ readonly maxZoom = 3;
27
+ readonly background: Background | string;
22
28
  readonly optimization: import("@angular/core").InputSignal<Optimization>;
23
- readonly entitiesSelectable: import("@angular/core").InputSignal<boolean>;
24
- readonly keyboardShortcuts: import("@angular/core").InputSignal<KeyboardShortcuts>;
25
- readonly connection: import("@angular/core").InputSignal<ConnectionSettings | undefined>;
29
+ readonly entitiesSelectable = true;
30
+ readonly keyboardShortcuts: KeyboardShortcuts;
31
+ readonly connection: ConnectionModel;
32
+ readonly snapGrid: [
33
+ number,
34
+ number
35
+ ];
36
+ elevateNodesOnSelect: boolean;
37
+ elevateEdgesOnSelect: boolean;
26
38
  readonly onComponentNodeEvent: import("@angular/core").OutputEmitterRef<any>;
27
39
  protected nodeTemplateDirective: import("@angular/core").Signal<NodeHtmlTemplateMockDirective | undefined>;
28
40
  protected groupNodeTemplateDirective: import("@angular/core").Signal<GroupNodeTemplateMockDirective | undefined>;
@@ -35,6 +47,7 @@ export declare class VflowMockComponent {
35
47
  viewportChange$: import("rxjs").Observable<ViewportState>;
36
48
  nodesChange$: import("rxjs").Observable<NodeChange[]>;
37
49
  edgesChange$: import("rxjs").Observable<EdgeChange[]>;
50
+ ngOnInit(): void;
38
51
  viewportTo(viewport: ViewportState): void;
39
52
  zoomTo(zoom: number): void;
40
53
  panTo(point: Point): void;
@@ -44,5 +57,6 @@ export declare class VflowMockComponent {
44
57
  getDetachedEdges(): Edge[];
45
58
  protected createSignal<T>(value: T): WritableSignal<T>;
46
59
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowMockComponent, never>;
47
- static ɵcmp: i0.ɵɵComponentDeclaration<VflowMockComponent, "vflow", never, { "nodes": { "alias": "nodes"; "required": true; "isSignal": true; }; "edges": { "alias": "edges"; "required": true; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "minZoom": { "alias": "minZoom"; "required": false; "isSignal": true; }; "maxZoom": { "alias": "maxZoom"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "optimization": { "alias": "optimization"; "required": false; "isSignal": true; }; "entitiesSelectable": { "alias": "entitiesSelectable"; "required": false; "isSignal": true; }; "keyboardShortcuts": { "alias": "keyboardShortcuts"; "required": false; "isSignal": true; }; "connection": { "alias": "connection"; "required": false; "isSignal": true; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], ["*"], true, never>;
60
+ static ɵcmp: i0.ɵɵComponentDeclaration<VflowMockComponent, "vflow", never, { "nodes": { "alias": "nodes"; "required": true; }; "edges": { "alias": "edges"; "required": false; }; "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; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], ["*"], true, never>;
61
+ static ngAcceptInputType_connection: i1.ConnectionSettings;
48
62
  }
@@ -1,7 +1,16 @@
1
- import { Connection } from '../../interfaces/connection.interface';
1
+ import { Connection, ReconnectionEvent } from '../../interfaces/connection.interface';
2
+ import { AsInterface } from '../types';
3
+ import { ConnectionControllerDirective } from '../../directives/connection-controller.directive';
4
+ import { HandleModel } from '../../models/handle.model';
2
5
  import * as i0 from "@angular/core";
3
- export declare class ConnectionControllerMockDirective {
6
+ export declare class ConnectionControllerMockDirective implements AsInterface<ConnectionControllerDirective> {
4
7
  readonly onConnect: import("@angular/core").OutputEmitterRef<Connection>;
8
+ readonly onReconnect: import("@angular/core").OutputEmitterRef<ReconnectionEvent>;
9
+ startConnection(handle: HandleModel): void;
10
+ startReconnection(handle: HandleModel): void;
11
+ validateConnection(handle: HandleModel): void;
12
+ resetValidateConnection(targetHandle: HandleModel): void;
13
+ endConnection(): void;
5
14
  static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionControllerMockDirective, never>;
6
- static ɵdir: i0.ɵɵDirectiveDeclaration<ConnectionControllerMockDirective, "[onConnect]", never, {}, { "onConnect": "onConnect"; }, never, never, true, never>;
15
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ConnectionControllerMockDirective, "[onConnect]", never, {}, { "onConnect": "onConnect"; "onReconnect": "onReconnect"; }, never, never, true, never>;
7
16
  }
@@ -1,5 +1,7 @@
1
+ import { AsInterface } from '../types';
2
+ import { DragHandleDirective } from '../../directives/drag-handle.directive';
1
3
  import * as i0 from "@angular/core";
2
- export declare class DragHandleMockDirective {
4
+ export declare class DragHandleMockDirective implements AsInterface<DragHandleDirective> {
3
5
  static ɵfac: i0.ɵɵFactoryDeclaration<DragHandleMockDirective, never>;
4
6
  static ɵdir: i0.ɵɵDirectiveDeclaration<DragHandleMockDirective, "[dragHandle]", never, {}, {}, never, never, true, never>;
5
7
  }
@@ -1,5 +1,7 @@
1
+ import { AsInterface } from '../types';
2
+ import { SelectableDirective } from '../../directives/selectable.directive';
1
3
  import * as i0 from "@angular/core";
2
- export declare class SelectableMockDirective {
4
+ export declare class SelectableMockDirective implements AsInterface<SelectableDirective> {
3
5
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectableMockDirective, never>;
4
6
  static ɵdir: i0.ɵɵDirectiveDeclaration<SelectableMockDirective, "[selectable]", never, {}, {}, never, never, true, never>;
5
7
  }
@@ -1,31 +1,33 @@
1
1
  import { TemplateRef } from '@angular/core';
2
+ import { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, HandleTemplateDirective, NodeHtmlTemplateDirective } from '../../directives/template.directive';
3
+ import { AsInterface } from '../types';
2
4
  import * as i0 from "@angular/core";
3
- export declare class EdgeTemplateMockDirective {
5
+ export declare class EdgeTemplateMockDirective implements AsInterface<EdgeTemplateDirective> {
4
6
  templateRef: TemplateRef<any>;
5
7
  static ɵfac: i0.ɵɵFactoryDeclaration<EdgeTemplateMockDirective, never>;
6
8
  static ɵdir: i0.ɵɵDirectiveDeclaration<EdgeTemplateMockDirective, "ng-template[edge]", never, {}, {}, never, never, true, never>;
7
9
  }
8
- export declare class ConnectionTemplateMockDirective {
10
+ export declare class ConnectionTemplateMockDirective implements AsInterface<ConnectionTemplateDirective> {
9
11
  templateRef: TemplateRef<any>;
10
12
  static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionTemplateMockDirective, never>;
11
13
  static ɵdir: i0.ɵɵDirectiveDeclaration<ConnectionTemplateMockDirective, "ng-template[connection]", never, {}, {}, never, never, true, never>;
12
14
  }
13
- export declare class EdgeLabelHtmlTemplateMockDirective {
15
+ export declare class EdgeLabelHtmlTemplateMockDirective implements AsInterface<EdgeLabelHtmlTemplateDirective> {
14
16
  templateRef: TemplateRef<any>;
15
17
  static ɵfac: i0.ɵɵFactoryDeclaration<EdgeLabelHtmlTemplateMockDirective, never>;
16
18
  static ɵdir: i0.ɵɵDirectiveDeclaration<EdgeLabelHtmlTemplateMockDirective, "ng-template[edgeLabelHtml]", never, {}, {}, never, never, true, never>;
17
19
  }
18
- export declare class NodeHtmlTemplateMockDirective {
20
+ export declare class NodeHtmlTemplateMockDirective implements AsInterface<NodeHtmlTemplateDirective> {
19
21
  templateRef: TemplateRef<any>;
20
22
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeHtmlTemplateMockDirective, never>;
21
23
  static ɵdir: i0.ɵɵDirectiveDeclaration<NodeHtmlTemplateMockDirective, "ng-template[nodeHtml]", never, {}, {}, never, never, true, never>;
22
24
  }
23
- export declare class GroupNodeTemplateMockDirective {
25
+ export declare class GroupNodeTemplateMockDirective implements AsInterface<GroupNodeTemplateDirective> {
24
26
  templateRef: TemplateRef<any>;
25
27
  static ɵfac: i0.ɵɵFactoryDeclaration<GroupNodeTemplateMockDirective, never>;
26
28
  static ɵdir: i0.ɵɵDirectiveDeclaration<GroupNodeTemplateMockDirective, "ng-template[groupNode]", never, {}, {}, never, never, true, never>;
27
29
  }
28
- export declare class HandleTemplateMockDirective {
30
+ export declare class HandleTemplateMockDirective implements AsInterface<HandleTemplateDirective> {
29
31
  templateRef: TemplateRef<any>;
30
32
  static ɵfac: i0.ɵɵFactoryDeclaration<HandleTemplateMockDirective, never>;
31
33
  static ɵdir: i0.ɵɵDirectiveDeclaration<HandleTemplateMockDirective, "ng-template[handle]", never, {}, {}, never, never, true, never>;
@@ -0,0 +1 @@
1
+ export type AsInterface<T> = Pick<T, keyof T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-vflow",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://www.ngx-vflow.org/",
6
6
  "author": "Artem Mangilev",
@@ -1,18 +0,0 @@
1
- import { runInInjectionContext } from '@angular/core';
2
- export function InjectionContext(target, key, descriptor) {
3
- const originalMethod = descriptor.value;
4
- descriptor.value = function (...args) {
5
- if (implementsWithInjector(this)) {
6
- return runInInjectionContext(this.injector, () => originalMethod.apply(this, args));
7
- }
8
- else {
9
- throw new Error('Class that contains decorated method must extends WithInjectorDirective class');
10
- }
11
- };
12
- // Return the modified descriptor
13
- return descriptor;
14
- }
15
- const implementsWithInjector = (instance) => {
16
- return 'injector' in instance && 'get' in instance.injector;
17
- };
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWluLWluamVjdGlvbi1jb250ZXh0LmRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9kZWNvcmF0b3JzL3J1bi1pbi1pbmplY3Rpb24tY29udGV4dC5kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFXLEVBQUUsR0FBVyxFQUFFLFVBQThCO0lBQ3ZGLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFeEMsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsSUFBVztRQUN6QyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLCtFQUErRSxDQUFDLENBQUM7UUFDbkcsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLGlDQUFpQztJQUNqQyxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBTUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFFBQWdCLEVBQTRCLEVBQUU7SUFDNUUsT0FBTyxVQUFVLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSyxRQUFRLENBQUMsUUFBcUIsQ0FBQztBQUM1RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBJbmplY3Rpb25Db250ZXh0KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKGltcGxlbWVudHNXaXRoSW5qZWN0b3IodGhpcykpIHtcbiAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsYXNzIHRoYXQgY29udGFpbnMgZGVjb3JhdGVkIG1ldGhvZCBtdXN0IGV4dGVuZHMgV2l0aEluamVjdG9yRGlyZWN0aXZlIGNsYXNzJyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgbW9kaWZpZWQgZGVzY3JpcHRvclxuICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoSW5qZWN0b3Ige1xuICBpbmplY3RvcjogSW5qZWN0b3I7XG59XG5cbmNvbnN0IGltcGxlbWVudHNXaXRoSW5qZWN0b3IgPSAoaW5zdGFuY2U6IG9iamVjdCk6IGluc3RhbmNlIGlzIFdpdGhJbmplY3RvciA9PiB7XG4gIHJldHVybiAnaW5qZWN0b3InIGluIGluc3RhbmNlICYmICdnZXQnIGluIChpbnN0YW5jZS5pbmplY3RvciBhcyBJbmplY3Rvcik7XG59O1xuIl19
@@ -1,5 +0,0 @@
1
- import { Injector } from '@angular/core';
2
- export declare function InjectionContext(target: any, key: string, descriptor: PropertyDescriptor): PropertyDescriptor;
3
- export interface WithInjector {
4
- injector: Injector;
5
- }