Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.gridFailureInformation.frontend into SI-296-platzhalter
diff --git a/i18n/distribution-group.de.json b/i18n/distribution-group.de.json
index 91752ca..66f4aef 100644
--- a/i18n/distribution-group.de.json
+++ b/i18n/distribution-group.de.json
@@ -7,7 +7,8 @@
     "Title": "Verteilergruppe",
     "Name": "Titel",
     "Text": "Text",
-    "FormTitle": "Anlegen / Editieren Verteilergruppe"
+    "FormTitle": "Anlegen / Editieren Verteilergruppe",
+    "TextPlaceholder": "Mögliche Platzhalter:"
   },
   "DistributionGroupMember": {
     "Title": "Kontakte zur Verteilergruppe",
@@ -18,6 +19,9 @@
     "EMail": "E-Mail",
     "MobileNumber": "Mobil",
     "AssignToGroupBtn": "Kontakt zuordnen",
-    "ContactSearch": "Kontaktsuche"
+    "ContactSearch": "Kontaktsuche",
+    "SalutationType": "Anrede",
+    "PersonType": "Personentyp",
+    "Department": "Abteilung"
   }
 }
diff --git a/i18n/general.de.json b/i18n/general.de.json
index a1272b8..9cc6041 100644
--- a/i18n/general.de.json
+++ b/i18n/general.de.json
@@ -13,6 +13,7 @@
   "EditBtn": "Bearbeiten",
   "NewBtn": "Neu",
   "CancelBtn": "Abbrechen",
+  "CloseBtn": "Schließen",
   "BackBtn": "Zurück",
   "QualifyBtn": "Qualifizieren",
   "StornoBtn": "Stornieren",
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-api-client.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-api-client.ts
index 8ac17e0..8420d75 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-api-client.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-api-client.ts
@@ -14,7 +14,7 @@
 import { HttpService, GET, Adapter, DefaultHeaders, Path, PUT, POST, Body, DELETE, Query } from '@grid-failure-information-app/shared/async-services/http';
 import { Observable, of } from 'rxjs';
 import { DistributionGroupService } from '@grid-failure-information-app/pages/distribution-group/distribution-group.service';
