KON-438 total commit without unit tests

Signed-off-by: Peter Buschmann <peter.buschmann@pta.de>
diff --git a/src/app/pages/contacts/contacts-list/contacts-list-column-definition.ts b/src/app/pages/contacts/contacts-list/contacts-list-column-definition.ts
index 8ca0601..940f047 100644
--- a/src/app/pages/contacts/contacts-list/contacts-list-column-definition.ts
+++ b/src/app/pages/contacts/contacts-list/contacts-list-column-definition.ts
@@ -77,6 +77,7 @@
   },
   {
     field: 'tools',
+    colId: 'tools',
     headerName: ' ',
     pinned: 'right',
     maxWidth: 110,
diff --git a/src/app/pages/contacts/contacts-list/contacts-list.component.html b/src/app/pages/contacts/contacts-list/contacts-list.component.html
index badcfa7..6a44871 100644
--- a/src/app/pages/contacts/contacts-list/contacts-list.component.html
+++ b/src/app/pages/contacts/contacts-list/contacts-list.component.html
@@ -23,6 +23,7 @@
           id="search-text"
           style="position: 0px;font-size: 13px; line-height:21px; color: #495057;"
           placeholder="Suche"
+          [ngModel]="modifiedContacts.searchText"
           (keyup)="setModifiedContactsSearchText($event.target.value); searchContacts($event)"
         />
 
@@ -30,6 +31,7 @@
           [required]="false"
           type="text"
           class="form-control item"
+          [ngModel]="modifiedContacts.contactTypeId"
           (change)="setModifiedContactsContactTypeId($event.target.value); searchContacts($event)"
         >
           <option value="{{ INTERNAL_PERSON }}">{{ 'Contacts.InternalContact' | translate }}</option>
@@ -44,7 +46,7 @@
             type="button"
             style="color: #495057;"
             class="btn btn-default btn-sm"
-            (click)="isDSGVOFilterAdvancedVisible = !isDSGVOFilterAdvancedVisible"
+            (click)="setDSGVOFilterAdvancedVisible()"
             title="{{ 'Contacts.DSGVO-advanced-filter' | translate }}"
           >
             DSGVO
@@ -55,6 +57,7 @@
               type="text"
               class="form-control"
               style="margin-right: 12px;"
+              [ngModel]="moduleDisplayName"
               (change)="setModifiedContactsModuleAssignmentFilter($event.target.value); searchContacts($event)"
             >
               <option *ngFor="let moduleType of userModuleAssignmentSandbox.userModuleTypes$ | async" [value]="moduleType.id">{{ moduleType.id }}</option>
@@ -63,7 +66,13 @@
             </select>
 
             <div class="dsgvo-filter-item custom-control custom-switch" title="{{ 'Contacts.DSGVO-advanced-filter-expiring-data-in-past' | translate }}">
-              <input type="checkbox" class="custom-control-input" id="expiry-date" (change)="setModifiedContactsExpiryDateFilter(); searchContacts($event)" />
+              <input
+                type="checkbox"
+                class="custom-control-input"
+                id="expiry-date"
+                [ngModel]="modifiedContacts.expiringDataInPast"
+                (change)="setModifiedContactsExpiryDateFilter(); searchContacts($event)"
+              />
               <label
                 class="custom-control-label"
                 style="position: 0px;font-size: 13px; white-space: nowrap; line-height:21px; color: #495057;"
@@ -82,6 +91,7 @@
                 type="checkbox"
                 class="custom-control-input"
                 id="deletion-lock-until"
+                [ngModel]="modifiedContacts.deletionLockExceeded"
                 (change)="setModifiedContactsDeletionLockExceedFilter(); searchContacts($event)"
               />
               <label
@@ -96,7 +106,13 @@
       </div>
 
       <div class="sorting-options diverse-options-item">
-        <select [required]="false" type="text" class="form-control item" (change)="setSortingContactType($event.target.value); sortContacts()">
+        <select
+          [required]="false"
+          type="text"
+          class="form-control item"
+          [ngModel]="modifiedContacts.sort ? modifiedContacts.sort.substring(0, modifiedContacts.sort.indexOf(',')) : ''"
+          (change)="setSortingContactType($event.target.value); sortContacts()"
+        >
           <option value="name">{{ 'Contacts.Name' | translate }}</option>
           <option value="contactType">{{ 'Contacts.ContactType' | translate }}</option>
           <option value="note">{{ 'Contacts.Note' | translate }}</option>
@@ -106,7 +122,13 @@
           <option value="" selected>{{ 'NoSorting' | translate }}</option>
         </select>
 
-        <select [required]="false" type="text" class="form-control item" (change)="setSortingOrder($event.target.value); sortContacts()">
+        <select
+          [required]="false"
+          type="text"
+          class="form-control item"
+          [ngModel]="modifiedContacts.sort ? modifiedContacts.sort.substring(modifiedContacts.sort.indexOf(',') + 1) : 'asc'"
+          (change)="setSortingOrder($event.target.value); sortContacts()"
+        >
           <option value="asc" selected>{{ 'AscendingSorting' | translate }}</option>
           <option value="desc">{{ 'DescendingSorting' | translate }}</option>
         </select>
@@ -123,6 +145,7 @@
     </div>
 
     <ag-grid-angular
+      (currentPageNumber)="contactsSandbox.setCurrentPageNumber($event)"
       [serverside]="contactsSandbox.serversideModel"
       [queryParameter]="modifiedContacts"
       autoResizeColumns
diff --git a/src/app/pages/contacts/contacts-list/contacts-list.component.ts b/src/app/pages/contacts/contacts-list/contacts-list.component.ts
index 8576d49..daefb2f 100644
--- a/src/app/pages/contacts/contacts-list/contacts-list.component.ts
+++ b/src/app/pages/contacts/contacts-list/contacts-list.component.ts
@@ -10,7 +10,7 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
-import { Component } from '@angular/core';
+import { Component, OnInit, OnDestroy } from '@angular/core';
 import { ContactsSandbox } from '@pages/contacts/contacts.sandbox';
 import { CONTACTS_COLDEF } from '@pages/contacts/contacts-list/contacts-list-column-definition';
 import { BaseList } from '@shared/components/base-components/base.list';
@@ -18,13 +18,15 @@
 import { Globals } from '@shared/constants/globals';
 import { ModifiedContacts } from '@shared/models/modifiedContacts.model';
 import { UserModuleAssignmentSandBox } from '@shared/components/list-details-view/user-module-assignment/user-module-assignment.sandbox';
+import { ColumnMovedEvent, GridReadyEvent } from 'ag-grid-community';
+import { Subscription } from 'rxjs';
 
 @Component({
   selector: 'app-contacts-list',
   templateUrl: './contacts-list.component.html',
   styleUrls: ['./contacts-list.component.scss'],
 })
-export class ContactsListComponent extends BaseList {
+export class ContactsListComponent extends BaseList implements OnInit, OnDestroy {
   public readonly NEW_EXTERNAL_PERSON_PATH = `/${Globals.PATH.PERSONS}/${Globals.PATH.EXTERNAL}/${Globals.PATH.NEW}`;
   public readonly NEW_INTERNAL_PERSON_PATH = `/${Globals.PATH.PERSONS}/${Globals.PATH.INTERNAL}/${Globals.PATH.NEW}`;
   public readonly NEW_COMPANY_PATH = `/${Globals.PATH.COMPANY}/${Globals.PATH.NEW}`;
@@ -37,11 +39,13 @@
   public columnDefinition: any = CONTACTS_COLDEF;
   public modifiedContacts: ModifiedContacts = new ModifiedContacts();
   public isDSGVOFilterAdvancedVisible = false;
+  public moduleDisplayName: string = '';
 
   private _sortingOrder: string = 'asc';
   private _sortingContactType: string = '';
   private _expiringDataInPast = false;
   private _deletionLockExceeded = false;
+  private _subscription: Subscription;
 
   constructor(public contactsSandbox: ContactsSandbox, public userModuleAssignmentSandbox: UserModuleAssignmentSandBox, private router: Router) {
     super();
@@ -52,11 +56,42 @@
       ...this.gridOptions,
       localeText: Globals.LOCALE_TEXT,
     };
+    // save / retrieve column positions
+    this.gridOptions.onColumnMoved = this._saveColumnPositions.bind(this);
+    this.gridOptions.onGridReady = this._restoreColumnPositions.bind(this);
+    // context
     this.gridOptions.context = {
       ...this.gridOptions.context,
       icons: { edit: true, delete: false },
     };
-    this.gridOptions.context.eventSubject.subscribe(this._handleBusEvents.bind(this));
+    // handling icon events
+    this._subscription = this.gridOptions.context.eventSubject.subscribe(this._handleBusEvents.bind(this));
+    // save filter / search config
+    if (JSON.parse(sessionStorage.getItem(Globals.SESSSION_STORAGE_KEYS.contactListSearchFilterKey))) {
+      this.modifiedContacts = JSON.parse(sessionStorage.getItem(Globals.SESSSION_STORAGE_KEYS.contactListSearchFilterKey));
+      if (this.modifiedContacts.sort) {
+        //sonst wird bei rückkehr aus navigation die sort property null gesetzt (via _setModifiedContactsSort)
+        this._sortingContactType = this.modifiedContacts.sort.substring(0, this.modifiedContacts.sort.indexOf(','));
+        this._sortingOrder = this.modifiedContacts.sort.substring(this.modifiedContacts.sort.indexOf(',') + 1);
+      }
+      this.isDSGVOFilterAdvancedVisible = this.modifiedContacts.isDSGVOFilterAdvancedVisible;
+      this._expiringDataInPast = this.modifiedContacts.expiringDataInPast;
+      this._deletionLockExceeded = this.modifiedContacts.deletionLockExceeded;
+      // modifiedContacts modulWerte zurueckuebersetzen in Display modulWerte
+      this.setModifiedContactsModuleAssignmentFilterDisplayValues(this.modifiedContacts.moduleName, this.modifiedContacts.withoutAssignedModule);
+    }
+  }
+
+  private _saveColumnPositions(event: ColumnMovedEvent) {
+    let columnState = JSON.stringify(event.columnApi.getColumnState());
+    sessionStorage.setItem(Globals.SESSSION_STORAGE_KEYS.contactListColumnStateKey, columnState);
+  }
+
+  private _restoreColumnPositions(event: GridReadyEvent) {
+    let columnState = JSON.parse(sessionStorage.getItem(Globals.SESSSION_STORAGE_KEYS.contactListColumnStateKey));
+    if (columnState) {
+      event.columnApi.setColumnState(columnState);
+    }
   }
 
   private _handleBusEvents(event: any): any {
@@ -66,9 +101,6 @@
       case 'edit':
         this._navigateToDetails(event);
         break;
-      case 'delete':
-        // this._openDialog(event);
-        break;
       default:
         break;
     }
@@ -125,6 +157,19 @@
     }
   }
 
