package fr.openwide.maven.artifact.notifier.web.application.navigation.component; import java.util.Collection; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.EmailTextField; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fr.openwide.core.spring.util.StringUtils; import fr.openwide.core.wicket.markup.html.link.EmailLink; import fr.openwide.core.wicket.markup.html.panel.GenericPanel; import fr.openwide.core.wicket.more.markup.html.collection.GenericEntityCollectionView; import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.confirm.component.AjaxConfirmLink; import fr.openwide.core.wicket.more.model.BindingModel; import fr.openwide.maven.artifact.notifier.core.business.user.exception.AlreadyAddedEmailException; import fr.openwide.maven.artifact.notifier.core.business.user.model.EmailAddress; import fr.openwide.maven.artifact.notifier.core.business.user.model.EmailStatus; import fr.openwide.maven.artifact.notifier.core.business.user.model.User; import fr.openwide.maven.artifact.notifier.core.business.user.service.IUserService; import fr.openwide.maven.artifact.notifier.core.util.binding.Binding; import fr.openwide.maven.artifact.notifier.web.application.administration.component.EmailStatusIcon; public class UserNotificationManagementPanel extends GenericPanel<User> { private static final long serialVersionUID = 1955579250974258074L; private static final Logger LOGGER = LoggerFactory.getLogger(UserNotificationManagementPanel.class); @SpringBean private IUserService userService; private GenericEntityCollectionView<EmailAddress> emailListView; public UserNotificationManagementPanel(String id, IModel<User> userModel) { super(id, userModel); add(new Label("notificationSettings", new ResourceModel("profile.notificationSettings"))); // Notify me CheckBox notifyCheck = new CheckBox("notifyMe", BindingModel.of(userModel, Binding.user().notificationAllowed())); notifyCheck.setLabel(new ResourceModel("profile.notifyMe")); Form<Boolean> form = new Form<Boolean>("form", notifyCheck.getModel()); form.add(notifyCheck); add(form); form.add(new AjaxSubmitLink("submitLink", form) { private static final long serialVersionUID = 6935376642872117563L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { User user = UserNotificationManagementPanel.this.getModelObject(); userService.update(user); getSession().success(getString("administration.user.form.edit.success")); } catch (Exception e) { LOGGER.error("Error occured while updating user.", e); getSession().error(getString("administration.user.form.edit.error")); } target.add(getPage()); FeedbackUtils.refreshFeedback(target, getPage()); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { FeedbackUtils.refreshFeedback(target, getPage()); } }); add(new Label("additionalEmails", new ResourceModel("profile.additionalEmails"))); // Email list IModel<Collection<EmailAddress>> emailAddressesModel = new LoadableDetachableModel<Collection<EmailAddress>>() { private static final long serialVersionUID = 1L; @Override protected Collection<EmailAddress> load() { return userService.listAdditionalEmails(UserNotificationManagementPanel.this.getModelObject()); } }; emailListView = new GenericEntityCollectionView<EmailAddress>("emails", emailAddressesModel) { private static final long serialVersionUID = 1L; @Override protected void populateItem(final Item<EmailAddress> item) { item.add(new EmailLink("emailLink", BindingModel.of(item.getModel(), Binding.emailAddress().email()))); item.add(new EmailStatusIcon("emailStatus", BindingModel.of(item.getModel(), Binding.emailAddress().status()))); item.add(new AjaxConfirmLink<EmailAddress>("deleteLink", item.getModel(), new ResourceModel("profile.deleteEmail.title"), new StringResourceModel("profile.deleteEmail.confirmation.text", item.getModel()), new ResourceModel("common.confirm"), new ResourceModel("common.cancel"), null, false) { private static final long serialVersionUID = -5179621361619239269L; @Override public void onClick(AjaxRequestTarget target) { try { EmailAddress email = item.getModelObject(); if (email.getStatus() == EmailStatus.PENDING_CONFIRM) { userService.doDeleteEmailAddress(email); getSession().success(getString("profile.doDeleteEmail.success")); } else if (email.getStatus() == EmailStatus.VALIDATED) { userService.deleteEmailAddress(email); getSession().success(getString("profile.deleteEmail.success")); } } catch (Exception e) { LOGGER.error("Error occured while sending delete email notification", e); getSession().error(getString("profile.deleteEmail.error")); } target.add(getPage()); FeedbackUtils.refreshFeedback(target, getPage()); } }); } }; emailListView.setOutputMarkupId(true); add(emailListView); // Empty list add(new WebMarkupContainer("emptyList") { private static final long serialVersionUID = 6700720373087584498L; @Override public void onConfigure() { super.onConfigure(); setVisible(emailListView.size() <= 0); } }); // Add email form IModel<String> emptyEmailModel = Model.of(""); final EmailTextField emailField = new EmailTextField("email", emptyEmailModel); emailField.setRequired(true); final Form<String> addEmailForm = new Form<String>("addEmailForm", emptyEmailModel); addEmailForm.add(emailField); addEmailForm.add(new AjaxSubmitLink("addEmailLink", addEmailForm) { private static final long serialVersionUID = 6935376642872117563L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { User user = UserNotificationManagementPanel.this.getModelObject(); String emailValue = StringUtils.trimWhitespace(StringUtils.lowerCase(emailField.getModelObject())); if (StringUtils.hasText(emailValue)) { userService.addEmailAddress(user, emailValue); getSession().success(getString("profile.addEmail.success")); } } catch (AlreadyAddedEmailException e) { getSession().error(getString("profile.addEmail.error.alreadyAdded")); } catch (Exception e) { LOGGER.error("Error occured while sending add email notification.", e); getSession().error(getString("profile.addEmail.error")); } emailField.setModelObject(null); target.add(getPage()); FeedbackUtils.refreshFeedback(target, getPage()); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { FeedbackUtils.refreshFeedback(target, getPage()); } }); add(addEmailForm); } }