diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index c8351c9..86700d5 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -17,6 +17,9 @@ const routes: Routes = [ path: 'contact-us', loadChildren: () => import('./contact/contact.module').then(m => m.ContactModule) }, + { + path: 'my-dashboards', + loadChildren: () => import('./my-stakeholders/my-stakeholders.module').then(m => m.MyStakeholdersModule)}, { path: 'reload', loadChildren: () => import('./reload/libReload.module').then(m => m.LibReloadModule) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index d1cc0b4..6176d41 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -77,6 +77,7 @@ export class AppComponent { } ngOnInit() { + this.userManagementService.fixRedirectURL = properties.afterLoginRedirectLink; this.subscriptions.push(this.userManagementService.getUserInfo().subscribe(user => { this.user = user; this.setUserMenu(); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2150431..3f884ce 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -8,7 +8,6 @@ import {AppComponent} from './app.component'; import {OpenaireErrorPageComponent} from './error/errorPage.component'; import {AppRoutingModule} from './app-routing.module'; -import {SharedModule} from './shared/shared.module'; import {CookieLawModule} from './openaireLibrary/sharedComponents/cookie-law/cookie-law.module'; import {BottomModule} from './openaireLibrary/sharedComponents/bottom.module'; import {ErrorModule} from './openaireLibrary/error/error.module'; @@ -17,6 +16,7 @@ import {DEFAULT_TIMEOUT, TimeoutInterceptor} from "./openaireLibrary/timeout-int import {Schema2jsonldModule} from "./openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module"; import {HttpInterceptorService} from "./openaireLibrary/http-interceptor.service"; import {ErrorInterceptorService} from "./openaireLibrary/error-interceptor.service"; +import {SharedModule} from "./openaireLibrary/shared/shared.module"; @NgModule({ diff --git a/src/app/browse-stakeholder/browse-stakeholder.component.html b/src/app/browse-stakeholder/browse-stakeholder.component.html new file mode 100644 index 0000000..ae2ab0b --- /dev/null +++ b/src/app/browse-stakeholder/browse-stakeholder.component.html @@ -0,0 +1,42 @@ + + + + + + + +
+
+ + {{stakeholder.visibility.toLowerCase()}} +
+
+
+ {{(community.title)?community.title:community.shortTitle}} logo +
+
+
+ +
+
+
+ + +
+ You will be navigated to a new tab. Are you sure that you want to proceed? +
+
diff --git a/src/app/browse-stakeholder/browse-stakeholder.component.ts b/src/app/browse-stakeholder/browse-stakeholder.component.ts new file mode 100644 index 0000000..5ba588d --- /dev/null +++ b/src/app/browse-stakeholder/browse-stakeholder.component.ts @@ -0,0 +1,88 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Location} from '@angular/common'; +import {Stakeholder, StakeholderInfo, Visibility} from "../openaireLibrary/monitor/entities/stakeholder"; +import {EnvProperties} from "../openaireLibrary/utils/properties/env-properties"; +import {properties} from "../../environments/environment" +import {LocalStorageService} from "../openaireLibrary/services/localStorage.service"; +import {Subscriber} from "rxjs"; + +@Component({ + selector: 'browse-stakeholder', + templateUrl: 'browse-stakeholder.component.html' +}) +export class BrowseStakeholderComponent { + @Input() public stakeholder: StakeholderInfo = null; + @Input() public showDescription: boolean = true; + @Input() public smallTitle: boolean = false; + @ViewChild('AlertModal', { static: true }) modal; + public thresholdTitle: number = 45; + public properties: EnvProperties = properties; + public directLink: boolean = true; + public visibilityIcon: Map = new Map ([ + ["PRIVATE", 'incognito'], + ["RESTRICTED", 'group'] + ]); + private subscriptions: any[] = []; + + constructor(private route: ActivatedRoute, + private router: Router, + private location: Location, + private localStorageService: LocalStorageService) { + } + + + public ngOnInit() { + this.properties = properties; + this.subscriptions.push(this.localStorageService.get().subscribe(value => { + this.directLink = value; + })); + + } + ngOnDestroy() { + this.subscriptions.forEach(subscription => { + if (subscription instanceof Subscriber) { + subscription.unsubscribe(); + } + }); + } + + + isProduction(): boolean { + return this.properties.environment != "development"; + } + + getProductionPrefix(id:string): string { + return (this.properties.environment == "production") ? "" : "beta."; + } + + public confirmModalOpen() { + this.modal.cancelButton = true; + this.modal.okButton = true; + this.modal.alertTitle = 'You are going to visit ' + this.stakeholder.name + ' Monitor Dashboard'; + this.modal.alertMessage = false; + this.modal.okButtonLeft = false; + this.modal.okButtonText = 'Yes'; + this.modal.cancelButtonText = 'No'; + this.modal.choice = true; + this.modal.open(); + } + + public getStakeholderPageUrl() { + return this.properties.domain + this.properties.baseLink + '/dashboard/' + this.stakeholder.alias; + } + + hasPermission() { + return this.stakeholder.visibility === "PUBLIC" || + (this.stakeholder.visibility === "RESTRICTED" && (this.stakeholder.isManager || this.stakeholder.isMember)) || + (this.stakeholder.visibility === "PRIVATE" && this.stakeholder.isManager); + } + + public goToPage(data: any) { + if (data.value == true) { + let url = this.getStakeholderPageUrl(); + this.localStorageService.setCommunityDirectLink(data.choice); + window.open(url, '_blank'); + } + } +} diff --git a/src/app/browse-stakeholder/browse-stakeholder.module.ts b/src/app/browse-stakeholder/browse-stakeholder.module.ts new file mode 100644 index 0000000..ff9ba32 --- /dev/null +++ b/src/app/browse-stakeholder/browse-stakeholder.module.ts @@ -0,0 +1,26 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormsModule} from '@angular/forms'; +import {RouterModule} from '@angular/router'; +import {AlertModalModule} from "../openaireLibrary/utils/modal/alertModal.module"; +import {UrlPrefixModule} from "../openaireLibrary/utils/pipes/url-prefix.module"; +import {ManageModule} from "../openaireLibrary/utils/manage/manage.module"; +import {LogoUrlPipeModule} from "../openaireLibrary/utils/pipes/logoUrlPipe.module"; +import {IconsModule} from "../openaireLibrary/utils/icons/icons.module"; +import {BrowseStakeholderComponent} from "./browse-stakeholder.component"; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, + ManageModule, AlertModalModule, UrlPrefixModule, LogoUrlPipeModule, IconsModule + ], + declarations: [ + BrowseStakeholderComponent + ], + providers:[ + ], + exports: [ + BrowseStakeholderComponent + ] +}) +export class BrowseStakeholderModule { } diff --git a/src/app/my-stakeholders/my-stakeholders-routing.module.ts b/src/app/my-stakeholders/my-stakeholders-routing.module.ts new file mode 100644 index 0000000..84dedeb --- /dev/null +++ b/src/app/my-stakeholders/my-stakeholders-routing.module.ts @@ -0,0 +1,16 @@ +import {NgModule} from '@angular/core'; +import {RouterModule} from '@angular/router'; +import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard'; +import {LoginGuard} from "../openaireLibrary/login/loginGuard.guard"; +import {MyStakeholdersComponent} from "./my-stakeholders.component"; + +@NgModule({ + imports: [ + RouterModule.forChild([ + {path: '', component: MyStakeholdersComponent, canActivate: [LoginGuard], canDeactivate: [PreviousRouteRecorder]} + + ]) + ] +}) +export class MyStakeholdersRoutingModule { +} diff --git a/src/app/my-stakeholders/my-stakeholders.component.html b/src/app/my-stakeholders/my-stakeholders.component.html new file mode 100644 index 0000000..0dfeef6 --- /dev/null +++ b/src/app/my-stakeholders/my-stakeholders.component.html @@ -0,0 +1,102 @@ + + +
+
+
+ +
+
+ +
+
+
+
+

