Merge branch 'DEVELOP_FE' of ssh://git.eclipse.org/gitroot/elogbook/portalFE into DEVELOP_FE
diff --git a/karma.conf.js b/karma.conf.js
index 589e10a..ce83f8c 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -11,15 +11,15 @@
       require('karma-jasmine-html-reporter'),
       require('karma-coverage-istanbul-reporter'),
       require('karma-junit-reporter'),
-      require('@angular/cli/plugins/karma')      
+      require('@angular/cli/plugins/karma')
     ],
     client: {
       clearContext: false // leave Jasmine Spec Runner output visible in browser
     },
     files: [{
-        pattern: './src/test.ts',
-        watched: false
-      }
+      pattern: './src/test.ts',
+      watched: false
+    }
       //{ pattern: './node_modules/bootstrap/dist/js/bootstrap.min.js', included: false, watched: false },
       //{ pattern: './node_modules/jquery/dist/jquery.min.js', included: false, watched: false }
     ],
@@ -43,15 +43,15 @@
       outputDir: 'unittests',
       outputFile: 'test-results.xml'
     },
-    port: 9877,
+    port: 9876,
     colors: true,
-    logLevel: config.LOG_DEBUG,
+    logLevel: config.LOG_INFO,
     autoWatch: true,
     browsers: ['ChromeDebugging'],
     customLaunchers: {
       ChromeDebugging: {
         base: 'Chrome',
-        flags: ['--remote-debugging-port=9334']
+        flags: ['--remote-debugging-port=9333']
       }
     },
     singleRun: false
diff --git a/package.json b/package.json
index 99e09a1..3c430f8 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,7 @@
     "zone.js": "^0.8.4"
   },
   "devDependencies": {
-    "@angular/cli": "1.6.1",
+    "@angular/cli": "1.7.3",
     "@angular/compiler-cli": "^4.0.0",
     "@types/jasmine": "2.5.38",
     "@types/node": "~6.0.60",
diff --git a/src/app/pages/module-grid/module-grid.component.css b/src/app/pages/module-grid/module-grid.component.css
index c4a0646..9d64336 100644
--- a/src/app/pages/module-grid/module-grid.component.css
+++ b/src/app/pages/module-grid/module-grid.component.css
@@ -9,6 +9,7 @@
 * 
 ******************************************************************************
 */
+
 #topcontainer {
     height: 20px;
 }
@@ -22,15 +23,27 @@
     height: 30px;
 }
 
-a:link { text-decoration: none; color: white; }
-a:hover { text-decoration: none; color: white; }
-a:visited { text-decoration: none; color: white;}
+a:link {
+    text-decoration: none;
+    color: white;
+}
+
+a:hover {
+    text-decoration: none;
+    color: white;
+}
+
+a:visited {
+    text-decoration: none;
+    color: white;
+}
 
 ::ng-deep md-grid-tile.mat-grid-tile {
     width: calc(((25% - 0.75px) * 1) - 20px) !important;
 }
 
 /* Grow */
+
 .hvr-grow {
     display: inline-block;
     vertical-align: middle;
@@ -53,109 +66,135 @@
     position: absolute;
     z-index: -1;
     width: 3px;
-    height: 4%; }
-  
-  .underline-opening:hover:after {
+    height: 4%;
+}
+
+.underline-opening:hover:after {
     width: 100%;
-    height: 4%; }
-  
-  .underline-opening:before {
+    height: 4%;
+}
+
+.underline-opening:before {
     content: "";
     position: absolute;
     z-index: -1;
     width: 3px;
-    height: 4%; }
-  
-  .underline-opening:hover:before {
+    height: 4%;
+}
+
+.underline-opening:hover:before {
     width: 100%;
-    height: 4%; }
-  
-  .underline-opening:after {
+    height: 4%;
+}
+
+.underline-opening:after {
     bottom: 0%;
     left: 0%;
     right: 0;
-    margin: 0 auto; }
-  
-  .underline-opening:before {
+    margin: 0 auto;
+}
+
+.underline-opening:before {
     bottom: 0%;
     right: 0%;
     left: 0;
-    margin: 0 auto; }
+    margin: 0 auto;
+}
 
