[SI-793] change button visibility depending on the status

Signed-off-by: dtheinert <dietmar.theinert@pta.de>
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.spec.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.spec.ts
index 29c5373..9c04854 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.spec.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.spec.ts
@@ -84,11 +84,4 @@
     const result: Date = (component as any)._createDateTime(event);
     expect(expectedResult.toISOString).toBe(result.toISOString);
   });
-
-  it('should call the "FailureDetailsSandbox.setState(..)" event 1 times', ()=>{
-    //fixture = TestBed.createComponent(GridFailureDetailsComponent);
-    // let comp = fixture.componentInstance;
-    // fixture.detectChanges();
-    // let onClickSpy = spyOn(comp, '')
-  });
 });
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts
index ed8179d..137a49c 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.ts
@@ -445,21 +445,15 @@
 
     switch (state) {
       case StateEnum.NEW:
+      case StateEnum.PLANNED:
         this.showCreatedButton = true;
+        break;
       case StateEnum.CREATED:
       case StateEnum.UPDATED:
         this.showQualifyButton = true;
         this.showStornoButton = true;
         break;
-      case StateEnum.PLANNED:
-        this.showQualifyButton = true;
-        this.showStornoButton = true;
-        this.showCreatedButton = true;
-        break;
       default:
-        this.showQualifyButton = false;
-        this.showStornoButton = false;
-        this.showCreatedButton = false;
         break;
     }
   }
diff --git a/projects/grid-failure-information-app/src/app/shared/constants/enums.ts b/projects/grid-failure-information-app/src/app/shared/constants/enums.ts
index eb44b37..5c00023 100644
--- a/projects/grid-failure-information-app/src/app/shared/constants/enums.ts
+++ b/projects/grid-failure-information-app/src/app/shared/constants/enums.ts
@@ -50,6 +50,7 @@
   CREATOR = 'grid-failure-creator',
   PUBLISHER = 'grid-failure-publisher',
   QUALIFIER = 'grid-failure-qualifier',
+  READER = 'grid-failure-reader'
 }
 
 export enum StateEnum {
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.spec.ts b/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.spec.ts
index 06af55b..b3035b0 100644
--- a/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.spec.ts
+++ b/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.spec.ts
@@ -68,20 +68,15 @@
       map: () => of({ creator: false, publisher: false, admin: false, qualifier: true }),
     };
     const directive = new VisibleByRightDirective(templateRef as any, viewContainerRef as any, appState as any);
-    directive.visibleByRight = RolesEnum.QUALIFIER;
+    directive.visibleByRight = [RolesEnum.QUALIFIER];
     const spy = spyOn(directive['_viewContainer'], 'createEmbeddedView' as any);
     directive.ngOnInit();
     expect(spy).toHaveBeenCalled();
   });
 
