From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 3 Feb 2024 21:22:12 +0000 (-0800) Subject: Fix: frontend validation of number fields fails upon save (#5646) X-Git-Tag: v2.5.0~4^2~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45e2b7f8149d6a6483f9bc09cb5b4130a67bcf60;p=thirdparty%2Fpaperless-ngx.git Fix: frontend validation of number fields fails upon save (#5646) --- diff --git a/src-ui/src/app/components/common/input/number/number.component.spec.ts b/src-ui/src/app/components/common/input/number/number.component.spec.ts index 9024614bb6..df775a5ba1 100644 --- a/src-ui/src/app/components/common/input/number/number.component.spec.ts +++ b/src-ui/src/app/components/common/input/number/number.component.spec.ts @@ -47,22 +47,25 @@ describe('NumberComponent', () => { expect(component.value).toEqual(1002) }) - it('should support float & monetary values', () => { - component.writeValue(11.13) - expect(component.value).toEqual(11) + it('should support float, monetary values & scientific notation', () => { + const mockFn = jest.fn() + component.registerOnChange(mockFn) + + component.step = 1 + component.onChange(11.13) + expect(mockFn).toHaveBeenCalledWith(11) + + component.onChange(1.23456789e8) + expect(mockFn).toHaveBeenCalledWith(123456789) + component.step = 0.01 - component.writeValue(11.1) - expect(component.value).toEqual('11.10') - component.step = 0.1 - component.writeValue(12.3456) - expect(component.value).toEqual(12.3456) - // float (step = .1) doesn't force 2 decimals - component.writeValue(11.1) - expect(component.value).toEqual(11.1) + component.onChange(11.1) + expect(mockFn).toHaveBeenCalledWith('11.10') }) - it('should support scientific notation', () => { - component.writeValue(1.23456789e8) - expect(component.value).toEqual(123456789) + it('should display monetary values fixed to 2 decimals', () => { + component.step = 0.01 + component.writeValue(11.1) + expect(component.value).toEqual('11.10') }) }) diff --git a/src-ui/src/app/components/common/input/number/number.component.ts b/src-ui/src/app/components/common/input/number/number.component.ts index 6675e44981..abfd788afc 100644 --- a/src-ui/src/app/components/common/input/number/number.component.ts +++ b/src-ui/src/app/components/common/input/number/number.component.ts @@ -36,9 +36,18 @@ export class NumberComponent extends AbstractInputComponent { }) } + registerOnChange(fn: any): void { + this.onChange = (newValue: any) => { + // number validation + if (this.step === 1 && newValue?.toString().indexOf('e') === -1) + newValue = parseInt(newValue, 10) + if (this.step === 0.01) newValue = parseFloat(newValue).toFixed(2) + fn(newValue) + } + } + writeValue(newValue: any): void { - if (this.step === 1 && newValue?.toString().indexOf('e') === -1) - newValue = parseInt(newValue, 10) + // Allow monetary values to be displayed with 2 decimals if (this.step === 0.01) newValue = parseFloat(newValue).toFixed(2) super.writeValue(newValue) }