package fr.openwide.core.basicapp.web.application.administration.component; import static fr.openwide.core.commons.util.functional.Predicates2.isTrue; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.model.IModel; 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 org.wicketstuff.wiquery.core.events.MouseEvent; import fr.openwide.core.basicapp.core.business.user.model.User; import fr.openwide.core.basicapp.core.business.user.model.atomic.UserPasswordRecoveryRequestInitiator; import fr.openwide.core.basicapp.core.business.user.model.atomic.UserPasswordRecoveryRequestType; import fr.openwide.core.basicapp.core.business.user.service.IUserService; import fr.openwide.core.basicapp.core.security.service.ISecurityManagementService; import fr.openwide.core.basicapp.core.util.binding.Bindings; import fr.openwide.core.basicapp.web.application.BasicApplicationSession; import fr.openwide.core.basicapp.web.application.administration.form.AbstractUserPopup; import fr.openwide.core.basicapp.web.application.administration.form.UserPasswordUpdatePopup; import fr.openwide.core.basicapp.web.application.administration.form.UserPopup; import fr.openwide.core.basicapp.web.application.common.typedescriptor.user.UserTypeDescriptor; import fr.openwide.core.wicket.markup.html.basic.CoreLabel; import fr.openwide.core.wicket.markup.html.link.EmailLink; import fr.openwide.core.wicket.markup.html.panel.GenericPanel; import fr.openwide.core.wicket.more.condition.Condition; import fr.openwide.core.wicket.more.markup.html.action.AbstractAjaxAction; import fr.openwide.core.wicket.more.markup.html.basic.DateLabel; import fr.openwide.core.wicket.more.markup.html.basic.DefaultPlaceholderPanel; import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils; import fr.openwide.core.wicket.more.markup.html.image.BooleanIcon; import fr.openwide.core.wicket.more.markup.html.link.BlankLink; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.confirm.component.AjaxConfirmLink; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.behavior.AjaxModalOpenBehavior; import fr.openwide.core.wicket.more.model.BindingModel; import fr.openwide.core.wicket.more.util.DatePattern; public class UserProfilePanel<U extends User> extends GenericPanel<U> { private static final long serialVersionUID = 8651898170121443991L; private static final Logger LOGGER = LoggerFactory.getLogger(UserProfilePanel.class); @SpringBean private IUserService userService; @SpringBean private ISecurityManagementService securityManagementService; public UserProfilePanel(String id, final IModel<U> userModel, UserTypeDescriptor<U> typeDescriptor) { super(id, userModel); AbstractUserPopup<U> updatePopup = createUpdatePopup("updatePopup", getModel(), typeDescriptor); UserPasswordUpdatePopup<U> passwordUpdatePopup = new UserPasswordUpdatePopup<>("passwordUpdatePopup", getModel()); IModel<String> confirmationTextModel = new StringResourceModel("administration.user.disable.confirmation.text") .setParameters(userModel.getObject().getFullName()); IModel<String> emailModel = BindingModel.of(userModel, Bindings.user().email()); add( updatePopup, new BlankLink("updateButton") .add(new AjaxModalOpenBehavior(updatePopup, MouseEvent.CLICK)), passwordUpdatePopup, new BlankLink("passwordUpdateButton") .add(new AjaxModalOpenBehavior(passwordUpdatePopup, MouseEvent.CLICK)) .add( Condition.predicate( Model.of(securityManagementService.getOptions(getModelObject()).isPasswordAdminUpdateEnabled()), isTrue() ).thenShow() ), AjaxConfirmLink.<U>build() .title(new ResourceModel("administration.user.password.recovery.reset.confirmation.title")) .content(new StringResourceModel("administration.user.password.recovery.reset.confirmation.text").setModel(userModel)) .confirm() .onClick(new AbstractAjaxAction() { private static final long serialVersionUID = 1L; @Override public void execute(AjaxRequestTarget target) { try { securityManagementService.initiatePasswordRecoveryRequest(userModel.getObject(), UserPasswordRecoveryRequestType.RESET, UserPasswordRecoveryRequestInitiator.ADMIN, BasicApplicationSession.get().getUser() ); getSession().success(getString("administration.user.password.recovery.reset.success")); target.add(getPage()); } catch (Exception e) { LOGGER.error("Error occured while sending a password recovery request", e); getSession().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } }) .create("passwordReset", userModel) .add( Condition.predicate( Model.of(securityManagementService.getOptions(getModelObject()).isPasswordAdminRecoveryEnabled()), isTrue() ).thenShow() ), new Link<U>("enable", userModel) { private static final long serialVersionUID = 1L; @Override public void onClick() { try { userService.setActive(getModelObject(), true); getSession().success(getString("administration.user.enable.success")); } catch (Exception e) { LOGGER.error("Error occured while enabling user", e); getSession().error(getString("common.error.unexpected")); } } @Override protected void onConfigure() { super.onConfigure(); setVisible(!getModelObject().isActive()); } }, AjaxConfirmLink.<U>build() .title(new ResourceModel("administration.user.disable.confirmation.title")) .content(confirmationTextModel) .confirm() .onClick( new AbstractAjaxAction() { private static final long serialVersionUID = 1L; @Override public void execute(AjaxRequestTarget target) { try { userService.setActive(userModel.getObject(), false); getSession().success(getString("administration.user.disable.success")); } catch (Exception e) { LOGGER.error("Error occured while disabling user", e); getSession().error(getString("common.error.unexpected")); } target.add(getPage()); FeedbackUtils.refreshFeedback(target, getPage()); } } ) .create("disable", userModel) .add( new Condition() { private static final long serialVersionUID = 1L; @Override public boolean applies() { User displayedUser = getModelObject(); User currentUser = BasicApplicationSession.get().getUser(); return !displayedUser.equals(currentUser) && displayedUser.isActive(); } }.thenShowInternal() ), new Label("userName", BindingModel.of(userModel, Bindings.user().userName())), new BooleanIcon("active", BindingModel.of(userModel, Bindings.user().active())), new EmailLink("email", emailModel), new DefaultPlaceholderPanel("emailPlaceholder").condition(Condition.modelNotNull(emailModel)), new DateLabel("creationDate", BindingModel.of(userModel, Bindings.user().creationDate()), DatePattern.SHORT_DATETIME).showPlaceholder(), new DateLabel("lastUpdateDate", BindingModel.of(userModel, Bindings.user().lastUpdateDate()), DatePattern.SHORT_DATETIME).showPlaceholder(), new CoreLabel("locale", BindingModel.of(userModel, Bindings.user().locale())).showPlaceholder(), new DateLabel("lastLoginDate", BindingModel.of(userModel, Bindings.user().lastLoginDate()), DatePattern.SHORT_DATETIME).showPlaceholder() ); } protected AbstractUserPopup<U> createUpdatePopup(String wicketId, IModel<U> model, UserTypeDescriptor<U> typeDescriptor) { return new UserPopup<U>(wicketId, getModel(), typeDescriptor); } }