From 17d5c6cdc84229cae9ce6e80dbe9a08c0ee3b090 Mon Sep 17 00:00:00 2001 From: Hetu Nandu Date: Fri, 25 Sep 2020 12:05:25 +0530 Subject: [PATCH 1/2] Fix issue where unknown functions in data tree cause evaluation issues (#722) Solved by removing functions before setting the evaluatedValues map of a widget --- app/client/src/utils/DynamicBindingUtils.ts | 30 ++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/app/client/src/utils/DynamicBindingUtils.ts b/app/client/src/utils/DynamicBindingUtils.ts index 62f3505da7..417a325e84 100644 --- a/app/client/src/utils/DynamicBindingUtils.ts +++ b/app/client/src/utils/DynamicBindingUtils.ts @@ -240,10 +240,17 @@ export const getValidatedTree = (tree: any) => { ); parsedEntity[property] = parsed; if (!hasEvaluatedValue) { - const evaluatedValue = _.isUndefined(transformed) + const evaluatedValue = isValid + ? parsed + : _.isUndefined(transformed) ? value : transformed; - _.set(parsedEntity, `evaluatedValues.${property}`, evaluatedValue); + const safeEvaluatedValue = removeFunctions(evaluatedValue); + _.set( + parsedEntity, + `evaluatedValues.${property}`, + safeEvaluatedValue, + ); } const hasValidation = _.has(parsedEntity, `invalidProps.${property}`); @@ -621,10 +628,13 @@ function validateAndParseWidgetProperty( widget, currentTree, ); - const evaluatedValue = _.isUndefined(transformed) + const evaluatedValue = isValid + ? parsed + : _.isUndefined(transformed) ? evalPropertyValue : transformed; - _.set(widget, `evaluatedValues.${propertyName}`, evaluatedValue); + const safeEvaluatedValue = removeFunctions(evaluatedValue); + _.set(widget, `evaluatedValues.${propertyName}`, safeEvaluatedValue); if (!isValid) { _.set(widget, `invalidProps.${propertyName}`, true); _.set(widget, `validationMessages.${propertyName}`, message); @@ -757,6 +767,18 @@ const overwriteDefaultDependentProps = ( return propertyValue; }; +// We need to remove functions from data tree to avoid any unexpected identifier while JSON parsing +// Check issue https://github.com/appsmithorg/appsmith/issues/719 +const removeFunctions = (value: any) => { + if (_.isFunction(value)) { + return "Function call"; + } else if (_.isObject(value) && _.some(value, _.isFunction)) { + return JSON.parse(JSON.stringify(value)); + } else { + return value; + } +}; + /* Need to evaluated values