diff --git a/apps/steward-app/src/main/js/app/client/login/login.controller.js b/apps/steward-app/src/main/js/app/client/login/login.controller.js index a9bd6501f..e396516e6 100644 --- a/apps/steward-app/src/main/js/app/client/login/login.controller.js +++ b/apps/steward-app/src/main/js/app/client/login/login.controller.js @@ -1,30 +1,34 @@ (function () { 'use strict'; angular .module('shrine.steward.login'); - LoginController.$inject = ['LoginModel','LoginService', '$location', 'constants']; + LoginController.$inject = ['LoginModel', 'LoginService', '$location', 'constants']; function LoginController(loginModel, loginService, $location, constants) { + + // -- public --// var login = this; login.loginFail = false; + this.checkLogin = checkLogin; + this.navigateToHome = navigateToHome; + // -- private -- // function checkLogin() { loginService.setAuthHeader(login.username, login.password); loginService.login() .then(navigateToHome, setLoginToError); - } function navigateToHome(response) { loginService.setCredentials(login.username, login.password, response.roles); - $location.path(constants.defaultRoute); + $location.path(constants.homeRoute); } function setLoginToError(response) { loginService.clearCredentials(); login.loginFail = true; login.username = login.password = ''; } } })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.constants.js b/apps/steward-app/src/main/js/app/client/steward.constants.js index cb889c8c1..9d24f553b 100644 --- a/apps/steward-app/src/main/js/app/client/steward.constants.js +++ b/apps/steward-app/src/main/js/app/client/steward.constants.js @@ -1,56 +1,58 @@ (function () { 'use strict'; var baseUrl = 'https://localhost:6443/steward/'; var testPort = '8000'; - var defaultRoute = '/topics'; + var homeRoute = '/topics'; + var defaultRoute = '/login'; var restOptions = { skip: '{$SKIP$}', limit: '{$LIMIT$}', state: '{$STATE$}', direction: '{$DIRECTION$}', sortBy: '{$SORT_BY$}', minDate: '{$MIN_DATE$}', maxDate: '{$MAX_DATE$}', }; var restInterpolators = { skip: 'skip=' + restOptions.skip, limit: 'limit=' + restOptions.limit, state: 'state=' + restOptions.state, direction: 'sortDirection=' + restOptions.direction, sortBy: 'sortBy=' + restOptions.sortBy, minDate: 'minDate=' + restOptions.minDate, maxDate: 'maxDate=' + restOptions.maxDate }; var states = { state1: 'Pending', state2: 'Approved', state3: 'Rejected' }; // -- todo: delete? var title = 'SHRINE DATA STEWARD'; var roles = { role1: 'researcher', role2: 'data-steward', role3: 'admin' }; angular .module('shrine.steward') .constant('constants', { + 'homeRoute': homeRoute, 'defaultRoute': defaultRoute, 'baseUrl': baseUrl, 'restOptions': restOptions, 'restInterpolators': restInterpolators, 'states': states, 'roles': roles, 'testPort': testPort, 'title': title//todo: delete? }); })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.constants.spec.js b/apps/steward-app/src/main/js/app/client/steward.constants.spec.js index b0b0ee38b..b2b074f97 100644 --- a/apps/steward-app/src/main/js/app/client/steward.constants.spec.js +++ b/apps/steward-app/src/main/js/app/client/steward.constants.spec.js @@ -1,66 +1,66 @@ (function () { 'use strict'; describe('shrine.steward constants tests', StewardConstantsSpec); function StewardConstantsSpec() { // -- vars -- // var stewardConstants; function setup() { module('shrine.steward'); inject(function (constants) { stewardConstants = constants; }); } //-- setup --/ beforeEach(setup); // -- tests -- // it('constants should exist.', function () { expect(stewardConstants).toBeDefined(); }); // -- tests -- // - it('defaultRoute member should exist.', function () { - expect(stewardConstants.defaultRoute).toBeDefined(); + it('homeRoute member should exist.', function () { + expect(stewardConstants.homeRoute).toBeDefined(); }); // -- tests -- // it('baseUrl member should exist.', function () { expect(stewardConstants.baseUrl).toBeDefined(); }); // -- tests -- // it('restOptions member should exist.', function () { expect(stewardConstants.restOptions).toBeDefined(); }); // -- tests -- // it('restInterpolators member should exist.', function () { expect(stewardConstants.restInterpolators).toBeDefined(); }); // -- tests -- // it('states member should exist.', function () { expect(stewardConstants.states).toBeDefined(); }); // -- tests -- // it('roles member should exist.', function () { expect(stewardConstants.roles).toBeDefined(); }); // -- tests -- // it('testPort member should exist.', function () { expect(stewardConstants.testPort).toBeDefined(); }); // -- tests -- // it('title member should exist.', function () { expect(stewardConstants.title).toBeDefined(); }); } })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.route.js b/apps/steward-app/src/main/js/app/client/steward.route.js index 3ed7d42fb..2c6dc3f3e 100644 --- a/apps/steward-app/src/main/js/app/client/steward.route.js +++ b/apps/steward-app/src/main/js/app/client/steward.route.js @@ -1,50 +1,33 @@ (function () { 'use strict'; - var defaultRoute = '/topics'; + var homeRoute = '/topics'; angular .module('shrine.steward') .config(StewardConfiguration) - .run(StewardRunner); StewardConfiguration.$inject = ['$stateProvider', '$urlRouterProvider', '$httpProvider', 'StewardServiceProvider']; function StewardConfiguration($stateProvider, $urlRouterProvider, $httpProvider, stewardProvider) { // -- default route --// - $urlRouterProvider.otherwise(defaultRoute); + $urlRouterProvider.otherwise(homeRoute); stewardProvider.configureHttpProvider($httpProvider); // -- configure states -- // $stateProvider .state('topics',{ url:'/topics', controller: 'TopicsController', templateUrl:'app/client/topics/topics.tpl.html', controllerAs:'topics' }) .state('login',{ url:'/login', controller: 'LoginController', - templateUrl:'app/client/login/topics.tpl.html', + templateUrl:'app/client/login/login.tpl.html', controllerAs:'login' }); } - - /** - * App Run Phase - Set up listener to verify user has access. - */ - StewardRunner.$inject = ['$rootScope', '$location', 'StewardService']; - function StewardRunner($rootScope, $location, StewardService) { - $rootScope.$on('$locationChangeStart', authenticateUser); - - function authenticateUser(event, next, current) { - // redirect to login page if not logged in - // // redirect to login page if not logged in - // if ($location.path() !== '/login' && (!$app.globals.currentUser || !$app.globals.currentUser.isLoggedIn)) { - // $location.path('/login'); - // } - } - } })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.route.spec.js b/apps/steward-app/src/main/js/app/client/steward.route.spec.js index 751835a68..606ed50f0 100644 --- a/apps/steward-app/src/main/js/app/client/steward.route.spec.js +++ b/apps/steward-app/src/main/js/app/client/steward.route.spec.js @@ -1,45 +1,55 @@ (function () { 'use strict'; describe('shrine.steward.route tests', StewardRouteSpec); function StewardRouteSpec() { // -- vars -- // var $state; var $rootScope; var templateCache; + var stewardService; + var state = 'topics'; + var user = { + username: 'testUser', + password: 'kapow', + roles: ['testRole1','testRole2','testRole3'] + }; function setup() { module('shrine.steward'); - inject(function (_$state_, $templateCache, _$rootScope_) { + inject(function (_$state_, $templateCache, _$rootScope_, _StewardService_) { $state = _$state_ $rootScope = _$rootScope_; templateCache = $templateCache; + stewardService = _StewardService_; }); } function activateRoute(template, name) { templateCache.put(template, ''); $state.go(name); $rootScope.$digest(); } //-- setup --/ beforeEach(setup); // -- tests -- // it('topics route url should be set to #/topics', function () { + stewardService.setAppUser(user.username, user.password, user.roles); activateRoute('app/client/topics/topics.tpl.html', 'topics'); - expect($state.href(state)).toEqual('#/topics'); + expect($state.href($state.current.name)).toEqual('#/topics'); }); - // Test whether our state activates correctly - it('topics route should activate the state', function () { - activateRoute('app/client/topics/topics.tpl.html', 'topics'); - expect($state.current.name).toBe('topics'); + // -- tests -- // + it('login route url should be set to #/login', function () { + stewardService.deleteAppUser(); + activateRoute('app/client/login/login.tpl.html', 'login'); + expect($state.href($state.current.name)).toEqual('#/login'); }); } } )(); diff --git a/apps/steward-app/src/main/js/app/client/steward.runner.js b/apps/steward-app/src/main/js/app/client/steward.runner.js new file mode 100644 index 000000000..ced2e6989 --- /dev/null +++ b/apps/steward-app/src/main/js/app/client/steward.runner.js @@ -0,0 +1,33 @@ +(function () { + 'use strict'; + + angular + .module('shrine.steward') + .run(StewardRunner); + + /** + * App Run Phase - Set up listener to verify user has access. + */ + StewardRunner.$inject = ['$rootScope', '$location', 'StewardService']; + function StewardRunner($rootScope, $location, StewardService) { + + var defaultRoute = StewardService.constants.defaultRoute; + var path = $location.path(); + + $rootScope.$on('$locationChangeStart', verifyIdentity); + + function verifyIdentity(event, next, current) { + if (isUserNotLoggedIn() && isRedirectNecessary()) { + $location.path(defaultRoute); + } + } + + function isRedirectNecessary() { + return path !== defaultRoute; + } + function isUserNotLoggedIn() { + var currentUser = StewardService.getAppUser(); + return (!currentUser || !currentUser.isLoggedIn); + } + } +})(); diff --git a/apps/steward-app/src/main/js/app/client/steward.service.js b/apps/steward-app/src/main/js/app/client/steward.service.js index 25260f96c..b7d9ff1ee 100644 --- a/apps/steward-app/src/main/js/app/client/steward.service.js +++ b/apps/steward-app/src/main/js/app/client/steward.service.js @@ -1,95 +1,95 @@ (function () { 'use strict'; angular .module('shrine.steward') .provider('StewardService', StewardProvider); StewardProvider.$inject = ['constants']; function StewardProvider(constants) { // -- make available to configuration --// this.$get = get; this.configureHttpProvider = configureHttpProvider; this.constants = constants; // -- provide steward service --// get.$inject = ['CommonService']; function get(CommonService) { return new StewardService(CommonService, constants); } /** * Set up cross domain voodoo, if running from deployment, No IE Cache * @param httpProvider * @returns {*} * @see: http://stackoverflow.com/questions/16098430/angular-ie-caching-issue-for-http */ function configureHttpProvider(httpProvider) { // -- set up cross domain -- // httpProvider.defaults.useXDomain = true; delete httpProvider.defaults.headers.common['X-Requested-With']; // -- If running from deployment, No IE Cache -- // if (window.location.origin.indexOf('http://localhost:' + constants.testPort) === -1) { //initialize get if not there if (!httpProvider.defaults.headers.get) { httpProvider.defaults.headers.get = {}; } //disable IE ajax request caching httpProvider.defaults.headers.get['If-Modified-Since'] = 'Sat, 26 Jul 1997 05:00:00 GMT'; httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; httpProvider.defaults.headers.get['Pragma'] = 'no-cache'; } return httpProvider; } } /** * Steward Servcice. */ function StewardService(CommonService, constants) { // -- private vars -- // var appTitle = null; var appUser = null; // -- public members -- // this.commonService = CommonService; this.constants = constants; // -- public methods -- // this.setAppUser = setAppUser; this.getAppUser = getAppUser; this.deleteAppUser = deleteAppUser; - + /** * -- set app user. -- */ function setAppUser(username, authdata, roles) { appUser = { username: username, authdata: authdata, isLoggedIn: true, roles: roles }; } /** * -- read only -- */ function getAppUser() { return angular.extend({}, appUser); } /** * -- delete user -- */ function deleteAppUser() { appUser = null; } } })(); diff --git a/apps/steward-app/src/main/js/src/app/login/login.tpl.html b/apps/steward-app/src/main/js/src/app/login/login.tpl.html index 2697176b3..ad35cfb44 100644 --- a/apps/steward-app/src/main/js/src/app/login/login.tpl.html +++ b/apps/steward-app/src/main/js/src/app/login/login.tpl.html @@ -1,53 +1,72 @@ <div class="row shrine-login"> <div class="col-sm-4"> <p class="shrine-copy-bold"> </p> <ul class="shrine-copy"> </ul> <p class="shrine-copy"> </p> </div> <div class="col-sm-4"> <div class="shrine-panel"> + <div class="panel-body"> - <form name="form" ng-submit="login()" role="form"> + <form name="form" + ng-submit="login.checkLogin()" + role="form"> + <fieldset> <div class="form-group"> <label class="pull-right shrine-copy-bold" - ng-show="form.username.$error.required || - form.password.$error.required"> + ng-show="form.username.$error.required ||form.password.$error.required"> *<small>Required Field</small> </label> <span>Username*</span> - - <input class="form-control" type="text" name="username" - id="username" class="form-control" - ng-model="username" autofocus required novalidate/> + <!-- ng username --> + <input class="form-control" + type="text" + name="username" + id="username" + class="form-control" + ng-model="login.username" + autofocus required novalidate/> </div> + <div class="form-group"> <span>Password*</span> - <input class="form-control" type="password" - name="password" id="password" ng-model="password" - required novalidate/> + <!-- ng password --> + <input class="form-control" + type="password" + name="password" + id="password" + ng-model="login.password" + required novalidate/> </div> - <div class="form-group has-error" style="text-align: center"> - <label ng-show="loginFail === true" - class="control-label" for="inputError">Invalid Login</label> + + <div class="form-group has-error" + style="text-align: center"> + <!-- ng status --> + <label ng-show="login.loginFail === true" + class="control-label" + for="inputError">Invalid Login</label> </div> + + <!-- ng submit --> <div> <button type="submit" class="pull-right fa fa-chevron-right fa-3x shrine-button" ng-disabled="!form.$valid"></button> </div> + </fieldset> </form> </div> </div> </div> </div>