Add bpmn:dataStore in the level of process definition

This commit is contained in:
theaubmov 2023-11-22 11:44:09 +01:00
parent 71cf495df1
commit cd6546d3e3
5 changed files with 48 additions and 18 deletions

View File

@ -1,10 +1,10 @@
import RulesModule from 'diagram-js/lib/features/rules'; import RulesModule from 'diagram-js/lib/features/rules';
import CustomDataStorePropertiesProvider from './propertiesPanel/CustomDataStorePropertiesProvider'; import DataStorePropertiesProvider from './propertiesPanel/DataStorePropertiesProvider';
export default { export default {
__depends__: [ __depends__: [
RulesModule RulesModule
], ],
__init__: [ 'dataSourcePropertiesProvider' ], __init__: [ 'dataSourcePropertiesProvider' ],
dataSourcePropertiesProvider: [ 'type', CustomDataStorePropertiesProvider ] dataSourcePropertiesProvider: [ 'type', DataStorePropertiesProvider ]
}; };

View File

@ -3,14 +3,13 @@ import { DataStoreSelect, OPTION_TYPE } from './DataStoreSelect';
const LOW_PRIORITY = 500; const LOW_PRIORITY = 500;
export default function CustomDataStorePropertiesProvider( export default function DataStorePropertiesProvider(
modeling, modeling,
propertiesPanel, propertiesPanel,
translate, translate,
moddle, moddle,
commandStack, commandStack,
bpmnFactory, bpmnFactory,
elementRegistry
) { ) {
this.getGroups = function (element) { this.getGroups = function (element) {
return function (groups) { return function (groups) {
@ -25,14 +24,13 @@ export default function CustomDataStorePropertiesProvider(
propertiesPanel.registerProvider(LOW_PRIORITY, this); propertiesPanel.registerProvider(LOW_PRIORITY, this);
} }
CustomDataStorePropertiesProvider.$inject = [ DataStorePropertiesProvider.$inject = [
'modeling', 'modeling',
'propertiesPanel', 'propertiesPanel',
'translate', 'translate',
'moddle', 'moddle',
'commandStack', 'commandStack',
'bpmnFactory', 'bpmnFactory',
'elementRegistry'
]; ];
function createCustomDataStoreGroup(modeling, element, translate, moddle, commandStack, bpmnFactory) { function createCustomDataStoreGroup(modeling, element, translate, moddle, commandStack, bpmnFactory) {
@ -56,7 +54,7 @@ function createCustomDataStoreGroup(modeling, element, translate, moddle, comman
label: translate('Select DataSource'), label: translate('Select DataSource'),
description: translate('Select a datasource from the list'), description: translate('Select a datasource from the list'),
modeling, modeling,
bpmnFactory bpmnFactory,
}) })
return group; return group;

View File

@ -1,5 +1,6 @@
import { useService } from 'bpmn-js-properties-panel'; import { useService } from 'bpmn-js-properties-panel';
import { SelectEntry } from '@bpmn-io/properties-panel'; import { SelectEntry } from '@bpmn-io/properties-panel';
import { is } from 'bpmn-js/lib/util/ModelUtil';
export const OPTION_TYPE = { export const OPTION_TYPE = {
data_stores: 'data_stores', data_stores: 'data_stores',
@ -8,13 +9,18 @@ export const OPTION_TYPE = {
export const spiffExtensionOptions = {}; export const spiffExtensionOptions = {};
export function DataStoreSelect(props) { export function DataStoreSelect(props) {
const { id, label, description, optionType } = props;
const { element } = props; const { element } = props;
const { commandStack } = props; const { commandStack } = props;
const { modeling, bpmnFactory } = props; const { modeling } = props;
const { id, label, description, optionType } = props; const { moddle } = props;
// const { bpmnFactory } = props;
const debounce = useService('debounceInput'); const debounce = useService('debounceInput');
const eventBus = useService('eventBus'); const eventBus = useService('eventBus');
const bpmnFactory = useService('bpmnFactory');
const getValue = () => { const getValue = () => {
const value = (element.businessObject.dataStoreRef) ? element.businessObject.dataStoreRef.id : ''; const value = (element.businessObject.dataStoreRef) ? element.businessObject.dataStoreRef.id : '';
@ -22,16 +28,34 @@ export function DataStoreSelect(props) {
}; };
const setValue = (value) => { const setValue = (value) => {
if(!value || value == ''){ if (!value || value == '') {
modeling.updateProperties(element, { modeling.updateProperties(element, {
dataStoreRef: null dataStoreRef: null
}); });
return; return;
} }
const dataStore = bpmnFactory.create('bpmn:DataStore', {
id: value, // Add DataStore to the BPMN model
name: 'DataStore_' + value const process = element.businessObject.$parent;
}); const definitions = process.$parent;
if (!definitions.get('rootElements')) {
definitions.set('rootElements', []);
}
// Create DataStore
let dataStore = definitions.get('rootElements').find(element =>
element.$type === 'bpmn:DataStore' && element.id === value
);
// If the DataStore doesn't exist, create new one
if (!dataStore) {
dataStore = bpmnFactory.create('bpmn:DataStore', {
id: value,
name: 'DataStore_' + value
});
definitions.get('rootElements').push(dataStore);
}
modeling.updateProperties(element, { modeling.updateProperties(element, {
dataStoreRef: dataStore dataStoreRef: dataStore
}); });
@ -64,7 +88,7 @@ export function DataStoreSelect(props) {
} }
return optionList; return optionList;
}; };
return SelectEntry({ return SelectEntry({
id, id,
element, element,

View File

@ -6,7 +6,7 @@ import DataObjectInterceptor from './DataObject/DataObjectInterceptor';
import DataObjectRules from './DataObject/DataObjectRules'; import DataObjectRules from './DataObject/DataObjectRules';
import DataObjectRenderer from './DataObject/DataObjectRenderer'; import DataObjectRenderer from './DataObject/DataObjectRenderer';
import DataObjectPropertiesProvider from './DataObject/propertiesPanel/DataObjectPropertiesProvider'; import DataObjectPropertiesProvider from './DataObject/propertiesPanel/DataObjectPropertiesProvider';
import CustomDataStorePropertiesProvider from './DataStoreReference/propertiesPanel/CustomDataStorePropertiesProvider'; import DataStorePropertiesProvider from './DataStoreReference/propertiesPanel/DataStorePropertiesProvider';
import ConditionsPropertiesProvider from './conditions/propertiesPanel/ConditionsPropertiesProvider'; import ConditionsPropertiesProvider from './conditions/propertiesPanel/ConditionsPropertiesProvider';
import ExtensionsPropertiesProvider from './extensions/propertiesPanel/ExtensionsPropertiesProvider'; import ExtensionsPropertiesProvider from './extensions/propertiesPanel/ExtensionsPropertiesProvider';
import MessagesPropertiesProvider from './messages/propertiesPanel/MessagesPropertiesProvider'; import MessagesPropertiesProvider from './messages/propertiesPanel/MessagesPropertiesProvider';
@ -42,7 +42,7 @@ export default {
dataObjectRules: ['type', DataObjectRules], dataObjectRules: ['type', DataObjectRules],
dataObjectRenderer: ['type', DataObjectRenderer], dataObjectRenderer: ['type', DataObjectRenderer],
dataObjectPropertiesProvider: ['type', DataObjectPropertiesProvider], dataObjectPropertiesProvider: ['type', DataObjectPropertiesProvider],
dataSourcePropertiesProvider: ['type', CustomDataStorePropertiesProvider], dataSourcePropertiesProvider: ['type', DataStorePropertiesProvider],
conditionsPropertiesProvider: ['type', ConditionsPropertiesProvider], conditionsPropertiesProvider: ['type', ConditionsPropertiesProvider],
extensionsPropertiesProvider: ['type', ExtensionsPropertiesProvider], extensionsPropertiesProvider: ['type', ExtensionsPropertiesProvider],
signalPropertiesProvider: ['type', SignalPropertiesProvider], signalPropertiesProvider: ['type', SignalPropertiesProvider],

View File

@ -86,7 +86,7 @@ describe('Data Source Reference Test cases', function () {
expect(selector[2].value === 'foods'); expect(selector[2].value === 'foods');
}); });
it('should update dataStoreRef after a select event - DataStoreReference element', async function () { it('should update dataStoreRef after a select event && should add new DataState in the level of process definition - DataStoreReference element', async function () {
const modeler = getBpmnJS(); const modeler = getBpmnJS();
modeler.get('eventBus').once('spiff.data_stores.requested', return_datastores); modeler.get('eventBus').once('spiff.data_stores.requested', return_datastores);
@ -106,6 +106,14 @@ describe('Data Source Reference Test cases', function () {
changeInput(selector, 'foods'); changeInput(selector, 'foods');
const nwbusinessObject = getBusinessObject(shapeElement); const nwbusinessObject = getBusinessObject(shapeElement);
expect(nwbusinessObject.get('dataStoreRef').id).to.equal('foods'); expect(nwbusinessObject.get('dataStoreRef').id).to.equal('foods');
// Check if the DataStore is added at the root level
const definitions = modeler.getDefinitions();
const dataStoreExists = definitions.get('rootElements').some(element =>
element.$type === 'bpmn:DataStore' && element.id === 'foods'
);
expect(dataStoreExists, "DataStore 'foods' should be added at the root level").to.be.true;
}); });
}); });