From 910e7e84eb0763063c9f174ed06070c788b088b1 Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Sat, 2 Nov 2024 18:50:37 +0530 Subject: [PATCH 1/8] performance fix --- .../evaluationReducers/loadingEntitiesReducer.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/client/src/reducers/evaluationReducers/loadingEntitiesReducer.ts b/app/client/src/reducers/evaluationReducers/loadingEntitiesReducer.ts index 9a22376cbdfa..05e6da8aea0b 100644 --- a/app/client/src/reducers/evaluationReducers/loadingEntitiesReducer.ts +++ b/app/client/src/reducers/evaluationReducers/loadingEntitiesReducer.ts @@ -1,6 +1,7 @@ import { createReducer } from "utils/ReducerUtils"; import type { ReduxAction } from "ee/constants/ReduxActionConstants"; import { ReduxActionTypes } from "ee/constants/ReduxActionConstants"; +import { isEqual } from "lodash"; export type LoadingEntitiesState = Set; @@ -10,7 +11,16 @@ const loadingEntitiesReducer = createReducer(initialState, { [ReduxActionTypes.SET_LOADING_ENTITIES]: ( state: LoadingEntitiesState, action: ReduxAction>, - ): LoadingEntitiesState => action.payload, + ): LoadingEntitiesState => { + const newLoadingEntities = action.payload; + + // its just a set with string properties time complexity of equal is not too bad + if (isEqual(state, newLoadingEntities)) { + return state; + } + + return newLoadingEntities; + }, [ReduxActionTypes.FETCH_PAGE_INIT]: () => initialState, }); From 10d158cbdec8bb34b53fe0d98214a25013b1ca4b Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Sat, 2 Nov 2024 23:50:19 +0530 Subject: [PATCH 2/8] refactored code to improve optimisation --- app/client/src/ce/entities/DataTree/types.ts | 1 - .../src/entities/DataTree/dataTreeFactory.ts | 197 +++++++++--------- .../src/entities/DataTree/dataTreeWidget.ts | 9 +- app/client/src/selectors/dataTreeSelectors.ts | 138 +++++++----- 4 files changed, 183 insertions(+), 162 deletions(-) diff --git a/app/client/src/ce/entities/DataTree/types.ts b/app/client/src/ce/entities/DataTree/types.ts index 4357954002ce..04a5877c4a1d 100644 --- a/app/client/src/ce/entities/DataTree/types.ts +++ b/app/client/src/ce/entities/DataTree/types.ts @@ -199,7 +199,6 @@ export interface DataTreeSeed { pluginDependencyConfig: Record; widgets: CanvasWidgetsReduxState; widgetsMeta: MetaState; - pageList: Page[]; appData: AppDataState; jsActions: JSCollectionDataState; theme: AppTheme["properties"]; diff --git a/app/client/src/entities/DataTree/dataTreeFactory.ts b/app/client/src/entities/DataTree/dataTreeFactory.ts index 5d68c072be0e..17e3ecccf9ff 100644 --- a/app/client/src/entities/DataTree/dataTreeFactory.ts +++ b/app/client/src/entities/DataTree/dataTreeFactory.ts @@ -1,88 +1,71 @@ import { generateDataTreeAction } from "ee/entities/DataTree/dataTreeAction"; import { generateDataTreeJSAction } from "ee/entities/DataTree/dataTreeJSAction"; import { generateDataTreeWidget } from "entities/DataTree/dataTreeWidget"; -import log from "loglevel"; import { ENTITY_TYPE, EvaluationSubstitutionType, } from "ee/entities/DataTree/types"; import { generateDataTreeModuleInputs } from "ee/entities/DataTree/utils"; -import type { - DataTreeSeed, - AppsmithEntity, - EntityTypeValue, -} from "ee/entities/DataTree/types"; -import type { - unEvalAndConfigTree, - ConfigTree, - UnEvalTree, -} from "entities/DataTree/dataTreeTypes"; +import type { EntityTypeValue } from "ee/entities/DataTree/types"; +import type { ConfigTree, UnEvalTree } from "entities/DataTree/dataTreeTypes"; import { isEmpty } from "lodash"; import { generateModuleInstance } from "ee/entities/DataTree/dataTreeModuleInstance"; -import { - endSpan, - startNestedSpan, - startRootSpan, -} from "UITelemetry/generateTraces"; +import { endSpan, startRootSpan } from "UITelemetry/generateTraces"; +import type { ActionDataState } from "ee/reducers/entityReducers/actionsReducer"; +import type { JSCollectionDataState } from "ee/reducers/entityReducers/jsActionsReducer"; +import type { LayoutSystemTypes } from "layoutSystems/types"; +import type { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; +import type { MetaState } from "reducers/entityReducers/metaReducer"; +import type { LoadingEntitiesState } from "reducers/evaluationReducers/loadingEntitiesReducer"; +import type { MetaWidgetsReduxState } from "reducers/entityReducers/metaWidgetsReducer"; +import type { Module } from "ee/constants/ModuleConstants"; +import type { ModuleInstance } from "ee/constants/ModuleInstanceConstants"; +import type { + DependencyMap, + FormEditorConfigs, +} from "utils/DynamicBindingUtils"; export class DataTreeFactory { - static create({ - actions, - appData, - editorConfigs, - isMobile, - jsActions, - layoutSystemType, - loadingEntities, - metaWidgets, - moduleInputs, - moduleInstanceEntities, - moduleInstances, - pluginDependencyConfig, - theme, - widgets, - widgetsMeta, - }: DataTreeSeed): unEvalAndConfigTree { + public static metaWidgets( + metaWidgets: MetaWidgetsReduxState, + widgetsMeta: MetaState, + loadingEntities: LoadingEntitiesState, + ) { const dataTree: UnEvalTree = {}; const configTree: ConfigTree = {}; - const start = performance.now(); - const startActions = performance.now(); - const rootSpan = startRootSpan("DataTreeFactory.create"); - const actionsSpan = startNestedSpan("DataTreeFactory.actions", rootSpan); + const metaWidgetsSpan = startRootSpan("DataTreeFactory.metaWidgets"); - actions.forEach((action) => { - const editorConfig = editorConfigs[action.config.pluginId]; - const dependencyConfig = pluginDependencyConfig[action.config.pluginId]; - const { configEntity, unEvalEntity } = generateDataTreeAction( - action, - editorConfig, - dependencyConfig, + Object.values(metaWidgets).forEach((widget) => { + const { configEntity, unEvalEntity } = generateDataTreeWidget( + widget, + widgetsMeta[widget.metaWidgetId || widget.widgetId], + loadingEntities, ); - dataTree[action.config.name] = unEvalEntity; - configTree[action.config.name] = configEntity; - }); - const endActions = performance.now(); - - endSpan(actionsSpan); - - const startJsActions = performance.now(); - const jsActionsSpan = startNestedSpan( - "DataTreeFactory.jsActions", - rootSpan, - ); - - jsActions.forEach((js) => { - const { configEntity, unEvalEntity } = generateDataTreeJSAction(js); - - dataTree[js.config.name] = unEvalEntity; - configTree[js.config.name] = configEntity; + dataTree[widget.widgetName] = unEvalEntity; + configTree[widget.widgetName] = configEntity; }); - const endJsActions = performance.now(); + endSpan(metaWidgetsSpan); - endSpan(jsActionsSpan); + return { + dataTree, + configTree, + }; + } - const startWidgets = performance.now(); - const widgetsSpan = startNestedSpan("DataTreeFactory.widgets", rootSpan); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public static widgets( + moduleInputs: Module["inputsForm"], + moduleInstances: Record | null, + moduleInstanceEntities: null, + widgets: CanvasWidgetsReduxState, + widgetsMeta: MetaState, + loadingEntities: LoadingEntitiesState, + layoutSystemType: LayoutSystemTypes, + isMobile: boolean, + ) { + const dataTree: UnEvalTree = {}; + const configTree: ConfigTree = {}; + const widgetsSpan = startRootSpan("DataTreeFactory.widgets"); if (!isEmpty(moduleInputs)) { const { configEntity, unEvalEntity } = @@ -120,54 +103,60 @@ export class DataTreeFactory { dataTree[widget.widgetName] = unEvalEntity; configTree[widget.widgetName] = configEntity; }); - - const endWidgets = performance.now(); - endSpan(widgetsSpan); - 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, - theme, - } as AppsmithEntity; - (dataTree.appsmith as AppsmithEntity).ENTITY_TYPE = ENTITY_TYPE.APPSMITH; - - const startMetaWidgets = performance.now(); - const metaWidgetsSpan = startNestedSpan( - "DataTreeFactory.metaWidgets", - rootSpan, - ); + return { + dataTree, + configTree, + }; + } - Object.values(metaWidgets).forEach((widget) => { - const { configEntity, unEvalEntity } = generateDataTreeWidget( - widget, - widgetsMeta[widget.metaWidgetId || widget.widgetId], - loadingEntities, - ); + public static jsActions(jsActions: JSCollectionDataState) { + const dataTree: UnEvalTree = {}; + const configTree: ConfigTree = {}; + const actionsSpan = startRootSpan("DataTreeFactory.jsActions"); - dataTree[widget.widgetName] = unEvalEntity; - configTree[widget.widgetName] = configEntity; + jsActions.forEach((js) => { + const { configEntity, unEvalEntity } = generateDataTreeJSAction(js); + + dataTree[js.config.name] = unEvalEntity; + configTree[js.config.name] = configEntity; }); - const endMetaWidgets = performance.now(); + endSpan(actionsSpan); - endSpan(metaWidgetsSpan); - endSpan(rootSpan); + return { + dataTree, + configTree, + }; + } - const end = performance.now(); + public static actions( + actions: ActionDataState, + editorConfigs: FormEditorConfigs, + pluginDependencyConfig: Record, + ) { + const dataTree: UnEvalTree = {}; + const configTree: ConfigTree = {}; + const actionsSpan = startRootSpan("DataTreeFactory.actions"); - const out = { - total: end - start, - widgets: endWidgets - startWidgets, - actions: endActions - startActions, - jsActions: endJsActions - startJsActions, - metaWidgets: endMetaWidgets - startMetaWidgets, - }; + actions.forEach((action) => { + const editorConfig = editorConfigs[action.config.pluginId]; + const dependencyConfig = pluginDependencyConfig[action.config.pluginId]; + const { configEntity, unEvalEntity } = generateDataTreeAction( + action, + editorConfig, + dependencyConfig, + ); - log.debug("### Create unevalTree timing", out); + dataTree[action.config.name] = unEvalEntity; + configTree[action.config.name] = configEntity; + }); + endSpan(actionsSpan); - return { unEvalTree: dataTree, configTree }; + return { + dataTree, + configTree, + }; } } diff --git a/app/client/src/entities/DataTree/dataTreeWidget.ts b/app/client/src/entities/DataTree/dataTreeWidget.ts index a5a9a2fd8c8b..c909e682ffa9 100644 --- a/app/client/src/entities/DataTree/dataTreeWidget.ts +++ b/app/client/src/entities/DataTree/dataTreeWidget.ts @@ -1,5 +1,5 @@ import { getAllPathsFromPropertyConfig } from "entities/Widget/utils"; -import _, { get, isEmpty } from "lodash"; +import _, { get, isEmpty, omit } from "lodash"; import memoize from "micro-memoize"; import type { FlattenedWidgetProps } from "reducers/entityReducers/canvasWidgetsReducer"; import type { DynamicPath } from "utils/DynamicBindingUtils"; @@ -21,6 +21,7 @@ import WidgetFactory from "WidgetProvider/factory"; import { getComponentDimensions } from "layoutSystems/common/utils/ComponentSizeUtils"; import type { LoadingEntitiesState } from "reducers/evaluationReducers/loadingEntitiesReducer"; import { LayoutSystemTypes } from "layoutSystems/types"; +import { WIDGET_PROPS_TO_SKIP_FROM_EVAL } from "constants/WidgetConstants"; /** * @@ -176,13 +177,17 @@ export function getSetterConfig( // Widget changes only when dynamicBindingPathList changes. // Only meta properties change very often, for example typing in an input or selecting a table row. const generateDataTreeWidgetWithoutMeta = ( - widget: FlattenedWidgetProps, + widgetWithEval: FlattenedWidgetProps, ): { dataTreeWidgetWithoutMetaProps: WidgetEntity; overridingMetaPropsMap: Record; defaultMetaProps: Record; entityConfig: WidgetEntityConfig; } => { + const widget = omit( + widgetWithEval, + Object.keys(WIDGET_PROPS_TO_SKIP_FROM_EVAL), + ) as FlattenedWidgetProps; // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any const derivedProps: any = {}; diff --git a/app/client/src/selectors/dataTreeSelectors.ts b/app/client/src/selectors/dataTreeSelectors.ts index 467af24c1a02..1babbe0563bd 100644 --- a/app/client/src/selectors/dataTreeSelectors.ts +++ b/app/client/src/selectors/dataTreeSelectors.ts @@ -11,17 +11,23 @@ import { getCurrentModuleActions, getCurrentModuleJSCollections, } from "ee/selectors/entitiesSelector"; -import type { WidgetEntity } from "ee/entities/DataTree/types"; -import type { DataTree } from "entities/DataTree/dataTreeTypes"; -import { DataTreeFactory } from "entities/DataTree/dataTreeFactory"; +import type { AppsmithEntity, WidgetEntity } from "ee/entities/DataTree/types"; +import type { + ConfigTree, + DataTree, + UnEvalTree, +} from "entities/DataTree/dataTreeTypes"; +import { + DataTreeFactory, + ENTITY_TYPE, +} from "entities/DataTree/dataTreeFactory"; import { getIsMobileBreakPoint, getMetaWidgets, - getWidgetsForEval, + getWidgets, getWidgetsMeta, } from "sagas/selectors"; import "url-search-params-polyfill"; -import { getPageList } from "./appViewSelectors"; import type { AppState } from "ee/reducers"; import { getSelectedAppThemeProperties } from "./appThemingSelectors"; import type { LoadingEntitiesState } from "reducers/evaluationReducers/loadingEntitiesReducer"; @@ -55,25 +61,20 @@ const getLayoutSystemPayload = createSelector( }, ); -const getCurrentActionEntities = createSelector( +const getCurrentActionsEntities = createSelector( getCurrentActions, getCurrentModuleActions, getCurrentWorkflowActions, + (actions, moduleActions, workflowActions) => { + return [...actions, ...moduleActions, ...workflowActions]; + }, +); +const getCurrentJSActionsEntities = createSelector( getCurrentJSCollections, getCurrentModuleJSCollections, getCurrentWorkflowJSActions, - ( - actions, - moduleActions, - workflowActions, - jsActions, - moduleJSActions, - workflowJsActions, - ) => { - return { - actions: [...actions, ...moduleActions, ...workflowActions], - jsActions: [...jsActions, ...moduleJSActions, ...workflowJsActions], - }; + (jsActions, moduleJSActions, workflowJsActions) => { + return [...jsActions, ...moduleJSActions, ...workflowJsActions]; }, ); @@ -90,49 +91,76 @@ const getModulesData = createSelector( }, ); -export const getUnevaluatedDataTree = createSelector( - getCurrentActionEntities, - getWidgetsForEval, - getWidgetsMeta, - getPageList, - getAppData, +const getActionsFromUnevaluatedDataTree = createSelector( + getCurrentActionsEntities, getPluginEditorConfigs, getPluginDependencyConfig, - getSelectedAppThemeProperties, - getMetaWidgets, - getLayoutSystemPayload, - getLoadingEntities, + (actions, editorConfigs, pluginDependencyConfig) => + DataTreeFactory.actions(actions, editorConfigs, pluginDependencyConfig), +); + +const getJSActionsFromUnevaluatedDataTree = createSelector( + getCurrentJSActionsEntities, + (jsActions) => DataTreeFactory.jsActions(jsActions), +); + +const getWidgetsFromUnevaluatedDataTree = createSelector( getModulesData, - ( - currentActionEntities, - widgets, - widgetsMeta, - pageListPayload, - appData, - editorConfigs, - pluginDependencyConfig, - selectedAppThemeProperty, - metaWidgets, - layoutSystemPayload, - loadingEntities, - modulesData, - ) => { - const pageList = pageListPayload || []; - - return DataTreeFactory.create({ - ...currentActionEntities, + getWidgets, + getWidgetsMeta, + getLoadingEntities, + getLayoutSystemPayload, + (moduleData, widgets, widgetsMeta, loadingEntities, layoutSystemPayload) => + DataTreeFactory.widgets( + moduleData.moduleInputs, + moduleData.moduleInstances, + moduleData.moduleInstanceEntities, widgets, widgetsMeta, - pageList, - appData, - editorConfigs, - pluginDependencyConfig, - theme: selectedAppThemeProperty, - metaWidgets, loadingEntities, - ...layoutSystemPayload, - ...modulesData, - }); + layoutSystemPayload.layoutSystemType, + layoutSystemPayload.isMobile, + ), +); +const getMetaWidgetsFromUnevaluatedDataTree = createSelector( + getMetaWidgets, + getWidgetsMeta, + getLoadingEntities, + (metaWidgets, widgetsMeta, loadingEntities) => + DataTreeFactory.metaWidgets(metaWidgets, widgetsMeta, loadingEntities), +); + +export const getUnevaluatedDataTree = createSelector( + getActionsFromUnevaluatedDataTree, + getJSActionsFromUnevaluatedDataTree, + getWidgetsFromUnevaluatedDataTree, + getMetaWidgetsFromUnevaluatedDataTree, + getAppData, + getSelectedAppThemeProperties, + (actions, jsActions, widgets, metaWidgets, appData, theme) => { + let dataTree: UnEvalTree = { + ...actions.dataTree, + ...jsActions.dataTree, + ...widgets.dataTree, + }; + let configTree: ConfigTree = { + ...actions.configTree, + ...jsActions.configTree, + ...widgets.configTree, + }; + + 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, + theme, + } as AppsmithEntity; + (dataTree.appsmith as AppsmithEntity).ENTITY_TYPE = ENTITY_TYPE.APPSMITH; + dataTree = { ...dataTree, ...metaWidgets.dataTree }; + configTree = { ...configTree, ...metaWidgets.configTree }; + + return { unEvalTree: dataTree, configTree }; }, ); From 92639d553367a12ea7a20f883a65d2ddea9ddb59 Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Sat, 2 Nov 2024 23:58:23 +0530 Subject: [PATCH 3/8] small fix --- app/client/src/entities/DataTree/dataTreeWidget.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/client/src/entities/DataTree/dataTreeWidget.test.ts b/app/client/src/entities/DataTree/dataTreeWidget.test.ts index f50444e11a03..36d78901d407 100644 --- a/app/client/src/entities/DataTree/dataTreeWidget.test.ts +++ b/app/client/src/entities/DataTree/dataTreeWidget.test.ts @@ -225,8 +225,6 @@ describe("generateDataTreeWidget", () => { parentColumnSpace: 0, parentRowSpace: 0, rightColumn: 0, - renderMode: RenderModes.CANVAS, - version: 0, topRow: 0, widgetId: "123", widgetName: "Input1", From fdfc5cd6c7c03f7dc0332db15d1098647ddd3be9 Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Sun, 3 Nov 2024 12:17:43 +0530 Subject: [PATCH 4/8] test case fix --- .../ClientSide/Widgets/Datepicker/DatePicker2_spec.js | 4 +++- app/client/cypress/limited-tests.txt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js index af2714ccb725..7c8c7f431867 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js @@ -30,14 +30,16 @@ describe( formWidgetsPage.datepickerWidget, widgetsPage.widgetNameSpan, ); - + cy.wait(1000) // change the date to next day cy.get(formWidgetsPage.defaultDate).click(); /** * setDate--> is a Command to select the date in the date picker */ + cy.wait(1000) cy.setDate(1); + cy.wait(1000) const nextDay = dayjs().add(1, "days").format("DD/MM/YYYY"); cy.log(nextDay); cy.get(formWidgetsPage.datepickerWidget + " .bp3-input").should( diff --git a/app/client/cypress/limited-tests.txt b/app/client/cypress/limited-tests.txt index 31c0c0253fef..0402b8b54842 100644 --- a/app/client/cypress/limited-tests.txt +++ b/app/client/cypress/limited-tests.txt @@ -1,6 +1,6 @@ # To run only limited tests - give the spec names in below format: cypress/e2e/Regression/ClientSide/Templates/Fork_Template_spec.js - +cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js # For running all specs - uncomment below: #cypress/e2e/**/**/* From 9b53a76b6f6b3dd883e663ae08a41f2300c9de0a Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Sun, 3 Nov 2024 23:39:15 +0530 Subject: [PATCH 5/8] test case fix --- .../ClientSide/Widgets/Datepicker/DatePicker2_spec.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js index 7c8c7f431867..906b5fd620bd 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js @@ -30,16 +30,14 @@ describe( formWidgetsPage.datepickerWidget, widgetsPage.widgetNameSpan, ); - cy.wait(1000) // change the date to next day cy.get(formWidgetsPage.defaultDate).click(); /** * setDate--> is a Command to select the date in the date picker */ - cy.wait(1000) - cy.setDate(1); - cy.wait(1000) + + cy.setDate(1,"ddd MMM DD YYYY"); const nextDay = dayjs().add(1, "days").format("DD/MM/YYYY"); cy.log(nextDay); cy.get(formWidgetsPage.datepickerWidget + " .bp3-input").should( From a5b03607d4fb6b170ccf789d9aaf72e362dfc1d0 Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Mon, 4 Nov 2024 00:16:58 +0530 Subject: [PATCH 6/8] test case fix --- app/client/cypress/support/commands.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/client/cypress/support/commands.js b/app/client/cypress/support/commands.js index 19c28a5b3721..f0fed7626b6a 100644 --- a/app/client/cypress/support/commands.js +++ b/app/client/cypress/support/commands.js @@ -525,7 +525,7 @@ Cypress.Commands.add("getDate", (date, dateFormate) => { }); Cypress.Commands.add("setDate", (date) => { - const expDate = dayjs().add(date, "days").format("dddd, MMMM DD"); + const expDate = dayjs().add(date, "days").format("dddd, MMMM Do, YYYY"); cy.get(`.react-datepicker__day[aria-label^="Choose ${expDate}"]`).click(); }); From c91d1f774424c80e7b8449adac9ea742b2d1854b Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Mon, 4 Nov 2024 01:16:26 +0530 Subject: [PATCH 7/8] added advancedformat plugin --- app/client/cypress/support/commands.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/client/cypress/support/commands.js b/app/client/cypress/support/commands.js index f0fed7626b6a..d922a6f902fe 100644 --- a/app/client/cypress/support/commands.js +++ b/app/client/cypress/support/commands.js @@ -2,6 +2,7 @@ /* eslint-disable cypress/no-assigning-return-values */ /* This file is used to maintain comman methods across tests , refer other *.js files for adding common methods */ import { ANVIL_EDITOR_TEST } from "./Constants.js"; +import advancedFormat from "dayjs/plugin/advancedFormat"; import EditorNavigation, { EntityType, @@ -18,6 +19,7 @@ import { v4 as uuidv4 } from "uuid"; const dayjs = require("dayjs"); const loginPage = require("../locators/LoginPage.json"); import homePage from "../locators/HomePage"; +dayjs.extend(advancedFormat); const commonlocators = require("../locators/commonlocators.json"); const widgetsPage = require("../locators/Widgets.json"); From 557172d47b2232800355e1dc78c921d9cb56c725 Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi Date: Mon, 4 Nov 2024 09:40:55 +0530 Subject: [PATCH 8/8] included encompassed to include all subselector responses --- .../Widgets/Datepicker/DatePicker2_spec.js | 2 +- app/client/cypress/limited-tests.txt | 1 - app/client/src/sagas/EvalWorkerActionSagas.ts | 5 +++++ app/client/src/sagas/EvaluationsSaga.ts | 13 +++++++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js index 906b5fd620bd..a84f5c06692d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js @@ -37,7 +37,7 @@ describe( * setDate--> is a Command to select the date in the date picker */ - cy.setDate(1,"ddd MMM DD YYYY"); + cy.setDate(1); const nextDay = dayjs().add(1, "days").format("DD/MM/YYYY"); cy.log(nextDay); cy.get(formWidgetsPage.datepickerWidget + " .bp3-input").should( diff --git a/app/client/cypress/limited-tests.txt b/app/client/cypress/limited-tests.txt index 0402b8b54842..aa00835ffb0e 100644 --- a/app/client/cypress/limited-tests.txt +++ b/app/client/cypress/limited-tests.txt @@ -1,6 +1,5 @@ # To run only limited tests - give the spec names in below format: cypress/e2e/Regression/ClientSide/Templates/Fork_Template_spec.js -cypress/e2e/Regression/ClientSide/Widgets/Datepicker/DatePicker2_spec.js # For running all specs - uncomment below: #cypress/e2e/**/**/* diff --git a/app/client/src/sagas/EvalWorkerActionSagas.ts b/app/client/src/sagas/EvalWorkerActionSagas.ts index c786d005550d..4485b67a36bd 100644 --- a/app/client/src/sagas/EvalWorkerActionSagas.ts +++ b/app/client/src/sagas/EvalWorkerActionSagas.ts @@ -23,6 +23,7 @@ import { sortJSExecutionDataByCollectionId } from "workers/Evaluation/JSObject/u import type { LintTreeSagaRequestData } from "plugins/Linting/types"; import { evalErrorHandler } from "./EvalErrorHandler"; import { getUnevaluatedDataTree } from "selectors/dataTreeSelectors"; +import { endSpan, startRootSpan } from "UITelemetry/generateTraces"; export interface UpdateDataTreeMessageData { workerResponse: EvalTreeResponseData; @@ -166,9 +167,13 @@ export function* handleEvalWorkerMessage(message: TMessage) { } case MAIN_THREAD_ACTION.UPDATE_DATATREE: { const { workerResponse } = data as UpdateDataTreeMessageData; + const rootSpan = startRootSpan("DataTreeFactory.create"); + const unEvalAndConfigTree: ReturnType = yield select(getUnevaluatedDataTree); + endSpan(rootSpan); + yield call(updateDataTreeHandler, { evalTreeResponse: workerResponse as EvalTreeResponseData, unevalTree: unEvalAndConfigTree.unEvalTree || {}, diff --git a/app/client/src/sagas/EvaluationsSaga.ts b/app/client/src/sagas/EvaluationsSaga.ts index eaf5d9bcabf6..c7b0115ae0eb 100644 --- a/app/client/src/sagas/EvaluationsSaga.ts +++ b/app/client/src/sagas/EvaluationsSaga.ts @@ -350,10 +350,14 @@ export function* evaluateAndExecuteDynamicTrigger( callbackData?: Array, globalContext?: Record, ) { + const rootSpan = startRootSpan("DataTreeFactory.create"); + const unEvalTree: ReturnType = yield select( getUnevaluatedDataTree, ); + endSpan(rootSpan); + log.debug({ execute: dynamicTrigger }); const response: { errors: EvaluationError[]; result: unknown } = yield call( evalWorker.request, @@ -497,8 +501,12 @@ export function* executeJSFunction( export // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any function* validateProperty(property: string, value: any, props: WidgetProps) { + const rootSpan = startRootSpan("DataTreeFactory.create"); + const unEvalAndConfigTree: ReturnType = yield select(getUnevaluatedDataTree); + + endSpan(rootSpan); const configTree = unEvalAndConfigTree.configTree; const entityConfig = configTree[props.widgetName] as WidgetEntityConfig; const validation = entityConfig?.validationPaths[property]; @@ -661,9 +669,14 @@ function* evalAndLintingHandler( return; } + const rootSpan = startRootSpan("DataTreeFactory.create"); + // Generate all the data needed for both eval and linting const unEvalAndConfigTree: ReturnType = yield select(getUnevaluatedDataTree); + + endSpan(rootSpan); + const postEvalActions = getPostEvalActions(action); const fn: (...args: unknown[]) => CallEffect | ForkEffect = isBlockingCall ? call : fork;