camunda-bpmn-js
Version:
Embeddable Camunda modeling distributions based on bpmn-js
85 lines (71 loc) • 2.19 kB
JavaScript
/**
* @typedef {object} Config
* @property {string} resourceType
* @property {string} className
* @property {string} groupName
* @property {Function} createElement
* @property {string} [search]
*/
export class BaseCreateMenuProvider {
/**
*
* @param {import('didi').Injector} injector
* @param {Config} config
*/
constructor(injector, config) {
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;
}
getPopupMenuEntries() {
const {
resourceType,
className,
groupName,
createElement,
search
} = this._config;
const resources = this._resources.filter(r => r.type === resourceType);
const entries = {};
resources.forEach((resource, index) => {
const getTarget = () => createElement(resource, this._bpmnFactory);
entries[`resources-create-${resourceType}-${index}`] = {
label: resource.name,
action: this._createEntryAction(getTarget),
group: {
id: groupName.toLowerCase(),
name: this._translate(groupName)
},
className,
search
};
});
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);
};
}
}