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 {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; 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: true, stickyAnimation: true, menuPosition: "center" }; 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 > 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.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; 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 <= 640)); 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.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([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) => { 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)); items.push(topicItem); } }); if (items.length === 0) { items.push(new MenuItem('noTopics', 'No topics available yet', "", "", false, [], [], {})); } } this.sideBarItems = items; this.hasSidebar = this.hasSidebar && this.sideBarItems.length > 0; } 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) { this.menuItems.push({ rootItem: new MenuItem("dashboard", "Dashboard", "", "/" + this.stakeholder.alias, false, [], null, {} , null, null, null, null), items: [] }); if (this.isPublicOrIsMember(this.stakeholder.visibility)) { this.menuItems.push({ rootItem: new MenuItem("search", "Search", "", this.properties.searchLinkToResults, false, [], null, {resultbestaccessright: '"' + encodeURIComponent("Open Access") + '"'}, null, null, null, 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.isManager(this.stakeholder)) { this.menuItems.push({ rootItem: new MenuItem("manage", "Manage", "", "/admin/" + this.stakeholder.alias, false, [], null, {} , null, null, null, null), items: [] }); } if (!this.hasAdminMenu && this.isFrontPage) { this.menuHeader = { route: "/" + this.stakeholder.alias, url: null, title: this.stakeholder.name, logoUrl: 'assets/common-assets/logo-services/monitor/small-inverted.svg', logoSmallUrl: "assets/common-assets/logo-services/monitor/small-inverted.svg", position: 'center', badge: true, stickyAnimation: true, menuPosition: "center" }; } else { this.menuHeader = { route: "/" + this.stakeholder.alias, url: null, title: this.stakeholder.name, logoUrl: 'assets/common-assets/logo-services/monitor/small.svg', logoSmallUrl: "assets/common-assets/logo-services/monitor/small.svg", position: 'center', badge: false, stickyAnimation: true, menuPosition: "center" }; // 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, [], [], {}, {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 (Session.isPortalAdministrator(this.user)) { 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'}); } } 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-services/monitor/main.svg', logoSmallUrl: "assets/common-assets/logo-services/monitor/small.svg", position: 'left', badge: true, stickyAnimation: true, menuPosition: "center" }; 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: [] }); } else { this.menuHeader = { route: "/", url: null, title: "Monitor Dashboard", logoUrl: null, logoSmallUrl: null, position: 'center', badge: false, stickyAnimation: true, menuPosition: "center" }; 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')); 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 > 0; } } } 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); } }