bpmn-js 0.13.1 → 0.14.1

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 (65) hide show
  1. package/.travis.yml +1 -1
  2. package/.wiredeps +5 -5
  3. package/lib/Modeler.js +52 -9
  4. package/lib/Viewer.js +205 -105
  5. package/lib/draw/BpmnRenderer.js +4 -0
  6. package/lib/features/context-pad/ContextPadProvider.js +21 -15
  7. package/lib/features/label-editing/LabelEditingProvider.js +21 -6
  8. package/lib/features/label-editing/LabelUtil.js +6 -6
  9. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +19 -17
  10. package/lib/features/modeling/BpmnUpdater.js +12 -4
  11. package/lib/features/modeling/ElementFactory.js +25 -11
  12. package/lib/features/modeling/{BpmnLabelSupport.js → behavior/LabelBehavior.js} +14 -4
  13. package/lib/features/modeling/behavior/ModelingFeedback.js +3 -3
  14. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +4 -4
  15. package/lib/features/modeling/behavior/index.js +2 -0
  16. package/lib/features/modeling/cmd/SplitLaneHandler.js +6 -4
  17. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +6 -0
  18. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +6 -0
  19. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +6 -4
  20. package/lib/features/modeling/index.js +1 -2
  21. package/lib/features/ordering/BpmnOrderingProvider.js +7 -4
  22. package/lib/features/ordering/index.js +3 -0
  23. package/lib/features/palette/PaletteProvider.js +13 -9
  24. package/lib/features/palette/index.js +2 -1
  25. package/lib/features/popup-menu/ReplaceMenuProvider.js +22 -10
  26. package/lib/features/popup-menu/index.js +4 -0
  27. package/lib/features/replace/BpmnReplace.js +17 -1
  28. package/lib/features/replace/ReplaceOptions.js +22 -0
  29. package/lib/features/replace/index.js +0 -1
  30. package/lib/features/rules/BpmnRules.js +14 -0
  31. package/lib/features/snapping/BpmnSnapping.js +2 -2
  32. package/lib/import/BpmnImporter.js +30 -18
  33. package/lib/import/BpmnTreeWalker.js +42 -15
  34. package/lib/import/Importer.js +19 -7
  35. package/lib/import/index.js +3 -0
  36. package/package.json +8 -7
  37. package/test/fixtures/bpmn/extension/custom-override.bpmn +54 -0
  38. package/test/fixtures/bpmn/extension/custom.bpmn +54 -0
  39. package/test/fixtures/bpmn/features/modeling/update-label.bpmn +24 -0
  40. package/test/fixtures/json/model/custom-override.json +39 -0
  41. package/test/fixtures/json/model/custom.json +39 -0
  42. package/test/helper/index.js +6 -1
  43. package/test/integration/ReimportSpec.js +89 -0
  44. package/test/spec/ModelerSpec.js +155 -9
  45. package/test/spec/ViewerSpec.js +328 -43
  46. package/test/spec/features/context-pad/ContextPadProviderSpec.js +5 -5
  47. package/test/spec/features/label-editing/LabelEditingProviderSpec.js +201 -128
  48. package/test/spec/features/modeling/AppendShapeSpec.js +0 -43
  49. package/test/spec/features/modeling/UpdateLabelSpec.js +129 -0
  50. package/test/spec/features/modeling/append/TextAnnotationSpec.js +13 -0
  51. package/test/spec/features/modeling/behavior/LabelBehaviorSpec.js +144 -0
  52. package/test/spec/features/modeling/layout/LayoutAssociationSpec.js +3 -3
  53. package/test/spec/features/ordering/BpmnOrderingProviderSpec.js +41 -2
  54. package/test/spec/features/ordering/ordering-subprocesses.bpmn +14 -2
  55. package/test/spec/features/popup-menu/ReplaceMenuProviderSpec.js +0 -4
  56. package/test/spec/features/replace/BpmnReplace.collaboration.bpmn +70 -0
  57. package/test/spec/features/replace/BpmnReplaceSpec.js +37 -0
  58. package/test/spec/features/rules/BpmnRules.collaboration.bpmn +6 -1
  59. package/test/spec/features/rules/BpmnRulesSpec.js +32 -0
  60. package/test/spec/features/snapping/BpmnSnappingSpec.js +16 -6
  61. package/test/spec/i18n/custom-translate/custom-translate.js +15 -0
  62. package/test/spec/i18n/custom-translate/index.js +3 -0
  63. package/test/spec/i18n/translateSpec.js +53 -0
  64. package/test/spec/import/ImporterSpec.js +3 -3
  65. package/test/spec/features/modeling/BpmnLabelSupportSpec.js +0 -37
