334 lines
8.4 KiB
TypeScript
334 lines
8.4 KiB
TypeScript
|
|
import { assign, forEach } from 'min-dash';
|
||
|
|
|
||
|
|
import { is } from './../util/ModelUtil';
|
||
|
|
|
||
|
|
import { isExpanded, isEventSubProcess } from './../util/DiUtil';
|
||
|
|
|
||
|
|
import { isAny } from './../util/ModelingUtil';
|
||
|
|
|
||
|
|
import { getChildLanes } from './../util/LaneUtil';
|
||
|
|
|
||
|
|
import { getTranslate } from './../util/TranslateUtil';
|
||
|
|
import { useI18n } from '/@/hooks/web/useI18n';
|
||
|
|
const { t } = useI18n();
|
||
|
|
export default function ContextPadProvider(
|
||
|
|
this: any,
|
||
|
|
config: { autoPlace?: any },
|
||
|
|
injector: { get: (arg0: string, arg1: boolean) => any },
|
||
|
|
_eventBus: { on: (arg0: string, arg1: number, arg2: (event: any) => void) => void },
|
||
|
|
contextPad: {
|
||
|
|
registerProvider: (arg0: any) => void;
|
||
|
|
isOpen: (arg0: any) => any;
|
||
|
|
getEntries: (arg0: any) => any;
|
||
|
|
},
|
||
|
|
modeling: any,
|
||
|
|
elementFactory: any,
|
||
|
|
connect: any,
|
||
|
|
create: any,
|
||
|
|
popupMenu: any,
|
||
|
|
canvas: any,
|
||
|
|
rules: any,
|
||
|
|
) {
|
||
|
|
config = config || {};
|
||
|
|
|
||
|
|
contextPad.registerProvider(this);
|
||
|
|
|
||
|
|
this._contextPad = contextPad;
|
||
|
|
|
||
|
|
this._modeling = modeling;
|
||
|
|
|
||
|
|
this._elementFactory = elementFactory;
|
||
|
|
this._connect = connect;
|
||
|
|
this._create = create;
|
||
|
|
this._popupMenu = popupMenu;
|
||
|
|
this._canvas = canvas;
|
||
|
|
this._rules = rules;
|
||
|
|
|
||
|
|
if (config.autoPlace !== false) {
|
||
|
|
this._autoPlace = injector.get('autoPlace', false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
ContextPadProvider.$inject = [
|
||
|
|
'config.contextPad',
|
||
|
|
'injector',
|
||
|
|
'eventBus',
|
||
|
|
'contextPad',
|
||
|
|
'modeling',
|
||
|
|
'elementFactory',
|
||
|
|
'connect',
|
||
|
|
'create',
|
||
|
|
'rules',
|
||
|
|
];
|
||
|
|
|
||
|
|
ContextPadProvider.prototype.getContextPadEntries = function (element: {
|
||
|
|
type: string;
|
||
|
|
businessObject: any;
|
||
|
|
id: any;
|
||
|
|
height: number;
|
||
|
|
}) {
|
||
|
|
const contextPad = this._contextPad,
|
||
|
|
modeling = this._modeling,
|
||
|
|
elementFactory = this._elementFactory,
|
||
|
|
connect = this._connect,
|
||
|
|
create = this._create,
|
||
|
|
autoPlace = this._autoPlace;
|
||
|
|
|
||
|
|
const actions = {};
|
||
|
|
|
||
|
|
if (element.type === 'label') {
|
||
|
|
return actions;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (is(element, 'bpmn:EndEvent') || is(element, 'bpmn:SequenceFlow')) {
|
||
|
|
return {
|
||
|
|
delete: {
|
||
|
|
group: 'event2',
|
||
|
|
className: 'bpmn-icon-trash',
|
||
|
|
title: getTranslate(t('删除')),
|
||
|
|
action: {
|
||
|
|
click: removeElement,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
connect: {
|
||
|
|
group: 'none',
|
||
|
|
className: 'bpmn-icon-text-annotation',
|
||
|
|
title: 'a',
|
||
|
|
action: {},
|
||
|
|
},
|
||
|
|
replace: {
|
||
|
|
group: 'none',
|
||
|
|
className: 'bpmn-icon-text-annotation',
|
||
|
|
title: 'a',
|
||
|
|
action: {},
|
||
|
|
},
|
||
|
|
'append.gateway': {
|
||
|
|
group: 'none',
|
||
|
|
className: 'bpmn-icon-text-annotation',
|
||
|
|
title: 'a',
|
||
|
|
action: {},
|
||
|
|
},
|
||
|
|
'append.append-task': {
|
||
|
|
group: 'none',
|
||
|
|
className: 'bpmn-icon-text-annotation',
|
||
|
|
title: 'a',
|
||
|
|
action: {},
|
||
|
|
},
|
||
|
|
'append.intermediate-event': {
|
||
|
|
group: 'none',
|
||
|
|
className: 'bpmn-icon-text-annotation',
|
||
|
|
title: 'a',
|
||
|
|
action: {},
|
||
|
|
},
|
||
|
|
'append.text-annotation': {
|
||
|
|
group: 'none',
|
||
|
|
className: 'bpmn-icon-text-annotation',
|
||
|
|
title: 'a',
|
||
|
|
action: {},
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
const businessObject = element.businessObject;
|
||
|
|
|
||
|
|
function startConnect(event: any, element: any) {
|
||
|
|
connect.start(event, element);
|
||
|
|
}
|
||
|
|
function removeElement() {
|
||
|
|
modeling.removeElements([element]);
|
||
|
|
}
|
||
|
|
|
||
|
|
function appendAction(type: string, className: string, title: string, options?: undefined) {
|
||
|
|
if (typeof title !== 'string') {
|
||
|
|
options = title;
|
||
|
|
title = getTranslate('Append {type}', { type: type.replace(/^bpmn:/, '') });
|
||
|
|
}
|
||
|
|
|
||
|
|
function appendStart(event: any, element: any) {
|
||
|
|
const shape = elementFactory.createShape(assign({ type: type }, options));
|
||
|
|
create.start(event, shape, {
|
||
|
|
source: element,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const append = autoPlace
|
||
|
|
? function (_event: any, element: any) {
|
||
|
|
const shape = elementFactory.createShape(assign({ type: type }, options));
|
||
|
|
autoPlace.append(element, shape);
|
||
|
|
}
|
||
|
|
: appendStart;
|
||
|
|
|
||
|
|
return {
|
||
|
|
group: 'event1',
|
||
|
|
className: className,
|
||
|
|
title: title,
|
||
|
|
action: {
|
||
|
|
dragstart: appendStart,
|
||
|
|
click: append,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
function splitLaneHandler(count: number) {
|
||
|
|
return function (_event: any, element: any) {
|
||
|
|
// actual split
|
||
|
|
modeling.splitLane(element, count);
|
||
|
|
|
||
|
|
// refresh context pad after split to
|
||
|
|
// get rid of split icons
|
||
|
|
contextPad.open(element, true);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isAny(businessObject, ['bpmn:Lane', 'bpmn:Participant']) && isExpanded(businessObject)) {
|
||
|
|
const childLanes = getChildLanes(element);
|
||
|
|
|
||
|
|
if (childLanes.length < 2) {
|
||
|
|
if (element.height >= 120) {
|
||
|
|
assign(actions, {
|
||
|
|
'lane-divide-two': {
|
||
|
|
group: 'lane-divide',
|
||
|
|
className: 'bpmn-icon-lane-divide-two',
|
||
|
|
title: getTranslate('Divide into two Lanes'),
|
||
|
|
action: {
|
||
|
|
click: splitLaneHandler(2),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
if (element.height >= 180) {
|
||
|
|
assign(actions, {
|
||
|
|
'lane-divide-three': {
|
||
|
|
group: 'lane-divide',
|
||
|
|
className: 'bpmn-icon-lane-divide-three',
|
||
|
|
title: getTranslate('Divide into three Lanes'),
|
||
|
|
action: {
|
||
|
|
click: splitLaneHandler(3),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
assign(actions, {});
|
||
|
|
}
|
||
|
|
if (isAny(businessObject, ['bpmn:Lane', 'bpmn:Participant'])) {
|
||
|
|
}
|
||
|
|
if (is(businessObject, 'bpmn:FlowNode')) {
|
||
|
|
if (is(businessObject, 'bpmn:EventBasedGateway')) {
|
||
|
|
} else if (
|
||
|
|
isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition')
|
||
|
|
) {
|
||
|
|
} else if (
|
||
|
|
!is(businessObject, 'bpmn:EndEvent') &&
|
||
|
|
!businessObject.isForCompensation &&
|
||
|
|
!isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') &&
|
||
|
|
!isEventSubProcess(businessObject)
|
||
|
|
) {
|
||
|
|
assign(actions, {
|
||
|
|
'append.end-event': appendAction(
|
||
|
|
'bpmn:EndEvent',
|
||
|
|
'bpmn-icon-end-event-none',
|
||
|
|
getTranslate(t('创建结束节点')),
|
||
|
|
),
|
||
|
|
'append.script-task': appendAction(
|
||
|
|
'bpmn:ScriptTask',
|
||
|
|
'bpmn-icon-script',
|
||
|
|
getTranslate(t('创建脚本节点')),
|
||
|
|
),
|
||
|
|
'append.user-task': appendAction(
|
||
|
|
'bpmn:UserTask',
|
||
|
|
'bpmn-icon-user',
|
||
|
|
getTranslate(t('创建用户节点')),
|
||
|
|
),
|
||
|
|
'append.exclusive-gateway': appendAction(
|
||
|
|
'bpmn:ExclusiveGateway',
|
||
|
|
'bpmn-icon-gateway-xor',
|
||
|
|
getTranslate(t('互斥网关')),
|
||
|
|
),
|
||
|
|
'append.inclusive-gateway': appendAction(
|
||
|
|
'bpmn:InclusiveGateway',
|
||
|
|
'bpmn-icon-gateway-or',
|
||
|
|
getTranslate(t('相容网关')),
|
||
|
|
),
|
||
|
|
'append.parallel-gateway': appendAction(
|
||
|
|
'bpmn:ParallelGateway',
|
||
|
|
'bpmn-icon-gateway-parallel',
|
||
|
|
getTranslate(t('并行网关')),
|
||
|
|
),
|
||
|
|
connect: {
|
||
|
|
group: 'event2',
|
||
|
|
className: 'bpmn-icon-connection-multi',
|
||
|
|
title: getTranslate(t('连接线')),
|
||
|
|
action: {
|
||
|
|
click: startConnect,
|
||
|
|
dragstart: startConnect,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
delete: {
|
||
|
|
group: is(element, 'bpmn:StartEvent') ? 'none' : 'event2',
|
||
|
|
className: 'bpmn-icon-trash',
|
||
|
|
title: getTranslate(t('删除')),
|
||
|
|
action: {
|
||
|
|
click: removeElement,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// if (!popupMenu.isEmpty(element, "bpmn-replace")) {
|
||
|
|
// }
|
||
|
|
|
||
|
|
if (
|
||
|
|
isAny(businessObject, [
|
||
|
|
'bpmn:FlowNode',
|
||
|
|
'bpmn:InteractionNode',
|
||
|
|
'bpmn:DataObjectReference',
|
||
|
|
'bpmn:DataStoreReference',
|
||
|
|
])
|
||
|
|
) {
|
||
|
|
// 将默认属性隐藏
|
||
|
|
const displayNone = {
|
||
|
|
group: 'none',
|
||
|
|
className: '',
|
||
|
|
title: getTranslate(''),
|
||
|
|
action: {},
|
||
|
|
};
|
||
|
|
assign(actions, {
|
||
|
|
'append.text-annotation': displayNone,
|
||
|
|
'append.gateway': displayNone,
|
||
|
|
'append.append-task': displayNone,
|
||
|
|
'append.intermediate-event': displayNone,
|
||
|
|
replace: displayNone,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
// console.log('actions',actions);
|
||
|
|
// if(actions&&actions){
|
||
|
|
// delete actions['append.text-annotation'];
|
||
|
|
// }
|
||
|
|
|
||
|
|
return actions;
|
||
|
|
};
|
||
|
|
|
||
|
|
// helpers /////////
|
||
|
|
|
||
|
|
function isEventType(
|
||
|
|
eventBo: { $instanceOf: (arg0: any) => any; eventDefinitions: never[] },
|
||
|
|
type: string,
|
||
|
|
definition: string,
|
||
|
|
) {
|
||
|
|
const isType = eventBo.$instanceOf(type);
|
||
|
|
let isDefinition = false;
|
||
|
|
|
||
|
|
const definitions = eventBo.eventDefinitions || [];
|
||
|
|
forEach(definitions, function (def: { $type?: any }) {
|
||
|
|
if (def.$type === definition) {
|
||
|
|
isDefinition = true;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
return isType && isDefinition;
|
||
|
|
}
|