ngx-diagrams
Version:
> Light Weight, Modular, Typed Diagram Engine for Angular
61 lines • 8.42 kB
JavaScript
import { Injectable } from '@angular/core';
import * as dagre from 'dagre';
import { PointModel } from '../models';
export class DagreEngine {
instantiate() {
try {
this.g = new dagre.graphlib.Graph({ multigraph: true });
}
catch (error) {
console.warn("`dagre` packages isn't installed, please install it before using the DagreEngine plugin");
}
}
redistribute(model, options = {}) {
this.instantiate();
this.g.setGraph(options.graph || {});
this.g.setDefaultEdgeLabel(() => {
return {};
});
const processedlinks = {};
// set nodes
model.getNodes().forEach((node) => {
this.g.setNode(node.id, {
width: node.getWidth(),
height: node.getHeight()
});
});
model.getLinks().forEach((link) => {
// set edges
if (link.getSourcePort() && link.getTargetPort()) {
processedlinks[link.id] = true;
this.g.setEdge({
v: link.getSourcePort().getNode().id,
w: link.getTargetPort().getNode().id,
name: link.id
});
}
});
// layout the graph
dagre.layout(this.g, options.layout);
this.g.nodes().forEach((v) => {
const { x, y } = this.g.node(v);
model.getNode(v).setCoords({ x, y });
});
// also include links?
if (options.includeLinks) {
this.g.edges().forEach((e) => {
const edge = this.g.edge(e);
const link = model.getLink(e.name);
const points = [link.getFirstPoint()];
for (let i = 1; i < edge.points.length - 2; i++) {
points.push(new PointModel(link, { x: edge.points[i].x, y: edge.points[i].y }));
}
link.setPoints(points.concat(link.getLastPoint()));
});
}
}
}
DagreEngine.decorators = [
{ type: Injectable }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFncmUtZW5naW5lLnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvcGx1Z2lucy9kYWdyZS1lbmdpbmUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFnQixVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZckQsTUFBTSxPQUFPLFdBQVc7SUFHdEIsV0FBVztRQUNULElBQUk7WUFDRixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDO1NBQ3pHO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFtQixFQUFFLFVBQThCLEVBQUU7UUFDaEUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5CLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sY0FBYyxHQUE4QixFQUFFLENBQUM7UUFFckQsWUFBWTtRQUNaLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7YUFDekIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDaEMsWUFBWTtZQUNaLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtnQkFDaEQsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUNiLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtvQkFDcEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO29CQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7aUJBQ2QsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILG1CQUFtQjtRQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsc0JBQXNCO1FBQ3RCLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN4QixJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRW5DLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDakY7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7OztZQWhFRixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgZGFncmUgZnJvbSAnZGFncmUnO1xuaW1wb3J0IHsgRWRnZUNvbmZpZywgR3JhcGhMYWJlbCwgTm9kZUNvbmZpZyB9IGZyb20gJ2RhZ3JlJztcbmltcG9ydCB7IERpYWdyYW1Nb2RlbCwgUG9pbnRNb2RlbCB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFncmVFbmdpbmVPcHRpb25zIHtcbiAgZ3JhcGg/OiBHcmFwaExhYmVsO1xuICBsYXlvdXQ/OiBHcmFwaExhYmVsICYgTm9kZUNvbmZpZyAmIEVkZ2VDb25maWc7XG4gIC8qKlxuICAgKiBXaWxsIGFsc28gbGF5b3V0IGxpbmtzXG4gICAqL1xuICBpbmNsdWRlTGlua3M/OiBib29sZWFuO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGFncmVFbmdpbmUge1xuICBnOiBkYWdyZS5ncmFwaGxpYi5HcmFwaDtcblxuICBpbnN0YW50aWF0ZSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5nID0gbmV3IGRhZ3JlLmdyYXBobGliLkdyYXBoKHsgbXVsdGlncmFwaDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiYGRhZ3JlYCBwYWNrYWdlcyBpc24ndCBpbnN0YWxsZWQsIHBsZWFzZSBpbnN0YWxsIGl0IGJlZm9yZSB1c2luZyB0aGUgRGFncmVFbmdpbmUgcGx1Z2luXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJlZGlzdHJpYnV0ZShtb2RlbDogRGlhZ3JhbU1vZGVsLCBvcHRpb25zOiBEYWdyZUVuZ2luZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIHRoaXMuaW5zdGFudGlhdGUoKTtcblxuICAgIHRoaXMuZy5zZXRHcmFwaChvcHRpb25zLmdyYXBoIHx8IHt9KTtcblxuICAgIHRoaXMuZy5zZXREZWZhdWx0RWRnZUxhYmVsKCgpID0+IHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb2Nlc3NlZGxpbmtzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgICAvLyBzZXQgbm9kZXNcbiAgICBtb2RlbC5nZXROb2RlcygpLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIHRoaXMuZy5zZXROb2RlKG5vZGUuaWQsIHtcbiAgICAgICAgd2lkdGg6IG5vZGUuZ2V0V2lkdGgoKSxcbiAgICAgICAgaGVpZ2h0OiBub2RlLmdldEhlaWdodCgpXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIG1vZGVsLmdldExpbmtzKCkuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgLy8gc2V0IGVkZ2VzXG4gICAgICBpZiAobGluay5nZXRTb3VyY2VQb3J0KCkgJiYgbGluay5nZXRUYXJnZXRQb3J0KCkpIHtcbiAgICAgICAgcHJvY2Vzc2VkbGlua3NbbGluay5pZF0gPSB0cnVlO1xuICAgICAgICB0aGlzLmcuc2V0RWRnZSh7XG4gICAgICAgICAgdjogbGluay5nZXRTb3VyY2VQb3J0KCkuZ2V0Tm9kZSgpLmlkLFxuICAgICAgICAgIHc6IGxpbmsuZ2V0VGFyZ2V0UG9ydCgpLmdldE5vZGUoKS5pZCxcbiAgICAgICAgICBuYW1lOiBsaW5rLmlkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gbGF5b3V0IHRoZSBncmFwaFxuICAgIGRhZ3JlLmxheW91dCh0aGlzLmcsIG9wdGlvbnMubGF5b3V0KTtcblxuICAgIHRoaXMuZy5ub2RlcygpLmZvckVhY2goKHYpID0+IHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nLm5vZGUodik7XG4gICAgICBtb2RlbC5nZXROb2RlKHYpLnNldENvb3Jkcyh7IHgsIHkgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBhbHNvIGluY2x1ZGUgbGlua3M/XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxpbmtzKSB7XG4gICAgICB0aGlzLmcuZWRnZXMoKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmcuZWRnZShlKTtcbiAgICAgICAgY29uc3QgbGluayA9IG1vZGVsLmdldExpbmsoZS5uYW1lKTtcblxuICAgICAgICBjb25zdCBwb2ludHMgPSBbbGluay5nZXRGaXJzdFBvaW50KCldO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGVkZ2UucG9pbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgIHBvaW50cy5wdXNoKG5ldyBQb2ludE1vZGVsKGxpbmssIHsgeDogZWRnZS5wb2ludHNbaV0ueCwgeTogZWRnZS5wb2ludHNbaV0ueSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluay5zZXRQb2ludHMocG9pbnRzLmNvbmNhdChsaW5rLmdldExhc3RQb2ludCgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==