Skip to content

Commit 0381811

Browse files
Ricardo Matiasnikku
Ricardo Matias
authored andcommittedApr 16, 2015
feat(space-tool): add create/remove space behaviour
closes bpmn-io#132
1 parent c4ceac3 commit 0381811

File tree

5 files changed

+243
-6
lines changed

5 files changed

+243
-6
lines changed
 

‎CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ We love you to contribute to this project by filing bugs, helping others on the
66
## Creating issues
77

88
We use our [issue tracker](https://github.com/bpmn-io/bpmn-js/issues) for project communication.
9-
When using the issue tracker,
9+
When using the issue tracker:
1010

1111
* Be descriptive when creating an issue (what, where, when and how does a problem pop up)?
1212
* Attach steps to reproduce (if applicable)

‎lib/Modeler.js

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ Modeler.prototype._modelingModules = [
6868
require('diagram-js/lib/features/move'),
6969
require('diagram-js/lib/features/bendpoints'),
7070
require('diagram-js/lib/features/resize'),
71+
require('diagram-js/lib/features/space-tool'),
7172
require('diagram-js/lib/features/lasso-tool'),
7273
require('./features/modeling'),
7374
require('./features/context-pad'),

‎lib/features/palette/PaletteProvider.js

+15-4
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,26 @@ var assign = require('lodash/object/assign');
55
/**
66
* A palette provider for BPMN 2.0 elements.
77
*/
8-
function PaletteProvider(palette, create, elementFactory) {
8+
function PaletteProvider(palette, create, elementFactory, spaceTool) {
99

1010
this._create = create;
1111
this._elementFactory = elementFactory;
12+
this._spaceTool = spaceTool;
1213

1314
palette.registerProvider(this);
1415
}
1516

1617
module.exports = PaletteProvider;
1718

18-
PaletteProvider.$inject = [ 'palette', 'create', 'elementFactory' ];
19+
PaletteProvider.$inject = [ 'palette', 'create', 'elementFactory', 'spaceTool' ];
1920

2021

2122
PaletteProvider.prototype.getPaletteEntries = function(element) {
2223

2324
var actions = {},
2425
create = this._create,
25-
elementFactory = this._elementFactory;
26+
elementFactory = this._elementFactory,
27+
spaceTool = this._spaceTool;
2628

2729

2830
function createAction(type, group, className, title, options) {
@@ -52,8 +54,17 @@ PaletteProvider.prototype.getPaletteEntries = function(element) {
5254
create.start(event, elementFactory.createParticipantShape(collapsed));
5355
}
5456

55-
5657
assign(actions, {
58+
'space-tool': {
59+
group: 'tool',
60+
className: 'icon-edit-space-tool',
61+
title: 'Create/remove space on the diagram',
62+
action: {
63+
click: function(event) {
64+
spaceTool.activateSelection(event);
65+
}
66+
}
67+
},
5768
'create.start-event': createAction(
5869
'bpmn:StartEvent', 'event', 'icon-start-event-none'
5970
),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
'use strict';
2+
3+
var Matchers = require('../../../Matchers'),
4+
TestHelper = require('../../../TestHelper');
5+
6+
/* global bootstrapModeler, inject */
7+
8+
9+
var modelingModule = require('../../../../lib/features/modeling'),
10+
coreModule = require('../../../../lib/core');
11+
12+
13+
describe('features/modeling - create/remove space', function() {
14+
15+
beforeEach(Matchers.addDeepEquals);
16+
17+
18+
var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');
19+
20+
var testModules = [ coreModule, modelingModule ];
21+
22+
beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
23+
24+
25+
describe('create space', function() {
26+
27+
28+
it('should create space to the right', inject(function(elementRegistry, modeling) {
29+
30+
// given
31+
var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'),
32+
sequenceFlow = sequenceFlowElement.businessObject;
33+
34+
var subProcessElement = elementRegistry.get('SubProcess_1'),
35+
subProcess = subProcessElement.businessObject;
36+
37+
var endEventElement = elementRegistry.get('EndEvent_1'),
38+
endEvent = endEventElement.businessObject;
39+
40+
41+
var subProcOldPos = {
42+
x: subProcessElement.x,
43+
y: subProcessElement.y
44+
};
45+
46+
var endEventOldPos = {
47+
x: endEventElement.x,
48+
y: endEventElement.y
49+
};
50+
51+
var delta = { x: 50, y: 0 },
52+
direction = 'e';
53+
54+
// when
55+
modeling.createSpace([subProcessElement, endEventElement], [], delta, direction);
56+
57+
// then
58+
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x + 50);
59+
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y);
60+
61+
expect(endEvent.di.bounds.x).toBe(endEventOldPos.x + 50);
62+
expect(endEvent.di.bounds.y).toBe(endEventOldPos.y);
63+
64+
expect(sequenceFlow.di.waypoint).toDeepEqual([
65+
{ $type: 'dc:Point', x: 144, y: 230 },
66+
{ $type: 'dc:Point', x: 350, y: 230 },
67+
]);
68+
}));
69+
70+
71+
it('should create space downwards', inject(function(elementRegistry, modeling) {
72+
73+
// given
74+
var startEventElement = elementRegistry.get('StartEvent_2'),
75+
startEvent = startEventElement.businessObject;
76+
77+
var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'),
78+
sequenceFlow = sequenceFlowElement.businessObject;
79+
80+
var subProcessElement = elementRegistry.get('SubProcess_1'),
81+
subProcess = subProcessElement.businessObject;
82+
83+
var endEventElement = elementRegistry.get('EndEvent_1'),
84+
endEvent = endEventElement.businessObject;
85+
86+
var startEventOldPos = {
87+
x: startEventElement.x,
88+
y: startEventElement.y
89+
};
90+
91+
var subProcOldPos = {
92+
x: subProcessElement.x,
93+
y: subProcessElement.y
94+
};
95+
96+
var endEventOldPos = {
97+
x: endEventElement.x,
98+
y: endEventElement.y
99+
};
100+
101+
var delta = { x: 0, y: 50 },
102+
direction = 's';
103+
104+
// when
105+
modeling.createSpace([startEventElement ,subProcessElement, endEventElement], [], delta, direction);
106+
107+
// then
108+
expect(startEvent.di.bounds.x).toBe(startEventOldPos.x);
109+
expect(startEvent.di.bounds.y).toBe(startEventOldPos.y + 50);
110+
111+
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x);
112+
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y + 50);
113+
114+
expect(endEvent.di.bounds.x).toBe(endEventOldPos.x);
115+
expect(endEvent.di.bounds.y).toBe(endEventOldPos.y + 50);
116+
117+
expect(sequenceFlow.di.waypoint).toDeepEqual([
118+
{ $type: 'dc:Point', x: 144, y: 280 },
119+
{ $type: 'dc:Point', x: 300, y: 280 },
120+
]);
121+
}));
122+
123+
124+
it('should remove space to the left', inject(function(elementRegistry, modeling) {
125+
126+
// given
127+
var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'),
128+
sequenceFlow = sequenceFlowElement.businessObject;
129+
130+
var subProcessElement = elementRegistry.get('SubProcess_1'),
131+
subProcess = subProcessElement.businessObject;
132+
133+
var endEventElement = elementRegistry.get('EndEvent_1'),
134+
endEvent = endEventElement.businessObject;
135+
136+
var subProcOldPos = {
137+
x: subProcessElement.x,
138+
y: subProcessElement.y
139+
};
140+
141+
var endEventOldPos = {
142+
x: endEventElement.x,
143+
y: endEventElement.y
144+
};
145+
146+
var delta = { x: -50, y: 0 },
147+
direction = 'w';
148+
149+
// when
150+
modeling.createSpace([subProcessElement, endEventElement], [], delta, direction);
151+
152+
// then
153+
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x - 50);
154+
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y);
155+
156+
expect(endEvent.di.bounds.x).toBe(endEventOldPos.x - 50);
157+
expect(endEvent.di.bounds.y).toBe(endEventOldPos.y);
158+
159+
expect(sequenceFlow.di.waypoint).toDeepEqual([
160+
{ $type: 'dc:Point', x: 144, y: 230 },
161+
{ $type: 'dc:Point', x: 250, y: 230 },
162+
]);
163+
}));
164+
165+
166+
it('should resize to the right', inject(function(elementRegistry, modeling) {
167+
168+
// given
169+
var taskElement = elementRegistry.get('Task_1'),
170+
task = taskElement.businessObject;
171+
172+
var subProcessElement = elementRegistry.get('SubProcess_1'),
173+
subProcess = subProcessElement.businessObject;
174+
175+
var startEventElement = elementRegistry.get('StartEvent_1'),
176+
startEvent = startEventElement.businessObject;
177+
178+
var startEventElement2 = elementRegistry.get('StartEvent_2'),
179+
startEvent2 = startEventElement2.businessObject;
180+
181+
var subProcOldPos = {
182+
x: subProcessElement.x,
183+
y: subProcessElement.y,
184+
width: subProcessElement.width,
185+
height: subProcessElement.height
186+
};
187+
188+
var startEventOldPos2 = {
189+
x: startEventElement2.x,
190+
y: startEventElement2.y
191+
};
192+
193+
var startEventOldPos = {
194+
x: startEventElement.x,
195+
y: startEventElement.y
196+
};
197+
198+
var taskOldPos = {
199+
x: taskElement.x,
200+
y: taskElement.y
201+
};
202+
203+
var delta = { x: 50, y: 0 },
204+
direction = 'w';
205+
206+
// when
207+
modeling.createSpace([startEventElement, startEventElement2, taskElement], [subProcessElement], delta, direction);
208+
209+
// then
210+
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x + 50);
211+
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y);
212+
expect(subProcess.di.bounds.width).toBe(subProcOldPos.width - 50);
213+
expect(subProcess.di.bounds.height).toBe(subProcOldPos.height);
214+
215+
expect(startEvent.di.bounds.x).toBe(startEventOldPos.x + 50);
216+
expect(startEvent.di.bounds.y).toBe(startEventOldPos.y);
217+
218+
expect(startEvent2.di.bounds.x).toBe(startEventOldPos2.x + 50);
219+
expect(startEvent2.di.bounds.y).toBe(startEventOldPos2.y);
220+
221+
expect(task.di.bounds.x).toBe(taskOldPos.x + 50);
222+
expect(task.di.bounds.y).toBe(taskOldPos.y);
223+
}));
224+
});
225+
});

‎test/spec/features/palette/PaletteProviderSpec.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ describe('palette', function() {
3232
var paletteElement = domQuery('.djs-palette', container);
3333

3434
// then
35-
expect(domQuery.all('.entry', paletteElement).length).toBe(8);
35+
expect(domQuery.all('.entry', paletteElement).length).toBe(9);
3636

3737
done(err);
3838
});

0 commit comments

Comments
 (0)
Please sign in to comment.