1.0.0 • Published 1 year ago

dag-builder-js v1.0.0

Weekly downloads
-
License
GPL-3.0-or-later
Repository
github
Last release
1 year ago

Directed-Acyclic-Graph-Builder-js (dag-builder-js)

https://www.npmjs.com/package/dag-builder-js https://www.npmjs.com/package/dag-builder-js

What is this?

dag-builder-js is a simple-to-use Javascript DAG library with support to N:N vertices/edges. It supports validating that no cycle can be created in real-time, import/export states and it's built on SVG so you can render graphs pretty much anywhere.

Demo

Demo

Live demo: https://paulomigalmeida.github.io/directed-acyclic-graph-builder-js/demo/public/index.html

Running the demo in your computer can be achieved by running:

# build dag-builder-js
cd <root-dir>
npm install
npm run build

# build & start demo
cd ./demo
npm install
npm run start

Installation

Adding dag-builder-js is pretty simple:

Minified version

<script src='https://cdn.jsdelivr.net/npm/dag-builder-js' type="module" charset="utf-8"></script>

Debug version

<script src='https://cdn.jsdelivr.net/npm/dag-builder-js/dist/dag.debug.js' type="module" charset="utf-8"></script>

Or

npm i dag-builder-js --save

Usage

Define a container in which the DAG will be rendered

<div id="graph"></div>

Initialise DAG builder

import {
    Graph,
    Vertex,
    MouseCoordinate,
    ShapeSize,
    InputVertexConnector,
    CustomInputVertexConnector,
    OutputVertexConnector,
    GraphSerializable,
} from "dag-builder-js"; // (~70kb)

/* Dag-Builder-JS initialisation */
const graph = new Graph('#graph');

/* Optional Event Listeners */
const onVertexAdded = (type, graph, vertex) => {};
graph.addVertexAddedListener(onVertexAdded);

const onVertexRemoved = (type, graph, vertex) => {};
graph.addVertexRemovedListener(onVertexRemoved);

const onEdgeAdded = (type, graph, edge) => {};
graph.addEdgeAddedListener(onEdgeAdded);

const onEdgeRemoved = (type, graph, edge) => {};
graph.addEdgeRemovedListener(onEdgeRemoved);

const onCustomInputEdgeConnectorClicked = (type, graph, vertex, edge, event) => {};
graph.addCustomInputEdgeConnectorClickedListener(onCustomInputEdgeConnectorClicked);

/* Common operations */
graph.appendVertex(new Vertex(
    // location
    new MouseCoordinate(100, 100),
    // size
    new ShapeSize(200, 100),
    // title
    'Vertex Title',
    // inputs
    [
        new InputVertexConnector(0, 'data_in', "type1"),
        new InputVertexConnector(1, 'other_in', 'type2'),

        /* this is an InputVertexConnector that can hold a custom value */
        new CustomInputVertexConnector(2, 'other_in', 'type2', 42),
    ],
    // outputs
    [new OutputVertexConnector(0, 'data_out', 'type3')],
));

/* render changes */
graph.update();

Callbacks

onVertexAdded

function onVertexAdded(type, graph, vertex){
	// When vertex is added to graph
}

Gets triggered when vertex is appended to graph.

ParameterTypeDescription
typenumberevent code (see more at: ACTION_TYPE)
graphGraphGraph instance
vertexVertexVertex added

onVertexRemoved

function onVertexRemoved(type, graph, vertex){
	// When vertex is removed from graph
}

Gets triggered when vertex is removed from graph.

ParameterTypeDescription
typenumberevent code (see more at: ACTION_TYPE)
graphGraphGraph instance
vertexVertexVertex removed

onEdgeAdded

function onEdgeAdded(type, graph, edge){
	// When edge is added to graph
}

Gets triggered when edge is appended to graph.

ParameterTypeDescription
typenumberevent code (see more at: ACTION_TYPE)
graphGraphGraph instance
edgeEdgeEdge added

onEdgeRemoved

function onEdgeRemoved(type, graph, edge){
	// When edge is removed from graph
}

Gets triggered when edge is removed from graph.

ParameterTypeDescription
typenumberevent code (see more at: ACTION_TYPE)
graphGraphGraph instance
edgeEdgeEdge removed

onCustomInputEdgeConnectorClicked

function onCustomInputEdgeConnectorClicked(type, graph, vertex, edge, event){
	// When CustomInputEdgeConnector is clicked
}

Gets triggered CustomInputEdgeConnector is clicked

ParameterTypeDescription
typenumberevent code (see more at: ACTION_TYPE)
graphGraphGraph instance
vertexVertexVertex removed
edgeEdgeEdge removed
eventobjectDOM event

Features

  • Zooming/Pan Gestures
  • Select Vertices/Edges
  • Delete Vertices/Edges
  • Move Vertices
  • Import/Export Graph State
  • Real-time acyclic validation (prevent users from creating cycles)
  • N:N Edges Connections
  • Public-facing callbacks for common operations (add/rem)
  • Npm package

Credits/Inspiration/Pieces of code I got from other projects

Flowy

Repository: alyssaxuu/flowy

I got the demo page HTML/CSS and some ideas for documentation and callback listeners. It's a very interesting project and the fact that Alyssa did it all in vanilla javascript is commendable. Kudos to her.

Directed-Graph-Creator

Repository: cjrd/directed-graph-creator

I got a lot of inspiration from the implemenation that @cjrd has written so he also deserves to be listed here. I got the import/export idea from his implementation and learned that I could use d3 for SVG manipulation (which I didn't know at the time).

1.0.0

1 year ago

0.0.15

2 years ago

0.0.14

2 years ago

0.0.13

2 years ago

0.0.12

2 years ago

0.0.11

2 years ago

0.0.10

2 years ago

0.0.9

2 years ago

0.0.8

2 years ago

0.0.7

2 years ago

0.0.6

2 years ago

0.0.5

2 years ago

0.0.4

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago