package sushi.application.pages.monitoring.eventviews;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.ListMultipleChoice;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import sushi.event.SushiEventType;
import sushi.notification.SushiNotificationPriorityEnum;
import sushi.user.SushiUser;
import sushi.visualisation.SushiEventView;
import sushi.visualisation.SushiTimePeriodEnum;
import de.agilecoders.wicket.markup.html.bootstrap.common.NotificationPanel;
/**
* This panel is used to configure and save a new @see SushiEventView Object
*/
public class ViewConfigurationPanel extends Panel{
private static final long serialVersionUID = 1L;
private EventViewPage parentPage;
private ViewConfigurationPanel panel;
private NotificationPanel feedbackPanel;
private Form<Void> layoutForm;
private ListMultipleChoice<SushiEventType> eventTypeSelect;
private DropDownChoice<SushiTimePeriodEnum> timePeriodSelect;
private DropDownChoice<SushiUser> userSelect;
private ArrayList<SushiEventType> selectedEventTypes = new ArrayList<SushiEventType>();
private static final List<SushiTimePeriodEnum> TIMEPERIODS = Arrays.asList(SushiTimePeriodEnum.values());
private IModel<SushiTimePeriodEnum> selectedTimePeriod = Model.of(SushiTimePeriodEnum.INF);
private SushiUser selectedUser = null;
public ViewConfigurationPanel(String id, EventViewPage visualisationPanel){
super(id);
this.panel = this;
this.parentPage = visualisationPanel;
layoutForm = new Form<Void>("layoutForm");
add(layoutForm);
addFeedbackPanel(layoutForm);
layoutForm.add(addEventTypeSelect());
layoutForm.add(addTimePeriodSelect());
layoutForm.add(addUserSelect());
addButtonsToForm(layoutForm);
}
private void addFeedbackPanel(Form<Void> layoutForm) {
feedbackPanel = new NotificationPanel("feedback");
feedbackPanel.setOutputMarkupId(true);
feedbackPanel.setOutputMarkupPlaceholderTag(true);
layoutForm.add(feedbackPanel);
}
private Component addEventTypeSelect() {
eventTypeSelect = new ListMultipleChoice<SushiEventType>("eventTypeSelect", new Model(selectedEventTypes), SushiEventType.findAll());
eventTypeSelect.setOutputMarkupId(true);
return eventTypeSelect;
}
private Component addUserSelect() {
userSelect = new DropDownChoice<SushiUser>("userSelect", new PropertyModel<SushiUser>(this, "selectedUser"), SushiUser.findAll());
userSelect.setOutputMarkupId(true);
return userSelect;
}
private Component addTimePeriodSelect() {
timePeriodSelect = new DropDownChoice<SushiTimePeriodEnum>("timePeriodSelect", selectedTimePeriod, TIMEPERIODS);
timePeriodSelect.setOutputMarkupId(true);
return timePeriodSelect;
}
private void addButtonsToForm(Form<Void> layoutForm) {
AjaxButton createButton = new AjaxButton("createButton") {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
panel.getFeedbackPanel().setVisible(true);
boolean error = false;
if(selectedEventTypes.isEmpty()){
panel.getFeedbackPanel().error("Choose at least one event type!");
panel.getFeedbackPanel().setVisible(true);
target.add(panel.getFeedbackPanel());
error = true;
};
if(selectedUser == null){
panel.getFeedbackPanel().error("Choose a user");
panel.getFeedbackPanel().setVisible(true);
target.add(panel.getFeedbackPanel());
error = true;
};
if (error == false) {
//create new EventView configuration
SushiEventView view = new SushiEventView(selectedUser, selectedEventTypes, selectedTimePeriod.getObject());
view.save();
EventViewPage visualisation = (EventViewPage) parentPage;
visualisation.views.detach();
target.add(visualisation.listview.getParent());
//close this Panel
visualisation.addViewModal.close(target);
};
};
};
layoutForm.add(createButton);
}
public NotificationPanel getFeedbackPanel() {
return feedbackPanel;
}
}