+  public setModifiedContactsModuleAssignmentFilterDisplayValues(moduleName: string, withoutAssignedModule: boolean) {
+    if (!moduleName && withoutAssignedModule) {
+      //show contacts without module assignments
+      this.moduleDisplayName = '-1';
+    } else if (!moduleName && !withoutAssignedModule) {
+      //show contacts with all module assignments
+      this.moduleDisplayName = '';
+    } else {
+      //show contacts with specific module assignments
+      this.moduleDisplayName = moduleName;
+    }
+  }
+
   public setModifiedContactsExpiryDateFilter() {
     this._expiringDataInPast = !this._expiringDataInPast;
     this.modifiedContacts.expiringDataInPast = this._expiringDataInPast;
@@ -146,24 +191,38 @@
   public searchContacts(event) {
     if (event.type == 'click' || event.type == 'change' || (event.type == 'keyup' && event.key == 'Enter')) {
       this.modifiedContacts = { ...this.modifiedContacts };
-    } else {
       setTimeout(() => {
         this.modifiedContacts = { ...this.modifiedContacts };
       }, 1000);
+      sessionStorage.setItem(Globals.SESSSION_STORAGE_KEYS.contactListSearchFilterKey, JSON.stringify(this.modifiedContacts));
     }
   }
 
   public sortContacts() {
     this._setModifiedContactsSort();
     this.modifiedContacts = { ...this.modifiedContacts };
+    console.log(this.modifiedContacts);
+    sessionStorage.setItem(Globals.SESSSION_STORAGE_KEYS.contactListSearchFilterKey, JSON.stringify(this.modifiedContacts));
   }
 
   private _setModifiedContactsSort() {
     if (this._sortingOrder && this._sortingContactType) {
       const sort = this._sortingContactType + ',' + this._sortingOrder;
       this.modifiedContacts.sort = sort;
+      sessionStorage.setItem(Globals.SESSSION_STORAGE_KEYS.contactListSearchFilterKey, JSON.stringify(this.modifiedContacts));
     } else {
       this.modifiedContacts.sort = null;
+      sessionStorage.setItem(Globals.SESSSION_STORAGE_KEYS.contactListSearchFilterKey, JSON.stringify(this.modifiedContacts));
     }
   }
+
+  public setDSGVOFilterAdvancedVisible() {
+    this.isDSGVOFilterAdvancedVisible = !this.isDSGVOFilterAdvancedVisible;
+    this.modifiedContacts.isDSGVOFilterAdvancedVisible = this.isDSGVOFilterAdvancedVisible;
+    sessionStorage.setItem(Globals.SESSSION_STORAGE_KEYS.contactListSearchFilterKey, JSON.stringify(this.modifiedContacts));
+  }
+
+  ngOnDestroy() {
+    this._subscription.unsubscribe();
+  }
 }
