Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.frontend into SI-566-config-detail

Signed-off-by: Peter Buschmann <peter.buschmann@pta.de>
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html
index 7b1cf09..504a3cb 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.html
@@ -149,7 +149,7 @@
           <label header>{{ 'GridFailure.GridFailureInformation' | translate }}</label>
           <div class="expandable-content" body>
             <!-- failureClassification -->
-            <div class="form-group row">
+            <div *ngIf="determineDetailFieldVisibility('failureClassification')" class="form-group row">
               <label for="failureClassification" class="col-sm-2 col-form-label">{{ 'GridFailure.FailureClassification' | translate }}</label>
               <div class="col-sm-4">
                 <select type="text" class="form-control" [ngrxFormControlState]="formState.controls['failureClassificationId']">
@@ -236,7 +236,7 @@
           <label header>{{ 'GridFailure.GridFailureIDetails' | translate }}</label>
           <div class="expandable-content" body>
             <!-- responsibility -->
-            <div class="form-group row">
+            <div *ngIf="determineDetailFieldVisibility('responsibility')" class="form-group row">
               <label for="responsibility" class="col-sm-2 col-form-label">{{ 'GridFailure.Responsibility' | translate }}</label>
               <div class="col-sm-4">
                 <input
@@ -354,7 +354,7 @@
             </div>
 
             <!-- description -->
-            <div class="form-group row">
+            <div *ngIf="determineDetailFieldVisibility('description')" class="form-group row">
               <label for="description" class="col-sm-2 col-form-label">{{ 'GridFailure.Description' | translate }}</label>
               <div class="col-sm-4">
                 <input
@@ -369,7 +369,7 @@
             </div>
 
             <!-- internalRemark -->
-            <div class="form-group row">
+            <div *ngIf="determineDetailFieldVisibility('internalRemark')" class="form-group row">
               <label for="internalRemark" class="col-sm-2 col-form-label">{{ 'GridFailure.InternalRemark' | translate }}</label>
               <div class="col-sm-4">
                 <input
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 7d2765a..32808e9 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
@@ -406,10 +406,26 @@
     component.setLocationRegionToMap();
     expect(spy).toHaveBeenCalled();
   });
+
   it('should not call setViewStateForReqProps() after setLocationRegionToMap() with same failureLocationView', () => {
     component.failureLocationView = Globals.FAILURE_LOCATION_MAP;
     const spy = spyOn(component, 'setViewStateForReqProps').and.callThrough();
     component.setLocationRegionToMap();
     expect(spy).not.toHaveBeenCalled();
   });
+
+  it('should return true for detailFieldVisibility in case no config is provided', () => {
+    component.visibilityConfiguration = null;
+    expect(component.determineDetailFieldVisibility('description')).toBeTruthy();
+  });
+
+  it('should return true for detailFieldVisibility if config provides "show" string for a specified form field', () => {
+    component.visibilityConfiguration = { fieldVisibility: { description: 'show' } as any } as any;
+    expect(component.determineDetailFieldVisibility('description')).toBeTruthy();
+  });
+
+  it('should return false for detailFieldVisibility if config does not provides "show" string for a specified form field', () => {
+    component.visibilityConfiguration = { fieldVisibility: { description: 'hide' } as any } as any;
+    expect(component.determineDetailFieldVisibility('description')).toBeFalsy();
+  });
 });
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts
index cb67509..da6d6f8 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.component.ts
@@ -26,6 +26,8 @@
 import { take, skipWhile, takeUntil, find, map } from 'rxjs/operators';
 import { unboxProperties } from '@grid-failure-information-app/shared/utility/form-utils';
 import { unbox } from 'ngrx-forms';
