PromucFlow_constructor/app/client/src/entities/DataTree/dataTreeFactory.ts

134 lines
3.9 KiB
TypeScript
Raw Normal View History

import {
ActionData,
ActionDataState,
} from "reducers/entityReducers/actionsReducer";
2020-02-18 10:41:52 +00:00
import { WidgetProps } from "widgets/BaseWidget";
import { ActionResponse } from "api/ActionAPI";
import { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer";
import { MetaState } from "reducers/entityReducers/metaReducer";
2020-04-20 05:42:46 +00:00
import { PageListPayload } from "constants/ReduxActionConstants";
import { ActionConfig, PluginType } from "entities/Action";
import { AppDataState } from "reducers/entityReducers/appReducer";
import { DependencyMap, DynamicPath } from "utils/DynamicBindingUtils";
import { generateDataTreeAction } from "entities/DataTree/dataTreeAction";
import { generateDataTreeWidget } from "entities/DataTree/dataTreeWidget";
import { VALIDATION_TYPES } from "constants/WidgetValidation";
2020-02-18 10:41:52 +00:00
export type ActionDescription<T> = {
type: string;
payload: T;
};
export type ActionDispatcher<T, A extends string[]> = (
2020-02-18 10:41:52 +00:00
...args: A
) => ActionDescription<T>;
export enum ENTITY_TYPE {
ACTION = "ACTION",
WIDGET = "WIDGET",
APPSMITH = "APPSMITH",
2020-02-18 10:41:52 +00:00
}
export type RunActionPayload = {
actionId: string;
onSuccess: string;
onError: string;
params: Record<string, any> | string;
2020-02-18 10:41:52 +00:00
};
export enum EvaluationSubstitutionType {
TEMPLATE = "TEMPLATE",
PARAMETER = "PARAMETER",
SMART_SUBSTITUTE = "SMART_SUBSTITUTE",
}
export interface DataTreeAction extends Omit<ActionData, "data" | "config"> {
2020-02-18 10:41:52 +00:00
data: ActionResponse["body"];
actionId: string;
config: Partial<ActionConfig>;
pluginType: PluginType;
name: string;
run:
| ActionDispatcher<RunActionPayload, [string, string, string]>
| Record<string, any>;
dynamicBindingPathList: DynamicPath[];
bindingPaths: Record<string, EvaluationSubstitutionType>;
2020-02-18 10:41:52 +00:00
ENTITY_TYPE: ENTITY_TYPE.ACTION;
dependencyMap: DependencyMap;
2020-02-18 10:41:52 +00:00
}
export interface DataTreeWidget extends WidgetProps {
bindingPaths: Record<string, EvaluationSubstitutionType>;
triggerPaths: Record<string, boolean>;
validationPaths: Record<string, VALIDATION_TYPES>;
2020-02-18 10:41:52 +00:00
ENTITY_TYPE: ENTITY_TYPE.WIDGET;
}
2021-03-24 05:09:47 +00:00
export interface DataTreeAppsmith extends Omit<AppDataState, "store"> {
ENTITY_TYPE: ENTITY_TYPE.APPSMITH;
store: Record<string, unknown>;
}
2020-12-30 12:58:57 +00:00
export type DataTreeObjectEntity =
| DataTreeAction
| DataTreeWidget
2020-12-30 12:58:57 +00:00
| DataTreeAppsmith;
export type DataTreeEntity =
| DataTreeObjectEntity
2020-04-20 05:42:46 +00:00
| PageListPayload
| ActionDispatcher<any, any>;
2020-02-18 10:41:52 +00:00
export type DataTree = {
[entityName: string]: DataTreeEntity;
2020-02-18 10:41:52 +00:00
} & { actionPaths?: string[] };
type DataTreeSeed = {
actions: ActionDataState;
editorConfigs: Record<string, any[]>;
pluginDependencyConfig: Record<string, DependencyMap>;
widgets: CanvasWidgetsReduxState;
widgetsMeta: MetaState;
2020-04-20 05:42:46 +00:00
pageList: PageListPayload;
appData: AppDataState;
};
2020-02-18 10:41:52 +00:00
export class DataTreeFactory {
static create({
actions,
widgets,
widgetsMeta,
pageList,
appData,
editorConfigs,
pluginDependencyConfig,
}: DataTreeSeed): DataTree {
2020-02-18 10:41:52 +00:00
const dataTree: DataTree = {};
2020-12-24 04:32:25 +00:00
actions.forEach((action) => {
const editorConfig = editorConfigs[action.config.pluginId];
const dependencyConfig = pluginDependencyConfig[action.config.pluginId];
dataTree[action.config.name] = generateDataTreeAction(
action,
editorConfig,
dependencyConfig,
2020-04-17 16:15:09 +00:00
);
});
Object.values(widgets).forEach((widget) => {
dataTree[widget.widgetName] = generateDataTreeWidget(
widget,
widgetsMeta[widget.widgetId],
);
2020-02-18 10:41:52 +00:00
});
2020-06-19 13:06:45 +00:00
2020-04-20 05:42:46 +00:00
dataTree.pageList = pageList;
2021-03-24 05:09:47 +00:00
dataTree.appsmith = {
...appData,
// combine both persistent and transient state with the transient state
// taking precedence in case the key is the same
store: { ...appData.store.persistent, ...appData.store.transient },
} as DataTreeAppsmith;
(dataTree.appsmith as DataTreeAppsmith).ENTITY_TYPE = ENTITY_TYPE.APPSMITH;
2020-02-18 10:41:52 +00:00
return dataTree;
}
}