ngx-vflow 1.15.0 → 1.16.1

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.
@@ -0,0 +1,21 @@
1
+ import { Box } from '../../interfaces/box';
2
+ import * as i0 from "@angular/core";
3
+ interface Intersection {
4
+ lines: (Box & {
5
+ isCenter: boolean;
6
+ })[];
7
+ snappedX: number;
8
+ snappedY: number;
9
+ }
10
+ export declare class AlignmentHelperComponent {
11
+ private nodeRenderingService;
12
+ private flowStatus;
13
+ readonly tolerance: import("@angular/core").InputSignal<number>;
14
+ readonly lineColor: import("@angular/core").InputSignal<string>;
15
+ protected isNodeDragging: import("@angular/core").Signal<boolean>;
16
+ protected readonly intersections: import("@angular/core").Signal<Intersection>;
17
+ constructor();
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<AlignmentHelperComponent, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<AlignmentHelperComponent, "g[alignmentHelper]", never, { "tolerance": { "alias": "tolerance"; "required": false; "isSignal": true; }; "lineColor": { "alias": "lineColor"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
20
+ }
21
+ export {};
@@ -15,6 +15,7 @@ import { FitViewOptions } from '../../interfaces/fit-view-options.interface';
15
15
  import { Optimization } from '../../interfaces/optimization.interface';
16
16
  import { KeyboardShortcuts } from '../../types/keyboard-action.type';
17
17
  import { IntersectingNodesOptions } from '../../interfaces/intersecting-nodes-options.interface';
18
+ import { AlignmentHelperSettings } from '../../interfaces/alignment-helper-settings.interface';
18
19
  import * as i0 from "@angular/core";
19
20
  import * as i1 from "../../directives/changes-controller.directive";
20
21
  import * as i2 from "../../interfaces/connection-settings.interface";
@@ -85,6 +86,7 @@ export declare class VflowComponent {
85
86
  * Nodes to render
86
87
  */
87
88
  set nodes(newNodes: Node[] | DynamicNode[]);
89
+ alignmentHelper: import("@angular/core").InputSignal<boolean | AlignmentHelperSettings>;
88
90
  protected nodeModels: import("@angular/core").Signal<NodeModel<unknown>[]>;
89
91
  protected groups: import("@angular/core").Signal<NodeModel<unknown>[]>;
90
92
  protected nonGroups: import("@angular/core").Signal<NodeModel<unknown>[]>;
@@ -202,6 +204,6 @@ export declare class VflowComponent {
202
204
  protected trackNodes(idx: number, { rawNode: node }: NodeModel): Node<unknown> | DynamicNode<unknown>;
203
205
  protected trackEdges(idx: number, { edge }: EdgeModel): Edge<unknown>;
204
206
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowComponent, never>;
205
- 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; }; "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"; }; }]>;
207
+ 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; }; "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; }; "alignmentHelper": { "alias": "alignmentHelper"; "required": false; "isSignal": 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"; }; }]>;
206
208
  static ngAcceptInputType_connection: i2.ConnectionSettings;
207
209
  }
@@ -0,0 +1,4 @@
1
+ export interface AlignmentHelperSettings {
2
+ tolerance: number;
3
+ lineColor: string;
4
+ }
@@ -4,3 +4,10 @@ export interface Rect {
4
4
  width: number;
5
5
  height: number;
6
6
  }
