Jesse Long created WICKET-4802:
----------------------------------

             Summary: Standard IDataColumn
                 Key: WICKET-4802
                 URL: https://issues.apache.org/jira/browse/WICKET-4802
             Project: Wicket
          Issue Type: New Feature
          Components: wicket-extensions
    Affects Versions: 6.1.0
            Reporter: Jesse Long
            Priority: Minor


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)));
    }
}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to