package org.brixcms.plugin.jpa.web.admin.filter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.brixcms.plugin.jpa.JpaPluginLocator;
import org.brixcms.plugin.jpa.Persistable;
/**
* @author dan.simko@gmail.com
*/
@SuppressWarnings("serial")
public class FilterPanel<T extends Persistable<ID>, ID extends Serializable, F extends Serializable> extends Panel {
private final List<FilterPluginEntry<T, ID, F>> entries = new ArrayList<>();
public FilterPanel(String id, JpaPluginLocator<T, ID, F> pluginLocator) {
super(id);
Form<Void> form = new Form<Void>("form") {
@Override
protected void onSubmit() {
sendFilterChangedEvent();
}
};
add(form);
RepeatingView filters = new RepeatingView("filters");
form.add(filters);
form.add(new Link<Void>("clear") {
@Override
public void onClick() {
for (FilterPluginEntry<T, ID, F> entry : entries) {
entry.setFilter(entry.getPlugin().newFilter());
}
sendFilterChangedEvent();
}
});
for (FilterPlugin<T, ID, F> plugin : pluginLocator.getPlugin().getFilterPlugins()) {
FilterPluginEntry<T, ID, F> entry = new FilterPluginEntry<>(pluginLocator, plugin);
entries.add(entry);
IModel<F> filterModel = new PropertyModel<F>(entry, "filter");
filters.add(plugin.newFilterPanel(filters.newChildId(), filterModel));
}
}
private void sendFilterChangedEvent() {
send(getPage(), Broadcast.BREADTH, new FilterChanged<T, ID, F>(entries));
}
public static class FilterChanged<T extends Persistable<ID>, ID extends Serializable, F extends Serializable> implements Serializable {
private final List<FilterPluginEntry<T, ID, F>> entries;
public FilterChanged(List<FilterPluginEntry<T, ID, F>> entries) {
this.entries = entries;
}
public List<FilterPluginEntry<T, ID, F>> getEntries() {
return entries;
}
}
public static class FilterPluginEntry<T extends Persistable<ID>, ID extends Serializable, F extends Serializable>
implements Serializable {
private final JpaPluginLocator<T, ID, F> pluginLocator;
private final String pluginId;
private F filter;
public FilterPluginEntry(JpaPluginLocator<T, ID, F> pluginLocator, FilterPlugin<T, ID, F> plugin) {
this.pluginLocator = pluginLocator;
this.pluginId = plugin.getPluginId();
this.filter = plugin.newFilter();
}
public FilterPlugin<T, ID, F> getPlugin() {
return pluginLocator.getPlugin().getFilterPluginById(pluginId);
}
public void setFilter(F filter) {
this.filter = filter;
}
public F getFilter() {
return filter;
}
}
}