Click
  1. Click
  2. CLK-612

Better user experience with DateField (and CalendarField).

    Details

    • Type: Improvement Improvement
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 2.1.0, 2.1.0 RC1
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None

      Description

      Current DateField.validate() is too strict.

      My suggestion is:

      Add two properties:
      1) String prop similarDelimiters:

      its format: [oldChar1][newChar1] [oldChar2][newChar2].... if odd then ignore last char.

      2) boolean prop lenientValidation //def false

      3) Modify setValue (not tested):

      public void setValue(String value) {
      if (value != null && value.length() > 0) {
      value = value.trim();

      if (similarDelimiters != null && similarDelimiters.length > 0) {
      for (int i=0; i<similarDelimiters.length-1; i+=2)

      { value = value.replace(similarDelimiters.charAt(i), similarDelimiters.charAt(i+1)); }

      //f
      }//i

      try

      { Date parsedDate = getDateFormat().parse(value); // Cache date for subsequent retrievals date = new Date(parsedDate.getTime()); }

      catch (ParseException pe)

      { date = null; }

      } else

      { date = null; }

      super.setValue(value);
      }//setValue

      Because people in Russia use different characters (ex: /,-, .(dot)) as date delimiters, not one.

      So I will set similarDelimiters to "-/
      /./" and pattern to dd/MM/yyyy - and it will work.

      4) Modify validate()
      dateFormat.setLenient(lenientValidation);

        Activity

        Hide
        Andrew Fink added a comment -

        + lenientValidation
        lenient should have possibility to tune it too

        Show
        Andrew Fink added a comment - + lenientValidation lenient should have possibility to tune it too
        Hide
        Malcolm Edgar added a comment -

        I think having a lenientValidation property is excellent, as we can introduce this new behaviour without effecting the existing behaviour. I am assuming by default lenientValidation would be false.

        regards Malcolm Edgar

        Show
        Malcolm Edgar added a comment - I think having a lenientValidation property is excellent, as we can introduce this new behaviour without effecting the existing behaviour. I am assuming by default lenientValidation would be false. regards Malcolm Edgar
        Hide
        Andrew Fink added a comment -

        My final request is:

        Please add

        //DateField.java

        private Boolean lenientValidation = false;

        public Boolean isLenientValidation ()

        {return lenientValidation;}

        /**

        • null - don't parse date. Only parent's validate (min,max len and required). Can be useful for soft filters: 2008 ~ since 2008, 2009.02 till feb 2009.
        • true - date will be parsed with lenient = true (less strict).
        • false - strict date validation
          */

        public void setLenientValidation (Boolean value)

        { lenientValidation = value;}

        //@Override public void validate() {

        super.validate();

        if (isValid() && getValue().length() > 0 && lenientValidation != null) {
        SimpleDateFormat dateFormat = getDateFormat();
        dateFormat.setLenient(lenientValidation.booleanValue());

        Show
        Andrew Fink added a comment - My final request is: Please add //DateField.java private Boolean lenientValidation = false; public Boolean isLenientValidation () {return lenientValidation;} /** null - don't parse date. Only parent's validate (min,max len and required). Can be useful for soft filters: 2008 ~ since 2008, 2009.02 till feb 2009. true - date will be parsed with lenient = true (less strict). false - strict date validation */ public void setLenientValidation (Boolean value) { lenientValidation = value;} //@Override public void validate() { super.validate(); if (isValid() && getValue().length() > 0 && lenientValidation != null) { SimpleDateFormat dateFormat = getDateFormat(); dateFormat.setLenient(lenientValidation.booleanValue());
        Hide
        Andrew Fink added a comment -

        Also similarDelimiters property is very friendly. I use it extensively

        private String similarDelimiters;

        public String getSimilarDelimiters ()

        { return similarDelimiters; }

        /** [oldChar1][newChar1] [oldChar2][newChar2] */
        public void setSimilarDelimiters (String value)

        { similarDelimiters = value; }

        @Override public void setValue (String value) {
        if (value != null && value.length() > 0) {
        value = value.trim();

        if (similarDelimiters != null && similarDelimiters.length() > 0) {
        for (int i = 0, m = similarDelimiters.length() - 1; i < m; i += 2)

        { value = value.replace(similarDelimiters.charAt(i), similarDelimiters.charAt(i + 1)); }

        //f
        }//i

        try

        { Date parsedDate = getDateFormat().parse(value); // Cache date for subsequent retrievals date = new Date(parsedDate.getTime()); }

        catch (ParseException pe)

        { date = null; }

        } else

        { date = null; }

        super.setValue(value);
        }//setValue

        Show
        Andrew Fink added a comment - Also similarDelimiters property is very friendly. I use it extensively private String similarDelimiters; public String getSimilarDelimiters () { return similarDelimiters; } /** [oldChar1] [newChar1] [oldChar2] [newChar2] */ public void setSimilarDelimiters (String value) { similarDelimiters = value; } @Override public void setValue (String value) { if (value != null && value.length() > 0) { value = value.trim(); if (similarDelimiters != null && similarDelimiters.length() > 0) { for (int i = 0, m = similarDelimiters.length() - 1; i < m; i += 2) { value = value.replace(similarDelimiters.charAt(i), similarDelimiters.charAt(i + 1)); } //f }//i try { Date parsedDate = getDateFormat().parse(value); // Cache date for subsequent retrievals date = new Date(parsedDate.getTime()); } catch (ParseException pe) { date = null; } } else { date = null; } super.setValue(value); }//setValue

          People

          • Assignee:
            Unassigned
            Reporter:
            Andrew Fink
          • Votes:
            1 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:

              Development