-    /* Base */
+/* Base */
 
-    .element {
-        display: inline;
-        position: relative;
-        z-index: 2;
-        text-decoration: none;
-        box-sizing: border-box;
-        -moz-box-sizing: border-box;
-        -webkit-box-sizing: border-box;
-        -webkit-user-select: none; 
-        -moz-user-select: none; 
-        -ms-user-select: none; 
-        user-select: none; 
-        -webkit-touch-callout: none; 
-        -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 
-        padding: 2px 0px;
-        white-space: nowrap;
-        overflow: hidden;
-        -webkit-transition: color 1s ease;
-        -moz-transition: color 1s ease;
-        -ms-transition: color 1s ease;
-        -o-transition: color 1s ease;
-        transition: color 1s ease;
-    }
-    
-    .element:hover,
-    .element:focus {
-        outline: 0;
-        color: #FFFFFF;
-        -webkit-transition: color 1s ease;
-        -moz-transition: color 1s ease;
-        -ms-transition: color 1s ease;
-        -o-transition: color 1s ease;
-        transition: color 1s ease;
-        cursor: pointer;
-    }
-    
-    .element:before {
-        -webkit-transition: all 1s ease; /* add delay if wanted */
-        -moz-transition: all 1s ease; /* add delay if wanted */
-        -ms-transition: all 1s ease; /* add delay if wanted */
-        -o-transition: all 1s ease; /* add delay if wanted */
-        transition: all 1s ease; /* add delay if wanted */      
-        width: 0%;  
-    }
-    
-    .element:after {
-        -webkit-transition: all 1s ease; /* add delay if wanted */
-        -moz-transition: all 1s ease; /* add delay if wanted */
-        -ms-transition: all 1s ease; /* add delay if wanted */
-        -o-transition: all 1s ease; /* add delay if wanted */
-        transition: all 1s ease; /* add delay if wanted */	            
-        width: 0%;
-    }
-    
-    .element:hover:after,
-    .element:focus:after {
-        outline: 0;
-        background-color:#fff;
-        -webkit-transition:  all 1s ease; /* add delay if wanted */
-           -moz-transition:  all 1s ease; /* add delay if wanted */
-            -ms-transition:  all 1s ease; /* add delay if wanted */
-             -o-transition:  all 1s ease; /* add delay if wanted */
-                transition:  all 1s ease; /* add delay if wanted */
-    }
-    
-    .element:hover:before,
-    .element:focus:before {
-        outline: 0;
-        background-color: #fff;
-        -webkit-transition:  all 1s ease; /* add delay if wanted */
-           -moz-transition:  all 1s ease; /* add delay if wanted */
-            -ms-transition:  all 1s ease; /* add delay if wanted */
-             -o-transition:  all 1s ease; /* add delay if wanted */
-                transition:  all 1s ease; /* add delay if wanted */
-    }
+.element {
+    display: inline;
+    position: relative;
+    z-index: 2;
+    text-decoration: none;
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    -webkit-touch-callout: none;
+    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+    padding: 2px 0px;
+    white-space: nowrap;
+    overflow: hidden;
+    -webkit-transition: color 1s ease;
+    -moz-transition: color 1s ease;
+    -ms-transition: color 1s ease;
+    -o-transition: color 1s ease;
+    transition: color 1s ease;
+}
+
+.element:hover,
+.element:focus {
+    outline: 0;
+    color: #FFFFFF;
+    -webkit-transition: color 1s ease;
+    -moz-transition: color 1s ease;
+    -ms-transition: color 1s ease;
+    -o-transition: color 1s ease;
+    transition: color 1s ease;
+    cursor: pointer;
+}
+
+.element:before {
+    -webkit-transition: all 1s ease;
+    /* add delay if wanted */
+    -moz-transition: all 1s ease;
+    /* add delay if wanted */
+    -ms-transition: all 1s ease;
+    /* add delay if wanted */
+    -o-transition: all 1s ease;
+    /* add delay if wanted */
+    transition: all 1s ease;
+    /* add delay if wanted */
+    width: 0%;
+}
+
+.element:after {
+    -webkit-transition: all 1s ease;
+    /* add delay if wanted */
+    -moz-transition: all 1s ease;
+    /* add delay if wanted */
+    -ms-transition: all 1s ease;
+    /* add delay if wanted */
+    -o-transition: all 1s ease;
+    /* add delay if wanted */
+    transition: all 1s ease;
+    /* add delay if wanted */
+    width: 0%;
+}
+
+.element:hover:after,
+.element:focus:after {
+    outline: 0;
+    background-color: #fff;
+    -webkit-transition: all 1s ease;
+    /* add delay if wanted */
+    -moz-transition: all 1s ease;
+    /* add delay if wanted */
+    -ms-transition: all 1s ease;
+    /* add delay if wanted */
+    -o-transition: all 1s ease;
+    /* add delay if wanted */
+    transition: all 1s ease;
+    /* add delay if wanted */
+}
+
+.element:hover:before,
+.element:focus:before {
+    outline: 0;
+    background-color: #fff;
+    -webkit-transition: all 1s ease;
+    /* add delay if wanted */
+    -moz-transition: all 1s ease;
+    /* add delay if wanted */
+    -ms-transition: all 1s ease;
+    /* add delay if wanted */
+    -o-transition: all 1s ease;
+    /* add delay if wanted */
+    transition: all 1s ease;
+    /* add delay if wanted */
+}
\ No newline at end of file
diff --git a/src/app/pages/module-grid/module-grid.component.html b/src/app/pages/module-grid/module-grid.component.html
index 3955ee5..b3e0276 100644
--- a/src/app/pages/module-grid/module-grid.component.html
+++ b/src/app/pages/module-grid/module-grid.component.html
@@ -12,26 +12,21 @@
 
 
 <div>
