update 优化bpmn位置
This commit is contained in:
138
src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts
Normal file
138
src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts
Normal file
@@ -0,0 +1,138 @@
|
||||
import ContextPadProvider from 'bpmn-js/lib/features/context-pad/ContextPadProvider';
|
||||
import { Injector } from 'didi';
|
||||
import EventBus from 'diagram-js/lib/core/EventBus';
|
||||
import ContextPad from 'diagram-js/lib/features/context-pad/ContextPad';
|
||||
import Modeling from 'bpmn-js/lib/features/modeling/Modeling.js';
|
||||
import ElementFactory from 'bpmn-js/lib/features/modeling/ElementFactory';
|
||||
import Connect from 'diagram-js/lib/features/connect/Connect';
|
||||
import Create from 'diagram-js/lib/features/create/Create';
|
||||
import PopupMenu from 'diagram-js/lib/features/popup-menu/PopupMenu';
|
||||
import Canvas from 'diagram-js/lib/core/Canvas';
|
||||
import Rules from 'diagram-js/lib/features/rules/Rules';
|
||||
import { Element, Shape } from 'diagram-js/lib/model/Types';
|
||||
import BpmnFactory from 'bpmn-js/lib/features/modeling/BpmnFactory';
|
||||
import modeler from '@/store/modules/modeler';
|
||||
|
||||
// @Description: 增强元素连线事件
|
||||
|
||||
class CustomContextPadProvider extends ContextPadProvider {
|
||||
private _contextPad: ContextPad;
|
||||
private _modeling: Modeling;
|
||||
private _elementFactory: ElementFactory;
|
||||
private _autoPlace: any;
|
||||
private _connect: Connect;
|
||||
private _create: Create;
|
||||
private _popupMenu: PopupMenu;
|
||||
private _canvas: Canvas;
|
||||
private _rules: Rules;
|
||||
|
||||
constructor(
|
||||
config: any,
|
||||
injector: Injector,
|
||||
eventBus: EventBus,
|
||||
contextPad: ContextPad,
|
||||
modeling: Modeling,
|
||||
elementFactory: ElementFactory,
|
||||
connect: Connect,
|
||||
create: Create,
|
||||
popupMenu: PopupMenu,
|
||||
canvas: Canvas,
|
||||
rules: Rules,
|
||||
translate
|
||||
) {
|
||||
// @ts-ignore
|
||||
super(config, injector, eventBus, contextPad, modeling, elementFactory, connect, create, popupMenu, canvas, rules, translate);
|
||||
|
||||
this._contextPad = contextPad;
|
||||
this._modeling = modeling;
|
||||
this._elementFactory = elementFactory;
|
||||
this._connect = connect;
|
||||
this._create = create;
|
||||
this._popupMenu = popupMenu;
|
||||
this._canvas = canvas;
|
||||
this._rules = rules;
|
||||
|
||||
this._autoPlace = injector.get('autoPlace', false);
|
||||
}
|
||||
|
||||
getContextPadEntries(element: Element) {
|
||||
const actions: Record<string, any> = {};
|
||||
|
||||
const appendUserTask = (event: Event, element: Shape) => {
|
||||
const shape = this._elementFactory.createShape({ type: 'bpmn:UserTask' });
|
||||
this._create.start(event, shape, {
|
||||
source: element
|
||||
});
|
||||
};
|
||||
|
||||
const appendMultiInstanceUserTask = (event: Event, element: Shape) => {
|
||||
const store = modeler();
|
||||
const bpmnFactory = store.getModeler().get('bpmnFactory') as BpmnFactory;
|
||||
const businessObject = bpmnFactory.create('bpmn:UserTask', {
|
||||
// name: '多实例用户任务',
|
||||
isForCompensation: false
|
||||
});
|
||||
businessObject.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics');
|
||||
// 创建 Shape
|
||||
const shape = this._elementFactory.createShape({
|
||||
type: 'bpmn:UserTask',
|
||||
businessObject: businessObject
|
||||
});
|
||||
this._create.start(event, shape, { source: element });
|
||||
};
|
||||
|
||||
const appendTask = this._autoPlace
|
||||
? (event, element) => {
|
||||
const bpmnFactory: BpmnFactory | undefined = modeler().getModeler().get('bpmnFactory');
|
||||
const businessObject = bpmnFactory.create('bpmn:UserTask', {
|
||||
// name: '多实例用户任务',// 右键创建显示
|
||||
isForCompensation: false
|
||||
});
|
||||
|
||||
// 创建多实例属性并分配给用户任务的 loopCharacteristics
|
||||
businessObject.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics');
|
||||
|
||||
// 创建 Shape
|
||||
const shape = this._elementFactory.createShape({
|
||||
type: 'bpmn:UserTask',
|
||||
businessObject: businessObject
|
||||
});
|
||||
|
||||
this._autoPlace.append(element, shape);
|
||||
}
|
||||
: appendMultiInstanceUserTask;
|
||||
|
||||
const append = this._autoPlace
|
||||
? (event: Event, element: Shape) => {
|
||||
const shape = this._elementFactory.createShape({ type: 'bpmn:UserTask' });
|
||||
this._autoPlace.append(element, shape);
|
||||
}
|
||||
: appendUserTask;
|
||||
|
||||
// // 添加创建用户任务按钮
|
||||
actions['append.append-user-task'] = {
|
||||
group: 'model',
|
||||
className: 'bpmn-icon-user-task',
|
||||
title: '用户任务',
|
||||
action: {
|
||||
dragstart: appendUserTask,
|
||||
click: append
|
||||
}
|
||||
};
|
||||
|
||||
// 添加创建多实例用户任务按钮
|
||||
actions['append.append-multi-instance-user-task'] = {
|
||||
group: 'model',
|
||||
className: 'bpmn-icon-user', // 你可以使用多实例用户任务的图标 bpmn-icon-user bpmn-icon-user-task
|
||||
title: '多实例用户任务',
|
||||
action: {
|
||||
dragstart: appendMultiInstanceUserTask,
|
||||
click: appendTask
|
||||
}
|
||||
};
|
||||
|
||||
return actions;
|
||||
}
|
||||
}
|
||||
|
||||
export default CustomContextPadProvider;
|
||||
109
src/bpmn/assets/module/Palette/CustomPaletteProvider.ts
Normal file
109
src/bpmn/assets/module/Palette/CustomPaletteProvider.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
import { assign } from 'min-dash';
|
||||
import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider';
|
||||
import ElementFactory from 'bpmn-js/lib/features/modeling/ElementFactory';
|
||||
import Create from 'diagram-js/lib/features/create/Create';
|
||||
import SpaceTool from 'diagram-js/lib/features/space-tool/SpaceTool';
|
||||
import LassoTool from 'diagram-js/lib/features/lasso-tool/LassoTool';
|
||||
import HandTool from 'diagram-js/lib/features/hand-tool/HandTool';
|
||||
import GlobalConnect from 'diagram-js/lib/features/global-connect/GlobalConnect';
|
||||
import Palette from 'diagram-js/lib/features/palette/Palette';
|
||||
import modeler from '@/store/modules/modeler';
|
||||
import BpmnFactory from 'bpmn-js/lib/features/modeling/BpmnFactory';
|
||||
|
||||
// @Description: 增强左侧面板
|
||||
class CustomPaletteProvider extends PaletteProvider {
|
||||
private readonly _palette: Palette;
|
||||
private readonly _create: Create;
|
||||
private readonly _elementFactory: ElementFactory;
|
||||
private readonly _spaceTool: SpaceTool;
|
||||
private readonly _lassoTool: LassoTool;
|
||||
private readonly _handTool: HandTool;
|
||||
private readonly _globalConnect: GlobalConnect;
|
||||
private readonly _translate: any;
|
||||
|
||||
constructor(palette, create, elementFactory, spaceTool, lassoTool, handTool, globalConnect, translate) {
|
||||
super(palette, create, elementFactory, spaceTool, lassoTool, handTool, globalConnect, translate);
|
||||
this._palette = palette;
|
||||
this._create = create;
|
||||
this._elementFactory = elementFactory;
|
||||
this._spaceTool = spaceTool;
|
||||
this._lassoTool = lassoTool;
|
||||
this._handTool = handTool;
|
||||
this._globalConnect = globalConnect;
|
||||
this._translate = translate;
|
||||
}
|
||||
|
||||
getPaletteEntries() {
|
||||
const actions = {},
|
||||
create = this._create,
|
||||
elementFactory = this._elementFactory,
|
||||
translate = this._translate;
|
||||
|
||||
function createAction(type: string, group: string, className: string, title: string, options?: object) {
|
||||
function createListener(event) {
|
||||
const shape = elementFactory.createShape(assign({ type: type }, options));
|
||||
if (options) {
|
||||
!shape.businessObject.di && (shape.businessObject.di = {});
|
||||
shape.businessObject.di.isExpanded = (options as { [key: string]: any }).isExpanded;
|
||||
}
|
||||
create.start(event, shape, null);
|
||||
}
|
||||
const shortType = type.replace(/^bpmn:/, '');
|
||||
return {
|
||||
group: group,
|
||||
className: className,
|
||||
title: title || translate('Create {type}', { type: shortType }),
|
||||
action: {
|
||||
dragstart: createListener,
|
||||
click: createListener
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function createMultiInstanceUserTask(event) {
|
||||
const bpmnFactory: BpmnFactory | undefined = modeler().getBpmnFactory();
|
||||
// 创建一个 bpmn:UserTask
|
||||
const userTask = bpmnFactory.create('bpmn:UserTask', {
|
||||
// name: '多实例用户任务', // 在画板中显示字段
|
||||
isForCompensation: false
|
||||
});
|
||||
// 将多实例属性分配给 bpmn:UserTask 的 loopCharacteristics
|
||||
userTask.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics');
|
||||
const customUserTask = elementFactory.createShape({
|
||||
type: 'bpmn:UserTask',
|
||||
businessObject: userTask // 分配创建的 userTask 到 businessObject
|
||||
});
|
||||
create.start(event, customUserTask, {});
|
||||
}
|
||||
|
||||
assign(actions, {
|
||||
'create.parallel-gateway': createAction('bpmn:ParallelGateway', 'gateway', 'bpmn-icon-gateway-parallel', '并行网关'),
|
||||
'create.event-base-gateway': createAction('bpmn:EventBasedGateway', 'gateway', 'bpmn-icon-gateway-eventbased', '事件网关'),
|
||||
// 分组线
|
||||
'gateway-separator': {
|
||||
group: 'gateway',
|
||||
separator: true
|
||||
},
|
||||
'create.user-task': createAction('bpmn:UserTask', 'activity', 'bpmn-icon-user-task', '创建用户任务'),
|
||||
'create.multi-instance-user-task': {
|
||||
group: 'activity',
|
||||
type: 'bpmn:UserTask',
|
||||
className: 'bpmn-icon-user task-multi-instance',
|
||||
title: '创建多实例用户任务',
|
||||
action: {
|
||||
click: createMultiInstanceUserTask,
|
||||
dragstart: createMultiInstanceUserTask
|
||||
}
|
||||
},
|
||||
'task-separator': {
|
||||
group: 'activity',
|
||||
separator: true
|
||||
}
|
||||
});
|
||||
return actions;
|
||||
}
|
||||
}
|
||||
|
||||
CustomPaletteProvider['$inject'] = ['palette', 'create', 'elementFactory', 'spaceTool', 'lassoTool', 'handTool', 'globalConnect', 'translate'];
|
||||
|
||||
export default CustomPaletteProvider;
|
||||
56
src/bpmn/assets/module/Renderer/CustomRenderer.ts
Normal file
56
src/bpmn/assets/module/Renderer/CustomRenderer.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import BaseRenderer from 'diagram-js/lib/draw/BaseRenderer';
|
||||
import {
|
||||
append as svgAppend,
|
||||
attr as svgAttr,
|
||||
create as svgCreate,
|
||||
select as svgSelect,
|
||||
selectAll as svgSelectAll,
|
||||
clone as svgClone,
|
||||
clear as svgClear,
|
||||
remove as svgRemove
|
||||
} from 'tiny-svg';
|
||||
|
||||
const HIGH_PRIORITY = 1500;
|
||||
export default class CustomRenderer extends BaseRenderer {
|
||||
bpmnRenderer: BaseRenderer;
|
||||
modeling: any;
|
||||
constructor(eventBus, bpmnRenderer, modeling) {
|
||||
super(eventBus, HIGH_PRIORITY);
|
||||
this.bpmnRenderer = bpmnRenderer;
|
||||
this.modeling = modeling;
|
||||
}
|
||||
canRender(element) {
|
||||
// ignore labels
|
||||
return !element.labelTarget;
|
||||
}
|
||||
|
||||
/**
|
||||
* 自定义节点图形
|
||||
* @param {*} parentNode 当前元素的svgNode
|
||||
* @param {*} element
|
||||
* @returns
|
||||
*/
|
||||
drawShape(parentNode, element) {
|
||||
const shape = this.bpmnRenderer.drawShape(parentNode, element);
|
||||
const { type, width, height } = element;
|
||||
// 开始 填充绿色
|
||||
if (type === 'bpmn:StartEvent') {
|
||||
svgAttr(shape, { fill: '#77DF6D' });
|
||||
return shape;
|
||||
}
|
||||
if (type === 'bpmn:EndEvent') {
|
||||
svgAttr(shape, { fill: '#EE7B77' });
|
||||
return shape;
|
||||
}
|
||||
if (type === 'bpmn:UserTask') {
|
||||
svgAttr(shape, { fill: '#A9C4F8' });
|
||||
return shape;
|
||||
}
|
||||
return shape;
|
||||
}
|
||||
|
||||
getShapePath(shape) {
|
||||
return this.bpmnRenderer.getShapePath(shape);
|
||||
}
|
||||
}
|
||||
CustomRenderer['$inject'] = ['eventBus', 'bpmnRenderer'];
|
||||
15
src/bpmn/assets/module/Translate/index.ts
Normal file
15
src/bpmn/assets/module/Translate/index.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import zh from '../../lang/zh';
|
||||
|
||||
const customTranslate = (template: any, replacements: any) => {
|
||||
replacements = replacements || {};
|
||||
template = zh[template] || template;
|
||||
return template.replace(/{([^}]+)}/g, function (_: any, key: any) {
|
||||
return replacements[key] || '{' + key + '}';
|
||||
});
|
||||
};
|
||||
|
||||
export const translateModule = {
|
||||
translate: ['value', customTranslate]
|
||||
};
|
||||
|
||||
export default translateModule;
|
||||
17
src/bpmn/assets/module/index.ts
Normal file
17
src/bpmn/assets/module/index.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
// 翻译模块
|
||||
import TranslationModule from './Translate';
|
||||
import { ModuleDeclaration } from 'didi';
|
||||
import CustomPaletteProvider from './Palette/CustomPaletteProvider';
|
||||
import CustomRenderer from './Renderer/CustomRenderer';
|
||||
import CustomContextPadProvider from './ContextPad/CustomContextPadProvider';
|
||||
|
||||
const Module: ModuleDeclaration[] = [
|
||||
{
|
||||
__init__: ['customPaletteProvider', 'customContextPadProvider', 'customRenderer'],
|
||||
customPaletteProvider: ['type', CustomPaletteProvider],
|
||||
customRenderer: ['type', CustomRenderer],
|
||||
customContextPadProvider: ['type', CustomContextPadProvider]
|
||||
},
|
||||
TranslationModule
|
||||
];
|
||||
export default Module;
|
||||
Reference in New Issue
Block a user