Metadata added in every page | claimsByToken.component: input of datatables is filtered by a pipe, which searches all columns for some input-keyword | paging information (total results, current page, total pages) added and is updated for every filtering

git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-services-portal/trunk@47451 d315682c-612b-4755-9ff5-7f18f6832af3
This commit is contained in:
konstantina.galouni 2017-06-02 17:49:12 +00:00
parent 10e9fb8fdc
commit a2f2f7dfe8
24 changed files with 244 additions and 74 deletions

View File

@ -1,6 +1,7 @@
import {Component, ViewChild, Input} from '@angular/core'; import {Component, ViewChild, Input} from '@angular/core';
import {Location} from '@angular/common'; import {Location} from '@angular/common';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import { Meta} from '../../../angular2-meta';
@Component({ @Component({
selector: 'claims-admin', selector: 'claims-admin',
@ -18,8 +19,8 @@ import {Observable} from 'rxjs/Observable';
}) })
export class ClaimsAdminComponent { export class ClaimsAdminComponent {
constructor ( ) { constructor ( private _meta: Meta ) {
this._meta.setTitle("Claims Administrator | OpenAIRE");
} }
ngOnInit() { ngOnInit() {
} }

View File

@ -1,7 +1,7 @@
import {Component, ViewChild, Input} from '@angular/core'; import {Component, ViewChild, Input} from '@angular/core';
import {Location} from '@angular/common'; import {Location} from '@angular/common';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import {ActivatedRoute, Router, Params} from '@angular/router'; import {ActivatedRoute, Params} from '@angular/router';
import {ClaimsByTokenService} from './claimsByToken.service'; import {ClaimsByTokenService} from './claimsByToken.service';
import {ModalSelect} from '../../utils/modal/selectModal.component'; import {ModalSelect} from '../../utils/modal/selectModal.component';
@ -11,6 +11,8 @@ import {Session} from '../../login/utils/helper.class';
import {RouterHelper} from '../../utils/routerHelper.class'; import {RouterHelper} from '../../utils/routerHelper.class';
import { Meta} from '../../../angular2-meta'; import { Meta} from '../../../angular2-meta';
import {ClaimsDatatablePipe} from '../../utils/pipes/claimsDatatable.pipe';
//import {DataTable} from "angular2-datatable"; //import {DataTable} from "angular2-datatable";
@Component({ @Component({
@ -79,9 +81,12 @@ import { Meta} from '../../../angular2-meta';
</tr> </tr>
</tbody> </tbody>
</table--> </table-->
<span *ngIf="pending_claims && pending_claims.length > 0 && totalPendingResults.count > 0">
<table *ngIf="pending_claims && pending_claims.length > 0" class="uk-table uk-table-striped" {{totalPendingResults.count}} pending claims, page {{activePendingPage.page}} of {{totalPages(totalPendingResults.count)}}
[mfData]="pending_claims" #mf1="mfDataTable" [mfRowsOnPage]="rowsOnPage" [mfActivePage]="1"> <paging-no-load class="uk-float-right" [currentPage]="activePendingPage.page" [totalResults]="totalPendingResults.count" [size]="rowsOnPage" (pageChange)="refreshTable(table1, $event, 'pending')"></paging-no-load>
</span>
<table #filtered1 *ngIf="pending_claims && pending_claims.length > 0" class="uk-table uk-table-striped"
[mfData]="pending_claims | claimsDatatable : [filterQuery, totalPendingResults, activePendingPage]" #mf1="mfDataTable" [mfRowsOnPage]="rowsOnPage" [mfActivePage]="1">
<!--[(mfSortBy)]="sortByClaimDate1" (mfSortOrder)="sortOrder"--> <!--[(mfSortBy)]="sortByClaimDate1" (mfSortOrder)="sortOrder"-->
<thead> <thead>
<tr> <tr>
@ -90,6 +95,12 @@ import { Meta} from '../../../angular2-meta';
<th class="uk-text-center"><mfDefaultSorter [by]="sortByClaimDate1">Claimed Date</mfDefaultSorter></th> <th class="uk-text-center"><mfDefaultSorter [by]="sortByClaimDate1">Claimed Date</mfDefaultSorter></th>
<th class="uk-text-center">Approve</th> <th class="uk-text-center">Approve</th>
</tr> </tr>
<tr>
<td colspan="4">
Filter pending claims:
<input class="form-control" [(ngModel)]="filterQuery"/>
</td>
</tr>
</thead> </thead>
<tbody> <tbody>
<tr class="uk-table-middle" *ngFor="let claim1 of mf1.data"> <tr class="uk-table-middle" *ngFor="let claim1 of mf1.data">
@ -114,7 +125,6 @@ import { Meta} from '../../../angular2-meta';
<!--paging-no-load class="uk-width-1-1" [currentPage]="1" [totalResults]="pending_claims.length" [size]="rowsOnPage" (pageChange)="refreshTable(mf1, $event)"></paging-no-load--> <!--paging-no-load class="uk-width-1-1" [currentPage]="1" [totalResults]="pending_claims.length" [size]="rowsOnPage" (pageChange)="refreshTable(mf1, $event)"></paging-no-load-->
</tfoot> </tfoot>
</table> </table>
<paging-no-load class="uk-float-right" [currentPage]="1" [totalResults]="pending_claims.length" [size]="rowsOnPage" (pageChange)="refreshTable(table1, $event)"></paging-no-load>
</div> </div>
@ -124,7 +134,7 @@ import { Meta} from '../../../angular2-meta';
<div class = "uk-alert uk-alert-primary " >No curated claims found.</div> <div class = "uk-alert uk-alert-primary " >No curated claims found.</div>
</div> </div>
<div class="uk-overflow-container custom-dataTable-content"> <div class="uk-overflow-container custom-dataTable-content">
<!--table *ngIf="curated_claims && curated_claims.length > 0" class="uk-table uk-table-striped"> <!--table *ngIf="curated_claims && curated_claims.length > 0" class="uk-table uk-table-striped">
<thead> <thead>
<tr> <tr>
@ -157,9 +167,13 @@ import { Meta} from '../../../angular2-meta';
</tr> </tr>
</tbody> </tbody>
</table--> </table-->
<span *ngIf="curated_claims && curated_claims.length > 0 && totalCuratedResults.count > 0">
{{totalCuratedResults.count}} curated claims, page {{activeCuratedPage.page}} of {{totalPages(totalCuratedResults.count)}}
<paging-no-load class="uk-float-right" [currentPage]="activeCuratedPage.page" [totalResults]="totalCuratedResults.count" [size]="rowsOnPage" (pageChange)="refreshTable(table2, $event, 'curated')"> </paging-no-load>
</span>
<table *ngIf="curated_claims && curated_claims.length > 0" class="uk-table uk-table-striped" <table *ngIf="curated_claims && curated_claims.length > 0" class="uk-table uk-table-striped"
[mfData]="curated_claims" #mf2="mfDataTable" [mfRowsOnPage]="rowsOnPage" [mfActivePage]="1"> [mfData]="curated_claims | claimsDatatable : [filterQuery2, totalCuratedResults, activeCuratedPage]" #mf2="mfDataTable" [mfRowsOnPage]="rowsOnPage" [mfActivePage]="1">
<!--[(mfSortBy)]="sortByCurationDate2" [(mfSortOrder)]="sortOrder"--> <!--[(mfSortBy)]="sortByCurationDate2" [(mfSortOrder)]="sortOrder"-->
<thead> <thead>
<tr> <tr>
@ -171,6 +185,12 @@ import { Meta} from '../../../angular2-meta';
<th class="uk-text-center"><mfDefaultSorter [by]="sortByCurationDate2">Curation Date</mfDefaultSorter></th> <th class="uk-text-center"><mfDefaultSorter [by]="sortByCurationDate2">Curation Date</mfDefaultSorter></th>
<th class="uk-text-center">Approved</th> <th class="uk-text-center">Approved</th>
</tr> </tr>
<tr>
<td colspan="4">
Filter curated claims:
<input class="form-control" [(ngModel)]="filterQuery2"/>
</td>
</tr>
</thead> </thead>
<tbody> <tbody>
<tr class="uk-table-middle" *ngFor="let claim of mf2.data let i=index"> <tr class="uk-table-middle" *ngFor="let claim of mf2.data let i=index">
@ -210,7 +230,6 @@ import { Meta} from '../../../angular2-meta';
</tr> </tr>
</tfoot--> </tfoot-->
</table> </table>
<paging-no-load class="uk-float-right" [currentPage]="1" [totalResults]="curated_claims.length" [size]="rowsOnPage" (pageChange)="refreshTable(table2, $event)"> </paging-no-load>
</div> </div>
@ -242,9 +261,18 @@ export class ClaimsByTokenComponent {
public rowsOnPage = 5; public rowsOnPage = 5;
public sortOrder = "asc"; public sortOrder = "asc";
public filterQuery:string = "";
public filterQuery2:string = "";
public activePendingPage:any = {page: 1};
public totalPendingResults:any = {count: 0};
public activeCuratedPage:any = {page: 1};
public totalCuratedResults:any = {count: 0};
@ViewChild('mf1') table1: any;//DataTable; @ViewChild('mf1') table1: any;//DataTable;
@ViewChild('mf2') table2: any;//DataTable; @ViewChild('mf2') table2: any;//DataTable;
@ViewChild('filtered1') filteredItems1;
@ViewChild (ModalSelect) selectModal : ModalSelect; @ViewChild (ModalSelect) selectModal : ModalSelect;
@ -252,7 +280,7 @@ export class ClaimsByTokenComponent {
public routerHelper:RouterHelper = new RouterHelper(); public routerHelper:RouterHelper = new RouterHelper();
constructor ( private route: ActivatedRoute, private _router:Router, private claimsByTokenService: ClaimsByTokenService, private _meta: Meta) { constructor ( private route: ActivatedRoute, private claimsByTokenService: ClaimsByTokenService, private _meta: Meta) {
} }
ngOnInit() { ngOnInit() {
@ -265,13 +293,17 @@ export class ClaimsByTokenComponent {
//this.setMessageSelect("Please select your identity:"); //this.setMessageSelect("Please select your identity:");
//this.setOptionsSelect(this.contact_person); //this.setOptionsSelect(this.contact_person);
this.validateJWTandToken(); this.validateJWTandToken();
this.updateTitle("Claims By Token"); this.updateTitle("Claims For Project Managers");
this.updateDescription("");
} }
); );
} }
refreshTable(table:any, $event:any) { refreshTable(table:any, $event:any, whichTable: string) {
if(whichTable == "pending") {
this.activePendingPage.page = $event.value;
} else if(whichTable == 'curated') {
this.activeCuratedPage.page = $event.value;
}
table.mfActivePage=$event.value; table.mfActivePage=$event.value;
table.setPage(table.mfActivePage, this.rowsOnPage); table.setPage(table.mfActivePage, this.rowsOnPage);
} }
@ -331,6 +363,11 @@ public sortByTitle2= (claim: any) => {
this.pending_claims.push(claim); this.pending_claims.push(claim);
} }
} }
this.totalPendingResults.count = this.pending_claims.length;
this.totalCuratedResults.count = this.curated_claims.length;
this.updateTitle("Claims For Project Managers - "+this.project.name);
}, },
err => { err => {
this.accessStatus = "invalid"; this.accessStatus = "invalid";
@ -436,14 +473,18 @@ public sortByTitle2= (claim: any) => {
} }
} }
updateDescription(description:string){ totalPages(totalResults: number): number {
this._meta.updateMeta("description", description); let totalPages:any = totalResults/(this.rowsOnPage);
this._meta.updateMeta("og:description", description); if(!(Number.isInteger(totalPages))) {
totalPages = (parseInt(totalPages, 10) + 1);
}
return totalPages;
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title);
} }
} }

