package fr.openwide.maven.artifact.notifier.web.application.project.page; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.model.IModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; 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.wicket.more.link.descriptor.IPageLinkDescriptor; import fr.openwide.core.wicket.more.link.descriptor.builder.LinkDescriptorBuilder; import fr.openwide.core.wicket.more.link.descriptor.parameter.CommonParameters; import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils; import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.behavior.AjaxModalOpenBehavior; import fr.openwide.core.wicket.more.markup.html.template.model.BreadCrumbElement; import fr.openwide.core.wicket.more.model.GenericEntityModel; import fr.openwide.maven.artifact.notifier.core.business.project.model.Project; import fr.openwide.maven.artifact.notifier.core.business.project.service.IProjectService; 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.web.application.MavenArtifactNotifierSession; import fr.openwide.maven.artifact.notifier.web.application.common.behavior.AuthenticatedOnlyBehavior; import fr.openwide.maven.artifact.notifier.web.application.common.component.AuthenticatedOnlyButton; import fr.openwide.maven.artifact.notifier.web.application.common.template.MainTemplate; import fr.openwide.maven.artifact.notifier.web.application.project.component.ProjectArtifactsPanel; import fr.openwide.maven.artifact.notifier.web.application.project.component.ProjectDescriptionPanel; import fr.openwide.maven.artifact.notifier.web.application.project.component.ProjectLinksPanel; import fr.openwide.maven.artifact.notifier.web.application.project.form.ProjectFormPopupPanel; public class ProjectDescriptionPage extends MainTemplate { private static final long serialVersionUID = 524541454604961458L; private static final Logger LOGGER = LoggerFactory.getLogger(ProjectDescriptionPage.class); @SpringBean private IProjectService projectService; @SpringBean private IUserService userService; private IModel<Project> projectModel; public static IPageLinkDescriptor linkDescriptor(IModel<Project> projectModel) { return new LinkDescriptorBuilder() .page(ProjectDescriptionPage.class) .map(CommonParameters.NATURAL_ID, projectModel, Project.class).mandatory() .build(); } public ProjectDescriptionPage(PageParameters parameters) { super(parameters); projectModel = new GenericEntityModel<Long, Project>(null); linkDescriptor(projectModel).extractSafely(parameters, ProjectListPage.linkDescriptor()); addBreadCrumbElement(new BreadCrumbElement(new ResourceModel("project.list.pageTitle"), ProjectListPage.linkDescriptor())); addBreadCrumbElement(new BreadCrumbElement(new StringResourceModel("project.description.pageTitle", projectModel), ProjectDescriptionPage.linkDescriptor(projectModel))); add(new Label("pageTitle", new StringResourceModel("project.description.pageTitle", projectModel))); // Edit popup ProjectFormPopupPanel editProjectPopup = new ProjectFormPopupPanel("editProjectPopup", projectModel); add(editProjectPopup); // Edit button Button editButton = new AuthenticatedOnlyButton("editButton"); editButton.add(new AjaxModalOpenBehavior(editProjectPopup, MouseEvent.CLICK)); add(editButton); // Follow AjaxLink<Project> follow = new AjaxLink<Project>("follow", projectModel) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { try { userService.followProject(MavenArtifactNotifierSession.get().getUser(), getModelObject()); target.add(getPage()); } catch (Exception e) { LOGGER.error("Error occured while following project", e); getSession().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } @Override protected void onConfigure() { super.onConfigure(); Project project = getModelObject(); User user = MavenArtifactNotifierSession.get().getUser(); setVisible(user != null && project != null && !userService.isFollowedProject(user, project)); } // XXX: Disabled for now @Override public boolean isVisible() { return false; } }; follow.add(new AuthenticatedOnlyBehavior()); add(follow); // Unfollow AjaxLink<Project> unfollow = new AjaxLink<Project>("unfollow", projectModel) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { try { userService.unfollowProject(MavenArtifactNotifierSession.get().getUser(), getModelObject()); target.add(getPage()); } catch (Exception e) { LOGGER.error("Error occured while unfollowing project", e); getSession().error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } @Override protected void onConfigure() { super.onConfigure(); Project project = getModelObject(); User user = MavenArtifactNotifierSession.get().getUser(); setVisible(user != null && project != null && userService.isFollowedProject(user, project)); } // XXX: Disabled for now @Override public boolean isVisible() { return false; } }; unfollow.add(new AuthenticatedOnlyBehavior()); add(unfollow); add(new ProjectDescriptionPanel("projectDescriptionPanel", projectModel)); add(new ProjectArtifactsPanel("projectArtifactsPanel", projectModel)); add(new ProjectLinksPanel("projectLinksPanel", projectModel)); } @Override protected Class<? extends WebPage> getFirstMenuPage() { return ProjectListPage.class; } @Override protected void onDetach() { super.onDetach(); if (projectModel != null) { projectModel.detach(); } } }