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, }); }, );