Skip to content

Commit

Permalink
fix(timer-event): disallow cycle option for intermediate catch events
Browse files Browse the repository at this point in the history
  • Loading branch information
philippfromme authored and nikku committed Apr 5, 2018
1 parent c1d5128 commit 6c75717
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 159 deletions.
282 changes: 143 additions & 139 deletions lib/provider/bpmn/parts/implementation/TimerEventDefinition.js
Original file line number Diff line number Diff line change
@@ -1,139 +1,143 @@
'use strict';

var elementHelper = require('../../../../helper/ElementHelper'),
cmdHelper = require('../../../../helper/CmdHelper');

var entryFactory = require('../../../../factory/EntryFactory');

/**
* Get the timer definition type for a given timer event definition.
*
* @param {ModdleElement<bpmn:TimerEventDefinition>} timer
*
* @return {string|undefined} the timer definition type
*/
function getTimerDefinitionType(timer) {
var timeDate = timer.get('timeDate');
if (typeof timeDate !== 'undefined') {
return 'timeDate';
}

var timeCycle = timer.get('timeCycle');
if (typeof timeCycle !== 'undefined') {
return 'timeCycle';
}

var timeDuration = timer.get('timeDuration');
if (typeof timeDuration !== 'undefined') {
return 'timeDuration';
}
}

/**
* Creates 'bpmn:FormalExpression' element.
*
* @param {ModdleElement} parent
* @param {string} body
* @param {BpmnFactory} bpmnFactory
*
* @return {ModdleElement<bpmn:FormalExpression>} a formal expression
*/
function createFormalExpression(parent, body, bpmnFactory) {
body = body || undefined;
return elementHelper.createElement('bpmn:FormalExpression', { body: body }, parent, bpmnFactory);
}

function TimerEventDefinition(group, element, bpmnFactory, timerEventDefinition) {

var selectOptions = [
{ value: 'timeDate', name: 'Date' },
{ value: 'timeDuration', name: 'Duration' },
{ value: 'timeCycle', name: 'Cycle' }
];

group.entries.push(entryFactory.selectBox({
id: 'timer-event-definition-type',
label: 'Timer Definition Type',
selectOptions: selectOptions,
emptyParameter: true,
modelProperty: 'timerDefinitionType',

get: function(element, node) {
return {
timerDefinitionType: getTimerDefinitionType(timerEventDefinition) || ''
};
},

set: function(element, values) {
var props = {
timeDuration: undefined,
timeDate: undefined,
timeCycle: undefined
};

var newType = values.timerDefinitionType;
if (values.timerDefinitionType) {
var oldType = getTimerDefinitionType(timerEventDefinition);

var value;
if (oldType) {
var definition = timerEventDefinition.get(oldType);
value = definition.get('body');
}

props[newType] = createFormalExpression(timerEventDefinition, value, bpmnFactory);
}

return cmdHelper.updateBusinessObject(element, timerEventDefinition, props);
}

}));


group.entries.push(entryFactory.textField({
id: 'timer-event-definition',
label: 'Timer Definition',
modelProperty: 'timerDefinition',

get: function(element, node) {
var type = getTimerDefinitionType(timerEventDefinition);
var definition = type && timerEventDefinition.get(type);
var value = definition && definition.get('body');
return {
timerDefinition: value
};
},

set: function(element, values) {
var type = getTimerDefinitionType(timerEventDefinition);
var definition = type && timerEventDefinition.get(type);

if (definition) {
return cmdHelper.updateBusinessObject(element, definition, {
body: values.timerDefinition || undefined
});
}
},

validate: function(element) {
var type = getTimerDefinitionType(timerEventDefinition);
var definition = type && timerEventDefinition.get(type);
if (definition) {
var value = definition.get('body');
if (!value) {
return {
timerDefinition: 'Must provide a value'
};
}
}
},

hidden: function(element) {
return !getTimerDefinitionType(timerEventDefinition);
}

}));

}

module.exports = TimerEventDefinition;
'use strict';

var elementHelper = require('../../../../helper/ElementHelper'),
cmdHelper = require('../../../../helper/CmdHelper'),
is = require('bpmn-js/lib/util/ModelUtil').is;

var entryFactory = require('../../../../factory/EntryFactory');

/**
* Get the timer definition type for a given timer event definition.
*
* @param {ModdleElement<bpmn:TimerEventDefinition>} timer
*
* @return {string|undefined} the timer definition type
*/
function getTimerDefinitionType(timer) {
var timeDate = timer.get('timeDate');
if (typeof timeDate !== 'undefined') {
return 'timeDate';
}

var timeCycle = timer.get('timeCycle');
if (typeof timeCycle !== 'undefined') {
return 'timeCycle';
}

var timeDuration = timer.get('timeDuration');
if (typeof timeDuration !== 'undefined') {
return 'timeDuration';
}
}

/**
* Creates 'bpmn:FormalExpression' element.
*
* @param {ModdleElement} parent
* @param {string} body
* @param {BpmnFactory} bpmnFactory
*
* @return {ModdleElement<bpmn:FormalExpression>} a formal expression
*/
function createFormalExpression(parent, body, bpmnFactory) {
body = body || undefined;
return elementHelper.createElement('bpmn:FormalExpression', { body: body }, parent, bpmnFactory);
}

