From c0a04fdcdd69e061bae7c67a23ad9a7644613775 Mon Sep 17 00:00:00 2001 From: xamgore <xamgore@ya.ru> Date: Sun, 13 Sep 2015 22:27:08 +0300 Subject: [PATCH] Settings popup improvements - Login filtering - Complex enter key behaviour - Process loading icon --- media/js/profile.js | 1 + media/js/settings.js | 226 ++++++++++-------- media/less/common/forms.less | 7 + .../classes/Controller/Handler/Settings.php | 21 +- .../application/classes/Model/Account.php | 3 + 5 files changed, 151 insertions(+), 107 deletions(-) diff --git a/media/js/profile.js b/media/js/profile.js index 5dda9c565..494e8b9bd 100644 --- a/media/js/profile.js +++ b/media/js/profile.js @@ -12,6 +12,7 @@ $(function () { $('#settingsButton').click(function () { $.get(URLdir + "window/settings", function (data) { wnd.open(JSON.parse(data)); + onSettingsPopup(); }); }); diff --git a/media/js/settings.js b/media/js/settings.js index 0e4887da5..da230883e 100644 --- a/media/js/settings.js +++ b/media/js/settings.js @@ -1,97 +1,129 @@ -var $ = jQuery; -$(function() { - - var checkInput = new Array(); // Массив с ключами валидации (true/false) - $(document) - .on('click', '.changeLogin', function() - { - var jInputLogin = $(".inputLogin").first(); - var jChangeLogin = $(".changeLogin").first(); - var login = jInputLogin.val(); - jChangeLogin.attr("disabled", true); - if (/^[a-zA-Z0-9]+$/.test(login)) - checkInput['login'] = true; - else - checkInput['login'] = false; - - if (checkInput['login'] === true) { - jInputLogin.attr("disabled", true); - $.post(URLdir + 'handler/settings/changeLogin', {'login': login}, - function(data){ - data = $.parseJSON(data); - jInputLogin.removeAttr("disabled"); - jChangeLogin.removeAttr("disabled"); - - if(data.success === true) { - EventInspector_ShowMsg('Логин изменен', 'success'); - jInputLogin.bind("keydown", function(event){ event.preventDefault(); }); - jChangeLogin.html("Логин изменен!").unbind("click"); - } else - EventInspector_ShowMsg('Не удалось изменить логин', 'error'); - } - ); - } - }); - - $('.changeEmail').click(function(){ - if (/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,6})$/.test($('.inputNewEmail').val())) - checkInput['email'] = true; - else checkInput['email'] = false; - - /*alert(checkInput['email']); - if (checkInput['email'] == true) - $.post(URLdir+'/handler/settings/changeEmail', {'email': $('.inputNewEmail').val()}, - function(data){ - - } - ); - */ - }); - - $(document) - .on('click', '.changePass', function() - { - var jChangePass = $(".changePass").first(); - - var jInputPwdCurrent = $('.inputCurrentPass').first(); - var jInputPwdNew = $('.inputNewPass').first(); - var jInputPwdConfirm = $('.inputСonfirmPass').first(); - jChangePass.attr("disabled", true); - - var pwdCurrent = $.trim(jInputPwdCurrent.val()); - var pwdConfirm = $.trim(jInputPwdConfirm.val()); - var pwdNew = $.trim(jInputPwdNew.val()); - - if (pwdCurrent === '' || pwdNew === '' || pwdNew !== pwdConfirm) { - EventInspector_ShowMsg('Не удалось изменить пароль', 'error'); - jChangePass.removeAttr("disabled"); - return; - } - - - $.post(URLdir + 'handler/settings/changePassword', - { - 'old_password': pwdCurrent, - 'password': pwdNew, - 'confirm_password': pwdConfirm - }, - function(data) { - data = $.parseJSON(data); - - if(data.success === true) { - EventInspector_ShowMsg('Пароль изменен', 'success'); - jChangePass.html("Пароль изменен!").unbind("click"); - jInputPwdCurrent.attr("disabled", true); - jInputPwdConfirm.attr("disabled", true); - jInputPwdNew.attr("disabled", true); - - } else - EventInspector_ShowMsg('Не удалось изменить пароль', 'error'); - - jChangePass.removeAttr("disabled"); - } - ); - }); - - -}); +$ = jQuery; + +function onSettingsPopup() { + // login section + var $loginTextBox = $('.inputLogin').first(); + var $changeLoginBut = $('.changeLogin').last(); + var loginTextBoxTitle = $changeLoginBut.text(); + + $loginTextBox.keyup(function (event) { + if (event.keyCode == 13) + $changeLoginBut.trigger('click'); + else { + var prev = $loginTextBox.val(); + $loginTextBox.val(prev.replace(/[^a-z0-9_\-\.]/gi, '')); + } + }); + + $changeLoginBut.click(function () { + var login = $loginTextBox.val(); + + if (!login.length) { + $loginTextBox.focus(); + return; + } + + if (login.length < 2) { + EventInspector.error('Слишком короткий логин, мыслите шире!'); + $loginTextBox.focus(); + return; + } + + if (!/^[a-zA-Z0-9_\-\.]{2,}$/.test(login)) { + EventInspector.error('Некорректные символы в логине, попробуйте ещё раз!'); + $loginTextBox.focus(); + return; + } + + $changeLoginBut.attr('disabled', 'disabled') + .html('<i class="fa fa-circle-o-notch fa-spin"></i>'); + + $.post(URLdir + 'handler/settings/changeLogin', { + 'login': login + }, function (res) { + res.success + ? $changeLoginBut.text('Логин изменён!') + : $changeLoginBut.text('Ошибка!').addClass('Error').removeAttr('disabled'); + + setTimeout(function () { + $changeLoginBut.removeAttr('disabled') + .text(loginTextBoxTitle) + .removeClass('Error'); + }, 1000); + }, 'json'); + }); + + + // password section + var $inputPwdCurrent = $('.inputCurrentPass').first(); + var $inputPwdNew = $('.inputNewPass').first(); + var $inputPwdConfirm = $('.inputСonfirmPass').first(); + + var $changePassBut = $('.changePass').last(); + var passTextBoxTitle = $changeLoginBut.text(); + + $inputPwdCurrent + .add($inputPwdConfirm) + .add($inputPwdNew) + .keyup(function (event) { + if (event.keyCode == 13) + $changePassBut.trigger('click'); + }); + + $changePassBut.click(function () { + var pCurrent = $inputPwdCurrent.val(); + var pConfirm = $inputPwdConfirm.val(); + var pNew = $inputPwdNew.val(); + + if (pCurrent === '') { + $inputPwdCurrent.focus(); + return; + } + + if (pNew === '') { + $inputPwdNew.focus(); + return; + } + + if (pNew !== pConfirm) { + if (pConfirm.length) + EventInspector.error('Пароли не совпадают!'); + $inputPwdConfirm.focus().val(''); + return; + } + + $changePassBut.attr('disabled', 'disabled') + .html('<i class="fa fa-circle-o-notch fa-spin"></i>'); + + $.post(URLdir + 'handler/settings/changePassword', { + 'confirm_password': pConfirm, + 'old_password': pCurrent, + 'password': pNew + }, function (data) { + if (data.success) { + $changePassBut.text('Пароль изменен!'); + } else { + $changePassBut.text('Ошибка!').addClass('Error').removeAttr('disabled'); + } + + $inputPwdCurrent + .add($inputPwdConfirm) + .add($inputPwdNew) + .val(''); + + setTimeout(function () { + $changePassBut.removeAttr('disabled') + .text(passTextBoxTitle) + .removeClass('Error'); + }, 1000); + }, 'json' + ); + }); + + + // email section + $('.changeEmail').click(function () { + //if (/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,6})$/.test($('.inputNewEmail').val())) + // $.post(URLdir+'/handler/settings/changeEmail', {'email': $('.inputNewEmail').val()}, + }); +} diff --git a/media/less/common/forms.less b/media/less/common/forms.less index 05534fd93..86e62e572 100644 --- a/media/less/common/forms.less +++ b/media/less/common/forms.less @@ -73,6 +73,13 @@ input[type=button].defaultForm, button.defaultForm, input[type=submit].defaultFo background: lighten(@ColorLightBlue, 3%); } } + &.Error { + background: @ColorLightenRed; + color: @ColorRedBase; + &:hover { + background: lighten(@ColorLightenRed, 3%); + } + } &.noMargin { margin: 0 auto; } diff --git a/~dev_rating/application/classes/Controller/Handler/Settings.php b/~dev_rating/application/classes/Controller/Handler/Settings.php index 6780cec5d..954e6c1a6 100644 --- a/~dev_rating/application/classes/Controller/Handler/Settings.php +++ b/~dev_rating/application/classes/Controller/Handler/Settings.php @@ -10,19 +10,20 @@ class Controller_Handler_Settings extends Controller_Handler } public function action_changeLogin() { - $config = Kohana::$config->load('security.securityPolicy'); - $this->post->rule('login', $config['login']['allowedSymbols'])->rule('login', 'not_empty'); - $res['success'] = true; - - if ($this->post->check() && $_POST['login'] !== $this->user->Login) { - Model_Account::changeLogin($this->user->ID, $this->post['login']) - ? $this->user->Login = $this->post['login'] - : $this->post->error('login', 'already_exists'); + if ($_POST['login'] !== $this->user->Login) { + try { + Model_Account::changeLogin($this->user->ID, $this->post['login']) + ? $this->user->Login = $this->post['login'] + : $this->post->error('login', 'already_exists'); + } catch (InvalidArgumentException $e) { + $this->post->error('login', 'invalid_symbols'); + } } + $res['success'] = true; if ($this->post->errors()) { - $res['success'] = false; $res['errors'] = $this->post->errors(); + $res['success'] = false; } $this->response->body(json_encode($res)); @@ -48,7 +49,7 @@ class Controller_Handler_Settings extends Controller_Handler if (!User::instance()->changePassword($old, $new)) { $res['success'] = false; - $this->post->error('login', 'invalid_password'); + $this->post->error('password', 'invalid_password'); $res['errors'] = $this->post->errors(); $this->response->body(json_encode($res)); return; diff --git a/~dev_rating/application/classes/Model/Account.php b/~dev_rating/application/classes/Model/Account.php index 29528068f..0d4c29963 100644 --- a/~dev_rating/application/classes/Model/Account.php +++ b/~dev_rating/application/classes/Model/Account.php @@ -83,6 +83,9 @@ class Model_Account extends Model * @return bool true, if login was changed */ public static function changeLogin($accountID, $newLogin) { + if (!preg_match('/^[a-zA-Z0-9_\-\.]{2,}$/', $newLogin)) + throw new InvalidArgumentException('Логин содержит некорректные символы'); + $sql = 'SELECT `ChangeAccountData`(:account, :value, "login") AS Num'; return (bool) DB::query(Database::SELECT, $sql) ->parameters([ -- GitLab