Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.frontend into SI-92-config-tooltip
diff --git a/i18n/general.de.json b/i18n/general.de.json
index 28d9b57..60f6767 100644
--- a/i18n/general.de.json
+++ b/i18n/general.de.json
@@ -30,6 +30,7 @@
   "Column": "Spalte",
   "MandatoryFieldsNotFilled": "Es ist mindestens ein Pflichtfeld nicht gefüllt.",
   "MandatoryMapFieldError": "Es muss ein Störungsort festgelegt werden.",
+  "MandatoryRadiusFieldError": "Es muss ein Radius festgelegt werden.",
   "SelectOption": "Bitte auswählen",
   "Search": "Suchen",
   "PublicationRequiresAtLeastOneChannel": "Zur Veröffentlichung der Störungsmeldung muss mindestens ein Veröffentlichungskanal ausgewählt sein.",
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 c938513..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
@@ -258,7 +258,8 @@
                 formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.telecommunication &&
                 formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.gas &&
                 formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.districtHeating &&
-                formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.water
+                formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.water &&
+                formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.noBranch
               "
             >
               <label for="voltageLevel" class="col-sm-2 col-form-label">{{ 'GridFailure.VoltageLevel' | translate }}</label>
@@ -285,7 +286,8 @@
                 formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.telecommunication &&
                 formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.power &&
                 formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.districtHeating &&
-                formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.water
+                formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.water &&
+                formState.value.branch !== Globals.BUSINESS_RULE_FIELDS.branch.noBranch
               "
             >
               <label for="pressureLevel" class="col-sm-2 col-form-label">{{ 'GridFailure.PressureLevel' | translate }}</label>
@@ -662,7 +664,7 @@
         </app-expandable>
 
         <!-- publication: publication-channels and distribution-groups -->
-        <div *ngIf="gridFailureDetailsSandbox.checkForMaxVersion()">
+        <div *ngIf="gridFailureDetailsSandbox.checkForMaxVersion() && gridFailureDetailsSandbox.showForStatus()">
           <app-expandable [showBodyInitially]="true" *visibleByRight="[RolesEnum.PUBLISHER]">
             <label header>{{ 'GridFailure.Publication' | translate }}</label>
             <div class="expandable-content" body>
diff --git a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts
index 257d07c..5f9277e 100644
--- a/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts
+++ b/projects/grid-failure-information-app/src/app/pages/grid-failure/grid-failure-details/grid-failure-details.sandbox.spec.ts
@@ -828,4 +828,22 @@
     service.setFormStatePristine();
     expect(dispatchSpy).toHaveBeenCalledTimes(1);
   });
+
+  it('should return true if status not completed or canceled', () => {
+    service.gridFailureDetailsFormState$ = of((INITIAL_STATE.value.statusIntern = StateEnum.CREATED) as any);
+    const res = service.showForStatus();
+    expect(res).toBeTruthy();
+  });
+
+  it('should return false if status completed', () => {
+    service.gridFailureDetailsFormState$ = of((INITIAL_STATE.value.statusIntern = StateEnum.COMPLETED) as any);
+    const res = service.showForStatus();
+    expect(res).toBeFalsy();
+  });
+
+  it('should return true if status canceled', () => {
+    service.gridFailureDetailsFormState$ = of((INITIAL_STATE.value.statusIntern = StateEnum.CANCELED) as any);
+    const res = service.showForStatus();
+    expect(res).toBeFalsy();
+  });
 });
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 3000e15..09180f0 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,6 +50,7 @@
 } from 'ngrx-forms';
 import { combineLatest, Observable } from 'rxjs';
 import { debounceTime, distinctUntilChanged, map, skipWhile, take, takeUntil, tap } from 'rxjs/operators';
+import { StateEnum } from '@grid-failure-information-app/shared/constants/enums';
 
 @Injectable()
 export class GridFailureDetailsSandbox extends BaseFormSandbox<models.GridFailure> {
@@ -383,10 +384,11 @@
           !districtControl.isValid ||
           !postcodeControl.isValid ||
           !streetControl.isValid ||
-          !housenumberControl.isValid ||
-          !radiusControl.isValid)
+          !housenumberControl.isValid)
       ) {
         this._utilService.displayNotification('MandatoryMapFieldError', 'alert');
+      } else if (allButGridFailureLocationAreValid && latControl.isValid && longControl.isValid && !radiusControl.isValid) {
+        this._utilService.displayNotification('MandatoryRadiusFieldError', 'alert');
       } else {
         this._utilService.displayNotification('MandatoryFieldError', 'alert');
       }