-  it('should clear view for another role than admin or qualifier', () => {
-    appState = {
-      pipe: () => of(),
-      dispatch: () => {},
-      select: () => of({ roles: [RolesEnum.PUBLISHER] }),
-      map: () => of({ creator: false, publisher: true, admin: false, qualifier: false }),
-    };
+  it('should clear view for invalidRole', () => {
     const directive = new VisibleByRightDirective(templateRef as any, viewContainerRef as any, appState as any);
+    directive.visibleByRight = ["_InvalidRole_"];
     const spy = spyOn(directive['_viewContainer'], 'clear' as any);
     directive.ngOnInit();
     expect(spy).toHaveBeenCalled();
@@ -89,9 +84,8 @@
 
   it('should create embedded view for role creator', () => {
     // Arrange
-    //appState.map = () => of({creator: false, publisher: true, admin: false, qualifier: false});
     const directive = new VisibleByRightDirective(templateRef as any, viewContainerRef as any, appState as any);
-    directive.visibleByRight = RolesEnum.CREATOR;
+    directive.visibleByRight = [RolesEnum.CREATOR];
     const spy = spyOn(directive['_viewContainer'], 'createEmbeddedView' as any);
     // Act
     directive.ngOnInit();
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.ts b/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.ts
index 8c7a493..4b21a32 100644
--- a/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.ts
+++ b/projects/grid-failure-information-app/src/app/shared/directives/visible-by-right.ts
@@ -23,7 +23,9 @@
   selector: '[visibleByRight]',
 })
 export class VisibleByRightDirective implements OnInit, OnDestroy {
-  @Input() visibleByRight?: string = '';
+
+  @Input() visibleByRight?: string[];
+
   private _endSubscriptions$: Subject<boolean> = new Subject();
   private _permissions$: Observable<PermissionsModel> = this._appState$
     .select(store.getUser)
@@ -34,11 +36,11 @@
 
   ngOnInit() {
     this._permissions$.subscribe(permissions => {
-      if (
-        permissions.admin ||
-        (permissions.creator && this.visibleByRight === RolesEnum.CREATOR) ||
-        (permissions.qualifier && this.visibleByRight === RolesEnum.QUALIFIER)
-      ) {
+        if (permissions.admin
+          || this.visibleByRight.includes(permissions.qualifier)
+          || this.visibleByRight.includes(permissions.publisher)
+          || this.visibleByRight.includes(permissions.creator)
+          || this.visibleByRight.includes(permissions.reader)){
         this._viewContainer.createEmbeddedView(this._templateRef);
       } else {
         this._viewContainer.clear();
diff --git a/projects/grid-failure-information-app/src/app/shared/guards/admin.guard.ts b/projects/grid-failure-information-app/src/app/shared/guards/admin.guard.ts
index 7b71527..8a5e441 100644
--- a/projects/grid-failure-information-app/src/app/shared/guards/admin.guard.ts
+++ b/projects/grid-failure-information-app/src/app/shared/guards/admin.guard.ts
@@ -18,6 +18,7 @@
 import { User } from '@grid-failure-information-app/shared/models/user';
 import { PermissionsModel } from '@grid-failure-information-app/shared/models/permissions.model';
 import { takeUntil, take } from 'rxjs/operators';
+import { RolesEnum } from '../constants/enums';
 
 @Injectable()
 export class AdminGuard implements CanActivate {
@@ -32,7 +33,7 @@
     const isAdmin$: Observable<boolean> = this._appState$
       .select(store.getUser)
       .pipe(takeUntil(this._endSubscriptions$), take(1))
-      .map((user: User) => new PermissionsModel(user.roles).admin);
+      .map((user: User) => !!(new PermissionsModel(user.roles).admin));
     isAdmin$.subscribe(isAdmin => !isAdmin && this._router.navigate(['/grid-failures']));
     return isAdmin$.pipe(take(1));
   }
diff --git a/projects/grid-failure-information-app/src/app/shared/models/permissions.model.ts b/projects/grid-failure-information-app/src/app/shared/models/permissions.model.ts
index b7cbcc2..fd8ba48 100644
--- a/projects/grid-failure-information-app/src/app/shared/models/permissions.model.ts
+++ b/projects/grid-failure-information-app/src/app/shared/models/permissions.model.ts
@@ -13,10 +13,11 @@
 import { RolesEnum } from '@grid-failure-information-app/shared/constants/enums';
 
 export class PermissionsModel {
-  public admin: boolean = false;
-  public creator: boolean = false;
-  public publisher: boolean = false;
-  public qualifier: boolean = false;
+  public admin: RolesEnum;
+  public creator: RolesEnum;
+  public publisher: RolesEnum;
+  public qualifier: RolesEnum;
+  public reader: RolesEnum;
 
   /**
    *Creates an instance of PermissionsModel.
@@ -28,17 +29,20 @@
       data.forEach((permissionItem: string) => {
         switch (permissionItem) {
           case RolesEnum.ADMIN:
-            this.admin = true;
+            this.admin = RolesEnum.ADMIN;
             break;
           case RolesEnum.CREATOR:
-            this.creator = true;
+            this.creator = RolesEnum.CREATOR;
             break;
           case RolesEnum.PUBLISHER:
-            this.publisher = true;
+            this.publisher = RolesEnum.PUBLISHER;
             break;
           case RolesEnum.QUALIFIER:
-            this.qualifier = true;
+            this.qualifier =RolesEnum.QUALIFIER;
             break;
+          case RolesEnum.READER:
+              this.reader = RolesEnum.READER;
+              break;
           default:
             break;
         }