diff --git a/src/app/pages/contacts/contacts.sandbox.spec.ts b/src/app/pages/contacts/contacts.sandbox.spec.ts
index 0151399..d799383 100644
--- a/src/app/pages/contacts/contacts.sandbox.spec.ts
+++ b/src/app/pages/contacts/contacts.sandbox.spec.ts
@@ -1,4 +1,4 @@
- /********************************************************************************
+/********************************************************************************
  * Copyright (c) 2020 Contributors to the Eclipse Foundation
  *
  * See the NOTICE file(s) distributed with this work for additional
@@ -11,7 +11,7 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 import { ContactsSandbox } from '@pages/contacts/contacts.sandbox';
-import { Store, ActionsSubject} from '@ngrx/store';
+import { Store, ActionsSubject } from '@ngrx/store';
 import { State } from '@shared/store';
 import { UtilService } from '@shared/utility/utility.service';
 import { of } from 'rxjs';
@@ -22,7 +22,7 @@
   let appState: Store<State>;
 
   beforeEach(() => {
-    appState = { dispatch:()=> {}, pipe: () => of(true), select:()=> of(true) } as any;
+    appState = { dispatch: () => {}, pipe: () => of(true), select: () => of(true) } as any;
 
     service = new ContactsSandbox(appState);
   });
@@ -31,5 +31,4 @@
     expect(service).toBeTruthy();
     expect(service).toBeDefined();
   });
-
 });
diff --git a/src/app/pages/contacts/contacts.sandbox.ts b/src/app/pages/contacts/contacts.sandbox.ts
index 4bce18f..85763d4 100644
--- a/src/app/pages/contacts/contacts.sandbox.ts
+++ b/src/app/pages/contacts/contacts.sandbox.ts
@@ -1,15 +1,15 @@
 /********************************************************************************
-* 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
-********************************************************************************/
+ * 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
+ ********************************************************************************/
 import { BaseListSandbox } from '@shared/sandbox/base-list.sandbox';
 import { Injectable } from '@angular/core';
 import { Store } from '@ngrx/store';
