diff --git a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionTree.tsx b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionTree.tsx index f169877253a..05a96157ad8 100644 --- a/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionTree.tsx +++ b/app/client/src/components/editorComponents/ActionCreator/viewComponents/Action/ActionTree.tsx @@ -1,7 +1,6 @@ import styled from "styled-components"; import TreeStructure from "components/utils/TreeStructure"; import { Text, Icon, Button, Tooltip } from "@appsmith/ads"; -import { klona } from "klona/lite"; import React, { useCallback, useEffect } from "react"; import { ActionCreatorContext } from "../.."; import { AppsmithFunction } from "../../constants"; @@ -13,6 +12,7 @@ import AnalyticsUtil from "ee/utils/AnalyticsUtil"; import { getActionTypeLabel } from "../ActionBlockTree/utils"; import classNames from "classnames"; import type { AdditionalDynamicDataTree } from "utils/autocomplete/customTreeTypeDefCreator"; +import { klonaLiteWithTelemetry } from "utils/helpers"; const CallbackBlockContainer = styled.div<{ isSelected: boolean; @@ -108,7 +108,12 @@ export default function ActionTree(props: { selectBlock(`${id}_success_${blocks.length - 1}`); return; } - const newActionBlock = klona(actionBlock); + + const newActionBlock = klonaLiteWithTelemetry( + actionBlock, + "ActionTree.handleAddSuccessBlock", + ); + newActionBlock.success.blocks.push({ ...EMPTY_ACTION_BLOCK, type: lastAction?.type || "then", @@ -127,7 +132,11 @@ export default function ActionTree(props: { selectBlock(`${id}_failure_${blocks.length - 1}`); return; } - const newActionBlock = klona(actionBlock); + const newActionBlock = klonaLiteWithTelemetry( + actionBlock, + "ActionTree.handleAddErrorBlock", + ); + newActionBlock.error.blocks.push({ ...EMPTY_ACTION_BLOCK, type: lastAction?.type || "catch", @@ -272,7 +281,11 @@ export default function ActionTree(props: { childActionBlock: TActionBlock, del?: boolean, ) => { - const newActionBlock = klona(actionBlock); + const newActionBlock = klonaLiteWithTelemetry( + actionBlock, + "ActionTree.onChange", + ); + const blocks = blockType === "failure" ? newActionBlock.error.blocks diff --git a/app/client/src/components/formControls/utils.ts b/app/client/src/components/formControls/utils.ts index 465337ec03f..5f214ca0919 100644 --- a/app/client/src/components/formControls/utils.ts +++ b/app/client/src/components/formControls/utils.ts @@ -17,6 +17,7 @@ import { getType, Types } from "utils/TypeHelpers"; import { FIELD_REQUIRED_ERROR, createMessage } from "ee/constants/messages"; import { FEATURE_FLAG } from "ee/entities/FeatureFlag"; import { InputTypes } from "components/constants"; +import { startAndEndSpanForFn } from "UITelemetry/generateTraces"; // This function checks if the form is dirty // We needed this in the cases where datasources are created from APIs and the initial value @@ -682,7 +683,15 @@ export const updateEvaluatedSectionConfig = ( // leaving the commented code as a reminder of the above observation. // const updatedSection = { ...section }; - const updatedSection = klona(section); + + const updatedSection = startAndEndSpanForFn( + "klona", + { + codeSegment: "utils.updateEvaluatedSectionConfig", + }, + () => klona(section), + ); + let evaluatedConfig: FormConfigEvalObject = {}; if ( conditionalOutput.hasOwnProperty("evaluateFormConfig") && diff --git a/app/client/src/components/propertyControls/FieldConfigurationControl.tsx b/app/client/src/components/propertyControls/FieldConfigurationControl.tsx index 89791db0fc5..84386a3694c 100644 --- a/app/client/src/components/propertyControls/FieldConfigurationControl.tsx +++ b/app/client/src/components/propertyControls/FieldConfigurationControl.tsx @@ -1,6 +1,5 @@ import React from "react"; import log from "loglevel"; -import { klona } from "klona"; import { isEmpty, isString, maxBy, set, sortBy } from "lodash"; import type { ControlProps } from "./BaseControl"; @@ -26,6 +25,8 @@ import { extraSpace, } from "widgets/JSONFormWidget/constants"; +import { klonaRegularWithTelemetry } from "utils/helpers"; + type DroppableItem = BaseItemProps & { index: number; isCustomField: boolean; @@ -165,8 +166,12 @@ class FieldConfigurationControl extends BaseControl { * the new added paths gets into the dynamicBindingPathList until * the updateProperty function is fixed. */ + const updatedSchema = { - schema: klona(widgetProperties.schema), + schema: klonaRegularWithTelemetry( + widgetProperties.schema, + "FieldConfigurationControl.addNewField", + ), }; set(updatedSchema, path, schemaItem); @@ -187,7 +192,10 @@ class FieldConfigurationControl extends BaseControl { updateItems = (items: DroppableItem[]) => { const { propertyName, propertyValue } = this.props; - const clonedSchema: Schema = klona(propertyValue); + const clonedSchema: Schema = klonaRegularWithTelemetry( + propertyValue, + "FieldConfigurationControl.updateItems", + ); items.forEach((item, index) => { clonedSchema[item.id].position = index; diff --git a/app/client/src/reducers/entityReducers/metaReducer/metaReducerUtils.ts b/app/client/src/reducers/entityReducers/metaReducer/metaReducerUtils.ts index 88b45c3d643..9102cf9bd55 100644 --- a/app/client/src/reducers/entityReducers/metaReducer/metaReducerUtils.ts +++ b/app/client/src/reducers/entityReducers/metaReducer/metaReducerUtils.ts @@ -3,12 +3,12 @@ import type { WidgetEntityConfig, PropertyOverrideDependency, } from "ee/entities/DataTree/types"; -import { klona } from "klona"; import type { MetaState, WidgetMetaState } from "."; import type { ReduxAction } from "ee/constants/ReduxActionConstants"; import type { EvalMetaUpdates } from "ee/workers/common/DataTreeEvaluator/types"; import produce from "immer"; import { set, unset } from "lodash"; +import { klonaRegularWithTelemetry } from "utils/helpers"; export function getMetaWidgetResetObj( evaluatedWidget: WidgetEntity | undefined, @@ -28,7 +28,11 @@ export function getMetaWidgetResetObj( dependency.DEFAULT && evaluatedWidget[dependency.DEFAULT]; if (defaultPropertyValue !== undefined) { // cloning data to avoid mutation - resetMetaObj[propertyName] = klona(defaultPropertyValue); + + resetMetaObj[propertyName] = klonaRegularWithTelemetry( + defaultPropertyValue, + "metaReducerUtils.getMetaWidgetResetObj", + ); } }); } @@ -48,7 +52,10 @@ export function setMetaValuesOnResetFromEval( if (!evalMetaUpdates.length) return state; - const newMetaState = klona(state); + const newMetaState = klonaRegularWithTelemetry( + state, + "metaReducerUtils.setMetaValuesOnResetFromEval", + ); evalMetaUpdates.forEach(({ metaPropertyPath, value, widgetId }) => { if (value === undefined) { diff --git a/app/client/src/sagas/ApiPaneSagas.ts b/app/client/src/sagas/ApiPaneSagas.ts index a0e973df329..cfa5c1511a9 100644 --- a/app/client/src/sagas/ApiPaneSagas.ts +++ b/app/client/src/sagas/ApiPaneSagas.ts @@ -68,7 +68,6 @@ import { getCurrentBasePageId } from "selectors/editorSelectors"; import { validateResponse } from "./ErrorSagas"; import type { CreateDatasourceSuccessAction } from "actions/datasourceActions"; import { removeTempDatasource } from "actions/datasourceActions"; -import { klona } from "klona/lite"; import { toast } from "@appsmith/ads"; import type { AutoGeneratedHeader } from "pages/Editor/APIEditor/helpers"; import { deriveAutoGeneratedHeaderState } from "pages/Editor/APIEditor/helpers"; @@ -85,6 +84,7 @@ import { DEFAULT_CREATE_APPSMITH_AI_CONFIG } from "constants/ApiEditorConstants/ import { checkAndGetPluginFormConfigsSaga } from "./PluginSagas"; import { convertToBasePageIdSelector } from "selectors/pageListSelectors"; import type { ApplicationPayload } from "entities/Application"; +import { klonaLiteWithTelemetry } from "utils/helpers"; function* syncApiParamsSaga( actionPayload: ReduxActionWithMeta, @@ -157,7 +157,10 @@ function* handleUpdateBodyContentType( ); // get headers - const headers = klona(values?.actionConfiguration?.headers); + const headers = klonaLiteWithTelemetry( + values?.actionConfiguration?.headers, + "ApiPaneSagas.handleUpdateBodyContentType.headers", + ); // set autoGeneratedHeaders const autoGeneratedHeaders: AutoGeneratedHeader[] = []; @@ -223,7 +226,11 @@ function* handleUpdateBodyContentType( }); // help to prevent cyclic dependency error in case the bodyFormData is empty. - const bodyFormData = klona(values?.actionConfiguration?.bodyFormData); + + const bodyFormData = klonaLiteWithTelemetry( + values?.actionConfiguration?.bodyFormData, + "ApiPaneSagas.handleUpdateBodyContentType.bodyFormData", + ); if ( displayFormatValue === POST_BODY_FORMAT_OPTIONS.FORM_URLENCODED || diff --git a/app/client/src/sagas/DatasourcesSagas.ts b/app/client/src/sagas/DatasourcesSagas.ts index 74eeff3d84d..b19fe2f9c78 100644 --- a/app/client/src/sagas/DatasourcesSagas.ts +++ b/app/client/src/sagas/DatasourcesSagas.ts @@ -127,7 +127,11 @@ import { isDynamicValue } from "utils/DynamicBindingUtils"; import { getQueryParams } from "utils/URLUtils"; import type { GenerateCRUDEnabledPluginMap, Plugin } from "api/PluginApi"; import { getIsGeneratePageInitiator } from "utils/GenerateCrudUtil"; -import { shouldBeDefined, trimQueryString } from "utils/helpers"; +import { + klonaLiteWithTelemetry, + shouldBeDefined, + trimQueryString, +} from "utils/helpers"; import { updateReplayEntity } from "actions/pageActions"; import OAuthApi from "api/OAuthApi"; import type { AppState } from "ee/reducers"; @@ -161,7 +165,6 @@ import { isGoogleSheetPluginDS, } from "utils/editorContextUtils"; import { getDefaultEnvId } from "ee/api/ApiUtils"; -import { klona } from "klona/lite"; import { getCurrentEditingEnvironmentId, getCurrentEnvironmentDetails, @@ -1780,7 +1783,11 @@ function* filePickerActionCallbackSaga( getDatasource, datasourceId, ); - const datasource: Datasource = klona(datasourceFromState); + const datasource: Datasource = klonaLiteWithTelemetry( + datasourceFromState, + "DatasourcesSagas.filePickerActionCallbackSaga", + ); + const plugin: Plugin = yield select(getPlugin, datasource?.pluginId); const applicationId: string = yield select(getCurrentApplicationId); const pageId: string = yield select(getCurrentPageId); diff --git a/app/client/src/sagas/FormEvaluationSaga.ts b/app/client/src/sagas/FormEvaluationSaga.ts index 599a070bc4b..888031e5f33 100644 --- a/app/client/src/sagas/FormEvaluationSaga.ts +++ b/app/client/src/sagas/FormEvaluationSaga.ts @@ -21,7 +21,6 @@ import { getDataTreeActionConfigPath } from "entities/Action/actionProperties"; import { getDataTree } from "selectors/dataTreeSelectors"; import { getDynamicBindings, isDynamicValue } from "utils/DynamicBindingUtils"; import get from "lodash/get"; -import { klona } from "klona/lite"; import type { DataTree } from "entities/DataTree/dataTreeTypes"; import { extractFetchDynamicValueFormConfigs, @@ -31,6 +30,7 @@ import type { DatasourceConfiguration } from "entities/Datasource"; import { buffers } from "redux-saga"; import type { Plugin } from "api/PluginApi"; import { doesPluginRequireDatasource } from "ee/entities/Engine/actionHelpers"; +import { klonaLiteWithTelemetry } from "utils/helpers"; export interface FormEvalActionPayload { formId: string; @@ -68,10 +68,14 @@ function* setFormEvaluationSagaAsync( const fetchDynamicValueFormConfigs = extractFetchDynamicValueFormConfigs( workerResponse[action?.payload?.formId], ); + yield put({ type: ReduxActionTypes.INIT_TRIGGER_VALUES, payload: { - [action?.payload?.formId]: klona(fetchDynamicValueFormConfigs), + [action?.payload?.formId]: klonaLiteWithTelemetry( + fetchDynamicValueFormConfigs, + "FormEvaluationSaga.setFormEvaluationSagaAsync", + ), }, }); } diff --git a/app/client/src/sagas/helper.ts b/app/client/src/sagas/helper.ts index 0bd53b77e51..5a47b63e95c 100644 --- a/app/client/src/sagas/helper.ts +++ b/app/client/src/sagas/helper.ts @@ -20,8 +20,8 @@ import set from "lodash/set"; import log from "loglevel"; import { isPlainObject, isString } from "lodash"; import { DATA_BIND_REGEX_GLOBAL } from "constants/BindingsConstants"; -import { klona } from "klona/lite"; import { apiFailureResponseInterceptor } from "ee/api/ApiUtils"; +import { klonaLiteWithTelemetry } from "utils/helpers"; // function to extract all objects that have dynamic values export const extractFetchDynamicValueFormConfigs = ( @@ -141,7 +141,11 @@ export const enhanceRequestPayloadWithEventData = ( try { switch (type) { case ReduxActionTypes.COPY_ACTION_INIT: - const actionObject = klona(payload) as Action; + const actionObject = klonaLiteWithTelemetry( + payload, + "helpers.enhanceRequestPayloadWithEventData", + ) as Action; + const path = `${RequestPayloadAnalyticsPath}.originalActionId`; const originalActionId = get(actionObject, path, actionObject.id); if (originalActionId !== undefined) diff --git a/app/client/src/utils/helpers.tsx b/app/client/src/utils/helpers.tsx index c4de91a35bf..d713294a310 100644 --- a/app/client/src/utils/helpers.tsx +++ b/app/client/src/utils/helpers.tsx @@ -38,7 +38,12 @@ import { getContainerIdForCanvas } from "sagas/WidgetOperationUtils"; import scrollIntoView from "scroll-into-view-if-needed"; import validateColor from "validate-color"; import { CANVAS_VIEWPORT } from "constants/componentClassNameConstants"; -import { klona as clone } from "klona/full"; +import { klona as klonaFull } from "klona/full"; +import { klona as klonaRegular } from "klona"; +import { klona as klonaLite } from "klona/lite"; +import { klona as klonaJson } from "klona/json"; + +import { startAndEndSpanForFn } from "UITelemetry/generateTraces"; export const snapToGrid = ( columnWidth: number, @@ -818,6 +823,34 @@ export function isValidColor(color: string) { return color?.includes("url") || validateColor(color) || isEmptyOrNill(color); } +function klonaWithTelemetryWrapper( + value: T, + codeSegment: string, + variant: string, + klonaFn: (input: T) => T, +): T { + return startAndEndSpanForFn( + "klona", + { + codeSegment, + variant, + }, + () => klonaFn(value), + ); +} +export function klonaFullWithTelemetry(value: T, codeSegment: string): T { + return klonaWithTelemetryWrapper(value, codeSegment, "full", klonaFull); +} +export function klonaRegularWithTelemetry(value: T, codeSegment: string): T { + return klonaWithTelemetryWrapper(value, codeSegment, "regular", klonaRegular); +} +export function klonaLiteWithTelemetry(value: T, codeSegment: string): T { + return klonaWithTelemetryWrapper(value, codeSegment, "lite", klonaLite); +} +export function klonaJsonWithTelemetry(value: T, codeSegment: string): T { + return klonaWithTelemetryWrapper(value, codeSegment, "json", klonaJson); +} + /* * Function to merge property pane config of a widget * @@ -828,7 +861,10 @@ export const mergeWidgetConfig = (target: any, source: any) => { // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any const sectionMap: Record = {}; - const mergedConfig = clone(target); + const mergedConfig = klonaFullWithTelemetry( + target, + "helpers.mergeWidgetConfig", + ); mergedConfig.forEach((section: { sectionName: string }) => { sectionMap[section.sectionName] = section; diff --git a/app/client/src/widgets/ButtonGroupWidget/widget/index.tsx b/app/client/src/widgets/ButtonGroupWidget/widget/index.tsx index 1fe78155344..55c27df4cf6 100644 --- a/app/client/src/widgets/ButtonGroupWidget/widget/index.tsx +++ b/app/client/src/widgets/ButtonGroupWidget/widget/index.tsx @@ -18,12 +18,12 @@ import type { AutocompletionDefinitions, } from "WidgetProvider/constants"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; -import { klona as clone } from "klona/full"; import { ResponsiveBehavior } from "layoutSystems/common/utils/constants"; import { BlueprintOperationTypes } from "WidgetProvider/constants"; import IconSVG from "../icon.svg"; import ThumbnailSVG from "../thumbnail.svg"; import { WIDGET_TAGS, layoutConfigurations } from "constants/WidgetConstants"; +import { klonaFullWithTelemetry } from "utils/helpers"; class ButtonGroupWidget extends BaseWidget< ButtonGroupWidgetProps, @@ -133,7 +133,11 @@ class ButtonGroupWidget extends BaseWidget< { type: BlueprintOperationTypes.MODIFY_PROPS, fn: (widget: WidgetProps & { children?: WidgetProps[] }) => { - const groupButtons = clone(widget.groupButtons); + const groupButtons = klonaFullWithTelemetry( + widget.groupButtons, + "ButtonGroupWidget.groupButtons", + ); + // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any const dynamicBindingPathList: any[] = get( diff --git a/app/client/src/widgets/FilePickerWidgetV2/widget/index.tsx b/app/client/src/widgets/FilePickerWidgetV2/widget/index.tsx index 9b8d7aa5977..975372cd250 100644 --- a/app/client/src/widgets/FilePickerWidgetV2/widget/index.tsx +++ b/app/client/src/widgets/FilePickerWidgetV2/widget/index.tsx @@ -6,7 +6,6 @@ import { FILE_SIZE_LIMIT_FOR_BLOBS } from "constants/WidgetConstants"; import { ValidationTypes } from "constants/WidgetValidation"; import type { SetterConfig, Stylesheet } from "entities/AppTheming"; import { EvaluationSubstitutionType } from "entities/DataTree/dataTreeFactory"; -import { klona } from "klona"; import _, { findIndex } from "lodash"; import log from "loglevel"; @@ -31,6 +30,7 @@ import { ResponsiveBehavior } from "layoutSystems/common/utils/constants"; import IconSVG from "../icon.svg"; import ThumbnailSVG from "../thumbnail.svg"; import { WIDGET_TAGS } from "constants/WidgetConstants"; +import { klonaRegularWithTelemetry } from "utils/helpers"; const CSV_ARRAY_LABEL = "Array of Objects (CSV, XLS(X), JSON, TSV)"; @@ -614,8 +614,12 @@ class FilePickerWidget extends BaseWidget< uppy.on("files-added", (files: UppyFile[]) => { // Deep cloning the selectedFiles + const selectedFiles = this.props.selectedFiles - ? klona(this.props.selectedFiles) + ? (klonaRegularWithTelemetry( + this.props.selectedFiles, + "initializeUppyEventListeners.selectedFiles", + ) as Array) : []; const fileCount = this.props.selectedFiles?.length || 0; diff --git a/app/client/src/widgets/JSONFormWidget/component/Field.tsx b/app/client/src/widgets/JSONFormWidget/component/Field.tsx index 6718ab45e3c..bd01ccef20c 100644 --- a/app/client/src/widgets/JSONFormWidget/component/Field.tsx +++ b/app/client/src/widgets/JSONFormWidget/component/Field.tsx @@ -3,12 +3,12 @@ import React, { useEffect, useRef } from "react"; import styled from "styled-components"; import type { ControllerProps } from "react-hook-form"; import { useFormContext } from "react-hook-form"; -import { klona } from "klona"; import type { FieldLabelProps } from "./FieldLabel"; import FieldLabel from "./FieldLabel"; import useUpdateAccessor from "../fields/useObserveAccessor"; import { FIELD_MARGIN_BOTTOM } from "./styleConstants"; +import { klonaRegularWithTelemetry } from "utils/helpers"; type FieldProps = React.PropsWithChildren< { @@ -61,7 +61,7 @@ function Field({ // Follow the comment in Form component above reset(convertedFormData); setTimeout(() => { - setValue(name, klona(defaultValue)); + setValue(name, klonaRegularWithTelemetry(defaultValue, "Field")); }, 0); } }, [defaultValue, setValue]); diff --git a/app/client/src/widgets/JSONFormWidget/component/Form.tsx b/app/client/src/widgets/JSONFormWidget/component/Form.tsx index a3cb9b9be40..39922b05958 100644 --- a/app/client/src/widgets/JSONFormWidget/component/Form.tsx +++ b/app/client/src/widgets/JSONFormWidget/component/Form.tsx @@ -5,7 +5,6 @@ import styled from "styled-components"; import { debounce, isEmpty } from "lodash"; import { FormProvider, useForm } from "react-hook-form"; import { Text } from "@blueprintjs/core"; -import { klona } from "klona"; import useFixedFooter from "./useFixedFooter"; import type { ButtonStyleProps } from "widgets/ButtonWidget/component"; @@ -15,6 +14,7 @@ import { FORM_PADDING_Y, FORM_PADDING_X } from "./styleConstants"; import type { Schema } from "../constants"; import { ROOT_SCHEMA_KEY } from "../constants"; import { convertSchemaItemToFormData, schemaItemDefaultValue } from "../helper"; +import { klonaRegularWithTelemetry } from "utils/helpers"; // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -243,7 +243,11 @@ function Form( const subscription = watch((values) => { if (!equal(valuesRef.current, values)) { - const clonedValue = klona(values); + const clonedValue = klonaRegularWithTelemetry( + values, + "Form.subscription", + ); + valuesRef.current = clonedValue; debouncedUpdateFormData(clonedValue as TValues); } diff --git a/app/client/src/widgets/JSONFormWidget/fields/ArrayField.tsx b/app/client/src/widgets/JSONFormWidget/fields/ArrayField.tsx index 2d9cc17508d..6e008805b79 100644 --- a/app/client/src/widgets/JSONFormWidget/fields/ArrayField.tsx +++ b/app/client/src/widgets/JSONFormWidget/fields/ArrayField.tsx @@ -10,7 +10,6 @@ import type { ControllerRenderProps } from "react-hook-form"; import { useFormContext } from "react-hook-form"; import { get, set } from "lodash"; import { Icon } from "@blueprintjs/core"; -import { klona } from "klona"; import log from "loglevel"; import Accordion from "../component/Accordion"; @@ -32,6 +31,7 @@ import { Colors } from "constants/Colors"; import { FIELD_MARGIN_BOTTOM } from "../component/styleConstants"; import { generateReactKey } from "utils/generators"; import { schemaItemDefaultValue } from "../helper"; +import { klonaRegularWithTelemetry } from "utils/helpers"; type ArrayComponentProps = FieldComponentBaseProps & { backgroundColor?: string; @@ -192,7 +192,8 @@ function ArrayField({ const { setMetaInternalFieldState } = useContext(FormContext); const add = () => { - let values = klona(getValues(name)); + let values = klonaRegularWithTelemetry(getValues(name), "ArrayField.add"); + if (values && values.length) { values.push({}); } else { @@ -203,7 +204,11 @@ function ArrayField({ const remove = useCallback( (removedKey: string) => { - const values = klona(getValues(name)); + const values = klonaRegularWithTelemetry( + getValues(name), + "ArrayField.remove", + ); + if (values === undefined) { return; } @@ -219,7 +224,10 @@ function ArrayField({ // cachedDefaultValue[index] in the FieldRenderer if (removedIndex < cachedDefaultValue.length) { setCachedDefaultValue((prevDefaultValue) => { - const clonedValue = klona(prevDefaultValue); + const clonedValue = klonaRegularWithTelemetry( + prevDefaultValue, + "ArrayField.remove.setCachedDefaultValue", + ); clonedValue.splice(removedIndex, 1); @@ -229,10 +237,11 @@ function ArrayField({ // Manually remove from the values and re-insert to maintain the position of the // values - const newValues = klona( + const newValues = klonaRegularWithTelemetry( // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any values.filter((_val: any, index: number) => index !== removedIndex), + "ArrayField.remove.newValues", ); removedKeys.current = [removedKey]; @@ -270,8 +279,19 @@ function ArrayField({ }, [valueLength]); useDeepEffect(() => { - setValue(name, klona(defaultValue)); - setCachedDefaultValue(klona(defaultValue)); + setValue( + name, + klonaRegularWithTelemetry( + defaultValue, + "ArrayField.useDeepEffect.setValue", + ), + ); + setCachedDefaultValue( + klonaRegularWithTelemetry( + defaultValue, + "ArrayField.useDeepEffect.setCachedDefaultValue", + ), + ); }, [defaultValue]); /** @@ -282,7 +302,11 @@ function ArrayField({ */ useDeepEffect(() => { setMetaInternalFieldState((prevState) => { - const metaInternalFieldState = klona(prevState.metaInternalFieldState); + const metaInternalFieldState = klonaRegularWithTelemetry( + prevState.metaInternalFieldState, + "ArrayField.useDeepEffect.setMetaInternalFieldState", + ); + const currMetaInternalFieldState: FieldState<{ isValid: true }> = get( metaInternalFieldState, name, @@ -399,5 +423,4 @@ function ArrayField({ const MemoizedArrayField: FieldComponent = React.memo(ArrayField); MemoizedArrayField.componentDefaultValues = COMPONENT_DEFAULT_VALUES; - export default MemoizedArrayField; diff --git a/app/client/src/widgets/JSONFormWidget/fields/useRegisterFieldValidity.ts b/app/client/src/widgets/JSONFormWidget/fields/useRegisterFieldValidity.ts index 58c2811ebd0..dbfc24dd493 100644 --- a/app/client/src/widgets/JSONFormWidget/fields/useRegisterFieldValidity.ts +++ b/app/client/src/widgets/JSONFormWidget/fields/useRegisterFieldValidity.ts @@ -3,11 +3,11 @@ import { set } from "lodash"; import type { ControllerProps } from "react-hook-form"; import { useFormContext } from "react-hook-form"; import { useContext, useEffect } from "react"; -import { klona } from "klona"; import FormContext from "../FormContext"; import type { FieldType } from "../constants"; import { startAndEndSpanForFn } from "UITelemetry/generateTraces"; +import { klonaRegularWithTelemetry } from "utils/helpers"; export interface UseRegisterFieldValidityProps { isValid: boolean; @@ -57,7 +57,11 @@ function useRegisterFieldValidity({ useEffect(() => { setMetaInternalFieldState((prevState) => { - const metaInternalFieldState = klona(prevState.metaInternalFieldState); + const metaInternalFieldState = klonaRegularWithTelemetry( + prevState.metaInternalFieldState, + "useRegisterFieldValidity.setMetaInternalFieldState", + ); + set(metaInternalFieldState, `${fieldName}.isValid`, isValid); return { diff --git a/app/client/src/widgets/JSONFormWidget/fields/useUpdateInternalMetaState.ts b/app/client/src/widgets/JSONFormWidget/fields/useUpdateInternalMetaState.ts index 3f7b2ded78d..1e354b40e59 100644 --- a/app/client/src/widgets/JSONFormWidget/fields/useUpdateInternalMetaState.ts +++ b/app/client/src/widgets/JSONFormWidget/fields/useUpdateInternalMetaState.ts @@ -1,9 +1,9 @@ import { debounce, set } from "lodash"; import { useMemo, useContext, useCallback } from "react"; -import { klona } from "klona"; import type { DebouncedExecuteActionPayload } from "widgets/MetaHOC"; import FormContext from "../FormContext"; +import { klonaRegularWithTelemetry } from "utils/helpers"; export interface UseUpdateInternalMetaStateProps { propertyName?: string; @@ -23,9 +23,11 @@ function useUpdateInternalMetaState({ ) => { if (propertyName) { setMetaInternalFieldState((prevState) => { - const metaInternalFieldState = klona( + const metaInternalFieldState = klonaRegularWithTelemetry( prevState.metaInternalFieldState, + "useUpdateInternalMetaState.metaInternalFieldState", ); + set(metaInternalFieldState, propertyName, propertyValue); return { diff --git a/app/client/src/widgets/JSONFormWidget/schemaParser.ts b/app/client/src/widgets/JSONFormWidget/schemaParser.ts index 53bd5d95557..9bb68222faf 100644 --- a/app/client/src/widgets/JSONFormWidget/schemaParser.ts +++ b/app/client/src/widgets/JSONFormWidget/schemaParser.ts @@ -7,7 +7,6 @@ import { sortBy, startCase, } from "lodash"; -import { klona } from "klona"; import { sanitizeKey } from "widgets/WidgetUtils"; import type { @@ -28,6 +27,7 @@ import { ROOT_SCHEMA_KEY, } from "./constants"; import { getFieldStylesheet } from "./helper"; +import { klonaRegularWithTelemetry } from "utils/helpers"; type Obj = Record; @@ -138,7 +138,11 @@ export const getSourceDataPathFromSchemaItemPath = ( schemaItemPath: string, ) => { const keys = schemaItemPath.split("."); //schema.__root_schema__.children.name -> ["schema", ROOT_SCHEMA_KEY, "children", "name"] - let clonedSchema = klona(schema); + let clonedSchema = klonaRegularWithTelemetry( + schema, + "schemaParser.getSourceDataPathFromSchemaItemPath", + ); + let sourceDataPath = "sourceData"; let schemaItem: SchemaItem; let skipIteration = false; @@ -660,7 +664,10 @@ class SchemaParser { widgetName, ...rest }: Omit): Schema => { - const schema = klona(prevSchema); + const schema = klonaRegularWithTelemetry( + prevSchema, + "schemaParser.convertArrayToSchema", + ); if (!Array.isArray(currSourceData)) { return schema; @@ -729,7 +736,11 @@ class SchemaParser { sourceDataPath, ...rest }: Omit): Schema => { - const schema = klona(prevSchema); + const schema = klonaRegularWithTelemetry( + prevSchema, + "schemaParser.convertObjectToSchema", + ); + const origIdentifierToIdentifierMap = mapOriginalIdentifierToSanitizedIdentifier(schema); @@ -762,7 +773,11 @@ class SchemaParser { modifiedKeys.forEach((modifiedKey) => { const identifier = origIdentifierToIdentifierMap[modifiedKey]; - const prevSchemaItem = klona(schema[identifier]); + const prevSchemaItem = klonaRegularWithTelemetry( + schema[identifier], + "schemaParser.convertObjectToSchema.modifiedKeys", + ); + const currData = currSourceData[modifiedKey]; const prevData = prevSchemaItem.sourceData; const currDataType = dataTypeFor(currData); diff --git a/app/client/src/widgets/JSONFormWidget/schemaTestData.ts b/app/client/src/widgets/JSONFormWidget/schemaTestData.ts index d06e910b4d3..9c745764301 100644 --- a/app/client/src/widgets/JSONFormWidget/schemaTestData.ts +++ b/app/client/src/widgets/JSONFormWidget/schemaTestData.ts @@ -1,4 +1,3 @@ -import { klona } from "klona"; import { isEmpty, startCase } from "lodash"; import { isDynamicValue } from "utils/DynamicBindingUtils"; import type { FieldThemeStylesheet, SchemaItem } from "./constants"; @@ -8,6 +7,7 @@ import { FieldType, ROOT_SCHEMA_KEY, } from "./constants"; +import { klonaRegularWithTelemetry } from "utils/helpers"; export const schemaItemStyles = { accentColor: @@ -42,8 +42,10 @@ export const schemaItemFactory = (item: any): SchemaItem => { export const replaceBindingWithValue = (schemaItem: SchemaItem) => { if (isEmpty(schemaItem)) return {} as SchemaItem; - - const updatedSchemaItem = klona(schemaItem); + const updatedSchemaItem = klonaRegularWithTelemetry( + schemaItem, + "schemaTestData.replaceBindingWithValue", + ); Object.keys(updatedSchemaItem).forEach((k) => { const key = k as keyof SchemaItem; diff --git a/app/client/src/widgets/JSONFormWidget/widget/index.tsx b/app/client/src/widgets/JSONFormWidget/widget/index.tsx index 2eadbfe4122..4310c6cf9e6 100644 --- a/app/client/src/widgets/JSONFormWidget/widget/index.tsx +++ b/app/client/src/widgets/JSONFormWidget/widget/index.tsx @@ -1,7 +1,6 @@ import React from "react"; import equal from "fast-deep-equal/es6"; import { debounce, difference, isEmpty, merge, noop } from "lodash"; -import { klona } from "klona"; import type { WidgetProps, WidgetState } from "widgets/BaseWidget"; import BaseWidget from "widgets/BaseWidget"; @@ -69,6 +68,7 @@ import { } from "../constants/messages"; import { createMessage } from "ee/constants/messages"; import { endSpan, startRootSpan } from "UITelemetry/generateTraces"; +import { klonaRegularWithTelemetry } from "utils/helpers"; const SUBMIT_BUTTON_DEFAULT_STYLES = { buttonVariant: ButtonVariantTypes.PRIMARY, @@ -660,7 +660,10 @@ class JSONFormWidget extends BaseWidget< ) => { const span = startRootSpan("JSONFormWidget.parseAndSaveFieldState"); const fieldState = generateFieldState(schema, metaInternalFieldState); - const action = klona(afterUpdateAction); + const action = klonaRegularWithTelemetry( + afterUpdateAction, + "JSONFormWidget.parseAndSaveFieldState", + ); const actionPayload = action && this.applyGlobalContextToAction(action, { fieldState }); @@ -723,7 +726,11 @@ class JSONFormWidget extends BaseWidget< actionPayload: ExecuteTriggerPayload, context: Record = {}, ) => { - const payload = klona(actionPayload); + const payload = klonaRegularWithTelemetry( + actionPayload, + "JSONFormWidget.applyGlobalContextToAction", + ); + const { globalContext } = payload; /** diff --git a/app/client/src/widgets/JSONFormWidget/widget/propertyConfig/helper.ts b/app/client/src/widgets/JSONFormWidget/widget/propertyConfig/helper.ts index 5305f543719..4d4383ec16d 100644 --- a/app/client/src/widgets/JSONFormWidget/widget/propertyConfig/helper.ts +++ b/app/client/src/widgets/JSONFormWidget/widget/propertyConfig/helper.ts @@ -1,4 +1,3 @@ -import { klona } from "klona"; import { get, set } from "lodash"; import SchemaParser from "widgets/JSONFormWidget/schemaParser"; @@ -18,6 +17,7 @@ import type { Stylesheet, } from "entities/AppTheming"; import { processSchemaItemAutocomplete } from "components/propertyControls/JSONFormComputeControl"; +import { klonaRegularWithTelemetry } from "utils/helpers"; export type HiddenFnParams = [JSONFormWidgetProps, string]; @@ -54,7 +54,10 @@ export const fieldTypeUpdateHook = ( * the new added paths gets into the dynamicBindingPathList until * the updateProperty function is fixed. */ - const updatedSchema = { schema: klona(schema) }; + + const updatedSchema = { + schema: klonaRegularWithTelemetry(schema, "helper.fieldTypeUpdateHook"), + }; set(updatedSchema, schemaItemPath, schemaItemWithAutoFillState); return [{ propertyPath: "schema", propertyValue: updatedSchema.schema }]; diff --git a/app/client/src/widgets/ListWidget/widget/index.tsx b/app/client/src/widgets/ListWidget/widget/index.tsx index 5a66e4ea24e..54218e7c338 100644 --- a/app/client/src/widgets/ListWidget/widget/index.tsx +++ b/app/client/src/widgets/ListWidget/widget/index.tsx @@ -24,7 +24,6 @@ import { ValidationTypes } from "constants/WidgetValidation"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import type { SetterConfig, Stylesheet } from "entities/AppTheming"; import equal from "fast-deep-equal/es6"; -import { klona } from "klona/lite"; import { renderAppsmithCanvas } from "layoutSystems/CanvasFactory"; import { Positioning, @@ -56,7 +55,7 @@ import { } from "utils/DynamicBindingUtils"; import type { ExtraDef } from "utils/autocomplete/defCreatorUtils"; import { generateTypeDef } from "utils/autocomplete/defCreatorUtils"; -import { removeFalsyEntries } from "utils/helpers"; +import { klonaLiteWithTelemetry, removeFalsyEntries } from "utils/helpers"; import type { WidgetProps, WidgetState } from "widgets/BaseWidget"; import BaseWidget from "widgets/BaseWidget"; import { DefaultAutocompleteDefinitions } from "widgets/WidgetUtils"; @@ -1298,7 +1297,12 @@ class ListWidget extends BaseWidget, WidgetState> { this.props.listData ) { const { page } = this.state; - const children = removeFalsyEntries(klona(this.props.childWidgets)); + const children = removeFalsyEntries( + klonaLiteWithTelemetry( + this.props.childWidgets, + "ListWidget.renderChildren", + ), + ); const childCanvas = children[0]; const { perPage } = this.shouldPaginate(); @@ -1352,7 +1356,10 @@ class ListWidget extends BaseWidget, WidgetState> { const canvasChildrenList = []; if (listData.length > 0) { for (let i = 0; i < listData.length; i++) { - canvasChildrenList[i] = klona(template); + canvasChildrenList[i] = klonaLiteWithTelemetry( + template, + "ListWidget.renderChildren", + ); } canvasChildren = this.updateGridChildrenProps(canvasChildrenList); } else { diff --git a/app/client/src/widgets/ListWidgetV2/MetaWidgetGenerator.ts b/app/client/src/widgets/ListWidgetV2/MetaWidgetGenerator.ts index 90a96116589..bdba16255dc 100644 --- a/app/client/src/widgets/ListWidgetV2/MetaWidgetGenerator.ts +++ b/app/client/src/widgets/ListWidgetV2/MetaWidgetGenerator.ts @@ -1,5 +1,4 @@ import hash from "object-hash"; -import { klona } from "klona"; import { difference, omit, set, get, isEmpty, isString, isNil } from "lodash"; import type { VirtualizerOptions } from "@tanstack/virtual-core"; import { @@ -35,6 +34,7 @@ import { getDynamicBindings, } from "utils/DynamicBindingUtils"; import WidgetFactory from "WidgetProvider/factory"; +import { klonaRegularWithTelemetry } from "utils/helpers"; type TemplateWidgets = ListWidgetProps["flattenedChildCanvasWidgets"]; @@ -334,7 +334,11 @@ class MetaWidgetGenerator { } // Maybe don't deep-clone for perf? - const prevOptions = klona(this.prevOptions); + const prevOptions = klonaRegularWithTelemetry( + this.prevOptions, + "MetaWidgetGenerator.withOptions", + ); + this.prevOptions = options; this._didUpdate(options, prevOptions); @@ -541,8 +545,11 @@ class MetaWidgetGenerator { return { metaWidgetId: undefined, metaWidgetName: undefined }; const key = options ? options.key : this.getPrimaryKey(rowIndex); + const metaWidget = klonaRegularWithTelemetry( + templateWidget, + "MetaWidgetGenerator.generateMetaWidgetRecursively", + ) as MetaWidget; - const metaWidget = klona(templateWidget) as MetaWidget; const metaCacheProps = this.getRowTemplateCache( key, templateWidgetId, @@ -1494,9 +1501,17 @@ class MetaWidgetGenerator { ) => { const { metaWidget, originalMetaWidgetId, templateWidgetId } = options; const viewIndex = this.getViewIndex(rowIndex); - const referenceCache = klona(this.getWidgetReferenceCache()); + const referenceCache = klonaRegularWithTelemetry( + this.getWidgetReferenceCache(), + "MetaWidgetGenerator.updateSiblings.getWidgetReferenceCache", + ); + const currentCache = referenceCache?.[templateWidgetId]; - const siblings = klona(currentCache?.siblings || new Set()); + const siblings = klonaRegularWithTelemetry( + currentCache?.siblings || new Set(), + "MetaWidgetGenerator.updateSiblings.siblings", + ); + const isCandidateListWidget = this.nestedViewIndex === 0 || !this.nestedViewIndex; const isCandidateWidget = isCandidateListWidget && viewIndex === 0; diff --git a/app/client/src/widgets/ListWidgetV2/widget/index.tsx b/app/client/src/widgets/ListWidgetV2/widget/index.tsx index e203207ae89..fea41b41113 100644 --- a/app/client/src/widgets/ListWidgetV2/widget/index.tsx +++ b/app/client/src/widgets/ListWidgetV2/widget/index.tsx @@ -4,7 +4,6 @@ import memoize from "micro-memoize"; import type { RefObject } from "react"; import React, { createRef } from "react"; import { floor, isEmpty, isNil, isString } from "lodash"; -import { klona } from "klona"; import hash from "object-hash"; import type { WidgetOperation, WidgetProps } from "widgets/BaseWidget"; import BaseWidget from "widgets/BaseWidget"; @@ -54,6 +53,7 @@ import defaultProps from "./defaultProps"; import IconSVG from "../icon.svg"; import ThumbnailSVG from "../thumbnail.svg"; import { renderAppsmithCanvas } from "layoutSystems/CanvasFactory"; +import { klonaRegularWithTelemetry } from "utils/helpers"; const getCurrentItemsViewBindingTemplate = () => ({ prefix: "{{[", @@ -643,7 +643,11 @@ class ListWidget extends BaseWidget< } if (!isEqual(this.prevMetaMainCanvasWidget, mainCanvasWidget)) { - this.prevMetaMainCanvasWidget = klona(mainCanvasWidget); + this.prevMetaMainCanvasWidget = klonaRegularWithTelemetry( + mainCanvasWidget, + "ListWidgetV2.generateMainMetaCanvasWidget", + ); + return mainCanvasWidget; } }; @@ -887,7 +891,12 @@ class ListWidget extends BaseWidget< const { flattenedChildCanvasWidgets = {}, mainCanvasId = "" } = this.props; const mainCanvasWidget = flattenedChildCanvasWidgets[mainCanvasId] || {}; const { componentHeight, componentWidth } = this.props; - const metaMainCanvas = klona(mainCanvasWidget) ?? {}; + + const metaMainCanvas = + klonaRegularWithTelemetry( + mainCanvasWidget, + "ListWidget.mainMetaCanvasWidget", + ) ?? {}; const { metaWidgetId, metaWidgetName } = this.metaWidgetGenerator.getContainerParentCache() || {}; diff --git a/app/client/src/widgets/TableWidgetV2/widget/index.tsx b/app/client/src/widgets/TableWidgetV2/widget/index.tsx index 09f45d48be8..7dfcf3be81b 100644 --- a/app/client/src/widgets/TableWidgetV2/widget/index.tsx +++ b/app/client/src/widgets/TableWidgetV2/widget/index.tsx @@ -101,7 +101,6 @@ import { ImageCell } from "../component/cellComponents/ImageCell"; import { VideoCell } from "../component/cellComponents/VideoCell"; import { IconButtonCell } from "../component/cellComponents/IconButtonCell"; import { EditActionCell } from "../component/cellComponents/EditActionsCell"; -import { klona as clone } from "klona"; import { CheckboxCell } from "../component/cellComponents/CheckboxCell"; import { SwitchCell } from "../component/cellComponents/SwitchCell"; import { SelectCell } from "../component/cellComponents/SelectCell"; @@ -140,6 +139,7 @@ import { import IconSVG from "../icon.svg"; import ThumbnailSVG from "../thumbnail.svg"; import { FEATURE_FLAG } from "ee/entities/FeatureFlag"; +import { klonaRegularWithTelemetry } from "utils/helpers"; const ReactTableComponent = lazy(async () => retryPromise(async () => import("../component")), @@ -1834,7 +1834,10 @@ class TableWidgetV2 extends BaseWidget { }; removeRowFromTransientTableData = (index: number) => { - const newTransientTableData = clone(this.props.transientTableData); + const newTransientTableData = klonaRegularWithTelemetry( + this.props.transientTableData, + "TableWidgetV2.removeRowFromTransientTableData", + ); const { commitBatchMetaUpdates, pushBatchMetaUpdates } = this.props; if (newTransientTableData) { diff --git a/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.tsx b/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.tsx index 982c7a63b97..bc3d59e37f1 100644 --- a/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.tsx +++ b/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.tsx @@ -11,7 +11,11 @@ import { formatCurrencyNumber, limitDecimalValue, } from "../component/utilities"; -import { getLocale, mergeWidgetConfig } from "utils/helpers"; +import { + getLocale, + klonaRegularWithTelemetry, + mergeWidgetConfig, +} from "utils/helpers"; import { getLocaleDecimalSeperator, getLocaleThousandSeparator, @@ -26,7 +30,6 @@ import type { CurrencyInputWidgetProps } from "./types"; import { WDSBaseInputWidget } from "widgets/wds/WDSBaseInputWidget"; import { getCountryCodeFromCurrencyCode, validateInput } from "./helpers"; import type { KeyDownEvent } from "widgets/wds/WDSBaseInputWidget/component/types"; -import { klona as clone } from "klona"; class WDSCurrencyInputWidget extends WDSBaseInputWidget< CurrencyInputWidgetProps, @@ -63,7 +66,10 @@ class WDSCurrencyInputWidget extends WDSBaseInputWidget< } static getPropertyPaneContentConfig() { - const parentConfig = clone(super.getPropertyPaneContentConfig()); + const parentConfig = klonaRegularWithTelemetry( + super.getPropertyPaneContentConfig(), + "WDSCurrencyInputWidget.getPropertyPaneContentConfig", + ); const labelSectionIndex = parentConfig.findIndex( (section) => section.sectionName === "Label", ); diff --git a/app/client/src/widgets/wds/WDSHeadingWidget/widget/index.tsx b/app/client/src/widgets/wds/WDSHeadingWidget/widget/index.tsx index 12563bccbab..c044eedc467 100644 --- a/app/client/src/widgets/wds/WDSHeadingWidget/widget/index.tsx +++ b/app/client/src/widgets/wds/WDSHeadingWidget/widget/index.tsx @@ -1,8 +1,8 @@ -import { klona as clone } from "klona"; import { WIDGET_TAGS } from "constants/WidgetConstants"; import { ValidationTypes } from "constants/WidgetValidation"; import { WDSParagraphWidget } from "widgets/wds/WDSParagraphWidget"; import { HeadingIcon, HeadingThumbnail } from "appsmith-icons"; +import { klonaRegularWithTelemetry } from "utils/helpers"; class WDSHeadingWidget extends WDSParagraphWidget { static type = "WDS_HEADING_WIDGET"; @@ -33,7 +33,10 @@ class WDSHeadingWidget extends WDSParagraphWidget { } static getPropertyPaneContentConfig() { - const parentConfig = clone(super.getPropertyPaneContentConfig()); + const parentConfig = klonaRegularWithTelemetry( + super.getPropertyPaneContentConfig(), + "WDSHeadingWidget.getPropertyPaneContentConfig", + ); const generelSectionIndex = parentConfig.findIndex( (section) => section.sectionName === "General", diff --git a/app/client/src/widgets/wds/WDSPhoneInputWidget/widget/index.tsx b/app/client/src/widgets/wds/WDSPhoneInputWidget/widget/index.tsx index 86c5c769f61..e6c8ad4b4ac 100644 --- a/app/client/src/widgets/wds/WDSPhoneInputWidget/widget/index.tsx +++ b/app/client/src/widgets/wds/WDSPhoneInputWidget/widget/index.tsx @@ -1,9 +1,8 @@ import React from "react"; import log from "loglevel"; import merge from "lodash/merge"; -import { klona as clone } from "klona"; import * as Sentry from "@sentry/react"; -import { mergeWidgetConfig } from "utils/helpers"; +import { klonaRegularWithTelemetry, mergeWidgetConfig } from "utils/helpers"; import type { CountryCode } from "libphonenumber-js"; import type { WidgetState } from "widgets/BaseWidget"; import type { DerivedPropertiesMap } from "WidgetProvider/factory"; @@ -50,7 +49,10 @@ class WDSPhoneInputWidget extends WDSBaseInputWidget< } static getPropertyPaneContentConfig() { - const parentConfig = clone(super.getPropertyPaneContentConfig()); + const parentConfig = klonaRegularWithTelemetry( + super.getPropertyPaneContentConfig(), + "WDSPhoneInputWidget.getPropertyPaneContentConfig", + ); const labelSectionIndex = parentConfig.findIndex( (section) => section.sectionName === "Label", diff --git a/app/client/src/widgets/wds/WDSTableWidget/widget/index.tsx b/app/client/src/widgets/wds/WDSTableWidget/widget/index.tsx index d55918fcf27..7d9d87c48da 100644 --- a/app/client/src/widgets/wds/WDSTableWidget/widget/index.tsx +++ b/app/client/src/widgets/wds/WDSTableWidget/widget/index.tsx @@ -68,7 +68,6 @@ import { ButtonCell, } from "../component/cellComponents"; -import { klona as clone } from "klona"; import localStorage from "utils/localStorage"; import type { Stylesheet } from "entities/AppTheming"; import type { getColumns } from "./reactTableUtils/getColumnsPureFn"; @@ -82,6 +81,7 @@ import type { FlattenedWidgetProps } from "WidgetProvider/constants"; import * as config from "../config"; import { getAnvilWidgetDOMId } from "layoutSystems/common/utils/LayoutElementPositionsObserver/utils"; import type { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; +import { klonaRegularWithTelemetry } from "utils/helpers"; const ReactTableComponent = lazy(async () => retryPromise(async () => import("../component")), @@ -1511,7 +1511,11 @@ export class WDSTableWidget extends BaseWidget { }; removeRowFromTransientTableData = (index: number) => { - const newTransientTableData = clone(this.props.transientTableData); + const newTransientTableData = klonaRegularWithTelemetry( + this.props.transientTableData, + "WDSTableWidget.removeRowFromTransientTableData", + ); + const { commitBatchMetaUpdates, pushBatchMetaUpdates } = this.props; if (newTransientTableData) {