package sushi.application.pages.eventrepository;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import sushi.application.components.form.BlockingAjaxButton;
import sushi.application.components.form.WarnOnExitForm;
import sushi.application.components.table.SelectEntryPanel;
import sushi.application.pages.AbstractSushiPage;
import sushi.application.pages.eventrepository.model.ProcessInstanceFilter;
import sushi.application.pages.eventrepository.model.ProcessInstanceProvider;
import sushi.process.SushiProcessInstance;
/**
* {@link Panel}, which shows the {@link SushiProcessInstance}s stored in the database.
*/
public class ProcessInstancePanel extends Panel {
private static final long serialVersionUID = 1L;
private List<IColumn<SushiProcessInstance, String>> columns;
private ProcessInstanceFilter processInstanceFilter;
private ProcessInstanceProvider processInstanceProvider;
private DefaultDataTable<SushiProcessInstance, String> dataTable;
/**
* Constructor for the process instance panel.
* The page is initialized in this method and the data is loaded from the database.
* @param id
* @param abstractSushiPage
*/
public ProcessInstancePanel(String id, final AbstractSushiPage abstractSushiPage) {
super(id);
processInstanceProvider = new ProcessInstanceProvider();
processInstanceFilter = new ProcessInstanceFilter();
processInstanceProvider.setProcessInstanceFilter(processInstanceFilter);
Form<Void> buttonForm = new WarnOnExitForm("buttonForm");
List<String> processFilterCriteriaList = new ArrayList<String>(Arrays.asList(new String[] { "ID", "Process", "Process (ID)"}));
String selectedEventCriteria = "ID";
final DropDownChoice<String> eventTypeFilterCriteriaSelect = new DropDownChoice<String>("processInstanceFilterCriteria", new Model<String>(selectedEventCriteria), processFilterCriteriaList);
buttonForm.add(eventTypeFilterCriteriaSelect);
List<String> conditions = new ArrayList<String>(Arrays.asList(new String[] { "<", "=", ">" }));
String selectedCondition = "=";
final DropDownChoice<String> eventFilterConditionSelect = new DropDownChoice<String>("processInstanceFilterCondition", new Model<String>(selectedCondition), conditions);
buttonForm.add(eventFilterConditionSelect);
final TextField<String> searchValueInput = new TextField<String>("searchValueInput", Model.of(""));
buttonForm.add(searchValueInput);
AjaxButton filterButton = new AjaxButton("filterButton", buttonForm) {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
super.onSubmit(target, form);
String eventFilterCriteria = eventTypeFilterCriteriaSelect.getChoices().get(Integer.parseInt(eventTypeFilterCriteriaSelect.getValue()));
String eventFilterCondition = eventFilterConditionSelect.getChoices().get(Integer.parseInt(eventFilterConditionSelect.getValue()));
String filterValue = searchValueInput.getValue();
processInstanceProvider.setProcessInstanceFilter(new ProcessInstanceFilter(eventFilterCriteria,eventFilterCondition, filterValue));
target.add(dataTable);
}
};
buttonForm.add(filterButton);
AjaxButton resetButton = new BlockingAjaxButton("resetButton", buttonForm) {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
super.onSubmit(target, form);
processInstanceProvider.setProcessInstanceFilter(new ProcessInstanceFilter());
target.add(dataTable);
}
};
buttonForm.add(resetButton);
AjaxButton deleteButton = new BlockingAjaxButton("deleteButton", buttonForm) {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
super.onSubmit(target, form);
processInstanceProvider.deleteSelectedEntries();
target.add(dataTable);
}
};
buttonForm.add(deleteButton);
AjaxButton selectAllButton = new AjaxButton("selectAllButton", buttonForm) {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
super.onSubmit(target, form);
processInstanceProvider.selectAllEntries();
target.add(dataTable);
}
};
buttonForm.add(selectAllButton);
add(buttonForm);
columns = new ArrayList<IColumn<SushiProcessInstance, String>>();
columns.add(new PropertyColumn<SushiProcessInstance, String>(Model.of("ID"), "ID"));
columns.add(new PropertyColumn<SushiProcessInstance, String>(Model.of("Process"), "process"));
columns.add(new PropertyColumn<SushiProcessInstance, String>(Model.of("Correlation Attributes"), "correlationAttributesAndValues"));
columns.add(new PropertyColumn<SushiProcessInstance, String>(Model.of("Timer Event"), "timerEvent"));
columns.add(new AbstractColumn<SushiProcessInstance, String>(new Model("Select")) {
@Override
public void populateItem(Item cellItem, String componentId, IModel rowModel) {
int entryId = ((SushiProcessInstance) rowModel.getObject()).getID();
cellItem.add(new SelectEntryPanel(componentId, entryId, processInstanceProvider));
}
});
dataTable = new DefaultDataTable<SushiProcessInstance, String>("processInstances", columns, new ProcessInstanceProvider(), 20);
dataTable.setOutputMarkupId(true);
add(dataTable);
}
};