You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Martin Grigorov <mg...@apache.org> on 2016/12/21 08:14:17 UTC

Re: wicket git commit: WICKET-6299

Hi Tobias,

Some feedback inline:

On Tue, Dec 20, 2016 at 8:19 PM, <ts...@apache.org> wrote:

> Repository: wicket
> Updated Branches:
>   refs/heads/master aedb98764 -> bcd55813b
>
>
> WICKET-6299
>
> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>
> Branch: refs/heads/master
> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
> Parents: aedb987
> Author: Tobias Soloschenko <ts...@apache.org>
> Authored: Tue Dec 20 20:15:42 2016 +0100
> Committer: Tobias Soloschenko <ts...@apache.org>
> Committed: Tue Dec 20 20:15:42 2016 +0100
>
> ----------------------------------------------------------------------
>  .../html/form/AutoCompleteAddressType.java      |  56 ++++
>  .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>  .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>  .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>  .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>  .../markup/html/form/AutoCompleteFields.java    | 272 +++++++++++++++++++
>  .../apache/wicket/markup/html/form/Form.java    |  14 +
>  .../wicket/markup/html/form/TextField.java      |  14 +
>  .../wicket/markup/html/form/FormTest.java       |  39 +++
>  .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>  10 files changed, 803 insertions(+), 2 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteAddressType.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteAddressType.java b/wicket-core/src/main/java/or
> g/apache/wicket/markup/html/form/AutoCompleteAddressType.java
> new file mode 100644
> index 0000000..6123053
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteAddressType.java
> @@ -0,0 +1,56 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion address type according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteAddressType {
> +
> +       /**
> +        * Meaning the field is part of the shipping address or contact
> information
> +        */
> +       SHIPPING("shipping"),
> +
> +       /**
> +        * meaning the field is part of the billing address or contact
> information
> +        */
> +       BILLING("billing");
> +
> +       private String value;
> +
> +       private AutoCompleteAddressType(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the address type value
> +        *
> +        * @return the value of the address type
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteBuilder.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteBuilder.java
> new file mode 100644
> index 0000000..a3b64cd
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteBuilder.java
> @@ -0,0 +1,170 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
> +
> +/**
> + * The auto complete builder is used to build the corresponding attribute
> for form and input tags.
> + * To use the auto completion just open the autofill options within your
> browser. In chrome for
> + * example it is accessed with the following URL:
> + * <a href="chrome://settings/autofillEditAddress">chrome://settin
> gs/autofillEditAddress</a>
> + *
> + * @author Tobias Soloschenko
> + *
> + * @since 8.0.0
> + *
> + */
> +public class AutoCompleteBuilder implements AutoCompleteContactBuilder
> +{
> +       /**
> +        * The section prefix specificed by the whatwg standard
> +        */
> +       public static final String SECTION_PREFIX = "section-";
> +
> +       private String sectionName;
> +
> +       private AutoCompleteAddressType addressType;
> +
> +       private AutoCompleteFields field;
> +
> +       private AutoCompleteContact contact;
> +
> +       private AutoCompleteContactDetails contactDetail;
> +
> +       private boolean empty;
> +
> +       /**
> +        * Initializes a new auto complete builder
> +        *
> +        * @return the auto complete builder
> +        */
> +       public static AutoCompleteBuilder init()
> +       {
> +               return new AutoCompleteBuilder();
> +       }
> +
> +       /**
> +        * Empties out the autocomplete outcome
> +        *
> +        * @return the auto complete builder
> +        */
> +       public AutoCompleteBuilder empty()
> +       {
> +               this.empty = true;
>

The way 'empty' works seems incomplete.
Each `with**` method should set it to 'false'.


> +               return this;
> +       }
> +
> +       /**
> +        * Applies a section to the auto completion field
> +        *
> +        * @param sectionName
> +        *            the name of the section
> +        * @return the auto complete builder itself
> +        */
> +       public AutoCompleteBuilder withSection(String sectionName)
> +       {
> +               this.sectionName = sectionName;
>

Such assignments need check for non-emptiness.
If the value is "" then it will pass the check for '!= null' in toString()
and produce wrong output.


> +               return this;
> +       }
> +
> +       /**
> +        * Assigns the auto completion to a specific address type
> +        *
> +        * @param addressType
> +        *            the auto completion address type
> +        * @return the auto complete builder itself
> +        */
> +       public AutoCompleteBuilder forAddressType(AutoCompleteAddressType
> addressType)
> +       {
> +               this.addressType = addressType;
> +               return this;
> +       }
> +
> +       /**
> +        * Applies the field to the autocomplete attribute
> +        *
> +        * @param field
> +        *            the field
> +        * @return the auto complete builder
> +        */
> +       public AutoCompleteBuilder forField(AutoCompleteFields field)
> +       {
> +               this.field = field;
> +               return this;
> +       }
> +
> +       /**
> +        * Applies the contact information to the autocomplete attribute
> +        *
> +        * @param contact
> +        *            the contact information are going to be applied to
> +        * @return the auto complete builder
> +        */
> +       public AutoCompleteContactBuilder forContact(AutoCompleteContact
> contact)
> +       {
> +               this.contact = contact;
> +               return this;
> +       }
> +
> +       /**
> +        * @see {@link AutoCompleteContactBuilder}
> +        */
> +       @Override
> +       public AutoCompleteContactBuilder forField(AutoCompleteContactDetails
> contactDetail)
> +       {
> +               this.contactDetail = contactDetail;
> +               return (AutoCompleteContactBuilder)this;
> +       }
> +
> +       /**
> +        * Builds the attribute string
> +        *
> +        * @return the attribute content in the right order
> +        */
> +       @Override
> +       public String toString()
> +       {
> +               StringBuilder stringBuilder = new StringBuilder();
> +               if (!empty)
> +               {
> +                       if (sectionName != null)
> +                       {
> +                               stringBuilder.append(SECTION_PREFIX);
> +                               stringBuilder.append(sectionName);
> +                               stringBuilder.append(" ");
>

Append char instead, i.e. ' '.


> +                       }
> +                       if (addressType != null)
> +                       {
> +                               stringBuilder.append(addressT
> ype.getValue());
> +                               stringBuilder.append(" ");
> +                       }
> +                       if (field != null)
> +                       {
> +                               stringBuilder.append(field.getValue());
> +                       }
> +                       else
> +                       {
> +                               if (contact != null)
> +                               {
> +                                       stringBuilder.append(contact.
> getValue());
> +                                       stringBuilder.append(" ");
> +                               }
> +                               stringBuilder.append(contactD
> etail.getValue());
>

Is it allowed to have contactDetail without a contact ?


> +                       }
> +               }
> +               return stringBuilder.toString();
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteContact.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContact.java
> new file mode 100644
> index 0000000..cbf86a5
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContact.java
> @@ -0,0 +1,77 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion contact according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteContact {
> +
> +       /**
> +        * meaning the field is for contacting someone at their residence
> +        */
> +       HOME("home"),
> +
> +       /**
> +        * meaning the field is for contacting someone at their workplace
> +        */
> +       WORK("work"),
> +
> +       /**
> +        * meaning the field is for contacting someone regardless of
> location
> +        */
> +       MOBILE("mobile"),
> +
> +       /**
> +        * meaning the field describes a fax machine's contact details
> +        */
> +       FAX("fax"),
> +
> +       /**
> +        * meaning the field describes a pager's or beeper's contact
> details
> +        */
> +       PAGER("pager");
> +
> +       private String value;
> +
> +       /**
> +        * Creates an auto completion contact with the given value
> +        *
> +        * @param value
> +        *            the value of the contact
> +        */
> +       private AutoCompleteContact(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the value of the auto completion contact
> +        *
> +        * @return the value of the auto completion contact
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteContactBuilder.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/or
> g/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
> new file mode 100644
> index 0000000..07324ff
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactBuilder.java
> @@ -0,0 +1,38 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
> +
> +/**
> + * The auto complete contact builder shrinks down the possibilities to
> the contact details
> + *
> + * @author Tobias Soloschenko
> + *
> + * @since 8.0.0
> + *
> + */
> +public interface AutoCompleteContactBuilder
> +{
> +       /**
> +        * Applies the contact details information to the auto complete
> field
> +        *
> +        * @param contactDetail
> +        *            the contact detail
> +        * @return the auto complete builder contact
> +        */
> +       AutoCompleteContactBuilder forField(AutoCompleteContactDetails
> contactDetail);
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteContactDetails.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactDetails.java b/wicket-core/src/main/java/or
> g/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
> new file mode 100644
> index 0000000..e4d5e44
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteContactDetails.java
> @@ -0,0 +1,102 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion contact detail according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteContactDetails {
> +
> +       /**
> +        * +1 617 253 5702


Prefix it with "E.g."


>
> +        */
> +       TEL("tel"),
> +
> +       /**
> +        * +1
> +        */
> +       TEL_COUNTRY_CODE("tel-country-code"),
> +
> +       /**
> +        * 617 253 5702
> +        */
> +       TEL_NATIONAL("tel-national"),
> +
> +       /**
> +        * 617
> +        */
> +       TEL_AREA_CODE("tel-area-code"),
> +
> +       /**
> +        * 2535702
> +        */
> +       TEL_LOCAL("tel-local"),
> +
> +       /**
> +        * 253
> +        */
> +       TEL_LOCAL_PREFIX("tel-local-prefix"),
> +
> +       /**
> +        * 5702
> +        */
> +       TEL_LOCAL_SUFFIX("tel-local-suffix"),
> +
> +       /**
> +        * 1000
> +        */
> +       TEL_EXTENSION("tel-extension"),
> +
> +       /**
> +        * timbl@w3.org
> +        */
> +       EMAIL("email"),
> +
> +       /**
> +        * irc://example.org/timbl,isuser
> +        */
> +       IMPP("impp");
> +
> +       private String value;
> +
> +       /**
> +        * Creates an auto completion contact detail with the given value
> +        *
> +        * @param value
> +        *            the value of the contact detail
> +        */
> +       private AutoCompleteContactDetails(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the value of the auto completion contact detail
> +        *
> +        * @return the value of the auto completion contact detail
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/AutoCompleteFields.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteFields.java
> new file mode 100644
> index 0000000..8f794c4
> --- /dev/null
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/AutoCompleteFields.java
> @@ -0,0 +1,272 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
> +
> +/**
> + * Auto completion personal data according to the whatwg specification.
> + *
> + * @author Tobias Soloschenko
> + *
> + * @see <a href=
> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
> html.spec.whatwg.org/multipage/forms.html</a>
> + *
> + */
> +public enum AutoCompleteFields {
> +
> +       /**
> +        * Simply turns on the auto completion
> +        */
> +       ON("on"),
> +
> +       /**
> +        * Simply turns off the auto completion
> +        */
> +       OFF("off"),
> +
> +       /**
> +        * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
> +        */
> +       NAME("name"),
> +
> +       /**
> +        * Sir
> +        */
> +       HONORIFIC_PREFIX("honorific-prefix"),
> +
> +       /**
> +        * Timothy
> +        */
> +       GIVEN_NAME("given-name"),
> +
> +       /**
> +        * John
> +        */
> +       ADDITIONAL_NAME("additional-name"),
> +
> +       /**
> +        * Berners-Lee
> +        */
> +       FAMILY_NAME("family-name"),
> +
> +       /**
> +        * OM, KBE, FRS, FREng, FRSA
> +        */
> +       HONORIFIC_SUFFIX("honorific-suffix"),
> +
> +       /**
> +        * Tim
> +        */
> +       NICKNAME("nickname"),
> +
> +       /**
> +        * timbl
> +        */
> +       USERNAME("username"),
> +
> +       /**
> +        * GUMFXbadyrS3
> +        */
> +       NEW_PASSWORD("new-password"),
> +
> +       /**
> +        * qwerty
> +        */
> +       CURRENT_PASSWORD("current-password"),
> +
> +       /**
> +        * Professor
> +        */
> +       ORGANIZATION_TITLE("organization-title"),
> +
> +       /**
> +        * World Wide Web Consortium
> +        */
> +       ORGANIZATION("organization"),
> +
> +       /**
> +        * Multiple lines 32 Vassar Street MIT Room 32-G524
> +        */
> +       STREET_ADDRESS("street-address"),
> +
> +       /**
> +        * 32 Vassar Street
> +        */
> +       ADDRESS_LINE1("address-line1"),
> +
> +       /**
> +        * MIT Room 32-G524
> +        */
> +       ADDRESS_LINE2("address-line2"),
> +
> +       /**
> +        * See {@link AutoComplete.ADRESS_LINE2}
> +        */
> +       ADDRESS_LINE3("address-line3"),
> +
> +       /**
> +        * The most fine-grained administrative level, in addresses with
> four administrative levels
> +        */
> +       ADDRESS_LEVEL4("address-level4"),
> +
> +       /**
> +        * The third administrative level, in addresses with three or more
> administrative levels
> +        */
> +       ADDRESS_LEVEL3("address-level3"),
> +
> +       /**
> +        * Cambridge
> +        */
> +       ADDRESS_LEVEL2("address-level2"),
> +
> +       /**
> +        * MA
> +        */
> +       ADDRESS_LEVEL1("address-level1"),
> +
> +       /**
> +        * US
> +        */
> +       COUNTRY("country"),
> +
> +       /**
> +        * US
> +        */
> +       COUNTRY_NAME("country-name"),
> +
> +       /**
> +        * 02139
> +        */
> +       POSTAL_CODE("postal-code"),
> +
> +       /**
> +        * Tim Berners-Lee
> +        */
> +       CC_NAME("cc-name"),
> +
> +       /**
> +        * Tim
> +        */
> +       CC_GIVEN_NAME("cc-given-name"),
> +
> +       /**
> +        * -
> +        */
> +       CC_ADDITIONAL_NAME("cc-additional-name"),
> +
> +       /**
> +        * Berners-Lee
> +        */
> +       CC_FAMILY_NAME("cc-family-name"),
> +
> +       /**
> +        * 4114360123456785
> +        */
> +       CC_NUMBER("cc-number"),
> +
> +       /**
> +        * 2014-12
> +        */
> +       CC_EXP("cc-exp"),
> +
> +       /**
> +        * 12
> +        */
> +       CC_EXP_MONTH("cc-exp-month"),
> +
> +       /**
> +        * 2014
> +        */
> +       CC_EXP_YEAR("cc-exp-year"),
> +
> +       /**
> +        * 419
> +        */
> +       CC_CSC("cc-csc"),
> +
> +       /**
> +        * Visa
> +        */
> +       CC_TYPE("cc-type"),
> +
> +       /**
> +        * GBP
> +        */
> +       TRANSACTION_CURRENCY("transaction-currency"),
> +
> +       /**
> +        * 401.00
> +        */
> +       TRANSACTION_AMOUNT("transaction-amount"),
> +
> +       /**
> +        * en
> +        */
> +       LANGUAGE("language"),
> +
> +       /**
> +        * 1955-06-08
> +        */
> +       BDAY("bday"),
> +
> +       /**
> +        * 8
> +        */
> +       BDAY_DAY("bday-day"),
> +
> +       /**
> +        * 6
> +        */
> +       BDAY_MONTH("bday-month"),
> +
> +       /**
> +        * 1955
> +        */
> +       BDAY_YEAR("bday-year"),
> +
> +       /**
> +        * Male
> +        */
> +       SEX("sex"),
> +
> +       /**
> +        * https://www.w3.org/People/Berners-Lee/
> +        */
> +       URL("url"),
> +
> +       /**
> +        * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-
> eighth.jpg
> +        */
> +       PHOTO("photo");
> +
> +       private String value;
> +
> +       private AutoCompleteFields(String value)
> +       {
> +               this.value = value;
> +       }
> +
> +       /**
> +        * Gets the value of the auto completion
> +        *
> +        * @return the value of the auto completion
> +        */
> +       public String getValue()
> +       {
> +               return value;
> +       }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
> index e8b61e7..1d3284a 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/Form.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/Form.java
> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>         }
>
>         /**
> +        * Gets the value of the autocomplete attribute. The default
> behavior is that it is turned off
> +        * @return AutoCompleteBuilder the builder to generate the
> autocomplete attribute information
> +        */
> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
> +               return AutoCompleteBuilder.init().empty();
>

Since there is no way to set empty=false at the moment this definitely
doesn't work.
Some tests for the builders would be nice!


> +       }
> +
> +       /**
>          *
>          * @see org.apache.wicket.Component#getStatelessHint()
>          */
> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>                                         setMultiPart(true);
>                                 }
>                         }
> +
> +                       // Auto completion support
> +                       String autocompleteValue =
> getAutoCompleteBuilder().toString();
> +                       if(!autocompleteValue.isEmpty()){
> +                               tag.put("autocomplete", autocompleteValue);
> +                       }
>                 }
>                 else
>                 {
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/main/java/org/apache/wicket/markup/html/
> form/TextField.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/TextField.java
> index 81dc828..719560c 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/TextField.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
> rm/TextField.java
> @@ -107,6 +107,12 @@ public class TextField<T> extends
> AbstractTextComponent<T>
>
>                 tag.put("value", getValue());
>
> +               // Auto completion support
> +               String autocompleteValue = getAutoCompleteBuilder().toStr
> ing();
> +               if(!autocompleteValue.isEmpty()){
> +                       tag.put("autocomplete", autocompleteValue);
> +               }
> +
>                 // Default handling for component tag
>                 super.onComponentTag(tag);
>         }
> @@ -121,4 +127,12 @@ public class TextField<T> extends
> AbstractTextComponent<T>
>         {
>                 return null;
>         }
> +
> +       /**
> +        * Gets the value of the autocomplete attribute. The default
> behavior is that it is turned off
> +        * @return AutoCompleteBuilder the builder to generate the
> autocomplete attribute information
> +        */
> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
> +               return AutoCompleteBuilder.init().empty();
> +       }
>  }
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/FormTest.java
> index 05344a5..2ee420a 100644
> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/FormTest.java
> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/FormTest.java
> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>                 };
>         }
>
> +       /**
> +        * Test auto complete functionality
> +        */
> +       @Test
> +       public void testAutoComplete(){
> +               class TestPage extends WebPage implements
> IMarkupResourceStreamProvider
> +               {
> +                       boolean shouldFail, submit, error;
> +
> +                       public TestPage()
> +                       {
> +                               add(new Form<Void>("form")
> +                               {
> +                                       @Override
> +                                       protected AutoCompleteBuilder
> getAutoCompleteBuilder()
> +                                       {
> +                                               return
> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
> +                                       }
> +                               });
> +                       }
> +
> +                       @Override
> +                       public IResourceStream
> getMarkupResourceStream(final MarkupContainer container,
> +                               Class<?> containerClass)
> +                       {
> +                               return new StringResourceStream("<form
> wicket:id='form'></form>");
> +                       }
> +               }
> +
> +               TestPage testPage = new TestPage();
> +               tester.startPage(testPage);
> +               assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"billing
> given-name\""));
> +       }
>
>         /**
>          * @throws Exception
> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>                                         {
>                                                 error = true;
>                                         }
> +
> +                                       @Override
> +                                       protected AutoCompleteBuilder
> getAutoCompleteBuilder()
> +                                       {
> +                                               return
> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
> +                                       }
>                                 });
>                         }
>
>
> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
> wicket-core/src/test/java/org/apache/wicket/markup/html/
> form/TextFieldTest.java
> ----------------------------------------------------------------------
> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/TextFieldTest.java
> index 5af5917..2c215e5 100644
> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/TextFieldTest.java
> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
> rm/TextFieldTest.java
> @@ -36,7 +36,20 @@ import org.junit.Test;
>   */
>  public class TextFieldTest extends WicketTestCase
>  {
> -       /** */
> +
> +       /**
> +        * Test auto complete feature
> +        */
> +       @Test
> +       public void testAutoComplete(){
> +               TestPage testPage = new TestPage();
> +               tester.startPage(testPage);
> +               assertTrue(tester.getLastResponseAsString().contains("autocomplete=\"section-blue
> billing name\""));
> +       }
> +
> +       /**
> +        * Test that inputs are converted to null
> +        * */
>         @Test
>         public void emptyInputConvertedToNull()
>         {
> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>                 public TestPage()
>                 {
>                         add(form = new Form<>("form"));
> -                       form.add(textField = new TextField<>("text",
> textModel));
> +                       form.add(textField = new TextField<String>("text",
> textModel){
> +                               @Override
> +                               protected AutoCompleteBuilder
> getAutoCompleteBuilder()
> +                               {
> +                                       return
> AutoCompleteBuilder.init().withSection("blue").forAddressTyp
> e(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
> +                               }
> +                       });
>                 }
>
>                 @Override
>
>

Re: wicket git commit: WICKET-6299

Posted by Martin Grigorov <mg...@apache.org>.
And the formitting is not Wicket's one.
E.g. the opening { should be on the next line.

Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov

On Wed, Dec 21, 2016 at 9:14 AM, Martin Grigorov <mg...@apache.org>
wrote:

> Hi Tobias,
>
> Some feedback inline:
>
> On Tue, Dec 20, 2016 at 8:19 PM, <ts...@apache.org> wrote:
>
>> Repository: wicket
>> Updated Branches:
>>   refs/heads/master aedb98764 -> bcd55813b
>>
>>
>> WICKET-6299
>>
>> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bcd55813
>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bcd55813
>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bcd55813
>>
>> Branch: refs/heads/master
>> Commit: bcd55813b3afbccb5675096930aee6281c5cba3a
>> Parents: aedb987
>> Author: Tobias Soloschenko <ts...@apache.org>
>> Authored: Tue Dec 20 20:15:42 2016 +0100
>> Committer: Tobias Soloschenko <ts...@apache.org>
>> Committed: Tue Dec 20 20:15:42 2016 +0100
>>
>> ----------------------------------------------------------------------
>>  .../html/form/AutoCompleteAddressType.java      |  56 ++++
>>  .../markup/html/form/AutoCompleteBuilder.java   | 170 ++++++++++++
>>  .../markup/html/form/AutoCompleteContact.java   |  77 ++++++
>>  .../html/form/AutoCompleteContactBuilder.java   |  38 +++
>>  .../html/form/AutoCompleteContactDetails.java   | 102 +++++++
>>  .../markup/html/form/AutoCompleteFields.java    | 272
>> +++++++++++++++++++
>>  .../apache/wicket/markup/html/form/Form.java    |  14 +
>>  .../wicket/markup/html/form/TextField.java      |  14 +
>>  .../wicket/markup/html/form/FormTest.java       |  39 +++
>>  .../wicket/markup/html/form/TextFieldTest.java  |  23 +-
>>  10 files changed, 803 insertions(+), 2 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteAddressType.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteAddressType.java b/wicket-core/src/main/java/or
>> g/apache/wicket/markup/html/form/AutoCompleteAddressType.java
>> new file mode 100644
>> index 0000000..6123053
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteAddressType.java
>> @@ -0,0 +1,56 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion address type according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteAddressType {
>> +
>> +       /**
>> +        * Meaning the field is part of the shipping address or contact
>> information
>> +        */
>> +       SHIPPING("shipping"),
>> +
>> +       /**
>> +        * meaning the field is part of the billing address or contact
>> information
>> +        */
>> +       BILLING("billing");
>> +
>> +       private String value;
>> +
>> +       private AutoCompleteAddressType(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the address type value
>> +        *
>> +        * @return the value of the address type
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteBuilder.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteBuilder.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteBuilder.java
>> new file mode 100644
>> index 0000000..a3b64cd
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteBuilder.java
>> @@ -0,0 +1,170 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * The auto complete builder is used to build the corresponding
>> attribute for form and input tags.
>> + * To use the auto completion just open the autofill options within your
>> browser. In chrome for
>> + * example it is accessed with the following URL:
>> + * <a href="chrome://settings/autofillEditAddress">chrome://settin
>> gs/autofillEditAddress</a>
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @since 8.0.0
>> + *
>> + */
>> +public class AutoCompleteBuilder implements AutoCompleteContactBuilder
>> +{
>> +       /**
>> +        * The section prefix specificed by the whatwg standard
>> +        */
>> +       public static final String SECTION_PREFIX = "section-";
>> +
>> +       private String sectionName;
>> +
>> +       private AutoCompleteAddressType addressType;
>> +
>> +       private AutoCompleteFields field;
>> +
>> +       private AutoCompleteContact contact;
>> +
>> +       private AutoCompleteContactDetails contactDetail;
>> +
>> +       private boolean empty;
>> +
>> +       /**
>> +        * Initializes a new auto complete builder
>> +        *
>> +        * @return the auto complete builder
>> +        */
>> +       public static AutoCompleteBuilder init()
>> +       {
>> +               return new AutoCompleteBuilder();
>> +       }
>> +
>> +       /**
>> +        * Empties out the autocomplete outcome
>> +        *
>> +        * @return the auto complete builder
>> +        */
>> +       public AutoCompleteBuilder empty()
>> +       {
>> +               this.empty = true;
>>
>
> The way 'empty' works seems incomplete.
> Each `with**` method should set it to 'false'.
>
>
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Applies a section to the auto completion field
>> +        *
>> +        * @param sectionName
>> +        *            the name of the section
>> +        * @return the auto complete builder itself
>> +        */
>> +       public AutoCompleteBuilder withSection(String sectionName)
>> +       {
>> +               this.sectionName = sectionName;
>>
>
> Such assignments need check for non-emptiness.
> If the value is "" then it will pass the check for '!= null' in toString()
> and produce wrong output.
>
>
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Assigns the auto completion to a specific address type
>> +        *
>> +        * @param addressType
>> +        *            the auto completion address type
>> +        * @return the auto complete builder itself
>> +        */
>> +       public AutoCompleteBuilder forAddressType(AutoCompleteAddressType
>> addressType)
>> +       {
>> +               this.addressType = addressType;
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Applies the field to the autocomplete attribute
>> +        *
>> +        * @param field
>> +        *            the field
>> +        * @return the auto complete builder
>> +        */
>> +       public AutoCompleteBuilder forField(AutoCompleteFields field)
>> +       {
>> +               this.field = field;
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * Applies the contact information to the autocomplete attribute
>> +        *
>> +        * @param contact
>> +        *            the contact information are going to be applied to
>> +        * @return the auto complete builder
>> +        */
>> +       public AutoCompleteContactBuilder forContact(AutoCompleteContact
>> contact)
>> +       {
>> +               this.contact = contact;
>> +               return this;
>> +       }
>> +
>> +       /**
>> +        * @see {@link AutoCompleteContactBuilder}
>> +        */
>> +       @Override
>> +       public AutoCompleteContactBuilder forField(AutoCompleteContactDetails
>> contactDetail)
>> +       {
>> +               this.contactDetail = contactDetail;
>> +               return (AutoCompleteContactBuilder)this;
>> +       }
>> +
>> +       /**
>> +        * Builds the attribute string
>> +        *
>> +        * @return the attribute content in the right order
>> +        */
>> +       @Override
>> +       public String toString()
>> +       {
>> +               StringBuilder stringBuilder = new StringBuilder();
>> +               if (!empty)
>> +               {
>> +                       if (sectionName != null)
>> +                       {
>> +                               stringBuilder.append(SECTION_PREFIX);
>> +                               stringBuilder.append(sectionName);
>> +                               stringBuilder.append(" ");
>>
>
> Append char instead, i.e. ' '.
>
>
>> +                       }
>> +                       if (addressType != null)
>> +                       {
>> +                               stringBuilder.append(addressT
>> ype.getValue());
>> +                               stringBuilder.append(" ");
>> +                       }
>> +                       if (field != null)
>> +                       {
>> +                               stringBuilder.append(field.getValue());
>> +                       }
>> +                       else
>> +                       {
>> +                               if (contact != null)
>> +                               {
>> +                                       stringBuilder.append(contact.
>> getValue());
>> +                                       stringBuilder.append(" ");
>> +                               }
>> +                               stringBuilder.append(contactD
>> etail.getValue());
>>
>
> Is it allowed to have contactDetail without a contact ?
>
>
>> +                       }
>> +               }
>> +               return stringBuilder.toString();
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteContact.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteContact.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContact.java
>> new file mode 100644
>> index 0000000..cbf86a5
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContact.java
>> @@ -0,0 +1,77 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion contact according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteContact {
>> +
>> +       /**
>> +        * meaning the field is for contacting someone at their residence
>> +        */
>> +       HOME("home"),
>> +
>> +       /**
>> +        * meaning the field is for contacting someone at their workplace
>> +        */
>> +       WORK("work"),
>> +
>> +       /**
>> +        * meaning the field is for contacting someone regardless of
>> location
>> +        */
>> +       MOBILE("mobile"),
>> +
>> +       /**
>> +        * meaning the field describes a fax machine's contact details
>> +        */
>> +       FAX("fax"),
>> +
>> +       /**
>> +        * meaning the field describes a pager's or beeper's contact
>> details
>> +        */
>> +       PAGER("pager");
>> +
>> +       private String value;
>> +
>> +       /**
>> +        * Creates an auto completion contact with the given value
>> +        *
>> +        * @param value
>> +        *            the value of the contact
>> +        */
>> +       private AutoCompleteContact(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the value of the auto completion contact
>> +        *
>> +        * @return the value of the auto completion contact
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteContactBuilder.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactBuilder.java b/wicket-core/src/main/java/or
>> g/apache/wicket/markup/html/form/AutoCompleteContactBuilder.java
>> new file mode 100644
>> index 0000000..07324ff
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactBuilder.java
>> @@ -0,0 +1,38 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * The auto complete contact builder shrinks down the possibilities to
>> the contact details
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @since 8.0.0
>> + *
>> + */
>> +public interface AutoCompleteContactBuilder
>> +{
>> +       /**
>> +        * Applies the contact details information to the auto complete
>> field
>> +        *
>> +        * @param contactDetail
>> +        *            the contact detail
>> +        * @return the auto complete builder contact
>> +        */
>> +       AutoCompleteContactBuilder forField(AutoCompleteContactDetails
>> contactDetail);
>> +
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteContactDetails.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactDetails.java b/wicket-core/src/main/java/or
>> g/apache/wicket/markup/html/form/AutoCompleteContactDetails.java
>> new file mode 100644
>> index 0000000..e4d5e44
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteContactDetails.java
>> @@ -0,0 +1,102 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion contact detail according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteContactDetails {
>> +
>> +       /**
>> +        * +1 617 253 5702
>
>
> Prefix it with "E.g."
>
>
>>
>> +        */
>> +       TEL("tel"),
>> +
>> +       /**
>> +        * +1
>> +        */
>> +       TEL_COUNTRY_CODE("tel-country-code"),
>> +
>> +       /**
>> +        * 617 253 5702
>> +        */
>> +       TEL_NATIONAL("tel-national"),
>> +
>> +       /**
>> +        * 617
>> +        */
>> +       TEL_AREA_CODE("tel-area-code"),
>> +
>> +       /**
>> +        * 2535702
>> +        */
>> +       TEL_LOCAL("tel-local"),
>> +
>> +       /**
>> +        * 253
>> +        */
>> +       TEL_LOCAL_PREFIX("tel-local-prefix"),
>> +
>> +       /**
>> +        * 5702
>> +        */
>> +       TEL_LOCAL_SUFFIX("tel-local-suffix"),
>> +
>> +       /**
>> +        * 1000
>> +        */
>> +       TEL_EXTENSION("tel-extension"),
>> +
>> +       /**
>> +        * timbl@w3.org
>> +        */
>> +       EMAIL("email"),
>> +
>> +       /**
>> +        * irc://example.org/timbl,isuser
>> +        */
>> +       IMPP("impp");
>> +
>> +       private String value;
>> +
>> +       /**
>> +        * Creates an auto completion contact detail with the given value
>> +        *
>> +        * @param value
>> +        *            the value of the contact detail
>> +        */
>> +       private AutoCompleteContactDetails(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the value of the auto completion contact detail
>> +        *
>> +        * @return the value of the auto completion contact detail
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /AutoCompleteFields.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/AutoCompleteFields.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteFields.java
>> new file mode 100644
>> index 0000000..8f794c4
>> --- /dev/null
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/AutoCompleteFields.java
>> @@ -0,0 +1,272 @@
>> +/*
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form;
>> +
>> +/**
>> + * Auto completion personal data according to the whatwg specification.
>> + *
>> + * @author Tobias Soloschenko
>> + *
>> + * @see <a href=
>> + *      "https://html.spec.whatwg.org/multipage/forms.html">https://
>> html.spec.whatwg.org/multipage/forms.html</a>
>> + *
>> + */
>> +public enum AutoCompleteFields {
>> +
>> +       /**
>> +        * Simply turns on the auto completion
>> +        */
>> +       ON("on"),
>> +
>> +       /**
>> +        * Simply turns off the auto completion
>> +        */
>> +       OFF("off"),
>> +
>> +       /**
>> +        * Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA
>> +        */
>> +       NAME("name"),
>> +
>> +       /**
>> +        * Sir
>> +        */
>> +       HONORIFIC_PREFIX("honorific-prefix"),
>> +
>> +       /**
>> +        * Timothy
>> +        */
>> +       GIVEN_NAME("given-name"),
>> +
>> +       /**
>> +        * John
>> +        */
>> +       ADDITIONAL_NAME("additional-name"),
>> +
>> +       /**
>> +        * Berners-Lee
>> +        */
>> +       FAMILY_NAME("family-name"),
>> +
>> +       /**
>> +        * OM, KBE, FRS, FREng, FRSA
>> +        */
>> +       HONORIFIC_SUFFIX("honorific-suffix"),
>> +
>> +       /**
>> +        * Tim
>> +        */
>> +       NICKNAME("nickname"),
>> +
>> +       /**
>> +        * timbl
>> +        */
>> +       USERNAME("username"),
>> +
>> +       /**
>> +        * GUMFXbadyrS3
>> +        */
>> +       NEW_PASSWORD("new-password"),
>> +
>> +       /**
>> +        * qwerty
>> +        */
>> +       CURRENT_PASSWORD("current-password"),
>> +
>> +       /**
>> +        * Professor
>> +        */
>> +       ORGANIZATION_TITLE("organization-title"),
>> +
>> +       /**
>> +        * World Wide Web Consortium
>> +        */
>> +       ORGANIZATION("organization"),
>> +
>> +       /**
>> +        * Multiple lines 32 Vassar Street MIT Room 32-G524
>> +        */
>> +       STREET_ADDRESS("street-address"),
>> +
>> +       /**
>> +        * 32 Vassar Street
>> +        */
>> +       ADDRESS_LINE1("address-line1"),
>> +
>> +       /**
>> +        * MIT Room 32-G524
>> +        */
>> +       ADDRESS_LINE2("address-line2"),
>> +
>> +       /**
>> +        * See {@link AutoComplete.ADRESS_LINE2}
>> +        */
>> +       ADDRESS_LINE3("address-line3"),
>> +
>> +       /**
>> +        * The most fine-grained administrative level, in addresses with
>> four administrative levels
>> +        */
>> +       ADDRESS_LEVEL4("address-level4"),
>> +
>> +       /**
>> +        * The third administrative level, in addresses with three or
>> more administrative levels
>> +        */
>> +       ADDRESS_LEVEL3("address-level3"),
>> +
>> +       /**
>> +        * Cambridge
>> +        */
>> +       ADDRESS_LEVEL2("address-level2"),
>> +
>> +       /**
>> +        * MA
>> +        */
>> +       ADDRESS_LEVEL1("address-level1"),
>> +
>> +       /**
>> +        * US
>> +        */
>> +       COUNTRY("country"),
>> +
>> +       /**
>> +        * US
>> +        */
>> +       COUNTRY_NAME("country-name"),
>> +
>> +       /**
>> +        * 02139
>> +        */
>> +       POSTAL_CODE("postal-code"),
>> +
>> +       /**
>> +        * Tim Berners-Lee
>> +        */
>> +       CC_NAME("cc-name"),
>> +
>> +       /**
>> +        * Tim
>> +        */
>> +       CC_GIVEN_NAME("cc-given-name"),
>> +
>> +       /**
>> +        * -
>> +        */
>> +       CC_ADDITIONAL_NAME("cc-additional-name"),
>> +
>> +       /**
>> +        * Berners-Lee
>> +        */
>> +       CC_FAMILY_NAME("cc-family-name"),
>> +
>> +       /**
>> +        * 4114360123456785
>> +        */
>> +       CC_NUMBER("cc-number"),
>> +
>> +       /**
>> +        * 2014-12
>> +        */
>> +       CC_EXP("cc-exp"),
>> +
>> +       /**
>> +        * 12
>> +        */
>> +       CC_EXP_MONTH("cc-exp-month"),
>> +
>> +       /**
>> +        * 2014
>> +        */
>> +       CC_EXP_YEAR("cc-exp-year"),
>> +
>> +       /**
>> +        * 419
>> +        */
>> +       CC_CSC("cc-csc"),
>> +
>> +       /**
>> +        * Visa
>> +        */
>> +       CC_TYPE("cc-type"),
>> +
>> +       /**
>> +        * GBP
>> +        */
>> +       TRANSACTION_CURRENCY("transaction-currency"),
>> +
>> +       /**
>> +        * 401.00
>> +        */
>> +       TRANSACTION_AMOUNT("transaction-amount"),
>> +
>> +       /**
>> +        * en
>> +        */
>> +       LANGUAGE("language"),
>> +
>> +       /**
>> +        * 1955-06-08
>> +        */
>> +       BDAY("bday"),
>> +
>> +       /**
>> +        * 8
>> +        */
>> +       BDAY_DAY("bday-day"),
>> +
>> +       /**
>> +        * 6
>> +        */
>> +       BDAY_MONTH("bday-month"),
>> +
>> +       /**
>> +        * 1955
>> +        */
>> +       BDAY_YEAR("bday-year"),
>> +
>> +       /**
>> +        * Male
>> +        */
>> +       SEX("sex"),
>> +
>> +       /**
>> +        * https://www.w3.org/People/Berners-Lee/
>> +        */
>> +       URL("url"),
>> +
>> +       /**
>> +        * https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-ei
>> ghth.jpg
>> +        */
>> +       PHOTO("photo");
>> +
>> +       private String value;
>> +
>> +       private AutoCompleteFields(String value)
>> +       {
>> +               this.value = value;
>> +       }
>> +
>> +       /**
>> +        * Gets the value of the auto completion
>> +        *
>> +        * @return the value of the auto completion
>> +        */
>> +       public String getValue()
>> +       {
>> +               return value;
>> +       }
>> +
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
>> index e8b61e7..1d3284a 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/Form.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/Form.java
>> @@ -1352,6 +1352,14 @@ public class Form<T> extends WebMarkupContainer
>>         }
>>
>>         /**
>> +        * Gets the value of the autocomplete attribute. The default
>> behavior is that it is turned off
>> +        * @return AutoCompleteBuilder the builder to generate the
>> autocomplete attribute information
>> +        */
>> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
>> +               return AutoCompleteBuilder.init().empty();
>>
>
> Since there is no way to set empty=false at the moment this definitely
> doesn't work.
> Some tests for the builders would be nice!
>
>
>> +       }
>> +
>> +       /**
>>          *
>>          * @see org.apache.wicket.Component#getStatelessHint()
>>          */
>> @@ -1633,6 +1641,12 @@ public class Form<T> extends WebMarkupContainer
>>                                         setMultiPart(true);
>>                                 }
>>                         }
>> +
>> +                       // Auto completion support
>> +                       String autocompleteValue =
>> getAutoCompleteBuilder().toString();
>> +                       if(!autocompleteValue.isEmpty()){
>> +                               tag.put("autocomplete",
>> autocompleteValue);
>> +                       }
>>                 }
>>                 else
>>                 {
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/main/java/org/apache/wicket/markup/html/form
>> /TextField.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/TextField.java
>> b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/TextField.java
>> index 81dc828..719560c 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/TextField.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/fo
>> rm/TextField.java
>> @@ -107,6 +107,12 @@ public class TextField<T> extends
>> AbstractTextComponent<T>
>>
>>                 tag.put("value", getValue());
>>
>> +               // Auto completion support
>> +               String autocompleteValue = getAutoCompleteBuilder().toStr
>> ing();
>> +               if(!autocompleteValue.isEmpty()){
>> +                       tag.put("autocomplete", autocompleteValue);
>> +               }
>> +
>>                 // Default handling for component tag
>>                 super.onComponentTag(tag);
>>         }
>> @@ -121,4 +127,12 @@ public class TextField<T> extends
>> AbstractTextComponent<T>
>>         {
>>                 return null;
>>         }
>> +
>> +       /**
>> +        * Gets the value of the autocomplete attribute. The default
>> behavior is that it is turned off
>> +        * @return AutoCompleteBuilder the builder to generate the
>> autocomplete attribute information
>> +        */
>> +       protected AutoCompleteBuilder getAutoCompleteBuilder(){
>> +               return AutoCompleteBuilder.init().empty();
>> +       }
>>  }
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/test/java/org/apache/wicket/markup/html/form
>> /FormTest.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormTest.java
>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/FormTest.java
>> index 05344a5..2ee420a 100644
>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/FormTest.java
>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/FormTest.java
>> @@ -53,6 +53,39 @@ public class FormTest extends WicketTestCase
>>                 };
>>         }
>>
>> +       /**
>> +        * Test auto complete functionality
>> +        */
>> +       @Test
>> +       public void testAutoComplete(){
>> +               class TestPage extends WebPage implements
>> IMarkupResourceStreamProvider
>> +               {
>> +                       boolean shouldFail, submit, error;
>> +
>> +                       public TestPage()
>> +                       {
>> +                               add(new Form<Void>("form")
>> +                               {
>> +                                       @Override
>> +                                       protected AutoCompleteBuilder
>> getAutoCompleteBuilder()
>> +                                       {
>> +                                               return
>> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
>> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>> +                                       }
>> +                               });
>> +                       }
>> +
>> +                       @Override
>> +                       public IResourceStream
>> getMarkupResourceStream(final MarkupContainer container,
>> +                               Class<?> containerClass)
>> +                       {
>> +                               return new StringResourceStream("<form
>> wicket:id='form'></form>");
>> +                       }
>> +               }
>> +
>> +               TestPage testPage = new TestPage();
>> +               tester.startPage(testPage);
>> +               assertTrue(tester.getLastResp
>> onseAsString().contains("autocomplete=\"billing given-name\""));
>> +       }
>>
>>         /**
>>          * @throws Exception
>> @@ -115,6 +148,12 @@ public class FormTest extends WicketTestCase
>>                                         {
>>                                                 error = true;
>>                                         }
>> +
>> +                                       @Override
>> +                                       protected AutoCompleteBuilder
>> getAutoCompleteBuilder()
>> +                                       {
>> +                                               return
>> AutoCompleteBuilder.init().forAddressType(AutoCompleteAddres
>> sType.BILLING).forField(AutoCompleteFields.GIVEN_NAME);
>> +                                       }
>>                                 });
>>                         }
>>
>>
>> http://git-wip-us.apache.org/repos/asf/wicket/blob/bcd55813/
>> wicket-core/src/test/java/org/apache/wicket/markup/html/form
>> /TextFieldTest.java
>> ----------------------------------------------------------------------
>> diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/TextFieldTest.java
>> b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/TextFieldTest.java
>> index 5af5917..2c215e5 100644
>> --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/TextFieldTest.java
>> +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/fo
>> rm/TextFieldTest.java
>> @@ -36,7 +36,20 @@ import org.junit.Test;
>>   */
>>  public class TextFieldTest extends WicketTestCase
>>  {
>> -       /** */
>> +
>> +       /**
>> +        * Test auto complete feature
>> +        */
>> +       @Test
>> +       public void testAutoComplete(){
>> +               TestPage testPage = new TestPage();
>> +               tester.startPage(testPage);
>> +               assertTrue(tester.getLastResp
>> onseAsString().contains("autocomplete=\"section-blue billing name\""));
>> +       }
>> +
>> +       /**
>> +        * Test that inputs are converted to null
>> +        * */
>>         @Test
>>         public void emptyInputConvertedToNull()
>>         {
>> @@ -111,7 +124,13 @@ public class TextFieldTest extends WicketTestCase
>>                 public TestPage()
>>                 {
>>                         add(form = new Form<>("form"));
>> -                       form.add(textField = new TextField<>("text",
>> textModel));
>> +                       form.add(textField = new
>> TextField<String>("text", textModel){
>> +                               @Override
>> +                               protected AutoCompleteBuilder
>> getAutoCompleteBuilder()
>> +                               {
>> +                                       return
>> AutoCompleteBuilder.init().withSection("blue").forAddressTyp
>> e(AutoCompleteAddressType.BILLING).forField(AutoCompleteFields.NAME);
>> +                               }
>> +                       });
>>                 }
>>
>>                 @Override
>>
>>
>