-<div id="topcontainer"></div>
-<div id="centercontainer">
-<md-grid-list *ngIf="moduleRights" cols="4" md-gutter="50px"
-  rowHeight="300px">
-  <md-grid-tile (click) = "goToElogbookIfValid(userModule)" style="cursor: pointer;"
-      *ngFor="let userModule of userModules"
-      [colspan]="userModule.cols"
-      [rowspan]="userModule.rows"
-      [style.color]="userModule.color"
-      [style.background]="000000"
-      [style.background-image]="'url(' + userModule.pictureLink + ')'"
-      class="md-whiteframe-4dp hvr-grow"
-      >
-    <md-grid-tile-footer><h3 class="element underline-opening">{{userModule.name}}</h3></md-grid-tile-footer>
-  </md-grid-tile>
-</md-grid-list>
-<div *ngIf="!moduleRights" style="text-align: center;">
-  <h2>Der Benutzer hat keine Rechte</h2>
-  <h4>Bitte kontaktieren Sie Ihren Administrator</h4>
-</div>
-</div>
-<div id="bottomcontainer"></div>
+  <div id="topcontainer"></div>
+  <div id="centercontainer">
+    <md-grid-list *ngIf="moduleRights" cols="4" rowHeight="300px" gutterSize="30px" style="padding-top:50px;">
+      <md-grid-tile (click)="goToElogbookIfValid(userModule)" style="cursor: pointer; border-radius: 10px; padding: 50px;" *ngFor="let userModule of userModules"
+        [colspan]="userModule.cols" [rowspan]="userModule.rows" [style.color]="userModule.color" [style.background]="000000"
+        [style.background-image]="'url(' + userModule.pictureLink + ')'" class="md-whiteframe-4dp hvr-grow">
+        <md-grid-tile-footer>
+          <h3 class="element underline-opening">{{userModule.name}}</h3>
+        </md-grid-tile-footer>
+      </md-grid-tile>
+    </md-grid-list>
+    <div *ngIf="!moduleRights" style="text-align: center;">
+      <h2>Der Benutzer hat keine Rechte</h2>
+      <h4>Bitte kontaktieren Sie Ihren Administrator</h4>
+    </div>
+  </div>
+  <div id="bottomcontainer"></div>
 </div>
