From ff4d7b1e9b7b4bf9a15bd199acc3d7a12c519cc2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pekka=20Hyv=C3=B6nen?= Date: Wed, 12 Oct 2016 09:02:46 +0300 Subject: [PATCH] Use placeholder instead of inputPrompt for DateField Renames the API server side and uses placeholder attribute for input. Removed PopupDateFieldInputPrompt test since it tests input prompt logic, that is no longer there after switching to native placeholder attribute for input element. Change-Id: I5c66456781f8703ba2e253134b88f8372825528f --- .../com/vaadin/client/ui/VTextualDate.java | 64 +++++-------- .../ui/datefield/DateFieldConnector.java | 1 + .../ui/datefield/TextualDateConnector.java | 3 - .../main/java/com/vaadin/ui/DateField.java | 35 +++----- .../datefield/DateFieldDeclarativeTest.java | 4 +- .../shared/ui/datefield/DateFieldState.java | 4 + .../components/datefield/DateFieldTest.java | 2 +- .../components/datefield/DateFields.java | 2 +- .../datefield/PopupDateFieldInputPrompt.java | 61 ------------- .../PopupDateFieldInputPromptTest.java | 89 ------------------- 10 files changed, 44 insertions(+), 221 deletions(-) delete mode 100644 uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPrompt.java delete mode 100644 uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPromptTest.java diff --git a/client/src/main/java/com/vaadin/client/ui/VTextualDate.java b/client/src/main/java/com/vaadin/client/ui/VTextualDate.java index 7b83a5622d..b7c89c6397 100644 --- a/client/src/main/java/com/vaadin/client/ui/VTextualDate.java +++ b/client/src/main/java/com/vaadin/client/ui/VTextualDate.java @@ -56,16 +56,6 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, /** For internal use only. May be removed or replaced in the future. */ public boolean lenient; - private static final String CLASSNAME_PROMPT = "prompt"; - - /** For internal use only. May be removed or replaced in the future. */ - public static final String ATTR_INPUTPROMPT = "prompt"; - - /** For internal use only. May be removed or replaced in the future. */ - public String inputPrompt = ""; - - private boolean prompting = false; - public VTextualDate() { super(); text = new TextBox(); @@ -75,10 +65,6 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, public void onFocus(FocusEvent event) { text.addStyleName(VTextField.CLASSNAME + "-" + VTextField.CLASSNAME_FOCUS); - if (prompting) { - text.setText(""); - setPrompting(false); - } if (getClient() != null && getClient() .hasEventListeners(VTextualDate.this, EventId.FOCUS)) { getClient().updateVariable(getId(), EventId.FOCUS, "", @@ -95,11 +81,6 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, text.removeStyleName(VTextField.CLASSNAME + "-" + VTextField.CLASSNAME_FOCUS); String value = getText(); - setPrompting(inputPrompt != null - && (value == null || "".equals(value))); - if (prompting) { - text.setText(readonly ? "" : inputPrompt); - } if (getClient() != null && getClient() .hasEventListeners(VTextualDate.this, EventId.BLUR)) { getClient().updateVariable(getId(), EventId.BLUR, "", true); @@ -204,15 +185,6 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, text.setEnabled(enabled); } - protected void setPrompting(boolean prompting) { - this.prompting = prompting; - if (prompting) { - addStyleDependentName(CLASSNAME_PROMPT); - } else { - removeStyleDependentName(CLASSNAME_PROMPT); - } - } - @Override @SuppressWarnings("deprecation") public void onChange(ChangeEvent event) { @@ -307,23 +279,35 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler, text.setFocus(true); } - protected String getText() { - if (prompting) { - return ""; + /** + * Sets the placeholder for this textual date input. + * + * @param placeholder + * the placeholder to set, or {@code null} to clear + */ + public void setPlaceholder(String placeholder) { + if (placeholder != null) { + text.getElement().setAttribute("placeholder", placeholder); + } else { + text.getElement().removeAttribute("placeholder"); } + } + + /** + * Gets the set placeholder this textual date input, or an empty string if + * none is set. + * + * @return the placeholder or an empty string if none set + */ + public String getPlaceHolder() { + return text.getElement().getAttribute("placeholder"); + } + + protected String getText() { return text.getText(); } protected void setText(String text) { - if (inputPrompt != null && (text == null || "".equals(text)) - && !this.text.getStyleName().contains(VTextField.CLASSNAME + "-" - + VTextField.CLASSNAME_FOCUS)) { - text = readonly ? "" : inputPrompt; - setPrompting(true); - } else { - setPrompting(false); - } - this.text.setText(text); } diff --git a/client/src/main/java/com/vaadin/client/ui/datefield/DateFieldConnector.java b/client/src/main/java/com/vaadin/client/ui/datefield/DateFieldConnector.java index 7161283176..4a08399bdf 100644 --- a/client/src/main/java/com/vaadin/client/ui/datefield/DateFieldConnector.java +++ b/client/src/main/java/com/vaadin/client/ui/datefield/DateFieldConnector.java @@ -23,6 +23,7 @@ import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.ui.PopupPanel; import com.vaadin.client.ApplicationConnection; import com.vaadin.client.UIDL; +import com.vaadin.client.annotations.OnStateChange; import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.ui.VCalendarPanel.FocusChangeListener; import com.vaadin.client.ui.VPopupCalendar; diff --git a/client/src/main/java/com/vaadin/client/ui/datefield/TextualDateConnector.java b/client/src/main/java/com/vaadin/client/ui/datefield/TextualDateConnector.java index 45504cebd0..bf77d3b25f 100644 --- a/client/src/main/java/com/vaadin/client/ui/datefield/TextualDateConnector.java +++ b/client/src/main/java/com/vaadin/client/ui/datefield/TextualDateConnector.java @@ -38,9 +38,6 @@ public class TextualDateConnector extends AbstractDateFieldConnector { getWidget().formatStr = uidl.getStringAttribute("format"); } - getWidget().inputPrompt = uidl - .getStringAttribute(VTextualDate.ATTR_INPUTPROMPT); - getWidget().lenient = !uidl.getBooleanAttribute("strict"); getWidget().buildDate(); diff --git a/server/src/main/java/com/vaadin/ui/DateField.java b/server/src/main/java/com/vaadin/ui/DateField.java index 04b32f66a0..fd241f7504 100644 --- a/server/src/main/java/com/vaadin/ui/DateField.java +++ b/server/src/main/java/com/vaadin/ui/DateField.java @@ -17,8 +17,6 @@ package com.vaadin.ui; import java.time.LocalDate; -import com.vaadin.server.PaintException; -import com.vaadin.server.PaintTarget; import com.vaadin.shared.ui.datefield.DateFieldState; /** @@ -31,8 +29,6 @@ import com.vaadin.shared.ui.datefield.DateFieldState; */ public class DateField extends AbstractDateField { - private String inputPrompt = null; - /** * Constructs an empty DateField with no caption. */ @@ -63,34 +59,25 @@ public class DateField extends AbstractDateField { super(caption); } - @Override - public void paintContent(PaintTarget target) throws PaintException { - super.paintContent(target); - - if (inputPrompt != null) { - target.addAttribute("prompt", inputPrompt); - } - } - /** - * Gets the current input prompt. + * Returns the current placeholder text. * - * @see #setInputPrompt(String) - * @return the current input prompt, or null if not enabled + * @see #setPlaceholder(String) + * @return the placeholder text */ - public String getInputPrompt() { - return inputPrompt; + public String getPlaceholder() { + return getState(false).placeholder; } /** - * Sets the input prompt - a textual prompt that is displayed when the field - * would otherwise be empty, to prompt the user for input. + * Sets the placeholder text. The placeholder is text that is displayed when + * the field would otherwise be empty, to prompt the user for input. * - * @param inputPrompt + * @param placeholder + * the placeholder text to set */ - public void setInputPrompt(String inputPrompt) { - this.inputPrompt = inputPrompt; - markAsDirty(); + public void setPlaceholder(String placeholder) { + getState().placeholder = placeholder; } @Override diff --git a/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java b/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java index 0448bf5697..ef6ec554c2 100644 --- a/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java +++ b/server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java @@ -33,14 +33,14 @@ import com.vaadin.ui.DateField; public class DateFieldDeclarativeTest extends DeclarativeTestBase { private String getBasicDesign() { - return ""; + return ""; } private DateField getBasicExpected() { DateField pdf = new DateField(); pdf.setShowISOWeekNumbers(true); pdf.setRangeEnd(LocalDate.of(2019, 01, 15)); - pdf.setInputPrompt("Pick a day"); + pdf.setPlaceholder("Pick a day"); pdf.setValue(LocalDate.of(2003, 2, 27)); pdf.setTextFieldEnabled(false); pdf.setAssistiveText("at"); diff --git a/shared/src/main/java/com/vaadin/shared/ui/datefield/DateFieldState.java b/shared/src/main/java/com/vaadin/shared/ui/datefield/DateFieldState.java index f71d33fb3a..4566096e9a 100644 --- a/shared/src/main/java/com/vaadin/shared/ui/datefield/DateFieldState.java +++ b/shared/src/main/java/com/vaadin/shared/ui/datefield/DateFieldState.java @@ -15,6 +15,7 @@ */ package com.vaadin.shared.ui.datefield; +import com.vaadin.shared.annotations.DelegateToWidget; import com.vaadin.shared.annotations.NoLayout; public class DateFieldState extends TextualDateFieldState { @@ -27,4 +28,7 @@ public class DateFieldState extends TextualDateFieldState { public boolean textFieldEnabled = true; @NoLayout public String descriptionForAssistiveDevices = DESCRIPTION_FOR_ASSISTIVE_DEVICES; + @NoLayout + @DelegateToWidget + public String placeholder = null; } diff --git a/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTest.java b/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTest.java index 4bff1505c0..5a4172d463 100644 --- a/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTest.java +++ b/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTest.java @@ -31,7 +31,7 @@ public class DateFieldTest extends AbstractDateFieldTest { @Override public void execute(DateField c, String value, Object data) { - c.setInputPrompt(value); + c.setPlaceholder(value); } }); diff --git a/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFields.java b/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFields.java index 6d6ab7c6a5..379644cef4 100644 --- a/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFields.java +++ b/uitest/src/main/java/com/vaadin/tests/components/datefield/DateFields.java @@ -85,7 +85,7 @@ public class DateFields extends ComponentTestCase { @Override public void execute(DateField c, String value, Object data) { - c.setInputPrompt(value); + c.setPlaceholder(value); } }); diff --git a/uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPrompt.java b/uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPrompt.java deleted file mode 100644 index 31dd5f1c8a..0000000000 --- a/uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPrompt.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2000-2016 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.vaadin.tests.components.datefield; - -import com.vaadin.server.VaadinRequest; -import com.vaadin.tests.components.AbstractReindeerTestUI; -import com.vaadin.ui.DateField; -import com.vaadin.ui.TextField; - -/** - * Tests that state change doesn't set input prompt back to PopupDateField if - * focus is still in the input field. - * - * @author Vaadin Ltd - */ -public class PopupDateFieldInputPrompt extends AbstractReindeerTestUI { - - private TextField text = new TextField("TextField"); - private DateField dateField = new DateField(); - - @Override - protected void setup(VaadinRequest request) { - - text.addValueChangeListener(listener -> { - // update PopupDateField's state - dateField.setRequired(!dateField.isRequired()); - }); - - dateField.setInputPrompt("prompt"); - dateField.setCaption("PopupDateField"); - - addComponent(text); - addComponent(dateField); - } - - @Override - protected String getTestDescription() { - return "Write something to the TextField and use tabulator to move to PopupDateField." - + "
PopupDateField shouldn't get input prompt back before focus leaves the input field," - + "
even if TextField's value change updates PopupDateField's state."; - } - - @Override - protected Integer getTicketNumber() { - return 18027; - } - -} diff --git a/uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPromptTest.java b/uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPromptTest.java deleted file mode 100644 index 0c70457c48..0000000000 --- a/uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPromptTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000-2016 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package com.vaadin.tests.components.datefield; - -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.ExpectedCondition; - -import com.vaadin.testbench.customelements.DateFieldElement; -import com.vaadin.testbench.elements.TextFieldElement; -import com.vaadin.tests.tb3.MultiBrowserTest; - -/** - * Tests that state change doesn't set input prompt back to PopupDateField if - * focus is still in the input field. - * - * @author Vaadin Ltd - */ -public class PopupDateFieldInputPromptTest extends MultiBrowserTest { - - @Test - public void testInputPrompt() { - openTestURL(); - TextFieldElement textField = $(TextFieldElement.class).first(); - final DateFieldElement dateField = $(DateFieldElement.class).first(); - - // ensure initial state - Assert.assertFalse("DateField required when it shouldn't be.", - isRequired(dateField)); - WebElement input = dateField.findElement(By.className("v-textfield")); - Assert.assertEquals("prompt", input.getAttribute("value")); - - // trigger ValueChange and move focus - textField.sendKeys("foo", Keys.TAB); - - // wait for ValueChange to update DateField's state and the DateField to - // gain focus. - waitForElementRequiredAndFocused(dateField, - By.className("v-textfield-focus")); - - // ensure prompt hasn't come back when field was set required - Assert.assertNotEquals("prompt", input.getAttribute("value")); - } - - private void waitForElementRequiredAndFocused( - final DateFieldElement dateField, final By locator) { - waitUntil(new ExpectedCondition() { - - @Override - public Boolean apply(WebDriver arg0) { - if (isRequired(dateField)) { - List elements = dateField.findElements(locator); - return !elements.isEmpty(); - } - - return false; - } - - @Override - public String toString() { - return "dateField to become required and presence of element located by: " - + locator; - } - }); - } - - private boolean isRequired(DateFieldElement dateField) { - return dateField.getAttribute("class").contains("v-required"); - } -} -- 2.39.5