package sushi.application.pages.monitoring.notification;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.Session;
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.SushiAuthenticatedSession;
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.eventview.EventViewModal;
import sushi.notification.SushiNotification;
import sushi.notification.SushiNotificationForEvent;
/**
* List to display notifications on the @see NotificationPage
*/
@SuppressWarnings("serial")
public class NotificationList extends Panel{
private AbstractSushiPage abstractSushiPage;
private EventViewModal eventViewModal;
private Form<Void> notificationForm;
private ArrayList<IColumn<SushiNotification, String>> columns;
public DefaultDataTable<SushiNotification, String> notificationTable;
private NotificationProvider notificationProvider;
public NotificationList(String id, final AbstractSushiPage abstractSushiPage) {
super(id);
this.abstractSushiPage = abstractSushiPage;
//add modal
eventViewModal = new EventViewModal("eventViewModal");
eventViewModal.setOutputMarkupId(true);
add(eventViewModal);
add(addFilterComponents());
notificationForm = new Form<Void>("notificationForm");
notificationForm.add(addNotifications());
add(notificationForm);
}
private Component addFilterComponents() {
Form<Void> buttonForm = new WarnOnExitForm("buttonForm");
List<String> notificationFilterCriteriaList = new ArrayList<String>(Arrays.asList(new String[] {"ID", "Timestamp", "NotificationRule (ID)"}));
String selectedNotificationCriteria = "ID";
final DropDownChoice<String> notificationFilterCriteriaSelect = new DropDownChoice<String>("notificationFilterCriteria", new Model<String>(selectedNotificationCriteria), notificationFilterCriteriaList);
buttonForm.add(notificationFilterCriteriaSelect);
List<String> conditions = new ArrayList<String>(Arrays.asList(new String[] { "<", "=", ">" }));
String selectedCondition = "=";
final DropDownChoice<String> eventFilterConditionSelect = new DropDownChoice<String>("notificationFilterCondition", 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 notificationFilterCriteria = notificationFilterCriteriaSelect.getChoices().get(Integer.parseInt(notificationFilterCriteriaSelect.getValue()));
String notificationFilterCondition = eventFilterConditionSelect.getChoices().get(Integer.parseInt(eventFilterConditionSelect.getValue()));
String filterValue = searchValueInput.getValue();
notificationProvider.setNotificationFilter(new NotificationFilter(notificationFilterCriteria, notificationFilterCondition, filterValue));
target.add(notificationTable);
}
};
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);;
notificationProvider.setNotificationFilter(new NotificationFilter());
target.add(notificationTable);
}
};
buttonForm.add(resetButton);
AjaxButton markSeenButton = new BlockingAjaxButton("seenButton", buttonForm) {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
super.onSubmit(target, form);;
notificationProvider.markSeenSelectedEntries();
notificationProvider.clearSelectedEntities();
notificationProvider.update();
target.add(notificationTable);
}
};
buttonForm.add(markSeenButton);
AjaxButton selectAllButton = new AjaxButton("selectAllButton", buttonForm) {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
notificationProvider.selectAllEntries();
target.add(notificationTable);
}
};
buttonForm.add(selectAllButton);
return buttonForm;
}
/**
* prepares list of notifications
* @return list of notifications
*/
@SuppressWarnings({ "unchecked" })
private Component addNotifications() {
//collect all notifications for logged in user
notificationProvider = new NotificationProvider(((SushiAuthenticatedSession)Session.get()).getUser());
columns = new ArrayList<IColumn<SushiNotification, String>>();
columns.add(new PropertyColumn<SushiNotification, String>(Model.of("ID"), "ID"));
columns.add(new PropertyColumn<SushiNotification, String>(Model.of("Timestamp"), "timestamp"));
columns.add(new PropertyColumn<SushiNotification, String>(Model.of("Notification Rule"), "notificationRule"));
columns.add(new AbstractColumn<SushiNotification, String>(Model.of("Trigger"), "trigger") {
@Override
public void populateItem(final Item<ICellPopulator<SushiNotification>> item, final String componentId,
final IModel<SushiNotification> rowModel)
{
String shortenedValues = ((SushiNotification) rowModel.getObject()).getTriggeringText();
if (shortenedValues.length() > 200) {
shortenedValues = shortenedValues.substring(0, 200) + "...";
}
Label label = new Label(componentId, shortenedValues);
//for events add event view modal
if (rowModel.getObject() instanceof SushiNotificationForEvent) {
final SushiNotificationForEvent notification = (SushiNotificationForEvent) rowModel.getObject();
label.add(new AjaxEventBehavior("onclick") {
protected void onEvent(AjaxRequestTarget target) {
//on click open Event View Modal
eventViewModal.getPanel().setEvent(notification.getEvent());
eventViewModal.getPanel().detach();
target.add(eventViewModal.getPanel());
eventViewModal.show(target);
}
});
}
item.add(label);
}
}
);
columns.add(new AbstractColumn(new Model("Select")) {
@Override
public void populateItem(Item cellItem, String componentId, IModel rowModel) {
int entryId = ((SushiNotification) rowModel.getObject()).getID();
cellItem.add(new SelectEntryPanel(componentId, entryId, notificationProvider));
};
});
notificationTable = new DefaultDataTable<SushiNotification, String>("notifications", columns, notificationProvider, 20);
notificationTable.setOutputMarkupId(true);
return notificationTable;
}
}