+import { VisibilityConfigurationInterface } from '@grid-failure-information-app/shared/interfaces/visibility-configuration.interface';
+import { determineDetailFieldVisibility } from '@grid-failure-information-app/shared/utility';
 
 @Component({
   selector: 'app-grid-failure-details',
@@ -56,6 +58,7 @@
   }
   public stationsColumnDefinition: any = STATION_COLDEF;
   public frameworkComponents: any;
+  public visibilityConfiguration: VisibilityConfigurationInterface;
 
   private _subscription: Subscription;
   private _modeEnum = ModeEnum;
@@ -70,7 +73,10 @@
     this.gridFailureDetailsSandbox.registerEvents();
     this._initialFailureLocationState();
     this.appState$.select(store.getPreConfiguration).subscribe(preConfig => {
-      this.mapOptions = new MapOptions(preConfig);
+      if (preConfig) {
+        this.mapOptions = new MapOptions(preConfig);
+        this.visibilityConfiguration = preConfig.visibilityConfiguration;
+      }
     });
     this.gridFailureDetailsSandbox.gridFailureDetailsFormState$.subscribe(formState => {
       this.gridOptions.context = {
@@ -182,6 +188,10 @@
     }
   }
 
+  public determineDetailFieldVisibility(field: string): boolean {
+    return determineDetailFieldVisibility(this.visibilityConfiguration, 'fieldVisibility', field);
+  }
+
   private _initialFailureLocationState() {
     this.failureLocationView = Globals.FAILURE_LOCATION_NS;
     this.setLocation();
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 a507cfb..95bc44c 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
@@ -50,8 +50,6 @@
 } from 'ngrx-forms';
 import { combineLatest, Observable } from 'rxjs';
 import { debounceTime, distinctUntilChanged, map, skipWhile, take, takeUntil, tap } from 'rxjs/operators';
-import { FailureStation, GridFailure } from '@grid-failure-information-app/shared/models';
-import { environment } from '@grid-failure-information-app/environments/environment';
 import { StateEnum } from '@grid-failure-information-app/shared/constants/enums';
 
 @Injectable()
@@ -134,7 +132,7 @@
   public showCompleteButton: boolean = false;
   public showDeleteButton: boolean = false;
   public gridFailureAddress: models.FailureAddress;
-  public gridFailureStations: FailureStation[] = [];
+  public gridFailureStations: models.FailureStation[] = [];
 
   public gridFailureDistributionGroups$: Observable<models.DistributionGroup[]> = this.appState$.select(store.getGridFailureDistributionGroupsData);
   public gridFailureDistributionGroupsLoading$: Observable<boolean> = this.appState$.select(store.getGridFailureDistributionGroupsLoading);
@@ -144,13 +142,14 @@
   public disablePublishButton: boolean;
   public oldVersion = false;
   public selectedPublicationChannels: Array<string>;
+  public branches: models.FailureBranch[];
+  public branch: models.FailureBranch;
 
   private _gridFailureId: string;
   private _selectedStation: models.FailureStation;
   private _stations: Array<models.FailureStation> = new Array<models.FailureStation>();
   private _assignedDistributionGroups: Array<models.DistributionGroup>;
-  public branches: models.FailureBranch[];
-  public branch: models.FailureBranch;
+
   constructor(
     protected appState$: Store<store.State>,
     protected actionsSubject: ActionsSubject,
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.spec.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.spec.ts
index 2584a18..8fb8236 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.spec.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.spec.ts
@@ -28,6 +28,7 @@
   let appState$: any;
   let _gridApi: any;
   let filterInstance: any;
+  let preConfig$: any;
 
   beforeEach(() => {
     router = { navigate() {} } as any;
@@ -48,6 +49,7 @@
       displayNotification() {},
     } as any;
     appState$ = { dispatch: () => {}, pipe: () => of(true), select: () => of(true) } as any;
+    preConfig$ = of({ visibilityConfiguration: { fieldVisibility: {} } });
     subscription = { unsubscribe() {} } as any;
     _gridApi = { onFilterChanged() {}, setFilterModel(model: any) {} } as any;
     component = new GridFailureListComponent(sandbox, appState$, router, utilService);
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts
index 6b9c3f0..d42744b 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.ts
@@ -38,8 +38,8 @@
 export class GridFailureListComponent extends BaseList implements OnInit, OnDestroy {
   public Globals = Globals;
   public RolesEnum = RolesEnum;
-  public overviewColumnDefinition: any = GRID_FAILURE_COLDEF;
-  public condensationColumnDefinition: any = GRID_FAILURE_FOR_CONDENSATION_COLDEF;
+  public overviewColumnDefinition: any;
+  public condensationColumnDefinition: any;
   public mapOptions: MapOptions = new MapOptions();
   public frameworkComponents: any;
   public view: any = 'list';
@@ -53,6 +53,7 @@
     suppressLoadingOverlay: true,
     localeText: Globals.LOCALE_TEXT,
   };
+  public preConfig$ = this.appState$.select(store.getPreConfiguration);
 
   private _gridApi: GridApi;
   private _modeEnum = ModeEnum;
@@ -61,6 +62,19 @@
   constructor(public sandbox: GridFailureSandbox, private appState$: Store<store.State>, private _router: Router, private _utilService: UtilService) {
     super();
     this.frameworkComponents = { setFilterComponent: SetFilterComponent, headerCellRendererComponent: HeaderCellRendererComponent };
+
+    this.preConfig$.pipe(takeUntil(this._endSubscriptions$)).subscribe(config => {
+      if (config && config.visibilityConfiguration) {
+        GRID_FAILURE_COLDEF.forEach((column: any) => {
+          column['hide'] = config.visibilityConfiguration.fieldVisibility[column['field']] === 'hide';
+        });
+        this.overviewColumnDefinition = GRID_FAILURE_COLDEF;
+        GRID_FAILURE_FOR_CONDENSATION_COLDEF.forEach((column: any) => {
+          column['hide'] = config.visibilityConfiguration.fieldVisibility[column['field']] === 'hide';
+        });
+        this.condensationColumnDefinition = GRID_FAILURE_FOR_CONDENSATION_COLDEF;
+      }
+    });
   }
 
   ngOnInit(): void {
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/agGrid/translate-column-definitions.directive.ts b/projects/grid-failure-information-app/src/app/shared/directives/agGrid/translate-column-definitions.directive.ts
index b9dad8b..ec05e2e 100644
--- a/projects/grid-failure-information-app/src/app/shared/directives/agGrid/translate-column-definitions.directive.ts
+++ b/projects/grid-failure-information-app/src/app/shared/directives/agGrid/translate-column-definitions.directive.ts
@@ -42,11 +42,13 @@
   }
 
   private _getTranslatedColumnDefinitions(columnDefs: any): any {
-    return columnDefs.map((columnDefinition: any) => {
-      return {
-        ...columnDefinition,
-        headerName: this._translationService.instant(columnDefinition.headerName),
-      };
-    });
+    if (columnDefs) {
+      return columnDefs.map((columnDefinition: any) => {
+        return {
+          ...columnDefinition,
+          headerName: this._translationService.instant(columnDefinition.headerName),
+        };
+      });
+    }
   }
 }
diff --git a/projects/grid-failure-information-app/src/app/shared/interfaces/visibility-configuration.interface.ts b/projects/grid-failure-information-app/src/app/shared/interfaces/visibility-configuration.interface.ts
new file mode 100644
index 0000000..679e78d
--- /dev/null
+++ b/projects/grid-failure-information-app/src/app/shared/interfaces/visibility-configuration.interface.ts
@@ -0,0 +1,55 @@
+/********************************************************************************
+ * Copyright (c) 2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+export interface VisibilityConfigurationInterface {
+  fieldVisibility: {
+    description: string;
+    failureClassification: string;
+    internalRemark: string;
+    responsibility: string;
+  };
+  tableExternColumnVisibility: {
+    branch: string;
+    city: string;
+    description: string;
+    district: string;
+    expectedReasonText: string;
+    failureBegin: string;
+    failureClassification: string;
+    failureEndPlanned: string;
+    postcode: string;
+    street: string;
+  };
+  tableInternColumnVisibility: {
+    branch: string;
+    city: string;
+    description: string;
+    district: string;
+    expectedReasonText: string;
+    failureBegin: string;
+    failureClassification: string;
+    failureEndPlanned: string;
+    failureEndResupplied: string;
+    housenumber: string;
+    internalRemark: string;
+    postcode: string;
+    pressureLevel: string;
+    publicationStatus: string;
+    radius: string;
+    responsibility: string;
+    stationIds: string;
+    statusExtern: string;
+    statusIntern: string;
+    street: string;
+    voltageLevel: string;
+  };
+}
diff --git a/projects/grid-failure-information-app/src/app/shared/models/settings.model.ts b/projects/grid-failure-information-app/src/app/shared/models/settings.model.ts
index 87356d9..282dc18 100644
--- a/projects/grid-failure-information-app/src/app/shared/models/settings.model.ts
+++ b/projects/grid-failure-information-app/src/app/shared/models/settings.model.ts
@@ -10,12 +10,15 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
+import { VisibilityConfigurationInterface } from '@grid-failure-information-app/shared/interfaces/visibility-configuration.interface';
+
 export class Settings {
   public overviewMapInitialZoom: number = null;
   public detailMapInitialZoom: number = null;
   public exportChannels: string[] = [];
   public overviewMapInitialLatitude: string = null;
   public overviewMapInitialLongitude: string = null;
+  public visibilityConfiguration: VisibilityConfigurationInterface = null;
 
   public constructor(data: any = null) {
     Object.keys(data || {})
diff --git a/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts b/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts
index be0acda..534b7a1 100644
--- a/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts
+++ b/projects/grid-failure-information-app/src/app/shared/utility/utilityHelpers.ts
@@ -15,6 +15,7 @@
 import { DateTimeModel } from '@grid-failure-information-app/shared/models/date-time.model';
 import { NgrxValueConverter, NgrxValueConverters } from 'ngrx-forms';
 import { FailureHousenumber } from '@grid-failure-information-app/shared/models';
+import { VisibilityConfigurationInterface } from '@grid-failure-information-app/shared/interfaces/visibility-configuration.interface';
 
 /**
  * Returns formated date based on given culture
@@ -142,3 +143,11 @@
   actionPayload = { ...actionPayload, payload: sortedItems };
   return actionPayload;
 }
+
+export function determineDetailFieldVisibility(config: VisibilityConfigurationInterface, config_prop: string, field: string): boolean {
+  if (config && config[config_prop]) {
+    return config[config_prop][field] === 'show';
+  } else {
+    return true;
+  }
+}