-import { DistributionGroup, DistributionGroupMember, Contact } from '@grid-failure-information-app/shared/models';
+import { DistributionGroup, DistributionGroupMember, Contact, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models';
 
 @Injectable()
 @DefaultHeaders({
@@ -75,4 +75,10 @@
   public getContacts(@Query('searchText') searchtext: string): Observable<Contact[]> {
     return null;
   }
+
+  @GET('/placeholders')
+  @Adapter(DistributionGroupService.placeholderAdapter)
+  public getDistributionGroupTextPlaceholders(): Observable<DistributionGroupTextPlaceholder> {
+    return null;
+  }
 }
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.html b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.html
index 1834e27..d664434 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.html
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.html
@@ -13,11 +13,12 @@
 <form *ngIf="sandbox.distributionGroupDetailsFormState$ | async as formState" [ngrxFormState]="formState">
   <h6 class="formTitle">{{ 'DistributionGroup.FormTitle' | translate }}</h6>
   <div>
-    <!-- type -->
+    <!-- name (title) -->
     <div class="form-group row">
       <label for="distributionGroupName" class="col-sm-2 col-form-label">{{ 'DistributionGroup.Name' | translate }}</label>
       <div class="col-sm-9">
         <input
+          required
           type="text"
           maxlength="255"
           class="form-control"
@@ -27,6 +28,23 @@
         />
       </div>
     </div>
+    <!-- text -->
+    <div class="form-group row">
+      <label for="distributionText" class="col-sm-2 col-form-label">{{ 'DistributionGroup.Text' | translate }}</label>
+      <div class="col-sm-9">
+        <textarea rows="15" class="form-control" id="distributionText" [ngrxFormControlState]="(formState?.controls)['distributionText']" autocomplete="off">
+        </textarea>
+      </div>
+    </div>
+    <!-- placeholder -->
+    <div class="row">
+      <label class="col-sm-12 placeholder-label">{{ 'DistributionGroup.TextPlaceholder' | translate }}</label>
+    </div>
+    <div class="form-group row container">
+      <div class="placeholder" *ngFor="let item of sandbox.distributionGroupTextPlaceholder | keyvalue">
+        {{ item.value }}
+      </div>
+    </div>
     <!-- buttons -->
     <div class="detail-buttons">
       <button type="button" class="btn btn-primary btn-sm" (click)="sandbox.cancel()">
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.scss b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.scss
index c7b591b..be03043 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.scss
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-details/distribution-group-details.component.scss
@@ -18,3 +18,12 @@
 .formTitle {
   padding-bottom: 7%;
 }
+.placeholder-label {
+  padding-left: -15px !important;
+}
+.container {
+  display: flex;
+}
+.placeholder {
+  flex: 50%;
+}
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.html b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.html
index 2fa11f9..00ffb9e 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.html
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.html
@@ -28,6 +28,7 @@
         <ag-grid-angular
           autoResizeColumns
           class="ag-theme-balham"
+          [ngClass]="sandbox.displayDistributionGroupMember ? 'height-list-with-members' : 'height-list-without-members'"
           [gridOptions]="gridOptions"
           [columnDefs]="columnDefinition"
           [rowSelection]="'single'"
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.scss b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.scss
index 22dc714..bf1db2a 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.scss
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-list/distribution-group-list.component.scss
@@ -16,13 +16,18 @@
   height: 100%;
 }
 .distribution-group-list {
-  height: 350px;
   flex-grow: 1;
 }
 .distribution-group-form {
   height: 756px;
-  width: 461px;
+  width: 521px;
 }
 .distribution-group-member {
   margin-top: 15px;
 }
+.height-list-without-members {
+  height: 740px;
+}
+.height-list-with-members {
+  height: 280px;
+}
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members-col-def.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members-col-def.ts
index 62da01f..a3c1374 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members-col-def.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members-col-def.ts
@@ -14,12 +14,30 @@
 
 export const DISTRIBUTION_GROUP_MEMBER_COLDEF = [
   {
+    field: 'salutationType',
+    headerName: 'DistributionGroupMember.SalutationType',
+    sortable: true,
+    filter: 'setFilterComponent',
+  },
+  {
     field: 'name',
     headerName: 'DistributionGroupMember.Name',
     sortable: true,
     filter: 'setFilterComponent',
   },
   {
+    field: 'personType',
+    headerName: 'DistributionGroupMember.PersonType',
+    sortable: true,
+    filter: 'setFilterComponent',
+  },
+  {
+    field: 'department',
+    headerName: 'DistributionGroupMember.Department',
+    sortable: true,
+    filter: 'setFilterComponent',
+  },
+  {
     field: 'displayMainAddress',
     headerName: 'DistributionGroupMember.MainAddress',
     sortable: true,
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.html b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.html
index 8f362fe..0bcfce6 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.html
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.html
@@ -17,7 +17,7 @@
   <div body>
     <div class="group-member-search">
       <button type="button" class="btn btn-primary btn-sm group-member-search-button" (click)="sandbox.cancelMembersDisplay()">
-        {{ 'CancelBtn' | translate }}
+        {{ 'CloseBtn' | translate }}
       </button>
       <div class="group-member-search-input">
         <input
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.scss b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.scss
index f9398a8..8b6fd34 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.scss
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group-members/distribution-group-members.component.scss
@@ -14,7 +14,7 @@
   font-size: 80%;
 }
 .distribution-group-members {
-  height: 350px;
+  height: 340px;
 }
 .group-member-search {
   display: flex;
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.spec.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.spec.ts
index d60e10d..7b21f22 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.spec.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.spec.ts
@@ -12,7 +12,7 @@
  ********************************************************************************/
 import { DistributionGroupResolver } from '@grid-failure-information-app/pages/distribution-group/distribution-group.resolver';
 
-describe('GridFailuresResolver', () => {
+describe('DistributionGroupResolver', () => {
   let component: DistributionGroupResolver;
   let sandbox: any;
 
@@ -20,6 +20,7 @@
     sandbox = {
       clear() {},
       loadDistributionGroups() {},
+      loadDistributionGroupTextPlaceholders() {},
     } as any;
   });
 
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.ts
index a8b7bbd..4e66ec7 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.resolver.ts
@@ -20,5 +20,6 @@
 
   public resolve(): void {
     this.sandbox.loadDistributionGroups();
+    this.sandbox.loadDistributionGroupTextPlaceholders();
   }
 }
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.spec.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.spec.ts
index fa74866..0604f80 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.spec.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.spec.ts
@@ -19,7 +19,7 @@
 import * as distributionGroupActions from '@grid-failure-information-app/shared/store/actions/distribution-groups.action';
 import { Contact, DistributionGroupMember } from '@grid-failure-information-app/shared/models';
 
-describe('GridFailureSandbox', () => {
+describe('DistributionGroupSandbox', () => {
   let service: DistributionGroupSandbox;
   let appState: Store<store.State>;
   let actionsSubject: ActionsSubject;
@@ -56,6 +56,11 @@
     expect(appState.dispatch).toHaveBeenCalledWith(distributionGroupActions.loadDistributionGroupsDetail({ payload: 'x' }));
   });
 
+  it('should dispatch loadDistributionGroupTextPlaceholders Action via loadDistributionGroupTextPlaceholders()', () => {
+    service.loadDistributionGroupTextPlaceholders();
+    expect(appState.dispatch).toHaveBeenCalledWith(distributionGroupActions.loadDistributionGroupTextPlaceholders());
+  });
+
   it('should clear form state when current change is canceled and form state is pristine', () => {
     const spy: any = spyOn(service as any, '_clear').and.callThrough();
     service.currentFormState = { isPristine: true } as any;
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.ts
index f1dffd3..7c4998c 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.sandbox.ts
@@ -24,7 +24,7 @@
 import { ofType } from '@ngrx/effects';
 import { UtilService } from '@grid-failure-information-app/shared/utility/utility.service';
 import { CellClickedEvent } from 'ag-grid-community';
-import { DistributionGroup, DistributionGroupMember, Contact } from '@grid-failure-information-app/shared/models';
+import { DistributionGroup, DistributionGroupMember, Contact, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models';
 
 @Injectable()
 export class DistributionGroupSandbox extends BaseSandbox {
@@ -36,6 +36,7 @@
   public distributionGroupMemberLoading$: Observable<boolean> = this.appState$.select(store.getDistributionGroupMembersLoading);
   public displayForm: boolean = false;
   public displayDistributionGroupMember: boolean = false;
+  public distributionGroupTextPlaceholder: DistributionGroupTextPlaceholder;
   private _selectedDistributionGroup: DistributionGroup;
   private _selectedContact: Contact;
   private _distributionGroupMembers: Array<DistributionGroupMember>;
@@ -66,6 +67,10 @@
     this.appState$.dispatch(distributionGroupActions.loadDistributionGroupsDetail({ payload: id }));
   }
 
+  public loadDistributionGroupTextPlaceholders(): void {
+    this.appState$.dispatch(distributionGroupActions.loadDistributionGroupTextPlaceholders());
+  }
+
   public cancel(): void {
     if (!this.currentFormState.isPristine) {
       const modalRef = this._modalService.open(SafetyQueryDialogComponent);
@@ -137,6 +142,15 @@
       .subscribe((members: Array<DistributionGroupMember>) => {
         this._distributionGroupMembers = members;
       });
+    this._actionsSubject
+      .pipe(
+        ofType(distributionGroupActions.loadDistributionGroupTextPlaceholdersSuccess),
+        map(action => action.payload),
+        takeUntil(this._endSubscriptions$)
+      )
+      .subscribe((item: DistributionGroupTextPlaceholder) => {
+        this.distributionGroupTextPlaceholder = item;
+      });
   }
 
   public showMembersToSelectedGroup(selectedGroup: CellClickedEvent): void {
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.spec.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.spec.ts
index bbe0bf5..0841b3f 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.spec.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.spec.ts
@@ -10,7 +10,7 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
-import { DistributionGroup, DistributionGroupMember, Contact } from '@grid-failure-information-app/shared/models';
+import { DistributionGroup, DistributionGroupMember, Contact, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models';
 import { DistributionGroupService } from '@grid-failure-information-app/pages/distribution-group/distribution-group.service';
 
 describe('DistributionGroupService', () => {
@@ -40,4 +40,10 @@
     response.content[0].uuid = 'X';
     expect(DistributionGroupService.contactsPageAdapter(response)[0].uuid).toBe('X');
   });
+
+  it('should transform api response to DistributionGroupTextPlaceholder model', () => {
+    const response = new DistributionGroupTextPlaceholder();
+    response.branch = 'X';
+    expect(DistributionGroupService.placeholderAdapter(response).branch).toBe('X');
+  });
 });
diff --git a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.ts b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.ts
index 260ff37..5042c1c 100644
--- a/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.ts
+++ b/projects/grid-failure-information-app/src/app/pages/distribution-group/distribution-group.service.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 import { Injectable } from '@angular/core';
-import { DistributionGroup, DistributionGroupMember, Contact } from '@grid-failure-information-app/shared/models';
+import { DistributionGroup, DistributionGroupMember, Contact, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models';
 
 @Injectable()
 export class DistributionGroupService {
@@ -30,4 +30,8 @@
   static contactsPageAdapter(response: any): Array<Contact> {
     return response.content.map(responseItem => new Contact(responseItem));
   }
+
+  static placeholderAdapter(responseItem: any): DistributionGroupTextPlaceholder {
+    return new DistributionGroupTextPlaceholder(responseItem);
+  }
 }
diff --git a/projects/grid-failure-information-app/src/app/shared/models/contact.model.ts b/projects/grid-failure-information-app/src/app/shared/models/contact.model.ts
index 5e2ca28..4b489c7 100644
--- a/projects/grid-failure-information-app/src/app/shared/models/contact.model.ts
+++ b/projects/grid-failure-information-app/src/app/shared/models/contact.model.ts
@@ -37,6 +37,16 @@
   }
 
   get contactSearchString(): string {
-    return this.name + ' ' + this.mainAddress;
+    return (
+      (this.salutationType ? this.salutationType : '') +
+      ' ' +
+      this.name +
+      ' ' +
+      (this.personType ? this.personType : '') +
+      ' ' +
+      (this.department ? this.department : '') +
+      ' ' +
+      this.mainAddress
+    );
   }
 }
diff --git a/projects/grid-failure-information-app/src/app/shared/models/distribution-group-member.model.ts b/projects/grid-failure-information-app/src/app/shared/models/distribution-group-member.model.ts
index 7a17f06..46f06a1 100644
--- a/projects/grid-failure-information-app/src/app/shared/models/distribution-group-member.model.ts
+++ b/projects/grid-failure-information-app/src/app/shared/models/distribution-group-member.model.ts
@@ -12,6 +12,7 @@
  ********************************************************************************/
 export class DistributionGroupMember {
   public contactId: string = null;
+  public department: string = null;
   public distributionGroup: string = null;
   public distributionGroupUuid: string = null;
   public email: string = null;
@@ -19,6 +20,8 @@
   public id: string = null;
   public name: string = null;
   public mobileNumber: string = null;
+  public personType: string = null;
+  public salutationType: string = null;
 
   public constructor(data: any = null) {
     Object.keys(data || {})
diff --git a/projects/grid-failure-information-app/src/app/shared/models/distribution-group-text-placeholder.model.ts b/projects/grid-failure-information-app/src/app/shared/models/distribution-group-text-placeholder.model.ts
new file mode 100644
index 0000000..38f2710
--- /dev/null
+++ b/projects/grid-failure-information-app/src/app/shared/models/distribution-group-text-placeholder.model.ts
@@ -0,0 +1,42 @@
+/********************************************************************************
+ * 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 class DistributionGroupTextPlaceholder {
+  public failureClassification: string = null;
+  public failureType: string = null;
+  public responsibility: string = null;
+  public internExtern: string = null;
+  public statusIntern: string = null;
+  public statusExtern: string = null;
+  public publicationStatus: string = null;
+  public branch: string = null;
+  public voltageLevel: string = null;
+  public pressureLevel: string = null;
+  public failureBegin: string = null;
+  public failureEndPlanned: string = null;
+  public failureEndResupplied: string = null;
+  public expectedReason: string = null;
+  public internalRemark: string = null;
+  public city: string = null;
+  public district: string = null;
+  public housenumber: string = null;
+  public postcode: string = null;
+  public street: string = null;
+  public stationDescription: string = null;
+  public radius: number = null;
+
+  public constructor(data: any = null) {
+    Object.keys(data || {})
+      .filter(property => this.hasOwnProperty(property))
+      .forEach(property => (this[property] = data[property]));
+  }
+}
diff --git a/projects/grid-failure-information-app/src/app/shared/models/index.ts b/projects/grid-failure-information-app/src/app/shared/models/index.ts
index 5194783..47d81ae 100644
--- a/projects/grid-failure-information-app/src/app/shared/models/index.ts
+++ b/projects/grid-failure-information-app/src/app/shared/models/index.ts
@@ -26,3 +26,4 @@
 export * from './distribution-group-member.model';
 export * from './contact.model';
 export * from './settings.model';
+export * from './distribution-group-text-placeholder.model';
diff --git a/projects/grid-failure-information-app/src/app/shared/store/actions/distribution-groups.action.ts b/projects/grid-failure-information-app/src/app/shared/store/actions/distribution-groups.action.ts
index 1750f4a..3c83cea 100644
--- a/projects/grid-failure-information-app/src/app/shared/store/actions/distribution-groups.action.ts
+++ b/projects/grid-failure-information-app/src/app/shared/store/actions/distribution-groups.action.ts
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 import { createAction, props } from '@ngrx/store';
-import { DistributionGroup, DistributionGroupMember } from '@grid-failure-information-app/shared/models';
+import { DistributionGroup, DistributionGroupMember, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models';
 import { Contact } from '@grid-failure-information-app/shared/models/contact.model';
 
 export const loadDistributionGroups = createAction('[DistributionGroups] Load');
@@ -48,3 +48,10 @@
 export const createDistributionGroupMember = createAction('[DistributionGroupMember] Create', props<{ groupId: string; newMember: DistributionGroupMember }>());
 export const createDistributionGroupMemberSuccess = createAction('[DistributionGroupMember] Create Success', props<{ payload: DistributionGroupMember }>());
 export const createDistributionGroupMemberFail = createAction('[DistributionGroupMember] Create Fail', props<{ payload: string }>());
+
+export const loadDistributionGroupTextPlaceholders = createAction('[DistributionGroupTextPlaceholder] Load');
+export const loadDistributionGroupTextPlaceholdersSuccess = createAction(
+  '[DistributionGroupTextPlaceholder] Load Success',
+  props<{ payload: DistributionGroupTextPlaceholder }>()
+);
+export const loadDistributionGroupTextPlaceholdersFail = createAction('[DistributionGroupTextPlaceholder] Load Fail', props<{ payload: string }>());
diff --git a/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.spec.ts b/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.spec.ts
index af4a8f0..2de036d 100644
--- a/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.spec.ts
+++ b/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.spec.ts
@@ -13,12 +13,12 @@
 import { take } from 'rxjs/operators';
 import { DistributionGroupsEffects } from '@grid-failure-information-app/shared/store/effects/distribution-groups.effect';
 import { Subject, of, throwError } from 'rxjs';
-import { DistributionGroup, DistributionGroupMember, Contact } from '@grid-failure-information-app/shared/models';
+import { DistributionGroup, DistributionGroupMember, Contact, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models';
 import * as distributionGroupActions from '@grid-failure-information-app/shared/store/actions/distribution-groups.action';
 import { DistributionGroupApiClient } from '@grid-failure-information-app/pages/distribution-group/distribution-group-api-client';
 import { Store } from '@ngrx/store';
 
-describe('GridFailure Effects', () => {
+describe('DistributionGroups Effects', () => {
   let effects: DistributionGroupsEffects;
   let actions$: Subject<any>;
   let apiClient: DistributionGroupApiClient;
@@ -36,6 +36,7 @@
       deleteDistributionGroupMember() {},
       getContacts() {},
       postDistributionGroupMember() {},
+      getDistributionGroupTextPlaceholders() {},
     } as any;
     store = {
       dispatch() {},
@@ -106,6 +107,15 @@
     actions$.next(distributionGroupActions.saveDistributionGroup({ payload: new DistributionGroup() }));
   });
 
+  it('should equal saveDistributionGroupFail after saveDistributionGroup Error', done => {
+    spyOn(apiClient, 'postDistributionGroup').and.returnValue(throwError('x'));
+    effects.saveDistributionGroup$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.saveDistributionGroupFail({ payload: 'x' }));
+    });
+    done();
+    actions$.next(distributionGroupActions.saveDistributionGroup({ payload: new DistributionGroup() }));
+  });
+
   it('should equal deleteDistributionGroupSuccess after deleteDistributionGroup', done => {
     spyOn(apiClient, 'deleteDistributionGroup').and.returnValue(of(null));
     effects.deleteDistributionGroup$.pipe(take(1)).subscribe(result => {
@@ -115,6 +125,15 @@
     actions$.next(distributionGroupActions.deleteDistributionGroup({ payload: '1' }));
   });
 
+  it('should equal deleteDistributionGroupFail after deleteDistributionGroup Error', done => {
+    spyOn(apiClient, 'deleteDistributionGroup').and.returnValue(throwError('x'));
+    effects.deleteDistributionGroup$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.deleteDistributionGroupFail({ payload: 'x' }));
+    });
+    done();
+    actions$.next(distributionGroupActions.deleteDistributionGroup({ payload: '1' }));
+  });
+
   it('should equal loadDistributionGroupMembersSuccess after getDistributionGroupMembers', done => {
     apiResponse = [new DistributionGroupMember({ id: '1' })];
     spyOn(apiClient, 'getDistributionGroupMembers').and.returnValue(of(apiResponse));
@@ -125,6 +144,15 @@
     actions$.next(distributionGroupActions.loadDistributionGroupMembers({ payload: '1' }));
   });
 
+  it('should equal loadDistributionGroupMembersFail after getDistributionGroupMembers Error', done => {
+    spyOn(apiClient, 'getDistributionGroupMembers').and.returnValue(throwError('x'));
+    effects.getDistributionGroupMembers$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.loadDistributionGroupMembersFail({ payload: 'x' }));
+    });
+    done();
+    actions$.next(distributionGroupActions.loadDistributionGroupMembers({ payload: '1' }));
+  });
+
   it('should equal deleteDistributionGroupMemberSuccess after deleteDistributionGroupMember$', done => {
     spyOn(apiClient, 'deleteDistributionGroupMember').and.returnValue(of(null));
     effects.deleteDistributionGroupMember$.pipe(take(1)).subscribe(result => {
@@ -134,6 +162,15 @@
     actions$.next(distributionGroupActions.deleteDistributionGroupMember({ groupId: 'x', memberId: 'y' }));
   });
 
+  it('should equal deleteDistributionGroupMemberFail after deleteDistributionGroupMember$ Error', done => {
+    spyOn(apiClient, 'deleteDistributionGroupMember').and.returnValue(throwError('x'));
+    effects.deleteDistributionGroupMember$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.deleteDistributionGroupMemberFail({ payload: 'x' }));
+    });
+    done();
+    actions$.next(distributionGroupActions.deleteDistributionGroupMember({ groupId: 'x', memberId: 'y' }));
+  });
+
   it('should equal loadContactsSuccess after getContacts', done => {
     apiResponse = [new Contact({ id: '1' })];
     spyOn(apiClient, 'getContacts').and.returnValue(of(apiResponse));
@@ -144,6 +181,15 @@
     actions$.next(distributionGroupActions.loadContacts({ searchText: 'x' }));
   });
 
+  it('should equal loadContactsFail after getContacts Error', done => {
+    spyOn(apiClient, 'getContacts').and.returnValue(throwError('x'));
+    effects.getContacts$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.loadContactsFail({ payload: 'x' }));
+    });
+    done();
+    actions$.next(distributionGroupActions.loadContacts({ searchText: 'x' }));
+  });
+
   it('should equal createDistributionGroupMemberSuccess after createDistributionGroupMember was called', done => {
     apiResponse = [new DistributionGroupMember({ id: '1' })];
     spyOn(apiClient, 'postDistributionGroupMember').and.returnValue(of(apiResponse));
@@ -153,4 +199,32 @@
     done();
     actions$.next(distributionGroupActions.createDistributionGroupMember({ groupId: 'x', newMember: new DistributionGroupMember({ id: '1' }) }));
   });
+
+  it('should equal createDistributionGroupMemberFail after createDistributionGroupMember Error', done => {
+    spyOn(apiClient, 'postDistributionGroupMember').and.returnValue(throwError('x'));
+    effects.createDistributionGroupMember$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.createDistributionGroupMemberFail({ payload: 'x' }));
+    });
+    done();
+    actions$.next(distributionGroupActions.createDistributionGroupMember({ groupId: 'x', newMember: new DistributionGroupMember({ id: '1' }) }));
+  });
+
+  it('should equal loadDistributionGroupTextPlaceholdersSuccess after getDistributionTextPlaceholders was called', done => {
+    apiResponse = new DistributionGroupTextPlaceholder();
+    spyOn(apiClient, 'getDistributionGroupTextPlaceholders').and.returnValue(of(apiResponse));
+    effects.getDistributionTextPlaceholders$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.loadDistributionGroupTextPlaceholdersSuccess({ payload: apiResponse }));
+    });
+    done();
+    actions$.next(distributionGroupActions.loadDistributionGroupTextPlaceholders());
+  });
+
+  it('should equal loadDistributionGroupTextPlaceholdersFail after getDistributionTextPlaceholders Error', done => {
+    spyOn(apiClient, 'getDistributionGroupTextPlaceholders').and.returnValue(throwError('x'));
+    effects.getDistributionTextPlaceholders$.pipe(take(1)).subscribe(result => {
+      expect(result).toEqual(distributionGroupActions.loadDistributionGroupTextPlaceholdersFail({ payload: 'x' }));
+    });
+    done();
+    actions$.next(distributionGroupActions.loadDistributionGroupTextPlaceholders());
+  });
 });
diff --git a/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.ts b/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.ts
index bea4e51..ccf77da 100644
--- a/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.ts
+++ b/projects/grid-failure-information-app/src/app/shared/store/effects/distribution-groups.effect.ts
@@ -19,7 +19,7 @@
 import * as distributionGroupActions from '@grid-failure-information-app/shared/store/actions/distribution-groups.action';
 import { DistributionGroupApiClient } from '@grid-failure-information-app/pages/distribution-group/distribution-group-api-client';
 import { catchError, map, switchMap } from 'rxjs/operators';
-import { DistributionGroup } from '@grid-failure-information-app/shared/models';
+import { DistributionGroup, DistributionGroupTextPlaceholder } from '@grid-failure-information-app/shared/models';
 import { Store } from '@ngrx/store';
 
 @Injectable()
@@ -58,7 +58,7 @@
             this._store.dispatch(distributionGroupActions.loadDistributionGroups());
             return distributionGroupActions.saveDistributionGroupSuccess({ payload: item });
           }),
-          catchError(error => of(distributionGroupActions.saveDistributionGroupSuccess({ payload: error })))
+          catchError(error => of(distributionGroupActions.saveDistributionGroupFail({ payload: error })))
         );
       })
     )
@@ -135,5 +135,17 @@
     )
   );
 
+  getDistributionTextPlaceholders$: any = createEffect(() =>
+    this._actions$.pipe(
+      ofType(distributionGroupActions.loadDistributionGroupTextPlaceholders),
+      switchMap(() => {
+        return this._apiClient.getDistributionGroupTextPlaceholders().pipe(
+          map(item => distributionGroupActions.loadDistributionGroupTextPlaceholdersSuccess({ payload: item })),
+          catchError(error => of(distributionGroupActions.loadDistributionGroupTextPlaceholdersFail({ payload: error })))
+        );
+      })
+    )
+  );
+
   constructor(private _actions$: Actions, private _apiClient: DistributionGroupApiClient, private _store: Store<any>) {}
 }