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