package com.constellio.app.modules.rm.navigation; import com.constellio.app.entities.navigation.NavigationConfig; import com.constellio.app.entities.navigation.NavigationItem; import com.constellio.app.entities.navigation.PageItem.RecentItemTable; import com.constellio.app.entities.navigation.PageItem.RecordTable; import com.constellio.app.entities.navigation.PageItem.RecordTree; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.constants.RMTaxonomies; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningSecurityService; import com.constellio.app.modules.rm.ui.components.contextmenu.DocumentContextMenuImpl; import com.constellio.app.modules.rm.ui.pages.agent.AgentRequestViewImpl; import com.constellio.app.modules.rm.ui.pages.agent.AgentSetupViewImpl; import com.constellio.app.modules.rm.ui.pages.agent.ListAgentLogsViewImpl; import com.constellio.app.modules.rm.ui.pages.cart.CartViewImpl; import com.constellio.app.modules.rm.ui.pages.cart.CartsListViewImpl; import com.constellio.app.modules.rm.ui.pages.containers.ContainersByAdministrativeUnitsViewImpl; import com.constellio.app.modules.rm.ui.pages.containers.ContainersInAdministrativeUnitViewImpl; import com.constellio.app.modules.rm.ui.pages.containers.ContainersInFilingSpaceViewImpl; import com.constellio.app.modules.rm.ui.pages.containers.DisplayContainerViewImpl; import com.constellio.app.modules.rm.ui.pages.containers.edit.AddEditContainerViewImpl; import com.constellio.app.modules.rm.ui.pages.decommissioning.*; import com.constellio.app.modules.rm.ui.pages.document.AddEditDocumentViewImpl; import com.constellio.app.modules.rm.ui.pages.document.DisplayDocumentViewImpl; import com.constellio.app.modules.rm.ui.pages.email.AddEmailAttachmentsToFolderViewImpl; import com.constellio.app.modules.rm.ui.pages.folder.AddEditFolderViewImpl; import com.constellio.app.modules.rm.ui.pages.folder.DisplayFolderView; import com.constellio.app.modules.rm.ui.pages.folder.DisplayFolderViewImpl; import com.constellio.app.modules.rm.ui.pages.home.CheckedOutDocumentsTable; import com.constellio.app.modules.rm.ui.pages.management.ArchiveManagementViewImpl; import com.constellio.app.modules.rm.ui.pages.reports.RMReportsViewImpl; import com.constellio.app.modules.rm.ui.pages.retentionRule.AddEditRetentionRuleViewImpl; import com.constellio.app.modules.rm.ui.pages.retentionRule.DisplayRetentionRuleViewImpl; import com.constellio.app.modules.rm.ui.pages.retentionRule.ListRetentionRulesViewImpl; import com.constellio.app.modules.rm.ui.pages.retentionRule.SearchRetentionRulesViewImpl; import com.constellio.app.modules.rm.ui.pages.userDocuments.ListUserDocumentsViewImpl; import com.constellio.app.modules.rm.ui.pages.viewGroups.AgentViewGroup; import com.constellio.app.modules.rm.ui.pages.viewGroups.ArchivesManagementViewGroup; import com.constellio.app.modules.rm.ui.util.ConstellioAgentUtils; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.UniformSubdivision; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.migrations.CoreNavigationConfiguration; import com.constellio.app.ui.application.ConstellioUI; import com.constellio.app.ui.application.Navigation; import com.constellio.app.ui.application.NavigatorConfigurationService; import com.constellio.app.ui.framework.components.ComponentState; import com.constellio.app.ui.framework.components.contextmenu.BaseContextMenu; import com.constellio.app.ui.framework.data.RecordLazyTreeDataProvider; import com.constellio.app.ui.framework.data.RecordVODataProvider; import com.constellio.app.ui.pages.base.ConstellioHeader; import com.constellio.app.ui.pages.base.MainLayout; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.app.ui.pages.home.HomeView; import com.constellio.app.ui.pages.home.RecentItemProvider; import com.constellio.app.ui.pages.home.TaxonomyTabSheet; import com.constellio.app.ui.pages.management.AdminView; import com.constellio.app.ui.pages.viewGroups.CartViewGroup; import com.constellio.app.ui.pages.viewGroups.LogsViewGroup; import com.constellio.app.ui.pages.viewGroups.UserDocumentsViewGroup; import com.constellio.model.entities.CorePermissions; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.security.global.AgentStatus; import com.constellio.model.entities.security.global.SolrUserCredential; import com.constellio.model.services.configs.SystemConfigurationsManager; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.users.UserServices; import com.vaadin.navigator.View; import com.vaadin.server.FontAwesome; import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuOpenedListener.TreeListener; import org.vaadin.peter.contextmenu.ContextMenu.ContextMenuOpenedOnTreeItemEvent; import java.io.Serializable; import java.util.List; import static com.constellio.app.ui.framework.components.ComponentState.enabledIf; import static com.constellio.app.ui.framework.components.ComponentState.visibleIf; public class RMNavigationConfiguration implements Serializable { public static final String NEW_DOCUMENT = "newDocument"; public static final String ADD_FOLDER = "addFolder"; public static final String ADD_DOCUMENT = "addDocument"; public static final String LAST_VIEWED_FOLDERS = "lastViewedFolders"; public static final String LAST_VIEWED_DOCUMENTS = "lastViewedDocuments"; public static final String CHECKED_OUT_DOCUMENTS = "checkedOutDocuments"; public static final String TAXONOMIES = "taxonomies"; public static final String UNIFORM_SUBDIVISIONS = "uniformSubdivisions"; public static final String UNIFORM_SUBDIVISIONS_ICON = "images/icons/config/uniform-subdivision.png"; public static final String RETENTION_CALENDAR = "retentionCalendar"; public static final String RETENTION_CALENDAR_ICON = "images/icons/config/calendar.png"; public static final String ADMINISTRATIVE_UNIT = "administrativeUnit"; public static final String ADMINISTRATIVE_UNIT_ICON = "images/icons/config/administrative-unit.png"; public static final String CLASSIFICATION_PLAN = "classificationPlan"; public static final String CLASSIFICATION_PLAN_ICON = "images/icons/config/classification-plan.png"; public static final String ARCHIVES_MANAGEMENT = "archiveManagement"; public static final String USER_DOCUMENTS = "userDocuments"; public static final String AGENT = "agent"; public static final String CART = "cart"; public static final String LIST_CARTS = "listCarts"; public static final String LOGS = "logs"; public static final String REPORTS = "reports"; public static final String REQUEST_AGENT = "requestAgent"; public static final String AGENT_SETUP = "agentSetup"; public static final String LIST_AGENT_LOGS = "listAgentLogs"; public static final String EDIT_CONTAINER = "editContainer"; public static final String CONTAINERS_BY_ADMIN_UNITS = "containersByAdminUnits"; public static final String DISPLAY_ADMIN_UNIT_WITH_CONTAINERS = "displayAdminUnitWithContainers"; public static final String DISPLAY_FILING_SPACE_WITH_CONTAINERS = "displayFilingSpaceWithContainers"; public static final String DISPLAY_CONTAINER = "displayContainer"; public static final String DECOMMISSIONING_LIST_ADD_EXISTING_CONTAINER = "searchContainerForDecommissioningList"; public static final String DECOMMISSIONING_LIST_ADD_NEW_CONTAINER = "createContainerForDecommissioningList"; public static final String DECOMMISSIONING_LIST_BUILDER = "decommissioningListBuilder"; public static final String DECOMMISSIONING_LIST_DISPLAY = "decommissioningList"; public static final String DECOMMISSIONING = "decommissioning"; public static final String DOCUMENT_DECOMMISSIONING_LIST_DISPLAY = "documentDecommissioningList"; public static final String DECOMMISSIONING_LIST_EDIT = "editDecommissioningList"; public static final String EDIT_DOCUMENT = "editDocument"; public static final String DUPLICATE_FOLDER = "duplicateFolder"; public static final String DISPLAY_DOCUMENT = "displayDocument"; public static final String ADD_EMAIL_ATTACHMENTS_TO_FOLDER = "addEmailAttachmentsToFolder"; public static final String EDIT_FOLDER = "editFolder"; public static final String DISPLAY_FOLDER = "displayFolder"; public static final String ADD_RETENTION_RULE = "addRetentionRule"; public static final String EDIT_RETENTION_RULE = "editRetentionRule"; public static final String DISPLAY_RETENTION_RULE = "displayRetentionRule"; public static final String LIST_RETENTION_RULES = "listRetentionRules"; public static final String RETENTION_RULES_SEARCH = "retentionRuleSearch"; public static final String LIST_USER_DOCUMENTS = "listUserDocuments"; public static void configureNavigation(NavigationConfig config) { configureHeaderActionMenu(config); configureHomeFragments(config); configureCollectionAdmin(config); configureMainLayoutNavigation(config); } public static void configureNavigation(NavigatorConfigurationService service) { service.register(REPORTS, RMReportsViewImpl.class); service.register(REQUEST_AGENT, AgentRequestViewImpl.class); service.register(AGENT_SETUP, AgentSetupViewImpl.class); service.register(LIST_AGENT_LOGS, ListAgentLogsViewImpl.class); service.register(CART, CartViewImpl.class); service.register(LIST_CARTS, CartsListViewImpl.class); service.register(EDIT_CONTAINER, AddEditContainerViewImpl.class); service.register(CONTAINERS_BY_ADMIN_UNITS, ContainersByAdministrativeUnitsViewImpl.class); service.register(DISPLAY_ADMIN_UNIT_WITH_CONTAINERS, ContainersInAdministrativeUnitViewImpl.class); service.register(DISPLAY_FILING_SPACE_WITH_CONTAINERS, ContainersInFilingSpaceViewImpl.class); service.register(DISPLAY_CONTAINER, DisplayContainerViewImpl.class); service.register(DECOMMISSIONING_LIST_ADD_EXISTING_CONTAINER, AddExistingContainerViewImpl.class); service.register(DECOMMISSIONING_LIST_ADD_NEW_CONTAINER, AddNewContainerViewImpl.class); service.register(DECOMMISSIONING_LIST_BUILDER, DecommissioningBuilderViewImpl.class); service.register(DECOMMISSIONING_LIST_DISPLAY, DecommissioningListViewImpl.class); service.register(DECOMMISSIONING, DecommissioningMainViewImpl.class); service.register(DOCUMENT_DECOMMISSIONING_LIST_DISPLAY, DocumentDecommissioningListViewImpl.class); service.register(DECOMMISSIONING_LIST_EDIT, EditDecommissioningListViewImpl.class); service.register(ADD_DOCUMENT, AddEditDocumentViewImpl.class); service.register(EDIT_DOCUMENT, AddEditDocumentViewImpl.class); service.register(DISPLAY_DOCUMENT, DisplayDocumentViewImpl.class); service.register(ADD_EMAIL_ATTACHMENTS_TO_FOLDER, AddEmailAttachmentsToFolderViewImpl.class); service.register(ADD_FOLDER, AddEditFolderViewImpl.class); service.register(EDIT_FOLDER, AddEditFolderViewImpl.class); service.register(DUPLICATE_FOLDER, AddEditFolderViewImpl.class); service.register(DISPLAY_FOLDER, DisplayFolderViewImpl.class); service.register(ARCHIVES_MANAGEMENT, ArchiveManagementViewImpl.class); service.register(ADD_RETENTION_RULE, AddEditRetentionRuleViewImpl.class); service.register(EDIT_RETENTION_RULE, AddEditRetentionRuleViewImpl.class); service.register(DISPLAY_RETENTION_RULE, DisplayRetentionRuleViewImpl.class); service.register(LIST_RETENTION_RULES, ListRetentionRulesViewImpl.class); service.register(RETENTION_RULES_SEARCH, SearchRetentionRulesViewImpl.class); service.register(LIST_USER_DOCUMENTS, ListUserDocumentsViewImpl.class); } private static void configureHeaderActionMenu(NavigationConfig config) { config.add(ConstellioHeader.ACTION_MENU, new NavigationItem.Active(ADD_FOLDER) { @Override public void activate(Navigation navigate) { View currentView = ConstellioUI.getCurrent().getCurrentView(); if (currentView instanceof DisplayFolderView) { DisplayFolderView displayFolderView = (DisplayFolderView) currentView; String parentFolderId = displayFolderView.getRecord().getId(); navigate.to(RMViews.class).addFolder(parentFolderId); } else { navigate.to(RMViews.class).addFolder(); } } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return enabledIf(user.has(RMPermissionsTo.CREATE_FOLDERS).onSomething()); } }, 0); config.add(ConstellioHeader.ACTION_MENU, new NavigationItem.Active(NEW_DOCUMENT) { @Override public void activate(Navigation navigate) { View currentView = ConstellioUI.getCurrent().getCurrentView(); if (currentView instanceof DisplayFolderView) { DisplayFolderView displayFolderView = (DisplayFolderView) currentView; String folderId = displayFolderView.getRecord().getId(); navigate.to(RMViews.class).newDocument(folderId); } else { navigate.to(RMViews.class).newDocument(); } } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return enabledIf(user.has(RMPermissionsTo.CREATE_DOCUMENTS).onSomething()); } }, 1); config.add(ConstellioHeader.ACTION_MENU, new NavigationItem.Active(ADD_DOCUMENT) { @Override public void activate(Navigation navigate) { View currentView = ConstellioUI.getCurrent().getCurrentView(); if (currentView instanceof DisplayFolderView) { DisplayFolderView displayFolderView = (DisplayFolderView) currentView; String folderId = displayFolderView.getRecord().getId(); navigate.to(RMViews.class).addDocument(folderId); } else { navigate.to(RMViews.class).addDocument(); } } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return enabledIf(user.has(RMPermissionsTo.CREATE_DOCUMENTS).onSomething()); } }, 2); } private static void configureHomeFragments(NavigationConfig config) { RecordTree taxonomyTree = new RecordTree(TAXONOMIES) { @Override public List<RecordLazyTreeDataProvider> getDataProviders(AppLayerFactory appLayerFactory, SessionContext sessionContext) { TaxonomyTabSheet tabSheet = new TaxonomyTabSheet(appLayerFactory.getModelLayerFactory(), sessionContext); if (getDefaultDataProvider() == -1) { int defaultTab = tabSheet.getDefaultTab(); setDefaultDataProvider(defaultTab); } return tabSheet.getDataProviders(); } @Override public BaseContextMenu getContextMenu() { final DocumentContextMenuImpl menu = new DocumentContextMenuImpl(); menu.addContextMenuTreeListener(new TreeListener() { @Override public void onContextMenuOpenFromTreeItem(ContextMenuOpenedOnTreeItemEvent event) { String recordId = (String) event.getItemId(); menu.openFor(recordId); } }); return menu; } }; if (!config.hasNavigationItem(HomeView.TABS, TAXONOMIES)) { config.add(HomeView.TABS, taxonomyTree); } else { config.replace(HomeView.TABS, taxonomyTree); } config.add(HomeView.TABS, new RecentItemTable(LAST_VIEWED_FOLDERS) { @Override public List<RecentItem> getItems(AppLayerFactory appLayerFactory, SessionContext sessionContext) { return new RecentItemProvider(appLayerFactory.getModelLayerFactory(), sessionContext, Folder.SCHEMA_TYPE, "view_folder").getItems(); } }); config.add(HomeView.TABS, new RecentItemTable(LAST_VIEWED_DOCUMENTS) { @Override public List<RecentItem> getItems(AppLayerFactory appLayerFactory, SessionContext sessionContext) { return new RecentItemProvider(appLayerFactory.getModelLayerFactory(), sessionContext, Document.SCHEMA_TYPE, "view_document") .getItems(); } }); config.add(HomeView.TABS, new RecordTable(CHECKED_OUT_DOCUMENTS) { @Override public RecordVODataProvider getDataProvider(AppLayerFactory appLayerFactory, SessionContext sessionContext) { return new CheckedOutDocumentsTable(appLayerFactory, sessionContext).getDataProvider(); } }); } private static void configureCollectionAdmin(NavigationConfig config) { config.add(AdminView.COLLECTION_SECTION, new NavigationItem.Active(ADMINISTRATIVE_UNIT, ADMINISTRATIVE_UNIT_ICON) { @Override public void activate(Navigation navigate) { navigate.to().taxonomyManagement(RMTaxonomies.ADMINISTRATIVE_UNITS); } @Override public int getOrderValue() { return 1; } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return visibleIf(user.has(CorePermissions.MANAGE_SECURITY).globally()); } }); config.add(AdminView.COLLECTION_SECTION, new NavigationItem.Active(CLASSIFICATION_PLAN, CLASSIFICATION_PLAN_ICON) { @Override public void activate(Navigation navigate) { navigate.to().taxonomyManagement(RMTaxonomies.CLASSIFICATION_PLAN); } @Override public int getOrderValue() { return 2; } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return visibleIf(user.has(RMPermissionsTo.MANAGE_CLASSIFICATION_PLAN).globally()); } }); config.add(AdminView.COLLECTION_SECTION, new NavigationItem.Active(UNIFORM_SUBDIVISIONS, UNIFORM_SUBDIVISIONS_ICON) { @Override public void activate(Navigation navigate) { navigate.to().listSchemaRecords(UniformSubdivision.DEFAULT_SCHEMA); } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return visibleIf(user.has(RMPermissionsTo.MANAGE_UNIFORMSUBDIVISIONS).globally()); } }); config.add(AdminView.COLLECTION_SECTION, new NavigationItem.Active(RETENTION_CALENDAR, RETENTION_CALENDAR_ICON) { @Override public void activate(Navigation navigate) { navigate.to(RMViews.class).listRetentionRules(); } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return visibleIf(user.has(RMPermissionsTo.MANAGE_RETENTIONRULE).globally()); } }); config.replace(AdminView.COLLECTION_SECTION, new NavigationItem.Decorator(getTaxonomyItem(config)) { @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return visibleIf(item.getStateFor(user, appLayerFactory).isVisible() || user.has(RMPermissionsTo.MANAGE_CLASSIFICATION_PLAN).globally()); } @Override public int getOrderValue() { return 999; } } ); } private static void configureMainLayoutNavigation(NavigationConfig config) { config.add(MainLayout.MAIN_LAYOUT_NAVIGATION, new NavigationItem.Active(ARCHIVES_MANAGEMENT, FontAwesome.ARCHIVE, ArchivesManagementViewGroup.class) { @Override public void activate(Navigation navigate) { navigate.to(RMViews.class).archiveManagement(); } @Override public int getOrderValue() { return 20; } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { DecommissioningSecurityService service = new DecommissioningSecurityService( user.getCollection(), appLayerFactory); return visibleIf(service.hasAccessToDecommissioningMainPage(user) || user.has(RMPermissionsTo.MANAGE_CONTAINERS).globally() || user.has(RMPermissionsTo.MANAGE_REPORTS).onSomething()); } }); config.add(MainLayout.MAIN_LAYOUT_NAVIGATION, new NavigationItem.Active(USER_DOCUMENTS, FontAwesome.SUITCASE, UserDocumentsViewGroup.class) { @Override public void activate(Navigation navigate) { navigate.to(RMViews.class).listUserDocuments(); } @Override public int getOrderValue() { return 40; } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return ComponentState.ENABLED; } }); config.add(MainLayout.MAIN_LAYOUT_NAVIGATION, new NavigationItem.Active(LIST_CARTS, FontAwesome.LIST_ALT, CartViewGroup.class) { @Override public void activate(Navigation navigate) { navigate.to(RMViews.class).listCarts(); } @Override public int getOrderValue() { return 45; } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return visibleIf(user.has(RMPermissionsTo.USE_CART).globally()); } }); config.add(MainLayout.MAIN_LAYOUT_NAVIGATION, new NavigationItem.Active(LOGS, FontAwesome.BOOK, LogsViewGroup.class) { @Override public void activate(Navigation navigate) { navigate.to(RMViews.class).eventAudit(); } @Override public int getOrderValue() { return 50; } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { return visibleIf(user.has(CorePermissions.VIEW_EVENTS).onSomething()); } }); config.add(MainLayout.MAIN_LAYOUT_NAVIGATION, new NavigationItem.Active(AGENT, FontAwesome.LAPTOP, AgentViewGroup.class) { @Override public void activate(Navigation navigate) { navigate.to(RMViews.class).requestAgent(); } @Override public int getOrderValue() { return 70; } @Override public ComponentState getStateFor(User user, AppLayerFactory appLayerFactory) { ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory(); UserServices userServices = modelLayerFactory.newUserServices(); SystemConfigurationsManager systemConfigurationsManager = modelLayerFactory.getSystemConfigurationsManager(); RMConfigs rmConfigs = new RMConfigs(systemConfigurationsManager); String username = user.getUsername(); SolrUserCredential userCredentials = (SolrUserCredential) userServices.getUser(username); AgentStatus agentStatus = userCredentials.getAgentStatus(); if (agentStatus == AgentStatus.DISABLED && !rmConfigs.isAgentDisabledUntilFirstConnection()) { agentStatus = AgentStatus.ENABLED; } return visibleIf(rmConfigs.isAgentEnabled() && ConstellioAgentUtils.isAgentSupported() && agentStatus == AgentStatus.DISABLED); } }); } private static NavigationItem getTaxonomyItem(NavigationConfig config) { return config.getNavigationItem(AdminView.COLLECTION_SECTION, CoreNavigationConfiguration.TAXONOMIES); } }