diff --git a/app/client/src/workers/DataTreeEvaluator/test.ts b/app/client/src/workers/DataTreeEvaluator/test.ts index ce805ffce3..c12e2b38fb 100644 --- a/app/client/src/workers/DataTreeEvaluator/test.ts +++ b/app/client/src/workers/DataTreeEvaluator/test.ts @@ -385,55 +385,6 @@ describe("DataTreeEvaluator", () => { }); }); - describe("triggerfield dependency map", () => { - beforeEach(() => { - // @ts-expect-error: Types are not available - dataTreeEvaluator.createFirstTree(lintingUnEvalTree as DataTree); - }); - it("Creates correct triggerFieldDependencyMap", () => { - expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({ - "Button3.onClick": ["Api1", "Button2", "Api2"], - "Button2.onClick": ["Api2"], - }); - }); - it("Creates correct triggerFieldInverseDependencyMap", () => { - expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({ - Api1: ["Button3.onClick"], - Api2: ["Button3.onClick", "Button2.onClick"], - Button2: ["Button3.onClick"], - }); - }); - it("Correctly updates triggerFieldDependencyMap and triggerFieldInverseDependencyMap", () => { - const newUnEvalTree = ({ ...lintingUnEvalTree } as unknown) as DataTree; - // delete Api2 - delete newUnEvalTree["Api2"]; - dataTreeEvaluator.updateDataTree(newUnEvalTree); - expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({ - "Button3.onClick": ["Api1", "Button2"], - "Button2.onClick": [], - }); - expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({ - Api1: ["Button3.onClick"], - Button2: ["Button3.onClick"], - }); - - // Add Api2 - // @ts-expect-error: Types are not available - newUnEvalTree["Api2"] = { ...lintingUnEvalTree }["Api2"]; - dataTreeEvaluator.updateDataTree(newUnEvalTree); - expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({ - "Button3.onClick": ["Api1", "Button2", "Api2"], - "Button2.onClick": ["Api2"], - }); - - expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({ - Api1: ["Button3.onClick"], - Api2: ["Button3.onClick", "Button2.onClick"], - Button2: ["Button3.onClick"], - }); - }); - }); - describe("lintTree", () => { const dataTreeEvaluator = new DataTreeEvaluator(widgetConfigMap); beforeEach(() => { @@ -538,4 +489,73 @@ describe("DataTreeEvaluator", () => { ).toEqual(expectedButton2LintError); }); }); + + describe("triggerfield dependency map", () => { + beforeEach(() => { + // @ts-expect-error: Types are not available + dataTreeEvaluator.createFirstTree(lintingUnEvalTree as DataTree); + }); + it("Creates correct triggerFieldDependencyMap", () => { + expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({ + "Button3.onClick": ["Api1", "Button2", "Api2"], + "Button2.onClick": ["Api2"], + }); + }); + it("Creates correct triggerFieldInverseDependencyMap", () => { + expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({ + Api1: ["Button3.onClick"], + Api2: ["Button3.onClick", "Button2.onClick"], + Button2: ["Button3.onClick"], + }); + }); + it("Correctly updates triggerFieldDependencyMap and triggerFieldInverseDependencyMap", () => { + const newUnEvalTree = ({ ...lintingUnEvalTree } as unknown) as DataTree; + // delete Api2 + delete newUnEvalTree["Api2"]; + dataTreeEvaluator.updateDataTree(newUnEvalTree); + expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({ + "Button3.onClick": ["Api1", "Button2"], + "Button2.onClick": [], + }); + expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({ + Api1: ["Button3.onClick"], + Button2: ["Button3.onClick"], + }); + + // Add Api2 + // @ts-expect-error: Types are not available + newUnEvalTree["Api2"] = { ...lintingUnEvalTree }["Api2"]; + dataTreeEvaluator.updateDataTree(newUnEvalTree); + expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({ + "Button3.onClick": ["Api1", "Button2", "Api2"], + "Button2.onClick": ["Api2"], + }); + + expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({ + Api1: ["Button3.onClick"], + Api2: ["Button3.onClick", "Button2.onClick"], + Button2: ["Button3.onClick"], + }); + + // self-reference Button2 + const newButton2 = { ...lintingUnEvalTree }["Button2"]; + newButton2.onClick = "{{Api2.run(); AbsentEntity.run(); Button2}}"; + // @ts-expect-error: Types are not available + newUnEvalTree["Button2"] = newButton2; + dataTreeEvaluator.updateDataTree(newUnEvalTree); + + // delete Button2 + delete newUnEvalTree["Button2"]; + dataTreeEvaluator.updateDataTree(newUnEvalTree); + + expect(dataTreeEvaluator.triggerFieldDependencyMap).toEqual({ + "Button3.onClick": ["Api1", "Api2"], + }); + + expect(dataTreeEvaluator.triggerFieldInverseDependencyMap).toEqual({ + Api1: ["Button3.onClick"], + Api2: ["Button3.onClick"], + }); + }); + }); }); diff --git a/app/client/src/workers/DependencyMap/index.ts b/app/client/src/workers/DependencyMap/index.ts index 80e6309b11..0671195afc 100644 --- a/app/client/src/workers/DependencyMap/index.ts +++ b/app/client/src/workers/DependencyMap/index.ts @@ -238,14 +238,6 @@ export const updateDependencyMap = ({ }, ); if (entityName === dataTreeDiff.payload.propertyPath) { - if (isWidget(entity)) { - entity.dynamicTriggerPathList?.forEach((triggerFieldName) => { - delete dataTreeEvalRef.triggerFieldDependencyMap[ - `${entityName}.${triggerFieldName.key}` - ]; - didUpdateTriggerDependencyMap = true; - }); - } // When deleted entity is referenced in a trigger field, remove deleted entity from it's triggerfieldDependencyMap if ( entityName in dataTreeEvalRef.triggerFieldInverseDependencyMap @@ -264,6 +256,16 @@ export const updateDependencyMap = ({ ].filter((field) => field !== entityName); }); } + + // Remove deleted trigger fields from triggerFieldDependencyMap + if (isWidget(entity)) { + entity.dynamicTriggerPathList?.forEach((triggerFieldName) => { + delete dataTreeEvalRef.triggerFieldDependencyMap[ + `${entityName}.${triggerFieldName.key}` + ]; + didUpdateTriggerDependencyMap = true; + }); + } } break;