import {ChangeDetectorRef, Component, OnDestroy, OnInit} from '@angular/core'; import {ActivatedRoute, Params, Router} from '@angular/router'; import {DomSanitizer, Meta, Title} from '@angular/platform-browser'; import {EnvProperties} from '../openaireLibrary/utils/properties/env-properties'; import {PiwikService} from '../openaireLibrary/utils/piwik/piwik.service'; import {StringUtils} from '../openaireLibrary/utils/string-utils.class'; import {ErrorCodes} from '../openaireLibrary/utils/properties/errorCodes'; import {ErrorMessagesComponent} from '../openaireLibrary/utils/errorMessages.component'; import {HelperService} from "../openaireLibrary/utils/helper/helper.service"; import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service"; import {StakeholderService} from "../services/stakeholder.service"; import {Category, ChartHelper, IndicatorPath, Stakeholder, SubCategory, Topic} from "../utils/entities/stakeholder"; import {StatisticsService} from "../utils/services/statistics.service"; import {Item, Sidebar} from "../utils/entities/sidebar"; import {IndicatorUtils, StakeholderUtils} from "../utils/indicator-utils"; import {StakeholderCreator} from "../utils/entities/stakeholderCreator"; import {LayoutService} from "../library/sharedComponents/sidebar/layout.service"; import {FormBuilder, FormControl} from "@angular/forms"; import {IDeactivateComponent} from "../openaireLibrary/utils/can-exit.guard"; import {Subscription} from "rxjs"; import {Session, User} from "../openaireLibrary/login/utils/helper.class"; import {MenuItem} from "../openaireLibrary/sharedComponents/menu"; import {UserManagementService} from "../openaireLibrary/services/user-management.service"; @Component({ selector: 'monitor', templateUrl: 'monitor.component.html', }) export class MonitorComponent implements OnInit, OnDestroy, IDeactivateComponent { private static sidebarStatus: { id; status; }; public user: User; public userMenuItems: MenuItem[] = [new MenuItem("", "My profile", "", "", false, [], [], {})]; public subscriptions: any[] = []; public piwiksub: any; public pageContents = null; public divContents = null; public status: number; public loading: boolean = true; public indicatorUtils: IndicatorUtils = new IndicatorUtils(); public stakeholderUtils: StakeholderUtils = new StakeholderUtils(); public activeTopic: Topic = null; public activeCategory: Category = null; public activeSubCategory: SubCategory = null; public sideBar: Sidebar = null; public errorCodes: ErrorCodes; public stakeholder: Stakeholder; public numberResults: Map = new Map(); public chartsActiveType: Map = new Map(); private errorMessages: ErrorMessagesComponent; properties: EnvProperties; fundingL0; startYear; endYear; public keyword: FormControl; constructor( private route: ActivatedRoute, private _router: Router, private _meta: Meta, private _title: Title, private _piwikService: PiwikService, private helper: HelperService, private stakeholderService: StakeholderService, private userManagementService: UserManagementService, private statisticsService: StatisticsService, private layoutService: LayoutService, private seoService: SEOService, private cdr: ChangeDetectorRef, private sanitizer: DomSanitizer, private _fb: FormBuilder) { this.errorCodes = new ErrorCodes(); this.errorMessages = new ErrorMessagesComponent(); this.status = this.errorCodes.LOADING; } public ngOnInit() { this.keyword = this._fb.control(''); this.keyword.valueChanges.subscribe(value => { console.log("Keyword Changed!"); //TODO do a real action }); this.route.data .subscribe((data: { envSpecific: EnvProperties }) => { let subscription: Subscription; this.route.params.subscribe(params => { if (subscription) { subscription.unsubscribe(); } this.properties = data.envSpecific; var url = data.envSpecific.baseLink + this._router.url; if (!this.stakeholder || this.stakeholder.alias !== params['stakeholder']) { this.status = this.errorCodes.LOADING; this.numberResults = new Map(); this.chartsActiveType = new Map(); // subscription = this.stakeholderService.getStakeholderAsObservable().subscribe(stakeholder => { let stakeholder: Stakeholder = null; if (params['stakeholder'] == "fwf") { stakeholder = new Stakeholder(null, "funder", "fwf_________::FWF", "Austrian Science Fund (FWF)", "FWF", false, "fwf", true, true, null); stakeholder = this.stakeholderUtils.createFunderFromDefaultProfile(stakeholder, StakeholderCreator.createFunderDefaultProfile().topics); stakeholder.logoUrl = "./assets/fwf.png"; } else if (params['stakeholder'] == "arc") { stakeholder = new Stakeholder(null, "funder", "arc_________::ARC", "Australian Research Council (ARC)", "ARC", false, null, true, true, null); stakeholder = this.stakeholderUtils.createFunderFromDefaultProfile(stakeholder, StakeholderCreator.createFunderDefaultProfile().topics); stakeholder.logoUrl = "./assets/arc1.gif"; } else { stakeholder = new Stakeholder(null, "funder", "ec__________::EC", "European Commission", "EC", false, "ec", true, true, null); stakeholder = this.stakeholderUtils.createFunderFromDefaultProfile(stakeholder, StakeholderCreator.createFunderDefaultProfile().topics); stakeholder.logoUrl = "./assets/ec.png"; } if (stakeholder) { this.stakeholder = stakeholder; this.seoService.createLinkForCanonicalURL(url, false); this._meta.updateTag({content: url}, "property='og:url'"); var description = "Monitor Dashboard | " + this.stakeholder.index_name; var title = "Monitor Dashboard | " + this.stakeholder.index_shortName; this._meta.updateTag({content: description}, "name='description'"); this._meta.updateTag({content: description}, "property='og:description'"); this._meta.updateTag({content: title}, "property='og:title'"); this._title.setTitle(title); if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) { this.piwiksub = this._piwikService.trackView(this.properties, title, this.properties.piwikSiteId).subscribe(); } //this.getDivContents(); this.getPageContents(); this.status = this.errorCodes.DONE; this.setView(params); } // }, error => { // this.navigateToError(); // }); this.subscriptions.push(subscription); } else { this.setView(params); } this.subscriptions.push(this.userManagementService.getUserInfo(this.properties.userInfoUrl).subscribe(user => { this.user = user; this.buildMenu(); }, error => { console.log("App couldn't fetch properties"); console.log(error); })); }); this.route.data .subscribe((data: { envSpecific: EnvProperties }) => { let subscription: Subscription; this.route.params.subscribe(params => { if(subscription) { subscription.unsubscribe(); } this.properties = data.envSpecific; var url = data.envSpecific.baseLink + this._router.url; if (!this.stakeholder || this.stakeholder.alias !== params['stakeholder']) { this.status = this.errorCodes.LOADING; this.numberResults = new Map(); this.chartsActiveType = new Map(); // subscription = this.stakeholderService.getStakeholderAsObservable().subscribe(stakeholder => { let stakeholder: Stakeholder = null; if (params['stakeholder'] == "fwf") { stakeholder = new Stakeholder(null, "funder", "fwf_________::FWF", "Austrian Science Fund (FWF)", "FWF", false, "fwf", true, true, null); stakeholder = this.stakeholderUtils.createFunderFromDefaultProfile(stakeholder, StakeholderCreator.createFunderDefaultProfile().topics); stakeholder.logoUrl = "./assets/fwf.png"; } else if (params['stakeholder'] == "arc") { stakeholder = new Stakeholder(null, "funder", "arc_________::ARC", "Australian Research Council (ARC)", "ARC", false, "arc", true, true, null); stakeholder = this.stakeholderUtils.createFunderFromDefaultProfile(stakeholder, StakeholderCreator.createFunderDefaultProfile().topics); stakeholder.logoUrl = "./assets/arc1.gif"; } else { stakeholder = new Stakeholder(null, "funder", "ec__________::EC", "European Commission", "EC", false, "ec", true, true, null); stakeholder = this.stakeholderUtils.createFunderFromDefaultProfile(stakeholder, StakeholderCreator.createFunderDefaultProfile().topics); stakeholder.logoUrl = "./assets/ec.png"; } if (stakeholder) { this.stakeholder = stakeholder; this.seoService.createLinkForCanonicalURL(url, false); this._meta.updateTag({content: url}, "property='og:url'"); var description = "Monitor Dashboard | " + this.stakeholder.index_name; var title = "Monitor Dashboard | " + this.stakeholder.index_shortName; this._meta.updateTag({content: description}, "name='description'"); this._meta.updateTag({content: description}, "property='og:description'"); this._meta.updateTag({content: title}, "property='og:title'"); this._title.setTitle(title); if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) { this.piwiksub = this._piwikService.trackView(this.properties, title, this.properties.piwikSiteId).subscribe(); } //this.getDivContents(); this.getPageContents(); this.status = this.errorCodes.DONE; this.setView(params); this.layoutService.setOpen(true); } // }, error => { // this.navigateToError(); // }); this.subscriptions.push(subscription); } else { this.setView(params); } this.subscriptions.push(this.userManagementService.getUserInfo(this.properties.userInfoUrl).subscribe(user => { this.user = user; this.buildMenu(); }, error => { console.log("App couldn't fetch properties"); console.log(error); })); }); }); }); } canExit() { if (this.sideBar) { let status = []; this.sideBar.items.forEach(item => { status.push(item.open); }); MonitorComponent.sidebarStatus = { id: this.activeTopic.alias, status: status }; } return true; } public get open() { return this.layoutService.open; } public toggleOpen(event = null) { if (!event) { this.layoutService.setOpen(!this.open); } else if (event && event['value'] === true) { this.layoutService.setOpen(false); } } private getPageContents() { this.helper.getPageHelpContents(this._router.url, this.properties, 'monitor').subscribe(contents => { this.pageContents = contents; }) } private getDivContents() { this.helper.getDivHelpContents(this._router.url, this.properties, 'monitor').subscribe(contents => { this.divContents = contents; }) } private setView(params: Params) { if (params['topic']) { this.activeTopic = this.stakeholder.topics.find(topic => topic.alias === decodeURIComponent(params['topic']) && topic.isPublic && topic.isActive); if (this.activeTopic) { if (params['category']) { this.activeCategory = this.activeTopic.categories.find(category => (category.alias === params['category']) && category.isPublic && category.isActive); if (!this.activeCategory) { this.navigateToError(); return; } } else { this.activeCategory = this.activeTopic.categories.find(category => category.isPublic && category.isActive); if (this.activeCategory) { this.activeSubCategory = this.activeCategory.subCategories.find(subCategory => subCategory.isPublic && subCategory.isActive); this.setSideBar(); if (this.activeSubCategory) { this.setIndicators(); } } else { this.setSideBar(); } return; } if (this.activeCategory) { if (params['subCategory']) { this.activeSubCategory = this.activeCategory.subCategories.find(subCategory => (subCategory.alias === params['subCategory'] && subCategory.isPublic && subCategory.isActive)); if (!this.activeSubCategory) { this.navigateToError(); return; } } else { this.activeSubCategory = this.activeCategory.subCategories.find(subCategory => subCategory.isPublic && subCategory.isActive); } if (this.activeSubCategory) { this.setSideBar(); this.setIndicators(); } else { this.navigateToError(); } return; } else { this.activeSubCategory = null; } } else { this.navigateToError(); return; } } else { this.activeTopic = this.stakeholder.topics.find(topic => topic.isPublic && topic.isActive); if (this.activeTopic) { this.activeCategory = this.activeTopic.categories.find(category => category.isPublic && category.isActive); if (this.activeCategory) { this.activeSubCategory = this.activeCategory.subCategories.find(subCategory => subCategory.isPublic && subCategory.isActive); if (this.activeSubCategory) { this.setSideBar(); this.setIndicators(); } else { this.navigateToError(); } } else { this.navigateToError(); } } else { this.navigateToError(); } } } private setSideBar() { let items: Item[] = []; this.activeTopic.categories.forEach((category, index) => { if (category.isPublic && category.isActive) { let subItems: Item[] = []; category.subCategories.forEach(subCategory => { if (subCategory.isPublic && subCategory.isActive) { subItems.push(new Item(subCategory.alias, subCategory.name, ( '/' + this.stakeholder.alias + '/' + this.activeTopic.alias + '/' + category.alias + '/' + subCategory.alias), null, null, false)); } }); let open = this.activeCategory.alias === category.alias; if (MonitorComponent.sidebarStatus && MonitorComponent.sidebarStatus.id === this.activeTopic.alias) { open = MonitorComponent.sidebarStatus.status[index]; } items.push(new Item(category.alias, category.name, ( '/' + this.stakeholder.alias + '/' + this.activeTopic.alias + '/' + category.alias), subItems, null, open)); } }); if (items.length === 0) { items.push(new Item('noCategories', 'No categories available yet', null, [], null, false)); } this.sideBar = new Sidebar(items, null); } private setIndicators() { let urls: Map = new Map(); this.activeSubCategory.numbers.forEach((number, index) => { if (number.isActive && number.isPublic) { let url = number.indicatorPaths[0].url; //add fundingLevel0 filter in the query if (this.fundingL0 && number.indicatorPaths[0].filters.get("fundingL0")) { url = url + number.indicatorPaths[0].filters.get("fundingL0").replace(ChartHelper.prefix + 'fundingL0' + ChartHelper.suffix, encodeURIComponent(this.fundingL0)); } const pair = JSON.stringify([number.indicatorPaths[0].source, url]); const indexes = urls.get(pair) ? urls.get(pair) : []; indexes.push(index); urls.set(pair, indexes); } }); urls.forEach((indexes, pair) => { pair = JSON.parse(pair); this.statisticsService.getNumbers(pair[0], pair[1]).subscribe(response => { indexes.forEach(index => { let result = JSON.parse(JSON.stringify(response)); this.activeSubCategory.numbers[index].indicatorPaths[0].jsonPath.forEach(jsonPath => { if (result) { result = result[jsonPath]; } }); this.numberResults.set(index, result); }); }) }); this.activeSubCategory.charts.forEach((chart, index) => { if (chart.indicatorPaths.length > 0) { chart.indicatorPaths[0].safeResourceUrl = this.getUrlByStakeHolder(chart.indicatorPaths[0]); this.chartsActiveType.set(index, chart.indicatorPaths[0]); } }); this.cdr.detectChanges(); } public getUrlByStakeHolder(indicatorPath: IndicatorPath) { return this.sanitizer.bypassSecurityTrustResourceUrl( this.statisticsService.getChartUrl(indicatorPath.source, this.indicatorUtils.getFullUrl(indicatorPath, this.fundingL0, this.startYear, this.endYear))); } public setActiveChart(index, type: string) { let activeChart = this.activeSubCategory.charts[index].indicatorPaths.filter(indicatorPath => indicatorPath.type === type)[0]; activeChart.safeResourceUrl = this.getUrlByStakeHolder(activeChart); this.chartsActiveType.set(index, activeChart); } private navigateToError() { this._router.navigate(['/error'], {queryParams: {'page': this._router.url}}); } public navigateTo(stakeholder: string, topic: string, category: string = null, subcategory: string = null) { let url = stakeholder + '/' + topic + ((category) ? ('/' + category) : '') + ((subcategory) ? ('/' + subcategory) : ''); return this._router.navigate([url]); } public quote(param: string): string { return StringUtils.quote(param); } public ngOnDestroy() { if (this.piwiksub) { this.piwiksub.unsubscribe(); } } buildMenu() { this.userMenuItems = []; if (Session.isPortalAdministrator(this.user)) { this.userMenuItems.push(new MenuItem("", "Manage helptexts", ((this.properties.environment == "beta") ? "https://beta.admin.connect.openaire.eu" : "https://admin.explore.openaire.eu") + "/dashboard?communityId=openaire", "", true, [], [], {})) } if (this.user) { this.userMenuItems.push(new MenuItem("", "User information", "", "/user-info", false, [], [], {})); } } }