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

Signed-off-by: Peter Buschmann <peter.buschmann@pta.de>
diff --git a/i18n/grid-failure.de.json b/i18n/grid-failure.de.json
index 5f7646a..69e784a 100644
--- a/i18n/grid-failure.de.json
+++ b/i18n/grid-failure.de.json
@@ -10,7 +10,8 @@
     "CondenseChoosedGridFailureInformations": "Ausgewählte Meldungen verdichten",
     "SelectAll": "Alles auswählen",
     "NullValue": "Leer",
-    "FilterLabel": "qualifiziert / veröffentlicht"
+    "PublisherFilterLabel": "qualifiziert / veröffentlicht",
+    "QualifierFilterLabel": "angelegt / geplant"
   },
   "GridFailure": {
     "Title": "Störungsmeldung",
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 aaee65b..b43d691 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
@@ -434,6 +434,7 @@
                   type="text"
                   class="form-control"
                   id="city"
+                  [disabled]="!gridFailureDetailsSandbox.saveEnabled"
                   [ngrxFormControlState]="((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['city']"
                 >
                   <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option>
@@ -451,6 +452,7 @@
                   type="text"
                   class="form-control"
                   id="district"
+                  [disabled]="!gridFailureDetailsSandbox.saveEnabled"
                   [ngrxFormControlState]="((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['district']"
                 >
                   <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option>
@@ -468,6 +470,7 @@
                   type="text"
                   class="form-control"
                   id="street"
+                  [disabled]="!gridFailureDetailsSandbox.saveEnabled"
                   [ngrxFormControlState]="((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['street']"
                 >
                   <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option>
@@ -485,6 +488,8 @@
                   type="text"
                   class="form-control"
                   id="housenumber"
+                  [disabled]="!gridFailureDetailsSandbox.saveEnabled"
+                  (change)="gridFailureDetailsSandbox.setLatLong()"
                   [ngrxFormControlState]="((gridFailureDetailsSandbox.gridFailureDetailsFormState$ | async)?.controls)['housenumber']"
                 >
                   <option [value]="null" selected disabled>{{ 'SelectOption' | translate }}</option>
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.html b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.html
index 4a4707c..cc144ab 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.html
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure-list.component.html
@@ -67,9 +67,25 @@
 
     <div class="grid-failure-information-overview" *ngIf="view === 'list'; else map">
       <div class="diverse-options" *ngIf="!showCondensationTable">
-        <div class="custom-control custom-switch filter-switch" *visibleByRight="RolesEnum.PUBLISHER">
-          <input type="checkbox" class="custom-control-input" id="filterSwitch" (change)="changeFilter($event.target.checked)" />
-          <label class="custom-control-label" for="filterSwitch">{{ 'GridFailures.FilterLabel' | translate }}</label>
+        <div class="custom-control custom-switch filter-switch" *visibleByRight="[RolesEnum.PUBLISHER]">
+          <input
+            type="checkbox"
+            class="custom-control-input"
+            id="publisherFilterSwitch"
+            [disabled]="qualifierFilterIsActive"
+            (change)="changeFilter($event.target.checked, RolesEnum.PUBLISHER)"
+          />
+          <label class="custom-control-label" for="publisherFilterSwitch">{{ 'GridFailures.PublisherFilterLabel' | translate }}</label>
+        </div>
+        <div class="custom-control custom-switch filter-switch" *visibleByRight="[RolesEnum.QUALIFIER]">
+          <input
+            type="checkbox"
+            class="custom-control-input"
+            id="qualifierFilterSwitch"
+            [disabled]="publisherFilterIsActive"
+            (change)="changeFilter($event.target.checked, RolesEnum.QUALIFIER)"
+          />
+          <label class="custom-control-label" for="qualifierFilterSwitch">{{ 'GridFailures.QualifierFilterLabel' | translate }}</label>
         </div>
         <button class="btn btn-primary diverse-btn" (click)="changeToSelectionMode()">
           {{ 'GridFailures.Condensation' | translate }}
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 b3e7b65..6ef4d4f 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
@@ -16,6 +16,7 @@
 import { GridFailureSandbox } from '@grid-failure-information-app/pages/grid-failure/grid-failure-list/grid-failure.sandbox';
 import { Subscription } from 'rxjs';
 import { UtilService } from '@grid-failure-information-app/shared/utility';
+import { RolesEnum } from '@grid-failure-information-app/shared/constants/enums';
 
 describe('GridFailureListComponent ', () => {
   let component: GridFailureListComponent;
@@ -161,15 +162,27 @@
     expect(spy).toHaveBeenCalled();
   });
 
-  it('should setGlobalGridFailureFilter when changeFilter(true) is called', () => {
+  it('should call setGlobalGridFailureFilter(RolesEnum.PUBLISHER) when changeFilter(true, RolesEnum.PUBLISHER) is called', () => {
     const spy: any = spyOn(sandbox, 'setGlobalGridFailureFilter');
-    component.changeFilter(true);
+    component.changeFilter(true, RolesEnum.PUBLISHER);
+    expect(spy).toHaveBeenCalledWith(RolesEnum.PUBLISHER);
+  });
+
+  it('should resetOverviewList when changeFilter(false, RolesEnum.PUBLISHER) is called', () => {
+    const spy: any = spyOn(sandbox, 'resetOverviewList');
+    component.changeFilter(false, RolesEnum.PUBLISHER);
     expect(spy).toHaveBeenCalled();
   });
 
-  it('should resetOverviewList when changeFilter(false) is called', () => {
+  it('should call setGlobalGridFailureFilter(RolesEnum.QUALIFIER) when changeFilter(true, RolesEnum.QUALIFIER) is called', () => {
+    const spy: any = spyOn(sandbox, 'setGlobalGridFailureFilter');
+    component.changeFilter(true, RolesEnum.QUALIFIER);
+    expect(spy).toHaveBeenCalledWith(RolesEnum.QUALIFIER);
+  });
+
+  it('should resetOverviewList when changeFilter(false, RolesEnum.QUALIFIER) is called', () => {
     const spy: any = spyOn(sandbox, 'resetOverviewList');
-    component.changeFilter(false);
+    component.changeFilter(false, RolesEnum.QUALIFIER);
     expect(spy).toHaveBeenCalled();
   });
 });
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 40d2ae8..75be6a5 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
@@ -48,6 +48,8 @@
     suppressLoadingOverlay: true,
     localeText: Globals.LOCALE_TEXT,
   };
+  public publisherFilterIsActive: boolean = false;
+  public qualifierFilterIsActive: boolean = false;
 
   private _gridApi: GridApi;
   private _modeEnum = ModeEnum;
@@ -72,12 +74,22 @@
     this._gridApi = params.api;
   }
 
-  public changeFilter(checked: boolean): void {
+  public changeFilter(checked: boolean, filterFor: string): void {
     this.overviewColumnDefinition = this.overviewColumnDefinition.map(item => {
       if (checked && item['field'] && item['field'] === Globals.STATUS_INTERN_FIELD) {
-        this.sandbox.setGlobalGridFailureFilter();
+        if (filterFor === RolesEnum.PUBLISHER) {
+          this.publisherFilterIsActive = true;
+        } else if (filterFor === RolesEnum.QUALIFIER) {
+          this.qualifierFilterIsActive = true;
+        }
+        this.sandbox.setGlobalGridFailureFilter(filterFor);
         return { ...item, filter: null };
       } else if (!checked) {
+        if (filterFor === RolesEnum.PUBLISHER) {
+          this.publisherFilterIsActive = false;
+        } else if (filterFor === RolesEnum.QUALIFIER) {
+          this.qualifierFilterIsActive = false;
+        }
         this.sandbox.resetOverviewList();
         return { ...item, filter: Globals.SET_FILTER_COMPONENT };
       } else {
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.spec.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.spec.ts
index e67a571..bd60de3 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.spec.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.spec.ts
@@ -17,6 +17,7 @@
 import * as gridFailureActions from '@grid-failure-information-app/shared/store/actions/grid-failures.action';
 import { Router } from '@angular/router';
 import { GridFailure } from '@grid-failure-information-app/shared/models/grid-failure.model';
+import { RolesEnum } from '@grid-failure-information-app/shared/constants/enums';
 
 describe('GridFailureSandbox', () => {
   let service: GridFailureSandbox;
@@ -91,7 +92,7 @@
 
   it('should filter overviewGridFailureList via setGlobalGridFailureFilter()', () => {
     service.overviewGridFailureList = [new GridFailure({ statusIntern: 'x' })];
-    service.setGlobalGridFailureFilter([service.StateEnum.QUALIFIED, service.StateEnum.PUBLISHED]);
+    service.setGlobalGridFailureFilter(RolesEnum.PUBLISHER);
     expect(service.overviewGridFailureList).toEqual([]);
   });
 
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.ts
index 3ac9c24..47aa0a6 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-list/grid-failure.sandbox.ts
@@ -22,7 +22,7 @@
 import * as fromGridFailuresDetailFormReducer from '@grid-failure-information-app/shared/store/reducers/grid-failures/grid-failure-details-form.reducer';
 import { ofType } from '@ngrx/effects';
 import { map, take } from 'rxjs/operators';
-import { StateEnum } from '@grid-failure-information-app/shared/constants/enums';
+import { StateEnum, RolesEnum } from '@grid-failure-information-app/shared/constants/enums';
 
 @Injectable()
 export class GridFailureSandbox extends BaseSandbox {
@@ -33,6 +33,7 @@
   public condensationList: GridFailure[] = new Array();
   public condenseId: string = null;
   public StateEnum = StateEnum;
+  public RolesEnum = RolesEnum;
 
   constructor(protected appState$: Store<store.State>, private _router: Router, private actionsSubject: ActionsSubject) {
     super(appState$);
@@ -87,7 +88,16 @@
     this.appState$.dispatch(gridFailureActions.loadCondensedGridFailures({ payload: id }));
   }
 
-  public setGlobalGridFailureFilter(filterArray: Array<string> = [StateEnum.QUALIFIED, StateEnum.PUBLISHED]): void {
+  public setGlobalGridFailureFilter(filterFor: string): void {
+    let filterArray: Array<string> = [];
+    switch (filterFor) {
+      case RolesEnum.PUBLISHER:
+        filterArray = [StateEnum.QUALIFIED, StateEnum.PUBLISHED];
+        break;
+      case RolesEnum.QUALIFIER:
+        filterArray = [StateEnum.CREATED, StateEnum.PLANNED];
+        break;
+    }
     this.overviewGridFailureList = this.overviewGridFailureList.filter(item => filterArray.includes(item.statusIntern));
   }
 
diff --git a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.css b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.css
index 1d9cf04..d7e7381 100644
--- a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.css
+++ b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.css
@@ -1,4 +1,4 @@
- /********************************************************************************
+/********************************************************************************
  * Copyright (c) 2020 Contributors to the Eclipse Foundation
  *
  * See the NOTICE file(s) distributed with this work for additional
@@ -10,9 +10,34 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
- label {
+label {
   white-space: nowrap;
 }
-span{
-    margin: 3px;;
+
+span {
+  margin: 3px;
+}
+
+.ag-grid-filter-container {
+  height: auto;
+  width: 250px;
+  margin: 4px;
+  border: 1px solid lightgrey;
+  z-index: 100;
+}
+
+.ag-grid-filter-text {
+  width: 99%;
+  margin: 1px;
+}
+
+.ag-grid-filter {
+  border-bottom: 1px solid lightgrey;
+  margin: 2px;
+}
+
+.ag-grid-filter-checkbox {
+  overflow-y: scroll;
+  overflow: hidden;
+  margin: 2px;
 }
diff --git a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.html b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.html
index 1445ae2..6bc2731 100644
--- a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.html
+++ b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.html
@@ -10,18 +10,18 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 ********************************************************************************/ -->
-<div style="height: auto; width: 250px; margin: 4px; border: 1px solid lightgrey; z-index: 100;">
-  <div style="border-bottom: 1px solid lightgrey; margin: 2px;">
-    <input mdInput style="width: 99%; margin: 1px;" [(ngModel)]="filterText" name="'filterText'" (input)="filterCheckboxList($event.target.value)" />
+<div class="ag-grid-filter-container">
+  <div class="ag-grid-filter">
+    <input mdInput class="ag-grid-filter-text" [(ngModel)]="filterText" name="'filterText'" (input)="filterCheckboxList($event.target.value)" />
   </div>
-  <div style="border-bottom: 1px solid lightgrey; margin: 2px;">
+  <div class="ag-grid-filter">
     <div class="checkbox">
       <label
         ><input type="checkbox" (change)="selectAll($event)" [checked]="selectAllChecked" /><span>{{ 'GridFailures.SelectAll' | translate }}</span></label
       >
     </div>
   </div>
-  <div style="overflow-y: scroll; overflow: hidden; margin: 2px;">
+  <div class="ag-grid-filter-checkbox">
     <label *ngFor="let setItem of setItems | keyvalue" title="{{ setItem?.key }}" style="display: block;">
       <input type="checkbox" [checked]="setItem.value.checked" (change)="notifyFilter($event)" [id]="setItem?.key" />
       <span *ngIf="setItem.key != 'null' && setItem.key != ''; else nullValue">{{ setItem?.key }}</span>
diff --git a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.spec.ts b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.spec.ts
index 70e1eb6..dd8026b 100644
--- a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.spec.ts
+++ b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.spec.ts
@@ -87,4 +87,31 @@
     component.selectAll();
     expect(component.selectAllChecked).toBeTruthy();
   });
+
+  it('should not pass filter for undefined setItems', () => {
+    const params = { node: 'x' } as any;
+    component['_valueGetter'] = () => {};
+    const returnValue = component.doesFilterPass(params);
+    expect(returnValue).toBeFalsy();
+  });
+
+  it('should set params via agInit', () => {
+    const params = {
+      node: 'x',
+      api: {
+        getModel() {
+          return {
+            rowsToDisplay: {
+              map: () => {
+                return ['Störung'];
+              },
+            },
+          };
+        },
+        gridOptionsWrapper: { gridOptions: { onGridSizeChanged: () => {}, onRowDataChanged: () => {} } },
+      },
+    } as any;
+    component.agInit(params);
+    expect(component['_params']).toEqual(params as any);
+  });
 });
diff --git a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.ts b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.ts
index 468bb75..30888d8 100644
--- a/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.ts
+++ b/projects/grid-failure-information-app/src/app/shared/filters/ag-grid/set-filter/set-filter.component.ts
@@ -27,6 +27,7 @@
   public filterText: string = '';
   public selectAllChecked: boolean = true;
   private filtererdItems: any = {};
+
   filterCheckboxList(text: string) {
     text
       .toLowerCase()