7
+ export interface RectWithSides extends Rect {
8
+ left: number;
9
+ right: number;
10
+ top: number;
11
+ bottom: number;
12
+ }
13
+ export declare function rectToRectWithSides(rect: Rect): RectWithSides;
@@ -3,6 +3,7 @@ import * as i0 from "@angular/core";
3
3
  export declare class DraggableService {
4
4
  private entitiesService;
5
5
  private settingsService;
6
+ private flowStatusService;
6
7
  /**
7
8
  * Enable draggable behavior for element.
8
9
  *
@@ -40,7 +40,19 @@ export interface FlowStatusReconnectionEnd {
40
40
  oldEdge: EdgeModel;
41
41
  };
42
42
  }
43
- export type FlowStatus = FlowStatusIdle | FlowStatusConnectionStart | FlowStatusConnectionValidation | FlowStatusConnectionEnd | FlowStatusReconnectionStart | FlowStatusReconnectionValidation | FlowStatusReconnectionEnd;
43
+ export interface FlowStatusNodeDragStart {
44
+ state: 'node-drag-start';
45
+ payload: {
46
+ node: NodeModel;
47
+ };
48
+ }
49
+ export interface FlowStatusNodeDragEnd {
50
+ state: 'node-drag-end';
51
+ payload: {
52
+ node: NodeModel;
53
+ };
54
+ }
55
+ export type FlowStatus = FlowStatusIdle | FlowStatusConnectionStart | FlowStatusConnectionValidation | FlowStatusConnectionEnd | FlowStatusReconnectionStart | FlowStatusReconnectionValidation | FlowStatusReconnectionEnd | FlowStatusNodeDragStart | FlowStatusNodeDragEnd;
44
56
  export declare class FlowStatusService {
45
57
  readonly status: import("@angular/core").WritableSignal<FlowStatus>;
46
58
  setIdleStatus(): void;
@@ -50,6 +62,10 @@ export declare class FlowStatusService {
50
62
  setReconnectionValidationStatus(valid: boolean, source: NodeModel, target: NodeModel, sourceHandle: HandleModel, targetHandle: HandleModel, oldEdge: EdgeModel): void;
51
63
  setConnectionEndStatus(source: NodeModel, target: NodeModel, sourceHandle: HandleModel, targetHandle: HandleModel): void;
52
64
  setReconnectionEndStatus(source: NodeModel, target: NodeModel, sourceHandle: HandleModel, targetHandle: HandleModel, oldEdge: EdgeModel): void;
65
+ setNodeDragStartStatus(node: NodeModel): void;
66
+ setNodeDragEndStatus(node: NodeModel): void;
53
67
  static ɵfac: i0.ɵɵFactoryDeclaration<FlowStatusService, never>;
54
68
  static ɵprov: i0.ɵɵInjectableDeclaration<FlowStatusService>;
55
69
  }
70
+ export declare function isNodeDragStartStatus(params: FlowStatus): params is FlowStatusNodeDragStart;
71
+ export declare function isNodeDragEndStatus(params: FlowStatus): params is FlowStatusNodeDragEnd;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-vflow",
3
- "version": "1.15.0",
3
+ "version": "1.16.1",
4
4
  "license": "MIT",
5
5
  "homepage": "https://www.ngx-vflow.org/",
6
6
  "author": "Artem Mangilev",
package/public-api.d.ts CHANGED
@@ -14,6 +14,7 @@ export * from './lib/vflow/interfaces/optimization.interface';
14
14
  export * from './lib/vflow/interfaces/intersecting-nodes-options.interface';
15
15
  export * from './lib/vflow/interfaces/curve-factory.interface';
16
16
  export * from './lib/vflow/interfaces/node-preview.interface';
17
+ export * from './lib/vflow/interfaces/alignment-helper-settings.interface';
17
18
  export * from './lib/vflow/types/node-change.type';
18
19
  export * from './lib/vflow/types/edge-change.type';
19
20
  export * from './lib/vflow/types/position.type';
@@ -1,5 +1,5 @@
1
1
  import { WritableSignal, OnInit } from '@angular/core';
2
- import { Node, DynamicNode, Edge, SpacePoint, Point, Background, KeyboardShortcuts, ViewportState, NodeChange, EdgeChange, FitViewOptions, VflowComponent, IntersectingNodesOptions, ɵConnectionModel as ConnectionModel } from 'ngx-vflow';
2
+ import { Node, DynamicNode, Edge, SpacePoint, Point, Background, KeyboardShortcuts, ViewportState, NodeChange, EdgeChange, FitViewOptions, VflowComponent, IntersectingNodesOptions, ɵConnectionModel as ConnectionModel, AlignmentHelperSettings } from 'ngx-vflow';
3
3
  import { ConnectionTemplateMockDirective, EdgeLabelHtmlTemplateMockDirective, EdgeTemplateMockDirective, GroupNodeTemplateMockDirective, NodeHtmlTemplateMockDirective } from '../directive-mocks/template-mock.directive';
4
4
  import { AsInterface } from '../types';
5
5
  import * as i0 from "@angular/core";
@@ -24,6 +24,7 @@ export declare class VflowMockComponent implements AsInterface<VflowComponent>,
24
24
  ];
25
25
  elevateNodesOnSelect: boolean;
26
26
  elevateEdgesOnSelect: boolean;
27
+ alignmentHelper: import("@angular/core").InputSignal<boolean | AlignmentHelperSettings>;
27
28
  readonly onComponentNodeEvent: import("@angular/core").OutputEmitterRef<any>;
28
29
  protected nodeTemplateDirective: import("@angular/core").Signal<NodeHtmlTemplateMockDirective | undefined>;
29
30
  protected groupNodeTemplateDirective: import("@angular/core").Signal<GroupNodeTemplateMockDirective | undefined>;
@@ -55,6 +56,6 @@ export declare class VflowMockComponent implements AsInterface<VflowComponent>,
55
56
  getDetachedEdges(): Edge[];
56
57
  protected createSignal<T>(value: T): WritableSignal<T>;
57
58
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowMockComponent, never>;
58
- 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; }; "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>;
59
+ 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; }; "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; }; "alignmentHelper": { "alias": "alignmentHelper"; "required": false; "isSignal": true; }; }, { "onComponentNodeEvent": "onComponentNodeEvent"; }, ["nodeTemplateDirective", "groupNodeTemplateDirective", "edgeTemplateDirective", "edgeLabelHtmlDirective", "connectionTemplateDirective"], ["*"], true, never>;
59
60
  static ngAcceptInputType_connection: i1.ConnectionSettings;
60
61
  }
@@ -1,4 +0,0 @@
1
- export function isGroupNode(node) {
2
- return node.rawNode.type === 'default-group' || node.rawNode.type === 'template-group';
3
- }
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtZ3JvdXAtbm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy91dGlscy9pcy1ncm91cC1ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBZTtJQUN6QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQztBQUN6RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL25vZGUubW9kZWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNHcm91cE5vZGUobm9kZTogTm9kZU1vZGVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlLnJhd05vZGUudHlwZSA9PT0gJ2RlZmF1bHQtZ3JvdXAnIHx8IG5vZGUucmF3Tm9kZS50eXBlID09PSAndGVtcGxhdGUtZ3JvdXAnO1xufVxuIl19
@@ -1,2 +0,0 @@
1
- import { NodeModel } from '../models/node.model';
2
- export declare function isGroupNode(node: NodeModel): boolean;