/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ /** * */ package org.roda.wui.client.main; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.roda.core.data.v2.user.User; import org.roda.wui.client.browse.BrowseAIP; import org.roda.wui.client.browse.PreservationEvents; import org.roda.wui.client.common.UserLogin; import org.roda.wui.client.common.utils.JavascriptUtils; import org.roda.wui.client.ingest.Ingest; import org.roda.wui.client.ingest.appraisal.IngestAppraisal; import org.roda.wui.client.ingest.preingest.PreIngest; import org.roda.wui.client.ingest.transfer.IngestTransfer; import org.roda.wui.client.management.Management; import org.roda.wui.client.management.MemberManagement; import org.roda.wui.client.management.NotificationRegister; import org.roda.wui.client.management.Profile; import org.roda.wui.client.management.Register; import org.roda.wui.client.management.Statistics; import org.roda.wui.client.management.UserLog; import org.roda.wui.client.planning.FormatRegister; import org.roda.wui.client.planning.Planning; import org.roda.wui.client.planning.PreservationAgents; import org.roda.wui.client.planning.RiskRegister; import org.roda.wui.client.process.ActionProcess; import org.roda.wui.client.process.IngestProcess; import org.roda.wui.client.process.InternalProcess; import org.roda.wui.client.search.Search; import org.roda.wui.client.welcome.Help; import org.roda.wui.client.welcome.Welcome; import org.roda.wui.common.client.ClientLogger; import org.roda.wui.common.client.HistoryResolver; import org.roda.wui.common.client.LoginStatusListener; import org.roda.wui.common.client.tools.HistoryUtils; import org.roda.wui.common.client.widgets.wcag.AcessibleMenuBar; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.Widget; import config.i18n.client.ClientMessages; /** * @author Luis Faria * */ public class Menu extends Composite { private ClientLogger logger = new ClientLogger(getClass().getName()); private static ClientMessages messages = (ClientMessages) GWT.create(ClientMessages.class); private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); interface MyUiBinder extends UiBinder<Widget, Menu> { } @UiField AcessibleMenuBar leftMenu; @UiField AcessibleMenuBar rightMenu; private final MenuItem about; private MenuItem disseminationBrowse; private MenuItem disseminationSearchBasic; private final AcessibleMenuBar ingestMenu; private MenuItem ingestPre; private MenuItem ingestTransfer; private MenuItem ingestList; private MenuItem ingestAppraisal; private final AcessibleMenuBar administrationMenu; private MenuItem administrationActions; private MenuItem administrationInternalActions; private MenuItem administrationUser; private MenuItem administrationLog; private MenuItem administrationNotifications; private MenuItem administrationStatistics; // private MenuItem administrationPreferences; private final AcessibleMenuBar planningMenu; // private MenuItem planningMonitoring; private MenuItem planningRisk; private MenuItem planningFormat; private MenuItem planningEvent; private MenuItem planningAgent; private final MenuItem help; private final AcessibleMenuBar userMenu; private final AcessibleMenuBar languagesMenu; // private final MenuBar settingsMenu; private String selectedLanguage; private int leftMenuItemCount = 0; /** * Main menu constructor * */ public Menu() { initWidget(uiBinder.createAndBindUi(this)); about = customMenuItem("fa fa-home", messages.title("about"), "menu-item-label", null, createCommand(Welcome.RESOLVER.getHistoryPath())); disseminationBrowse = new MenuItem(messages.title("browse"), createCommand(BrowseAIP.RESOLVER.getHistoryPath())); disseminationBrowse.addStyleName("browse_menu_item"); disseminationSearchBasic = new MenuItem(messages.title("search"), createCommand(Search.RESOLVER.getHistoryPath())); disseminationSearchBasic.addStyleName("search_menu_item"); ingestMenu = new AcessibleMenuBar(true); ingestPre = ingestMenu.addItem(messages.title("ingest_preIngest"), createCommand(PreIngest.RESOLVER.getHistoryPath())); ingestPre.addStyleName("ingest_pre_item"); ingestTransfer = ingestMenu.addItem(messages.title("ingest_transfer"), createCommand(IngestTransfer.RESOLVER.getHistoryPath())); ingestTransfer.addStyleName("ingest_transfer_item"); ingestList = ingestMenu.addItem(messages.title("ingest_list"), createCommand(IngestProcess.RESOLVER.getHistoryPath())); ingestList.addStyleName("ingest_list_item"); ingestAppraisal = ingestMenu.addItem(messages.title("ingest_appraisal"), createCommand(IngestAppraisal.RESOLVER.getHistoryPath())); ingestAppraisal.addStyleName("ingest_appraisal_item"); administrationMenu = new AcessibleMenuBar(true); administrationActions = administrationMenu.addItem(messages.title("administration_actions"), createCommand(ActionProcess.RESOLVER.getHistoryPath())); administrationActions.addStyleName("administration_actions_item"); administrationInternalActions = administrationMenu.addItem(messages.title("administration_internal_actions"), createCommand(InternalProcess.RESOLVER.getHistoryPath())); administrationInternalActions.addStyleName("administration_internal_actions_item"); administrationUser = administrationMenu.addItem(messages.title("administration_user"), createCommand(MemberManagement.RESOLVER.getHistoryPath())); administrationUser.addStyleName("administration_user_item"); administrationLog = administrationMenu.addItem(messages.title("administration_log"), createCommand(UserLog.RESOLVER.getHistoryPath())); administrationLog.addStyleName("administration_log_item"); administrationNotifications = administrationMenu.addItem(messages.title("administration_notifications"), createCommand(NotificationRegister.RESOLVER.getHistoryPath())); administrationNotifications.addStyleName("administration_notifications_item"); administrationStatistics = administrationMenu.addItem(messages.title("administration_statistics"), createCommand(Statistics.RESOLVER.getHistoryPath())); administrationStatistics.addStyleName("administration_statistics_item"); // administration_preferences = // administrationMenu.addItem(messages.title("administrationPreferences"), // createCommand(Management.RESOLVER.getHistoryPath())); planningMenu = new AcessibleMenuBar(true); // planningMonitoring = // planningMenu.addItem(messages.title("planning_monitoring"), // createCommand(Planning.RESOLVER.getHistoryPath())); planningRisk = planningMenu.addItem(messages.title("planning_risk"), createCommand(RiskRegister.RESOLVER.getHistoryPath())); planningRisk.addStyleName("planning_risk_item"); planningFormat = planningMenu.addItem(messages.title("planning_format"), createCommand(FormatRegister.RESOLVER.getHistoryPath())); planningFormat.addStyleName("planning_format_item"); planningEvent = planningMenu.addItem(messages.title("planning_event"), createCommand(PreservationEvents.PLANNING_RESOLVER.getHistoryPath())); planningEvent.addStyleName("planning_event_item"); planningAgent = planningMenu.addItem(messages.title("planning_agent"), createCommand(PreservationAgents.RESOLVER.getHistoryPath())); planningAgent.addStyleName("planning_agent_item"); help = new MenuItem(messages.title("help"), createCommand(Help.RESOLVER.getHistoryPath())); help.addStyleName("help_menu_item"); userMenu = new AcessibleMenuBar(true); MenuItem profile = userMenu.addItem(messages.loginProfile(), createCommand(Profile.RESOLVER.getHistoryPath())); profile.addStyleName("profile_user_item"); MenuItem login = userMenu.addItem(messages.loginLogout(), new ScheduledCommand() { @Override public void execute() { UserLogin.getInstance().logout(); } }); login.addStyleName("login_user_item"); languagesMenu = new AcessibleMenuBar(true); setLanguageMenu(); // settingsMenu = new MenuBar(true); UserLogin.getInstance().getAuthenticatedUser(new AsyncCallback<User>() { @Override public void onFailure(Throwable caught) { logger.fatal("Error getting Authenticated user", caught); } @Override public void onSuccess(User user) { updateVisibles(user); } }); UserLogin.getInstance().addLoginStatusListener(new LoginStatusListener() { @Override public void onLoginStatusChanged(User user) { updateVisibles(user); } }); } private ScheduledCommand createCommand(final List<String> path) { return new ScheduledCommand() { @Override public void execute() { HistoryUtils.newHistory(path); } }; } private ScheduledCommand createLoginCommand() { return new ScheduledCommand() { @Override public void execute() { UserLogin.getInstance().login(); } }; } private void updateVisibles(User user) { leftMenu.clearItems(); leftMenuItemCount = 0; rightMenu.clearItems(); // TODO make creating sync (not async) // Home updateResolverTopItemVisibility(Welcome.RESOLVER, about, 0); // Dissemination updateResolverTopItemVisibility(BrowseAIP.RESOLVER, disseminationBrowse, 1); updateResolverTopItemVisibility(Search.RESOLVER, disseminationSearchBasic, 2); // Ingest updateResolverSubItemVisibility(PreIngest.RESOLVER, ingestPre); updateResolverSubItemVisibility(IngestTransfer.RESOLVER, ingestTransfer); updateResolverSubItemVisibility(IngestProcess.RESOLVER, ingestList); updateResolverSubItemVisibility(IngestAppraisal.RESOLVER, ingestAppraisal); MenuItem ingestItem = new MenuItem(messages.title("ingest"), ingestMenu); ingestItem.addStyleName("ingest_menu_item"); updateResolverTopItemVisibility(Ingest.RESOLVER, ingestItem, 3); // Administration updateResolverSubItemVisibility(ActionProcess.RESOLVER, administrationActions); updateResolverSubItemVisibility(InternalProcess.RESOLVER, administrationInternalActions); updateResolverSubItemVisibility(MemberManagement.RESOLVER, administrationUser); updateResolverSubItemVisibility(UserLog.RESOLVER, administrationLog); updateResolverSubItemVisibility(NotificationRegister.RESOLVER, administrationNotifications); updateResolverSubItemVisibility(Statistics.RESOLVER, administrationStatistics); // updateResolverSubItemVisibility(Management.RESOLVER, // administrationPreferences); MenuItem adminItem = new MenuItem(messages.title("administration"), administrationMenu); adminItem.addStyleName("administration_menu_item"); updateResolverTopItemVisibility(Management.RESOLVER, adminItem, 4); // Planning // updateResolverSubItemVisibility(Planning.RESOLVER, planningMonitoring); updateResolverSubItemVisibility(RiskRegister.RESOLVER, planningRisk); updateResolverSubItemVisibility(FormatRegister.RESOLVER, planningFormat); updateResolverSubItemVisibility(PreservationEvents.PLANNING_RESOLVER, planningEvent); updateResolverSubItemVisibility(PreservationAgents.RESOLVER, planningAgent); MenuItem planningItem = new MenuItem(messages.title("planning"), planningMenu); planningItem.addStyleName("planning_menu_item"); updateResolverTopItemVisibility(Planning.RESOLVER, planningItem, 5); // Help updateResolverTopItemVisibility(Help.RESOLVER, help, 6); // User if (user.isGuest()) { MenuItem loginItem = customMenuItem("fa fa-user", messages.loginLogin(), "menu-item-label", null, createLoginCommand()); loginItem.addStyleName("user_menu_item"); rightMenu.addItem(loginItem); MenuItem registerItem = customMenuItem("fa fa-user-plus", messages.loginRegister(), "menu-item-label menu-register", null, createCommand(Register.RESOLVER.getHistoryPath())); registerItem.addStyleName("user_menu_item_register"); rightMenu.addItem(registerItem); } else { // rightMenu.addItem(customMenuItem("fa fa-cog", // messages.title("settings"), "menu-item-label", settingsMenu, null)); MenuItem userItem = customMenuItem("fa fa-user", user.getName(), "menu-item-label", userMenu, null); userItem.addStyleName("user_menu_item"); rightMenu.addItem(userItem); } MenuItem languageMenuItem = customMenuItem("fa fa-globe", selectedLanguage, "menu-item-label", languagesMenu, null); languageMenuItem.addStyleName("menu-item-language"); rightMenu.addItem(languageMenuItem); } private MenuItem customMenuItem(String icon, String label, String styleNames, MenuBar subMenu, ScheduledCommand command) { SafeHtmlBuilder b = new SafeHtmlBuilder(); String iconHTML = "<i class='" + icon + "'></i>"; b.append(SafeHtmlUtils.fromSafeConstant(iconHTML)); if (label != null) b.append(SafeHtmlUtils.fromSafeConstant(label)); MenuItem menuItem; if (subMenu != null) { menuItem = new MenuItem(b.toSafeHtml(), subMenu); } else if (command != null) { menuItem = new MenuItem(b.toSafeHtml(), command); } else { menuItem = new MenuItem(b.toSafeHtml()); } menuItem.addStyleName("menu-item"); menuItem.addStyleName(styleNames); return menuItem; } private void updateResolverTopItemVisibility(final HistoryResolver resolver, final MenuItem item, final int index) { resolver.isCurrentUserPermitted(new AsyncCallback<Boolean>() { @Override public void onFailure(Throwable caught) { logger.error("Error getting role", caught); } @Override public void onSuccess(Boolean asRole) { if (asRole) { insertIntoLeftMenu(item, index); } } }); } private void updateResolverSubItemVisibility(final HistoryResolver resolver, final MenuItem item) { resolver.isCurrentUserPermitted(new AsyncCallback<Boolean>() { @Override public void onFailure(Throwable caught) { logger.error("Error getting role", caught); } @Override public void onSuccess(Boolean asRole) { item.setVisible(asRole); } }); } private void insertIntoLeftMenu(MenuItem item, int index) { int indexToInsert = index <= leftMenuItemCount ? index : leftMenuItemCount; leftMenu.insertItem(item, indexToInsert); leftMenuItemCount++; } private void setLanguageMenu() { String locale = LocaleInfo.getCurrentLocale().getLocaleName(); // Getting supported languages and their display name Map<String, String> supportedLanguages = new HashMap<>(); for (String localeName : LocaleInfo.getAvailableLocaleNames()) { if (!"default".equals(localeName)) { supportedLanguages.put(localeName, LocaleInfo.getLocaleNativeDisplayName(localeName)); } } languagesMenu.clearItems(); for (final Entry<String, String> entry : supportedLanguages.entrySet()) { final String key = entry.getKey(); final String value = entry.getValue(); if (key.equals(locale)) { SafeHtmlBuilder b = new SafeHtmlBuilder(); String iconHTML = "<i class='fa fa-check'></i>"; b.append(SafeHtmlUtils.fromSafeConstant(value)); b.append(SafeHtmlUtils.fromSafeConstant(iconHTML)); MenuItem languageMenuItem = new MenuItem(b.toSafeHtml()); languageMenuItem.addStyleName("menu-item-language-selected"); languageMenuItem.addStyleName("menu-item-language"); languagesMenu.addItem(languageMenuItem); selectedLanguage = value; } else { MenuItem languageMenuItem = new MenuItem(SafeHtmlUtils.fromSafeConstant(value), new ScheduledCommand() { @Override public void execute() { JavascriptUtils.changeLocale(key); } }); languagesMenu.addItem(languageMenuItem); languageMenuItem.addStyleName("menu-item-language"); } } } }