import {Component} from '@angular/core'; import {EnvProperties} from '../openaireLibrary/utils/properties/env-properties'; import {ActivatedRoute, Router} from "@angular/router"; import {CommunityService} from "../openaireLibrary/connect/community/community.service"; import {HelperService} from "../openaireLibrary/utils/helper/helper.service"; import {Meta, Title} from "@angular/platform-browser"; import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service"; import {PiwikService} from "../openaireLibrary/utils/piwik/piwik.service"; import {StringUtils} from "../openaireLibrary/utils/string-utils.class"; import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component"; import {properties} from "../../environments/environment"; import {Subscriber, Subscription} from "rxjs"; @Component({ selector: 'subjects', template: `

Subjects

No subjects
` }) export class SubjectsComponent { properties: EnvProperties = properties; breadcrumbs: Breadcrumb[] = [{name: 'Home', route: '/'}, {name: 'About - Subjects'}]; pageContents = null; divContents = null; url: string = null; pageTitle: string = "Subjects"; communityId = null; showLoading = true; subs: Subscription[] = []; displayedAllSubjects = []; displayedSubjects = []; displayedSdg = []; displayedFos = []; groupedAllSubjects = []; groupedSubjects = []; groupedSdg = []; groupedFos = []; subjectsColumns = []; subjectsLimit: number = 6; maxCharacters: number = 25; activeTab: 'all' | 'freeText' | 'sdg' | 'fos' = 'all'; indexAll: number = 0; indexSubjects: number = 0; indexSdg: number = 0; indexFos: number = 0; viewAll: boolean = false; constructor(private route: ActivatedRoute, private communityService: CommunityService, private _router: Router, private helper: HelperService, private _meta: Meta, private _title: Title, private seoService: SEOService, private _piwikService: PiwikService) { } ngOnInit() { this.showLoading = true; this.url = this.properties.domain + this._router.url; this.seoService.createLinkForCanonicalURL(this.url); this.updateUrl(this.url); this.updateTitle(this.pageTitle); this.updateDescription("OpenAIRE - Connect, Community Gateway, research community"); this.subs.push(this.communityService.getCommunityAsObservable().subscribe(community => { if (community) { this.communityId = community.communityId; this.subs.push(this._piwikService.trackView(this.properties, this.pageTitle).subscribe()); this.getPageContents(); this.displayedSubjects = community.subjects; this.displayedSdg = community.sdg; this.displayedFos = community.fos; this.displayedSubjects.forEach(element => { this.displayedAllSubjects.push({value: element, type: 'resultsubject'}); }); this.displayedSdg.forEach(element => { this.displayedAllSubjects.push({value: element, type: 'sdg'}); }); this.displayedFos.forEach(element => { this.displayedAllSubjects.push({value: element, type: 'fos'}); }); this.groupSubjects(this.displayedAllSubjects, 'all'); this.showLoading = false; } })); } createParams(param) { return StringUtils.URIEncode(param); } ngOnDestroy() { for (let sub of this.subs) { if (sub instanceof Subscriber) { sub.unsubscribe(); } } } private getPageContents() { this.subs.push(this.helper.getPageHelpContents(this.properties, this.communityId, this._router.url).subscribe(contents => { this.pageContents = contents; })); } public groupSubjects(subjects: string[], type: string) { if(subjects.length === 0) { return []; } if(type === 'all') { subjects.sort((a, b) => a['value'].localeCompare(b['value'])); this.indexAll = 0; this.activeTab = 'all'; this.groupedAllSubjects = Object.values( subjects.reduce((acc, subject) => { let firstLetter = subject['value'][0].toLocaleUpperCase(); if(!acc[firstLetter]) { acc[firstLetter] = {group: firstLetter, data: [subject]}; } else { acc[firstLetter].data.push(subject); } return acc; },{}) ) if(subjects.length > 1) { this.groupedAllSubjects.unshift({group: 'All', data: subjects}); } } if(type === 'freeText') { subjects.sort((a, b) => a.localeCompare(b)); this.indexSubjects = 0; this.activeTab = 'freeText'; this.groupedSubjects = Object.values( subjects.reduce((acc, subject) => { let firstLetter = subject[0].toLocaleUpperCase(); if(!acc[firstLetter]) { acc[firstLetter] = {group: firstLetter, data: [subject]}; } else { acc[firstLetter].data.push(subject); } return acc; },{}) ) if(subjects.length > 1) { this.groupedSubjects.unshift({group: 'All', data: subjects}); } } if(type === 'sdg') { subjects.sort((a, b) => a.localeCompare(b)); this.indexSdg = 0; this.activeTab = 'sdg'; this.groupedSdg = Object.values( subjects.reduce((acc, subject) => { let firstLetter = subject[0].toLocaleUpperCase(); if(!acc[firstLetter]) { acc[firstLetter] = {group: firstLetter, data: [subject]}; } else { acc[firstLetter].data.push(subject); } return acc; },{}) ) if(subjects.length > 1) { this.groupedSdg.unshift({group: 'All', data: subjects}); } } if(type === 'fos') { subjects.sort((a, b) => a.localeCompare(b)); this.indexFos = 0; this.activeTab = 'fos'; this.groupedFos = Object.values( subjects.reduce((acc, subject) => { let key = subject.substring(0,2).toLocaleUpperCase(); if(!acc[key]) { acc[key] = {group: key, data: [subject]}; } else { acc[key].data.push(subject); } return acc; },{}) ) if(subjects.length > 1) { this.groupedFos.unshift({group: 'All', data: subjects}); } } } public changeDisplayedSubjects(i, group) { this.subjectsColumns = []; if(this.activeTab === 'all') { this.indexAll = i; } else if(this.activeTab === 'freeText') { this.indexSubjects = i; } else if(this.activeTab === 'sdg') { this.indexSdg = i; } else if(this.activeTab === 'fos') { this.indexFos = i; } if(group.data.length > this.subjectsLimit && group.group != 'All') { this.divideSubjects(group); } } public divideSubjects(group) { let columns = []; for(let i = 0; i < (group.data.length / this.subjectsLimit); i++) { columns.push(group.data.slice(i * this.subjectsLimit, ((i + 1) * this.subjectsLimit))); } this.subjectsColumns = columns; } private updateDescription(description: string) { this._meta.updateTag({content: description}, "name='description'"); this._meta.updateTag({content: description}, "property='og:description'"); } private updateTitle(title: string) { var _title = ((title.length > 50) ? title.substring(0, 50) : title); this._title.setTitle(_title); this._meta.updateTag({content: _title}, "property='og:title'"); } private updateUrl(url: string) { this._meta.updateTag({content: url}, "property='og:url'"); } }