@@ -768,6 +770,10 @@
     return this.currentFormState.value.versionNumber === this.maxVersionNumber;
   }
 
+  public showForStatus(): boolean {
+    return this.currentFormState.value.statusIntern !== StateEnum.COMPLETED && this.currentFormState.value.statusIntern !== StateEnum.CANCELED;
+  }
+
   public createDistributionGroupAssignment(selectedDistributionGroup: models.DistributionGroup) {
     if (selectedDistributionGroup) {
       let testGroup: models.DistributionGroup = this._assignedDistributionGroups.find(group => group.id === selectedDistributionGroup.id);
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.spec.ts b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.spec.ts
index 5529e54..987fe74 100644
--- a/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.spec.ts
+++ b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.spec.ts
@@ -15,7 +15,7 @@
 import { of } from 'rxjs/observable/of';
 import { FormState } from 'ngrx-forms';
 import { PermissionsModel } from '@grid-failure-information-app/shared/models/permissions.model';
-import { RolesEnum } from '@grid-failure-information-app/shared/constants/enums';
+import { RolesEnum, StateEnum } from '@grid-failure-information-app/shared/constants/enums';
 
 describe('FormDisableDirective', () => {
   let directive: FormDisableDirective;
@@ -57,4 +57,31 @@
     directive.ngrxFormState = state;
     expect(dispatchSpy).toHaveBeenCalled();
   });
+
+  it('should disable from if user is publisher and status is qualified', () => {
+    let permission: PermissionsModel = new PermissionsModel([RolesEnum.PUBLISHER]);
+    directive['_permissions$'] = of(permission);
+    let state: FormState<any> = { isDisabled: false, value: { statusIntern: StateEnum.QUALIFIED } } as any;
+    let dispatchSpy = spyOn(directive['_appState$'], 'dispatch');
+    directive.ngrxFormState = state;
+    expect(dispatchSpy).toHaveBeenCalled();
+  });
+
+  it('should disable from if status is completed', () => {
+    let permission: PermissionsModel = new PermissionsModel([RolesEnum.ADMIN]);
+    directive['_permissions$'] = of(permission);
+    let state: FormState<any> = { isDisabled: false, value: { statusIntern: StateEnum.COMPLETED } } as any;
+    let dispatchSpy = spyOn(directive['_appState$'], 'dispatch');
+    directive.ngrxFormState = state;
+    expect(dispatchSpy).toHaveBeenCalled();
+  });
+
+  it('should disable from if status is canceled', () => {
+    let permission: PermissionsModel = new PermissionsModel([RolesEnum.ADMIN]);
+    directive['_permissions$'] = of(permission);
+    let state: FormState<any> = { isDisabled: false, value: { statusIntern: StateEnum.CANCELED } } as any;
+    let dispatchSpy = spyOn(directive['_appState$'], 'dispatch');
+    directive.ngrxFormState = state;
+    expect(dispatchSpy).toHaveBeenCalled();
+  });
 });
diff --git a/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.ts b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.ts
index 3025de3..410e112 100644
--- a/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.ts
+++ b/projects/grid-failure-information-app/src/app/shared/directives/forms/form-disable.directive.ts
@@ -39,7 +39,12 @@
       return;
     }
     this._permissions$.pipe(take(1), takeUntil(this._endSubscriptions$)).subscribe(permissions => {
-      if (!!permissions.reader || (!!permissions.publisher && formState.value.statusIntern === StateEnum.QUALIFIED)) {
+      if (
+        !!permissions.reader ||
+        (!!permissions.publisher && formState.value.statusIntern === StateEnum.QUALIFIED) ||
+        formState.value.statusIntern === StateEnum.COMPLETED ||
+        formState.value.statusIntern === StateEnum.CANCELED
+      ) {
         this._appState$.dispatch(new DisableAction(formState.id));
       }
     });