/* * Copyright (C) 2010 BloatIt. This file is part of BloatIt. BloatIt is free * software: you can redistribute it and/or modify it under the terms of the GNU * Affero General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later version. * BloatIt is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. You should have received a copy of the GNU Affero General Public * License along with BloatIt. If not, see <http://www.gnu.org/licenses/>. */ package com.bloatit.web.linkable.members; import static com.bloatit.framework.webprocessor.context.Context.tr; import java.util.Locale; import com.bloatit.framework.exceptions.highlevel.ShallNotPassException; import com.bloatit.framework.exceptions.lowlevel.RedirectException; import com.bloatit.framework.utils.PageIterable; import com.bloatit.framework.webprocessor.annotations.NonOptional; import com.bloatit.framework.webprocessor.annotations.Optional; import com.bloatit.framework.webprocessor.annotations.ParamContainer; import com.bloatit.framework.webprocessor.annotations.RequestParam; import com.bloatit.framework.webprocessor.annotations.RequestParam.Role; import com.bloatit.framework.webprocessor.annotations.SubParamContainer; import com.bloatit.framework.webprocessor.annotations.tr; import com.bloatit.framework.webprocessor.components.HtmlBlockquote; import com.bloatit.framework.webprocessor.components.HtmlDiv; import com.bloatit.framework.webprocessor.components.HtmlList; import com.bloatit.framework.webprocessor.components.HtmlParagraph; import com.bloatit.framework.webprocessor.components.HtmlSpan; import com.bloatit.framework.webprocessor.components.HtmlTitleBlock; import com.bloatit.framework.webprocessor.components.PlaceHolderElement; import com.bloatit.framework.webprocessor.components.advanced.HtmlTabBlock; import com.bloatit.framework.webprocessor.components.meta.HtmlBranch; import com.bloatit.framework.webprocessor.components.meta.HtmlElement; import com.bloatit.framework.webprocessor.components.renderer.HtmlCachedMarkdownRenderer; import com.bloatit.framework.webprocessor.context.Context; import com.bloatit.model.Member; import com.bloatit.model.Team; import com.bloatit.model.right.Action; import com.bloatit.model.right.AuthToken; import com.bloatit.model.right.UnauthorizedOperationException; import com.bloatit.web.WebConfiguration; import com.bloatit.web.components.SideBarButton; import com.bloatit.web.linkable.documentation.SideBarDocumentationBlock; import com.bloatit.web.linkable.master.Breadcrumb; import com.bloatit.web.linkable.master.ElveosPage; import com.bloatit.web.linkable.master.sidebar.TitleSideBarElementLayout; import com.bloatit.web.linkable.master.sidebar.TwoColumnLayout; import com.bloatit.web.linkable.members.tabs.AccountTab; import com.bloatit.web.linkable.members.tabs.DashboardTab; import com.bloatit.web.linkable.members.tabs.HistoryTab; import com.bloatit.web.linkable.members.tabs.InvoicingContactTab; import com.bloatit.web.linkable.members.tabs.TasksTab; import com.bloatit.web.linkable.money.SideBarLoadAccountBlock; import com.bloatit.web.linkable.money.SideBarWithdrawMoneyBlock; import com.bloatit.web.url.ActivityPageUrl; import com.bloatit.web.url.MemberPageUrl; import com.bloatit.web.url.ModifyMemberPageUrl; import com.bloatit.web.url.TeamPageUrl; /** * <p> * A page used to display member information. * </p> * <p> * If the consulted member is the same as the logged member, then this page will * propose to edit account parameters * </p> */ @ParamContainer("members/%member%") public final class MemberPage extends ElveosPage { private final MemberPageUrl url; public final static String MEMBER_TAB_PANE = "tab"; public final static String TASKS_TAB = "tasks"; public final static String ACTIVITY_TAB = "history"; public final static String ACCOUNT_TAB = "account"; public final static String INVOICING_TAB = "invoicing"; public final static String DASHBOARD_TAB = "dashboard"; @SubParamContainer private HistoryTab history; @SubParamContainer private DashboardTab dashboard; @RequestParam(name = MEMBER_TAB_PANE) @Optional(ACTIVITY_TAB) private final String activeTabKey; @NonOptional(@tr("You have to specify a member number.")) @RequestParam(role = Role.PAGENAME, message = @tr("I cannot find the member number: ''%value%''.")) private final Member member; public MemberPage(final MemberPageUrl url) { super(url); this.url = url; this.member = url.getMember(); this.activeTabKey = url.getActiveTabKey(); } @Override protected HtmlElement createBodyContent() throws RedirectException { final TwoColumnLayout layout = new TwoColumnLayout(false, url); boolean myPage; if (AuthToken.isAuthenticated() && member != null && member.equals(AuthToken.getMember())) { myPage = true; } else { myPage = false; } layout.addLeft(generateMemberPageMain(myPage)); if (member.canGetInternalAccount()) { layout.addLeft(generateTabPane()); } // Adding activity page link final ActivityPageUrl activityPageUrl = new ActivityPageUrl(); activityPageUrl.setMember(member); if (myPage) { layout.addRight(new SideBarButton(Context.tr("My activity"), activityPageUrl, WebConfiguration.getImgActivitySmall(), false)); } else if(member.getFollowedFeatures().size() > 0){ layout.addRight(new SideBarButton(Context.tr("{0}''s activity", member.getDisplayName()), activityPageUrl, WebConfiguration.getImgActivitySmall(), false)); } // Adding list of teams final TitleSideBarElementLayout teamBlock = new TitleSideBarElementLayout(); try { if (myPage) { teamBlock.setTitle(Context.tr("My teams")); } else { teamBlock.setTitle(Context.tr("{0}''s teams", member.getDisplayName())); } final HtmlList teamList = new HtmlList(); teamList.setCssClass("member_teams_list"); teamBlock.add(teamList); final PageIterable<Team> teams = member.getTeams(); if (teams.size() == 0) { teamBlock.add(new HtmlParagraph(Context.tr("No team."))); } for (final Team team : teams) { teamList.add(new TeamPageUrl(team).getHtmlLink(team.getDisplayName())); } } catch (final UnauthorizedOperationException e) { throw new ShallNotPassException("Cannot access member team information", e); } layout.addRight(teamBlock); if (AuthToken.isAuthenticated() && member.canGetInternalAccount()) { layout.addRight(new SideBarDocumentationBlock("internal_account")); layout.addRight(new SideBarLoadAccountBlock(null)); layout.addRight(new SideBarWithdrawMoneyBlock(AuthToken.getMember())); } return layout; } private HtmlElement generateMemberPageMain(final boolean myPage) { final HtmlDiv master = new HtmlDiv("member_page"); if (member.canAccessUserInformations(Action.WRITE)) { // Link to change account settings final HtmlDiv modify = new HtmlDiv("float_right"); master.add(modify); modify.add(new ModifyMemberPageUrl().getHtmlLink(Context.tr("Change member settings"))); // modify.add(new HtmlFollowActorButton(member)); } // Title final String title = (myPage) ? Context.tr("My page") : Context.tr("{0}''s page", member.getDisplayName()); final HtmlTitleBlock tBlock = new HtmlTitleBlock(title, 1); master.add(tBlock); final HtmlDiv main = new HtmlDiv("member"); master.add(main); // Member ID card // Avatar final HtmlDiv avatarDiv = new HtmlDiv("member_avatar"); avatarDiv.add(MembersTools.getMemberAvatar(member)); main.add(avatarDiv); final HtmlDiv memberId = new HtmlDiv("member_id"); main.add(memberId); try { // Description if (member.getDescription() != null && !member.getDescription().isEmpty()) { final HtmlBranch memberDescription = new HtmlBlockquote("member_description").add(new HtmlParagraph(new HtmlCachedMarkdownRenderer(member.getDescription()))); memberId.add(memberDescription); } final HtmlList memberIdList = new HtmlList(); memberId.add(memberIdList); if (member.canAccessUserInformations(Action.READ)) { // Login final HtmlSpan login = new HtmlSpan("id_category"); login.addText(Context.trc("login (noun)", "Login: ")); memberIdList.add(new PlaceHolderElement().add(login).addText(member.getLogin())); // Fullname final HtmlSpan fullname = new HtmlSpan("id_category"); fullname.addText(Context.tr("Fullname: ")); if (member.getFullname() != null) { memberIdList.add(new PlaceHolderElement().add(fullname).addText(member.getFullname())); } else { memberIdList.add(new PlaceHolderElement().add(fullname)); } // Email final HtmlSpan email = new HtmlSpan("id_category"); email.addText(Context.tr("Email: ")); memberIdList.add(new PlaceHolderElement().add(email).addText(member.getEmail())); } else { final HtmlSpan name = new HtmlSpan("id_category"); name.addText(Context.tr("Name: ")); memberIdList.add(new PlaceHolderElement().add(name).addText(member.getDisplayName())); } final Locale userLocale = Context.getLocalizator().getLocale(); // Country final HtmlSpan country = new HtmlSpan("id_category"); country.addText(Context.tr("Country: ")); memberIdList.add(new PlaceHolderElement().add(country).addText(member.getLocale().getDisplayCountry(userLocale))); // Language final HtmlSpan language = new HtmlSpan("id_category"); language.addText(Context.tr("Language: ")); memberIdList.add(new PlaceHolderElement().add(language).addText(member.getLocale().getDisplayLanguage(userLocale))); // Karma if (member.isActive()) { final HtmlSpan karma = new HtmlSpan("id_category"); karma.addText(Context.tr("Karma: ")); memberIdList.add(new PlaceHolderElement().add(karma).addText("" + member.getKarma())); } } catch (final UnauthorizedOperationException e) { getSession().notifyError("An error prevented us from displaying user information. Please notify us."); throw new ShallNotPassException("Error while gathering user information", e); } if (!member.canGetInternalAccount()) { // Displaying list of user recent history final HtmlTitleBlock recent = new HtmlTitleBlock(Context.tr("Recent history"), 2); main.add(recent); recent.add(HistoryTab.generateHistorical(member, url)); } return master; } private HtmlElement generateTabPane() { final HtmlDiv master = new HtmlDiv("member_tabs"); final MemberPageUrl secondUrl = new MemberPageUrl(member); final HtmlTabBlock tabPane = new HtmlTabBlock(MEMBER_TAB_PANE, activeTabKey, secondUrl); master.add(tabPane); // Dashboard tab dashboard = new DashboardTab(member, tr("Dashboard"), DASHBOARD_TAB, url); dashboard.setEasterEgg(true); tabPane.addTab(dashboard); // History tab history = new HistoryTab(member, tr("History"), ACTIVITY_TAB, url); tabPane.addTab(history); // Account tab tabPane.addTab(new AccountTab(member, tr("Account"), ACCOUNT_TAB)); long nb; if ((nb = (member.getInvitationCount() + member.getMilestoneToInvoice().size())) > 0) { tabPane.addTab(new TasksTab(member, tr("Tasks ({0})", nb), TASKS_TAB)); } // Invoicing contact tab tabPane.addTab(new InvoicingContactTab(member, tr("Invoicing"), INVOICING_TAB)); return master; } @Override protected String createPageTitle() { return tr("Member - ") + member.getDisplayName(); } @Override public boolean isStable() { return true; } @Override protected Breadcrumb createBreadcrumb() { return MemberPage.generateBreadcrumb(member); } public static Breadcrumb generateBreadcrumb(final Member member) { final Breadcrumb breadcrumb = MembersListPage.generateBreadcrumb(); breadcrumb.pushLink(new MemberPageUrl(member).getHtmlLink(member.getDisplayName())); return breadcrumb; } public static Breadcrumb generateAccountBreadcrumb(final Member member) { final Breadcrumb breadcrumb = MemberPage.generateBreadcrumb(member); final MemberPageUrl memberPageUrl = new MemberPageUrl(member); memberPageUrl.setActiveTabKey(ACCOUNT_TAB); breadcrumb.pushLink(memberPageUrl.getHtmlLink(Context.tr("Account"))); return breadcrumb; } public static MemberPageUrl accountUrl(final Member member) { final MemberPageUrl memberPageUrl = new MemberPageUrl(member); memberPageUrl.setActiveTabKey(ACCOUNT_TAB); // memberPageUrl.setAnchor(MEMBER_TAB_PANE); return memberPageUrl; } public static MemberPageUrl myAccountUrl(final Member member) { return accountUrl(member); } public static MemberPageUrl myMessagesUrl(final Member member) { final MemberPageUrl memberPageUrl = new MemberPageUrl(member); memberPageUrl.setActiveTabKey(TASKS_TAB); // memberPageUrl.setAnchor(MEMBER_TAB_PANE); return memberPageUrl; } }