@haroldiedema/flow-graph
TypeScript icon, indicating that this package has built-in type declarations

1.0.3 • Public • Published

Flow-Graph

Flow-graph is a zero-dependency graph visualizer and editor. It is designed for building and maintaining business automation processes, but can be utilized for other purposes as well.

Installation

Using yarn

$ yarn add @haroldiedema/flow-graph

Or NPM

npm i -S @haroldiedema/flow-graph

Getting started

In order to initialize flow-graph, we first need a point in our DOM to attach to. This element will function as 'viewport' for our graph editor.

<div id="fg"></div>
import {FlowGraph} from '@haroldiedema/flow-graph';

const fg = new FlowGraph(document.getElementById('fg'));

You will now see an empty grid in which you can pan the camera around. You won't be able to do anything else yet, because the template registry is currently empty.

Node templates

Before you can add nodes to the graph, flow-graph needs to know about what can be added to it. You'll need to define templates which consist of a unique identifier that identifies the template, a display name, a description, input and output sockets and so on.

A template can be defined like this:

import {FlowGraph, NodeType} from '@haroldiedema/flow-graph';

const fg = new FlowGraph(document.getElementById('fg'));

fg.registerNodeTemplate({
    name: "Email the customer",
    type: "ACTION",
    systemName: "my.backend.logic.sendMailByTemplate",
    description: "Send an email to the customer by the given mail template.",
    inputs: [
        {
            name: "MAIL_TEMPLATE",
            type: "string",
            label: "Mail template"
        }
    ],
    outputs: [
        {
            name: "success",
            label: "Email sent successfully"
        }, {
            name: "tpl_not_found",
            label: "Mail template not found"
        }, {
            name: "failed",
            label: "Could not send email"
        }
    ]
});

When you right-click on the grid, the fuzzy-finder will open and you'll see that the node "Email the customer" is now available. Clicking it will insert the node into the graph at the location of the cursor when you opened the fuzzy-finder.

Template parameters

name type description
name string The display name of the node.
type NodeType Denotes the visual representation of a node. Can be one of the following: ACTION, CONDITION, SUCCESS, FAILURE.
systemName string This name isn't used by flow-graph itself, but exported to the JSON object when the graph is exported. This name is used to identify the functionality of the node by your own software.
description string A longer description of the node. Visible when hovering over an option inside the fuzzy-finder.
inputs Input[] A list of inputs. See below.
outputs OutputSocket[] A list of output sockets. See below

Input parameters

name type description
name string The name of the socket. Used in the parameters object of the exported JSON.
type string The data type of the input. Can be one of string, number, boolean or select.
label string The label to display in the rendered node for this input.
items object A key/value object of items to show if type is set to select.

Output parameters

name type description
name string The name - or rather identifier - of the output socket. This is a key in the exitStates object in the exported JSON that connects this node to another.
label string The label to show on the rendered node for this output socket.

Importing & Exporting graphs

const data = fg.export();

The method export of FlowGraph will return a JSON object that represents the current state of the graph. The steps object contains a list of placed nodes, indexed by the ID of the node. Exit states of nodes reference the ID of the node to determine where to go next in the process/flow.

{
    "steps": {
        "step2": {
            "systemName": "my.backend.logic.sendMailByTemplate",
            "parameters": {
                "MAIL_TEMPLATE": ""
            },
            "exitStates": {},
            "position": {
                "x": 774,
                "y": 199
            }
        },
        "entry": {
            "systemName": "my.backend.logic.sendMailByTemplate",
            "parameters": {
                "MAIL_TEMPLATE": ""
            },
            "exitStates": {
                "success": "step2",
                "tpl_not_found": "step2",
                "failed": "step2"
            },
            "position": {
                "x": 193,
                "y": 207
            }
        }
    }
}

The same object can be imported using the import method on FlowGraph.

fg.import(data);

Importing data will clear the existing graph before rendering the imported data.

Events

The FlowGraph instance is an EventEmitter type. You can listen to these events by using the once, on or when methods.

For example:

fg.on('select', (node: Node) => {
    console.log(`${node.systemName} is selected!`);
});

The listen methods return an EventSubscriber object which can be used to unsubscribe a listener like so:

const subscriber = fg.on('select', (node: Node) => {
    // Do stuff.
});

// Unsubscribe.
subscriber.unsubscribe();

// Or...
fg.off(subscriber);

select

Callback signature: (node: Node) => any

Invokes the given callback function when a node is selected by the user.

deselect

Callback signature: (node: Node) => any

Invokes the given callback function when a node is deselected by the user.

Package Sidebar

Install

npm i @haroldiedema/flow-graph

Weekly Downloads

5

Version

1.0.3

License

MIT

Unpacked Size

353 kB

Total Files

47

Last publish

Collaborators

  • haroldiedema