@@ -2,8 +2,12 @@
2
2
 
3
3
  var TestContainer = require('mocha-test-container-support');
4
4
 
5
+ var Diagram = require('diagram-js/lib/Diagram');
6
+
5
7
  var Viewer = require('../../lib/Viewer');
6
8
 
9
+ var inherits = require('inherits');
10
+
7
11
 
8
12
  describe('Viewer', function() {
9
13
 
@@ -44,8 +48,11 @@ describe('Viewer', function() {
44
48
  // mimic re-import of same diagram
45
49
  viewer.importXML(xml, function(err, warnings) {
46
50
 
51
+ if (err) {
52
+ return done(err);
53
+ }
54
+
47
55
  // then
48
- expect(err).to.exist;
49
56
  expect(warnings.length).to.equal(0);
50
57
 
51
58
  done();
@@ -55,6 +62,16 @@ describe('Viewer', function() {
55
62
  });
56
63
 
57
64
 
65
+ it('should be instance of Diagram', function() {
66
+
67
+ // when
68
+ var viewer = new Viewer({ container: container });
69
+
70
+ // then
71
+ expect(viewer).to.be.instanceof(Diagram);
72
+ });
73
+
74
+
58
75
  describe('defaults', function() {
59
76
 
60
77
  it('should use <body> as default parent', function(done) {
@@ -74,45 +91,6 @@ describe('Viewer', function() {
74
91
  });
75
92
 
76
93
 
77
- describe('import events', function() {
78
-
79
- it('should fire <import.*> events', function(done) {
80
-
81
- // given
82
- var viewer = new Viewer({ container: container });
83
-
84
- var xml = require('../fixtures/bpmn/simple.bpmn');
85
-
86
- var events = [];
87
-
88
- viewer.on('import.start', function() {
89
- events.push('import.start');
90
- });
91
-
92
- viewer.on('import.success', function() {
93
- events.push('import.success');
94
- });
95
-
96
- viewer.on('import.error', function() {
97
- events.push('import.error');
98
- });
99
-
100
- // when
101
- viewer.importXML(xml, function(err) {
102
-
103
- // then
104
- expect(events).to.eql([
105
- 'import.start',
106
- 'import.success'
107
- ]);
108
-
109
- done(err);
110
- });
111
- });
112
-
113
- });
114
-
115
-
116
94
  describe('overlay support', function() {
117
95
 
118
96
  it('should allow to add overlays', function(done) {
@@ -257,7 +235,7 @@ describe('Viewer', function() {
257
235
 
258
236
  describe('dependency injection', function() {
259
237
 
260
- it('should be available via di as <bpmnjs>', function(done) {
238
+ it('should provide self as <bpmnjs>', function(done) {
261
239
 
262
240
  var xml = require('../fixtures/bpmn/simple.bpmn');
263
241
 
@@ -269,6 +247,48 @@ describe('Viewer', function() {
269
247
  });
270
248
  });
271
249
 
250
+
251
+ it('should allow Diagram#get before import', function() {
252
+
253
+ // when
254
+ var viewer = new Viewer({ container: container });
255
+
256
+ // then
257
+ var eventBus = viewer.get('eventBus');
258
+
259
+ expect(eventBus).to.exist;
260
+ });
261
+
262
+
263
+ it('should keep references to services across re-import', function(done) {
264
+
265
+ // given
266
+ var someXML = require('../fixtures/bpmn/simple.bpmn'),
267
+ otherXML = require('../fixtures/bpmn/basic.bpmn');
268
+
269
+ var viewer = new Viewer({ container: container });
270
+
271
+ var eventBus = viewer.get('eventBus'),
272
+ canvas = viewer.get('canvas');
273
+
274
+ // when
275
+ viewer.importXML(someXML, function() {
276
+
277
+ // then
278
+ expect(viewer.get('canvas')).to.equal(canvas);
279
+ expect(viewer.get('eventBus')).to.equal(eventBus);
280
+
281
+ viewer.importXML(otherXML, function() {
282
+
283
+ // then
284
+ expect(viewer.get('canvas')).to.equal(canvas);
285
+ expect(viewer.get('eventBus')).to.equal(eventBus);
286
+
287
+ done();
288
+ });
289
+ });
290
+
291
+ });
272
292
  });
273
293
 
274
294
 
@@ -297,6 +317,36 @@ describe('Viewer', function() {
297
317
  }
298
318
 
299
319
 
320
+ it('should export XML', function(done) {
321
+
322
+ // given
323
+ var xml = require('../fixtures/bpmn/simple.bpmn');
324
+
325
+ createViewer(xml, function(err, warnings, viewer) {
326
+
327
+ if (err) {
328
+ return done(err);
329
+ }
330
+
331
+ // when
332
+ viewer.saveXML({ format: true }, function(err, xml) {
333
+
334
+ if (err) {
335
+ return done(err);
336
+ }
337
+
338
+ // then
339
+ expect(xml).to.contain('<?xml version="1.0" encoding="UTF-8"?>');
340
+ expect(xml).to.contain('<bpmn2:definitions');
341
+ expect(xml).to.contain(' ');
342
+
343
+ done();
344
+ });
345
+ });
346
+
347
+ });
348
+
349
+
300
350
  it('should export svg', function(done) {
301
351
 
302
352
  // given
@@ -501,13 +551,123 @@ describe('Viewer', function() {
501
551
  var extensionElements = sendTask.extensionElements;
502
552
 
503
553
  // receive task should be moddle extended
504
- expect(sendTask.$instanceOf('camunda:ServiceTaskLike')).to.exist;
554
+ expect(sendTask.$instanceOf('camunda:ServiceTaskLike')).to.be.true;
505
555
 
506
556
  // extension elements should provide typed element
507
557
  expect(extensionElements).to.exist;
508
558
 
509
559
  expect(extensionElements.values.length).to.equal(1);
510
- expect(extensionElements.values[0].$instanceOf('camunda:InputOutput')).to.exist;
560
+ expect(extensionElements.values[0].$instanceOf('camunda:InputOutput')).to.be.true;
561
+
562
+ done(err);
563
+ });
564
+
565
+ });
566
+
567
+
568
+ it('should allow to add default custom moddle extensions', function(done) {
569
+
570
+ // given
571
+ var xml = require('../fixtures/bpmn/extension/custom.bpmn'),
572
+ additionalModdleDescriptors = {
573
+ custom: require('../fixtures/json/model/custom')
574
+ };
575
+
576
+ function CustomViewer(options) {
577
+ Viewer.call(this, options);
578
+ }
579
+
580
+ inherits(CustomViewer, Viewer);
581
+
582
+ CustomViewer.prototype._moddleExtensions = additionalModdleDescriptors;
583
+
584
+ viewer = new CustomViewer({
585
+ container: container,
586
+ moddleExtensions: {
587
+ camunda: camundaPackage
588
+ }
589
+ });
590
+
591
+ // when
592
+ viewer.importXML(xml, function(err, warnings) {
593
+
594
+ var elementRegistry = viewer.get('elementRegistry');
595
+
596
+ var taskShape = elementRegistry.get('send'),
597
+ sendTask = taskShape.businessObject;
598
+
599
+ // then
600
+ expect(sendTask).to.exist;
601
+
602
+ var extensionElements = sendTask.extensionElements;
603
+
604
+ // receive task should be moddle extended
605
+ expect(sendTask.$instanceOf('camunda:ServiceTaskLike')).to.be.true;
606
+ expect(sendTask.$instanceOf('custom:ServiceTaskGroup')).to.be.true;
607
+
608
+ // extension elements should provide typed element
609
+ expect(extensionElements).to.exist;
610
+
611
+ expect(extensionElements.values.length).to.equal(2);
612
+ expect(extensionElements.values[0].$instanceOf('camunda:InputOutput')).to.be.true;
613
+
614
+ expect(extensionElements.values[1].$instanceOf('custom:CustomSendElement')).to.be.true;
615
+
616
+ done(err);
617
+ });
618
+
619
+ });
620
+
621
+
622
+ it('should allow user to override default custom moddle extensions', function(done) {
623
+
624
+ // given
625
+ var xml = require('../fixtures/bpmn/extension/custom-override.bpmn'),
626
+ additionalModdleDescriptors = {
627
+ custom: require('../fixtures/json/model/custom')
628
+ },
629
+ customOverride = require('../fixtures/json/model/custom-override');
630
+
631
+ function CustomViewer(options) {
632
+ Viewer.call(this, options);
633
+ }
634
+
635
+ inherits(CustomViewer, Viewer);
636
+
637
+ CustomViewer.prototype._moddleExtensions = additionalModdleDescriptors;
638
+
639
+ viewer = new CustomViewer({
640
+ container: container,
641
+ moddleExtensions: {
642
+ camunda: camundaPackage,
643
+ custom : customOverride
644
+ }
645
+ });
646
+
647
+ // when
648
+ viewer.importXML(xml, function(err, warnings) {
649
+
650
+ var elementRegistry = viewer.get('elementRegistry');
651
+
652
+ var taskShape = elementRegistry.get('send'),
653
+ sendTask = taskShape.businessObject;
654
+
655
+ // then
656
+ expect(sendTask).to.exist;
657
+
658
+ var extensionElements = sendTask.extensionElements;
659
+
660
+ // receive task should be moddle extended
661
+ expect(sendTask.$instanceOf('camunda:ServiceTaskLike')).to.be.true;
662
+ expect(sendTask.$instanceOf('custom:ServiceTaskGroupOverride')).to.be.true;
663
+
664
+ // extension elements should provide typed element
665
+ expect(extensionElements).to.exist;
666
+
667
+ expect(extensionElements.values.length).to.equal(2);
668
+ expect(extensionElements.values[0].$instanceOf('camunda:InputOutput')).to.be.true;
669
+
670
+ expect(extensionElements.values[1].$instanceOf('custom:CustomSendElementOverride')).to.be.true;
511
671
 
512
672
  done(err);
513
673
  });
@@ -566,6 +726,69 @@ describe('Viewer', function() {
566
726
  });
567
727
 
568
728
 
729
+ describe('#importXML', function() {
730
+
731
+ it('should emit <import.*> events', function(done) {
732
+
733
+ // given
734
+ var viewer = new Viewer({ container: container });
735
+
736
+ var xml = require('../fixtures/bpmn/simple.bpmn');
737
+
738
+ var events = [];
739
+
740
+ viewer.on([
741
+ 'import.parse.start',
742
+ 'import.parse.complete',
743
+ 'import.render.start',
744
+ 'import.render.complete',
745
+ 'import.done'
746
+ ], function(e) {
747
+ // log event type + event arguments
748
+ events.push([
749
+ e.type,
750
+ Object.keys(e).filter(function(key) {
751
+ return key !== 'type';
752
+ })
753
+ ]);
754
+ });
755
+
756
+ // when
757
+ viewer.importXML(xml, function(err) {
758
+
759
+ // then
760
+ expect(events).to.eql([
761
+ [ 'import.parse.start', [ 'xml' ] ],
762
+ [ 'import.parse.complete', ['error', 'definitions', 'context' ] ],
763
+ [ 'import.render.start', [ 'definitions' ] ],
764
+ [ 'import.render.complete', [ 'error', 'warnings' ] ],
765
+ [ 'import.done', [ 'error', 'warnings' ] ]
766
+ ]);
767
+
768
+ done(err);
769
+ });
770
+ });
771
+
772
+
773
+ it('should work without callback', function(done) {
774
+
775
+ // given
776
+ var viewer = new Viewer({ container: container });
777
+
778
+ var xml = require('../fixtures/bpmn/simple.bpmn');
779
+
780
+ // when
781
+ viewer.importXML(xml);
782
+
783
+ // then
784
+ viewer.on('import.done', function(event) {
785
+ done();
786
+ });
787
+ });
788
+
789
+ });
790
+
791
+
569
792
  describe('#on', function() {
570
793
 
571
794
  it('should fire with given three', function(done) {
@@ -596,6 +819,68 @@ describe('Viewer', function() {
596
819
  });
597
820
 
598
821
 
822
+ describe('#off', function() {
823
+
824
+ var xml = require('../fixtures/bpmn/simple.bpmn');
825
+
826
+ it('should remove listener permanently', function(done) {
827
+
828
+ // given
829
+ var viewer = new Viewer({ container: container });
830
+
831
+ var handler = function() {
832
+ return 'bar';
833
+ };
834
+
835
+ viewer.on('foo', 1000, handler);
836
+
837
+ // when
838
+ viewer.off('foo');
839
+
840
+ // then
841
+ viewer.importXML(xml, function(err) {
842
+ var eventBus = viewer.get('eventBus');
843
+
844
+ var result = eventBus.fire('foo');
845
+
846
+ expect(result).not.to.exist;
847
+
848
+ done();
849
+ });
850
+
851
+ });
852
+
853
+
854
+ it('should remove listener on existing diagram instance', function(done) {
855
+
856
+ // given
857
+ var viewer = new Viewer({ container: container });
858
+
859
+ var handler = function() {
860
+ return 'bar';
861
+ };
862
+
863
+ viewer.on('foo', 1000, handler);
864
+
865
+ // when
866
+ viewer.importXML(xml, function(err) {
867
+ var eventBus = viewer.get('eventBus');
868
+
869
+ // when
870
+ viewer.off('foo', handler);
871
+
872
+ var result = eventBus.fire('foo');
873
+
874
+ expect(result).not.to.exist;
875
+
876
+ done();
877
+ });
878
+
879
+ });
880
+
881
+ });
882
+
883
+
599
884
  describe('#destroy', function() {
600
885
 
601
886
  it('should remove traces in document tree', function() {
@@ -64,7 +64,7 @@ describe('features - context-pad', function() {
64
64
  inject(function (elementRegistry, contextPad, customRules) {
65
65
 
66
66
  // given
67
- customRules.addRule('elements.delete', function() {
67
+ customRules.addRule('elements.delete', 1500, function() {
68
68
  return true;
69
69
  });
70
70
 
@@ -82,7 +82,7 @@ describe('features - context-pad', function() {
82
82
  inject(function(elementRegistry, contextPad, customRules) {
83
83
 
84
84
  // given
85
- customRules.addRule('elements.delete', function() {
85
+ customRules.addRule('elements.delete', 1500, function() {
86
86
  return false;
87
87
  });
88
88
 
@@ -101,7 +101,7 @@ describe('features - context-pad', function() {
101
101
  // given
102
102
  var element = elementRegistry.get('StartEvent_1');
103
103
 
104
- customRules.addRule('elements.delete', function(context) {
104
+ customRules.addRule('elements.delete', 1500, function(context) {
105
105
 
106
106
  // element array is actually passed
107
107
  expect(context.elements).to.eql([ element ]);
@@ -120,7 +120,7 @@ describe('features - context-pad', function() {
120
120
  inject(function(elementRegistry, contextPad, customRules) {
121
121
 
122
122
  // given
123
- customRules.addRule('elements.delete', function(context) {
123
+ customRules.addRule('elements.delete', 1500, function(context) {
124
124
  return context.elements;
125
125
  });
126
126
 
@@ -138,7 +138,7 @@ describe('features - context-pad', function() {
138
138
  inject(function(elementRegistry, contextPad, customRules) {
139
139
 
140
140
  // given
141
- customRules.addRule('elements.delete', function() {
141
+ customRules.addRule('elements.delete', 1500, function() {
142
142
  return [];
143
143
  });
144
144