MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl.java
package com.hack23.cia.web.impl.ui.application.views.user.govermentranking.pagemode;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
import com.hack23.cia.model.internal.application.data.ministry.impl.ViewRiksdagenGovermentRoleMember;
import com.hack23.cia.model.internal.application.data.politician.impl.ViewRiksdagenPolitician;
import com.hack23.cia.model.internal.application.data.politician.impl.ViewRiksdagenPoliticianBallotSummary;
import com.hack23.cia.model.internal.application.data.politician.impl.ViewRiksdagenPoliticianExperienceSummary;
import com.hack23.cia.model.internal.application.system.impl.ApplicationEventGroup;
import com.hack23.cia.service.external.esv.api.EsvApi;
import com.hack23.cia.service.external.esv.api.GovernmentBodyAnnualOutcomeSummary;
import com.hack23.cia.service.external.esv.api.GovernmentBodyAnnualSummary;
import com.hack23.cia.web.impl.ui.application.action.ViewAction;
import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.pagecommands.PageCommandMinistryRankingConstants;
import com.hack23.cia.web.impl.ui.application.views.common.pagemode.CardInfoRowUtil;
import com.hack23.cia.web.impl.ui.application.views.common.pagemode.LeaderCardUtil;
import com.hack23.cia.web.impl.ui.application.views.common.pagemode.PartyLeaderUtil;
import com.hack23.cia.web.impl.ui.application.views.common.rows.RowUtil;
import com.jarektoro.responsivelayout.ResponsiveRow;
import com.vaadin.ui.Layout;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
/**
* The Class MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl.
*/
@Service
public final class MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl
extends AbstractMinistryRankingPageModContentFactoryImpl {
/** The Constant DISPLAY_SIZE_LG_DEVICE. */
private static final int DISPLAY_SIZE_LG_DEVICE = 4;
/** The Constant DISPLAY_SIZE_MD_DEVICE. */
private static final int DISPLAY_SIZE_MD_DEVICE = 4;
/** The Constant DISPLAY_SIZE_XS_DEVICE. */
private static final int DISPLAY_SIZE_XS_DEVICE = 12;
/** The Constant DISPLAYS_SIZE_XM_DEVICE. */
private static final int DISPLAYS_SIZE_XM_DEVICE = 6;
/** The Constant CURRENT_YEAR. */
private static final int CURRENT_YEAR = 2024;
/** The esv api. */
private final EsvApi esvApi;
/** The leader card util. */
@Autowired
private LeaderCardUtil leaderCardUtil;
/**
* Instantiates a new ministry ranking current parties leader scoreboard charts page mod content factory impl.
*
* @param esvApi the esv api
*/
public MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl(final EsvApi esvApi) {
super();
this.esvApi = esvApi;
}
/**
* Creates the content.
*
* @param parameters the parameters
* @param menuBar the menu bar
* @param panel the panel
* @return the layout
*/
@Secured({ "ROLE_ANONYMOUS", "ROLE_USER", "ROLE_ADMIN" })
@Override
public Layout createContent(final String parameters, final MenuBar menuBar, final Panel panel) {
panel.setSizeFull();
final VerticalLayout panelContent = createPanelContent();
panelContent.setSizeFull();
panel.setContent(panelContent);
getMinistryRankingMenuItemFactory().createMinistryRankingMenuBar(menuBar);
final String pageId = getPageId(parameters);
CardInfoRowUtil.createPageHeader(panel, panelContent,
MinistryRankingViewConstants.TITLE_MINISTRY_RANKINGS,
MinistryRankingViewConstants.LEADER_SCOREBOARD_TITLE,
MinistryRankingViewConstants.LEADER_SCOREBOARD_DESC);
final ResponsiveRow row = RowUtil.createGridLayout(panelContent);
row.setSizeFull();
final List<ViewRiksdagenGovermentRoleMember> activeGovMembers = leaderCardUtil.loadActiveGovernmentRoleMembers();
final Map<String, List<ViewRiksdagenPolitician>> activePoliticianMap = leaderCardUtil.loadActivePoliticiansByPersonId();
final Map<String, Boolean> partyLeaderMap = PartyLeaderUtil.computePartyLeaders( getApplicationManager() ,activePoliticianMap.keySet());
// Sort roles
activeGovMembers.sort((a, b) -> {
final boolean aLeader = partyLeaderMap.getOrDefault(a.getPersonId(), false);
final boolean bLeader = partyLeaderMap.getOrDefault(b.getPersonId(), false);
final int aPriority = getRolePriority(a.getRoleCode(), aLeader);
final int bPriority = getRolePriority(b.getRoleCode(), bLeader);
return Integer.compare(aPriority, bPriority);
});
final Map<Integer, List<GovernmentBodyAnnualSummary>> dataMap = esvApi.getData();
final List<GovernmentBodyAnnualSummary> currentYearGovernmentBodies = dataMap.get(CURRENT_YEAR);
final Map<String, List<GovernmentBodyAnnualSummary>> governmentBodyByMinistry = currentYearGovernmentBodies
.stream().collect(Collectors.groupingBy(GovernmentBodyAnnualSummary::getMinistry));
final Map<String, List<GovernmentBodyAnnualOutcomeSummary>> reportByMinistry = esvApi
.getGovernmentBodyReportByMinistry();
for (final ViewRiksdagenGovermentRoleMember govMember : activeGovMembers) {
final ViewRiksdagenPolitician politician = activePoliticianMap.get(govMember.getPersonId()).get(0);
final ViewRiksdagenPoliticianBallotSummary ballotSummary = getApplicationManager()
.getDataContainer(ViewRiksdagenPoliticianBallotSummary.class).load(govMember.getPersonId());
final ViewRiksdagenPoliticianExperienceSummary experienceSummary = getApplicationManager().getDataContainer(ViewRiksdagenPoliticianExperienceSummary.class).load(govMember.getPersonId());
final Panel cardPanel = leaderCardUtil.createBaseballStyleCard(govMember, politician, ballotSummary, governmentBodyByMinistry,
reportByMinistry,experienceSummary);
// Responsive column rules
row.addColumn().withDisplayRules(DISPLAY_SIZE_XS_DEVICE, DISPLAYS_SIZE_XM_DEVICE, DISPLAY_SIZE_MD_DEVICE,
DISPLAY_SIZE_LG_DEVICE).withComponent(cardPanel);
}
getPageActionEventHelper().createPageEvent(ViewAction.VISIT_MINISTRY_RANKING_VIEW, ApplicationEventGroup.USER,
NAME, parameters, pageId);
return panelContent;
}
/**
* Gets the role priority.
*
* @param role the role
* @param isPartyLeader the is party leader
* @return the role priority
*/
private int getRolePriority(final String role, final boolean isPartyLeader) {
final String roleNormalized = role.toLowerCase(Locale.ROOT).trim();
if ("statsminister".equals(roleNormalized)) {
return 1;
} else if (isPartyLeader) {
return 2;
} else if (roleNormalized.endsWith("minister")) {
return 3;
} else if ("statsråd".equalsIgnoreCase(roleNormalized)) {
return 4;
} else {
return 5;
}
}
/**
* Matches.
*
* @param page the page
* @param parameters the parameters
* @return true, if successful
*/
@Override
public boolean matches(final String page, final String parameters) {
return PageCommandMinistryRankingConstants.COMMAND_CHARTS_CURRENT_MINISTRIES_LEADER_SCOREBOARD.matches(page, parameters);
}
}