0.6.1 • Published 1 month ago

bot-flow-editor v0.6.1

Weekly downloads
-
License
ISC
Repository
-
Last release
1 month ago

Design

export type Event<T = any, D = any> = {
  type: string;
  target: T;
  data: D;
};

export interface Point {
  x: number;
  y: number;
}

export interface Size {
  width: number;
  height: number;
}
export interface Distance {
  dx: number;
  dy: number;
}
export type NodeEvent<D> = Event<ActionNode, D>;
export type EditorEvent<D> = Event<FlowEditor, D>;

export interface ActionNodePort {
  readonly index: number;
  readonly actionNode: ActionNode;
}

export class ActionNode {
  readonly x: number;
  readonly y: number;
  readonly width: number;
  readonly selected: boolean;

  height: number;

  getPort(index: number): Point[];

  draw(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D): void;

  copy(options: { dx: number; dy: number }): ActionNode;
}

interface NodeGraph<TNode = unknown> {
  nodes: Iterable<TNode>;
  getNextNodes(node: TNode): Iterable<TNode>;
}

export interface FlowEditor {
  import(graph: NodeGraph<ActionNode>): void;
  export(): NodeGraph<ActionNode>;

  zoom(scale: number): void;
  readonly zoomScale: number;

  readonly hasMoreUndo: boolean;
  readonly hasMoreRedo: boolean;
  undo(): void;
  redo(): void;

  autoLayout(): void;
  selectAll(): void;

  // 3 cases:
  //   1) port is not connected
  //   2) port is already connected to another node, disconnect it first
  //   3) port is connected to a new node, add node to the graph and connect it
  connectTo(
    fromNode: ActionNode,
    fromNodePortIndex: number,
    toNode: ActionNode,
  ): void;

  addNode(node: ActionNode, pos: Point): void;
  removeNode(node: ActionNode): void;
  removeSelectedNodes(): void;
  addNodePort(node: ActionNode, index?: number): void;
  removeNodePort(node: ActionNode, index: number): void;

  beginEditNode(): void;
  endEditNode(): void;

  onSelectNode(
    callback: (e: NodeEvent<{ selectedNodes: ActionNode[] }>) => void,
  ): void;
  onNewNode(
    callback: (
      e: EditorEvent<{
        fromNode?: ActionNode;
        fromPortIndex?: number;
        x: number;
        y: number;
      }>,
    ) => void,
  ): void;

  readonly isModified: boolean;
  onIsModifiedChanged(
    callback: (
      e: EditorEvent<{
        cmd:
          | "undo"
          | "redo"
          | "zoom"
          | "auto-layout"
          | "select-all"
          | "node-cmd"
          | "edge-cmd";
      }>,
    ) => void,
  ): void;
}
0.6.1

1 month ago

0.6.0

1 month ago

0.5.2

1 month ago

0.5.1

1 month ago

0.5.0

1 month ago

0.4.3

1 month ago

0.4.2

1 month ago

0.3.6

1 month ago

0.3.5

1 month ago

0.4.1

1 month ago

0.4.0

1 month ago

0.3.0

1 month ago

0.3.2

1 month ago

0.3.1

1 month ago

0.3.4

1 month ago

0.3.3

1 month ago

0.2.20

1 month ago

0.2.19

2 months ago

0.2.18

2 months ago

0.2.16

2 months ago

0.2.15

2 months ago

0.2.14

2 months ago

0.2.13

2 months ago

0.2.17

2 months ago

0.2.12

2 months ago

0.2.11

2 months ago

0.2.10

2 months ago

0.2.9

2 months ago

0.2.8

2 months ago

0.2.7

2 months ago

0.2.6

2 months ago

0.2.3

2 months ago

0.2.5

2 months ago

0.2.1

2 months ago

0.2.0

2 months ago

0.2.2

2 months ago

0.1.1

2 months ago

0.1.0

2 months ago