package de.flower.rmt.ui.page.event.manager.notification;
import com.google.common.annotations.VisibleForTesting;
import de.flower.common.ui.ajax.event.AjaxEventSender;
import de.flower.common.ui.alert.AlertMessage;
import de.flower.common.ui.js.JQuery;
import de.flower.common.ui.panel.BasePanel;
import de.flower.rmt.model.db.entity.event.Event;
import de.flower.rmt.model.dto.Notification;
import de.flower.rmt.service.IEventManager;
import de.flower.rmt.service.mail.INotificationService;
import de.flower.rmt.ui.markup.html.form.EntityForm;
import de.flower.rmt.ui.markup.html.form.field.AbstractFormFieldPanel;
import de.flower.rmt.ui.markup.html.form.field.CheckBoxPanel;
import de.flower.rmt.ui.markup.html.form.field.FormFieldPanel;
import de.flower.rmt.ui.markup.html.form.field.TextAreaPanel;
import de.flower.rmt.ui.markup.html.form.field.TextFieldPanel;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.Markup;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponentPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import javax.mail.internet.InternetAddress;
import java.util.List;
/**
* @author flowerrrr
*/
public class NotificationPanel extends BasePanel {
@SpringBean
private IEventManager eventManager;
@SpringBean
private INotificationService notificationService;
public NotificationPanel(String id, final IModel<Event> model) {
super(id, model);
final IModel<Notification> notificationModel = Model.of(new Notification());
final EntityForm form = new EntityForm<Notification>("form", notificationModel) {
@Override
protected void onSubmit(final AjaxRequestTarget target, final Form<Notification> form) {
eventManager.sendInvitationMail(model.getObject().getId(), form.getModelObject());
notificationModel.setObject(new Notification());
target.appendJavaScript(JQuery.scrollToTop("slow"));
// fix for RMT-537 - no invitation sent alert not hidden after email is sent
AjaxEventSender.send(this, AlertMessage.class);
}
};
add(form);
RecipientListFormComponent fc = new RecipientListFormComponent(new PropertyModel(notificationModel, "recipients"), model);
form.add(new FormFieldPanel("recipientList", fc) {
@Override
protected boolean isInstantValidationEnabled() {
// disable needless rendering of javascript onchange handler
return false;
}
});
final TextFieldPanel subject;
form.add(subject = new TextFieldPanel("subject"));
final TextAreaPanel body = new BodyTextAreaPanel("body");
// disabling word wrapping in firefox cannot be done by only using css. need wrap attribute on element as well
body.getFormComponent().add(AttributeModifier.replace("wrap", "off"));
body.add(new SelectTemplatePanel() {
@Override
protected void onUpdate(final AjaxRequestTarget target, final Template template) {
Notification notification = newNotification(model.getObject());
notificationModel.getObject().setSubject(notification.getSubject());
notificationModel.getObject().setBody(notification.getBody());
// form.modelChanged(); // does not propagate changes down to components
subject.getFormComponent().modelChanged();
target.add(subject);
body.getFormComponent().modelChanged();
target.add(body);
}
});
form.add(body);
form.add(new CheckBoxPanel("bccMySelf"));
}
private Notification newNotification(Event event) {
return notificationService.newEventNotification(event);
}
/**
* Class making the wrapped panel act like a form component. Allows to integrate panel
* into existing form field architecture.
*/
@VisibleForTesting
protected static class RecipientListFormComponent extends FormComponentPanel<List<InternetAddress>> {
public RecipientListFormComponent(final IModel<List<InternetAddress>> model, final IModel<Event> eventModel) {
super("input", model);
add(new RecipientListPanel(model, eventModel) {
@Override
protected void onChange(final AjaxRequestTarget target) {
// trigger instant validation, simulate AjaxFormComponentUpdatingBehavior
processInput();
target.add(this.findParent(AbstractFormFieldPanel.class));
}
});
}
@Override
protected void convertInput() {
setConvertedInput(getModelObject());
}
@Override
public Markup getAssociatedMarkup() {
String markup = "<wicket:panel><div wicket:id='recipientListPanel'/></wicket:panel>";
return Markup.of(markup);
}
}
}