From ff86fb98f165fd10c0245a3f7028321b999efe37 Mon Sep 17 00:00:00 2001 From: "k.triantafyllou" Date: Mon, 8 Apr 2024 18:41:49 +0300 Subject: [PATCH] [master | DONE]: Add buttons for manage and sandbox in all monitors and align sandbox guard to include members also. --- src/app/national/national.component.ts | 37 +++++++++++- src/app/repository/repository.component.ts | 49 ++++++++++++--- src/app/rfo/rfo.component.ts | 37 +++++++++++- src/app/rpo/rpo.component.ts | 38 +++++++++++- src/app/shared/sandbox.guard.ts | 69 +++++++++++++++------- src/assets/extend-theme/less/banner.less | 1 + 6 files changed, 200 insertions(+), 31 deletions(-) diff --git a/src/app/national/national.component.ts b/src/app/national/national.component.ts index a468b6d..30c47a5 100644 --- a/src/app/national/national.component.ts +++ b/src/app/national/national.component.ts @@ -14,6 +14,9 @@ import {OpenaireEntities} from "../openaireLibrary/utils/properties/searchFields import {RouterHelper} from "../openaireLibrary/utils/routerHelper.class"; import {StringUtils} from "../openaireLibrary/utils/string-utils.class"; import {ConfigurationService} from "../openaireLibrary/utils/configuration/configuration.service"; +import {Session} from "../openaireLibrary/login/utils/helper.class"; +import {properties as beta} from "../../environments/environment.beta"; +import {UserManagementService} from "../openaireLibrary/services/user-management.service"; @Component({ selector: 'national', @@ -32,7 +35,7 @@ import {ConfigurationService} from "../openaireLibrary/utils/configuration/confi @@ -60,10 +71,12 @@ import {ConfigurationService} from "../openaireLibrary/utils/configuration/confi export class NationalComponent extends StakeholderBaseComponent implements OnInit { stakeholder: Stakeholder; loading: boolean = true; + isMobile: boolean = false; isSearch: boolean = false; openaireEntities = OpenaireEntities; constructor(private stakeholderService: StakeholderService, + private userManagementService: UserManagementService, private layoutService: LayoutService, protected _router: Router, protected _route: ActivatedRoute, @@ -81,6 +94,9 @@ export class NationalComponent extends StakeholderBaseComponent implements OnIni ngOnInit() { this.layoutService.setRootClass('country'); + this.subscriptions.push(this.layoutService.isMobile.subscribe(isMobile => { + this.isMobile = isMobile; + })); this.stakeholderService.getStakeholder(this._route.snapshot.data.stakeholder).subscribe(stakeholder => { this.stakeholder = stakeholder; if(this.stakeholder) { @@ -98,4 +114,23 @@ export class NationalComponent extends StakeholderBaseComponent implements OnIni super.ngOnDestroy(); this.layoutService.setRootClass(null); } + + get isManager() { + return Session.isPortalAdministrator(this.userManagementService.user) || + Session.isCurator(this.stakeholder.type, this.userManagementService.user) || + Session.isManager(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get isMember() { + return this.isManager || + Session.isMember(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get adminLink() { + return "/admin/" + this.stakeholder.alias; + } + + get sandboxLink() { + return beta.domain + '/national/'; + } } diff --git a/src/app/repository/repository.component.ts b/src/app/repository/repository.component.ts index f748bd1..cd102e3 100644 --- a/src/app/repository/repository.component.ts +++ b/src/app/repository/repository.component.ts @@ -15,6 +15,9 @@ import {SearchDataprovidersService} from "../openaireLibrary/services/searchData import {UserManagementService} from "../openaireLibrary/services/user-management.service"; import {ConfigurationService} from "../openaireLibrary/utils/configuration/configuration.service"; import {Irish} from "../shared/irish"; +import {Session} from "../openaireLibrary/login/utils/helper.class"; +import {properties as beta} from "../../environments/environment.beta"; + @Component({ selector: 'repository', @@ -44,7 +47,7 @@ import {Irish} from "../shared/irish";
- @@ -104,6 +113,7 @@ export class RepositoryComponent extends StakeholderBaseComponent implements OnI stakeholder: Stakeholder; alias: string; isSearch: boolean = false; + isMobile: boolean = false; loading: boolean = false; openaireEntities = OpenaireEntities; isProvideManager: boolean; @@ -131,6 +141,9 @@ export class RepositoryComponent extends StakeholderBaseComponent implements OnI this.title = 'Repository Monitors'; this.description = 'Repository Monitors'; this.setMetadata(); + this.subscriptions.push(this.layoutService.isMobile.subscribe(isMobile => { + this.isMobile = isMobile; + })); this.params.subscribe(params => { this.alias = params['stakeholder']; if (this.alias) { @@ -154,6 +167,9 @@ export class RepositoryComponent extends StakeholderBaseComponent implements OnI this.isProvideManager = !!user.role.find(role => role.includes(this.stakeholder.details.originalId.toUpperCase())); })); this.loading = false; + }, error => { + this.stakeholder.details = null; + this.loading = false; })); } else { this.navigateToError(); @@ -167,6 +183,25 @@ export class RepositoryComponent extends StakeholderBaseComponent implements OnI }); } + get isManager() { + return Session.isPortalAdministrator(this.userManagementService.user) || + Session.isCurator(this.stakeholder.type, this.userManagementService.user) || + Session.isManager(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get isMember() { + return this.isManager || + Session.isMember(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get adminLink() { + return "/admin/" + this.stakeholder.alias; + } + + get sandboxLink() { + return beta.domain + '/repository/' + this.stakeholder.alias; + } + get provideLink() { if(this.stakeholder?.details?.originalId) { return 'https://' + (this.properties.environment != 'production'?'beta.':'') + 'provide.openaire.eu/repository/' + this.stakeholder.details.originalId + '/dashboard'; diff --git a/src/app/rfo/rfo.component.ts b/src/app/rfo/rfo.component.ts index ddd2061..e4f5c0a 100644 --- a/src/app/rfo/rfo.component.ts +++ b/src/app/rfo/rfo.component.ts @@ -13,6 +13,9 @@ import {LayoutService} from "../openaireLibrary/dashboard/sharedComponents/sideb import {OpenaireEntities} from "../openaireLibrary/utils/properties/searchFields"; import {ConfigurationService} from "../openaireLibrary/utils/configuration/configuration.service"; import {Irish} from "../shared/irish"; +import {UserManagementService} from "../openaireLibrary/services/user-management.service"; +import {Session} from "../openaireLibrary/login/utils/helper.class"; +import {properties as beta} from "../../environments/environment.beta"; @Component({ selector: 'rfo', @@ -45,7 +48,7 @@ import {Irish} from "../shared/irish";
@@ -71,10 +82,12 @@ export class RfoComponent extends StakeholderBaseComponent implements OnInit { stakeholder: Stakeholder; alias: string; isSearch: boolean = false; + isMobile: boolean = false; loading: boolean = false; openaireEntities = OpenaireEntities; constructor(private stakeholderService: StakeholderService, + private userManagementService: UserManagementService, private layoutService: LayoutService, private _customFilterService: CustomFilterService, protected _router: Router, @@ -96,6 +109,9 @@ export class RfoComponent extends StakeholderBaseComponent implements OnInit { this.title = 'RFOs'; this.description = 'RFOs'; this.setMetadata(); + this.subscriptions.push(this.layoutService.isMobile.subscribe(isMobile => { + this.isMobile = isMobile; + })); this.params.subscribe(params => { this.alias = params['stakeholder']; if (this.alias) { @@ -131,4 +147,23 @@ export class RfoComponent extends StakeholderBaseComponent implements OnInit { this.layoutService.setRootClass(null); this.setProperties(Irish.irishAdminToolsCommunity, Irish.irishAdminToolsPortalType, this.configurationService); } + + get isManager() { + return Session.isPortalAdministrator(this.userManagementService.user) || + Session.isCurator(this.stakeholder.type, this.userManagementService.user) || + Session.isManager(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get isMember() { + return this.isManager || + Session.isMember(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get adminLink() { + return "/admin/" + this.stakeholder.alias; + } + + get sandboxLink() { + return beta.domain + '/rfo/' + this.stakeholder.alias; + } } diff --git a/src/app/rpo/rpo.component.ts b/src/app/rpo/rpo.component.ts index a42e90e..0e5f0c3 100644 --- a/src/app/rpo/rpo.component.ts +++ b/src/app/rpo/rpo.component.ts @@ -13,7 +13,9 @@ import {LayoutService} from "../openaireLibrary/dashboard/sharedComponents/sideb import {OpenaireEntities} from "../openaireLibrary/utils/properties/searchFields"; import {ConfigurationService} from "../openaireLibrary/utils/configuration/configuration.service"; import {Irish} from "../shared/irish"; -import {Role} from "../openaireLibrary/login/utils/helper.class"; +import {Role, Session} from "../openaireLibrary/login/utils/helper.class"; +import {properties as beta} from "../../environments/environment.beta"; +import {UserManagementService} from "../openaireLibrary/services/user-management.service"; @Component({ selector: 'rpo', @@ -46,7 +48,7 @@ import {Role} from "../openaireLibrary/login/utils/helper.class"; @@ -71,12 +81,14 @@ import {Role} from "../openaireLibrary/login/utils/helper.class"; export class RpoComponent extends StakeholderBaseComponent implements OnInit { stakeholder: Stakeholder; alias: string; + isMobile: boolean = false; isSearch: boolean = false; loading: boolean = false; openaireEntities = OpenaireEntities; constructor(private stakeholderService: StakeholderService, private _customFilterService: CustomFilterService, + private userManagementService: UserManagementService, private layoutService: LayoutService, protected _router: Router, protected _route: ActivatedRoute, @@ -97,6 +109,9 @@ export class RpoComponent extends StakeholderBaseComponent implements OnInit { this.title = 'RPOs'; this.description = 'RPOs'; this.setMetadata(); + this.subscriptions.push(this.layoutService.isMobile.subscribe(isMobile => { + this.isMobile = isMobile; + })); this.params.subscribe(params => { this.alias = params['stakeholder']; if (this.alias) { @@ -133,6 +148,25 @@ export class RpoComponent extends StakeholderBaseComponent implements OnInit { this.layoutService.setRootClass(null); this.setProperties(Irish.irishAdminToolsCommunity, Irish.irishAdminToolsPortalType, this.configurationService); } + + get isManager() { + return Session.isPortalAdministrator(this.userManagementService.user) || + Session.isCurator(this.stakeholder.type, this.userManagementService.user) || + Session.isManager(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get isMember() { + return this.isManager || + Session.isMember(this.stakeholder.type, this.stakeholder.alias, this.userManagementService.user); + } + + get adminLink() { + return "/admin/" + this.stakeholder.alias; + } + + get sandboxLink() { + return beta.domain + '/rpo/' + this.stakeholder.alias; + } } diff --git a/src/app/shared/sandbox.guard.ts b/src/app/shared/sandbox.guard.ts index 31bc8d3..93c8741 100644 --- a/src/app/shared/sandbox.guard.ts +++ b/src/app/shared/sandbox.guard.ts @@ -1,35 +1,64 @@ import {AdminDashboardGuard} from "../openaireLibrary/monitor-admin/utils/adminDashboard.guard"; import {Injectable} from "@angular/core"; -import {ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree} from "@angular/router"; -import {Observable} from "rxjs"; +import {ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree} from "@angular/router"; +import {Observable, zip} from "rxjs"; import {properties} from "../../environments/environment"; import {LoginErrorCodes} from "../openaireLibrary/login/utils/guardHelper.class"; -import {map, tap} from "rxjs/operators"; +import {map, take, tap} from "rxjs/operators"; import {Session} from "../openaireLibrary/login/utils/helper.class"; +import {UserManagementService} from "../openaireLibrary/services/user-management.service"; +import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service"; @Injectable({ providedIn: 'root' }) -export class SandboxGuard extends AdminDashboardGuard { +export class SandboxGuard { + + constructor(private userManagementService: UserManagementService, + private stakeholderService: StakeholderService, + private router: Router) { + } canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { - let sandbox = properties.environment === 'beta'; - if(childRoute.data['researcher'] && childRoute.params.stakeholder && sandbox) { - let errorCode = LoginErrorCodes.NOT_LOGIN; - let alias = childRoute.params.stakeholder; - return this.userManagementService.getUserInfo().pipe(map(user => { - if(user) { - errorCode = LoginErrorCodes.NOT_ADMIN; - } - return user && (Session.isPortalAdministrator(user) || - Session.isCurator('researcher', user) || user?.orcid === alias); - }), tap(authorized => { - if(!authorized){ - this.router.navigate(['/user-info'], {queryParams: {'errorCode': errorCode, 'redirectUrl':state.url}}); - } - })); + let sandbox = properties.environment === 'development'; + if (childRoute.data['researcher'] && childRoute.params.stakeholder && sandbox) { + return this.checkResearcher(state.url, childRoute.params.stakeholder); } else { - return !sandbox || super.canActivateChild(childRoute, state); + return !sandbox || this.check(state.url, childRoute.data?.stakeholder?childRoute.data.stakeholder:childRoute.params.stakeholder); } } + + checkResearcher(path: string, alias: string) { + let errorCode = LoginErrorCodes.NOT_LOGIN; + return this.userManagementService.getUserInfo().pipe(map(user => { + if (user) { + errorCode = LoginErrorCodes.NOT_ADMIN; + } + return user && (Session.isPortalAdministrator(user) || + Session.isCurator('researcher', user) || user?.orcid === alias); + }), tap(authorized => { + if (!authorized) { + this.router.navigate(['/user-info'], {queryParams: {'errorCode': errorCode, 'redirectUrl': path}}); + } + })); + } + + check(path: string, alias: string): Observable | boolean { + let errorCode = LoginErrorCodes.NOT_LOGIN; + return zip( + this.userManagementService.getUserInfo(), this.stakeholderService.getStakeholder(alias) + ).pipe(take(1), map(res => { + if (res[0]) { + errorCode = LoginErrorCodes.NOT_ADMIN; + } + return res[0] && res[1] && (Session.isPortalAdministrator(res[0]) || + Session.isCurator(res[1].type, res[0]) || + Session.isManager(res[1].type, res[1].alias, res[0]) || + Session.isMember(res[1].type, res[1].alias, res[0])) + }), tap(authorized => { + if (!authorized) { + this.router.navigate(['/user-info'], {queryParams: {'errorCode': errorCode, 'redirectUrl': path}}); + } + })); + } } diff --git a/src/assets/extend-theme/less/banner.less b/src/assets/extend-theme/less/banner.less index 74928d6..be10413 100644 --- a/src/assets/extend-theme/less/banner.less +++ b/src/assets/extend-theme/less/banner.less @@ -80,6 +80,7 @@ } & .uk-button { + height: 100%; background: @banner-tab-button-background; border-radius: @banner-tab-button-border-radius;