diff --git a/awx/ui/client/legacy-styles/ansible-ui.less b/awx/ui/client/legacy-styles/ansible-ui.less index c6ab84874b..c45dc85518 100644 --- a/awx/ui/client/legacy-styles/ansible-ui.less +++ b/awx/ui/client/legacy-styles/ansible-ui.less @@ -2018,11 +2018,19 @@ button.dropdown-toggle, border-bottom-color: #848992; } +.tooltip.top .tooltip-arrow { + border-top-color: #848992; +} + .tooltip.Tooltip.fade.bottom.in { opacity: 1; padding-top: 4px; } +.tooltip.in { + opacity: 1; +} + .tooltip-inner { background-color: #848992; } @@ -2030,3 +2038,45 @@ button.dropdown-toggle, .tooltip-inner--logOut { margin-left: -15px !important; } + +.modal { + transition: all 0.3s ease-out !important; +} + +.modal.fade .modal-dialog { + transform: translate(0, 0); +} + +.modal-backdrop, .modal-backdrop.fade.in { + opacity: .25; +} + +.form-control { + border-color: #e1e1e1; + background-color: #f6f6f6; + color: #161b1f; + transition: border-color 0.3s; + box-shadow: none; +} + +.form-control:active, .form-control:focus { + box-shadow: none; + border-color: #167ec4; +} + +.form-control.ng-dirty.ng-invalid, .form-control.ng-dirty.ng-invalid:focus { + box-shadow: none; +} + +.error { + opacity: 1; + transition: opacity 0.2s; +} + +.error.ng-hide-add { + display: none; +} + +.error.ng-hide { + opacity: 0; +} diff --git a/awx/ui/client/lib/angular-animate/.bower.json b/awx/ui/client/lib/angular-animate/.bower.json index 22ac500bb0..2cf092ce12 100644 --- a/awx/ui/client/lib/angular-animate/.bower.json +++ b/awx/ui/client/lib/angular-animate/.bower.json @@ -16,4 +16,4 @@ "_source": "git://github.com/angular/bower-angular-animate.git", "_target": "~1.4.7", "_originalSource": "angular-animate" -} \ No newline at end of file +} diff --git a/awx/ui/client/src/app.js b/awx/ui/client/src/app.js index d0639727a5..a50dbb0103 100644 --- a/awx/ui/client/src/app.js +++ b/awx/ui/client/src/app.js @@ -76,6 +76,7 @@ __deferLoadIfEnabled(); /*#endif#*/ var tower = angular.module('Tower', [ + 'ngAnimate', 'pendolytics', 'ngRoute', 'ngSanitize', diff --git a/awx/ui/client/src/login/loginModal/loginModal.block.less b/awx/ui/client/src/login/loginModal/loginModal.block.less index 262ab3a736..552cc6650f 100644 --- a/awx/ui/client/src/login/loginModal/loginModal.block.less +++ b/awx/ui/client/src/login/loginModal/loginModal.block.less @@ -1,40 +1,121 @@ /** @define LoginModal */ +.LoginModal-dialog { + max-width: ~"calc(100% - 30px)"; + margin: 30px auto; + margin-top: 135px; +} + +.LoginModal-content { + max-width: 550px; + margin-left: auto; + margin-right: auto; + border: 0; + box-shadow: none; + background-color: #fff; + border-radius: 4px; +} .LoginModal-header { text-align: center; - background-color: #171717; + background-color: #167ec4; + border-bottom: 0; +} + +.LoginModal-body { + padding-top: 15px; + padding-bottom: 0px; } .LoginModal-logoImage { max-width: 100%; } +.LoginModal-logoImage--notCustom { + max-width: 190px; + margin-top: -6px; + margin-bottom: -6px; +} + .LoginModal-alert { - margin-bottom: 25px; - font-size: 14px; + margin-bottom: 15px; + font-size: 16px; font-weight: normal; - color: #1778c3; - text-align: center; + color: #161b1f; + transition: opacity 0.2s; } .LoginModal-alert--error { color: #ff5850; + padding-bottom: 4px; } -.LoginModal-labelAsterisk:before { - margin-right: -2px; +.LoginModal-alert { + opacity: 1; +} + +.LoginModal-alert.ng-hide { + display: none; + opacity: 0; +} + +.LoginModal-alert.ng-hide-add { + display: none; + opacity: 0; +} + +.LoginModal-alert.ng-hide-remove { + display: block; +} + +.LoginModal-alertIcon { + display: flex; + align-items: center; + line-height: 19px; +} + +.LoginModal-alertIcon:before { + margin-right: 10px; +} + +.LoginModal-formGroup { + margin-bottom: 15px; +} + +.LoginModal-label { + color: #b7b7b7; + font-weight: 400; } .LoginModal-footer { display: flex; + flex-wrap: wrap-reverse; align-items: center; + padding: 20px; + padding-top: 5px; + padding-bottom: 0px; } .LoginModal-footerBlock { flex: 1 0 auto; - text-align: left; + margin-bottom: 20px; + display: flex; + max-width: 100%; } .LoginModal-footerBlock--submit { - text-align: right; + flex: initial; + margin-left: auto; + padding-left: 20px; +} + +.LoginModal-signInButton { + transition: background-color 0.2s; + background-color: #5bbdbf; + color: #fff; +} + +.LoginModal-signInButton:hover, +.LoginModal-signInButton:focus { + color: #fff; + background-color: #7bced0; } diff --git a/awx/ui/client/src/login/loginModal/loginModal.controller.js b/awx/ui/client/src/login/loginModal/loginModal.controller.js index ce451834b4..9741e2887c 100644 --- a/awx/ui/client/src/login/loginModal/loginModal.controller.js +++ b/awx/ui/client/src/login/loginModal/loginModal.controller.js @@ -111,7 +111,13 @@ export default ['$log', '$cookieStore', '$compile', '$window', '$rootScope', '$l }); - scope.customLogo = ($AnsibleConfig.custom_logo) ? "custom_console_logo.png" : "tower_console_logo.png"; + if ($AnsibleConfig.custom_logo) { + scope.customLogo = "custom_console_logo.png" + scope.customLogoPresent = true; + } else { + scope.customLogo = "login_modal_logo.png"; + scope.customLogoPresent = false; + } scope.customLoginInfo = $AnsibleConfig.custom_login_info; scope.customLoginInfoPresent = (scope.customLoginInfo) ? true : false; @@ -182,6 +188,7 @@ export default ['$log', '$cookieStore', '$compile', '$window', '$rootScope', '$l if (Empty(username) || Empty(password)) { scope.reset(); scope.attemptFailed = true; + $('#login-username').focus(); } else { Wait('start'); Authorization.retrieveToken(username, password) @@ -201,6 +208,7 @@ export default ['$log', '$cookieStore', '$compile', '$window', '$rootScope', '$l } else { scope.reset(); scope.attemptFailed = true; + $('#login-username').focus(); } }); } diff --git a/awx/ui/client/src/login/loginModal/loginModal.partial.html b/awx/ui/client/src/login/loginModal/loginModal.partial.html index 09461b5032..d5455c0452 100644 --- a/awx/ui/client/src/login/loginModal/loginModal.partial.html +++ b/awx/ui/client/src/login/loginModal/loginModal.partial.html @@ -1,33 +1,36 @@