Skip to content

Commit ea85c8c

Browse files
authored
Feature/validate data item ids (#140)
* add validation to data objects * I realized that the request was for data inputs * minor fixes
1 parent d508ad0 commit ea85c8c

File tree

6 files changed

+121
-24
lines changed

6 files changed

+121
-24
lines changed

app/spiffworkflow/DataObject/propertiesPanel/DataObjectArray.js

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { useService } from 'bpmn-js-properties-panel';
2+
import { useCallback } from '@bpmn-io/properties-panel/preact/hooks';
23
import { SpiffExtensionTextInput } from '../../extensions/propertiesPanel/SpiffExtensionTextInput';
34
import {
45
isTextFieldEntryEdited,
@@ -13,7 +14,8 @@ import {
1314
idToHumanReadableName,
1415
findDataObject,
1516
} from '../DataObjectHelpers';
16-
import { processId } from '../../helpers';
17+
import { validateDataId } from '../../helpers';
18+
1719

1820
/**
1921
* Provides a list of data objects, and allows you to add / remove data objects, and change their ids.
@@ -140,41 +142,43 @@ function DataObjectTextField(props) {
140142
const commandStack = useService('commandStack');
141143
const debounce = useService('debounceInput');
142144

143-
const setValue = (value) => {
144-
try {
145-
// Check if new dataObject Id is not unique
146-
if (findDataObject(element.businessObject, value) !== undefined) {
147-
alert('Data Object ID Should be unique');
148-
return;
149-
}
150-
151-
// let doName = idToHumanReadableName(value);
152-
commandStack.execute('element.updateModdleProperties', {
153-
element,
154-
moddleElement: dataObject,
155-
properties: {
156-
id: processId(value),
157-
// name: doName
158-
},
159-
});
160-
// Update references name
161-
// updateDataObjectReferencesName(element, doName, value, commandStack);
162-
} catch (error) {
163-
console.log('Set Value Error : ', error);
164-
}
145+
const setValue = (value, error) => {
146+
if (error)
147+
return;
148+
149+
// let doName = idToHumanReadableName(value);
150+
commandStack.execute('element.updateModdleProperties', {
151+
element,
152+
moddleElement: dataObject,
153+
properties: {
154+
id: value,
155+
// name: doName
156+
},
157+
});
158+
// Update references name
159+
// updateDataObjectReferencesName(element, doName, value, commandStack);
165160
};
166161

167162
const getValue = () => {
168163
return dataObject.id;
169164
};
170165

166+
const validate = useCallback(value => {
167+
const current = findDataObject(element.businessObject, value);
168+
let message = validateDataId(value);
169+
if (current !== undefined && current !== dataObject)
170+
message = 'ID must be unique';
171+
return message;
172+
}, [element]);
173+
171174
return TextFieldEntry({
172175
element: parameter,
173176
id: `${idPrefix}-id`,
174177
label: 'Data Object Id',
175178
getValue,
176179
setValue,
177180
debounce,
181+
validate
178182
});
179183
}
180184

app/spiffworkflow/InputOutput/IoInterceptor.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export default class IoInterceptor extends CommandInterceptor {
3232
let di = context.shape.di;
3333
let generator = new IdGenerator(type_name);
3434
let dataIO = bpmnFactory.create(type, { id: generator.next() });
35+
dataIO.id = dataIO.id.replaceAll('-', '_');
3536
context.shape.businessObject = dataIO;
3637
dataIO.$parent = ioSpec;
3738
di.businessObject = dataIO;

app/spiffworkflow/InputOutput/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import IoPalette from './IoPalette';
22
import IoRules from './IoRules';
33
import IoInterceptor from './IoInterceptor';
44
import IoPropertiesProvider from './propertiesProvider/IoPropertiesProvider';
5+
import DataInputOutputPropertiesProvider from './propertiesProvider/DataInputOutputPropertiesProvider';
56

67
export default {
7-
__init__: ['IoPalette', 'IoRules', 'IoInterceptor', 'IoPropertiesProvider'],
8+
__init__: ['IoPalette', 'IoRules', 'IoInterceptor', 'IoPropertiesProvider', 'DataInputOutputPropertiesProvider'],
89
IoPalette: ['type', IoPalette],
910
IoRules: ['type', IoRules],
1011
IoInterceptor: ['type', IoInterceptor],
1112
IoPropertiesProvider: ['type', IoPropertiesProvider],
13+
DataInputOutputPropertiesProvider: ['type', DataInputOutputPropertiesProvider],
1214
};
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { useService } from 'bpmn-js-properties-panel';
2+
import { isTextFieldEntryEdited, TextFieldEntry } from '@bpmn-io/properties-panel';
3+
import { useCallback } from '@bpmn-io/properties-panel/preact/hooks';
4+
import { validateDataId } from '../../helpers';
5+
6+
const LOW_PRIORITY = 500;
7+
8+
export default function DataInputOutputPropertiesProvider(
9+
propertiesPanel,
10+
translate,
11+
moddle,
12+
commandStack,
13+
elementRegistry,
14+
bpmnFactory
15+
) {
16+
this.getGroups = function getGroupsCallback(element) {
17+
return function pushGroup(groups) {
18+
if (['bpmn:DataInput', 'bpmn:DataOutput'].includes(element.type)) {
19+
const general = groups.find(group => group.id == 'general');
20+
general.entries = general.entries.filter(entry => entry.id != 'id');
21+
general.entries.unshift({
22+
component: DataTextField,
23+
isEdited: isTextFieldEntryEdited,
24+
inputOrOutput: element.businessObject,
25+
});
26+
}
27+
return groups;
28+
};
29+
};
30+
propertiesPanel.registerProvider(LOW_PRIORITY, this);
31+
}
32+
33+
DataInputOutputPropertiesProvider.$inject = [
34+
'propertiesPanel',
35+
'translate',
36+
'moddle',
37+
'commandStack',
38+
'elementRegistry',
39+
'bpmnFactory',
40+
];
41+
42+
function DataTextField(props) {
43+
const { element, inputOrOutput } = props;
44+
45+
const commandStack = useService('commandStack');
46+
const debounce = useService('debounceInput');
47+
48+
const setValue = (value, error) => {
49+
if (error)
50+
return;
51+
52+
commandStack.execute('element.updateModdleProperties', {
53+
element,
54+
moddleElement: inputOrOutput,
55+
properties: {
56+
id: value,
57+
},
58+
});
59+
};
60+
61+
const getValue = () => {
62+
return inputOrOutput.id;
63+
};
64+
65+
const validate = useCallback(value => validateDataId(value), [element]);
66+
67+
return TextFieldEntry({
68+
element: element,
69+
id: 'id',
70+
label: 'ID',
71+
getValue,
72+
setValue,
73+
debounce,
74+
validate
75+
});
76+
}

app/spiffworkflow/helpers.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,14 @@ export function checkIfServiceTaskHasParameters(extensionElements) {
5959
});
6060
return hasParameters;
6161
}
62+
63+
export function validateDataId (value) {
64+
let message;
65+
if (!value)
66+
message = 'ID must not be empty.';
67+
else if (/\s+/.test(value))
68+
message = 'ID must not contain spaces';
69+
else if (/\-/.test(value))
70+
message = 'ID must not contain dashes';
71+
return message;
72+
}

app/spiffworkflow/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import ErrorPropertiesProvider from './errors/propertiesPanel/ErrorPropertiesPro
1717
import EscalationPropertiesProvider from './escalations/propertiesPanel/EscalationPropertiesProvider';
1818
import CallActivityPropertiesProvider from './callActivity/propertiesPanel/CallActivityPropertiesProvider';
1919
import IoPropertiesProvider from './InputOutput/propertiesProvider/IoPropertiesProvider';
20+
import DataInputOutputPropertiesProvider from './InputOutput/propertiesProvider/DataInputOutputPropertiesProvider';
2021
import StandardLoopPropertiesProvider from './loops/StandardLoopPropertiesProvider';
2122
import MultiInstancePropertiesProvider from './loops/MultiInstancePropertiesProvider';
2223
import CallActivityInterceptor from './callActivity/CallActivityInterceptor';
@@ -48,6 +49,7 @@ export default {
4849
'multiInstancePropertiesProvider',
4950
'standardLoopPropertiesProvider',
5051
'IoPropertiesProvider',
52+
'DataInputOutputPropertiesProvider',
5153
'callActivityInterceptor',
5254
],
5355
dataObjectInterceptor: ['type', DataObjectInterceptor],
@@ -72,5 +74,6 @@ export default {
7274
multiInstancePropertiesProvider: ['type', MultiInstancePropertiesProvider],
7375
standardLoopPropertiesProvider: ['type', StandardLoopPropertiesProvider],
7476
IoPropertiesProvider: ['type', IoPropertiesProvider],
77+
DataInputOutputPropertiesProvider: ['type', DataInputOutputPropertiesProvider],
7578
callActivityInterceptor: ['type', CallActivityInterceptor],
7679
};

0 commit comments

Comments
 (0)