UNPKG

bpmn-js

Version:

A bpmn 2.0 toolkit and web modeler

106 lines (85 loc) 2.65 kB
import { assign } from 'min-dash'; import ICONS from './AlignElementsIcons'; /** * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').default} ContextPad * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate * * @typedef {import('../../model/Types').Element} Element * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').ContextPadEntries} ContextPadEntries * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').default} ContextPadProvider */ var LOW_PRIORITY = 900; /** * A provider for the `Align elements` context pad entry. * * @implements {ContextPadProvider} * * @param {ContextPad} contextPad * @param {PopupMenu} popupMenu * @param {Translate} translate * @param {Canvas} canvas */ export default function AlignElementsContextPadProvider(contextPad, popupMenu, translate, canvas) { contextPad.registerProvider(LOW_PRIORITY, this); this._contextPad = contextPad; this._popupMenu = popupMenu; this._translate = translate; this._canvas = canvas; } AlignElementsContextPadProvider.$inject = [ 'contextPad', 'popupMenu', 'translate', 'canvas' ]; /** * @param {Element[]} elements * * @return {ContextPadEntries} */ AlignElementsContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) { var actions = {}; if (this._isAllowed(elements)) { assign(actions, this._getEntries(elements)); } return actions; }; AlignElementsContextPadProvider.prototype._isAllowed = function(elements) { return !this._popupMenu.isEmpty(elements, 'align-elements'); }; AlignElementsContextPadProvider.prototype._getEntries = function() { var self = this; return { 'align-elements': { group: 'align-elements', title: self._translate('Align elements'), imageUrl: ICONS['align'], action: { click: function(event, target) { var position = self._getMenuPosition(target); assign(position, { cursor: { x: event.x, y: event.y } }); self._popupMenu.open(target, 'align-elements', position); } } } }; }; AlignElementsContextPadProvider.prototype._getMenuPosition = function(elements) { var Y_OFFSET = 5; var pad = this._contextPad.getPad(elements).html; var padRect = pad.getBoundingClientRect(); var pos = { x: padRect.left, y: padRect.bottom + Y_OFFSET }; return pos; };