From 036a57940bb5ac8c2d3a9dc16f091878dc052c3a Mon Sep 17 00:00:00 2001 From: Argiro Kokogiannaki Date: Mon, 16 Nov 2020 12:56:17 +0000 Subject: [PATCH] [Graph | Trunk] SEO updates: -titles, meta description json ld -piwik calls -sitemap.xml -robots.txt -add error page Add timeout interceptor git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-graph-portal/trunk@59855 d315682c-612b-4755-9ff5-7f18f6832af3 --- angular.json | 11 +++++- src/app/about/about.component.html | 6 +++ src/app/about/about.component.ts | 45 +++++++++++++++++----- src/app/about/about.module.ts | 4 +- src/app/app.component.html | 5 +++ src/app/app.module.ts | 16 ++++++-- src/app/app.routing.ts | 16 +++++--- src/app/contact/contact.component.html | 6 +++ src/app/contact/contact.component.ts | 37 ++++++++++++++---- src/app/home/home.component.ts | 14 +++---- src/app/resources/resources.component.html | 4 ++ src/app/resources/resources.component.ts | 40 +++++++++++++++---- src/app/resources/resources.module.ts | 4 +- src/environments/environment.beta.ts | 5 +++ src/environments/environment.prod.ts | 5 +++ src/environments/environment.ts | 5 +++ src/index.html | 1 + src/index.prod.html | 1 + src/robots.prod.txt | 4 ++ src/robots.txt | 2 + src/sitemap.xml | 12 ++++++ 21 files changed, 199 insertions(+), 44 deletions(-) create mode 100644 src/robots.prod.txt create mode 100644 src/robots.txt create mode 100644 src/sitemap.xml diff --git a/angular.json b/angular.json index aac53cb..fca755d 100644 --- a/angular.json +++ b/angular.json @@ -17,7 +17,9 @@ "tsConfig": "src/tsconfig.app.json", "polyfills": "src/polyfills.ts", "assets": [ - "src/assets" + "src/assets", + "src/robots.txt", + "src/sitemap.xml" ], "styles": [ "src/styles.css", @@ -49,6 +51,10 @@ { "replace": "src/index.html", "with": "src/index.prod.html" + }, + { + "replace": "src/robots.txt", + "with": "src/robots.prod.txt" } ] }, @@ -112,7 +118,8 @@ ], "assets": [ "src/assets", - "src/robots.txt" + "src/robots.txt", + "src/sitemap.xml" ] } }, diff --git a/src/app/about/about.component.html b/src/app/about/about.component.html index 0207f3a..a7f772d 100644 --- a/src/app/about/about.component.html +++ b/src/app/about/about.component.html @@ -1,4 +1,10 @@
+ +
diff --git a/src/app/about/about.component.ts b/src/app/about/about.component.ts index d51c470..cdfc744 100644 --- a/src/app/about/about.component.ts +++ b/src/app/about/about.component.ts @@ -1,8 +1,12 @@ -import {AfterViewChecked, Component, ElementRef, OnInit, ViewChild} from '@angular/core'; -import {faqs} from './faqs'; -import {ActivatedRoute} from '@angular/router'; -import {Title} from '@angular/platform-browser'; +import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Meta, Title} from '@angular/platform-browser'; import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component"; +import {EnvProperties} from '../openaireLibrary/utils/properties/env-properties'; +import {properties} from '../../environments/environment'; +import {Subscription} from 'rxjs'; +import {PiwikService} from '../openaireLibrary/utils/piwik/piwik.service'; +import {SEOService} from '../openaireLibrary/sharedComponents/SEO/SEO.service'; declare var UIkit: any; @@ -19,7 +23,10 @@ export class AboutComponent implements OnInit { public dedupMatchingAndElectionReadMore: boolean = false; public enrichmentPropagationReadMore: boolean = false; public enrichmentMiningReadMore: boolean = false; - + properties:EnvProperties; + subs: Subscription[] = []; + description = "The OpenAIRE Research Graph includes metadata and links between scientific products (e.g. literature, datasets, software, other research products), organizations, funders, funding streams, projects, communities, and (provenance) data sources. Information on how we build it, the architecture, the infrastructure and the team."; + title = "OpenAIRE - Research Graph | About"; public breadcrumbs: Breadcrumb[] = [ { name: 'home', @@ -30,17 +37,29 @@ export class AboutComponent implements OnInit { } ]; - constructor(private title: Title, - private route: ActivatedRoute) { + constructor(private _title: Title, + private route: ActivatedRoute, private _router: Router, + private _piwikService:PiwikService, + private _meta: Meta, private seoService: SEOService) { } ngOnInit() { - this.title.setTitle('OpenAIRE - Research Graph | About'); - this.route.fragment.subscribe(fragment => { + this.properties = properties; + this._title.setTitle(this.title); + this._meta.updateTag({content:this.description},"name='description'"); + this._meta.updateTag({content:this.description},"property='og:description'"); + this._meta.updateTag({content:this.title},"property='og:title'"); + this.subs.push(this.route.fragment.subscribe(fragment => { setTimeout(() => { this.goTo(fragment); }, 100); - }); + })); + var url = this.properties.domain + this.properties.baseLink+this._router.url; + this.seoService.createLinkForCanonicalURL(url, false); + this._meta.updateTag({content:url},"property='og:url'"); + if(this.properties.enablePiwikTrack && (typeof document !== 'undefined')){ + this.subs.push(this._piwikService.trackView(this.properties, this.title).subscribe()); + } } goTo(id: string) { @@ -55,4 +74,10 @@ export class AboutComponent implements OnInit { changeTab(index: number) { UIkit.switcher(this.tabs.nativeElement).show(index); } + public ngOnDestroy() { + for (let sub of this.subs) { + sub.unsubscribe(); + } + } + } diff --git a/src/app/about/about.module.ts b/src/app/about/about.module.ts index 2ef24ae..f8c8936 100644 --- a/src/app/about/about.module.ts +++ b/src/app/about/about.module.ts @@ -8,6 +8,7 @@ import {ActionPointComponent} from "./action-point.component"; import {IconsModule} from "../openaireLibrary/utils/icons/icons.module"; import {IconsService} from "../openaireLibrary/utils/icons/icons.service"; import {arrow_right} from "../openaireLibrary/utils/icons/icons"; +import {Schema2jsonldModule} from '../openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module'; @NgModule({ imports: [ @@ -16,7 +17,8 @@ import {arrow_right} from "../openaireLibrary/utils/icons/icons"; path: '', component: AboutComponent }]), BreadcrumbsModule, - IconsModule + IconsModule, + Schema2jsonldModule ], declarations: [AboutComponent, ActionPointComponent], exports: [AboutComponent] diff --git a/src/app/app.component.html b/src/app/app.component.html index ecd948d..443729c 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,11 @@
+ +
diff --git a/src/app/app.module.ts b/src/app/app.module.ts index b7f7f3d..97bb368 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,6 +1,6 @@ import {AppRoutingModule} from "./app.routing"; import {BrowserModule} from "@angular/platform-browser"; -import {HttpClientModule} from "@angular/common/http"; +import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http'; import {CookieLawModule} from "./openaireLibrary/sharedComponents/cookie-law/cookie-law.module"; import {NavigationBarModule} from "./openaireLibrary/sharedComponents/navigationBar.module"; import {BrowserAnimationsModule} from "@angular/platform-browser/animations"; @@ -9,6 +9,11 @@ import {AppComponent} from "./app.component"; import {NgModule} from "@angular/core"; import {EnvironmentSpecificService} from "./openaireLibrary/utils/properties/environment-specific.service"; import {BottomModule} from './openaireLibrary/sharedComponents/bottom.module'; +import {Schema2jsonldModule} from './openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module'; +import {ErrorModule} from './openaireLibrary/error/error.module'; +import {PreviousRouteRecorder} from './openaireLibrary/utils/piwik/previousRouteRecorder.guard'; +import {PiwikService} from './openaireLibrary/utils/piwik/piwik.service'; +import {DEFAULT_TIMEOUT, TimeoutInterceptor} from './openaireLibrary/timeout-interceptor.service'; @NgModule({ imports: [ @@ -20,12 +25,17 @@ import {BottomModule} from './openaireLibrary/sharedComponents/bottom.module'; CookieLawModule, SafeHtmlPipeModule, BrowserAnimationsModule, - BottomModule + BottomModule, + Schema2jsonldModule, + ErrorModule ], declarations: [ AppComponent, ], - providers: [EnvironmentSpecificService], + providers: [EnvironmentSpecificService, PreviousRouteRecorder, PiwikService, + [{ provide: HTTP_INTERCEPTORS, useClass: TimeoutInterceptor, multi: true }], + [{ provide: DEFAULT_TIMEOUT, useValue: 30000 }] + ], bootstrap: [ AppComponent ] }) export class AppModule { } diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts index aa5a8b0..f5e10ab 100644 --- a/src/app/app.routing.ts +++ b/src/app/app.routing.ts @@ -1,5 +1,7 @@ import {NgModule} from '@angular/core'; import {Routes, RouterModule, PreloadAllModules} from '@angular/router'; +import {ErrorPageComponent} from './openaireLibrary/error/errorPage.component'; +import {PreviousRouteRecorder} from './openaireLibrary/utils/piwik/previousRouteRecorder.guard'; const appRoutes: Routes = [ { @@ -7,20 +9,24 @@ const appRoutes: Routes = [ loadChildren: './home/home.module#HomeModule', data: { isHome: true - } + }, canDeactivate: [PreviousRouteRecorder] }, { path: 'resources', - loadChildren: './resources/resources.module#ResourcesModule' + loadChildren: './resources/resources.module#ResourcesModule', + canDeactivate: [PreviousRouteRecorder] }, { path: 'support', - loadChildren: './contact/contact.module#ContactModule' + loadChildren: './contact/contact.module#ContactModule', + canDeactivate: [PreviousRouteRecorder] }, { path: 'about', - loadChildren: './about/about.module#AboutModule' - } + loadChildren: './about/about.module#AboutModule', + canDeactivate: [PreviousRouteRecorder] + }, + { path: '**',pathMatch: 'full',component: ErrorPageComponent} ]; @NgModule({ diff --git a/src/app/contact/contact.component.html b/src/app/contact/contact.component.html index 527513c..2e6be39 100644 --- a/src/app/contact/contact.component.html +++ b/src/app/contact/contact.component.html @@ -1,4 +1,10 @@
+ +
diff --git a/src/app/contact/contact.component.ts b/src/app/contact/contact.component.ts index 49e5d01..ce1f481 100644 --- a/src/app/contact/contact.component.ts +++ b/src/app/contact/contact.component.ts @@ -4,12 +4,15 @@ import {EmailService} from '../openaireLibrary/utils/email/email.service'; import {Email} from '../openaireLibrary/utils/email/email'; import {EnvProperties} from '../openaireLibrary/utils/properties/env-properties'; import {Composer} from '../openaireLibrary/utils/email/composer'; -import {Title} from '@angular/platform-browser'; +import {Meta, Title} from '@angular/platform-browser'; import {HelperFunctions} from '../openaireLibrary/utils/HelperFunctions.class'; import {FormBuilder, FormGroup, Validators} from '@angular/forms'; import {properties} from '../../environments/environment'; import {FAQ} from "../openaireLibrary/utils/entities/FAQ"; import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component"; +import {Subscription} from 'rxjs'; +import {PiwikService} from '../openaireLibrary/utils/piwik/piwik.service'; +import {SEOService} from '../openaireLibrary/sharedComponents/SEO/SEO.service'; @Component({ selector: 'contact', @@ -23,7 +26,9 @@ export class ContactComponent implements OnInit { public email: Email; public faqs: FAQ[] = []; public properties: EnvProperties = properties; - + subs: Subscription[] = []; + description = "Do you have questions? Contact us"; + title = "OpenAIRE - Research Graph | Support"; public contactForm: FormGroup; @ViewChild('AlertModal') modal; @ViewChild('recaptcha') recaptcha; @@ -41,21 +46,32 @@ export class ContactComponent implements OnInit { constructor(private router: Router, private route: ActivatedRoute, private emailService: EmailService, - private title: Title, + private _title: Title, + private _piwikService:PiwikService, + private _meta: Meta, private seoService: SEOService, private fb: FormBuilder) { this.setFaqs(); } ngOnInit() { - this.title.setTitle('OpenAIRE - Research Graph | Contact Us'); - this.route.fragment.subscribe(fragment => { + this._title.setTitle(this.title); + this._meta.updateTag({content:this.description},"name='description'"); + this._meta.updateTag({content:this.description},"property='og:description'"); + this._meta.updateTag({content:this.title},"property='og:title'"); + this.subs.push(this.route.fragment.subscribe(fragment => { setTimeout(() => { this.goTo(fragment); }, 100); - }); + })); this.email = {body: '', subject: '', recipients: []}; this.reset(); this.showLoading = false; + var url = this.properties.domain + this.properties.baseLink+this.router.url; + this.seoService.createLinkForCanonicalURL(url, false); + this._meta.updateTag({content:url},"property='og:url'"); + if(this.properties.enablePiwikTrack && (typeof document !== 'undefined')){ + this.subs.push(this._piwikService.trackView(this.properties, this.title).subscribe()); + } } public send(event) { @@ -81,7 +97,7 @@ export class ContactComponent implements OnInit { private sendMail(admins: any) { this.showLoading = true; - this.emailService.contact(this.properties, + this.subs.push(this.emailService.contact(this.properties, Composer.composeEmailForGraph(this.contactForm.value, admins), this.contactForm.value.recaptcha).subscribe( res => { @@ -99,7 +115,7 @@ export class ContactComponent implements OnInit { this.showLoading = false; this.contactForm.get('recaptcha').setValue(''); } - ); + )); } public modalOpen() { @@ -148,4 +164,9 @@ export class ContactComponent implements OnInit { window.scrollTo({top: y, behavior: 'smooth'}); } } + public ngOnDestroy() { + for (let sub of this.subs) { + sub.unsubscribe(); + } + } } diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index 1e05ac3..16ade1a 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -60,22 +60,22 @@ export class HomeComponent { private config: ConfigurationService, private _meta: Meta, private _title: Title, private seoService: SEOService ) { - let description = "OpenAIRE Research Graph"; + let description = "OpenAIRE Research Graph is an open resource that aggregates a collection of research data properties (metadata, links) available within the OpenAIRE Open Science infrastructure for funders, organizations, researchers, research communities and publishers to interlink information by using a semantic graph database approach."; this._title.setTitle(this.pageTitle); - /*this._meta.updateTag({content: description}, "name='description'"); + this._meta.updateTag({content: description}, "name='description'"); this._meta.updateTag({content: description}, "property='og:description'"); - this._meta.updateTag({content: this.pageTitle}, "property='og:title'");*/ + this._meta.updateTag({content: this.pageTitle}, "property='og:title'"); } public ngOnInit() { - /*this.seoService.createLinkForCanonicalURL(this.properties.domain + this.properties.baseLink + this._router.url, false);*/ if (this.properties) { - /*var url = this.properties.domain + this.properties.baseLink + this._router.url; + let url = this.properties.domain + this.properties.baseLink + this._router.url; + this.seoService.createLinkForCanonicalURL(url, false); this._meta.updateTag({content: url}, "property='og:url'"); if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) { - this.subs.push(this._piwikService.trackView(this.properties, "OpenAIRE").subscribe()); - }*/ + this.subs.push(this._piwikService.trackView(this.properties, this.pageTitle).subscribe()); + } this.getNumbers(); this.animation(); } diff --git a/src/app/resources/resources.component.html b/src/app/resources/resources.component.html index 16af6ae..aba5a96 100644 --- a/src/app/resources/resources.component.html +++ b/src/app/resources/resources.component.html @@ -1,4 +1,8 @@
+ +
diff --git a/src/app/resources/resources.component.ts b/src/app/resources/resources.component.ts index 770232b..2617754 100644 --- a/src/app/resources/resources.component.ts +++ b/src/app/resources/resources.component.ts @@ -1,7 +1,12 @@ import {Component, OnInit} from '@angular/core'; -import {Title} from '@angular/platform-browser'; +import {Meta, Title} from '@angular/platform-browser'; import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component"; -import {ActivatedRoute} from "@angular/router"; +import {ActivatedRoute, Router} from '@angular/router'; +import {properties} from '../../environments/environment'; +import {EnvProperties} from '../openaireLibrary/utils/properties/env-properties'; +import {PiwikService} from '../openaireLibrary/utils/piwik/piwik.service'; +import {SEOService} from '../openaireLibrary/sharedComponents/SEO/SEO.service'; +import {Subscription} from 'rxjs'; @Component({ selector: 'resources', @@ -9,7 +14,10 @@ import {ActivatedRoute} from "@angular/router"; styleUrls: ['resources.component.css'], }) export class ResourcesComponent implements OnInit { - + properties:EnvProperties; + subs: Subscription[] = []; + description = "Start building with OpenAIRE APIs. How to access the graph? XML Metadata schema and documentation."; + title = "OpenAIRE - Research Graph | Resources"; public breadcrumbs: Breadcrumb[] = [ { name: 'home', @@ -20,16 +28,28 @@ export class ResourcesComponent implements OnInit { } ]; - constructor(private title: Title, private route: ActivatedRoute) { + constructor(private _title: Title, private route: ActivatedRoute, private _router: Router, + private _piwikService:PiwikService, + private _meta: Meta, private seoService: SEOService) { } ngOnInit() { - this.title.setTitle('OpenAIRE - Research Graph | Resources'); - this.route.fragment.subscribe(fragment => { + this.properties = properties; + this._title.setTitle(this.title); + this._meta.updateTag({content:this.description},"name='description'"); + this._meta.updateTag({content:this.description},"property='og:description'"); + this._meta.updateTag({content:this.title},"property='og:title'"); + var url = this.properties.domain + this.properties.baseLink+this._router.url; + this.seoService.createLinkForCanonicalURL(url, false); + this._meta.updateTag({content:url},"property='og:url'"); + if(this.properties.enablePiwikTrack && (typeof document !== 'undefined')){ + this.subs.push(this._piwikService.trackView(this.properties, this.title).subscribe()); + } + this.subs.push(this.route.fragment.subscribe(fragment => { setTimeout(() => { this.goTo(fragment); }, 100); - }); + })); } goTo(id: string) { @@ -40,4 +60,10 @@ export class ResourcesComponent implements OnInit { window.scrollTo({top: y, behavior: 'smooth'}); } } + + public ngOnDestroy() { + for (let sub of this.subs) { + sub.unsubscribe(); + } + } } diff --git a/src/app/resources/resources.module.ts b/src/app/resources/resources.module.ts index 7779620..3e46869 100644 --- a/src/app/resources/resources.module.ts +++ b/src/app/resources/resources.module.ts @@ -4,6 +4,7 @@ import {RouterModule} from "@angular/router"; import {ResourcesComponent} from "./resources.component"; import {BreadcrumbsModule} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.module"; +import {Schema2jsonldModule} from '../openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module'; @NgModule({ imports: [ @@ -11,7 +12,8 @@ import {BreadcrumbsModule} from "../openaireLibrary/utils/breadcrumbs/breadcrumb RouterModule.forChild([{ path: '', component: ResourcesComponent }]), - BreadcrumbsModule + BreadcrumbsModule, + Schema2jsonldModule ], declarations: [ResourcesComponent], exports: [ResourcesComponent] diff --git a/src/environments/environment.beta.ts b/src/environments/environment.beta.ts index 2da4971..f3c79dc 100644 --- a/src/environments/environment.beta.ts +++ b/src/environments/environment.beta.ts @@ -2,6 +2,11 @@ import {EnvProperties} from '../app/openaireLibrary/utils/properties/env-propert export let properties: EnvProperties = { environment: "beta", + domain : "https://graph.openaire.eu", + baseLink: "", + enablePiwikTrack: false, + piwikBaseUrl: "https://analytics.openaire.eu/piwik.php?idsite=", + piwikSiteId: "", searchAPIURLLAst: "https://beta.services.openaire.eu/search/v2/api/", adminToolsAPIURL: "https://beta.services.openaire.eu/uoa-admin-tools/", admins: ["graph@openaire.eu"], diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 5f6feec..e10d89d 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -2,6 +2,11 @@ import {EnvProperties} from '../app/openaireLibrary/utils/properties/env-propert export let properties: EnvProperties = { environment: "production", + domain : "https://graph.openaire.eu", + baseLink: "", + enablePiwikTrack: true, + piwikBaseUrl: "https://analytics.openaire.eu/piwik.php?idsite=", + piwikSiteId: "", searchAPIURLLAst: "https://services.openaire.eu/search/v2/api/", adminToolsAPIURL:"https://services.openaire.eu/uoa-admin-tools/", admins: ["graph@openaire.eu"], diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 90c5a10..579ab2d 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -7,6 +7,11 @@ import {EnvProperties} from "../app/openaireLibrary/utils/properties/env-propert export let properties: EnvProperties = { environment: "development", + domain : "https://graph.openaire.eu", + baseLink: "", + enablePiwikTrack: false, + piwikBaseUrl: "https://analytics.openaire.eu/piwik.php?idsite=", + piwikSiteId: "", searchAPIURLLAst: "https://beta.services.openaire.eu/search/v2/api/", adminToolsAPIURL: 'http://duffy.di.uoa.gr:8080/uoa-admin-tools/', admins: ["kostis30fylloy@gmail.com"], diff --git a/src/index.html b/src/index.html index 5bb9919..164bb6d 100644 --- a/src/index.html +++ b/src/index.html @@ -7,6 +7,7 @@ OpenAIRE - Research Graph + diff --git a/src/index.prod.html b/src/index.prod.html index b6c9cd0..de56254 100644 --- a/src/index.prod.html +++ b/src/index.prod.html @@ -7,6 +7,7 @@ OpenAIRE - Research Graph + diff --git a/src/robots.prod.txt b/src/robots.prod.txt new file mode 100644 index 0000000..33adb13 --- /dev/null +++ b/src/robots.prod.txt @@ -0,0 +1,4 @@ +User-Agent: * +Crawl-delay: 30 + +sitemap: https://graph.openaire.eu/sitemap.xml diff --git a/src/robots.txt b/src/robots.txt new file mode 100644 index 0000000..a9da171 --- /dev/null +++ b/src/robots.txt @@ -0,0 +1,2 @@ +sitemap.xmlUser-Agent: * +Disallow: / diff --git a/src/sitemap.xml b/src/sitemap.xml new file mode 100644 index 0000000..cbf9427 --- /dev/null +++ b/src/sitemap.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +