PartyRankingMenuItemFactoryImpl.java
/*
* Copyright 2010-2025 James Pether Sörling
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* $Id$
* $HeadURL$
*/
package com.hack23.cia.web.impl.ui.application.views.common.menufactory.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.ApplicationMenuItemFactory;
import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.PartyRankingMenuItemFactory;
import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.pagecommands.PageCommandPartyRankingConstants;
import com.hack23.cia.web.impl.ui.application.views.common.rows.RowUtil;
import com.jarektoro.responsivelayout.ResponsiveRow;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.VerticalLayout;
/**
* The Class PartyRankingMenuItemFactoryImpl.
*
* <p>
* Responsible for creating and organizing party ranking menu items, charts, and
* overview pages. Enhances user navigation to analyze party influence, roles,
* and performance within EU, government, committees, and parliament. Leverages
* VaadinIcons to visually communicate context and concise descriptions focusing
* on political significance.
* </p>
*/
@Service
public final class PartyRankingMenuItemFactoryImpl extends AbstractMenuItemFactoryImpl
implements PartyRankingMenuItemFactory {
/** Application menu item factory for integrating ranking menus. */
@Autowired
private ApplicationMenuItemFactory applicationMenuItemFactory;
/**
* Instantiates a new party ranking menu item factory implementation.
*/
public PartyRankingMenuItemFactoryImpl() {
super();
}
/**
* Creates the overview page with concise, politically focused descriptions.
* Each button link is accompanied by ~50 character descriptions highlighting
* political context rather than technical details.
*
* @param panelContent the vertical layout to hold the overview content
*/
@Override
public void createOverviewPage(final VerticalLayout panelContent) {
final ResponsiveRow grid = RowUtil.createGridLayout(panelContent);
createButtonLink(grid, PART_LEADERS_SCOREBOARD, VaadinIcons.TROPHY,
COMMAND_PARTY_LEADER_SCOREBOARD, DESC_LEADERS_SCOREBOARD);
createButtonLink(grid, TOTAL_MEMBERS, VaadinIcons.USERS,
PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_DATAGRID, DESC_ALL_PARTIES_ROLES);
createButtonLink(grid, CURRENT_PARTIES_ACTIVE_IN_MINISTRIES_HEAD_COUNT_TEXT, VaadinIcons.INSTITUTION,
COMMAND_CHARTS_CURRENT_GOVERNMENT_PARTIES, DESC_GOVERNMENT_HEADCOUNT);
createButtonLink(grid, CURRENT_PARTIES_ACTIVE_IN_COMMITTEES_HEAD_COUNT, VaadinIcons.GROUP,
PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_CHARTS_CURRENT_PARTIES, DESC_COMMITTEES_HEADCOUNT);
createButtonLink(grid, CURRENT_PARTIES_ACTIVE_IN_PARLIAMENT_HEAD_COUNT, VaadinIcons.INSTITUTION,
COMMAND_CHARTS_CURRENT_GOVERNMENT_PARTIES, DESC_PARLIAMENT_HEADCOUNT);
createButtonLink(grid, ALL_PARTIES_TOTAL_DAYS_SERVED_IN_PARLIAMENT, VaadinIcons.CLOCK,
PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_CHARTS_ALL_PARTIES, DESC_DAYS_SERVED_PARLIAMENT);
createButtonLink(grid, RANKING_PAGE_VISIT_TEXT, VaadinIcons.CHART,
PARTY_RANKING_COMMAND_PAGEVISIT_HISTORY, RANKING_PAGE_VISIT_DESC);
}
/**
* Creates the party ranking menu bar and integrates it into the main
* application
* menu. Ensures consistent icon usage and logical grouping of party ranking
* topics.
*
* @param menuBar the main menu bar to which the party ranking items will be
* added
*/
@Override
public void createPartyRankingMenuBar(final MenuBar menuBar) {
initApplicationMenuBar(menuBar);
applicationMenuItemFactory.addRankingMenu(menuBar);
// Suitable icon (e.g., LINE_CHART) for ranking visualization
createPartyRankingTopics(menuBar.addItem(PARTY_RANKING, VaadinIcons.LINE_CHART, null));
}
/**
* Adds party ranking topics to the specified menu item. Uses icons that reflect
* the content context, such as charts for data visualization, groups or
* institutions for organizational structures, and history for past activity.
*
* @param partynMenuItem the parent menu item to which party ranking topics are
* added
*/
@Override
public void createPartyRankingTopics(final MenuItem partynMenuItem) {
// Use specific ranking commands instead of generic ones
partynMenuItem.addItem(RANKING_OVERVIEW_TEXT, VaadinIcons.DASHBOARD,
PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_OVERVIEW);
partynMenuItem.addItem(OVERVIEW_TEXT, VaadinIcons.DASHBOARD, PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_OVERVIEW);
partynMenuItem.addItem(PART_LEADERS_SCOREBOARD, VaadinIcons.TROPHY,
COMMAND_PARTY_LEADER_SCOREBOARD);
// Total members using USERS icon for multiple people
final MenuItem listItem = partynMenuItem.addItem(TOTAL_MEMBERS, VaadinIcons.USERS, PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_DATAGRID);
listItem.setDescription(PARTY_BY_TOTAL_MEMBERS_BASED_ON_ROLES_IN_DEPARTMENTS_COMMITTEES_AND_PARLIAMENT);
final MenuItem chartByTopic = partynMenuItem.addItem(CHART_BY_TOPIC_TEXT, VaadinIcons.CHART, null);
chartByTopic.addItem(CURRENT_PARTIES_ACTIVE_IN_MINISTRIES_HEAD_COUNT_TEXT, VaadinIcons.INSTITUTION,
PageCommandPartyRankingConstants.COMMAND_CHARTS_CURRENT_GOVERNMENT_PARTIES);
chartByTopic.addItem(CURRENT_PARTIES_ACTIVE_IN_COMMITTEES_HEAD_COUNT, VaadinIcons.GROUP,
PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_CHARTS_CURRENT_PARTIES);
chartByTopic.addItem(CURRENT_PARTIES_ACTIVE_IN_PARLIAMENT_HEAD_COUNT, VaadinIcons.INSTITUTION,
COMMAND_CHARTS_CURRENT_GOVERNMENT_PARTIES);
chartByTopic.addItem(ALL_PARTIES_TOTAL_DAYS_SERVED_IN_PARLIAMENT, VaadinIcons.CLOCK,
PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_CHARTS_ALL_PARTIES);
partynMenuItem.addItem(RANKING_PAGE_VISIT_TEXT, VaadinIcons.CHART,
PARTY_RANKING_COMMAND_PAGEVISIT_HISTORY);
partynMenuItem.addItem(RANKING_OVERVIEW_TEXT, VaadinIcons.DASHBOARD,
PageCommandPartyRankingConstants.COMMAND_PARTY_RANKING_OVERVIEW);
partynMenuItem.addItem(RANKING_PAGE_VISIT_TEXT, VaadinIcons.CHART,
PARTY_RANKING_COMMAND_PAGEVISIT_HISTORY);
}
}