From 9a3488144b62f677200356b1e8c87e6ca133ba77 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Tue, 29 Oct 2019 10:15:17 -0700 Subject: [PATCH] SHIBUI-1550 Filtered navigation actions by user role --- ui/src/app/admin/admin.component.ts | 8 +------- .../admin/container/action-required.component.ts | 7 +------ .../admin/container/admin-management.component.ts | 8 +------- ui/src/app/app.component.ts | 13 ++++++++++--- ui/src/app/core/model/action.ts | 1 + ui/src/app/core/reducer/index.ts | 2 ++ ui/src/app/metadata/metadata.module.ts | 4 ++-- 7 files changed, 18 insertions(+), 25 deletions(-) diff --git a/ui/src/app/admin/admin.component.ts b/ui/src/app/admin/admin.component.ts index 409503b6c..ae1469443 100644 --- a/ui/src/app/admin/admin.component.ts +++ b/ui/src/app/admin/admin.component.ts @@ -1,16 +1,10 @@ import { Component } from '@angular/core'; -import * as fromRoot from '../app.reducer'; -import { Store } from '@ngrx/store'; -import { LoadAdminRequest } from './action/admin-collection.action'; - @Component({ selector: 'admin-page', templateUrl: './admin.component.html', styleUrls: [] }) export class AdminComponent { - constructor( - private store: Store - ) {} + constructor() {} } diff --git a/ui/src/app/admin/container/action-required.component.ts b/ui/src/app/admin/container/action-required.component.ts index f504f36e4..7631c963b 100644 --- a/ui/src/app/admin/container/action-required.component.ts +++ b/ui/src/app/admin/container/action-required.component.ts @@ -1,7 +1,4 @@ import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import * as fromRoot from '../../app.reducer'; @Component({ selector: 'action-required-page', @@ -11,7 +8,5 @@ import * as fromRoot from '../../app.reducer'; }) export class ActionRequiredPageComponent { - constructor( - private store: Store - ) {} + constructor() {} } diff --git a/ui/src/app/admin/container/admin-management.component.ts b/ui/src/app/admin/container/admin-management.component.ts index fa657d5b5..b52211be4 100644 --- a/ui/src/app/admin/container/admin-management.component.ts +++ b/ui/src/app/admin/container/admin-management.component.ts @@ -1,8 +1,4 @@ import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import * as fromRoot from '../../app.reducer'; -import { LoadAdminRequest } from '../action/admin-collection.action'; @Component({ selector: 'admin-management-page', @@ -12,7 +8,5 @@ import { LoadAdminRequest } from '../action/admin-collection.action'; }) export class AdminManagementPageComponent { - constructor( - private store: Store - ) {} + constructor() {} } diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index 4554efce8..0f12387dd 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; -import { Observable, of } from 'rxjs'; -import { map, catchError } from 'rxjs/operators'; +import { Observable, of, combineLatest } from 'rxjs'; +import { map, catchError, filter } from 'rxjs/operators'; import { Store } from '@ngrx/store'; @@ -44,7 +44,14 @@ export class AppComponent implements OnInit { this.formatted$ = this.version$.pipe(map(this.formatter)); this.isAdmin$ = this.store.select(fromRoot.isCurrentUserAdmin); - this.nav$ = this.navService.emitter; + this.nav$ = combineLatest( + this.store.select(fromRoot.getCurrentUserRole).pipe(filter(r => !!r)), + this.navService.emitter + ).pipe( + map(([role, actions]) => actions.filter( + action => action.restrict ? action.restrict.includes(role) : action + ) + )); } ngOnInit(): void { diff --git a/ui/src/app/core/model/action.ts b/ui/src/app/core/model/action.ts index 2f7e1ca3c..49ad487aa 100644 --- a/ui/src/app/core/model/action.ts +++ b/ui/src/app/core/model/action.ts @@ -4,4 +4,5 @@ export interface NavigationAction { label: string; content: string; icon?: string; + restrict?: string[]; } diff --git a/ui/src/app/core/reducer/index.ts b/ui/src/app/core/reducer/index.ts index f5e5b94c2..bbe53eae6 100644 --- a/ui/src/app/core/reducer/index.ts +++ b/ui/src/app/core/reducer/index.ts @@ -46,4 +46,6 @@ export const getConfigState = createSelector(getCoreFeature, getConfigStateFn); export const getRoles = createSelector(getConfigState, fromConfig.getRoles); export const getUserRoles = createSelector(getRoles, filterRolesFn); +export const getCurrentUserRole = createSelector(getUser, u => u ? u.role : null); + export const isCurrentUserAdmin = createSelector(getUser, isUserAdminFn); diff --git a/ui/src/app/metadata/metadata.module.ts b/ui/src/app/metadata/metadata.module.ts index b116d3d34..3ae18c5bd 100644 --- a/ui/src/app/metadata/metadata.module.ts +++ b/ui/src/app/metadata/metadata.module.ts @@ -16,7 +16,6 @@ import { NavigationService } from '../core/service/navigation.service'; import { MetadataResolver } from './domain/model'; import { AddDraftRequest } from './resolver/action/draft.action'; import * as fromResolver from './resolver/reducer'; -import * as fromProvider from './provider/reducer'; import { Router } from '@angular/router'; @NgModule({ @@ -66,7 +65,8 @@ export class MetadataModule { this.router.navigate(['/metadata', 'provider', 'wizard']); }, category: 'metadata', - icon: 'fa-cubes' + icon: 'fa-cubes', + restrict: ['ROLE_ADMIN'] }); } }