feat(space-tool): add create/remove space behaviour

closes #132
This commit is contained in:
Ricardo Matias 2015-04-15 09:43:55 +02:00 committed by Nico Rehwaldt
parent c4ceac39ae
commit 0381811d03
5 changed files with 243 additions and 6 deletions

View File

@ -6,7 +6,7 @@ We love you to contribute to this project by filing bugs, helping others on the
## Creating issues ## Creating issues
We use our [issue tracker](https://github.com/bpmn-io/bpmn-js/issues) for project communication. We use our [issue tracker](https://github.com/bpmn-io/bpmn-js/issues) for project communication.
When using the issue tracker, When using the issue tracker:
* Be descriptive when creating an issue (what, where, when and how does a problem pop up)? * Be descriptive when creating an issue (what, where, when and how does a problem pop up)?
* Attach steps to reproduce (if applicable) * Attach steps to reproduce (if applicable)

View File

@ -68,6 +68,7 @@ Modeler.prototype._modelingModules = [
require('diagram-js/lib/features/move'), require('diagram-js/lib/features/move'),
require('diagram-js/lib/features/bendpoints'), require('diagram-js/lib/features/bendpoints'),
require('diagram-js/lib/features/resize'), require('diagram-js/lib/features/resize'),
require('diagram-js/lib/features/space-tool'),
require('diagram-js/lib/features/lasso-tool'), require('diagram-js/lib/features/lasso-tool'),
require('./features/modeling'), require('./features/modeling'),
require('./features/context-pad'), require('./features/context-pad'),

View File

@ -5,24 +5,26 @@ var assign = require('lodash/object/assign');
/** /**
* A palette provider for BPMN 2.0 elements. * A palette provider for BPMN 2.0 elements.
*/ */
function PaletteProvider(palette, create, elementFactory) { function PaletteProvider(palette, create, elementFactory, spaceTool) {
this._create = create; this._create = create;
this._elementFactory = elementFactory; this._elementFactory = elementFactory;
this._spaceTool = spaceTool;
palette.registerProvider(this); palette.registerProvider(this);
} }
module.exports = PaletteProvider; module.exports = PaletteProvider;
PaletteProvider.$inject = [ 'palette', 'create', 'elementFactory' ]; PaletteProvider.$inject = [ 'palette', 'create', 'elementFactory', 'spaceTool' ];
PaletteProvider.prototype.getPaletteEntries = function(element) { PaletteProvider.prototype.getPaletteEntries = function(element) {
var actions = {}, var actions = {},
create = this._create, create = this._create,
elementFactory = this._elementFactory; elementFactory = this._elementFactory,
spaceTool = this._spaceTool;
function createAction(type, group, className, title, options) { function createAction(type, group, className, title, options) {
@ -52,8 +54,17 @@ PaletteProvider.prototype.getPaletteEntries = function(element) {
create.start(event, elementFactory.createParticipantShape(collapsed)); create.start(event, elementFactory.createParticipantShape(collapsed));
} }
assign(actions, { assign(actions, {
'space-tool': {
group: 'tool',
className: 'icon-edit-space-tool',
title: 'Create/remove space on the diagram',
action: {
click: function(event) {
spaceTool.activateSelection(event);
}
}
},
'create.start-event': createAction( 'create.start-event': createAction(
'bpmn:StartEvent', 'event', 'icon-start-event-none' 'bpmn:StartEvent', 'event', 'icon-start-event-none'
), ),

View File

@ -0,0 +1,225 @@
'use strict';
var Matchers = require('../../../Matchers'),
TestHelper = require('../../../TestHelper');
/* global bootstrapModeler, inject */
var modelingModule = require('../../../../lib/features/modeling'),
coreModule = require('../../../../lib/core');
describe('features/modeling - create/remove space', function() {
beforeEach(Matchers.addDeepEquals);
var diagramXML = require('../../../fixtures/bpmn/simple.bpmn');
var testModules = [ coreModule, modelingModule ];
beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
describe('create space', function() {
it('should create space to the right', inject(function(elementRegistry, modeling) {
// given
var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'),
sequenceFlow = sequenceFlowElement.businessObject;
var subProcessElement = elementRegistry.get('SubProcess_1'),
subProcess = subProcessElement.businessObject;
var endEventElement = elementRegistry.get('EndEvent_1'),
endEvent = endEventElement.businessObject;
var subProcOldPos = {
x: subProcessElement.x,
y: subProcessElement.y
};
var endEventOldPos = {
x: endEventElement.x,
y: endEventElement.y
};
var delta = { x: 50, y: 0 },
direction = 'e';
// when
modeling.createSpace([subProcessElement, endEventElement], [], delta, direction);
// then
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x + 50);
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y);
expect(endEvent.di.bounds.x).toBe(endEventOldPos.x + 50);
expect(endEvent.di.bounds.y).toBe(endEventOldPos.y);
expect(sequenceFlow.di.waypoint).toDeepEqual([
{ $type: 'dc:Point', x: 144, y: 230 },
{ $type: 'dc:Point', x: 350, y: 230 },
]);
}));
it('should create space downwards', inject(function(elementRegistry, modeling) {
// given
var startEventElement = elementRegistry.get('StartEvent_2'),
startEvent = startEventElement.businessObject;
var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'),
sequenceFlow = sequenceFlowElement.businessObject;
var subProcessElement = elementRegistry.get('SubProcess_1'),
subProcess = subProcessElement.businessObject;
var endEventElement = elementRegistry.get('EndEvent_1'),
endEvent = endEventElement.businessObject;
var startEventOldPos = {
x: startEventElement.x,
y: startEventElement.y
};
var subProcOldPos = {
x: subProcessElement.x,
y: subProcessElement.y
};
var endEventOldPos = {
x: endEventElement.x,
y: endEventElement.y
};
var delta = { x: 0, y: 50 },
direction = 's';
// when
modeling.createSpace([startEventElement ,subProcessElement, endEventElement], [], delta, direction);
// then
expect(startEvent.di.bounds.x).toBe(startEventOldPos.x);
expect(startEvent.di.bounds.y).toBe(startEventOldPos.y + 50);
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x);
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y + 50);
expect(endEvent.di.bounds.x).toBe(endEventOldPos.x);
expect(endEvent.di.bounds.y).toBe(endEventOldPos.y + 50);
expect(sequenceFlow.di.waypoint).toDeepEqual([
{ $type: 'dc:Point', x: 144, y: 280 },
{ $type: 'dc:Point', x: 300, y: 280 },
]);
}));
it('should remove space to the left', inject(function(elementRegistry, modeling) {
// given
var sequenceFlowElement = elementRegistry.get('SequenceFlow_3'),
sequenceFlow = sequenceFlowElement.businessObject;
var subProcessElement = elementRegistry.get('SubProcess_1'),
subProcess = subProcessElement.businessObject;
var endEventElement = elementRegistry.get('EndEvent_1'),
endEvent = endEventElement.businessObject;
var subProcOldPos = {
x: subProcessElement.x,
y: subProcessElement.y
};
var endEventOldPos = {
x: endEventElement.x,
y: endEventElement.y
};
var delta = { x: -50, y: 0 },
direction = 'w';
// when
modeling.createSpace([subProcessElement, endEventElement], [], delta, direction);
// then
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x - 50);
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y);
expect(endEvent.di.bounds.x).toBe(endEventOldPos.x - 50);
expect(endEvent.di.bounds.y).toBe(endEventOldPos.y);
expect(sequenceFlow.di.waypoint).toDeepEqual([
{ $type: 'dc:Point', x: 144, y: 230 },
{ $type: 'dc:Point', x: 250, y: 230 },
]);
}));
it('should resize to the right', inject(function(elementRegistry, modeling) {
// given
var taskElement = elementRegistry.get('Task_1'),
task = taskElement.businessObject;
var subProcessElement = elementRegistry.get('SubProcess_1'),
subProcess = subProcessElement.businessObject;
var startEventElement = elementRegistry.get('StartEvent_1'),
startEvent = startEventElement.businessObject;
var startEventElement2 = elementRegistry.get('StartEvent_2'),
startEvent2 = startEventElement2.businessObject;
var subProcOldPos = {
x: subProcessElement.x,
y: subProcessElement.y,
width: subProcessElement.width,
height: subProcessElement.height
};
var startEventOldPos2 = {
x: startEventElement2.x,
y: startEventElement2.y
};
var startEventOldPos = {
x: startEventElement.x,
y: startEventElement.y
};
var taskOldPos = {
x: taskElement.x,
y: taskElement.y
};
var delta = { x: 50, y: 0 },
direction = 'w';
// when
modeling.createSpace([startEventElement, startEventElement2, taskElement], [subProcessElement], delta, direction);
// then
expect(subProcess.di.bounds.x).toBe(subProcOldPos.x + 50);
expect(subProcess.di.bounds.y).toBe(subProcOldPos.y);
expect(subProcess.di.bounds.width).toBe(subProcOldPos.width - 50);
expect(subProcess.di.bounds.height).toBe(subProcOldPos.height);
expect(startEvent.di.bounds.x).toBe(startEventOldPos.x + 50);
expect(startEvent.di.bounds.y).toBe(startEventOldPos.y);
expect(startEvent2.di.bounds.x).toBe(startEventOldPos2.x + 50);
expect(startEvent2.di.bounds.y).toBe(startEventOldPos2.y);
expect(task.di.bounds.x).toBe(taskOldPos.x + 50);
expect(task.di.bounds.y).toBe(taskOldPos.y);
}));
});
});

View File

@ -32,7 +32,7 @@ describe('palette', function() {
var paletteElement = domQuery('.djs-palette', container); var paletteElement = domQuery('.djs-palette', container);
// then // then
expect(domQuery.all('.entry', paletteElement).length).toBe(8); expect(domQuery.all('.entry', paletteElement).length).toBe(9);
done(err); done(err);
}); });