diff --git a/app/client/src/widgets/CurrencyInputWidget/widget/index.test.tsx b/app/client/src/widgets/CurrencyInputWidget/widget/index.test.tsx index 4929104b0e1f..159f8620097f 100644 --- a/app/client/src/widgets/CurrencyInputWidget/widget/index.test.tsx +++ b/app/client/src/widgets/CurrencyInputWidget/widget/index.test.tsx @@ -38,6 +38,32 @@ describe("defaultValueValidation", () => { }); }); + it("should preserve decimal precision for valid string defaults", () => { + result = defaultValueValidation( + "123.00", + { decimals: 2 } as CurrencyInputWidgetProps, + _, + ); + + expect(result).toEqual({ + isValid: true, + parsed: "123.00", + messages: [{ name: "", message: "" }], + }); + + result = defaultValueValidation( + "4.10", + { decimals: 2 } as CurrencyInputWidgetProps, + _, + ); + + expect(result).toEqual({ + isValid: true, + parsed: "4.10", + messages: [{ name: "", message: "" }], + }); + }); + it("should validate defaulttext with object value", () => { const value = {}; diff --git a/app/client/src/widgets/CurrencyInputWidget/widget/index.tsx b/app/client/src/widgets/CurrencyInputWidget/widget/index.tsx index d622578540d6..f5ce0c7c0fce 100644 --- a/app/client/src/widgets/CurrencyInputWidget/widget/index.tsx +++ b/app/client/src/widgets/CurrencyInputWidget/widget/index.tsx @@ -77,6 +77,22 @@ export function defaultValueValidation( const decimalSeperator = getLocaleDecimalSeperator(); const defaultDecimalSeperator = "."; + const getParsedString = (parsedValue: number) => { + if (!_.isString(value)) { + return String(parsedValue); + } + + const trimmedValue = value.trim(); + + if (!trimmedValue.includes(defaultDecimalSeperator)) { + return String(parsedValue); + } + + const [, fractionalPart = ""] = trimmedValue.split(defaultDecimalSeperator); + + return parsedValue.toFixed(fractionalPart.length); + }; + if (_.isObject(value)) { return { isValid: false, @@ -144,7 +160,7 @@ export function defaultValueValidation( messages = [EMPTY_ERROR_MESSAGE]; } - parsed = String(parsed); + parsed = getParsedString(parsed); } return { diff --git a/app/client/src/widgets/wds/WDSCurrencyInputWidget/config/propertyPaneConfig/validations/defaultValueValidation.ts b/app/client/src/widgets/wds/WDSCurrencyInputWidget/config/propertyPaneConfig/validations/defaultValueValidation.ts index 68041c230e9c..9fa3b8d967b9 100644 --- a/app/client/src/widgets/wds/WDSCurrencyInputWidget/config/propertyPaneConfig/validations/defaultValueValidation.ts +++ b/app/client/src/widgets/wds/WDSCurrencyInputWidget/config/propertyPaneConfig/validations/defaultValueValidation.ts @@ -33,6 +33,22 @@ export function defaultValueValidation( const decimalSeperator = getLocaleDecimalSeperator(); const defaultDecimalSeperator = "."; + const getParsedString = (parsedValue: number) => { + if (!_.isString(value)) { + return String(parsedValue); + } + + const trimmedValue = value.trim(); + + if (!trimmedValue.includes(defaultDecimalSeperator)) { + return String(parsedValue); + } + + const [, fractionalPart = ""] = trimmedValue.split(defaultDecimalSeperator); + + return parsedValue.toFixed(fractionalPart.length); + }; + if (_.isObject(value)) { return { isValid: false, @@ -100,7 +116,7 @@ export function defaultValueValidation( messages = [EMPTY_ERROR_MESSAGE]; } - parsed = String(parsed); + parsed = getParsedString(parsed); } return { diff --git a/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.test.tsx b/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.test.tsx index 3110aebc4f24..f8e33f1cb744 100644 --- a/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.test.tsx +++ b/app/client/src/widgets/wds/WDSCurrencyInputWidget/widget/index.test.tsx @@ -38,6 +38,32 @@ describe("defaultValueValidation", () => { }); }); + it("should preserve decimal precision for valid string defaults", () => { + result = defaultValueValidation( + "123.00", + { decimals: 2 } as CurrencyInputWidgetProps, + _, + ); + + expect(result).toEqual({ + isValid: true, + parsed: "123.00", + messages: [{ name: "", message: "" }], + }); + + result = defaultValueValidation( + "4.10", + { decimals: 2 } as CurrencyInputWidgetProps, + _, + ); + + expect(result).toEqual({ + isValid: true, + parsed: "4.10", + messages: [{ name: "", message: "" }], + }); + }); + it("should validate defaulttext with object value", () => { const value = {};