if (newDateString == null || newDateString.isEmpty()) {
uiHasValidDateString = true;
currentParseErrorMessage = null;
- setValue(newDate, true);
setComponentError(null);
+ setValue(newDate, true);
} else {
if (variables.get("lastInvalidDateString") != null) {
Result<T> parsedDate = handleUnparsableDateString(
--- /dev/null
+package com.vaadin.tests.components.datefield;
+
+import java.time.LocalDate;
+import java.util.Locale;
+
+import com.vaadin.annotations.Widgetset;
+import com.vaadin.data.Binder;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.Notification;
+
+@Widgetset("com.vaadin.DefaultWidgetSet")
+public class DateFieldValidationError extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ DateField df = new DateField();
+ df.setLocale(Locale.US);
+ Binder<Void> binder = new Binder<>();
+ binder.forField(df)
+ .withValidator(localDate -> localDate != null && localDate.isAfter(LocalDate.now()), "Invalid date")
+ .bind(v -> LocalDate.now(), (v, t) -> {
+ /* NO-OP */
+ });
+ addComponent(df);
+ addComponent(new Button("Validate", e -> Notification.show(binder.validate().isOk() ? "OK" : "Fail")));
+ }
+
+}
--- /dev/null
+package com.vaadin.tests.components.datefield;
+
+import java.time.LocalDate;
+
+import com.vaadin.testbench.elements.DateFieldElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+public class DateFieldValidationErrorTest extends MultiBrowserTest {
+
+ @Test
+ public void testComponentErrorShouldBeShownWhenEnteringInvalidDate() throws InterruptedException {
+ openTestURL();
+ DateFieldElement dateField = $(DateFieldElement.class).first();
+ dateField.getInputElement().click();
+ dateField.getInputElement().sendKeys("01/01/01", Keys.TAB);
+
+ assertHasErrorMessage(dateField);
+ }
+
+ @Test
+ public void testComponentErrorShouldBeShownWhenSelectingInvalidDate() throws InterruptedException {
+ openTestURL();
+ DateFieldElement dateField = $(DateFieldElement.class).first();
+ dateField.setDate(LocalDate.now());
+ dateField.openPopup();
+ waitUntil(ExpectedConditions.visibilityOfElementLocated(By.className("v-datefield-popup")));
+
+ WebElement popup = findElement(com.vaadin.testbench.By.className("v-datefield-popup"));
+ // select day before today
+ WebElement popupBody = popup.findElement(By.className("v-datefield-calendarpanel"));
+ popupBody.sendKeys(Keys.ARROW_LEFT, Keys.ENTER);
+
+ // move focus away otherwise tooltip is not shown
+ WebElement inputElement = dateField.getInputElement();
+ inputElement.click();
+ inputElement.sendKeys(Keys.TAB);
+
+ assertHasErrorMessage(dateField);
+ }
+
+ private void assertHasErrorMessage(DateFieldElement dateField) {
+ waitForElementPresent(By.className("v-errorindicator"));
+ dateField.showTooltip();
+ waitUntil(driver -> "Invalid date".equals(getTooltipErrorElement().getText()));
+ }
+
+ @Override
+ protected boolean requireWindowFocusForIE() {
+ return true;
+ }
+
+}