From ae75415b5e689c545a297ba2de4da560baabf334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pekka=20Maanp=C3=A4=C3=A4?= Date: Mon, 7 Oct 2019 16:15:52 +0300 Subject: [PATCH] fix: avoid using initial step in validation setting the min or max property should not trigger step-based validation fix #420 --- src/vaadin-number-field.html | 8 ++++++- test/number-field.html | 43 ++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/vaadin-number-field.html b/src/vaadin-number-field.html index 15c73d7d..eba61c09 100644 --- a/src/vaadin-number-field.html +++ b/src/vaadin-number-field.html @@ -303,7 +303,13 @@ } _stepChanged(step) { - this.inputElement.step = step; + if (!this.__stepChangedCalled) { + // Setting the initial value, avoid using it in validation. + this.inputElement.step = 'any'; + this.__stepChangedCalled = true; + } else { + this.inputElement.step = step; + } } _minChanged(min) { diff --git a/test/number-field.html b/test/number-field.html index 90a4262e..c2d7819f 100644 --- a/test/number-field.html +++ b/test/number-field.html @@ -749,6 +749,49 @@ expect(numberField.validate(), 'value should not be greater than max').to.be.false; }); + it('should validate by step when defined by user', () => { + numberField.step = 1.5; + + numberField.value = '0'; + expect(numberField.validate()).to.be.true; + + numberField.value = '-1.5'; + expect(numberField.validate()).to.be.true; + + numberField.value = '3'; + expect(numberField.validate()).to.be.true; + + numberField.value = '-1'; + expect(numberField.validate()).to.be.false; + + numberField.value = '2'; + expect(numberField.validate()).to.be.false; + }); + + it('should use min as step basis in validation when both are defined', () => { + numberField.min = 1; + numberField.step = 1.5; + + numberField.value = '1'; + expect(numberField.validate()).to.be.true; + + numberField.value = '2.5'; + expect(numberField.validate()).to.be.true; + + numberField.value = '4'; + expect(numberField.validate()).to.be.true; + + numberField.value = '1.5'; + expect(numberField.validate()).to.be.false; + }); + + it('should not validate by step when only min and max are set', () => { + numberField.min = 1; + numberField.max = 5; + numberField.value = 1.5; // would be invalid by default step=1 + expect(numberField.validate()).to.be.true; + }); + describe('removing validation constraints', () => { it('should update "invalid" state when "min" is removed', () => { numberField.value = '42';