ngx-vflow 0.5.0 → 0.6.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,18 +1,13 @@
1
- import { AfterViewInit, ElementRef, Injector, NgZone, OnDestroy, OnInit, TemplateRef } from '@angular/core';
1
+ import { AfterViewInit, ElementRef, Injector, OnDestroy, OnInit, TemplateRef } from '@angular/core';
2
2
  import { NodeModel } from '../../models/node.model';
3
- import { HandleService } from '../../services/handle.service';
4
3
  import { HandleModel } from '../../models/handle.model';
5
4
  import { WithInjector } from '../../decorators/run-in-injection-context.decorator';
6
5
  import * as i0 from "@angular/core";
7
6
  export type HandleState = 'valid' | 'invalid' | 'idle';
8
7
  export declare class NodeComponent implements OnInit, AfterViewInit, OnDestroy, WithInjector {
9
8
  injector: Injector;
10
- protected handleService: HandleService;
11
- protected zone: NgZone;
12
- nodeModel: NodeModel;
13
- nodeHtmlTemplate?: TemplateRef<any>;
14
- nodeContentRef: ElementRef<SVGGraphicsElement>;
15
- htmlWrapperRef: ElementRef<HTMLDivElement>;
9
+ private handleService;
10
+ private zone;
16
11
  private draggableService;
17
12
  private flowStatusService;
18
13
  private flowEntitiesService;
@@ -20,7 +15,13 @@ export declare class NodeComponent implements OnInit, AfterViewInit, OnDestroy,
20
15
  private flowSettingsService;
21
16
  private selectionService;
22
17
  private hostRef;
18
+ nodeModel: NodeModel;
19
+ nodeHtmlTemplate?: TemplateRef<any>;
20
+ nodeContentRef: ElementRef<SVGGraphicsElement>;
21
+ htmlWrapperRef: ElementRef<HTMLDivElement>;
23
22
  protected showMagnet: import("@angular/core").Signal<boolean>;
23
+ protected styleWidth: import("@angular/core").Signal<string>;
24
+ protected styleHeight: import("@angular/core").Signal<string>;
24
25
  private subscription;
25
26
  ngOnInit(): void;
26
27
  ngAfterViewInit(): void;
@@ -22,6 +22,7 @@ export declare class VflowComponent {
22
22
  private edgesChangeService;
23
23
  private nodeRenderingService;
24
24
  private flowSettingsService;
25
+ private componentEventBusService;
25
26
  private injector;
26
27
  /**
27
28
  * Size for flow view
@@ -76,6 +77,12 @@ export declare class VflowComponent {
76
77
  */
77
78
  set edges(newEdges: Edge[]);
78
79
  protected edgeModels: Signal<EdgeModel[]>;
80
+ /**
81
+ * Event that accumulates all custom node events
82
+ *
83
+ * @experimental
84
+ */
85
+ onComponentNodeEvent: any;
79
86
  protected nodeHtmlDirective?: NodeHtmlTemplateDirective;
80
87
  protected edgeTemplateDirective?: EdgeTemplateDirective;
81
88
  protected edgeLabelHtmlDirective?: EdgeLabelHtmlTemplateDirective;
@@ -139,6 +146,6 @@ export declare class VflowComponent {
139
146
  protected trackNodes(idx: number, { node }: NodeModel): Node<unknown>;
140
147
  protected trackEdges(idx: number, { edge }: EdgeModel): Edge<unknown>;
141
148
  static ɵfac: i0.ɵɵFactoryDeclaration<VflowComponent, never>;
142
- 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; }; }, {}, ["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"; }; }]>;
149
+ 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"; }; }]>;
143
150
  static ngAcceptInputType_connection: i3.ConnectionSettings;
144
151
  }
