changeset 161:67492977d9ac

Add navbar user menu Reviewed-by: jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-August/024613.html
author Andrew Azores <aazores@redhat.com>
date Tue, 22 Aug 2017 08:52:48 -0400
parents e4392e130e4f
children 94e4337238f9
files src/app/app.controller.js src/app/app.controller.spec.js src/app/components/auth/keycloak-auth.service.js src/app/components/auth/keycloak-auth.service.spec.js src/app/components/auth/stub-auth.service.js src/app/components/auth/stub-auth.service.spec.js src/app/en.locale.yaml src/app/index.html
diffstat 8 files changed, 68 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/app/app.controller.js	Mon Aug 21 09:02:56 2017 -0400
+++ b/src/app/app.controller.js	Tue Aug 22 08:52:48 2017 -0400
@@ -43,6 +43,8 @@
       authService.logout();
     };
 
+    $scope.username = authService.username;
+
   }
 }
 
--- a/src/app/app.controller.spec.js	Mon Aug 21 09:02:56 2017 -0400
+++ b/src/app/app.controller.spec.js	Tue Aug 22 08:52:48 2017 -0400
@@ -106,4 +106,30 @@
     });
   });
 
+  describe('$scope.username', () => {
+    let scope, authService;
+    beforeEach(inject(($controller, $rootScope) => {
+      'ngInject';
+
+      scope = $rootScope.$new();
+      authService = {
+        status: sinon.stub().returns(true),
+        login: sinon.spy(),
+        logout: sinon.spy(),
+        username: 'fake-username'
+      };
+
+      $controller('AppController', {
+        $scope: scope,
+        environment: 'testing',
+        authService: authService
+      });
+    }));
+
+    it('should be set according to authService username', () => {
+      scope.should.have.ownProperty('username');
+      scope.username.should.equal(authService.username);
+    });
+  });
+
 });
--- a/src/app/components/auth/keycloak-auth.service.js	Mon Aug 21 09:02:56 2017 -0400
+++ b/src/app/components/auth/keycloak-auth.service.js	Tue Aug 22 08:52:48 2017 -0400
@@ -53,4 +53,8 @@
     return this.keycloak.token;
   }
 
+  get username () {
+    return this.keycloak.idTokenParsed.preferred_username;
+  }
+
 }
--- a/src/app/components/auth/keycloak-auth.service.spec.js	Mon Aug 21 09:02:56 2017 -0400
+++ b/src/app/components/auth/keycloak-auth.service.spec.js	Tue Aug 22 08:52:48 2017 -0400
@@ -43,7 +43,10 @@
       logout: logout,
       updateToken: refresh,
       authenticated: authenticated,
-      token: 'fakeToken'
+      token: 'fakeToken',
+      idTokenParsed: {
+        'preferred_username': 'fakeUsername'
+      }
     };
     keycloakAuthService = new KeycloakAuthService(mockCloak);
   });
@@ -91,4 +94,10 @@
       res.should.equal('fakeToken');
     });
   });
+
+  describe('#get username()', () => {
+    it('should delegate to Keycloak object', () => {
+      keycloakAuthService.username.should.equal('fakeUsername');
+    });
+  });
 });
--- a/src/app/components/auth/stub-auth.service.js	Mon Aug 21 09:02:56 2017 -0400
+++ b/src/app/components/auth/stub-auth.service.js	Tue Aug 22 08:52:48 2017 -0400
@@ -68,4 +68,8 @@
     return 'stubAuthMockToken';
   }
 
+  get username () {
+    return 'test-user';
+  }
+
 }
--- a/src/app/components/auth/stub-auth.service.spec.js	Mon Aug 21 09:02:56 2017 -0400
+++ b/src/app/components/auth/stub-auth.service.spec.js	Tue Aug 22 08:52:48 2017 -0400
@@ -119,4 +119,10 @@
       stubAuthService.token.should.equal('stubAuthMockToken');
     });
   });
+
+  describe('#get username()', () => {
+    it('should return "test-user"', () => {
+      stubAuthService.username.should.equal('test-user');
+    });
+  });
 });
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/app/en.locale.yaml	Tue Aug 22 08:52:48 2017 -0400
@@ -0,0 +1,4 @@
+navbar:
+  TOGGLE_NAV: Toggle Navigation
+  USERNAME: Username
+  LOGOUT: Log Out
--- a/src/app/index.html	Mon Aug 21 09:02:56 2017 -0400
+++ b/src/app/index.html	Tue Aug 22 08:52:48 2017 -0400
@@ -16,9 +16,20 @@
         <a ui-sref="landing" class="navbar-brand">
           <img id="brandLogoImg" class="navbar-brand-icon" src="~images/thermostat_logo_white_600px.png" height="57" alt="Thermostat"/>
         </a>
-        <button hidden id="logoutButton" ng-show="loginStatus();" class="navbar-text btn btn-primary btn-sm" ng-click="logout()">Logout</button>
         <p hidden id="envHeader" class="navbar-text label label-info infotip">{{env}}</p>
       </div>
+      <nav class="collapse navbar-collapse">
+        <ul class="nav navbar-nav navbar-right navbar-iconic navbar-utility">
+          <li hidden ng-show="loginStatus()" class="dropdown">
+            <a class="dropdown-toggle nav-item-iconic" id="userDropwdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
+              <span translate-attr="{title: 'navbar.USERNAME'}" class="fa pficon-user"></span> {{username}} <span class="caret"></span>
+            </a>
+            <ul class="dropdown-menu" aria-labelledby="userDropwdown">
+              <li><a id="logoutButton" ng-click="logout()" style="cursor: pointer; cursor: hand" translate>navbar.LOGOUT</a></li>
+            </ul>
+          </li>
+        </ul>
+      </nav>
     </nav>
   </div>