Fix/retrivial expression refactoring and other findings (#102)

* Modify AddMessageEvent from Array to String

* Merge Retrivial expression commit
This commit is contained in:
Ayoub Ait Lachgar 2024-06-18 19:31:59 +01:00 committed by GitHub
parent 7f7707838a
commit 285d154ebe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 100 additions and 36 deletions

View File

@ -245,19 +245,30 @@ bpmnModeler.on('spiff.messages.requested', (event) => {
});
bpmnModeler.on('spiff.add_message.requested', (event) => {
// event.eventBus.fire('spiff.add_message.returned', {
// name: 'test_message',
// correlation_properties: {
// "c1": {
// "retrieval_expressions": "c1_expression"
// },
// "c2": {
// "retrieval_expressions": "c2_expression"
// }
// }
// element: {}
// });
event.eventBus.fire('spiff.add_message.returned', {
name: 'msgName',
name: 'test_message',
correlation_properties: {
"c1": {
"retrieval_expressions": [
"c1x"
]
"retrieval_expressions": ["c1_expression"]
},
"c2": {
"retrieval_expressions": [
"cxxxx1x"
]
"retrieval_expressions": ["c2_expression"]
}
},
element: {
name: 'elementName'
}
});
});

View File

@ -376,11 +376,12 @@ export function createOrUpdateCorrelationPropertiesV2(
if (propertiesConfig) {
// Iterate over each property configuration
propertiesConfig.forEach((propConfig) => {
for (const propConfig of propertiesConfig) {
let correlationProperty = findCorrelationPropertyById(
definitions,
propConfig.identifier
);
const msgElement = findMessageElement(element.businessObject, messageId);
if (correlationProperty === null) {
@ -435,7 +436,7 @@ export function createOrUpdateCorrelationPropertiesV2(
element,
properties: {},
});
});
}
}
}
@ -683,6 +684,7 @@ export function setParentCorrelationKeys(
element,
moddle
) {
// Retrieve all correlation properties
let correlationProperties = findCorrelationProperties(
element.businessObject,
@ -700,13 +702,13 @@ export function setParentCorrelationKeys(
mainCorrelationKey.get('correlationPropertyRef').length = 0;
// Sync correlation properties
correlationProperties.forEach((cP) => {
for (const cP of correlationProperties) {
const cPElement = bpmnFactory.create('bpmn:CorrelationProperty', {
id: cP.id,
name: cP.name,
});
mainCorrelationKey.get('correlationPropertyRef').push(cPElement);
});
}
// check if process has collaboration
let collaboration = definitions
@ -714,6 +716,7 @@ export function setParentCorrelationKeys(
.find((element) => element.$type === 'bpmn:Collaboration');
if (collaboration) {
// Remove existing correlation keys other than the main correlation key
collaboration.get('correlationKeys').forEach((key, index) => {
if (key.name !== 'MainCorrelationKey') {
@ -724,8 +727,15 @@ export function setParentCorrelationKeys(
const existingKey = collaboration
.get('correlationKeys')
.find((key) => key.name === 'MainCorrelationKey');
if (!existingKey) {
collaboration.get('correlationKeys').push(mainCorrelationKey);
} else {
// Replace the existing key with mainCorrelationKey
const index = collaboration.get('correlationKeys').indexOf(existingKey);
if (index !== -1) {
collaboration.get('correlationKeys').splice(index, 1, mainCorrelationKey);
}
}
} else {
// Handle case where no collaboration is found
@ -745,8 +755,15 @@ export function setParentCorrelationKeys(
key.$type === 'bpmn:CorrelationKey' &&
key.name === 'MainCorrelationKey'
);
if (!existingKey) {
definitions.get('rootElements').push(mainCorrelationKey);
} else {
// Replace the existing key with mainCorrelationKey
const index = definitions.get('rootElements').indexOf(existingKey);
if (index !== -1) {
definitions.get('rootElements').splice(index, 1, mainCorrelationKey);
}
}
}
}
@ -771,11 +788,10 @@ function findOrCreateMainCorrelationKey(definitions, bpmnFactory, moddle) {
return mainCorrelationKey;
}
export function synCorrleationProperties(element, definitions, moddle) {
export function synCorrleationProperties(element, definitions, moddle, msgObject) {
const { businessObject } = element;
const correlationProps = findCorrelationProperties(businessObject, moddle);
const expressionsToDelete = [];
for (let cProperty of correlationProps) {
let isUsed = false;
for (const cpExpression of cProperty.correlationPropertyRetrievalExpression) {
@ -784,11 +800,16 @@ export function synCorrleationProperties(element, definitions, moddle) {
cpExpression.messageRef.id,
definitions
);
isUsed = msgRef ? true : isUsed;
isUsed = (msgRef && msgObject && cpExpression.messageRef.id !== msgObject.identifier) ? true : isUsed;
// if unused false, delete retrival expression
if (!msgRef) {
console.log('Delete expression', cpExpression);
expressionsToDelete.push(cpExpression);
} else if (msgObject && !msgObject.correlation_properties.some(obj => obj.identifier === cProperty.id)) {
console.log('Delete expression', cpExpression);
expressionsToDelete.push(cpExpression);
}
}
// Delete the retrieval expressions that are not used
@ -805,12 +826,13 @@ export function synCorrleationProperties(element, definitions, moddle) {
}
// If Unused, delete the correlation property
if (!isUsed) {
const propertyToBeDeleted = (isUsed || msgObject && msgObject.correlation_properties && msgObject.correlation_properties.some(obj => obj.identifier === cProperty.id));
if (!propertyToBeDeleted) {
const index = definitions.get('rootElements').indexOf(cProperty);
if (index > -1) {
console.log('Delete property', cProperty);
definitions.rootElements.splice(index, 1);
}
}
}
}

View File

@ -38,8 +38,12 @@ export function MessageLaunchEditorButton(props) {
className: 'spiffworkflow-properties-panel-button',
id: `message_launch_message_editor_button`,
onClick: () => {
// eventBus.fire('spiff.add_message.requested', { eventBus });
eventBus.fire(sendEvent, {
value: {
elementId: element.id,
messageId,
correlation_properties: parsedCorrelationProperties,
},

View File

@ -16,12 +16,15 @@ import {
export const spiffExtensionOptions = {};
let ELEMENT_ID;
/**
* Allows the selection, or creation, of Message at the Definitions level of a BPMN document.
*/
export function MessageSelect(props) {
const shapeElement = props.element;
const { commandStack, element, moddle } = props;
let shapeElement = props.element;
const { commandStack, moddle, elementRegistry } = props;
let { element } = props;
const debounce = useService('debounceInput');
const eventBus = useService('eventBus');
const bpmnFactory = useService('bpmnFactory');
@ -36,11 +39,19 @@ export function MessageSelect(props) {
const setValue = async (value) => {
if (ELEMENT_ID) {
// Not sure if we can keep this
// This condition verify if Setvalue trigger is about the same element triggered from spifarena
const nwElement = elementRegistry.get(ELEMENT_ID);
shapeElement = (nwElement) ? nwElement : shapeElement;
element = (nwElement) ? nwElement : element;
}
// Define variables
const messageId = value;
const { businessObject } = element;
let oldMessageRef = (businessObject.eventDefinitions) ? businessObject.eventDefinitions[0].messageRef : businessObject.messageRef;
let definitions = getRoot(element.businessObject);
let definitions = getRoot(businessObject);
if (!definitions || !definitions.get('rootElements')) {
definitions.set('rootElements', []);
}
@ -61,6 +72,8 @@ export function MessageSelect(props) {
name: messageId,
});
definitions.get('rootElements').push(bpmnMessage);
} else if (bpmnMessage.id !== bpmnMessage.name) {
bpmnMessage.id = bpmnMessage.name;
}
// Update messageRef of current Element
@ -110,6 +123,7 @@ export function MessageSelect(props) {
// Remove previous message in case it's not used anymore
const isOldMessageUsed = isMessageRefUsed(definitions, oldMessageRef.id);
if (!isOldMessageUsed) {
const rootElements = definitions.get('rootElements');
const oldMessageIndex = rootElements.findIndex(
@ -123,7 +137,7 @@ export function MessageSelect(props) {
}
// Automatic deletion of previous message correlation properties
synCorrleationProperties(element, definitions, moddle);
synCorrleationProperties(element, definitions, moddle, msgObject);
}
// Update Correlation key if Process has collaboration
@ -135,17 +149,33 @@ export function MessageSelect(props) {
};
eventBus.on('spiff.add_message.returned', (event) => {
eventBus.on('spiff.add_message.returned', async (event) => {
// Check if the received element matches the current element
if (event.elementId !== element.id) {
ELEMENT_ID = event.elementId;
}
const cProperties = Object.entries(event.correlation_properties).map(([identifier, properties]) => ({
identifier,
retrieval_expression: properties.retrieval_expressions[0]
retrieval_expression: Array.isArray(properties.retrieval_expressions) ? properties.retrieval_expressions[0] : properties.retrieval_expressions
}));
let newMsg = {
identifier: event.name,
correlation_properties: cProperties
};
spiffExtensionOptions['spiff.messages'] = (Array.isArray(spiffExtensionOptions['spiff.messages']) && spiffExtensionOptions['spiff.messages']) ? spiffExtensionOptions['spiff.messages'] : [];
const messageIndex = spiffExtensionOptions['spiff.messages'].findIndex(
(msg) => msg.identifier === newMsg.identifier
);
if (messageIndex !== -1) {
spiffExtensionOptions['spiff.messages'][messageIndex] = newMsg;
} else {
spiffExtensionOptions['spiff.messages'].push(newMsg);
}
setValue(event.name);
});

View File

@ -34,6 +34,7 @@ export function createMessageGroup(
isEdited: isTextFieldEntryEdited,
moddle,
commandStack,
elementRegistry
},
{
id: 'messageLaunchEditorButton',

View File

@ -54,14 +54,10 @@ describe('Messages should work', function () {
name: 'msgName',
correlation_properties: {
"c1": {
"retrieval_expressions": [
"c1x"
]
"retrieval_expressions": "c1_expression"
},
"c2": {
"retrieval_expressions": [
"cxxxx1x"
]
"retrieval_expressions": "c2_expression"
}
}
});