View File

@ -16,6 +16,8 @@ import {LoadingModalModule} from '../../utils/modal/loadingModal.module';
import {LoginGuard} from'../../login/loginGuard.guard'; import {LoginGuard} from'../../login/loginGuard.guard';
import {PagingModule} from '../../utils/paging.module'; import {PagingModule} from '../../utils/paging.module';
import {ClaimsDatatablePipe} from '../../utils/pipes/claimsDatatable.pipe';
@NgModule({ @NgModule({
imports: [ imports: [
@ -36,7 +38,10 @@ import {PagingModule} from '../../utils/paging.module';
LoginGuard LoginGuard
], ],
declarations: [ declarations: [
ClaimsByTokenComponent ClaimsByTokenComponent, ClaimsDatatablePipe
] ],
exports: [
ClaimsByTokenComponent, ClaimsDatatablePipe
]
}) })
export class ClaimsByTokenModule { } export class ClaimsByTokenModule { }

View File

@ -5,6 +5,7 @@ import {EntitiesSearchService} from '../../utils/entitiesAutoComplete/entitySear
import {ClaimProject, ClaimResult} from '../claim-utils/claimEntities.class'; import {ClaimProject, ClaimResult} from '../claim-utils/claimEntities.class';
import {SearchPublicationsService} from '../../services/searchPublications.service'; import {SearchPublicationsService} from '../../services/searchPublications.service';
import {SearchDatasetsService} from '../../services/searchDatasets.service'; import {SearchDatasetsService} from '../../services/searchDatasets.service';
import { Meta} from '../../../angular2-meta';
@Component({ @Component({
selector: 'directLinking', selector: 'directLinking',
@ -91,8 +92,9 @@ export class DirectLinkingComponent {
sub:any =null; sub:any =null;
show:string="claim"; //{claim,result} show:string="claim"; //{claim,result}
validInput:boolean = null;//'true; validInput:boolean = null;//'true;
constructor ( private _router: Router, private route: ActivatedRoute, private entitySearch:EntitiesSearchService, private publicationsSearch:SearchPublicationsService, private datasetsSearch:SearchDatasetsService) { constructor ( private _router: Router, private route: ActivatedRoute, private entitySearch:EntitiesSearchService,
private publicationsSearch:SearchPublicationsService, private datasetsSearch:SearchDatasetsService, private _meta: Meta) {
this._meta.setTitle("Direct Linking | OpenAIRE");
} }
ngOnInit() { ngOnInit() {
if(localStorage.getItem("projects")){ if(localStorage.getItem("projects")){

View File

@ -5,6 +5,7 @@ import {EntitiesSearchService} from '../../utils/entitiesAutoComplete/entitySear
import {ClaimProject, ClaimResult} from '../claim-utils/claimEntities.class'; import {ClaimProject, ClaimResult} from '../claim-utils/claimEntities.class';
import {SearchPublicationsService} from '../../services/searchPublications.service'; import {SearchPublicationsService} from '../../services/searchPublications.service';
import {SearchDatasetsService} from '../../services/searchDatasets.service'; import {SearchDatasetsService} from '../../services/searchDatasets.service';
import { Meta} from '../../../angular2-meta';
@Component({ @Component({
selector: 'linking-generic', selector: 'linking-generic',
@ -97,8 +98,9 @@ export class LinkingGenericComponent {
entityTypes=["dataset", "publication", "project","context"]; entityTypes=["dataset", "publication", "project","context"];
inlineResult:ClaimResult =null; inlineResult:ClaimResult =null;
sub:any =null; sub:any =null;
constructor ( private _router: Router, private route: ActivatedRoute, private entitySearch:EntitiesSearchService, private publicationsSearch:SearchPublicationsService, private datasetsSearch:SearchDatasetsService) { constructor ( private _router: Router, private route: ActivatedRoute, private entitySearch:EntitiesSearchService,
private publicationsSearch:SearchPublicationsService, private datasetsSearch:SearchDatasetsService, private _meta: Meta) {
this._meta.setTitle("Linking | OpenAIRE");
} }
ngOnInit() { ngOnInit() {
if( typeof localStorage !== 'undefined') { if( typeof localStorage !== 'undefined') {

View File

@ -1,6 +1,6 @@
import {Component, Input} from '@angular/core'; import {Component, Input} from '@angular/core';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import { Meta} from '../../../angular2-meta';
@Component({ @Component({
@ -20,7 +20,8 @@ import {Observable} from 'rxjs/Observable';
}) })
export class MyClaimsComponent { export class MyClaimsComponent {
constructor () { constructor ( private _meta: Meta ) {
this._meta.setTitle("My Claims | OpenAIRE");
} }
ngOnInit() { ngOnInit() {

View File

@ -104,16 +104,20 @@ export class DepositBySubjectResultComponent {
this.status = this.errorCodes.LOADING; this.status = this.errorCodes.LOADING;
this.updateTitle("Deposit "+this.requestFor); this.updateTitle("Deposit "+this.requestFor);
this.updateDescription("Openaire, repositories, open access, data provider, compatibility, organization, deposit "+ this.requestFor); this.updateDescription("Openaire, repositories, open access, data provider, compatibility, organization, deposit "+ this.requestFor);
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }

View File

@ -76,18 +76,21 @@ export class DepositComponent {
this.helpdesk = OpenaireProperties.getHelpdesk(); this.helpdesk = OpenaireProperties.getHelpdesk();
this.updateTitle("Deposit "+this.requestFor); this.updateTitle("Deposit "+this.requestFor);
this.updateDescription("Openaire, repositories, open access, data provider, compatibility, organization, deposit "+ this.requestFor); this.updateDescription("Openaire, repositories, open access, data provider, compatibility, organization, deposit "+ this.requestFor);
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
organizationSelected(id: string) { organizationSelected(id: string) {
console.info("organization selected"); console.info("organization selected");

View File

@ -121,16 +121,20 @@ export class DepositResultComponent {
this.status = this.errorCodes.LOADING; this.status = this.errorCodes.LOADING;
this.updateTitle("Deposit "+this.requestFor); this.updateTitle("Deposit "+this.requestFor);
this.updateDescription("Openaire, repositories, open access, data provider, compatibility, organization, deposit "+ this.requestFor); this.updateDescription("Openaire, repositories, open access, data provider, compatibility, organization, deposit "+ this.requestFor);
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }

View File

@ -1,5 +1,6 @@
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { Meta} from '../../angular2-meta';
@Component({ @Component({
selector: 'error', selector: 'error',
@ -27,7 +28,8 @@ import { Location } from '@angular/common';
export class ErrorPageComponent { export class ErrorPageComponent {
public page: string; public page: string;
constructor (private _location: Location) { constructor (private _location: Location, private _meta: Meta) {
this._meta.setTitle("Error | OpenAIRE");
this.page = _location.path(true); this.page = _location.path(true);
//this.page = _router.url; //this.page = _router.url;
//this.page = location.href; //this.page = location.href;

View File

@ -2,7 +2,7 @@ import {Component, ViewChild, ElementRef} from '@angular/core';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import {DataProviderService} from './dataProvider.service'; import {DataProviderService} from './dataProvider.service';
import {DataProviderInfo} from '../../utils/entities/dataProviderInfo'; import {DataProviderInfo} from '../../utils/entities/dataProviderInfo';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
import { Meta} from '../../../angular2-meta'; import { Meta} from '../../../angular2-meta';
import { FetchPublications } from '../../utils/fetchEntitiesClasses/fetchPublications.class'; import { FetchPublications } from '../../utils/fetchEntitiesClasses/fetchPublications.class';
import { SearchPublicationsService } from '../../services/searchPublications.service'; import { SearchPublicationsService } from '../../services/searchPublications.service';
@ -73,6 +73,7 @@ public reloadRelatedDatasources: boolean = true;
private _dataproviderService: DataProviderService, private _dataproviderService: DataProviderService,
private route: ActivatedRoute, private route: ActivatedRoute,
private _meta: Meta, private _meta: Meta,
private _router: Router,
private _searchPublicationsService: SearchPublicationsService, private _searchPublicationsService: SearchPublicationsService,
private _searchDatasetsService: SearchDatasetsService, private _searchDatasetsService: SearchDatasetsService,
private _searchProjectsService: SearchProjectsService, private _searchProjectsService: SearchProjectsService,
@ -81,7 +82,8 @@ public reloadRelatedDatasources: boolean = true;
this.fetchDatasets = new FetchDatasets(this._searchDatasetsService); this.fetchDatasets = new FetchDatasets(this._searchDatasetsService);
this.fetchProjects = new FetchProjects(this._searchProjectsService); this.fetchProjects = new FetchProjects(this._searchProjectsService);
this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService); this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService);
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
} }
ngOnInit() { ngOnInit() {
@ -130,14 +132,18 @@ public reloadRelatedDatasources: boolean = true;
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
} }
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
}
public initTabs(){ public initTabs(){
if(this.dataProviderInfo.tabs != undefined && this.dataProviderInfo.tabs.length > 0) { if(this.dataProviderInfo.tabs != undefined && this.dataProviderInfo.tabs.length > 0) {

View File

@ -2,7 +2,7 @@ import {Component, ViewChild, ElementRef} from '@angular/core';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import {DatasetService} from './dataset.service'; import {DatasetService} from './dataset.service';
import {DatasetInfo} from '../../utils/entities/datasetInfo'; import {DatasetInfo} from '../../utils/entities/datasetInfo';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
import {OpenaireProperties} from '../../utils/properties/openaireProperties' import {OpenaireProperties} from '../../utils/properties/openaireProperties'
import {RouterHelper} from '../../utils/routerHelper.class'; import {RouterHelper} from '../../utils/routerHelper.class';
import { Meta} from '../../../angular2-meta'; import { Meta} from '../../../angular2-meta';
@ -43,7 +43,10 @@ export class DatasetComponent {
constructor (private element: ElementRef, constructor (private element: ElementRef,
private _datasetService: DatasetService, private _datasetService: DatasetService,
private route: ActivatedRoute, private route: ActivatedRoute,
private _meta: Meta) {} private _meta: Meta,
private _router: Router) {
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
}
ngOnInit() { ngOnInit() {
this.sub = this.route.queryParams.subscribe(params => { this.sub = this.route.queryParams.subscribe(params => {
@ -120,13 +123,16 @@ export class DatasetComponent {
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
public buildCurationTooltip() { public buildCurationTooltip() {

View File

@ -1,6 +1,6 @@
import {Component, ViewChild, ElementRef} from '@angular/core'; import {Component, ViewChild, ElementRef} from '@angular/core';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
import {OrganizationService} from '../../services/organization.service'; import {OrganizationService} from '../../services/organization.service';
import {OrganizationInfo} from '../../utils/entities/organizationInfo'; import {OrganizationInfo} from '../../utils/entities/organizationInfo';
@ -62,9 +62,11 @@ export class OrganizationComponent {
private _searchDataprovidersService: SearchDataprovidersService, private _searchDataprovidersService: SearchDataprovidersService,
private _reportsService: ReportsService, private _reportsService: ReportsService,
private _searchPublicationsService: SearchPublicationsService, private _searchPublicationsService: SearchPublicationsService,
private _searchProjectsService: SearchProjectsService, private _meta: Meta) { private _searchProjectsService: SearchProjectsService, private _meta: Meta,
private _router: Router) {
this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService); this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService);
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
} }
ngOnInit() { ngOnInit() {
@ -333,13 +335,16 @@ export class OrganizationComponent {
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
public openLoading(){ public openLoading(){

View File

@ -1,6 +1,6 @@
import {Component, ViewChild, ElementRef} from '@angular/core'; import {Component, ViewChild, ElementRef} from '@angular/core';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import {ActivatedRoute, Params} from '@angular/router'; import {ActivatedRoute, Params, Router} from '@angular/router';
import {ProjectService} from './project.service'; import {ProjectService} from './project.service';
import {ProjectInfo} from '../../utils/entities/projectInfo'; import {ProjectInfo} from '../../utils/entities/projectInfo';
import {RouterHelper} from '../../utils/routerHelper.class'; import {RouterHelper} from '../../utils/routerHelper.class';
@ -67,8 +67,10 @@ export class ProjectComponent{
private route: ActivatedRoute, private route: ActivatedRoute,
private _searchPublicationsService: SearchPublicationsService, private _searchPublicationsService: SearchPublicationsService,
private _searchDatasetsService: SearchDatasetsService, private _searchDatasetsService: SearchDatasetsService,
private _reportsService: ReportsService, private _meta: Meta) { private _reportsService: ReportsService, private _meta: Meta,
private _router: Router) {
console.info('project constructor.'); console.info('project constructor.');
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
} }
ngOnInit() { ngOnInit() {
@ -259,15 +261,17 @@ export class ProjectComponent{
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
public openLoading(){ public openLoading(){
if(this.loading){ if(this.loading){

View File

@ -2,7 +2,7 @@ import {Component, ViewChild, ElementRef} from '@angular/core';
import {Observable} from 'rxjs/Observable'; import {Observable} from 'rxjs/Observable';
import {PublicationService} from './publication.service'; import {PublicationService} from './publication.service';
import {PublicationInfo} from '../../utils/entities/publicationInfo'; import {PublicationInfo} from '../../utils/entities/publicationInfo';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
import {OpenaireProperties} from '../../utils/properties/openaireProperties'; import {OpenaireProperties} from '../../utils/properties/openaireProperties';
import {RouterHelper} from '../../utils/routerHelper.class'; import {RouterHelper} from '../../utils/routerHelper.class';
import { Meta} from '../../../angular2-meta'; import { Meta} from '../../../angular2-meta';
@ -53,7 +53,10 @@ export class PublicationComponent {
constructor ( private element: ElementRef, constructor ( private element: ElementRef,
private _publicationService: PublicationService, private _publicationService: PublicationService,
private route: ActivatedRoute, private _meta: Meta) { } private route: ActivatedRoute, private _meta: Meta,
private _router: Router) {
this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url);
}
ngOnInit() { ngOnInit() {
this.sub = this.route.queryParams.subscribe(data => { this.sub = this.route.queryParams.subscribe(data => {
@ -208,13 +211,17 @@ export class PublicationComponent {
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
} }

View File

@ -5,6 +5,8 @@ import {ActivatedRoute, Router} from '@angular/router';
import {LoginService} from './login.service'; import {LoginService} from './login.service';
import {User,Session} from './utils/helper.class'; import {User,Session} from './utils/helper.class';
import {RouterHelper} from '../utils/routerHelper.class'; import {RouterHelper} from '../utils/routerHelper.class';
import { Meta} from '../../angular2-meta';
@Component({ @Component({
selector: 'user', selector: 'user',
template: ` template: `
@ -64,7 +66,10 @@ export class UserComponent {
public redirectUrl: string = ""; public redirectUrl: string = "";
public routerHelper:RouterHelper = new RouterHelper(); public routerHelper:RouterHelper = new RouterHelper();
constructor( private router: Router, private _loginService: LoginService, private route: ActivatedRoute ) {} constructor( private router: Router, private _loginService: LoginService,
private route: ActivatedRoute, private _meta: Meta ) {
this._meta.setTitle("Login | OpenAIRE");
}
ngOnInit() { ngOnInit() {
if( typeof document !== 'undefined') { if( typeof document !== 'undefined') {

View File

@ -294,6 +294,7 @@ export class SearchComponent {
public subPub;public subData;public subProjects;public subOrg;public subPeople; public subDataPr; public subPub;public subData;public subProjects;public subOrg;public subPeople; public subDataPr;
constructor ( private route: ActivatedRoute, constructor ( private route: ActivatedRoute,
private _router: Router,
private _searchPublicationsService: SearchPublicationsService, private _searchPublicationsService: SearchPublicationsService,
private _searchDataprovidersService: SearchDataprovidersService, private _searchDataprovidersService: SearchDataprovidersService,
private _searchProjectsService: SearchProjectsService, private _searchProjectsService: SearchProjectsService,
@ -309,10 +310,12 @@ public subPub;public subData;public subProjects;public subOrg;public subPeople;
this.fetchPeople = new FetchPeople(this._searchPeopleService); this.fetchPeople = new FetchPeople(this._searchPeopleService);
var description = "open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "; var description = "open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects ";
var title = "Search publications, datasets, projects... | OpenAIRE"; var title = "Search publications, datasets, projects... | OpenAIRE";
var url = OpenaireProperties.getBaseLink()+this._router.url;
this._meta.setTitle(title); this._meta.setTitle(title);
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
this._meta.updateMeta("og:title", title); this._meta.updateProperty("og:title", title);
this._meta.updateProperty("og:url", url);
// console.log("Constr PORT:"+process.env.PORT); // console.log("Constr PORT:"+process.env.PORT);
// if (typeof document !== 'undefined') { // if (typeof document !== 'undefined') {
// //

View File

@ -8,7 +8,7 @@ import {SearchUtilsClass} from './searchUtils.class';
import {ModalLoading} from '../../utils/modal/loading.component'; import {ModalLoading} from '../../utils/modal/loading.component';
import {StringUtils, Dates} from '../../utils/string-utils.class'; import {StringUtils, Dates} from '../../utils/string-utils.class';
import { Meta} from '../../../angular2-meta'; import { Meta} from '../../../angular2-meta';
import {OpenaireProperties} from '../../utils/properties/openaireProperties';
@Component({ @Component({
selector: 'advanced-search-page', selector: 'advanced-search-page',
@ -74,19 +74,24 @@ export class AdvancedSearchPageComponent {
ngOnInit() { ngOnInit() {
this.updateTitle("Advanced search "+this.pageTitle); this.updateTitle("Advanced search "+this.pageTitle);
this.updateDescription("Openaire, search, repositories, open access, type, data provider, funder, project, "+ this.pageTitle); this.updateDescription("Openaire, search, repositories, open access, type, data provider, funder, project, "+ this.pageTitle);
this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname);
this.searchUtils.baseUrl = "/" + this.searchUtils.baseUrl; this.searchUtils.baseUrl = "/" + this.searchUtils.baseUrl;
this.updateBaseUrlWithParameters(); this.updateBaseUrlWithParameters();
this.defineUrlParam(); this.defineUrlParam();
} }
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
private defineUrlParam() { private defineUrlParam() {
if(this.entityType == "publication") { if(this.entityType == "publication") {

View File

@ -10,6 +10,8 @@ import {ModalLoading} from '../../utils/modal/loading.component';
import { Meta} from '../../../angular2-meta'; import { Meta} from '../../../angular2-meta';
import{SearchFilterComponent} from './searchFilter.component'; import{SearchFilterComponent} from './searchFilter.component';
import {SearchFilterModalComponent} from './searchFilterModal.component'; import {SearchFilterModalComponent} from './searchFilterModal.component';
import {OpenaireProperties} from '../../utils/properties/openaireProperties';
@Component({ @Component({
selector: 'search-page', selector: 'search-page',
@ -147,6 +149,7 @@ export class SearchPageComponent {
this.defineUrlParam(); this.defineUrlParam();
this.updateTitle(this.pageTitle); this.updateTitle(this.pageTitle);
this.updateDescription("Openaire, search, repositories, open access, type, data provider, funder, project, " + this.type + "," +this.pageTitle); this.updateDescription("Openaire, search, repositories, open access, type, data provider, funder, project, " + this.type + "," +this.pageTitle);
this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname);
// console.info(this.entityType + " " + this.urlParam + this.type); // console.info(this.entityType + " " + this.urlParam + this.type);
} }
ngAfterViewChecked(){ ngAfterViewChecked(){
@ -160,13 +163,16 @@ export class SearchPageComponent {
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
private defineUrlParam() { private defineUrlParam() {
if(this.entityType == "publication") { if(this.entityType == "publication") {

View File

@ -11,6 +11,7 @@ import { Meta} from '../../../angular2-meta';
import{SearchFilterComponent} from './searchFilter.component'; import{SearchFilterComponent} from './searchFilter.component';
import {SearchFilterModalComponent} from './searchFilterModal.component'; import {SearchFilterModalComponent} from './searchFilterModal.component';
import { ErrorCodes} from '../../utils/properties/openaireProperties'; import { ErrorCodes} from '../../utils/properties/openaireProperties';
import {OpenaireProperties} from '../../utils/properties/openaireProperties';
@Component({ @Component({
selector: 'search-page-table', selector: 'search-page-table',
@ -190,6 +191,8 @@ export class SearchPageTableViewComponent {
this.defineUrlParam(); this.defineUrlParam();
this.updateTitle(this.pageTitle); this.updateTitle(this.pageTitle);
this.updateDescription("Openaire, search, repositories, open access, type, data provider, funder, project, " + this.type + "," +this.pageTitle); this.updateDescription("Openaire, search, repositories, open access, type, data provider, funder, project, " + this.type + "," +this.pageTitle);
this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname);
// console.info(this.entityType + " " + this.urlParam + this.type); // console.info(this.entityType + " " + this.urlParam + this.type);
} }
ngAfterViewChecked(){ ngAfterViewChecked(){
@ -217,13 +220,16 @@ export class SearchPageTableViewComponent {
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
private defineUrlParam() { private defineUrlParam() {
if(this.entityType == "publication") { if(this.entityType == "publication") {

View File

@ -7,12 +7,15 @@ export class OpenaireMetaTags{
updateDescription(description:string){ updateDescription(description:string){
this._meta.updateMeta("description", description); this._meta.updateMeta("description", description);
this._meta.updateMeta("og:description", description); this._meta.updateProperty("og:description", description);
} }
updateTitle(title:string){ updateTitle(title:string){
var _suffix ="| OpenAIRE"; var _suffix ="| OpenAIRE";
var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix; var _title = ((title.length> 50 ) ?title.substring(0,50):title) + _suffix;
this._meta.setTitle(_title ); this._meta.setTitle(_title );
this._meta.updateMeta("og:title",_title); this._meta.updateProperty("og:title",_title);
}
updateUrl(url:string){
this._meta.updateProperty("og:url", url);
} }
} }

View File

@ -0,0 +1,48 @@
import { Pipe, PipeTransform} from '@angular/core'
@Pipe({
name: 'claimsDatatable'
})
export class ClaimsDatatablePipe implements PipeTransform {
transform(array: any[], args: any[]): any {
let query: string = args[0];
let counter:any = args[1];
let active: any = args[2];
active.page = 1;
if (query) {
var result = array.filter(row=>this.filterAll(row, query));
counter.count = result.length;
return result;
}
return array;
}
filterAll(row: any, query: string) {
if(row.userMail.indexOf(query) > -1) {
return true;
}
if(row.targetType != 'project' && row.target.title.indexOf(query) > -1) {
return true;
}
if(row.sourceType != 'project' && row.source.title.indexOf(query) > -1) {
return true;
}
if(row.date.indexOf(query) > -1) {
return true;
}
if(row.curatedBy != null && row.curatedBy.indexOf(query) > -1) {
return true;
}
if(row.curationDate != null && row.curationDate.indexOf(query) > -1) {
return true;
}
return false;
}
}

View File

@ -2,7 +2,7 @@ export class OpenaireProperties {
private static productionMode:boolean = false; private static productionMode:boolean = false;
//base url //base url
private static baseLink = "http://demo.openaire.eu"; private static baseLink = "https://demo.openaire.eu";
//landing Pages //landing Pages
private static baseSearchLink="/"; private static baseSearchLink="/";
@ -39,7 +39,7 @@ export class OpenaireProperties {
private static loginAPIURL = "http://scoobydoo.di.uoa.gr:8080/uoa-user-management-1.0.0-SNAPSHOT/api/users/authenticates"; private static loginAPIURL = "http://scoobydoo.di.uoa.gr:8080/uoa-user-management-1.0.0-SNAPSHOT/api/users/authenticates";
private static loginAPIURL_pm = "https://scoobydoo.di.uoa.gr:8080/uoa-user-management-1.0.0-SNAPSHOT/api/users/authenticates"; private static loginAPIURL_pm = "https://scoobydoo.di.uoa.gr:8080/uoa-user-management-1.0.0-SNAPSHOT/api/users/authenticates";
private static claimsAPIURL = "http://scoobydoo.di.uoa.gr:8080/dnet-openaire-connector-service-1.0.0-SNAPSHOT/rest/claimsService/"; private static claimsAPIURL = "http://scoobydoo.di.uoa.gr:8080/dnet-openaire-connector-service-2.0.0-SNAPSHOT/rest/claimsService/";
private static claimsAPIURL_pm = "https://beta.services.openaire.eu/claims/rest/claimsService/"; private static claimsAPIURL_pm = "https://beta.services.openaire.eu/claims/rest/claimsService/";
private static searchAPIURLLAst_pm = "https://beta.services.openaire.eu/search/v2/api/"; private static searchAPIURLLAst_pm = "https://beta.services.openaire.eu/search/v2/api/";

View File

@ -8,17 +8,18 @@
<base href="/" /> <base href="/" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="description" content="open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "/> <meta name="description" content="open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "/>
<meta property="og:description" content="open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "/> <meta property="og:description" content="open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "/>
<meta property="og:title" content="Search OpenAIRE"/> <meta property="og:title" content="Search OpenAIRE"/>
<meta property="og:type" content="website"/> <meta property="og:type" content="website"/>
<meta property="og:url" content="http://demo.openaire.eu"/> <meta property="og:url" content="https://demo.openaire.eu"/>
<meta property="og:site_name" content="OpenAIRE"/> <meta property="og:site_name" content="OpenAIRE"/>
<!--meta property="og:image" content="http://duffy.di.uoa.gr:3000/assets/newlogo_200_200.png"/> <meta property="og:image" content="https://demo.openaire.eu/assets/dl119_files/Symbol.png"/>
<meta property="og:image:secure_url" content="https://demo.openaire.eu/assets/dl119_files/Symbol.png" />
<meta property="og:image:type" content="image/png" /> <meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="200" /> <meta property="og:image:width" content="360" />
<meta property="og:image:height" content="200" /--> <meta property="og:image:height" content="359" />
<link href="assets/favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" /> <link href="assets/favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<title>Search OpenAIRE</title> <title>Search OpenAIRE</title>