import {ChangeDetectorRef, Component, HostListener, OnDestroy, OnInit} from '@angular/core'; import {ActivatedRoute, Data, NavigationEnd, Params, Router} from '@angular/router'; import {EnvProperties} from './openaireLibrary/utils/properties/env-properties'; import {Role, Session, User} from './openaireLibrary/login/utils/helper.class'; import {UserManagementService} from "./openaireLibrary/services/user-management.service"; import {StakeholderService} from "./openaireLibrary/monitor/services/stakeholder.service"; import {BehaviorSubject, Subscriber} from "rxjs"; import {LayoutService} from "./openaireLibrary/dashboard/sharedComponents/sidebar/layout.service"; import {MenuItem} from "./openaireLibrary/sharedComponents/menu"; import { Category, Stakeholder, StakeholderEntities, Topic, Visibility } from "./openaireLibrary/monitor/entities/stakeholder"; import {LinksResolver} from "./search/links-resolver"; import {Header} from "./openaireLibrary/sharedComponents/navigationBar.component"; import {properties} from "../environments/environment"; import {ConfigurationService} from "./openaireLibrary/utils/configuration/configuration.service"; import {Option} from "./openaireLibrary/sharedComponents/input/input.component"; import {StakeholderUtils} from "./utils/indicator-utils"; import {SmoothScroll} from "./openaireLibrary/utils/smooth-scroll"; import {ConnectHelper} from "./openaireLibrary/connect/connectHelper"; import {ResourcesService} from "./openaireLibrary/monitor/services/resources.service"; import {StringUtils} from "./openaireLibrary/utils/string-utils.class"; @Component({ selector: 'app-root', templateUrl: './app.component.html' }) export class AppComponent implements OnInit, OnDestroy { properties: EnvProperties = properties; user: User; params: BehaviorSubject = new BehaviorSubject(null); data: BehaviorSubject = new BehaviorSubject(null); hasSidebar: boolean = false; hasHeader: boolean = false; hasAdminMenu: boolean = false; hasInternalSidebar: boolean = false; isFrontPage: boolean = false; isViewPublic: boolean = false; sideBarItems: MenuItem[] = []; specialSideBarMenuItem: MenuItem = null; menuItems: MenuItem[] = []; notificationGroups: Option[] = []; entities: string[]; notificationGroupsInitialized: boolean = false; stakeholderUtils: StakeholderUtils = new StakeholderUtils(); public stakeholderEntities = StakeholderEntities; menuHeader: Header = { route: "/", url: null, title: "Default menu header", logoUrl: null, logoSmallUrl: null, position: 'center', badge: true, menuPosition: "center" }; userMenuItems: MenuItem[] = []; adminMenuItems: MenuItem[] = []; stakeholder: Stakeholder = null; activeTopic: Topic = null; activeCategory: Category = null; loading: boolean = true; paramsResolved: boolean = false; innerWidth; private subscriptions: any[] = []; constructor(private route: ActivatedRoute, private router: Router, private userManagementService: UserManagementService, private layoutService: LayoutService, private smoothScroll: SmoothScroll, private stakeholderService: StakeholderService, private cdr: ChangeDetectorRef, private configurationService: ConfigurationService, private resourcesService: ResourcesService) { this.subscriptions.push(this.router.events.subscribe(event => { if (event instanceof NavigationEnd) { let r = this.route; while (r.firstChild) { r = r.firstChild; } this.paramsResolved = true; this.params.next(r.snapshot.params); this.data.next(r.snapshot.data); } })); } @HostListener('window:resize', ['$event']) onResize(event) { if (this.layoutService.isSmallScreen && event.target.innerWidth > 640) { this.layoutService.setSmallScreen(false); } else if (!this.layoutService.isSmallScreen && event.target.innerWidth <= 640) { this.layoutService.setSmallScreen(true); this.layoutService.setOpen(false); } } ngOnInit() { if (typeof document !== 'undefined' && window) { this.innerWidth = window.innerWidth; } this.subscriptions.push(this.layoutService.hasSidebar.subscribe(hasSidebar => { this.hasSidebar = hasSidebar; this.cdr.detectChanges(); })); this.subscriptions.push(this.layoutService.hasHeader.subscribe(hasHeader => { this.hasHeader = hasHeader; this.cdr.detectChanges(); })); this.subscriptions.push(this.layoutService.hasAdminMenu.subscribe(hasAdminMenu => { this.hasAdminMenu = hasAdminMenu; this.cdr.detectChanges(); })); this.subscriptions.push(this.layoutService.hasInternalSidebar.subscribe(hasInternalSidebar => { this.hasInternalSidebar = hasInternalSidebar; this.cdr.detectChanges(); })); this.subscriptions.push(this.layoutService.isFrontPage.subscribe(isFrontPage => { this.isFrontPage = isFrontPage; this.cdr.detectChanges(); })); this.route.queryParams.subscribe(params => { this.isViewPublic = (params['view'] == 'public'); }); this.layoutService.setSmallScreen((this.innerWidth && this.innerWidth <= 640)); this.layoutService.setOpen(!(this.innerWidth && this.innerWidth <= 640)); this.subscriptions.push(this.params.subscribe(params => { if (this.paramsResolved) { this.loading = true; if (params && params['stakeholder']) { if (!this.stakeholder || this.stakeholder.alias !== params['stakeholder']) { this.subscriptions.push(this.stakeholderService.getStakeholder(params['stakeholder']).subscribe(stakeholder => { if (stakeholder) { this.stakeholder = stakeholder; LinksResolver.setProperties(this.stakeholder.alias); this.setProperties(this.stakeholder.alias, this.stakeholder.type); this.buildMenu(); this.setActives(params); this.setSideBar(); this.loading = false; } else { this.stakeholder = null; LinksResolver.resetProperties(); this.navigateToError(); this.buildMenu(); this.loading = false; } })); } else { this.buildMenu(); this.setActives(params); this.loading = false; } } else { LinksResolver.resetProperties(); this.stakeholderService.setStakeholder(null); this.stakeholder = null; this.buildMenu(); this.loading = false; } } })); this.subscriptions.push(this.data.subscribe(data => { if (data && data.portal) { this.setProperties(data.portal); this.configurationService.initCommunityInformation(this.properties, this.properties.adminToolsCommunity); } })); this.subscriptions.push(this.userManagementService.getUserInfo().subscribe(user => { if (user) { this.user = user; this.buildMenu(); if (!this.notificationGroupsInitialized) { this.setNotificationGroups(); } } else if(this.user) { this.user = user; this.buildMenu(); this.notificationGroupsInitialized = false; this.notificationGroups = []; } })); } setActives(params: Params) { if (params && params['topic']) { this.activeTopic = this.stakeholder.topics.find(topic => topic.alias === decodeURIComponent(params['topic']) && this.isPublicOrIsMember(topic.visibility)); } else { this.activeTopic = this.stakeholder.topics.find(topic => this.isPublicOrIsMember(topic.visibility)); } if(this.activeTopic) { if (params && params['category']) { this.activeCategory = this.activeTopic.categories.find(category => category.alias === decodeURIComponent(params['category']) && this.isPublicOrIsMember(category.visibility)); } else { this.activeCategory = this.activeTopic.categories.find(category => this.isPublicOrIsMember(category.visibility)); } } } public setNotificationGroups() { this.entities = this.stakeholderUtils.types.map(option => option.value); this.notificationGroups = []; if (Session.isPortalAdministrator(this.user)) { this.notificationGroups.push({value: Role.PORTAL_ADMIN, label: 'Portal Administrators'}); } for (let type of this.stakeholderUtils.types) { if (Session.isCurator(type.value, this.user) || Session.isPortalAdministrator(this.user)) { this.notificationGroups.push({value: Role.curator(type.value), label: type.label + ' Curators'}); this.notificationGroups.push({value: Role.typeManager(type.value), label: type.label + ' Managers'}); this.notificationGroups.push({value: Role.typeMember(type.value), label: type.label + ' Members'}); } } this.subscriptions.push(this.stakeholderService.getMyStakeholders(this.properties.monitorServiceAPIURL).subscribe(stakeholders => { stakeholders.forEach(stakeholder => { this.notificationGroups.push({ value: Role.manager(stakeholder.type, stakeholder.alias), label: stakeholder.name + ' Managers' }); this.notificationGroups.push({ value: Role.member(stakeholder.type, stakeholder.alias), label: stakeholder.name + ' Members' }); }); this.notificationGroupsInitialized = true; })); } public ngOnDestroy() { this.subscriptions.forEach(value => { if (value instanceof Subscriber) { value.unsubscribe(); } }); this.userManagementService.clearSubscriptions(); this.layoutService.clearSubscriptions(); this.stakeholderService.clearSubscriptions(); this.configurationService.clearSubscriptions(); this.smoothScroll.clearSubscriptions(); } private navigateToError() { this.router.navigate([this.properties.errorLink], {queryParams: {'page': this.properties.baseLink + this.router.url}}); } public get open() { return this.layoutService.open; } private setSideBar() { let items: MenuItem[] = []; if (this.isPublicOrIsMember(this.stakeholder.visibility)) { this.stakeholder.topics.forEach((topic: Topic) => { if (this.isPublicOrIsMember(topic.visibility)) { let topicItem: MenuItem = new MenuItem(topic.alias, topic.name, "", '/' + this.stakeholder.alias + '/' + topic.alias, null, [], [], {}, {svg: topic.icon}, null, null, ( '/' + this.stakeholder.alias + '/' + topic.alias)); topicItem.items = topic.categories.map(category => { return new MenuItem(category.alias, category.name, "", ('/' + this.stakeholder.alias + '/' + topic.alias + '/' + category.alias), null, [], [], {}, {svg: topic.icon}, null, null, ('/' + this.stakeholder.alias + '/' + topic.alias + '/' + category.alias)); }); items.push(topicItem); } }); if (items.length === 0) { items.push(new MenuItem('noTopics', 'No topics available yet', "", "", false, [], [], {})); } } this.adminMenuItems = []; this.adminMenuItems.push(new MenuItem("general", "General", "", "/admin/" + this.stakeholder.alias, false, [], [], {}, {name: 'badge'})); this.adminMenuItems.push(new MenuItem("indicators", "Indicators", "", "/admin/" + this.stakeholder.alias + '/indicators', false, [], [], {}, {name: 'bar_chart'})); if (this.stakeholder.defaultId) { this.adminMenuItems.push(new MenuItem("users", "Users", "", "/admin/" + this.stakeholder.alias + "/users", false, [], [], {}, {name: 'group'}, null, null, "/admin/" + this.stakeholder.alias + "/users")); if (this.isCurator()) { this.adminMenuItems.push(new MenuItem("admin-tools", "Pages & Entities", "", "/admin/" + this.stakeholder.alias + "/admin-tools/pages", false, [], [], {}, {name: 'description'}, null, null, "/admin/" + this.stakeholder.alias + "/admin-tools")); } } this.specialSideBarMenuItem = new MenuItem("back", "Manage profiles", "", "/admin", false, [], null, {}, {name: 'search', class: 'uk-text-secondary'}); this.sideBarItems = items; this.hasSidebar = this.hasSidebar && this.sideBarItems.length > 0; } buildMenu() { this.menuItems = []; this.userMenuItems = []; if (this.user) { if (this.isKindOfMonitorManager()) { this.userMenuItems.push(new MenuItem("", "Manage profiles", "", "/admin", false, [], [], {})); } if (Session.isPortalAdministrator(this.user)) { this.userMenuItems.push(new MenuItem("adminOptions", "Super Admin options", "", "/admin/admin-tools/portals", false, [], [], {})); } if (this.isCurator()) { this.userMenuItems.push(new MenuItem("monitorOptions", "Monitor options", "", "/admin/monitor/admin-tools/pages", false, [], [], {})); } } if (this.stakeholder) { this.userMenuItems.push(new MenuItem("", "User information", "", "/" + this.stakeholder.alias + "/user-info", false, [], [], {})); this.menuItems.push( new MenuItem("dashboard", "Dashboard", "", "/" + this.stakeholder.alias, false, [], null, {} , null, null, null, null) ); if (this.isPublicOrIsMember(this.stakeholder.visibility)) { this.menuItems.push( new MenuItem("search", "Browse Data", "", this.properties.searchLinkToResults, false, [], null, {resultbestaccessright: '"' + encodeURIComponent("Open Access") + '"'}, null, null, null, null) ); this.resourcesService.setResources(this.menuItems, "/" + this.stakeholder.alias); if (this.stakeholder.type === "funder") { this.menuItems.push( new MenuItem("develop", "Develop", "", "/" + this.stakeholder.alias + "/develop", false, [], null, {}) ); } } if (this.isManager(this.stakeholder)) { this.menuItems.push( new MenuItem("manage", "Manage", "", "/admin/" + this.stakeholder.alias, false, [], null, {} , null, null, null, null) ); } if (!this.hasAdminMenu && this.isFrontPage) { this.menuHeader = { route: null, url: "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu', title: "Monitor", logoUrl: 'assets/common-assets/logo-services/monitor/small-inverted.svg', logoSmallUrl: "assets/common-assets/logo-services/monitor/small.svg", position: 'center', badge: true, darkBg: true, menuPosition: "center", replaceHeader: { route: './' + this.stakeholder.alias, url: null, title: this.stakeholder.name, logoUrl: StringUtils.getLogoUrl(this.stakeholder), logoSmallUrl: StringUtils.getLogoUrl(this.stakeholder), logoInfo: '
Monitor
' + '
Dashboard
', position: 'center', badge: true, menuPosition: "center" } }; } else { this.menuHeader = { route: null, url: "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu', title: "Monitor", logoUrl: 'assets/common-assets/logo-services/monitor/small.svg', logoSmallUrl: "assets/common-assets/logo-services/monitor/small.svg", position: 'center', badge: true, menuPosition: "center", replaceHeader: { route: './' + this.stakeholder.alias, url: null, title: this.stakeholder.name, logoUrl: StringUtils.getLogoUrl(this.stakeholder), logoSmallUrl: StringUtils.getLogoUrl(this.stakeholder), position: 'center', badge: true, menuPosition: "center" } }; } } else { this.userMenuItems.push(new MenuItem("", "User information", "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu/user-info', '', false, [], [], {}, null, null, null, null, "_self")); this.menuHeader = { route: null, url: "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu', title: "Monitor", logoUrl: 'assets/common-assets/logo-services/monitor/main.svg', logoSmallUrl: "assets/common-assets/logo-services/monitor/small.svg", position: 'left', badge: true, menuPosition: "center" }; this.menuItems.push( new MenuItem("stakeholders", "Browse " + this.stakeholderEntities.STAKEHOLDERS, "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu/browse', "", false, [], null, {}, null, null, null, null, "_self") ); this.resourcesService.setResources(this.menuItems, '', "https://" + (this.properties.environment === 'beta' ? 'beta.' : '') + 'monitor.openaire.eu'); this.menuItems.push( new MenuItem("about", "About", "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu/about/learn-how', "", false, [], null, {}, null, null, null, null, "_self") ); if (this.hasAdminMenu) { this.adminMenuItems = []; this.specialSideBarMenuItem = null; this.adminMenuItems.push(new MenuItem("stakeholders", "Manage profiles", "", "/admin", false, [], [], {}, {name: 'settings'})); if (Session.isPortalAdministrator(this.user)) { this.adminMenuItems.push(new MenuItem("super_admin", "Super Admin options", "", "/admin/admin-tools/portals", false, [], [], {}, {name: 'settings'}, null, null, '/admin/admin-tools')); } if (Session.isPortalAdministrator(this.user) || Session.isMonitorCurator(this.user)) { this.adminMenuItems.push(new MenuItem("monitor", "Monitor options", "", "/admin/monitor/admin-tools/pages", false, [], [], {}, {name: 'settings'}, null, null, '/admin/monitor/admin-tools')); } this.hasAdminMenu = this.hasAdminMenu && this.adminMenuItems.length > 1; } } } public isCurator() { return this.user && (Session.isPortalAdministrator(this.user) || Session.isMonitorCurator(this.user)); } public isKindOfMonitorManager() { return this.user && (Session.isPortalAdministrator(this.user) || Session.isMonitorCurator(this.user) || Session.isKindOfMonitorManager(this.user)); } public isManager(stakeholder: Stakeholder) { return this.user && (Session.isPortalAdministrator(this.user) || Session.isCurator(stakeholder.type, this.user) || Session.isManager(stakeholder.type, stakeholder.alias, this.user)); } public isPublicOrIsMember(visibility: Visibility): boolean { return !(visibility == "PRIVATE" || (this.isViewPublic && visibility != "PUBLIC")); } setProperties(id, type = null) { this.properties.adminToolsCommunity = id; if (type) { this.properties.adminToolsPortalType = type; } else { ConnectHelper.setPortalTypeFromPid(id); } this.configurationService.initCommunityInformation(this.properties, this.properties.adminToolsCommunity); } }