Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-4802

Add functionality to be able to export DataTable content

    Details

    • Type: New Feature
    • Status: Resolved
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 6.1.0
    • Fix Version/s: 6.2.0
    • Component/s: wicket-extensions
    • Labels:
      None

      Description

      In Igor's book he describes a way of exporting a data table to CSV. It requires tagging exportable columns with a interface, which allows retrieving of the data for the column by passing it the row model.

      I, and I'm sure many others, have implemented this functionality, and we all have our own CSVExportToolbar, or something similar. The problem is that each export implementation is checking for instances of their own hand-crafted IDataColumn interface. This makes it difficult for people to write libraries that provide columns that will be exportable across the board.

      I propose that we add a standard IDataColumn that can be used to tagging exportable columns, and which every CSVExportToolbar and ExcelExportToolbar etc can check for when determining which columns to use to export.

      Something like:

      /** does not need sort parameter, does not need to extend IColumn */
      public interface IDataColumn<R, T>
      {
      /** get data for row by passing row model, in imodel format to allow this method to be used for rendering in an abstract implementation. */
      IModel<T> getDataModel(IModel<R> rowModel);

      /** get column header, useful in exporting. same signature as AbstractColumn method */
      IModel<String> getDisplayModel();
      }

      Then an abstract implementation, where the user only needs to implement getDataModel()

      public abstract class AbstractDataColumn<R, S, T>
      extends AbstractColumn<R, S>
      implements IDataColumn<R, T>
      {
      // normal AbstractColumn constructors.

      protected Component createNewDisplayComponent(String componentId, IModel<T> dataModel)

      { return new Label(componentId, dataModel); }

      @Override
      public void populateItem(Item<ICellPopulator<R>> cellItem, String componentId, IModel<R> rowModel)

      { cellItem.add(createNewDisplayComponent(componentId, getDataModel(rowModel))); }

      }

        Attachments

        1. WICKET-4802-3.patch
          8 kB
          Jesse Long
        2. WICKET-4802.patch
          3 kB
          Martin Grigorov
        3. WICKET-4802.patch
          40 kB
          Jesse Long

          Activity

            People

            • Assignee:
              mgrigorov Martin Grigorov
              Reporter:
              jesselong Jesse Long
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: