Skip to content

Commit

Permalink
fix(Designer): Trigger deletion should also remove dependant tokens t…
Browse files Browse the repository at this point in the history
…hrough the workflow (#4788)
  • Loading branch information
hartra344 committed May 7, 2024
1 parent 90a666f commit dfdf7b8
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 7 deletions.
24 changes: 24 additions & 0 deletions e2e/designer/tokenRemoval.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,30 @@ test.describe(
expect(JSON.stringify(serializedNew)).not.toContain("@variables('ArrayVariable')");
expect(JSON.stringify(serializedNew)).not.toContain("@{variables('ArrayVariable')}");
});

test('Tokens should be removed from parameters when trigger is deleted', async ({ page }) => {
await page.goto('/');

await GoToMockWorkflow(page, 'Panel');
const serializedOld: any = await getSerializedWorkflowFromState(page);
expect
.soft(serializedOld.definition.actions.Parse_JSON.inputs.content)
.toEqual(
"@{triggerBody()?['string']}@{variables('ArrayVariable')}@{parameters('EILCO Admin Nominations-OCSA List (cr773_EILCOAdminNominations_OCSA_L2)')}"
);
await page.getByTestId('card-manual').click({
button: 'right',
});
await page.getByText('Delete', { exact: true }).click();
await page.getByRole('button', { name: 'OK' }).click();
const serializedNew: any = await getSerializedWorkflowFromState(page);
expect(serializedNew.definition.actions.Parse_JSON.inputs.content).toEqual(
"@{variables('ArrayVariable')}@{parameters('EILCO Admin Nominations-OCSA List (cr773_EILCOAdminNominations_OCSA_L2)')}"
);
expect(JSON.stringify(serializedNew)).not.toContain("@triggerBody()?['string']");
expect(JSON.stringify(serializedNew)).not.toContain("@{triggerBody()?['string']}");
});

test('Tokens should be removed from parameters when workflow parameter is deleted', async ({ page }) => {
await page.goto('/');

Expand Down
23 changes: 16 additions & 7 deletions libs/designer/src/lib/core/actions/bjsworkflow/delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import type { Dispatch } from '@reduxjs/toolkit';
import { createAsyncThunk } from '@reduxjs/toolkit';
import { batch } from 'react-redux';
import { deleteParameter } from '../../state/workflowparameters/workflowparametersSlice';
import { isParameterToken, isTokenValueSegment, isVariableToken } from '../../utils/parameters/segment';
import { isOutputToken, isParameterToken, isTokenValueSegment, isVariableToken } from '../../utils/parameters/segment';

type DeleteOperationPayload = {
nodeId: string;
Expand All @@ -37,31 +37,37 @@ export const deleteOperation = createAsyncThunk(
'deleteOperation',
async (deletePayload: DeleteOperationPayload, { getState, dispatch }) => {
batch(() => {
const { nodeId } = deletePayload;
const { nodeId, isTrigger } = deletePayload;

dispatch(clearFocusNode());
dispatch(clearPanel());

dispatch(deleteNode(deletePayload));
deleteCustomCodeInfo(nodeId, dispatch, getState() as RootState);
deleteOperationDetails(nodeId, dispatch, getState() as RootState);
deleteOperationDetails(nodeId, dispatch, getState() as RootState, isTrigger);
updateAllUpstreamNodes(getState() as RootState, dispatch);
});
}
);

const deleteOperationDetails = async (nodeId: string, dispatch: Dispatch, state: RootState): Promise<void> => {
const deleteOperationDetails = async (nodeId: string, dispatch: Dispatch, state: RootState, isTrigger?: boolean): Promise<void> => {
dispatch(removeNodeConnectionData({ nodeId }));
dispatch(deinitializeNodes([nodeId]));
removeAllTokensFromNode(state, dispatch, nodeId);
removeAllTokensFromNode(state, dispatch, nodeId, undefined, isTrigger);
dispatch(deinitializeTokensAndVariables({ id: nodeId }));

dispatch(deinitializeOperationInfo({ id: nodeId }));
dispatch(setValidationError({ nodeId, errors: [] }));
dispatch(deinitializeStaticResultProperty({ id: nodeId + 0 }));
};

export const removeAllTokensFromNode = (state: RootState, dispatch: Dispatch, nodeId?: string, parameterId?: String): void => {
export const removeAllTokensFromNode = (
state: RootState,
dispatch: Dispatch,
nodeId?: string,
parameterId?: String,
isTrigger?: boolean
): void => {
const variables = nodeId ? state.tokens.variables[nodeId] : [];
const nodeInputs = state.operations.inputParameters;
for (const [nid, inputParam] of Object.entries(nodeInputs)) {
Expand All @@ -84,7 +90,10 @@ export const removeAllTokensFromNode = (state: RootState, dispatch: Dispatch, no
} else if (parameterId && isParameterToken(value.token) && value.token?.name === parameterId) {
paramValue = paramValue.filter((v) => v.id !== value.id);
updatedValue = true;
} else if (nodeId && value.token?.actionName === nodeId) {
} else if (
nodeId &&
(value.token?.actionName === nodeId || (isOutputToken(value.token) && !value.token?.actionName && isTrigger))
) {
paramValue = paramValue.filter((v) => v.id !== value.id);
updatedValue = true;
}
Expand Down

0 comments on commit dfdf7b8

Please sign in to comment.