\ No newline at end of file
diff --git a/src/app/pages/module-grid/module-grid.component.spec.ts b/src/app/pages/module-grid/module-grid.component.spec.ts
index ebde444..9c2bd9c 100644
--- a/src/app/pages/module-grid/module-grid.component.spec.ts
+++ b/src/app/pages/module-grid/module-grid.component.spec.ts
@@ -24,8 +24,7 @@
 import { UserModule } from '../../model/user-module';
 import { UserModuleService } from '../../services/user-module.service';
 import { ModuleGridComponent } from './module-grid.component';
-import { USER_MODULES } from '../../testing/user-module';
-import { ONE_USER_MODULE } from '../../testing/user-module';
+import { USER_MODULES, ONE_USER_MODULE, PGM_MODULE } from '../../testing/user-module';
 import { AuthenticationService } from '../../services/authentication.service';
 import { AbstractMockObservableService } from '../../common/abstract-mock-observable.service';
 
@@ -36,7 +35,7 @@
 }
 
 describe('ModuleGridComponent', () => {
-  const sessionContext: SessionContext = new SessionContext();  
+  const sessionContext: SessionContext = new SessionContext();
   let component: ModuleGridComponent;
   let fixture: ComponentFixture<ModuleGridComponent>;
   let router: Router;
@@ -44,12 +43,12 @@
 
   class MockAuthService extends AbstractMockObservableService {
 
-    logout() {  
-      return this;    
+    logout() {
+      return this;
     }
 
-    checkAuth() {  
-      return this;    
+    checkAuth() {
+      return this;
     }
 
   }
@@ -126,4 +125,45 @@
       expect(window.location.href.endsWith('/elogbookFE')).toBeTruthy();
     });
   }));
