Click
  1. Click
  2. CLK-527

FormTable sort fields are not populated for render

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.5
    • Fix Version/s: 2.1.0, 2.1.0 RC1, 1.5.2
    • Component/s: core
    • Labels:
      None

      Description

      On an instance of FormTable we have the capability to set the sorted column, sorted ascending, and page number values. These methods are inherited from the Table class but no overridden methods are provided in Form Table.

      When the form table is rendered there are hidden form fields defined which are intended to store the values of these properties but the values of these hidden fields don't ever seem to be set. These hidden fields get rendered in the startTag() method of the internal form...

      buffer.append(getForm().startTag());

      Because these fields are not populated, the submit function is not aware of any sorting that has been applied to the table and the values are often populated into the wrong underlying objects if the default sorting of the table is not the same as the explicit sorting of the table.

      I've resolved this for my application by subclassing FormTable and overriding the 3 relevant methods as follows:

      public void setSortedColumn(String columnName) {
      Field field = (Field)getForm().getFields().get(COLUMN);
      if(field != null)

      { field.setValue(columnName); }

      setSorted(false);
      super.setSortedColumn(columnName);
      }

      public void setSortedAscending(boolean ascending) {
      Field field = (Field)getForm().getFields().get(ASCENDING);
      if(field != null)

      { field.setValue("" + ascending); }

      setSorted(false);
      super.setSortedAscending(ascending);
      }

      public void setPageNumber(int pageNumber) {
      Field field = (Field)getForm().getFields().get(PAGE);
      if(field != null)

      { field.setValue("" + pageNumber); }

      super.setPageNumber(pageNumber);
      }

      These overridden methods should be in FormTable to resolve this bug. I have been working with version 1.5 so it may already be resolved in a later version.

      Note also that I am calling setSorted(false) in the first 2 methods.

      BW.

        Activity

        Hide
        Bob Schellink added a comment -

        Thanks Ben.

        Regarding the setSorted(false) calls, why is that needed? Did you run into issues if this was not set?

        kind regards

        bob

        Show
        Bob Schellink added a comment - Thanks Ben. Regarding the setSorted(false) calls, why is that needed? Did you run into issues if this was not set? kind regards bob
        Hide
        Ben Warner added a comment -

        Hey Bob,

        Yes I did have issues with this. The setSortedColumn method on Table looks like this:

        public void setSortedColumn(String value)

        { sortedColumn = value; }

        Changing the sort column does not update the sorted value to false.

        The render method calls sortRowList() before rendering the body rows:

        protected void sortRowList() {
        if (!isSorted() && StringUtils.isNotBlank(getSortedColumn()))

        { Column column = (Column) getColumns().get(getSortedColumn()); Collections.sort(getRowList(), column.getComparator()); setSorted(true); }

        }

        The first time this method gets called it will set the 'sorted' variable to true and no matter how many times you change the sort column or direction this 'sorted' variable does not get re-initialised. The second time we come into sortRowList() the list only gets sorted if the isSorted() method returns false:

        public boolean isSorted()

        { return sorted; }

        So, if you change the sort column between when the table was first sorted and when it was rendered, the new sort order will not be reflected in the table. There lies the problem.

        Regards,
        BW.

        Show
        Ben Warner added a comment - Hey Bob, Yes I did have issues with this. The setSortedColumn method on Table looks like this: public void setSortedColumn(String value) { sortedColumn = value; } Changing the sort column does not update the sorted value to false. The render method calls sortRowList() before rendering the body rows: protected void sortRowList() { if (!isSorted() && StringUtils.isNotBlank(getSortedColumn())) { Column column = (Column) getColumns().get(getSortedColumn()); Collections.sort(getRowList(), column.getComparator()); setSorted(true); } } The first time this method gets called it will set the 'sorted' variable to true and no matter how many times you change the sort column or direction this 'sorted' variable does not get re-initialised. The second time we come into sortRowList() the list only gets sorted if the isSorted() method returns false: public boolean isSorted() { return sorted; } So, if you change the sort column between when the table was first sorted and when it was rendered, the new sort order will not be reflected in the table. There lies the problem. Regards, BW.
        Hide
        Bob Schellink added a comment -

        Thanks for the clarification Ben.

        Fixed in trunk and backported to 1.5.2 and 2.0.2

        Show
        Bob Schellink added a comment - Thanks for the clarification Ben. Fixed in trunk and backported to 1.5.2 and 2.0.2

          People

          • Assignee:
            Bob Schellink
            Reporter:
            Ben Warner
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development