UNPKG

diagram-js

Version:

A toolbox for displaying and modifying diagrams on the web

135 lines (112 loc) 3.1 kB
import { assign, filter, forEach, isNumber, map, omit, pick, values } from 'min-dash'; import { getBBox, getParents } from '../../../util/Elements'; import { isConnection, isLabel } from '../../../util/ModelUtil'; /** * @typedef {import('../Modeling').default} Modeling */ var round = Math.round; /** * @param {Modeling} modeling */ export default function CreateElementsHandler(modeling) { this._modeling = modeling; } CreateElementsHandler.$inject = [ 'modeling' ]; CreateElementsHandler.prototype.preExecute = function(context) { var elements = context.elements, parent = context.parent, parentIndex = context.parentIndex, position = context.position, hints = context.hints; var modeling = this._modeling; // make sure each element has x and y forEach(elements, function(element) { if (!isNumber(element.x)) { element.x = 0; } if (!isNumber(element.y)) { element.y = 0; } }); var visibleElements = filter(elements, function(element) { return !element.hidden; }); var bbox = getBBox(visibleElements); // center elements around position forEach(elements, function(element) { if (isConnection(element)) { element.waypoints = map(element.waypoints, function(waypoint) { return { x: round(waypoint.x - bbox.x - bbox.width / 2 + position.x), y: round(waypoint.y - bbox.y - bbox.height / 2 + position.y) }; }); } assign(element, { x: round(element.x - bbox.x - bbox.width / 2 + position.x), y: round(element.y - bbox.y - bbox.height / 2 + position.y) }); }); var parents = getParents(elements); var cache = {}; forEach(elements, function(element) { if (isConnection(element)) { cache[ element.id ] = isNumber(parentIndex) ? modeling.createConnection( cache[ element.source.id ], cache[ element.target.id ], parentIndex, element, element.parent || parent, hints ) : modeling.createConnection( cache[ element.source.id ], cache[ element.target.id ], element, element.parent || parent, hints ); return; } var createShapeHints = assign({}, hints); if (parents.indexOf(element) === -1) { createShapeHints.autoResize = false; } if (isLabel(element)) { createShapeHints = omit(createShapeHints, [ 'attach' ]); } cache[ element.id ] = isNumber(parentIndex) ? modeling.createShape( element, pick(element, [ 'x', 'y', 'width', 'height' ]), element.parent || parent, parentIndex, createShapeHints ) : modeling.createShape( element, pick(element, [ 'x', 'y', 'width', 'height' ]), element.parent || parent, createShapeHints ); }); context.elements = values(cache); };