bpmn-js 9.0.0-subprocesses.3 → 9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/assets/bpmn-js.css +44 -7
  3. package/dist/assets/diagram-js.css +1 -1
  4. package/dist/bpmn-modeler.development.js +2424 -1130
  5. package/dist/bpmn-modeler.production.min.js +8 -8
  6. package/dist/bpmn-navigated-viewer.development.js +990 -317
  7. package/dist/bpmn-navigated-viewer.production.min.js +6 -6
  8. package/dist/bpmn-viewer.development.js +989 -316
  9. package/dist/bpmn-viewer.production.min.js +6 -6
  10. package/lib/BaseViewer.js +1 -1
  11. package/lib/draw/BpmnRenderer.js +8 -7
  12. package/lib/features/auto-resize/BpmnAutoResizeProvider.js +6 -0
  13. package/lib/features/copy-paste/BpmnCopyPaste.js +1 -0
  14. package/lib/features/di-ordering/BpmnDiOrdering.js +15 -11
  15. package/lib/features/drilldown/DrilldownBreadcrumbs.js +122 -0
  16. package/lib/features/drilldown/DrilldownCentering.js +87 -10
  17. package/lib/features/drilldown/DrilldownOverlayBehavior.js +181 -0
  18. package/lib/features/drilldown/SubprocessCompatibility.js +15 -7
  19. package/lib/features/drilldown/index.js +7 -4
  20. package/lib/features/label-editing/LabelEditingProvider.js +1 -1
  21. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +29 -2
  22. package/lib/features/modeling/BpmnFactory.js +5 -1
  23. package/lib/features/modeling/BpmnUpdater.js +43 -1
  24. package/lib/features/modeling/ElementFactory.js +4 -0
  25. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +59 -84
  26. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +2 -2
  27. package/lib/features/modeling/behavior/GroupBehavior.js +6 -18
  28. package/lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js +34 -0
  29. package/lib/features/modeling/behavior/SubProcessPlaneBehavior.js +557 -0
  30. package/lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js +74 -0
  31. package/lib/features/modeling/behavior/UnclaimIdBehavior.js +3 -1
  32. package/lib/features/modeling/behavior/index.js +27 -18
  33. package/lib/features/modeling/cmd/SetColorHandler.js +23 -6
  34. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +4 -2
  35. package/lib/features/modeling/util/ModelingUtil.js +2 -20
  36. package/lib/features/ordering/BpmnOrderingProvider.js +3 -3
  37. package/lib/features/palette/PaletteProvider.js +1 -1
  38. package/lib/features/popup-menu/ReplaceMenuProvider.js +1 -1
  39. package/lib/import/BpmnImporter.js +15 -9
  40. package/lib/import/Importer.js +130 -10
  41. package/lib/util/DrilldownUtil.js +66 -0
  42. package/lib/util/ModelUtil.js +19 -0
  43. package/package.json +2 -2
  44. package/lib/features/drilldown/DrilldownOverlays.js +0 -110
@@ -42,6 +42,10 @@ BpmnFactory.prototype._needsId = function(element) {
42
42
  };
43
43
 