You are managing

+ +
+
+

You are member of

+
+
+
+
+
+ {{stakeholder.name}} +
+
+
+ +
+
+
+
+
+ {{stakeholder.name}} +
+
+
+ +
+
+
+
+
+
+
+
+ You are not yet member in any Dashboards.
+ Start by browsing and subscribing in those that you are interested in. +
+
+
+
+
+
+
+
+
diff --git a/src/app/my-stakeholders/my-stakeholders.component.ts b/src/app/my-stakeholders/my-stakeholders.component.ts new file mode 100644 index 0000000..4e219a1 --- /dev/null +++ b/src/app/my-stakeholders/my-stakeholders.component.ts @@ -0,0 +1,158 @@ +import {Component} from '@angular/core'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Meta, Title} from '@angular/platform-browser'; +import {EnvProperties} from '../openaireLibrary/utils/properties/env-properties'; + +import {PiwikService} from '../openaireLibrary/utils/piwik/piwik.service'; +import {User} from '../openaireLibrary/login/utils/helper.class'; +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 {UserManagementService} from "../openaireLibrary/services/user-management.service"; +import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component"; +import {properties} from "../../environments/environment"; +import {Subscriber} from "rxjs"; +import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service"; +import {StakeholderInfo} from "../openaireLibrary/monitor/entities/stakeholder"; + +@Component({ + selector: 'my-stakeholders', + templateUrl: 'my-stakeholders.component.html', +}) + +export class MyStakeholdersComponent { + public pageTitle = "OpenAIRE | My Dashboards"; + public description = "OpenAIRE - Monitor, A new era of monitoring research. Open data. Open methodologies | My managing and member of Dashboards"; + public stakeholders: StakeholderInfo[] = []; + public pageContents = null; + public divContents = null; + // Message variables + public status: number; + public loading: boolean = true; + public subscriberErrorMessage: string = ""; + public errorCodes: ErrorCodes; + private errorMessages: ErrorMessagesComponent; + public breadcrumbs: Breadcrumb[] = [{name: 'home', route: '/'}, {name: 'My Dashboards'}]; + public properties: EnvProperties = properties; + private user: User; + private subscriptions = []; + + constructor( + private route: ActivatedRoute, + private _router: Router, + private _meta: Meta, + private _title: Title, + private _piwikService: PiwikService, + private stakeholderService: StakeholderService, + private helper: HelperService, + private seoService: SEOService, + private userManagementService: UserManagementService) { + this._meta.updateTag({content: this.description}, "name='description'"); + this._meta.updateTag({content: this.description}, "property='og:description'"); + this._meta.updateTag({content: this.pageTitle}, "property='og:title'"); + this._title.setTitle(this.pageTitle); + this.errorCodes = new ErrorCodes(); + this.errorMessages = new ErrorMessagesComponent(); + this.status = this.errorCodes.LOADING; + } + + public ngOnInit() { + 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.subscriptions.push(this._piwikService.trackView(this.properties, "OpenAIRE Connect", this.properties.piwikSiteId).subscribe()); + } + this.subscriptions.push(this.userManagementService.getUserInfo().subscribe(user => { + this.user = user; + if (this.user) { + this.getStakeholders(); + } + //this.getDivContents(); + //this.getPageContents(); + })); + + } + + private getPageContents() { + this.subscriptions.push(this.helper.getPageHelpContents(this.properties, 'connect', this._router.url).subscribe(contents => { + this.pageContents = contents; + })); + } + + private getDivContents() { + this.subscriptions.push(this.helper.getDivHelpContents(this.properties, 'connect', this._router.url).subscribe(contents => { + this.divContents = contents; + })); + } + + get manager(): StakeholderInfo[] { + return (this.stakeholders)?this.stakeholders.filter(stakeholder => stakeholder.isManager):[]; + } + + get member(): StakeholderInfo[] { + return (this.stakeholders)?this.stakeholders.filter(stakeholder => stakeholder.isMember):[]; + } + + public getStakeholders() { + this.loading = true; + this.status = this.errorCodes.LOADING; + this.subscriberErrorMessage = ""; + this.stakeholders = []; + this.subscriptions.push(this.stakeholderService.getMyStakeholders(properties.monitorServiceAPIURL).subscribe( + stakeholders => { + this.stakeholders = StakeholderInfo.toStakeholderInfo(stakeholders, this.user); + this.sort(this.stakeholders); + this.loading = false; + }, + error => { + this.status = this.handleError("Error getting communities", error); + this.loading = false; + } + )); + } + + private sort(results: StakeholderInfo[]) { + results.sort((left, right): number => { + if (!right.updateDate || left.updateDate > right.updateDate) { + return -1; + } else if (!left.updateDate || left.updateDate < right.updateDate) { + return 1; + } else { + if (left.name > right.name) { + return 1; + } else if (left.name < right.name) { + return -1; + } else { + return 0; + } + } + }) + } + + public quote(param: string): string { + return StringUtils.quote(param); + } + + ngOnDestroy() { + this.subscriptions.forEach(subscription => { + if (subscription instanceof Subscriber) { + subscription.unsubscribe(); + } + }); + } + + private handleError(message: string, error): number { + let code = ""; + if (!error.status) { + code = error.code; + } else { + code = error.status; + } + console.error("Communities (component): " + message, error); + return this.errorMessages.getErrorCode(code); + } +} diff --git a/src/app/my-stakeholders/my-stakeholders.module.ts b/src/app/my-stakeholders/my-stakeholders.module.ts new file mode 100644 index 0000000..32fc009 --- /dev/null +++ b/src/app/my-stakeholders/my-stakeholders.module.ts @@ -0,0 +1,37 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormsModule} from '@angular/forms'; +import {RouterModule} from '@angular/router'; +import {ManageModule} from '../openaireLibrary/utils/manage/manage.module'; +import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard'; + +import {PiwikService} from '../openaireLibrary/utils/piwik/piwik.service'; +import {ErrorMessagesModule} from '../openaireLibrary/utils/errorMessages.module'; +import {Schema2jsonldModule} from "../openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module"; +import {SEOServiceModule} from "../openaireLibrary/sharedComponents/SEO/SEOService.module"; +import {LoginGuard} from "../openaireLibrary/login/loginGuard.guard"; +import {HelperModule} from "../openaireLibrary/utils/helper/helper.module"; +import {IsRouteEnabled} from "../openaireLibrary/error/isRouteEnabled.guard"; +import {BreadcrumbsModule} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.module"; +import {MyStakeholdersRoutingModule} from "./my-stakeholders-routing.module"; +import {MyStakeholdersComponent} from "./my-stakeholders.component"; +import {LoadingModule} from "../openaireLibrary/utils/loading/loading.module"; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, HelperModule, + ManageModule, ErrorMessagesModule, Schema2jsonldModule, SEOServiceModule, + MyStakeholdersRoutingModule, BreadcrumbsModule, LoadingModule + ], + declarations: [ + MyStakeholdersComponent + ], + providers: [ + LoginGuard, PreviousRouteRecorder, PiwikService + ], + exports: [ + MyStakeholdersComponent + ] +}) +export class MyStakeholdersModule { +} diff --git a/src/app/openaireLibrary b/src/app/openaireLibrary index 4e9981f..cf6ab4a 160000 --- a/src/app/openaireLibrary +++ b/src/app/openaireLibrary @@ -1 +1 @@ -Subproject commit 4e9981f24f2f9bc7ac0f49897e987a26528b82f8 +Subproject commit cf6ab4a03b4aea7a5c14f6c086e531642f5f1a27 diff --git a/src/app/search-stakeholders/search-stakeholders.component.ts b/src/app/search-stakeholders/search-stakeholders.component.ts index 90a032d..c2af9f9 100644 --- a/src/app/search-stakeholders/search-stakeholders.component.ts +++ b/src/app/search-stakeholders/search-stakeholders.component.ts @@ -177,6 +177,7 @@ export class SearchStakeholdersComponent { this.sort(); this.searchUtils.totalResults = this.results.length; this.filters = this.searchPage.prepareFiltersToShow(this.filters, this.searchUtils.totalResults); + console.log(this.filters); this.results = this.results.slice((this.searchUtils.page - 1) * this.searchUtils.size, (this.searchUtils.page * this.searchUtils.size)); this.searchUtils.status = this.errorCodes.DONE; if (this.searchUtils.totalResults == 0) { diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts deleted file mode 100644 index a5d38d7..0000000 --- a/src/app/shared/shared.module.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - - -const MODULES = [ - // Do NOT include UniversalModule, HttpModule, or JsonpModule here - CommonModule, - RouterModule, - FormsModule, - ReactiveFormsModule -]; - -const PIPES = [ - // put pipes here -]; - -const COMPONENTS = [ - // put shared components here -]; - - - -@NgModule({ - imports: [ - ...MODULES - ], - declarations: [ - ...PIPES, - ...COMPONENTS - ], - exports: [ - ...MODULES, - ...PIPES, - ...COMPONENTS - ] -}) -export class SharedModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: SharedModule, - }; - } -} diff --git a/src/environments/environment.beta.ts b/src/environments/environment.beta.ts index 48b3e97..a97e599 100644 --- a/src/environments/environment.beta.ts +++ b/src/environments/environment.beta.ts @@ -59,6 +59,7 @@ export let properties: EnvProperties = { resultsPerPage: 10, baseLink : "", domain : "https://beta.monitor.openaire.eu", + afterLoginRedirectLink: '/my-dashboards', searchLinkToResult: "/search/result?id=", searchLinkToPublication: "/search/publication?articleId=", searchLinkToProject: "/search/project?projectId=", diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 1de34a9..d35beb9 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -59,6 +59,7 @@ export let properties: EnvProperties = { resultsPerPage: 10, baseLink : "", domain : "https://monitor.openaire.eu", + afterLoginRedirectLink: '/my-dashboards', searchLinkToResult: "/search/result?id=", searchLinkToPublication: "/search/publication?articleId=", searchLinkToProject: "/search/project?projectId=", diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 66c3732..5479119 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -59,6 +59,7 @@ export let properties: EnvProperties = { resultsPerPage: 10, baseLink : "", domain : "http://dl170.madgik.di.uoa.gr/monitor", + afterLoginRedirectLink: '/my-dashboards', searchLinkToResult: "/search/result?id=", searchLinkToPublication: "/search/publication?articleId=", searchLinkToProject: "/search/project?projectId=",