+
+  it('should check if the user has the rights for the roles', async(() => {
+
+    component.roles = ['planned-policies-normaluser', 'planned-policies-access',
+      'offline_access', 'uma_authorization', 'elogbook-access', 'elogbook-normaluser'];
+
+    /* tslint:disable:max-line-length */
+    sessionContext.setAccessToken('eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJodVl0eVByUEVLQ1phY3FfMW5sOGZscENETnFHdmZEZHctYUxGQXNoWHZVIn0.eyJqdGkiOiJhNTkzMWYzMS1lYjgzLTQ1Y2YtYWIwMy1kY2E2ODc5Y2M2YjgiLCJleHAiOjE1MjM5NTk5MTcsIm5iZiI6MCwiaWF0IjoxNTIzOTU5NjE3LCJpc3MiOiJodHRwOi8vZW50amF2YTAwMjo4MDgwL2F1dGgvcmVhbG1zL2Vsb2dib29rIiwiYXVkIjoiZWxvZ2Jvb2stYmFja2VuZCIsInN1YiI6ImMyZTlkN2FlLTJiZmEtNDU3OC1iMDllLWY1ZGM1ZjA5YTg3OSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImVsb2dib29rLWJhY2tlbmQiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIzZTM1ODg0OC0wNDY0LTQ2YjMtYmNlNC0wNDgyZDZkNWViY2QiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImVsb2dib29rLWFjY2VzcyIsImVsb2dib29rLW5vcm1hbHVzZXIiLCJwbGFubmVkLXBvbGljaWVzLWFjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwicGxhbm5lZC1wb2xpY2llcy1ub3JtYWx1c2VyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwicm9sZXMiOiJbcGxhbm5lZC1wb2xpY2llcy1ub3JtYWx1c2VyLCBwbGFubmVkLXBvbGljaWVzLWFjY2Vzcywgb2ZmbGluZV9hY2Nlc3MsIHVtYV9hdXRob3JpemF0aW9uLCBlbG9nYm9vay1hY2Nlc3MsIGVsb2dib29rLW5vcm1hbHVzZXJdIiwibmFtZSI6Ik90dG8gTm9ybWFsdmVyYnJhdWNoZXIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJvdHRvIiwiZ2l2ZW5fbmFtZSI6Ik90dG8iLCJmYW1pbHlfbmFtZSI6Ik5vcm1hbHZlcmJyYXVjaGVyIn0.rKZdROPPD6xkSoNU9oY2vWYvTQnPKbHFh25o3PdOFEkEk1jmagEZCayKg2NH7TwVqJRZQfkyBy0PCfj9ReaQFfrKweTQZHUEi5bJuvzL4dR-TdDa_yGafCgnDvdM6vgshAdlvb5_8rPz5IEYfeszsC3RoLFBR13hRzu88MIFT2LJBaLLS4A386SznoN8T0wcC6q7uzfJRL-QAQoUkqjvSK1HM4yN4wzjj9IC-1MIye1uqcMfvd3qDHlzWlLM1vO9adcd5GZ8aaYg87a7m-vznJd1VtvaQ-l8TqYXa59z0Wgoyzr1UC3r_-1UlP9W6K0abiYTRDxvfIsvfdim4HozaA');
+    component.userModules = USER_MODULES;
+
+    component.setModulesForRole(USER_MODULES);
+
+    expect(component.moduleRights).toBeTruthy();
+
+  }));
+
+  it('should check if the module list is empty', async(() => {
+
+    component.roles = ['planned-policies-normaluser', 'planned-policies-access',
+      'offline_access', 'uma_authorization', 'elogbook-access', 'elogbook-normaluser'];
+
+    /* tslint:disable:max-line-length */
+    sessionContext.setAccessToken('eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJodVl0eVByUEVLQ1phY3FfMW5sOGZscENETnFHdmZEZHctYUxGQXNoWHZVIn0.eyJqdGkiOiJhNTkzMWYzMS1lYjgzLTQ1Y2YtYWIwMy1kY2E2ODc5Y2M2YjgiLCJleHAiOjE1MjM5NTk5MTcsIm5iZiI6MCwiaWF0IjoxNTIzOTU5NjE3LCJpc3MiOiJodHRwOi8vZW50amF2YTAwMjo4MDgwL2F1dGgvcmVhbG1zL2Vsb2dib29rIiwiYXVkIjoiZWxvZ2Jvb2stYmFja2VuZCIsInN1YiI6ImMyZTlkN2FlLTJiZmEtNDU3OC1iMDllLWY1ZGM1ZjA5YTg3OSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImVsb2dib29rLWJhY2tlbmQiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIzZTM1ODg0OC0wNDY0LTQ2YjMtYmNlNC0wNDgyZDZkNWViY2QiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImVsb2dib29rLWFjY2VzcyIsImVsb2dib29rLW5vcm1hbHVzZXIiLCJwbGFubmVkLXBvbGljaWVzLWFjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwicGxhbm5lZC1wb2xpY2llcy1ub3JtYWx1c2VyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwicm9sZXMiOiJbcGxhbm5lZC1wb2xpY2llcy1ub3JtYWx1c2VyLCBwbGFubmVkLXBvbGljaWVzLWFjY2Vzcywgb2ZmbGluZV9hY2Nlc3MsIHVtYV9hdXRob3JpemF0aW9uLCBlbG9nYm9vay1hY2Nlc3MsIGVsb2dib29rLW5vcm1hbHVzZXJdIiwibmFtZSI6Ik90dG8gTm9ybWFsdmVyYnJhdWNoZXIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJvdHRvIiwiZ2l2ZW5fbmFtZSI6Ik90dG8iLCJmYW1pbHlfbmFtZSI6Ik5vcm1hbHZlcmJyYXVjaGVyIn0.rKZdROPPD6xkSoNU9oY2vWYvTQnPKbHFh25o3PdOFEkEk1jmagEZCayKg2NH7TwVqJRZQfkyBy0PCfj9ReaQFfrKweTQZHUEi5bJuvzL4dR-TdDa_yGafCgnDvdM6vgshAdlvb5_8rPz5IEYfeszsC3RoLFBR13hRzu88MIFT2LJBaLLS4A386SznoN8T0wcC6q7uzfJRL-QAQoUkqjvSK1HM4yN4wzjj9IC-1MIye1uqcMfvd3qDHlzWlLM1vO9adcd5GZ8aaYg87a7m-vznJd1VtvaQ-l8TqYXa59z0Wgoyzr1UC3r_-1UlP9W6K0abiYTRDxvfIsvfdim4HozaA');
+    component.userModules = [];
+
+    component.setModulesForRole(USER_MODULES);
+    expect(component.moduleRights).toBeFalsy();
+
+  }));
+
+  it('should create elogbookLink token string', async(() => {
+
+    /* tslint:disable:max-line-length */
+    sessionContext.setAccessToken('eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJodVl0eVByUEVLQ1phY3FfMW5sOGZscENETnFHdmZEZHctYUxGQXNoWHZVIn0.eyJqdGkiOiJhNTkzMWYzMS1lYjgzLTQ1Y2YtYWIwMy1kY2E2ODc5Y2M2YjgiLCJleHAiOjE1MjM5NTk5MTcsIm5iZiI6MCwiaWF0IjoxNTIzOTU5NjE3LCJpc3MiOiJodHRwOi8vZW50amF2YTAwMjo4MDgwL2F1dGgvcmVhbG1zL2Vsb2dib29rIiwiYXVkIjoiZWxvZ2Jvb2stYmFja2VuZCIsInN1YiI6ImMyZTlkN2FlLTJiZmEtNDU3OC1iMDllLWY1ZGM1ZjA5YTg3OSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImVsb2dib29rLWJhY2tlbmQiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIzZTM1ODg0OC0wNDY0LTQ2YjMtYmNlNC0wNDgyZDZkNWViY2QiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImVsb2dib29rLWFjY2VzcyIsImVsb2dib29rLW5vcm1hbHVzZXIiLCJwbGFubmVkLXBvbGljaWVzLWFjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIiwicGxhbm5lZC1wb2xpY2llcy1ub3JtYWx1c2VyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwicm9sZXMiOiJbcGxhbm5lZC1wb2xpY2llcy1ub3JtYWx1c2VyLCBwbGFubmVkLXBvbGljaWVzLWFjY2Vzcywgb2ZmbGluZV9hY2Nlc3MsIHVtYV9hdXRob3JpemF0aW9uLCBlbG9nYm9vay1hY2Nlc3MsIGVsb2dib29rLW5vcm1hbHVzZXJdIiwibmFtZSI6Ik90dG8gTm9ybWFsdmVyYnJhdWNoZXIiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJvdHRvIiwiZ2l2ZW5fbmFtZSI6Ik90dG8iLCJmYW1pbHlfbmFtZSI6Ik5vcm1hbHZlcmJyYXVjaGVyIn0.rKZdROPPD6xkSoNU9oY2vWYvTQnPKbHFh25o3PdOFEkEk1jmagEZCayKg2NH7TwVqJRZQfkyBy0PCfj9ReaQFfrKweTQZHUEi5bJuvzL4dR-TdDa_yGafCgnDvdM6vgshAdlvb5_8rPz5IEYfeszsC3RoLFBR13hRzu88MIFT2LJBaLLS4A386SznoN8T0wcC6q7uzfJRL-QAQoUkqjvSK1HM4yN4wzjj9IC-1MIye1uqcMfvd3qDHlzWlLM1vO9adcd5GZ8aaYg87a7m-vznJd1VtvaQ-l8TqYXa59z0Wgoyzr1UC3r_-1UlP9W6K0abiYTRDxvfIsvfdim4HozaA');
+
+    component.goToElogbookIfValid(PGM_MODULE);
+    expect(component.goToElogbookIfValid(PGM_MODULE)).toHaveBeenCalled;
+
+  }));
+
+
 });