44
44
  BpmnFactory.prototype._ensureId = function(element) {
45
+ if (element.id) {
46
+ this._model.ids.claim(element.id, element);
47
+ return;
48
+ }
45
49
 
46
50
  // generate semantic ids for elements
47
51
  // bpmn:SequenceFlow -> SequenceFlow_ID
@@ -112,7 +116,7 @@ BpmnFactory.prototype.createDiWaypoint = function(point) {
112
116
  BpmnFactory.prototype.createDiEdge = function(semantic, attrs) {
113
117
  return this.create('bpmndi:BPMNEdge', assign({
114
118
  bpmnElement: semantic,
115
- waypoints: this.createDiWaypoints([])
119
+ waypoint: this.createDiWaypoints([])
116
120
  }, attrs));
117
121
  };
118
122
 
@@ -24,6 +24,10 @@ import {
24
24
  isAny
25
25
  } from './util/ModelingUtil';
26
26
 
27
+ import {
28
+ delta
29
+ } from 'diagram-js/lib/util/PositionUtil';
30
+
27
31
  import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
28
32
 
29
33
  /**
@@ -344,7 +348,18 @@ BpmnUpdater.prototype.updateParent = function(element, oldParent) {
344
348
 
345
349
  BpmnUpdater.prototype.updateBounds = function(shape) {
346
350
 
347
- var di = getDi(shape);
351
+ var di = getDi(shape),
352
+ embeddedLabelBounds = getEmbeddedLabelBounds(shape);
353
+
354
+ // update embedded label bounds if possible
355
+ if (embeddedLabelBounds) {
356
+ var embeddedLabelBoundsDelta = delta(embeddedLabelBounds, di.get('bounds'));
357
+
358
+ assign(embeddedLabelBounds, {
359
+ x: shape.x + embeddedLabelBoundsDelta.x,
360
+ y: shape.y + embeddedLabelBoundsDelta.y
361
+ });
362
+ }
348
363
 
349
364
  var target = (shape instanceof Label) ? this._getLabel(di) : di;
350
365
 
@@ -718,3 +733,30 @@ function ifBpmn(fn) {
718
733
  }
719
734
  };
720
735
  }
736
+
737
+ /**
738
+ * Return dc:Bounds of bpmndi:BPMNLabel if exists.
739
+ *
740
+ * @param {djs.model.shape} shape
741
+ *
742
+ * @returns {Object|undefined}
743
+ */
744
+ function getEmbeddedLabelBounds(shape) {
745
+ if (!is(shape, 'bpmn:Activity')) {
746
+ return;
747
+ }
748
+
749
+ var di = getDi(shape);
750
+
751
+ if (!di) {
752
+ return;
753
+ }
754
+
755
+ var label = di.get('label');
756
+
757
+ if (!label) {
758
+ return;
759
+ }
760
+
761
+ return label.get('bounds');
762
+ }
@@ -117,6 +117,10 @@ ElementFactory.prototype.createBpmnElement = function(elementType, attrs) {
117
117
  applyAttribute(di, attrs, 'isExpanded');
118
118
  }
119
119
 
120
+ if (is(businessObject, 'bpmn:SubProcess')) {
121
+ attrs.collapsed = !isExpanded(businessObject, di);
122
+ }
123
+
120
124
  if (is(businessObject, 'bpmn:ExclusiveGateway')) {
121
125
  di.isMarkerVisible = true;
122
126
  }
@@ -2,7 +2,7 @@ import inherits from 'inherits';
2
2
 
3
3
  import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
4
4
 
5
- import { is } from '../../../util/ModelUtil';
5
+ import { getBusinessObject, is } from '../../../util/ModelUtil';
6
6
 
7
7
  import { isLabel } from '../../../util/LabelUtil';
8
8
 
@@ -88,122 +88,97 @@ export default function CreateParticipantBehavior(canvas, eventBus, modeling) {
88
88
  }
89
89
  });
90
90
 
