ngx-vflow 1.7.1 → 1.8.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.
@@ -1,11 +1,10 @@
1
- import { OnInit } from '@angular/core';
2
1
  import { DynamicNode, Node } from '../../interfaces/node.interface';
3
2
  import { MapContextDirective } from '../../directives/map-context.directive';
4
3
  import { NodeModel } from '../../models/node.model';
5
4
  import { Edge } from '../../interfaces/edge.interface';
6
5
  import { EdgeModel } from '../../models/edge.model';
7
6
  import { ConnectionTemplateDirective, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, NodeHtmlTemplateDirective, NodeSvgTemplateDirective } from '../../directives/template.directive';
8
- import { Point } from '../../interfaces/point.interface';
7
+ import { SpacePoint, Point } from '../../interfaces/point.interface';
9
8
  import { ViewportState } from '../../interfaces/viewport.interface';
10
9
  import { ConnectionModel } from '../../models/connection.model';
11
10
  import { NodeChange } from '../../types/node-change.type';
@@ -15,10 +14,11 @@ import { SpacePointContextDirective } from '../../directives/space-point-context
15
14
  import { FitViewOptions } from '../../interfaces/fit-view-options.interface';
16
15
  import { Optimization } from '../../interfaces/optimization.interface';
17
16
  import { KeyboardShortcuts } from '../../types/keyboard-action.type';
17
+ import { IntersectingNodesOptions } from '../../interfaces/intersecting-nodes-options.interface';
18
18
  import * as i0 from "@angular/core";
19
19
  import * as i1 from "../../directives/changes-controller.directive";
20
20
  import * as i2 from "../../interfaces/connection-settings.interface";
