Skip to content

Commit 548332e

Browse files
committed
feat: date time picker validation improvements
1 parent 4f97ba1 commit 548332e

File tree

8 files changed

+410
-75
lines changed

8 files changed

+410
-75
lines changed

vaadin-date-picker-flow-parent/vaadin-date-picker-flow/src/main/java/com/vaadin/flow/component/datepicker/DatePicker.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ protected boolean isInputValuePresent() {
687687
*/
688688
@Synchronize(property = "_inputElementValue", value = { "change",
689689
"unparsable-change" })
690-
private String getInputElementValue() {
690+
protected String getInputElementValue() {
691691
return getElement().getProperty("_inputElementValue", "");
692692
}
693693

vaadin-date-time-picker-flow-parent/vaadin-date-time-picker-flow-integration-tests/src/main/java/com/vaadin/flow/component/datetimepicker/validation/BasicValidationPage.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,17 @@ public class BasicValidationPage
3030
public static final String CLEAR_VALUE_BUTTON = "clear-value-button";
3131

3232
public static final String REQUIRED_ERROR_MESSAGE = "Field is required";
33-
public static final String BAD_INPUT_ERROR_MESSAGE = "Value has incorrect format";
34-
public static final String MIN_ERROR_MESSAGE = "Value is too small";
35-
public static final String MAX_ERROR_MESSAGE = "Value is too big";
33+
public static final String BAD_INPUT_ERROR_MESSAGE = "Invalid date format";
34+
public static final String INCOMPLETE_INPUT_ERROR_MESSAGE = "Must fill in both date and time";
35+
public static final String MIN_ERROR_MESSAGE = "Date is too early";
36+
public static final String MAX_ERROR_MESSAGE = "Date is too late";
3637

3738
public BasicValidationPage() {
3839
super();
3940

4041
testField.setI18n(new DateTimePicker.DateTimePickerI18n()
4142
.setRequiredErrorMessage(REQUIRED_ERROR_MESSAGE)
43+
.setIncompleteInputErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE)
4244
.setBadInputErrorMessage(BAD_INPUT_ERROR_MESSAGE)
4345
.setMinErrorMessage(MIN_ERROR_MESSAGE)
4446
.setMaxErrorMessage(MAX_ERROR_MESSAGE));
@@ -63,6 +65,12 @@ public BasicValidationPage() {
6365
}
6466

6567
protected DateTimePicker createTestField() {
66-
return new DateTimePicker();
68+
return new DateTimePicker() {
69+
@Override
70+
protected void validate() {
71+
super.validate();
72+
incrementServerValidationCounter();
73+
}
74+
};
6775
}
6876
}

vaadin-date-time-picker-flow-parent/vaadin-date-time-picker-flow-integration-tests/src/main/java/com/vaadin/flow/component/datetimepicker/validation/BinderValidationPage.java

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class BinderValidationPage
3232

3333
public static final String REQUIRED_ERROR_MESSAGE = "Field is required";
3434
public static final String BAD_INPUT_ERROR_MESSAGE = "Value has incorrect format";
35+
public static final String INCOMPLETE_INPUT_ERROR_MESSAGE = "Value is incomplete";
3536
public static final String MIN_ERROR_MESSAGE = "Value is too small";
3637
public static final String MAX_ERROR_MESSAGE = "Value is too big";
3738
public static final String UNEXPECTED_VALUE_ERROR_MESSAGE = "Value does not match the expected value";
@@ -63,6 +64,7 @@ public BinderValidationPage() {
6364

6465
testField.setI18n(new DateTimePicker.DateTimePickerI18n()
6566
.setBadInputErrorMessage(BAD_INPUT_ERROR_MESSAGE)
67+
.setIncompleteInputErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE)
6668
.setMinErrorMessage(MIN_ERROR_MESSAGE)
6769
.setMaxErrorMessage(MAX_ERROR_MESSAGE));
6870

vaadin-date-time-picker-flow-parent/vaadin-date-time-picker-flow-integration-tests/src/test/java/com/vaadin/flow/component/datetimepicker/validation/BasicValidationIT.java

+119-18
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static com.vaadin.flow.component.datetimepicker.validation.BasicValidationPage.BAD_INPUT_ERROR_MESSAGE;
1919
import static com.vaadin.flow.component.datetimepicker.validation.BasicValidationPage.CLEAR_VALUE_BUTTON;
20+
import static com.vaadin.flow.component.datetimepicker.validation.BasicValidationPage.INCOMPLETE_INPUT_ERROR_MESSAGE;
2021
import static com.vaadin.flow.component.datetimepicker.validation.BasicValidationPage.MAX_ERROR_MESSAGE;
2122
import static com.vaadin.flow.component.datetimepicker.validation.BasicValidationPage.MAX_INPUT;
2223
import static com.vaadin.flow.component.datetimepicker.validation.BasicValidationPage.MIN_ERROR_MESSAGE;
@@ -59,7 +60,7 @@ public void triggerBlur_assertValidity() {
5960
timeInput.sendKeys(Keys.TAB);
6061
assertServerValid();
6162
assertClientValid();
62-
assertErrorMessage("");
63+
assertErrorMessage(null);
6364
}
6465

6566
@Test
@@ -68,9 +69,9 @@ public void required_triggerBlur_assertValidity() {
6869

6970
dateInput.sendKeys(Keys.TAB);
7071
timeInput.sendKeys(Keys.TAB);
71-
assertServerInvalid();
72-
assertClientInvalid();
73-
assertErrorMessage(REQUIRED_ERROR_MESSAGE);
72+
assertServerValid();
73+
assertClientValid();
74+
assertErrorMessage(null);
7475
}
7576

7677
@Test
@@ -83,6 +84,12 @@ public void required_changeValue_assertValidity() {
8384
assertClientValid();
8485
assertErrorMessage("");
8586

87+
setInputValue(dateInput, "1/1/2000");
88+
setInputValue(timeInput, "");
89+
assertServerInvalid();
90+
assertServerInvalid();
91+
assertErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE);
92+
8693
setInputValue(dateInput, "");
8794
assertServerInvalid();
8895
assertClientInvalid();
@@ -93,8 +100,7 @@ public void required_changeValue_assertValidity() {
93100
assertClientInvalid();
94101
assertErrorMessage(REQUIRED_ERROR_MESSAGE);
95102

96-
setInputValue(dateInput, "INVALID");
97-
setInputValue(timeInput, "INVALID");
103+
setFieldIInvalid();
98104
assertServerInvalid();
99105
assertClientInvalid();
100106
assertErrorMessage(BAD_INPUT_ERROR_MESSAGE);
@@ -193,7 +199,7 @@ public void setValue_clearValue_assertValidity() {
193199

194200
@Test
195201
public void badInput_changeValue_assertValidity() {
196-
setInputValue(dateInput, "INVALID");
202+
setFieldIInvalid();
197203
setInputValue(timeInput, "INVALID");
198204
assertServerInvalid();
199205
assertClientInvalid();
@@ -205,7 +211,7 @@ public void badInput_changeValue_assertValidity() {
205211
assertClientValid();
206212
assertErrorMessage("");
207213

208-
setInputValue(dateInput, "INVALID");
214+
setFieldIInvalid();
209215
setInputValue(timeInput, "INVALID");
210216
assertServerInvalid();
211217
assertClientInvalid();
@@ -214,7 +220,7 @@ public void badInput_changeValue_assertValidity() {
214220

215221
@Test
216222
public void badInput_setDateInputValue_blur_assertValidity() {
217-
setInputValue(dateInput, "INVALID");
223+
setFieldIInvalid();
218224
dateInput.sendKeys(Keys.TAB);
219225
timeInput.sendKeys(Keys.TAB);
220226
assertServerInvalid();
@@ -233,7 +239,7 @@ public void badInput_setTimeInputValue_blur_assertValidity() {
233239

234240
@Test
235241
public void badInput_setValue_clearValue_assertValidity() {
236-
setInputValue(dateInput, "INVALID");
242+
setFieldIInvalid();
237243
setInputValue(timeInput, "INVALID");
238244
assertServerInvalid();
239245
assertClientInvalid();
@@ -247,7 +253,7 @@ public void badInput_setValue_clearValue_assertValidity() {
247253

248254
@Test
249255
public void badInput_setDateInputValue_blur_clearValue_assertValidity() {
250-
setInputValue(dateInput, "INVALID");
256+
setFieldIInvalid();
251257
dateInput.sendKeys(Keys.TAB);
252258
timeInput.sendKeys(Keys.TAB);
253259
assertServerInvalid();
@@ -275,12 +281,105 @@ public void badInput_setTimeInputValue_blur_clearValue_assertValidity() {
275281
}
276282

277283
@Test
278-
public void detach_attach_preservesInvalidState() {
279-
// Make field invalid
280-
$("button").id(REQUIRED_BUTTON).click();
284+
public void incompleteInput_assertValidity() {
285+
setInputValue(dateInput, "1/1/2000");
286+
setInputValue(timeInput, "");
287+
assertServerInvalid();
288+
assertClientInvalid();
289+
assertErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE);
290+
}
291+
292+
@Test
293+
public void incompleteInput_changeToValidValue_assertValidity() {
294+
setInputValue(dateInput, "1/1/2000");
295+
setInputValue(timeInput, "");
296+
297+
setInputValue(dateInput, "1/1/2001");
298+
setInputValue(timeInput, "10:00");
299+
assertServerValid();
300+
assertClientValid();
301+
assertErrorMessage("");
302+
}
303+
304+
@Test
305+
public void validInput_changeToIncompleteInput_assertValidity() {
306+
setInputValue(dateInput, "1/1/2001");
307+
setInputValue(timeInput, "10:00");
308+
309+
setInputValue(dateInput, "1/1/2000");
310+
setInputValue(timeInput, "");
311+
assertServerInvalid();
312+
assertClientInvalid();
313+
assertErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE);
314+
}
315+
316+
@Test
317+
public void incompleteInput_setDateInputValue_blur_assertValidity() {
318+
setInputValue(dateInput, "1/1/2000");
319+
setInputValue(timeInput, "");
320+
dateInput.sendKeys(Keys.TAB);
321+
timeInput.sendKeys(Keys.TAB);
322+
assertServerInvalid();
323+
assertClientInvalid();
324+
assertErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE);
325+
}
326+
327+
@Test
328+
public void incompleteInput_setTimeInputValue_blur_assertValidity() {
329+
setInputValue(dateInput, "");
330+
setInputValue(timeInput, "10:00");
331+
timeInput.sendKeys(Keys.TAB);
332+
assertServerInvalid();
333+
assertClientInvalid();
334+
assertErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE);
335+
}
336+
337+
@Test
338+
public void incompleteInput_setValue_clearValue_assertValidity() {
339+
setInputValue(dateInput, "1/1/2000");
340+
setInputValue(timeInput, "");
341+
timeInput.sendKeys(Keys.ENTER);
342+
343+
$("button").id(CLEAR_VALUE_BUTTON).click();
344+
assertServerValid();
345+
assertClientValid();
346+
assertErrorMessage("");
347+
}
348+
349+
@Override
350+
protected void assertValidationCount(int expected) {
351+
super.assertValidationCount(expected);
352+
}
353+
354+
@Test
355+
public void incompleteInput_setDateInputValue_blur_clearValue_assertValidity() {
356+
setInputValue(dateInput, "1/1/2000");
357+
setInputValue(timeInput, "");
281358
dateInput.sendKeys(Keys.TAB);
282359
timeInput.sendKeys(Keys.TAB);
283360

361+
$("button").id(CLEAR_VALUE_BUTTON).click();
362+
assertServerValid();
363+
assertClientValid();
364+
assertErrorMessage("");
365+
}
366+
367+
@Test
368+
public void incompleteInput_setTimeInputValue_blur_clearValue_assertValidity() {
369+
setInputValue(dateInput, "");
370+
setInputValue(timeInput, "10:00");
371+
timeInput.sendKeys(Keys.TAB);
372+
373+
$("button").id(CLEAR_VALUE_BUTTON).click();
374+
assertServerValid();
375+
assertClientValid();
376+
assertErrorMessage("");
377+
}
378+
379+
@Test
380+
public void detach_attach_preservesInvalidState() {
381+
setFieldIInvalid();
382+
284383
detachAndReattachField();
285384

286385
assertServerInvalid();
@@ -309,16 +408,18 @@ public void detach_hide_attach_showAndInvalidate_preservesInvalidState() {
309408

310409
@Test
311410
public void clientSideInvalidStateIsNotPropagatedToServer() {
312-
// Make the field invalid
313-
$("button").id(REQUIRED_BUTTON).click();
314-
dateInput.sendKeys(Keys.TAB);
315-
timeInput.sendKeys(Keys.TAB);
411+
setFieldIInvalid();
316412

317413
executeScript("arguments[0].invalid = false", testField);
318414

319415
assertServerInvalid();
320416
}
321417

418+
private void setFieldIInvalid() {
419+
setInputValue(dateInput, "INVALID");
420+
setInputValue(timeInput, "INVALID");
421+
}
422+
322423
protected DateTimePickerElement getTestField() {
323424
return $(DateTimePickerElement.class).first();
324425
}

vaadin-date-time-picker-flow-parent/vaadin-date-time-picker-flow-integration-tests/src/test/java/com/vaadin/flow/component/datetimepicker/validation/BinderValidationIT.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static com.vaadin.flow.component.datetimepicker.validation.BinderValidationPage.BAD_INPUT_ERROR_MESSAGE;
1919
import static com.vaadin.flow.component.datetimepicker.validation.BinderValidationPage.CLEAR_VALUE_BUTTON;
2020
import static com.vaadin.flow.component.datetimepicker.validation.BinderValidationPage.EXPECTED_VALUE_INPUT;
21+
import static com.vaadin.flow.component.datetimepicker.validation.BinderValidationPage.INCOMPLETE_INPUT_ERROR_MESSAGE;
2122
import static com.vaadin.flow.component.datetimepicker.validation.BinderValidationPage.MAX_ERROR_MESSAGE;
2223
import static com.vaadin.flow.component.datetimepicker.validation.BinderValidationPage.MAX_INPUT;
2324
import static com.vaadin.flow.component.datetimepicker.validation.BinderValidationPage.MIN_ERROR_MESSAGE;
@@ -58,17 +59,17 @@ public void fieldIsInitiallyValid() {
5859
public void required_triggerDateInputBlur_assertValidity() {
5960
dateInput.sendKeys(Keys.TAB);
6061
timeInput.sendKeys(Keys.TAB);
61-
assertServerInvalid();
62-
assertClientInvalid();
63-
assertErrorMessage(REQUIRED_ERROR_MESSAGE);
62+
assertServerValid();
63+
assertClientValid();
64+
assertErrorMessage(null);
6465
}
6566

6667
@Test
6768
public void required_triggerTimeInputBlur_assertValidity() {
6869
timeInput.sendKeys(Keys.TAB);
69-
assertServerInvalid();
70-
assertClientInvalid();
71-
assertErrorMessage(REQUIRED_ERROR_MESSAGE);
70+
assertServerValid();
71+
assertClientValid();
72+
assertErrorMessage(null);
7273
}
7374

7475
@Test
@@ -84,7 +85,7 @@ public void required_changeValue_assertValidity() {
8485
setInputValue(dateInput, "");
8586
assertServerInvalid();
8687
assertClientInvalid();
87-
assertErrorMessage(REQUIRED_ERROR_MESSAGE);
88+
assertErrorMessage(INCOMPLETE_INPUT_ERROR_MESSAGE);
8889

8990
setInputValue(timeInput, "");
9091
assertServerInvalid();

0 commit comments

Comments
 (0)