-
Notifications
You must be signed in to change notification settings - Fork 5
/
FragmentModeler.js
107 lines (93 loc) · 3.65 KB
/
FragmentModeler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import inherits from 'inherits';
import BpmnModeler from 'bpmn-js/lib/Modeler';
import fragmentPaletteModule from './palette';
import customModelingModule from './modeling';
import bpmnExtension from './moddle/bpmnextension.json';
import { is } from 'bpmn-js/lib/util/ModelUtil';
import { without } from 'min-dash';
export default function FragmentModeler(options) {
const customModules = [
fragmentPaletteModule,
customModelingModule,
{
fragmentModeler: ['value', this]
}
];
options.additionalModules = [
...customModules,
...(options.additionalModules || [])
];
options.moddleExtensions = {
fcm: bpmnExtension
};
BpmnModeler.call(this, options);
//Explicitely allow the copying of references (to objects outside the fragment modeler)
// See https://github.com/bpmn-io/bpmn-js/blob/212af3bb51840465e5809345ea3bb3da86656be3/lib/features/copy-paste/ModdleCopy.js#L218
this.get('eventBus').on('moddleCopy.canCopyProperty', function(context) {
if (context.propertyName === 'dataclass' || context.propertyName === 'states') {
return context.property;
}
});
}
inherits(FragmentModeler, BpmnModeler);
FragmentModeler.prototype.handleOlcListChanged = function (olcs, dryRun=false) {
this._olcs = olcs;
}
FragmentModeler.prototype.handleStateRenamed = function (olcState) {
this.getDataObjectReferencesInState(olcState).forEach((element, gfx) =>
this.get('eventBus').fire('element.changed', {
element
})
);
}
FragmentModeler.prototype.handleStateDeleted = function (olcState) {
this.getDataObjectReferencesInState(olcState).forEach((element, gfx) => {
element.businessObject.states = without(element.businessObject.states, olcState);
this.get('eventBus').fire('element.changed', {
element
});
});
}
FragmentModeler.prototype.handleClassRenamed = function (clazz) {
this.getDataObjectReferencesOfClass(clazz).forEach((element, gfx) =>
this.get('eventBus').fire('element.changed', {
element
})
);
}
FragmentModeler.prototype.handleClassDeleted = function (clazz) {
this.getDataObjectReferencesOfClass(clazz).forEach((element, gfx) =>
this.get('modeling').removeElements([element])
);
}
FragmentModeler.prototype.getDataObjectReferencesInState = function (olcState) {
return this.get('elementRegistry').filter((element, gfx) =>
is(element, 'bpmn:DataObjectReference') &&
element.type !== 'label' &&
element.businessObject.states?.includes(olcState)
);
}
FragmentModeler.prototype.getDataObjectReferencesOfClass = function (clazz) {
return this.get('elementRegistry').filter((element, gfx) =>
is(element, 'bpmn:DataObjectReference') &&
element.type !== 'label' &&
clazz.id &&
element.businessObject.dataclass?.id === clazz.id
);
}
FragmentModeler.prototype.startDoCreation = function(event, elementShape, dataclass, isIncoming) {
const shape = this.get('elementFactory').createShape({
type : 'bpmn:DataObjectReference'
});
shape.businessObject.dataclass = dataclass;
shape.businessObject.states = [];
const hints = isIncoming ?
{connectionTarget: elementShape}
: undefined;
this.get('autoPlace').append(elementShape, shape, hints);
// The following works for outgoing data, but breaks the activity for incoming
// fragmentModeler.get('create').start(event, shape, {
// source: activityShape,
// hints
// });
}