camunda-bpmn-js
Version:
Embeddable Camunda modeling distributions based on bpmn-js
102 lines (86 loc) • 2.91 kB
JavaScript
/**
* Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership.
*
* Camunda licenses this file to you under the MIT; you may not use this file
* except in compliance with the MIT License.
*/
/**
* @typedef {import('didi').Injector} Injector
* @typedef {import('bpmn-js/lib/model/Types').ModdleElement} ModdleElement
* @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntries} PopupMenuEntries
*/
/**
* @typedef {object} Config
* @property {string} resourceType
* @property {string} className
* @property {string} groupName
* @property {(resource: any, injector: Injector) => ModdleElement} createElement
* @property {string} [search]
*/
export class BaseCreateMenuProvider {
/**
* @param {import('didi').Injector} injector
* @param {Config} config
*/
constructor(injector, config) {
this._injector = injector;
this._elementFactory = injector.get('elementFactory');
this._bpmnFactory = injector.get('bpmnFactory');
this._popupMenu = injector.get('popupMenu');
this._create = injector.get('create');
this._autoPlace = injector.get('autoPlace');
this._mouse = injector.get('mouse');
this._translate = injector.get('translate');
this._resources = injector.get('resources');
injector.get('popupMenu').registerProvider('bpmn-create', this);
this._config = config;
}
/**
* @returns {PopupMenuEntries}
*/
getPopupMenuEntries() {
const {
resourceType,
groupName,
createElement,
...additionalConfig
} = this._config;
const resources = this._resources.filter(r => r.type === resourceType);
const entries = {};
resources.forEach((resource, index) => {
const getTarget = () => createElement(resource, this._injector);
entries[`resources-create-${resourceType}-${index}`] = {
label: resource.name,
action: this._createEntryAction(getTarget),
group: {
id: groupName.toLowerCase(),
name: this._translate(groupName)
},
...additionalConfig
};
});
return entries;
}
_createEntryAction(getTarget) {
const create = this._create;
const mouse = this._mouse;
const popupMenu = this._popupMenu;
const elementFactory = this._elementFactory;
return (event) => {
popupMenu.close();
const businessObject = getTarget();
const element = elementFactory.createShape({
type: businessObject.$type,
businessObject: businessObject
});
// use last mouse event if triggered via keyboard
if (event instanceof KeyboardEvent) {
event = mouse.getLastMoveEvent();
}
return create.start(event, element);
};
}
}