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, RootMenuItem} from "./openaireLibrary/sharedComponents/menu"; import {Stakeholder, Topic, Visibility} from "./openaireLibrary/monitor/entities/stakeholder"; import {LinksResolver} from "./search/links-resolver"; import {Header} from "./openaireLibrary/sharedComponents/navigationBar.component"; import {arrow_left} from "./openaireLibrary/utils/icons/icons"; 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"; @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; isFrontPage: boolean = false; isDashboard: boolean = false; isViewPublic: boolean = false; sideBarItems: MenuItem[] = []; specialSideBarMenuItem: MenuItem = null; menuItems: RootMenuItem[] = []; notificationGroups: Option[] = []; notificationGroupsInitialized: boolean = false; stakeholderUtils: StakeholderUtils = new StakeholderUtils(); menuHeader: Header = { route: "/", url: null, title: "Default menu header", logoUrl: null, logoSmallUrl: null, position: 'center', badge: false, stickyAnimation: false }; userMenuItems: MenuItem[] = []; adminMenuItems: MenuItem[] = []; stakeholder: Stakeholder = null; activeTopic: Topic = 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) { 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 > 1219) { this.layoutService.setSmallScreen(false); } else if (!this.layoutService.isSmallScreen && event.target.innerWidth < 1219) { 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.isFrontPage.subscribe(isFrontPage => { this.isFrontPage = isFrontPage; this.cdr.detectChanges(); })); this.subscriptions.push(this.layoutService.isDashboard.subscribe(isDashboard => { this.isDashboard = isDashboard; this.cdr.detectChanges(); })); this.route.queryParams.subscribe(params => { this.isViewPublic = (params['view'] == 'public'); }); this.layoutService.setSmallScreen((this.innerWidth && this.innerWidth < 1219)); this.layoutService.setOpen(!(this.innerWidth && this.innerWidth < 1219)); this.subscriptions.push(this.params.subscribe(params => { if (this.paramsResolved) { this.loading = true; let isSearch = this.router.url.includes('/search/'); if (params && params['stakeholder']) { // this.stakeholder = this.stakeholderService.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); if (isSearch) { this.activeTopic = null; } else if (params && params['topic'] && !this.activeTopic) { 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)); } this.setSideBar(); this.buildMenu(); this.loading = false; } else { this.stakeholder = null; LinksResolver.resetProperties(); this.navigateToError(); this.buildMenu(); this.loading = false; } })); } else { this.buildMenu(); if (isSearch) { this.activeTopic = null; } else 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)); } this.loading = false; } } else { LinksResolver.resetProperties(); this.stakeholderService.setStakeholder(null); this.layoutService.setOpen(!(this.innerWidth && this.innerWidth < 1219)); 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 => { this.user = user; if (user) { this.buildMenu(); if(!this.notificationGroupsInitialized && this.properties.environment !== 'production') { this.setNotificationGroups(); } } })); } public setNotificationGroups() { 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.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(['/error'], {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) => { if (this.isPublicOrIsMember(topic.visibility)) { let topicItem: MenuItem = new MenuItem(topic.alias, topic.name, "", ( '/' + this.stakeholder.alias + '/' + topic.alias), null, [], [], {}); topicItem.icon = topic.icon; items.push(topicItem); } }); if (items.length === 0) { items.push(new MenuItem('noTopics', 'No topics available yet', "", "", false, [], [], {})); } } else { let topicItem: MenuItem = new MenuItem("private", "Private Data", "", "", null, [], [], {}); items.push(topicItem); } this.sideBarItems = items; } buildMenu() { this.menuItems = []; this.adminMenuItems = []; this.userMenuItems = []; if (this.user) { if (this.isCurator()) { 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, [], [], {})); this.userMenuItems.push(new MenuItem("monitorOptions", "Monitor portal options","", "/admin/monitor/admin-tools/pages", false, [], [], {})); } this.userMenuItems.push(new MenuItem("", "User information", "", "/user-info", false, [], [], {})); } if (this.stakeholder) { if (!this.isDashboard) { this.menuHeader = { route: null, url: "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu', title: "Monitor", logoUrl: 'assets/common-assets/logo-large-monitor.png', logoSmallUrl: "assets/common-assets/logo-small-monitor.png", position: 'left', badge: true, stickyAnimation: false }; this.menuItems.push({ rootItem: new MenuItem("dashboard", "Dashboard", "", "/" + this.stakeholder.alias, false, [], null, {}), items: [] }); this.menuItems.push({ rootItem: new MenuItem("methodology", "Methodology", "", "/" + this.stakeholder.alias + "/methodology", false, [], null, {}), items: [ new MenuItem("methodology", "Terminology and construction", "", "/" + this.stakeholder.alias + "/methodology", false, [], null, {}), new MenuItem("methodology", "See how it works", "", "/" + this.stakeholder.alias + "/methodology", false, [], null, {}, null, "how"), ] }); if(this.stakeholder.type === "funder") { this.menuItems.push({ rootItem: new MenuItem("develop", "Develop", "", "/" + this.stakeholder.alias + "/develop", false, [], null, {}), items: [] }); } if (this.isCurator()) { this.menuItems.push({ rootItem: new MenuItem("manage", "Manage", "", "/admin", false, [], null, {}), items: [] }); } } else if (this.isFrontPage) { this.menuHeader = { route: "/" + this.stakeholder.alias, url: null, title: this.stakeholder.name, logoUrl: null, logoSmallUrl: null, position: 'center', badge: false, stickyAnimation: false }; this.menuItems.push({ rootItem: new MenuItem("methodology", "Methodology", "", "/" + this.stakeholder.alias + "/methodology", false, [], null, {}), items: [ new MenuItem("methodology", "Terminology and construction", "", "/" + this.stakeholder.alias + "/methodology", false, [], null, {}), new MenuItem("methodology", "See how it works", "", "/" + this.stakeholder.alias + "/methodology", false, [], null, {}, null, "how"), ] }); if(this.stakeholder.type === "funder") { this.menuItems.push({ rootItem: new MenuItem("develop", "Develop", "", "/" + this.stakeholder.alias + "/develop", false, [], null, {}), items: [] }); } if (this.isCurator()) { this.menuItems.push({ rootItem: new MenuItem("manage", "Manage", "", "/admin", false, [], null, {}), items: [] }); } if (this.isPublicOrIsMember(this.stakeholder.visibility)) { this.specialSideBarMenuItem = new MenuItem("search", "Search research outcomes", "", this.properties.searchLinkToResults, false, [], null, {resultbestaccessright: '"' + encodeURIComponent("Open Access") + '"'}); this.specialSideBarMenuItem.icon = ''; } else { this.specialSideBarMenuItem = null; } } else { this.menuHeader = { route: "/admin/" + this.stakeholder.alias, url: null, title: 'Admin - ' + this.stakeholder.name, logoUrl: null, logoSmallUrl: null, position: 'center', badge: false, stickyAnimation: false }; this.menuItems.push({ rootItem: new MenuItem("", "Dashboard", "", '/' + this.stakeholder.alias + '/', false, [], null, {}), items: [] }); this.adminMenuItems.push(new MenuItem("general", "General", "", "/admin/" + this.stakeholder.alias, false, [], [], {}, "")); this.adminMenuItems.push(new MenuItem("indicators", "Indicators", "", "/admin/" + this.stakeholder.alias + '/indicators', false, [], [], {}, "")); if(this.stakeholder.defaultId) { this.adminMenuItems.push(new MenuItem("users", "Users", "", "/admin/" + this.stakeholder.alias + "/users", false, [], [], {}, "")); if (Session.isPortalAdministrator(this.user)) { this.adminMenuItems.push(new MenuItem("admin-tools", "Pages & Entities", "", "/admin/" + this.stakeholder.alias + "/admin-tools/pages", false, [], [], {}, null, null, null, "/admin/" + this.stakeholder.alias + "/admin-tools")); } } this.specialSideBarMenuItem = new MenuItem("back", "Manage profiles", "", "/admin", false, [], null, {}); this.specialSideBarMenuItem.icon = '' + arrow_left.data + ''; // ''; this.specialSideBarMenuItem.customClass = 'uk-text-uppercase uk-text-bold uk-text-secondary'; } } else { if (this.isFrontPage || !this.hasAdminMenu) { this.menuHeader = { route: null, url: "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu', title: "Monitor", logoUrl: 'assets/common-assets/logo-large-monitor.png', logoSmallUrl: "assets/common-assets/logo-small-monitor.png", position: 'left', badge: true, stickyAnimation: false }; this.menuItems.push({ rootItem: new MenuItem("about", "About", "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu/about/learn-how', "", false, [], null, {}), items: [] }); this.menuItems.push({ rootItem: new MenuItem("browse", "Browse", "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu/browse', "", false, [], null, {}), items: [] }); this.menuItems.push({ rootItem: new MenuItem("contact", "Contact us", "https://" + (this.properties.environment == 'beta' ? 'beta.' : '') + 'monitor.openaire.eu/contact-us', "", false, [], null, {}), items: [] }); } else { this.menuHeader = { route: "/", url: null, title: "Monitor Dashboard", logoUrl: null, logoSmallUrl: null, position: 'center', badge: false, stickyAnimation: false }; this.adminMenuItems = []; this.specialSideBarMenuItem = null; this.adminMenuItems.push(new MenuItem("stakeholders", "Manage profiles", "", "/admin", false, [], [], {}, "")); } } } public isCurator() { 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); } }