Hello,
I want to create a table with a filter form.
I used the wicket FilterForm and implemented an own DataProvider. It works fine
for the textfields. I can write some text and press "enter" and the list will
be filtered. But if I make a choice in the selectbox and press "enter"
nothing happened. How can I use a DropDownChoice in the FilterForm?
DataProvider:
public class RouteStateDataProvider extends
SortableDataProvider<RouteStateModel, String> implements
IFilterStateLocator<RouteStateModel> {
/** serialVersionUID */
private static final long serialVersionUID = 6220885802292065166L;
/** Logger which writes on the console. */
private static final Logger log =
LoggerFactory.getLogger(ItemDataProvider.class);
/** The list of all data. */
private List<RouteStateModel> dataList;
/** The class which contains the filter field */
private RouteStateModel filterModel = new RouteStateModel();
/** The comparator for sorting. */
private DAPComparator<RouteStateModel> comparator;
/**
* Constructor which create the data provider and sets the initial sort
column and the sort
* order ascending.
*
* @param dataList list of all rows which should be displayed
* @param startSortField the field name of the initial sort column
*/
public RouteStateDataProvider(List<RouteStateModel> dataList, String
startSortField) {
this.dataList = dataList;
setSort(startSortField, SortOrder.ASCENDING);
comparator = new DAPComparator<RouteStateModel>(this);
}
@Override
public Iterator<RouteStateModel> iterator(long first, long count) {
if (dataList != null) {
Collections.sort(dataList, comparator);
} else {
log.debug("List of data is emtpy!");
}
return this.filterRoutes().subList((int) first, (int) (first +
count)).iterator();
}
/**
* Creates a list which only contains the items with the given id.
*
* @return the filtered item list
*/
private List<RouteStateModel> filterRoutes() {
List<RouteStateModel> resultList = new ArrayList<>();
String camelRouteId = filterModel.getCamelRouteId();
String modulName = filterModel.getModuleName();
TargetState targetState = filterModel.getTargetState();
if(filterModel.isEmpty()) {
return dataList;
} else {
for(RouteStateModel route : dataList) {
boolean inFilter = false;
if(camelRouteId != null) {
if(route.getCamelRouteId().contains(camelRouteId)) {
inFilter = true;
} else {
inFilter = false;
}
}
if(modulName != null) {
if(route.getModuleName().contains(modulName)) {
inFilter = true;
} else {
inFilter = false;
}
}
if(targetState != null) {
if(route.getTargetState().equals(targetState)) {
inFilter = true;
} else {
inFilter = false;
}
}
if(inFilter) {
resultList.add(route);
}
}
return resultList;
}
}
@Override
public long size() {
return this.filterRoutes().size();
}
@Override
public IModel<RouteStateModel> model(RouteStateModel routeStateModel) {
return new Model<RouteStateModel>(routeStateModel);
}
@Override
public RouteStateModel getFilterState() {
return this.filterModel;
}
@Override
public void setFilterState(RouteStateModel routeStateModel) {
this.filterModel = routeStateModel;
}
}
FilterForm:
public class RouteStateForm extends FilterForm<RouteStateModel> {
private IFilterStateLocator<RouteStateModel> locator;
public RouteStateForm(String id, IFilterStateLocator<RouteStateModel>
locator) {
super(id, locator);
this.locator = locator;
addTable();
addTextfields();
addSelectBoxes();
}
/**
* Adds the table to the form.
*/
private void addTable() {
RouteStateTable routeStateTable = new
RouteStateTable("searchTable", this, (SortableDataProvider<RouteStateModel,
String>) locator);
add(routeStateTable.init());
}
/**
* Adds the necessary textfields to the form.
*/
private void addTextfields() {
TextField<String> camelRouteId = new
TextField<>("camelRouteId", PropertyModel.of(locator,
"filterModel.camelRouteId"));
TextField<String> moduleName = new TextField<>("moduleName",
PropertyModel.of(locator, "filterModel.moduleName"));
add(camelRouteId);
add(moduleName);
}
/**
* Adds the additional selectboxes.
*/
private void addSelectBoxes() {
DropDownChoice<TargetState> targetState = new
DropDownChoice<TargetState>("targetState", PropertyModel.of(locator,
"filterModel.targetState"), Arrays.asList(TargetState.values()));
targetState.setChoiceRenderer(new
ChoiceRenderer<TargetState>("guiValue"));
targetState.setNullValid(true);
targetState.setOutputMarkupId(Boolean.TRUE);
add(targetState);
}
}
Mit freundlichen Grüßen
Christoph Manig