@@ -20,8 +20,6 @@
 
 @Injectable()
 export class ContactsSandbox extends BaseListSandbox {
-
-  public serversideModel: ServerSideModel;
   public contactListLoading$: Observable<boolean> = this.appState$.select(store.getContactsPageLoading);
 
   /**
@@ -37,10 +35,12 @@
   constructor(protected appState$: Store<store.State>) {
     super(appState$);
     this.serversideModel = {
-      loadAction: contactsActions.loadContactsPage,
-      successAction: contactsActions.loadContactsPageSuccess,
-      pageSize: this.pageSize,
+      ...this.serversideModel,
+      ...{
+        loadAction: contactsActions.loadContactsPage,
+        successAction: contactsActions.loadContactsPageSuccess,
+        pageSize: this.pageSize,
+      },
     };
   }
-
 }
diff --git a/src/app/shared/components/anonymizer/anonymizer.component.ts b/src/app/shared/components/anonymizer/anonymizer.component.ts
index 7dc2348..4b55552 100644
--- a/src/app/shared/components/anonymizer/anonymizer.component.ts
+++ b/src/app/shared/components/anonymizer/anonymizer.component.ts
@@ -26,9 +26,11 @@
   public anonymizeContact(): void {
     this._sandbox.anonymizeContact(this.contactId);
   }
+
   ngOnInit() {
     this._sandbox.init();
   }
+
   ngOnDestroy() {
     this._sandbox.endSubscriptions();
     this.contactId = null;
diff --git a/src/app/shared/components/anonymizer/anonymizer.sandbox.ts b/src/app/shared/components/anonymizer/anonymizer.sandbox.ts
index f6898bd..83302b7 100644
--- a/src/app/shared/components/anonymizer/anonymizer.sandbox.ts
+++ b/src/app/shared/components/anonymizer/anonymizer.sandbox.ts
@@ -26,6 +26,7 @@
   constructor(protected appState$: Store<store.State>, protected actionsSubject: ActionsSubject, protected router: Router, protected modalService: NgbModal) {
     super(appState$);
   }
+
   public init() {
     this.actionsSubject.pipe(ofType(contactsActions.anonymizeContactSuccess), takeUntil(this._endSubscriptions$)).subscribe(() => {
       this.router.navigateByUrl(`/overview`);
diff --git a/src/app/shared/components/header/header.component.spec.ts b/src/app/shared/components/header/header.component.spec.ts
index 4e4a858..5ad067a 100644
--- a/src/app/shared/components/header/header.component.spec.ts
+++ b/src/app/shared/components/header/header.component.spec.ts
@@ -15,10 +15,14 @@
 describe('HeaderComponent', () => {
   let component: HeaderComponent;
   let router: any;
+  let sessionStorage: any;
+  let window: any;
 
   beforeEach(() => {
     router = { navigateByUrl() {} } as any;
     component = new HeaderComponent(router);
+    window = { location: { reload() {} } } as any;
+    sessionStorage = { clear() {} } as any;
   });
 
   it('should create', () => {
@@ -26,8 +30,10 @@
   });
 
   it('should navigate to overview after call navigateToOverview', () => {
-    const spy = spyOn(router, 'navigateByUrl');
+    const spy1 = spyOn<any>(component, '_winLocReload').and.callFake(function() {});
+    const spy2 = spyOn(router, 'navigateByUrl');
     component.navigateToOverview();
-    expect(spy).toHaveBeenCalledWith('/overview');
+    expect(spy1).toHaveBeenCalled();
+    expect(spy2).toHaveBeenCalled();
   });
 });
diff --git a/src/app/shared/components/header/header.component.ts b/src/app/shared/components/header/header.component.ts
index a7b2832..9063608 100644
--- a/src/app/shared/components/header/header.component.ts
+++ b/src/app/shared/components/header/header.component.ts
@@ -31,6 +31,13 @@
   constructor(public router: Router) {}
 
   public navigateToOverview(): void {
+    // reset contacts state
+    sessionStorage.clear();
+    this._winLocReload();
     navigateToOverview(this.router);
   }
+
+  private _winLocReload(): void {
+    window.location.reload();
+  }
 }
diff --git a/src/app/shared/components/list-details-view/user-module-assignment/user-module-assignment.sandbox.ts b/src/app/shared/components/list-details-view/user-module-assignment/user-module-assignment.sandbox.ts
index 915fe65..674220c 100644
--- a/src/app/shared/components/list-details-view/user-module-assignment/user-module-assignment.sandbox.ts
+++ b/src/app/shared/components/list-details-view/user-module-assignment/user-module-assignment.sandbox.ts
@@ -53,6 +53,7 @@
     protected modalService: NgbModal
   ) {
     super(appState$);
+    this.loadFilteredUserModuleTypes();
   }
 
   public dateValueConverter: NgrxValueConverter<Date | null | Moment, string | null> = dateValueConverter;
diff --git a/src/app/shared/components/paginator/paginator.component.spec.ts b/src/app/shared/components/paginator/paginator.component.spec.ts
index 626b959..7251421 100644
--- a/src/app/shared/components/paginator/paginator.component.spec.ts
+++ b/src/app/shared/components/paginator/paginator.component.spec.ts
@@ -1,4 +1,4 @@
- /********************************************************************************
+/********************************************************************************
  * Copyright (c) 2020 Contributors to the Eclipse Foundation
  *
  * See the NOTICE file(s) distributed with this work for additional
@@ -16,105 +16,95 @@
 describe('PaginatorComponent', () => {
   let component: PaginatorComponent;
 
-  beforeEach(async(() => {
-  }));
+  beforeEach(async(() => {}));
 
   beforeEach(() => {
     component = new PaginatorComponent();
   });
 
-  it('should create', () => {    
+  it('should create', () => {
     expect(component).toBeTruthy();
     expect(component).toBeDefined();
   });
 
-  it('checks if setter and getter visibleItemsAmount is called and works', () => {    
+  it('checks if setter and getter visibleItemsAmount is called and works', () => {
     component.visibleItemsAmount = 10;
     expect(component.visibleItemsAmount).toBe(10);
   });
 
-  it('checks if setter and getter totalPages is called and works', () => {    
+  it('checks if setter and getter totalPages is called and works', () => {
     component.totalPages = 15;
     expect(component.totalPages).toBe(15);
   });
 
-  it('return totalPages if totalPages are lesser then visibleItemsAmount', () => {    
+  it('return totalPages if totalPages are lesser then visibleItemsAmount', () => {
     component.visibleItemsAmount = 15;
-    component.totalPages = 10;    
+    component.totalPages = 10;
     expect(component.visibleItemsAmount).toBe(10);
   });
 
-  it('check if isPagingActive works', () => {    
-    component.totalPages = 1;    
+  it('check if isPagingActive works', () => {
+    component.totalPages = 1;
     expect(component.isPagingActive).toBeFalsy();
-    component.totalPages = 2;            
-    expect(component.isPagingActive).toBeTruthy();    
+    component.totalPages = 2;
+    expect(component.isPagingActive).toBeTruthy();
   });
 
-  it('check if setNextPage works', () => {    
-    component.totalPages = 5;            
-    expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);    
-    component.setNextPage();  
-    expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(2);    
+  it('check if setNextPage works', () => {
+    component.totalPages = 5;
+    expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);
+    component.setNextPage();
+    expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(2);
   });
 
-  it('check if setPreviousPage works', () => {    
-    component.totalPages = 5;        
-    component.setNextPage();    
-    component.setPreviousPage();    
+  it('check if setPreviousPage works', () => {
+    component.totalPages = 5;
+    component.setNextPage();
+    component.setPreviousPage();
     expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);
   });
 
-  it('check if setPreviousPage works on page 1', () => {    
-    component.totalPages = 5;            
+  it('check if setPreviousPage works on page 1', () => {
+    component.totalPages = 5;
     expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);
-    component.setPreviousPage();    
+    component.setPreviousPage();
     expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);
   });
 
-  xit('check if setLastPage works', () => {    
-    component.totalPages = 10;        
-    component.setLastPage();    
-    // console.log(component.currentPageIndex);    
-    // console.log(component.pageEventItems[0]);    
-    // console.log(component.pageEventItems[component.currentPageIndex].pageIndex);        
+  xit('check if setLastPage works', () => {
+    component.totalPages = 10;
+    component.setLastPage();
+    // console.log(component.currentPageIndex);
+    // console.log(component.pageEventItems[0]);
+    // console.log(component.pageEventItems[component.currentPageIndex].pageIndex);
     expect(component.currentPageIndex).toBe(5);
   });
 
-  it('check if setFirstPage works on first page', () => {    
-    component.totalPages = 10;        
-    component.setFirstPage(); 
+  it('check if setFirstPage works on first page', () => {
+    component.totalPages = 10;
+    component.setFirstPage();
     expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);
   });
 
-  it('check if setFirstPage works on <> first page', () => {    
-    component.totalPages = 10;  
-    component.setNextPage();          
-    component.setFirstPage(); 
-    expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);
-  });
-
-  it('check if isLastPageLastIcon works', () => {    
-    component.totalPages = 2;  
+  it('check if setFirstPage works on <> first page', () => {
+    component.totalPages = 10;
     component.setNextPage();
-    let isLastPageLastIcon = component.isLastPageLastIcon();              
+    component.setFirstPage();
+    expect(component.pageEventItems[component.currentPageIndex].pageIndex).toBe(1);
+  });
+
+  it('check if isLastPageLastIcon works', () => {
+    component.totalPages = 2;
+    component.setNextPage();
+    let isLastPageLastIcon = component.isLastPageLastIcon();
     expect(isLastPageLastIcon).toBeTruthy();
   });
 
-  xit('check if isLastPageLastIcon works', () => {    
-    component.totalPages = 6;  
+  xit('check if isLastPageLastIcon works', () => {
+    component.totalPages = 6;
     component.setNextPage();
-    let isLastPageLastIcon = component.isLastPageLastIcon();          
-    // console.log(component.pageEventItems[component.currentPageIndex].pageIndex);        
+    let isLastPageLastIcon = component.isLastPageLastIcon();
+    // console.log(component.pageEventItems[component.currentPageIndex].pageIndex);
     expect(isLastPageLastIcon).toBeFalsy();
   });
-
-
-
-
-
-  
-
-
-
 });
diff --git a/src/app/shared/components/paginator/paginator.component.ts b/src/app/shared/components/paginator/paginator.component.ts
index a110106..12f00b4 100644
--- a/src/app/shared/components/paginator/paginator.component.ts
+++ b/src/app/shared/components/paginator/paginator.component.ts
@@ -29,6 +29,11 @@
   pageSize: number;
 
   @Input()
+  public set currrentPageNumber(pageNumber: number) {
+    this._setActivePage({ pageIndex: pageNumber });
+  }
+
+  @Input()
   public set visibleItemsAmount(visibleItemsAmount: number) {
     this._visibleItemsAmount = visibleItemsAmount;
   }
diff --git a/src/app/shared/constants/globals.ts b/src/app/shared/constants/globals.ts
index a412170..8cd5656 100644
--- a/src/app/shared/constants/globals.ts
+++ b/src/app/shared/constants/globals.ts
@@ -47,5 +47,10 @@
     notEqual: 'ist nicht gleich',
   };
 
+  static SESSSION_STORAGE_KEYS = {
+    contactListSearchFilterKey: 'contactListSearchFilter',
+    contactListColumnStateKey: 'contactListColumnState',
+  };
+
   public static HELP_URL: string = 'http://www.google.de';
 }
diff --git a/src/app/shared/directives/agGrid/server-side.directive.spec.ts b/src/app/shared/directives/agGrid/server-side.directive.spec.ts
index 279af24..80ec6da 100644
--- a/src/app/shared/directives/agGrid/server-side.directive.spec.ts
+++ b/src/app/shared/directives/agGrid/server-side.directive.spec.ts
@@ -1,4 +1,4 @@
- /********************************************************************************
+/********************************************************************************
  * Copyright (c) 2020 Contributors to the Eclipse Foundation
  *
  * See the NOTICE file(s) distributed with this work for additional
@@ -10,11 +10,11 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
-import { ServerSideDirective } from './server-side.directive'
+import { ServerSideDirective } from './server-side.directive';
 
 describe('ServerSideDirective', () => {
-    it('should create an instance', () => {
-        const directive = new ServerSideDirective(null,null,null,null,null);
-        expect(directive).toBeTruthy()
-    })
-})
+  it('should create an instance', () => {
+    const directive = new ServerSideDirective(null, null, null, null, null);
+    expect(directive).toBeTruthy();
+  });
+});
diff --git a/src/app/shared/directives/agGrid/server-side.directive.ts b/src/app/shared/directives/agGrid/server-side.directive.ts
index 9087173..b8da780 100644
--- a/src/app/shared/directives/agGrid/server-side.directive.ts
+++ b/src/app/shared/directives/agGrid/server-side.directive.ts
@@ -1,3 +1,4 @@
+import { EventEmitter } from '@angular/core';
 /********************************************************************************
  * Copyright (c) 2020 Contributors to the Eclipse Foundation
  *
@@ -16,7 +17,7 @@
 import { AgGridAngular } from 'ag-grid-angular';
 import { take, map } from 'rxjs/operators';
 import { ServerSideModel } from '@shared/models/server-side.model';
-import { Directive, Input, AfterViewInit, ComponentFactoryResolver, ViewContainerRef, ComponentFactory, OnInit } from '@angular/core';
+import { Directive, Input, AfterViewInit, ComponentFactoryResolver, ViewContainerRef, ComponentFactory, OnInit, Output } from '@angular/core';
 import { Store, ActionsSubject } from '@ngrx/store';
 
 import * as store from '@shared/store';
@@ -39,6 +40,10 @@
   private _queryParameter: any;
 
   private _matPaginator: PaginatorComponent;
+
+  @Output()
+  public currentPageNumber: EventEmitter<number> = new EventEmitter();
+
   @Input()
   public serverside: ServerSideModel;
 
@@ -50,6 +55,7 @@
           payload: {
             queryParameter: query,
             pageSize: this.serverside.pageSize,
+            pageNumber: this.serverside.pageNumber,
           } as PageRequestInterface,
         })
       );
@@ -88,20 +94,18 @@
         if (!this._matPaginator) {
           const paginator: ComponentFactory<PaginatorComponent> = this._resolver.resolveComponentFactory(PaginatorComponent);
           this._matPaginator = this._viewContainerRef.createComponent(paginator).instance;
-
         }
-        if( this._matPaginator.totalPages !== pagedItem.totalPages){
+        if (this._matPaginator.totalPages !== pagedItem.totalPages) {
           this._matPaginator.totalPages = pagedItem.totalPages;
         }
 
         this._matPaginator.length = pagedItem.totalElements;
         this._matPaginator.pageSize = pagedItem.pageable.pageSize || 1;
         this._matPaginator.hidePageSize = false;
-
         this._matPaginator.page.subscribe((selectedpage: PageEvent) => {
           this._retrievePage(selectedpage);
         });
-
+        this._matPaginator.currrentPageNumber = this.serverside.pageNumber;
         if (!!this._agGrid.api) {
           this._agGrid.api.setRowData(pagedItem.content);
         } else {
@@ -109,7 +113,7 @@
         }
       });
 
-    this._retrievePage();
+    this._retrievePage({ pageIndex: this.serverside.pageNumber });
   }
 
   /**
@@ -119,6 +123,7 @@
    * @memberof ServerSideDirective
    */
   private _retrievePage(event?: PageEvent) {
+    this.currentPageNumber.emit(event.pageIndex);
     this.appState$.dispatch(
       this.serverside.loadAction({
         payload: {
diff --git a/src/app/shared/models/modifiedContacts.model.ts b/src/app/shared/models/modifiedContacts.model.ts
index e7817a9..ab6c092 100644
--- a/src/app/shared/models/modifiedContacts.model.ts
+++ b/src/app/shared/models/modifiedContacts.model.ts
@@ -1,9 +1,20 @@
-import { Contact } from '@shared/models';
-
+/********************************************************************************
+ * 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 ModifiedContacts {
   public searchText: string = null;
   public contactTypeId: string = '';
   public sort: string = null;
+  public isDSGVOFilterAdvancedVisible: boolean = null;
   public moduleName: string = null;
   public withoutAssignedModule: boolean = null;
   public expiringDataInPast: boolean = null;
diff --git a/src/app/shared/models/server-side.model.ts b/src/app/shared/models/server-side.model.ts
index 4085140..66e3250 100644
--- a/src/app/shared/models/server-side.model.ts
+++ b/src/app/shared/models/server-side.model.ts
@@ -1,4 +1,4 @@
- /********************************************************************************
+/********************************************************************************
  * Copyright (c) 2020 Contributors to the Eclipse Foundation
  *
  * See the NOTICE file(s) distributed with this work for additional
@@ -13,10 +13,11 @@
 import { Action } from '@ngrx/store';
 
 export class ServerSideModel {
-  loadAction: any;
+  loadAction?: any;
   successAction?: any;
   pageSize?: number;
-  filter?:any;
+  filter?: any;
+  pageNumber?: number = 1;
 
   constructor() {}
 }
diff --git a/src/app/shared/sandbox/base-list.sandbox.ts b/src/app/shared/sandbox/base-list.sandbox.ts
index 0dc7a08..bc4440a 100644
--- a/src/app/shared/sandbox/base-list.sandbox.ts
+++ b/src/app/shared/sandbox/base-list.sandbox.ts
@@ -1,4 +1,4 @@
- /********************************************************************************
+/********************************************************************************
  * Copyright (c) 2020 Contributors to the Eclipse Foundation
  *
  * See the NOTICE file(s) distributed with this work for additional
@@ -11,8 +11,13 @@
  * SPDX-License-Identifier: EPL-2.0
  ********************************************************************************/
 import { BaseSandbox } from '@shared/sandbox/base.sandbox';
+import { ServerSideModel } from '@shared/models/server-side.model';
 
-export abstract class BaseListSandbox extends BaseSandbox
-{
-    protected pageSize: number = 10;
+export abstract class BaseListSandbox extends BaseSandbox {
+  protected pageSize: number = 10;
+  public serversideModel: ServerSideModel = new ServerSideModel();
+
+  public setCurrentPageNumber(pageNumber: number): void {
+    this.serversideModel = { ...this.serversideModel, pageNumber: pageNumber };
+  }
 }