]> source.dussan.org Git - vaadin-framework.git/commitdiff
Use placeholder instead of inputPrompt for DateField
authorPekka Hyvönen <pekka@vaadin.com>
Wed, 12 Oct 2016 06:02:46 +0000 (09:02 +0300)
committerPekka Hyvönen <pekka@vaadin.com>
Fri, 14 Oct 2016 10:45:24 +0000 (13:45 +0300)
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

client/src/main/java/com/vaadin/client/ui/VTextualDate.java
client/src/main/java/com/vaadin/client/ui/datefield/DateFieldConnector.java
client/src/main/java/com/vaadin/client/ui/datefield/TextualDateConnector.java
server/src/main/java/com/vaadin/ui/DateField.java
server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java
shared/src/main/java/com/vaadin/shared/ui/datefield/DateFieldState.java
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTest.java
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFields.java
uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPrompt.java [deleted file]
uitest/src/test/java/com/vaadin/tests/components/datefield/PopupDateFieldInputPromptTest.java [deleted file]

index 7b83a5622dee4e1b3df1eaf13801accf0cb2d016..b7c89c6397f004dce9d29eb2c8232012df9bb8a5 100644 (file)
@@ -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);
     }
 
index 71612831764b619f34b300d01f86ecab292bca25..4a08399bdfb4f2ba8804bd1721dac3815851743c 100644 (file)
@@ -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;
index 45504cebd056ee379519b860646b29f87711ac9a..bf77d3b25f01ca9217dd589dfe209944baba5570 100644 (file)
@@ -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();
index 04b32f66a0967a4292e236840106111d82b10746..fd241f7504b19022de72777998f679fa9a5d78b1 100644 (file)
@@ -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 <code>DateField</code> 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
index 0448bf56979a670868fd4d6cf6d5ad1b94676241..ef6ec554c22f9fcd9aeeb3b377acf6bc4df1c55f 100644 (file)
@@ -33,14 +33,14 @@ import com.vaadin.ui.DateField;
 public class DateFieldDeclarativeTest extends DeclarativeTestBase<DateField> {
 
     private String getBasicDesign() {
-        return "<vaadin-date-field assistive-text='at' text-field-enabled='false' show-iso-week-numbers range-end=\"2019-01-15\" input-prompt=\"Pick a day\" value=\"2003-02-27\"></vaadin-date-field>";
+        return "<vaadin-date-field assistive-text='at' text-field-enabled='false' show-iso-week-numbers range-end=\"2019-01-15\" placeholder=\"Pick a day\" value=\"2003-02-27\"></vaadin-date-field>";
     }
 
     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");
index f71d33fb3af31cc0b213c04c36ef602c842cda22..4566096e9a890a91c35c2b1701bcffaacb2a41b8 100644 (file)
@@ -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;
 }
index 4bff1505c08ddf8ab0e809121c282d4a5e3b6bb3..5a4172d463d12b322307a5ba5f819320b679414a 100644 (file)
@@ -31,7 +31,7 @@ public class DateFieldTest extends AbstractDateFieldTest<DateField> {
                     @Override
                     public void execute(DateField c, String value,
                             Object data) {
-                        c.setInputPrompt(value);
+                        c.setPlaceholder(value);
 
                     }
                 });
index 6d6ab7c6a53adc2c243f64064bed957fe90d1b75..379644cef4d6da3e6cd6fb845d8e5bee1fcceb68 100644 (file)
@@ -85,7 +85,7 @@ public class DateFields extends ComponentTestCase<DateField> {
                     @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 (file)
index 31dd5f1..0000000
+++ /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."
-                + "<br>PopupDateField shouldn't get input prompt back before focus leaves the input field,"
-                + "<br>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 (file)
index 0c70457..0000000
+++ /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<Boolean>() {
-
-            @Override
-            public Boolean apply(WebDriver arg0) {
-                if (isRequired(dateField)) {
-                    List<WebElement> 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");
-    }
-}