91
- function ensureCollaboration(context) {
92
- var parent = context.parent,
93
- collaboration;
94
-
91
+ // turn process into collaboration when creating first participant
92
+ function getOrCreateCollaboration() {
95
93
  var rootElement = canvas.getRootElement();
96
94
 
97
95
  if (is(rootElement, 'bpmn:Collaboration')) {
98
- collaboration = rootElement;
99
- } else {
100
-
101
- // update root element by making collaboration
102
- collaboration = modeling.makeCollaboration();
103
-
104
- // re-use process when creating first participant
105
- context.process = parent;
96
+ return rootElement;
106
97
  }
107
98
 
108
- context.parent = collaboration;
99
+ return modeling.makeCollaboration();
109
100
  }
110
101
 
111
- // turn process into collaboration before adding participant
112
- this.preExecute('shape.create', function(context) {
113
- var parent = context.parent,
114
- shape = context.shape;
115
-
116
- if (is(shape, 'bpmn:Participant') && is(parent, 'bpmn:Process')) {
117
- ensureCollaboration(context);
118
- }
119
- }, true);
120
-
121
- this.execute('shape.create', function(context) {
122
- var process = context.process,
123
- shape = context.shape;
124
-
125
- if (process) {
126
- context.oldProcessRef = shape.businessObject.processRef;
127
-
128
- // re-use process when creating first participant
129
- shape.businessObject.processRef = process.businessObject;
130
- }
131
- }, true);
102
+ // when creating mutliple elements through `elements.create` parent must be set to collaboration
103
+ // and passed to `shape.create` as hint
104
+ this.preExecute('elements.create', HIGH_PRIORITY, function(context) {
105
+ var elements = context.elements,
106
+ parent = context.parent,
107
+ participant = findParticipant(elements),
108
+ hints;
132
109
 
133
- this.revert('shape.create', function(context) {
134
- var process = context.process,
135
- shape = context.shape;
110
+ if (participant && is(parent, 'bpmn:Process')) {
111
+ context.parent = getOrCreateCollaboration();
136
112
 
137
- if (process) {
113
+ hints = context.hints = context.hints || {};
138
114
 
139
- // re-use process when creating first participant
140
- shape.businessObject.processRef = context.oldProcessRef;
115
+ hints.participant = participant;
116
+ hints.process = parent;
117
+ hints.processRef = getBusinessObject(participant).get('processRef');
141
118
  }
142
119
  }, true);
143
120
 
144
- this.postExecute('shape.create', function(context) {
145
- var process = context.process,
121
+ // when creating single shape through `shape.create` parent must be set to collaboration
122
+ // unless it was already set through `elements.create`
123
+ this.preExecute('shape.create', function(context) {
124
+ var parent = context.parent,
146
125
  shape = context.shape;
147
126
 
148
- if (process) {
149
-
150
- // move children from process to participant
151
- var processChildren = process.children.slice();
127
+ if (is(shape, 'bpmn:Participant') && is(parent, 'bpmn:Process')) {
128
+ context.parent = getOrCreateCollaboration();
152
129
 
153
- modeling.moveElements(processChildren, { x: 0, y: 0 }, shape);
130
+ context.process = parent;
131
+ context.processRef = getBusinessObject(shape).get('processRef');
154
132
  }
155
-
156
133
  }, true);
157
134
 
158
- // turn process into collaboration when creating participants
159
- this.preExecute('elements.create', HIGH_PRIORITY, function(context) {
160
- var elements = context.elements,
161
- parent = context.parent,
162
- participant;
163
-
164
- var hasParticipants = findParticipant(elements);
165
-
166
- if (hasParticipants && is(parent, 'bpmn:Process')) {
167
- ensureCollaboration(context);
168
-
169
- participant = findParticipant(elements);
135
+ // #execute necessary because #preExecute not called on CommandStack#redo
136
+ this.execute('shape.create', function(context) {
137
+ var hints = context.hints || {},
138
+ process = context.process || hints.process,
139
+ shape = context.shape,
140
+ participant = hints.participant;
170
141
 
171
- context.oldProcessRef = participant.businessObject.processRef;
142
+ // both shape.create and elements.create must be handled
143
+ if (process && (!participant || shape === participant)) {
172
144
 
173
- // re-use process when creating first participant
174
- participant.businessObject.processRef = parent.businessObject;
145
+ // monkey-patch process ref
146
+ getBusinessObject(shape).set('processRef', getBusinessObject(process));
175
147
  }
176
148
  }, true);
177
149
 
178
- this.revert('elements.create', function(context) {
179
- var elements = context.elements,
180
- process = context.process,
181
- participant;
150
+ this.revert('shape.create', function(context) {
151
+ var hints = context.hints || {},
152
+ process = context.process || hints.process,
153
+ processRef = context.processRef || hints.processRef,
154
+ shape = context.shape,
155
+ participant = hints.participant;
182
156
 
183
- if (process) {
184
- participant = findParticipant(elements);
157
+ // both shape.create and elements.create must be handled
158
+ if (process && (!participant || shape === participant)) {
185
159
 
186
- // re-use process when creating first participant
187
- participant.businessObject.processRef = context.oldProcessRef;
160
+ // monkey-patch process ref
161
+ getBusinessObject(shape).set('processRef', processRef);
188
162
  }
189
163
  }, true);
190
164
 
191
- this.postExecute('elements.create', function(context) {
192
- var elements = context.elements,
193
- process = context.process,
194
- participant;
165
+ this.postExecute('shape.create', function(context) {
166
+ var hints = context.hints || {},
167
+ process = context.process || context.hints.process,
168
+ shape = context.shape,
169
+ participant = hints.participant;
195
170
 
196
171
  if (process) {
197
- participant = findParticipant(elements);
198
-
199
- // move children from process to first participant
200
- var processChildren = process.children.slice();
201
-
202
- modeling.moveElements(processChildren, { x: 0, y: 0 }, participant);
172
+ var children = process.children.slice();
173
+
174
+ // both shape.create and elements.create must be handled
175
+ if (!participant) {
176
+ modeling.moveElements(children, { x: 0, y: 0 }, shape);
177
+ } else if (shape === participant) {
178
+ modeling.moveElements(children, { x: 0, y: 0 }, participant);
179
+ }
203
180
  }
204
-
205
181
  }, true);
206
-
207
182
  }
208
183
 
209
184
  CreateParticipantBehavior.$inject = [
@@ -59,12 +59,12 @@ export default function DropOnFlowBehavior(eventBus, bpmnRules, modeling) {
59
59
  dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : mid;
60
60
 
61
61
  // if last waypointBefore is inside shape's bounds, ignore docking point
62
- if (!isPointInsideBBox(shape, waypointsBefore[waypointsBefore.length-1])) {
62
+ if (waypointsBefore.length === 1 || !isPointInsideBBox(shape, waypointsBefore[waypointsBefore.length-1])) {
63
63
  waypointsBefore.push(copy(dockingPoint));
64
64
  }
65
65
 
66
66
  // if first waypointAfter is inside shape's bounds, ignore docking point
67
- if (!isPointInsideBBox(shape, waypointsAfter[0])) {
67
+ if (waypointsAfter.length === 1 || !isPointInsideBBox(shape, waypointsAfter[0])) {
68
68
  waypointsAfter.unshift(copy(dockingPoint));
69
69
  }
70
70
  }
@@ -24,7 +24,7 @@ var HIGH_PRIORITY = 2000;
24
24
  */
25
25
  export default function GroupBehavior(
26
26
  bpmnFactory,
27
- canvas,
27
+ bpmnjs,
28
28
  elementRegistry,
29
29
  eventBus,
30
30
  injector,
@@ -32,18 +32,6 @@ export default function GroupBehavior(
32
32
  ) {
33
33
  injector.invoke(CommandInterceptor, this);
34
34
 
35
- /**
36
- * Gets process definitions
37
- *
38
- * @return {ModdleElement} definitions
39
- */
40
- function getDefinitions() {
41
- var rootElement = canvas.getRootElement(),
42
- businessObject = getBusinessObject(rootElement);
43
-
44
- return businessObject.$parent;
45
- }
46
-
47
35
  /**
48
36
  * Removes a referenced category value for a given group shape
49
37
  *
@@ -79,7 +67,7 @@ export default function GroupBehavior(
79
67
  */
80
68
  function removeCategory(category) {
81
69
 
82
- var definitions = getDefinitions();
70
+ var definitions = bpmnjs.getDefinitions();
83
71
 
84
72
  collectionRemove(definitions.get('rootElements'), category);
85
73
  }
@@ -144,7 +132,7 @@ export default function GroupBehavior(
144
132
 
145
133
  var businessObject = getBusinessObject(shape),
146
134
  categoryValueRef = businessObject.categoryValueRef,
147
- definitions = getDefinitions(),
135
+ definitions = bpmnjs.getDefinitions(),
148
136
  category = categoryValueRef ? categoryValueRef.$parent : null;
149
137
 
150
138
  collectionAdd(category.get('categoryValue'), categoryValueRef);
@@ -162,7 +150,7 @@ export default function GroupBehavior(
162
150
 
163
151
  if (is(businessObject, 'bpmn:Group') && !businessObject.categoryValueRef) {
164
152
 
165
- var definitions = getDefinitions(),
153
+ var definitions = bpmnjs.getDefinitions(),
166
154
  categoryValue = createCategoryValue(definitions, bpmnFactory);
167
155
 
168
156
  // link the reference to the Group
@@ -190,7 +178,7 @@ export default function GroupBehavior(
190
178
  categoryValue;
191
179
 
192
180
  if (is(property, 'bpmn:CategoryValue')) {
193
- categoryValue = createCategoryValue(getDefinitions(), bpmnFactory);
181
+ categoryValue = createCategoryValue(bpmnjs.getDefinitions(), bpmnFactory);
194
182
 
195
183
  // return copy of category
196
184
  return moddleCopy.copyElement(property, categoryValue);
@@ -201,7 +189,7 @@ export default function GroupBehavior(
201
189
 
202
190
  GroupBehavior.$inject = [
203
191
  'bpmnFactory',
204
- 'canvas',
192
+ 'bpmnjs',
205
193
  'elementRegistry',
206
194
  'eventBus',
207
195
  'injector',
@@ -0,0 +1,34 @@
1
+ import inherits from 'inherits';
2
+
3
+ import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';
4
+
5
+ import { getDi } from '../../../util/ModelUtil';
6
+
7
+ /**
8
+ * BPMN specific behavior ensuring that bpmndi:Label's dc:Bounds are removed
9
+ * when shape is resized.
10
+ */
11
+ export default function RemoveEmbeddedLabelBoundsBehavior(eventBus, modeling) {
12
+ CommandInterceptor.call(this, eventBus);
13
+
14
+ this.preExecute('shape.resize', function(context) {
15
+ var shape = context.shape;
16
+
17
+ var di = getDi(shape),
18
+ label = di && di.get('label'),
19
+ bounds = label && label.get('bounds');
20
+
21
+ if (bounds) {
22
+ modeling.updateModdleProperties(shape, label, {
23
+ bounds: undefined
24
+ });
25
+ }
26
+ }, true);
27
+ }
28
+
29
+ inherits(RemoveEmbeddedLabelBoundsBehavior, CommandInterceptor);
30
+
31
+ RemoveEmbeddedLabelBoundsBehavior.$inject = [
32
+ 'eventBus',
33
+ 'modeling'
34
+ ];