PromucFlow_constructor/app/client/src/workers/Evaluation/evalTreeWithChanges.ts
arunvjn f62816a9d5
fix: Validation issue in select widget on page reload (#28277)
## Description
Fixes the regression in select widget validation caused by
https://github.com/appsmithorg/appsmith/issues/27408
This PR remove most of the re-validation related logic written in
evaluations code base. Going forward we'll maintain an internal
dependencyMap for widgets. This can help avoid IIFE hacks to introduce
dependency between fields.

###### Changes
- Removes the concept of dependentPaths in validation config.
- Remove validationDependencyMap from eval code base.
- Added internal dependency map to base widget.
- Added dependency map config for select, multi-select & Tabs widget.

#### PR fixes following issue(s)
Fixes #28368 
Fixes #28224

#### Type of change
- Bug fix (non-breaking change which fixes an issue)
>
>
## Testing
>
#### How Has This Been Tested?
- [x] Manual
- [ ] JUnit
- [x] Jest
- [x] Cypress
>
>
#### Test Plan
> Add Testsmith test cases links that relate to this PR
>
#### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
>
## Checklist:
#### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


#### QA activity:
- [x] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-)
have been covered
- [x] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [x] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [x] Cypress test cases have been added and approved by SDET/manual QA
- [x] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
2023-10-27 18:18:42 +05:30

101 lines
3.3 KiB
TypeScript

import type {
ConfigTree,
DataTree,
UnEvalTree,
} from "entities/DataTree/dataTreeTypes";
import { dataTreeEvaluator } from "./handlers/evalTree";
import type { DataTreeDiff } from "@appsmith/workers/Evaluation/evaluationUtils";
import type { EvalMetaUpdates } from "@appsmith/workers/common/DataTreeEvaluator/types";
import type { DependencyMap, EvalError } from "utils/DynamicBindingUtils";
import { makeEntityConfigsAsObjProperties } from "@appsmith/workers/Evaluation/dataTreeUtils";
import type { EvalTreeResponseData } from "./types";
import { MessageType, sendMessage } from "utils/MessageUtil";
import { MAIN_THREAD_ACTION } from "@appsmith/workers/Evaluation/evalWorkerActions";
import type { UpdateDataTreeMessageData } from "sagas/EvalWorkerActionSagas";
import type { JSUpdate } from "utils/JSPaneUtils";
import { generateOptimisedUpdatesAndSetPrevState } from "./helpers";
export function evalTreeWithChanges(
updatedValuePaths: string[][],
metaUpdates: EvalMetaUpdates = [],
) {
let evalOrder: string[] = [];
let jsUpdates: Record<string, JSUpdate> = {};
let unEvalUpdates: DataTreeDiff[] = [];
const isCreateFirstTree = false;
let dataTree: DataTree = {};
const errors: EvalError[] = [];
const logs: any[] = [];
const dependencies: DependencyMap = {};
let evalMetaUpdates: EvalMetaUpdates = [...metaUpdates];
let staleMetaIds: string[] = [];
const removedPaths: Array<{ entityId: string; fullpath: string }> = [];
let unevalTree: UnEvalTree = {};
let configTree: ConfigTree = {};
if (dataTreeEvaluator) {
const setupUpdateTreeResponse =
dataTreeEvaluator.setupUpdateTreeWithDifferences(updatedValuePaths);
evalOrder = setupUpdateTreeResponse.evalOrder;
unEvalUpdates = setupUpdateTreeResponse.unEvalUpdates;
jsUpdates = setupUpdateTreeResponse.jsUpdates;
const updateResponse = dataTreeEvaluator.evalAndValidateSubTree(
evalOrder,
dataTreeEvaluator.oldConfigTree,
unEvalUpdates,
);
dataTree = makeEntityConfigsAsObjProperties(dataTreeEvaluator.evalTree, {
evalProps: dataTreeEvaluator.evalProps,
identicalEvalPathsPatches:
dataTreeEvaluator.getEvalPathsIdenticalToState(),
});
/** Make sure evalMetaUpdates is sanitized to prevent postMessage failure */
evalMetaUpdates = JSON.parse(
JSON.stringify([...evalMetaUpdates, ...updateResponse.evalMetaUpdates]),
);
staleMetaIds = updateResponse.staleMetaIds;
unevalTree = dataTreeEvaluator.getOldUnevalTree();
configTree = dataTreeEvaluator.oldConfigTree;
}
const updates = generateOptimisedUpdatesAndSetPrevState(
dataTree,
dataTreeEvaluator,
);
const evalTreeResponse: EvalTreeResponseData = {
updates,
dependencies,
errors,
evalMetaUpdates,
evaluationOrder: evalOrder,
jsUpdates,
logs,
unEvalUpdates,
isCreateFirstTree,
configTree,
staleMetaIds,
removedPaths,
isNewWidgetAdded: false,
undefinedEvalValuesMap: dataTreeEvaluator?.undefinedEvalValuesMap || {},
jsVarsCreatedEvent: [],
};
const data: UpdateDataTreeMessageData = {
workerResponse: evalTreeResponse,
unevalTree,
};
sendMessage.call(self, {
messageType: MessageType.DEFAULT,
body: {
data,
method: MAIN_THREAD_ACTION.UPDATE_DATATREE,
},
});
}