From 6e39d11b148e78ce408763d2a7fc13743d31af2b Mon Sep 17 00:00:00 2001 From: Apeksha Bhosale <7846888+ApekshaBhosale@users.noreply.github.com> Date: Wed, 22 Nov 2023 15:02:44 +0530 Subject: [PATCH] chore: split for module instance evaluation on ee (#29027) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Module instance evaluation required split to be extended on EE #### PR fixes following issue(s) Fixes # (issue number) > if no issue exists, please create an issue and ask the maintainers about this first > > #### Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video > > #### Type of change > Please delete options that are not relevant. - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (fix or feature that would cause existing functionality to not work as expected) - Chore (housekeeping or task changes that don't impact user perception) - This change requires a documentation update > > > ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [ ] Manual - [ ] JUnit - [ ] Jest - [ ] 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 - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [ ] 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 - [ ] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [ ] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed --- .../src/ce/constants/ModuleConstants.ts | 6 +++++ .../ce/constants/ModuleInstanceConstants.ts | 23 +++++++++++++++++++ .../entities/DataTree/dataTreeAction.ts | 0 .../DataTree/dataTreeJSAction.test.ts | 2 +- .../entities/DataTree/dataTreeJSAction.ts | 0 .../DataTree/dataTreeModuleInstance.ts | 13 +++++++++++ app/client/src/ce/entities/DataTree/types.ts | 6 +++++ .../src/ce/selectors/entitiesSelector.ts | 12 ++++++++++ .../ce/workers/Evaluation/evaluationUtils.ts | 2 +- .../ee/constants/ModuleInstanceConstants.ts | 1 + .../ee/entities/DataTree/dataTreeAction.ts | 1 + .../DataTree/dataTreeJSAction.test.ts | 1 + .../ee/entities/DataTree/dataTreeJSAction.ts | 1 + .../DataTree/dataTreeModuleInstance.ts | 1 + app/client/src/entities/Action/index.ts | 1 + .../src/entities/DataTree/dataTreeFactory.ts | 21 ++++++++++++++--- app/client/src/selectors/dataTreeSelectors.ts | 21 ++++++++++++++--- 17 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 app/client/src/ce/constants/ModuleInstanceConstants.ts rename app/client/src/{ => ce}/entities/DataTree/dataTreeAction.ts (100%) rename app/client/src/{ => ce}/entities/DataTree/dataTreeJSAction.test.ts (99%) rename app/client/src/{ => ce}/entities/DataTree/dataTreeJSAction.ts (100%) create mode 100644 app/client/src/ce/entities/DataTree/dataTreeModuleInstance.ts create mode 100644 app/client/src/ee/constants/ModuleInstanceConstants.ts create mode 100644 app/client/src/ee/entities/DataTree/dataTreeAction.ts create mode 100644 app/client/src/ee/entities/DataTree/dataTreeJSAction.test.ts create mode 100644 app/client/src/ee/entities/DataTree/dataTreeJSAction.ts create mode 100644 app/client/src/ee/entities/DataTree/dataTreeModuleInstance.ts diff --git a/app/client/src/ce/constants/ModuleConstants.ts b/app/client/src/ce/constants/ModuleConstants.ts index 0e15979a5e..7cb873c206 100644 --- a/app/client/src/ce/constants/ModuleConstants.ts +++ b/app/client/src/ce/constants/ModuleConstants.ts @@ -1,5 +1,11 @@ type ID = string; +export enum MODULE_TYPE { + QUERY = "QUERY_MODULE", + JS = "JS", + UI = "UI", +} + export interface ModuleInput { id: string; propertyName: string; diff --git a/app/client/src/ce/constants/ModuleInstanceConstants.ts b/app/client/src/ce/constants/ModuleInstanceConstants.ts new file mode 100644 index 0000000000..2ea2a4a819 --- /dev/null +++ b/app/client/src/ce/constants/ModuleInstanceConstants.ts @@ -0,0 +1,23 @@ +import type { MODULE_TYPE } from "@appsmith/constants/ModuleConstants"; + +export type ModuleId = string; +export type ModuleInstanceId = string; + +export enum ModuleInstanceCreatorType { + MODULE = "MODULE", + PAGE = "PAGE", +} +export interface ModuleInstance { + id: ModuleInstanceId; + type: MODULE_TYPE; + moduleId: ModuleId; + name: string; + creatorId: string; + creatorType: ModuleInstanceCreatorType; + inputs: { + [key: string]: string; + }; + jsonPathKeys: { + [key: string]: any; + }; +} diff --git a/app/client/src/entities/DataTree/dataTreeAction.ts b/app/client/src/ce/entities/DataTree/dataTreeAction.ts similarity index 100% rename from app/client/src/entities/DataTree/dataTreeAction.ts rename to app/client/src/ce/entities/DataTree/dataTreeAction.ts diff --git a/app/client/src/entities/DataTree/dataTreeJSAction.test.ts b/app/client/src/ce/entities/DataTree/dataTreeJSAction.test.ts similarity index 99% rename from app/client/src/entities/DataTree/dataTreeJSAction.test.ts rename to app/client/src/ce/entities/DataTree/dataTreeJSAction.test.ts index c50c8ecda6..ea1533dd1f 100644 --- a/app/client/src/entities/DataTree/dataTreeJSAction.test.ts +++ b/app/client/src/ce/entities/DataTree/dataTreeJSAction.test.ts @@ -1,5 +1,5 @@ import { PluginType } from "entities/Action"; -import { generateDataTreeJSAction } from "entities/DataTree/dataTreeJSAction"; +import { generateDataTreeJSAction } from "./dataTreeJSAction"; import type { JSCollectionData } from "reducers/entityReducers/jsActionsReducer"; describe("generateDataTreeJSAction", () => { diff --git a/app/client/src/entities/DataTree/dataTreeJSAction.ts b/app/client/src/ce/entities/DataTree/dataTreeJSAction.ts similarity index 100% rename from app/client/src/entities/DataTree/dataTreeJSAction.ts rename to app/client/src/ce/entities/DataTree/dataTreeJSAction.ts diff --git a/app/client/src/ce/entities/DataTree/dataTreeModuleInstance.ts b/app/client/src/ce/entities/DataTree/dataTreeModuleInstance.ts new file mode 100644 index 0000000000..f79e1ab720 --- /dev/null +++ b/app/client/src/ce/entities/DataTree/dataTreeModuleInstance.ts @@ -0,0 +1,13 @@ +import type { ModuleInstance } from "@appsmith/constants/ModuleInstanceConstants"; + +export const generateModuleInstance = ( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + moduleInstance: ModuleInstance, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + moduleInstanceEntities: any, +) => { + return { + configEntity: null, + unEvalEntity: null, + }; +}; diff --git a/app/client/src/ce/entities/DataTree/types.ts b/app/client/src/ce/entities/DataTree/types.ts index f04eb48527..d8c57eebc9 100644 --- a/app/client/src/ce/entities/DataTree/types.ts +++ b/app/client/src/ce/entities/DataTree/types.ts @@ -18,6 +18,7 @@ import type { AppTheme } from "entities/AppTheming"; import type { LoadingEntitiesState } from "reducers/evaluationReducers/loadingEntitiesReducer"; import type { LayoutSystemTypes } from "layoutSystems/types"; import type { Module } from "@appsmith/constants/ModuleConstants"; +import type { ModuleInstance } from "@appsmith/constants/ModuleInstanceConstants"; export type ActionDispatcher = (...args: any[]) => ActionDescription; @@ -64,6 +65,9 @@ export interface ActionEntityConfig extends EntityConfig { pluginId: PluginId; actionId: string; name: string; + moduleId?: string; + moduleInstanceId?: string; + isPublic?: boolean; } // JSAction (JSObject) entity Types @@ -188,6 +192,8 @@ export interface DataTreeSeed { metaWidgets: MetaWidgetsReduxState; isMobile: boolean; moduleInputs: Module["inputsForm"]; + moduleInstances: Record; + moduleInstanceEntities: any; layoutSystemType: LayoutSystemTypes; loadingEntities: LoadingEntitiesState; } diff --git a/app/client/src/ce/selectors/entitiesSelector.ts b/app/client/src/ce/selectors/entitiesSelector.ts index 27ecd96ee7..7380bc138d 100644 --- a/app/client/src/ce/selectors/entitiesSelector.ts +++ b/app/client/src/ce/selectors/entitiesSelector.ts @@ -46,6 +46,7 @@ import { getFormValues } from "redux-form"; import { TEMP_DATASOURCE_ID } from "constants/Datasource"; import { MAX_DATASOURCE_SUGGESTIONS } from "pages/Editor/Explorer/hooks"; import type { Module } from "@appsmith/constants/ModuleConstants"; +import type { ModuleInstance } from "@appsmith/constants/ModuleInstanceConstants"; import type { Plugin } from "api/PluginApi"; export const getEntities = (state: AppState): AppState["entities"] => @@ -1313,3 +1314,14 @@ export const getEntityExplorerDatasources = (state: AppState): Datasource[] => { export function getInputsForModule(): Module["inputsForm"] { return []; } + +export const getModuleInstances = (): Record => { + return {}; +}; + +export const getModuleInstanceEntities = () => { + return { + actions: [], + jsCollections: [], + }; +}; diff --git a/app/client/src/ce/workers/Evaluation/evaluationUtils.ts b/app/client/src/ce/workers/Evaluation/evaluationUtils.ts index 9379fb849d..d80551057c 100644 --- a/app/client/src/ce/workers/Evaluation/evaluationUtils.ts +++ b/app/client/src/ce/workers/Evaluation/evaluationUtils.ts @@ -972,7 +972,7 @@ export const isAPathDynamicBindingPath = ( propertyPath: string, ) => { return ( - (isAction(entity) || isWidget(entity) || isJSAction(entity)) && + isWidgetActionOrJsObject(entity) && isPathADynamicBinding(entityConfig, propertyPath) ); }; diff --git a/app/client/src/ee/constants/ModuleInstanceConstants.ts b/app/client/src/ee/constants/ModuleInstanceConstants.ts new file mode 100644 index 0000000000..2c024bae15 --- /dev/null +++ b/app/client/src/ee/constants/ModuleInstanceConstants.ts @@ -0,0 +1 @@ +export * from "ce/constants/ModuleInstanceConstants"; diff --git a/app/client/src/ee/entities/DataTree/dataTreeAction.ts b/app/client/src/ee/entities/DataTree/dataTreeAction.ts new file mode 100644 index 0000000000..774c6a5e10 --- /dev/null +++ b/app/client/src/ee/entities/DataTree/dataTreeAction.ts @@ -0,0 +1 @@ +export * from "ce/entities/DataTree/dataTreeAction"; diff --git a/app/client/src/ee/entities/DataTree/dataTreeJSAction.test.ts b/app/client/src/ee/entities/DataTree/dataTreeJSAction.test.ts new file mode 100644 index 0000000000..24e6335d70 --- /dev/null +++ b/app/client/src/ee/entities/DataTree/dataTreeJSAction.test.ts @@ -0,0 +1 @@ +export * from "ce/entities/DataTree/dataTreeJSAction.test"; diff --git a/app/client/src/ee/entities/DataTree/dataTreeJSAction.ts b/app/client/src/ee/entities/DataTree/dataTreeJSAction.ts new file mode 100644 index 0000000000..9439898447 --- /dev/null +++ b/app/client/src/ee/entities/DataTree/dataTreeJSAction.ts @@ -0,0 +1 @@ +export * from "ce/entities/DataTree/dataTreeJSAction"; diff --git a/app/client/src/ee/entities/DataTree/dataTreeModuleInstance.ts b/app/client/src/ee/entities/DataTree/dataTreeModuleInstance.ts new file mode 100644 index 0000000000..ff5ebf13df --- /dev/null +++ b/app/client/src/ee/entities/DataTree/dataTreeModuleInstance.ts @@ -0,0 +1 @@ +export * from "ce/entities/DataTree/dataTreeModuleInstance"; diff --git a/app/client/src/entities/Action/index.ts b/app/client/src/entities/Action/index.ts index adbb2b09e6..a4cbb8544c 100644 --- a/app/client/src/entities/Action/index.ts +++ b/app/client/src/entities/Action/index.ts @@ -159,6 +159,7 @@ export interface BaseAction { errorReports?: Array; isPublic?: boolean; moduleId?: string; + moduleInstanceId?: string; } interface BaseApiAction extends BaseAction { diff --git a/app/client/src/entities/DataTree/dataTreeFactory.ts b/app/client/src/entities/DataTree/dataTreeFactory.ts index b0683a152e..d422abafd3 100644 --- a/app/client/src/entities/DataTree/dataTreeFactory.ts +++ b/app/client/src/entities/DataTree/dataTreeFactory.ts @@ -1,5 +1,5 @@ -import { generateDataTreeAction } from "entities/DataTree/dataTreeAction"; -import { generateDataTreeJSAction } from "entities/DataTree/dataTreeJSAction"; +import { generateDataTreeAction } from "@appsmith/entities/DataTree/dataTreeAction"; +import { generateDataTreeJSAction } from "@appsmith/entities/DataTree/dataTreeJSAction"; import { generateDataTreeWidget } from "entities/DataTree/dataTreeWidget"; import log from "loglevel"; import { @@ -18,7 +18,7 @@ import type { UnEvalTree, } from "entities/DataTree/dataTreeTypes"; import { isEmpty } from "lodash"; - +import { generateModuleInstance } from "@appsmith/entities/DataTree/dataTreeModuleInstance"; export class DataTreeFactory { static create({ actions, @@ -30,6 +30,8 @@ export class DataTreeFactory { loadingEntities, metaWidgets, moduleInputs, + moduleInstanceEntities, + moduleInstances, pluginDependencyConfig, theme, widgets, @@ -73,6 +75,19 @@ export class DataTreeFactory { } } + if (!isEmpty(moduleInstances)) { + Object.values(moduleInstances).forEach((moduleInstance) => { + const { configEntity, unEvalEntity } = generateModuleInstance( + moduleInstance, + moduleInstanceEntities, + ); + if (!!configEntity && !!unEvalEntity) { + dataTree[moduleInstance.name] = unEvalEntity; + configTree[moduleInstance.name] = configEntity; + } + }); + } + Object.values(widgets).forEach((widget) => { const { configEntity, unEvalEntity } = generateDataTreeWidget( widget, diff --git a/app/client/src/selectors/dataTreeSelectors.ts b/app/client/src/selectors/dataTreeSelectors.ts index 8f5fc1bcad..905d585346 100644 --- a/app/client/src/selectors/dataTreeSelectors.ts +++ b/app/client/src/selectors/dataTreeSelectors.ts @@ -6,6 +6,8 @@ import { getPluginEditorConfigs, getCurrentJSCollections, getInputsForModule, + getModuleInstances, + getModuleInstanceEntities, } from "@appsmith/selectors/entitiesSelector"; import type { WidgetEntity } from "@appsmith/entities/DataTree/types"; import type { DataTree } from "entities/DataTree/dataTreeTypes"; @@ -58,6 +60,19 @@ const getCurrentActionEntities = createSelector( }, ); +const getModulesData = createSelector( + getInputsForModule, + getModuleInstances, + getModuleInstanceEntities, + (moduleInputs, moduleInstances, moduleInstanceEntities) => { + return { + moduleInputs: moduleInputs, + moduleInstances: moduleInstances, + moduleInstanceEntities: moduleInstanceEntities, + }; + }, +); + export const getUnevaluatedDataTree = createSelector( getCurrentActionEntities, getWidgetsForEval, @@ -68,9 +83,9 @@ export const getUnevaluatedDataTree = createSelector( getPluginDependencyConfig, getSelectedAppThemeProperties, getMetaWidgets, - getInputsForModule, getLayoutSystemPayload, getLoadingEntities, + getModulesData, ( currentActionEntities, widgets, @@ -81,9 +96,9 @@ export const getUnevaluatedDataTree = createSelector( pluginDependencyConfig, selectedAppThemeProperty, metaWidgets, - moduleInputs, layoutSystemPayload, loadingEntities, + modulesData, ) => { const pageList = pageListPayload || []; return DataTreeFactory.create({ @@ -96,9 +111,9 @@ export const getUnevaluatedDataTree = createSelector( pluginDependencyConfig, theme: selectedAppThemeProperty, metaWidgets, - moduleInputs, loadingEntities, ...layoutSystemPayload, + ...modulesData, }); }, );