@@ -12,12 +12,12 @@ export declare class SpacePointContextDirective {
12
12
  pointerMovement: Signal<{
13
13
  x: number;
14
14
  y: number;
15
- target: Element | null;
16
- originalEvent: TouchEvent;
15
+ originalEvent: MouseEvent;
17
16
  } | {
18
17
  x: number;
19
18
  y: number;
20
- originalEvent: MouseEvent;
19
+ target: Element | null;
20
+ originalEvent: TouchEvent;
21
21
  } | undefined>;
22
22
  static ɵfac: i0.ɵɵFactoryDeclaration<SpacePointContextDirective, never>;
23
23
  static ɵdir: i0.ɵɵDirectiveDeclaration<SpacePointContextDirective, "g[spacePointContext]", never, {}, {}, never, never, false, never>;
@@ -0,0 +1,32 @@
1
+ import { EventEmitter } from "@angular/core";
2
+ import { CustomNodeComponent } from "../public-components/custom-node.component";
3
+ type EventInfo<T> = T extends EventEmitter<infer U> ? U : never;
4
+ type EventKeys<T> = {
5
+ [K in keyof T]: T[K] extends EventEmitter<any> ? K : never;
6
+ }[keyof T];
7
+ type EventShape<T, K extends keyof T> = {
8
+ [P in K]: {
9
+ eventName: P;
10
+ eventPayload: EventInfo<T[P]>;
11
+ };
12
+ }[K];
13
+ type EventsFromComponent<T> = EventShape<T, EventKeys<T>>;
14
+ /**
15
+ * Event of custom component node
16
+ *
17
+ * Generic accepts array of custom components and merge their event emitters for type-safe
18
+ * event handling
19
+ *
20
+ * @experimental
21
+ */
22
+ export type ComponentNodeEvent<T extends CustomNodeComponent[]> = {
23
+ nodeId: string;
24
+ } & {
25
+ [I in keyof T]: EventsFromComponent<T[I]>;
26
+ }[number];
27
+ export type AnyComponentNodeEvent = {
28
+ nodeId: string;
29
+ eventName: string;
30
+ eventPayload: unknown;
31
+ };
32
+ export {};
@@ -1,5 +1,7 @@
1
+ import { Type } from "@angular/core";
1
2
  import { Point } from "./point.interface";
2
- export type Node<T = unknown> = SharedNode & (DefaultNode | HtmlTemplateNode<T>);
3
+ import { CustomNodeComponent } from "../public-components/custom-node.component";
4
+ export type Node<T = unknown> = SharedNode & (DefaultNode | HtmlTemplateNode<T> | ComponentNode<T>);
3
5
  export interface SharedNode {
4
6
  id: string;
5
7
  point: Point;
@@ -8,8 +10,14 @@ export interface SharedNode {
8
10
  export interface DefaultNode {
9
11
  type: 'default';
10
12
  text?: string;
13
+ width?: number;
14
+ height?: number;
11
15
  }
12
16
  export interface HtmlTemplateNode<T = unknown> {
13
17
  type: 'html-template';
14
18
  data?: T;
15
19
  }
20
+ export interface ComponentNode<T = unknown> {
21
+ type: Type<CustomNodeComponent<T>>;
22
+ data?: T;
23
+ }
@@ -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
  };
@@ -1,10 +1,17 @@
1
1
  import { Node } from '../interfaces/node.interface';
2
2
  import { HandleModel } from './handle.model';
3
3
  import { FlowEntity } from '../interfaces/flow-entity.interface';
4
+ import { Point } from '../interfaces/point.interface';
4
5
  export declare class NodeModel<T = unknown> implements FlowEntity {
5
6
  node: Node<T>;
7
+ static defaultTypeSize: {
8
+ width: number;
9
+ height: number;
10
+ };
6
11
  private flowSettingsService;
7
- point: import("@angular/core").WritableSignal<{
12
+ private internalPoint$;
13
+ private throttledPoint$;
14
+ point: import("@angular/core").Signal<{
8
15
  x: number;
9
16
  y: number;
10
17
  }>;
@@ -26,5 +33,11 @@ export declare class NodeModel<T = unknown> implements FlowEntity {
26
33
  handles$: import("rxjs").Observable<HandleModel[]>;
27
34
  draggable: boolean;
28
35
  readonly magnetRadius = 20;
36
+ isComponentType: boolean;
37
+ componentTypeInputs: import("@angular/core").Signal<{
38
+ node: Node<T>;
39
+ _selected: boolean;
40
+ }>;
29
41
  constructor(node: Node<T>);
42
+ setPoint(point: Point): void;
30
43
  }
@@ -0,0 +1,20 @@
1
+ import { DestroyRef, OnInit } from "@angular/core";
2
+ import { ComponentNode, SharedNode } from '../interfaces/node.interface';
3
+ import * as i0 from "@angular/core";
4
+ export declare abstract class CustomNodeComponent<T = unknown> implements OnInit {
5
+ private eventBus;
6
+ protected destroyRef: DestroyRef;
7
+ /**
8
+ * Reference to node bound to this component
9
+ */
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>;
16
+ ngOnInit(): void;
17
+ private trackEvents;
18
+ 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>;
20
+ }
@@ -0,0 +1,9 @@
1
+ import { AnyComponentNodeEvent } from '../interfaces/component-node-event.interface';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ComponentEventBusService {
4
+ private _event$;
5
+ event$: import("rxjs").Observable<AnyComponentNodeEvent>;
6
+ pushEvent(event: AnyComponentNodeEvent): void;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<ComponentEventBusService, never>;
8
+ static ɵprov: i0.ɵɵInjectableDeclaration<ComponentEventBusService>;
9
+ }
@@ -5,7 +5,10 @@ import * as i0 from "@angular/core";
5
5
  export interface ViewportForSelection {
6
6
  start: ViewportState;
7
7
  end: ViewportState;
8
- target: Element;
8
+ /**
9
+ * Target may not exist if viewport change made programmatically
10
+ */
11
+ target?: Element;
9
12
  }
10
13
  export declare class SelectionService {
11
14
  private static delta;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-vflow",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://www.ngx-vflow.org/",
6
6
  "author": "Artem Mangilev",
package/public-api.d.ts CHANGED
@@ -9,11 +9,13 @@ export * from './lib/vflow/interfaces/connection-settings.interface';
9
9
  export * from './lib/vflow/interfaces/handle-positions.interface';
10
10
  export * from './lib/vflow/interfaces/marker.interface';
11
11
  export { ViewportState } from './lib/vflow/interfaces/viewport.interface';
12
+ export * from './lib/vflow/interfaces/component-node-event.interface';
12
13
  export * from './lib/vflow/types/node-change.type';
13
14
  export * from './lib/vflow/types/edge-change.type';
14
15
  export * from './lib/vflow/types/position.type';
15
16
  export * from './lib/vflow/components/vflow/vflow.component';
16
17
  export * from './lib/vflow/components/handle/handle.component';
18
+ export * from './lib/vflow/public-components/custom-node.component';
17
19
  export * from './lib/vflow/directives/template.directive';
18
20
  export * from './lib/vflow/directives/connection-controller.directive';
19
21
  export * from './lib/vflow/directives/changes-controller.directive';