package sushi.application.pages.eventrepository;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
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.basic.Label;
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.eventrepository.model.EventFilter;
import sushi.application.pages.eventrepository.model.EventProvider;
import sushi.event.SushiEvent;
/**
* {@link Panel}, which shows the {@link SushiEvent}s stored in the database.
*/
public class EventPanel extends Panel {
private static final long serialVersionUID = 1L;
private List<IColumn<SushiEvent, String>> columns;
private DefaultDataTable<SushiEvent, String> dataTable;
private EventFilter eventFilter;
private EventProvider eventProvider;
private EventRepository eventRepository;
/**
* Constructor for the event panel.
* The page is initialized in this method and the data is loaded from the database.
* @param id
* @param abstractSushiPage
*/
@SuppressWarnings("unchecked")
public EventPanel(String id, final EventRepository abstractSushiPage) {
super(id);
eventProvider = new EventProvider();
eventFilter = new EventFilter();
eventProvider.setEventFilter(eventFilter);
eventRepository = abstractSushiPage;
Form<Void> buttonForm = new WarnOnExitForm("buttonForm");
List<String> eventFilterCriteriaList = new ArrayList<String>(Arrays.asList(new String[] {"ID", "Event Type (ID)", "Process Instance"}));
for(String eventAttribute : SushiEvent.findAllEventAttributes()){
eventFilterCriteriaList.add(eventAttribute);
}
String selectedEventCriteria = "ID";
final DropDownChoice<String> eventFilterCriteriaSelect = new DropDownChoice<String>("eventFilterCriteria", new Model<String>(selectedEventCriteria), eventFilterCriteriaList);
buttonForm.add(eventFilterCriteriaSelect);
List<String> conditions = new ArrayList<String>(Arrays.asList(new String[] { "<", "=", ">" }));
String selectedCondition = "=";
final DropDownChoice<String> eventFilterConditionSelect = new DropDownChoice<String>("eventFilterCondition", 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) {
String eventFilterCriteria = eventFilterCriteriaSelect.getChoices().get(Integer.parseInt(eventFilterCriteriaSelect.getValue()));
String eventFilterCondition = eventFilterConditionSelect.getChoices().get(Integer.parseInt(eventFilterConditionSelect.getValue()));
String filterValue = searchValueInput.getValue();
eventProvider.setEventFilter(new EventFilter(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);;
eventProvider.setEventFilter(new EventFilter());
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);;
eventProvider.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) {
eventProvider.selectAllEntries();
target.add(dataTable);
}
};
buttonForm.add(selectAllButton);
add(buttonForm);
columns = new ArrayList<IColumn<SushiEvent, String>>();
columns.add(new PropertyColumn<SushiEvent, String>(Model.of("ID"), "ID"));
columns.add(new PropertyColumn<SushiEvent, String>(Model.of("Timestamp"), "timestamp"));
columns.add(new PropertyColumn<SushiEvent, String>(Model.of("EventType"), "eventType"));
columns.add(new AbstractColumn<SushiEvent, String>(Model.of("Values"), "values") {
@Override
public void populateItem(final Item<ICellPopulator<SushiEvent>> item, final String componentId,
final IModel<SushiEvent> rowModel)
{
String shortenedValues = ((SushiEvent) rowModel.getObject()).getValues().toString();
if (shortenedValues.length() > 200) {
shortenedValues = shortenedValues.substring(0, 200) + "...";
}
Label label = new Label(componentId, shortenedValues);
label.add(new AjaxEventBehavior("onclick") {
protected void onEvent(AjaxRequestTarget target) {
//on click open Event View Modal
eventRepository.getEventViewModal().getPanel().setEvent(rowModel.getObject());
eventRepository.getEventViewModal().getPanel().detach();
target.add(eventRepository.getEventViewModal().getPanel());
eventRepository.getEventViewModal().show(target);
}
});
item.add(label);
}
}
);
columns.add(new PropertyColumn<SushiEvent, String>(Model.of("Process Instances"), "processInstances"));
columns.add(new AbstractColumn<SushiEvent, String>(new Model("Select")) {
@Override
public void populateItem(Item cellItem, String componentId, IModel rowModel) {
int entryId = ((SushiEvent) rowModel.getObject()).getID();
cellItem.add(new SelectEntryPanel(componentId, entryId, eventProvider));
};
});
dataTable = new DefaultDataTable<SushiEvent, String>("events", columns, eventProvider, 20);
dataTable.setOutputMarkupId(true);
add(dataTable);
}
};