function TimerEventDefinition(group, element, bpmnFactory, timerEventDefinition) {

var selectOptions = [
{ value: 'timeDate', name: 'Date' },
{ value: 'timeDuration', name: 'Duration' }
];

if (!is(element, 'bpmn:IntermediateCatchEvent')) {
selectOptions.push({ value: 'timeCycle', name: 'Cycle' });
}

group.entries.push(entryFactory.selectBox({
id: 'timer-event-definition-type',
label: 'Timer Definition Type',
selectOptions: selectOptions,
emptyParameter: true,
modelProperty: 'timerDefinitionType',

get: function(element, node) {
return {
timerDefinitionType: getTimerDefinitionType(timerEventDefinition) || ''
};
},

set: function(element, values) {
var props = {
timeDuration: undefined,
timeDate: undefined,
timeCycle: undefined
};

var newType = values.timerDefinitionType;
if (values.timerDefinitionType) {
var oldType = getTimerDefinitionType(timerEventDefinition);

var value;
if (oldType) {
var definition = timerEventDefinition.get(oldType);
value = definition.get('body');
}

props[newType] = createFormalExpression(timerEventDefinition, value, bpmnFactory);
}

return cmdHelper.updateBusinessObject(element, timerEventDefinition, props);
}

}));


group.entries.push(entryFactory.textField({
id: 'timer-event-definition',
label: 'Timer Definition',
modelProperty: 'timerDefinition',

get: function(element, node) {
var type = getTimerDefinitionType(timerEventDefinition);
var definition = type && timerEventDefinition.get(type);
var value = definition && definition.get('body');
return {
timerDefinition: value
};
},

set: function(element, values) {
var type = getTimerDefinitionType(timerEventDefinition);
var definition = type && timerEventDefinition.get(type);

if (definition) {
return cmdHelper.updateBusinessObject(element, definition, {
body: values.timerDefinition || undefined
});
}
},

validate: function(element) {
var type = getTimerDefinitionType(timerEventDefinition);
var definition = type && timerEventDefinition.get(type);
if (definition) {
var value = definition.get('body');
if (!value) {
return {
timerDefinition: 'Must provide a value'
};
}
}
},

hidden: function(element) {
return !getTimerDefinitionType(timerEventDefinition);
}

}));

}

module.exports = TimerEventDefinition;
49 changes: 29 additions & 20 deletions test/spec/provider/bpmn/TimerEventDefinition.bpmn
Original file line number Diff line number Diff line change
@@ -1,49 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.13.0-dev">
<bpmn:process id="Process_1" isExecutable="false">
<bpmn:intermediateCatchEvent id="WITHOUT_TYPE">
<bpmn:startEvent id="WITHOUT_TYPE">
<bpmn:timerEventDefinition />
</bpmn:intermediateCatchEvent>
<bpmn:intermediateCatchEvent id="TIME_DATE">
</bpmn:startEvent>
<bpmn:startEvent id="TIME_DATE">
<bpmn:timerEventDefinition>
<bpmn:timeDate xsi:type="bpmn:tFormalExpression">date</bpmn:timeDate>
</bpmn:timerEventDefinition>
</bpmn:intermediateCatchEvent>
<bpmn:intermediateCatchEvent id="TIME_DURATION">
</bpmn:startEvent>
<bpmn:startEvent id="TIME_DURATION">
<bpmn:timerEventDefinition>
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression">duration</bpmn:timeDuration>
</bpmn:timerEventDefinition>
</bpmn:intermediateCatchEvent>
<bpmn:intermediateCatchEvent id="TIME_CYCLE">
</bpmn:startEvent>
<bpmn:startEvent id="TIME_CYCLE">
<bpmn:timerEventDefinition>
<bpmn:timeCycle xsi:type="bpmn:tFormalExpression">cycle</bpmn:timeCycle>
</bpmn:timerEventDefinition>
</bpmn:startEvent>
<bpmn:intermediateCatchEvent id="IntermediateThrowEvent">
<bpmn:timerEventDefinition />
</bpmn:intermediateCatchEvent>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
<bpmndi:BPMNShape id="IntermediateCatchEvent_1y31wqa_di" bpmnElement="WITHOUT_TYPE">
<dc:Bounds x="173" y="160" width="36" height="36" />
<bpmndi:BPMNShape id="StartEvent_19evn21_di" bpmnElement="WITHOUT_TYPE">
<dc:Bounds x="27" y="0" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="0" y="36" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="StartEvent_0fxeikk_di" bpmnElement="TIME_DATE">
<dc:Bounds x="81" y="0" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="146" y="196" width="90" height="20" />
<dc:Bounds x="54" y="36" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="IntermediateCatchEvent_0sawau6_di" bpmnElement="TIME_DATE">
<dc:Bounds x="235" y="160" width="36" height="36" />
<bpmndi:BPMNShape id="StartEvent_1nl9h5c_di" bpmnElement="TIME_DURATION">
<dc:Bounds x="140" y="0" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="208" y="196" width="90" height="20" />
<dc:Bounds x="113" y="36" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="IntermediateCatchEvent_1u6r0ys_di" bpmnElement="TIME_DURATION">
<dc:Bounds x="287" y="160" width="36" height="36" />
<bpmndi:BPMNShape id="StartEvent_0g7e3hq_di" bpmnElement="TIME_CYCLE">
<dc:Bounds x="194" y="0" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="260" y="196" width="90" height="20" />
<dc:Bounds x="167" y="36" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="IntermediateCatchEvent_00d4awj_di" bpmnElement="TIME_CYCLE">
<dc:Bounds x="340" y="160" width="36" height="36" />
<bpmndi:BPMNShape id="IntermediateCatchEvent_1xjzqq5_di" bpmnElement="IntermediateThrowEvent">
<dc:Bounds x="27" y="54" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="313" y="196" width="90" height="20" />
<dc:Bounds x="45" y="94" width="0" height="12" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
Expand Down
Loading

0 comments on commit 6c75717

Please sign in to comment.