Details

    • Type: Improvement Improvement
    • Status: Open
    • Priority: Minor Minor
    • Resolution: Unresolved
    • Affects Version/s: 2.1.0
    • Fix Version/s: None
    • Component/s: core
    • Labels:
      None

      Description

      The Form#copyFormToObject() behaviour can be misleading in two respects.

      When a HTML forms field is disabled, its value is displayed in the browser window but it is not editable and is disable. However when the user submits the form the field value is not submitted even if it is populated. The Form#copyFormToObject() method will actually nullify the target objects property value, as the disabled field has a null value. This is clearly not the expected behaviour.

      The other scenario which is problematic is with readonly fields. By default the Form#copyFormToObject() method will write read only field value into the target objects properties. Sometimes this is not the behaviour you are after, as type coercion behaviour cause errors. For example if you are using a form which has some TextFields showin a date property as a readonly field, when the form is submitted the string value will be set on the target objects property which will cause type coercion issues, or may truncate data. The Form should have an option to not write readonly field values when copying form field values to a target object.

        Activity

        Malcolm Edgar created issue -
        Malcolm Edgar made changes -
        Field Original Value New Value
        Assignee Malcolm Edgar [ medgar ]
        Hide
        Bob Schellink added a comment -

        Hi Malcolm,

        One aspect we need to think about around the disabled attribute, is it is often used to display an initial value in a disabled state, but using JavaScript it can be enabled upon certain conditions. For example, one can display a disabled FieldSet and if the "I Agree" checkbox is checked, the FieldSet is enabled.

        If we do not copy the disabled field value to the target object, this scenario won't work.

        One solution for this could be as follows: in the Field onProcess method we check if there is an incoming request parameter. If there is, we switch off the disabled property and process the Field normally. If there is not and incoming request parameter, we skip the onProcess step.

        Show
        Bob Schellink added a comment - Hi Malcolm, One aspect we need to think about around the disabled attribute, is it is often used to display an initial value in a disabled state, but using JavaScript it can be enabled upon certain conditions. For example, one can display a disabled FieldSet and if the "I Agree" checkbox is checked, the FieldSet is enabled. If we do not copy the disabled field value to the target object, this scenario won't work. One solution for this could be as follows: in the Field onProcess method we check if there is an incoming request parameter. If there is, we switch off the disabled property and process the Field normally. If there is not and incoming request parameter, we skip the onProcess step.
        Bob Schellink made changes -
        Fix Version/s 2.2.0 [ 12314164 ]
        Hide
        Malcolm Edgar added a comment -

        Yeah that is a good point. I think we should probably preserve the existing, but unintuitive behaviour.

        I think the Form object should have some additional properties which can be set to modify the default copyToObject behaviour:

        protected boolean noCopyFromDisabledFields;

        protected boolean noCopyFromReadonlyFields;

        These values would be inspected by the ContailerUtils methods to determine whether field values should be copied.

        Show
        Malcolm Edgar added a comment - Yeah that is a good point. I think we should probably preserve the existing, but unintuitive behaviour. I think the Form object should have some additional properties which can be set to modify the default copyToObject behaviour: protected boolean noCopyFromDisabledFields; protected boolean noCopyFromReadonlyFields; These values would be inspected by the ContailerUtils methods to determine whether field values should be copied.
        Hide
        Bob Schellink added a comment -

        Having Form properties to override defaults could be useful, but an intuitive default will be good.

        According to the spec, the disabled attribute was meant to be used in the context of JavaScript, so catering for this use case make sense. I have a feeling that disabled usage is underutilized because of its strange behavior.

        Show
        Bob Schellink added a comment - Having Form properties to override defaults could be useful, but an intuitive default will be good. According to the spec, the disabled attribute was meant to be used in the context of JavaScript, so catering for this use case make sense. I have a feeling that disabled usage is underutilized because of its strange behavior.
        Hide
        Bob Schellink added a comment -

        Would one really need both properties? Perhaps a noCopy property is enough? A related issue is about having immutable controls so that once the value is set, it cannot be altered. I normally create an ImmutableHiddenField for this purpose, but might be useful for other fields as well.

        Show
        Bob Schellink added a comment - Would one really need both properties? Perhaps a noCopy property is enough? A related issue is about having immutable controls so that once the value is set, it cannot be altered. I normally create an ImmutableHiddenField for this purpose, but might be useful for other fields as well.
        Bob Schellink made changes -
        Fix Version/s 2.3.0 [ 12314845 ]
        Fix Version/s 2.2.0 [ 12314164 ]
        Hide
        Bob Schellink added a comment -

        Removing from 2.3.0-M1 roadmap

        Show
        Bob Schellink added a comment - Removing from 2.3.0-M1 roadmap
        Bob Schellink made changes -
        Fix Version/s 2.3.0-M1 [ 12314845 ]

          People

          • Assignee:
            Malcolm Edgar
            Reporter:
            Malcolm Edgar
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:

              Development