246 lines
9.2 KiB
TypeScript
246 lines
9.2 KiB
TypeScript
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 {PiwikHelper} from "../utils/piwikHelper";
|
|
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: `
|
|
<schema2jsonld *ngIf="url" [URL]="url" [name]="pageTitle" type="other"></schema2jsonld>
|
|
<div style="min-height: 650px;">
|
|
<div class="uk-container uk-container-large uk-section uk-section-small uk-padding-remove-bottom">
|
|
<div class="uk-padding-small uk-padding-remove-horizontal">
|
|
<breadcrumbs [breadcrumbs]="breadcrumbs"></breadcrumbs>
|
|
</div>
|
|
</div>
|
|
<div class="uk-container uk-container-large uk-section uk-section-small">
|
|
<div *ngIf="showLoading" class="uk-margin-large">
|
|
<div class="uk-animation-fade uk-margin-top uk-width-1-1" role="alert">
|
|
<span class="loading-gif uk-align-center"></span>
|
|
</div>
|
|
</div>
|
|
<div *ngIf="!showLoading">
|
|
<h1 class="uk-margin-top">
|
|
Subjects
|
|
</h1>
|
|
<div *ngIf="pageContents && pageContents['top'] && pageContents['top'].length > 0">
|
|
<helper *ngIf="pageContents && pageContents['top'] && pageContents['top'].length > 0"
|
|
[texts]="pageContents['top']">
|
|
</helper>
|
|
</div>
|
|
<ng-container *ngIf="groupedSubjects?.length">
|
|
<div class="uk-padding uk-margin-top">
|
|
<ul class="uk-nav uk-nav-default uk-flex uk-flex-center uk-flex-wrap">
|
|
<li *ngFor="let item of groupedSubjects; let i = index;" class="uk-margin-left uk-margin-right"
|
|
[class]="index == i ? 'uk-active':''" (click)="changeDisplayedSubjects(i, item)">
|
|
<a class="uk-padding-remove">{{item.group}}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<!-- View for 'All' -->
|
|
<div *ngIf="index == 0 && groupedSubjects.length > 1" class="uk-margin-large-top uk-grid uk-child-width-1-4@m" uk-grid>
|
|
<!-- <div *ngIf="index == 0" class="uk-margin-large-top uk-grid uk-child-width-1-4@m" uk-grid>-->
|
|
<div *ngFor="let item of groupedSubjects.slice(1); let i = index;">
|
|
<div>
|
|
<h6>{{item.group}}</h6>
|
|
<div *ngFor="let subItem of item.data.slice(0, subjectsLimit)" class="uk-margin-small-bottom">
|
|
<a [queryParams]="{f0:'resultsubject',fv0:createParams(subItem)}" class="uk-link-text"
|
|
routerLinkActive="router-link-active" [routerLink]="properties.searchLinkToAdvancedResults"
|
|
[attr.uk-tooltip]="subItem.length > maxCharacters ? subItem :''">
|
|
<span>{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}</span>
|
|
</a>
|
|
</div>
|
|
<div *ngIf="item.data.length > subjectsLimit">
|
|
<a (click)="changeDisplayedSubjects(i+1, item)" class="view-more-less-link">
|
|
View all
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- View for a single group -->
|
|
<div *ngIf="index != 0 || groupedSubjects.length == 1" class="uk-margin-large-top">
|
|
<!-- <div *ngIf="index != 0" class="uk-margin-large-top">-->
|
|
<div>
|
|
<div>
|
|
<h6>{{groupedSubjects[index].group}}</h6>
|
|
<ng-container *ngIf="subjectsColumns?.length == 0; else elseBlock">
|
|
<div *ngFor="let subItem of groupedSubjects[index].data" class="uk-margin-small-bottom">
|
|
<a [queryParams]="{f0:'resultsubject',fv0:createParams(subItem)}" class="uk-link-text"
|
|
routerLinkActive="router-link-active" [routerLink]="properties.searchLinkToAdvancedResults">
|
|
<span>{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}</span>
|
|
</a>
|
|
</div>
|
|
</ng-container>
|
|
<ng-template #elseBlock>
|
|
<div class="uk-grid uk-child-width-1-4@m" uk-grid>
|
|
<div *ngFor="let group of subjectsColumns">
|
|
<div *ngFor="let subItem of group" class="uk-margin-small-bottom">
|
|
<a [queryParams]="{f0:'resultsubject',fv0:createParams(subItem)}" class="uk-link-text"
|
|
routerLinkActive="router-link-active" [routerLink]="properties.searchLinkToAdvancedResults">
|
|
<span>{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</ng-template>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</ng-container>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`
|
|
})
|
|
export class SubjectsComponent {
|
|
public subjects: string[];
|
|
public communityId = null;
|
|
public showLoading = true;
|
|
|
|
public properties: EnvProperties = properties;
|
|
public pageContents = null;
|
|
public divContents = null;
|
|
public groupedSubjects = [];
|
|
public index: number = 0;
|
|
public subjectsLimit: number = 6;
|
|
public viewAll: boolean = false;
|
|
public maxCharacters: number = 25;
|
|
public subjectsColumns = [];
|
|
|
|
public url: string = null;
|
|
public pageTitle: string = "Subjects";
|
|
|
|
public breadcrumbs: Breadcrumb[] = [{name: 'Home', route: '/'}, {name: 'About - Subjects'}];
|
|
|
|
subs: Subscription[] = [];
|
|
|
|
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;
|
|
if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) {
|
|
this.subs.push(this._piwikService.trackView(this.properties, this.pageTitle, PiwikHelper.getSiteId(this.communityId)).subscribe());
|
|
}
|
|
//this.getDivContents();
|
|
this.getPageContents();
|
|
this.subjects = community.subjects;
|
|
this.subjects.sort((a,b) => {
|
|
if(!a || a.toLocaleUpperCase() < b.toLocaleUpperCase()) {
|
|
return -1;
|
|
} else if (!b || a.toLocaleUpperCase() > b.toLocaleUpperCase()) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
});
|
|
this.groupSubjects();
|
|
this.showLoading = false;
|
|
}
|
|
}));
|
|
}
|
|
|
|
createParams(param) {
|
|
return StringUtils.quote(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;
|
|
}));
|
|
}
|
|
|
|
private getDivContents() {
|
|
this.subs.push(this.helper.getDivHelpContents(this.properties, this.communityId, this._router.url).subscribe(contents => {
|
|
this.divContents = contents;
|
|
}));
|
|
}
|
|
|
|
// private sortSubjects(a, b) {
|
|
|
|
// }
|
|
|
|
private groupSubjects() {
|
|
if(this.subjects.length === 0) {
|
|
return [];
|
|
}
|
|
this.groupedSubjects = Object.values(
|
|
this.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(this.subjects.length > 1) {
|
|
this.groupedSubjects.unshift({group: 'All', data: this.subjects});
|
|
}
|
|
}
|
|
|
|
public changeDisplayedSubjects(i, group) {
|
|
this.subjectsColumns = [];
|
|
this.index = 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'");
|
|
}
|
|
}
|