diff --git a/src/app/pages/module-grid/module-grid.component.ts b/src/app/pages/module-grid/module-grid.component.ts
index 80edcd1..9fc325b 100644
--- a/src/app/pages/module-grid/module-grid.component.ts
+++ b/src/app/pages/module-grid/module-grid.component.ts
@@ -38,9 +38,9 @@
     this.getUserModules();
   }
 
-  private goToElogbookIfValid(userModule: UserModule): void {
+  goToElogbookIfValid(userModule: UserModule): void {
     const elogbookLink = userModule.link + '?accessToken=' + this.sessionContext.getAccessToken();
-    
+
     this.authService.checkAuth().subscribe(res => {
       window.open(elogbookLink, '_blank');
     },
diff --git a/src/app/testing/user-module.ts b/src/app/testing/user-module.ts
index cf98739..b6b7f01 100644
--- a/src/app/testing/user-module.ts
+++ b/src/app/testing/user-module.ts
@@ -21,10 +21,10 @@
         cols: 1,
         rows: 1,
         color: '#ffffff',
-        link: '/elogbookFE', 
+        link: '/elogbookFE',
         pictureLink: 'https://www.openkonsequenz.de/medien/cache/main_image/m_logbuch_2443636.jpg',
         requiredRole: 'elogbook_access'
-    },     
+    },
     {
         name: 'Bereitschaftsplanung',
         cols: 1,
@@ -33,7 +33,7 @@
         link: 'https://www.openkonsequenz.de/anwender/11-geplante-projekte/94-bereitschaftsplan',
         pictureLink: 'https://www.openkonsequenz.de/medien/cache/main_image/l_bereitschaftsplan_57882047.jpg',
         requiredRole: 'planning_access'
-    },    
+    },
     {
         name: 'Einspeisemanagement',
         cols: 1,
@@ -51,7 +51,7 @@
         link: 'https://www.openkonsequenz.de/anwender/11-geplante-projekte/64-geplante-netzmassnahme',
         // tslint:disable-next-line:max-line-length
         pictureLink: 'https://www.openkonsequenz.de//components/com_flexicontent/librairies/phpthumb/phpThumb.php?src=/medien/cache/main_image/l_ok_module5.jpg',
-        requiredRole: 'planned_policies_access'        
+        requiredRole: 'planned_policies_access'
     }
 ];
 
@@ -65,4 +65,17 @@
         pictureLink: 'https://www.openkonsequenz.de/medien/cache/main_image/m_logbuch_2443636.jpg',
         requiredRole: 'elogbook_access'
     }
-];
\ No newline at end of file
+];
+
+export const PGM_MODULE: UserModule =
+    {
+        name: 'Geplante Maßnahmen',
+        cols: 1,
+        rows: 1,
+        color: '#ffffff',
+        link: 'http://localhost:4220',
+        // tslint:disable-next-line:max-line-length
+        pictureLink: 'https://www.openkonsequenz.de//components/com_flexicontent/librairies/phpthumb/phpThumb.php?src=/medien/cache/main_image/l_ok_module5.jpg',
+        requiredRole: 'planned_policies_access'
+    }
+    ;
\ No newline at end of file