Files
geg-gas-web/src/views/workflow/design/bpmn/modeler/custom/CustomContextPad.ts
2024-02-05 09:15:37 +08:00

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;
}