From 8b583452b5111a940dcfcaf8b3f85280929fb54c Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 27 Dec 2014 21:43:24 -0800 Subject: [PATCH] GUAC-961: Add guacFocus directive. Focus password field (and clear it) when login fails. --- .../app/login/controllers/loginController.js | 48 +++++++++--- .../webapp/app/login/directives/guacFocus.js | 76 +++++++++++++++++++ .../webapp/app/login/templates/login.html | 2 +- 3 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 guacamole/src/main/webapp/app/login/directives/guacFocus.js diff --git a/guacamole/src/main/webapp/app/login/controllers/loginController.js b/guacamole/src/main/webapp/app/login/controllers/loginController.js index 32860b1c5..7283f4c28 100644 --- a/guacamole/src/main/webapp/app/login/controllers/loginController.js +++ b/guacamole/src/main/webapp/app/login/controllers/loginController.js @@ -23,21 +23,47 @@ angular.module('login').controller('loginController', ['$scope', '$injector', function loginController($scope, $injector) { - // Get the dependencies commonJS style - var authenticationService = $injector.get("authenticationService"); + // Required services var $location = $injector.get("$location"); - + var authenticationService = $injector.get("authenticationService"); + + /** + * Whether an error occurred during login. + * + * @type Boolean + */ $scope.loginError = false; - + + /** + * Whether the password field has focus. + * + * @type Boolean + */ + $scope.passwordFocused = false; + + /** + * Submits the currently-specified username and password to the + * authentication service, redirecting to the main view if successful. + */ $scope.login = function login() { + + // Attempt login authenticationService.login($scope.username, $scope.password) - .success(function success(data, status, headers, config) { - // Set up the basic permissions for the user - $scope.loadBasicPermissions(); - $location.path('/'); - }).error(function error(data, status, headers, config) { - $scope.loginError = true; - }); + + // Redirect to main view upon success + .success(function success(data, status, headers, config) { + // Set up the basic permissions for the user + $scope.loadBasicPermissions(); + $location.path('/'); + }) + + // Reset and focus password upon failure + .error(function error(data, status, headers, config) { + $scope.loginError = true; + $scope.passwordFocused = true; + $scope.password = ''; + }); + }; }]); diff --git a/guacamole/src/main/webapp/app/login/directives/guacFocus.js b/guacamole/src/main/webapp/app/login/directives/guacFocus.js new file mode 100644 index 000000000..2689d1796 --- /dev/null +++ b/guacamole/src/main/webapp/app/login/directives/guacFocus.js @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2014 Glyptodon LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * A directive which allows elements to be manually focused / blurred. + */ +angular.module('login').directive('guacFocus', ['$timeout', '$parse', function guacFocus($timeout, $parse) { + + return { + restrict: 'A', + + link: function linkGuacFocus($scope, $element, $attrs) { + + /** + * Whether the element associated with this directive should be + * focussed. + * + * @type Boolean + */ + var guacFocus = $parse($attrs.guacFocus); + + /** + * The element which will register the drag gesture. + * + * @type Element + */ + var element = $element[0]; + + // Set/unset focus depending on value of guacFocus + $scope.$watch(guacFocus, function updateFocus(value) { + $timeout(function updateFocusAsync() { + if (value) + element.focus(); + else + element.blur(); + }); + }); + + // Set focus flag when focus is received + element.addEventListener('focus', function focusReceived() { + $scope.$apply(function setGuacFocus() { + guacFocus.assign($scope, true); + }); + }); + + // Unset focus flag when focus is lost + element.addEventListener('blur', function focusLost() { + $scope.$apply(function unsetGuacFocus() { + guacFocus.assign($scope, false); + }); + }); + + } // end guacFocus link function + + }; + +}]); diff --git a/guacamole/src/main/webapp/app/login/templates/login.html b/guacamole/src/main/webapp/app/login/templates/login.html index f152eb285..e07611894 100644 --- a/guacamole/src/main/webapp/app/login/templates/login.html +++ b/guacamole/src/main/webapp/app/login/templates/login.html @@ -38,7 +38,7 @@ THE SOFTWARE.
- +