21
- export declare class VflowComponent implements OnInit {
21
+ export declare class VflowComponent {
22
22
  private viewportService;
23
23
  private flowEntitiesService;
24
24
  private nodesChangeService;
@@ -132,7 +132,6 @@ export declare class VflowComponent implements OnInit {
132
132
  readonly edgesChange$: import("rxjs").Observable<EdgeChange[]>;
133
133
  protected markers: import("@angular/core").Signal<Map<number, import("ngx-vflow").Marker>>;
134
134
  protected minimap: import("@angular/core").WritableSignal<import("../../models/minimap.model").MinimapModel | null>;
135
- ngOnInit(): void;
136
135
  /**
137
136
  * Change viewport to specified state
138
137
  *
@@ -166,9 +165,36 @@ export declare class VflowComponent implements OnInit {
166
165
  * Convert point received from document to point on the flow
167
166
  */
168
167
  documentPointToFlowPoint(point: Point): Point;
168
+ documentPointToFlowPoint(point: Point, options?: {
169
+ spaces: false;
170
+ }): Point;
171
+ /**
172
+ * Convert point received from document to a stack of space points on the flow
173
+ * Space point has a spaceNodeId, coordinates are relative to this node
174
+ */
175
+ documentPointToFlowPoint(point: Point, options?: {
176
+ spaces: true;
177
+ }): SpacePoint[];
178
+ /**
179
+ * Gets nodes that intersect with the specified node
180
+ *
181
+ * @template T - The type of data associated with the nodes
182
+ * @param nodeId - The ID of the node to check intersections for
183
+ * @param options.partially - If true, returns nodes that partially intersect. If false, only returns fully intersecting nodes
184
+ * @returns An array of nodes that intersect with the specified node
185
+ */
186
+ getIntesectingNodes<T>(nodeId: string, options?: IntersectingNodesOptions): Node<T>[] | DynamicNode<T>[];
187
+ /**
188
+ * Converts a node's position to the coordinate space of another node
189
+ *
190
+ * @param nodeId - The ID of the node whose position should be converted
191
+ * @param spaceNodeId - The ID of the node that defines the target coordinate space.
192
+ * If null, returns the position in global coordinates
193
+ * @returns {Point} The converted position. Returns {x: Infinity, y: Infinity} if either node is not found
194
+ */
195
+ toNodeSpace(nodeId: string, spaceNodeId: string | null): Point;
169
196
  protected trackNodes(idx: number, { rawNode: node }: NodeModel): Node<unknown> | DynamicNode<unknown>;
170
197
  protected trackEdges(idx: number, { edge }: EdgeModel): Edge<unknown>;
171
- private setInitialNodesOrder;
172
198
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowComponent, never>;
173
199
  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"; }; }]>;
174
200
  static ngAcceptInputType_connection: i2.ConnectionSettings;
@@ -0,0 +1,3 @@
1
+ export interface IntersectingNodesOptions {
2
+ partially: boolean;
3
+ }
@@ -2,3 +2,6 @@ export interface Point {
2
2
  x: number;
3
3
  y: number;
4
4
  }
5
+ export interface SpacePoint extends Point {
6
+ spaceNodeId: string | null;
7
+ }
@@ -4,11 +4,7 @@ import { NodeChange } from '../types/node-change.type';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class NodesChangeService {
6
6
  protected entitiesService: FlowEntitiesService;
7
- protected nodesPositionChange$: Observable<{
8
- type: "position";
9
- id: string;
10
- point: import("ngx-vflow").Point;
11
- }[]>;
7
+ protected nodesPositionChange$: Observable<NodeChange[]>;
12
8
  protected nodeSizeChange$: Observable<{
13
9
  type: "size";
14
10
  id: string;
@@ -1,7 +1,7 @@
1
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
- import { Point } from '../../interfaces/point.interface';
4
+ import { SpacePoint, 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';
@@ -13,6 +13,7 @@ import { ConnectionTemplateMockDirective, EdgeLabelHtmlTemplateMockDirective, Ed
13
13
  import { VflowComponent } from '../../components/vflow/vflow.component';
14
14
  import { ConnectionModel } from '../../models/connection.model';
15
15
  import { AsInterface } from '../types';
16
+ import { IntersectingNodesOptions } from '../../interfaces/intersecting-nodes-options.interface';
16
17
  import * as i0 from "@angular/core";
17
18
  import * as i1 from "../../interfaces/connection-settings.interface";
18
19
  export declare class VflowMockComponent implements AsInterface<VflowComponent>, OnInit {
@@ -52,7 +53,14 @@ export declare class VflowMockComponent implements AsInterface<VflowComponent>,
52
53
  zoomTo(zoom: number): void;
53
54
  panTo(point: Point): void;
54
55
  fitView(options?: FitViewOptions): void;
55
- documentPointToFlowPoint(point: Point): Point;
56
+ documentPointToFlowPoint(point: Point, options?: {
57
+ spaces: false;
58
+ }): Point;
59
+ documentPointToFlowPoint(point: Point, options: {
60
+ spaces: true;
61
+ }): SpacePoint[];
62
+ getIntesectingNodes(nodeId: string, options?: IntersectingNodesOptions): Node[] | DynamicNode[];
63
+ toNodeSpace(nodeId: string, spaceNodeId: string): Point;
56
64
  getNode<T = unknown>(id: string): Node<T> | DynamicNode<T> | undefined;
57
65
  getDetachedEdges(): Edge[];
58
66
  protected createSignal<T>(value: T): WritableSignal<T>;
@@ -0,0 +1,2 @@
1
+ import { Rect } from '../interfaces/rect';
2
+ export declare const getOverlappingArea: (rectA: Rect, rectB: Rect) => number;
@@ -0,0 +1,10 @@
1
+ import { SpacePoint, Point } from '../interfaces/point.interface';
2
+ import { NodeModel } from '../models/node.model';
3
+ /**
4
+ * @todo handle regular nodes
5
+ *
6
+ * @param point global point in flow coordinates
7
+ * @param groups sorted array of groups
8
+ * @returns
9
+ */
10
+ export declare function getSpacePoints(point: Point, groups: NodeModel[]): SpacePoint[];
@@ -1,3 +1,6 @@
1
+ import { IntersectingNodesOptions } from '../interfaces/intersecting-nodes-options.interface';
1
2
  import { Rect } from '../interfaces/rect';
2
3
  import { NodeModel } from '../models/node.model';
3
4
  export declare function getNodesBounds(nodes: NodeModel[]): Rect;
5
+ export declare function getIntesectingNodes(nodeId: string, nodes: NodeModel[], options?: IntersectingNodesOptions): NodeModel[];
6
+ export declare function nodeToRect(node: NodeModel): Rect;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-vflow",
3
- "version": "1.7.1",
3
+ "version": "1.8.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 { ViewportState } from './lib/vflow/interfaces/viewport.interface';
11
11
  export * from './lib/vflow/interfaces/component-node-event.interface';
12
12
  export * from './lib/vflow/interfaces/fit-view-options.interface';
13
13
  export * from './lib/vflow/interfaces/optimization.interface';
14
+ export * from './lib/vflow/interfaces/intersecting-nodes-options.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';