123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import {
- filter
- } from 'min-dash';
- import {
- eachElement
- } from 'diagram-js/lib/util/Elements';
- import {
- getLanesRoot,
- getChildLanes,
- LANE_INDENTATION
- } from '../util/LaneUtil';
- /**
- * A handler that allows us to add a new lane
- * above or below an existing one.
- *
- * @param {Modeling} modeling
- * @param {SpaceTool} spaceTool
- */
- export default function AddLaneHandler(modeling, spaceTool) {
- this._modeling = modeling;
- this._spaceTool = spaceTool;
- }
- AddLaneHandler.$inject = [
- 'modeling',
- 'spaceTool'
- ];
- AddLaneHandler.prototype.preExecute = function(context) {
- var spaceTool = this._spaceTool,
- modeling = this._modeling;
- var shape = context.shape,
- location = context.location;
- var lanesRoot = getLanesRoot(shape);
- var isRoot = lanesRoot === shape,
- laneParent = isRoot ? shape : shape.parent;
- var existingChildLanes = getChildLanes(laneParent);
- // (0) add a lane if we currently got none and are adding to root
- if (!existingChildLanes.length) {
- modeling.createShape({ type: 'bpmn:Lane' }, {
- x: shape.x + LANE_INDENTATION,
- y: shape.y,
- width: shape.width - LANE_INDENTATION,
- height: shape.height
- }, laneParent);
- }
- // (1) collect affected elements to create necessary space
- var allAffected = [];
- eachElement(lanesRoot, function(element) {
- allAffected.push(element);
- // handle element labels in the diagram root
- if (element.label) {
- allAffected.push(element.label);
- }
- if (element === shape) {
- return [];
- }
- return filter(element.children, function(c) {
- return c !== shape;
- });
- });
- var offset = location === 'top' ? -120 : 120,
- lanePosition = location === 'top' ? shape.y : shape.y + shape.height,
- spacePos = lanePosition + (location === 'top' ? 10 : -10),
- direction = location === 'top' ? 'n' : 's';
- var adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);
- spaceTool.makeSpace(
- adjustments.movingShapes,
- adjustments.resizingShapes,
- { x: 0, y: offset },
- direction,
- spacePos
- );
- // (2) create new lane at open space
- context.newLane = modeling.createShape({ type: 'bpmn:Lane' }, {
- x: shape.x + (isRoot ? LANE_INDENTATION : 0),
- y: lanePosition - (location === 'top' ? 120 : 0),
- width: shape.width - (isRoot ? LANE_INDENTATION : 0),
- height: 120
- }, laneParent);
- };
|