Skip to content

Commit

Permalink
UX: Визуальная проверка (поля, регистрация)
Browse files Browse the repository at this point in the history
См. #7
  • Loading branch information
evgip committed Feb 24, 2023
1 parent a4a3173 commit d62ae6e
Show file tree
Hide file tree
Showing 9 changed files with 242 additions and 6 deletions.
10 changes: 10 additions & 0 deletions app/Languages/ar/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,15 @@
'mail_confirm' => 'بعد تقديم النموذج المكتمل ، سيُطلب منك التحقق من عنوان بريدك الإلكتروني. من المهم ملاحظة أنك لن تتمكن من متابعة بقية عملية الإعداد حتى تنتهي من ذلك.',
'login_info' => 'يمنحك التسجيل القدرة على نشر المنشورات والرد والتعليق والتصويت.',
'invate_text' => 'لست مستخدم حتى الآن؟ يتم التسجيل عن طريق الدعوة فقط لمكافحة البريد العشوائي وزيادة المساءلة. إذا كنت تعرف <a href="/users"> المستخدم الحالي </a> للموقع ، فاطلب منه دعوة.',

// form validation on registration page
'nickname_empty' => 'لا يمكن أن يكون الاسم المستعار فارغًا.',
'nickname_least' => 'يجب أن يكون الاسم المستعار> = {info} حرفًا.',
'email_empty' => 'لا يمكن أن يكون البريد الإلكتروني فارغًا.',
'email_valid' => 'خطأ في البريد الإلكتروني.',
'password_empty' => 'لا يمكن أن تكون كلمة المرور فارغة.',
'password_least' => 'يجب أن تكون كلمة المرور> = {info} حرفًا.',
'password_again' => 'أدخل كلمة المرور مرة أخرى.',
'password_mismatch' => 'كلمة المرور غير متطابقة.',
];

10 changes: 10 additions & 0 deletions app/Languages/en/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,15 @@
'mail_confirm' => 'After submitting the completed form, you will be asked to verify your email address. It is important to note that you will not be able to proceed through the rest of the onboarding process until you have done so.',
'login_info' => 'Authorization gives you the ability to publish posts, reply, comment and vote.',
'invate_text' => 'Not a user yet? Registration is by invitation only to fight spam and increase accountability. If you know the <a href="/users">current user</a> of the site, ask them for an invite.',

// form validation on registration page
'nickname_empty' => 'Nickname cannot be empty.',
'nickname_least' => 'Nickname must be >= {info} characters.',
'email_empty' => 'Email cannot be empty.',
'email_valid' => 'Email error.',
'password_empty' => 'The password cannot be empty.',
'password_least' => 'Password must be >= {info} characters.',
'password_again' => 'Enter the password again.',
'password_mismatch' => 'Password mismatch.',
];

10 changes: 10 additions & 0 deletions app/Languages/ro/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,15 @@
'mail_confirm' => 'După ce ați trimis formularul completat, vi se va cere să vă verificați adresa de e-mail. Este important să rețineți că nu veți putea trece prin restul procesului de îmbarcare până când nu veți face acest lucru.',
'login_info' => 'Autorizarea vă oferă posibilitatea de a publica postări, de a răspunde, de a comenta și de a vota.',
'invate_text' => 'Nu sunteți încă utilizator? Înregistrarea se face doar pe bază de invitație pentru a lupta împotriva spamului și pentru a crește responsabilitatea. Dacă cunoașteți <a href="/users">utilizatorul actual</a> al site-ului, cereți-i o invitație.',

// form validation on registration page
'nickname_empty' => 'Porecla nu poate fi goală.',
'nickname_least' => 'Porecla ar trebui să fie >= {info} caractere.',
'email_empty' => 'E-mailul nu poate fi gol.',
'email_valid' => 'Eroare de e-mail.',
'password_empty' => 'Parola nu poate fi goală.',
'password_least' => 'Parola trebuie să aibă >= {info} caractere.',
'password_again' => 'Introduceți parola din nou.',
'password_mismatch' => 'Parola nepotrivită.',
];

10 changes: 10 additions & 0 deletions app/Languages/ru/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,14 @@
'mail_confirm' => 'После отправки заполненной формы вам будет предложено подтвердить адрес электронной почты. Важно отметить, что вы не сможете пройти остальную часть процесса адаптации, пока не сделаете этого.',
'login_info' => 'Авторизация дает возможность публиковать посты, отвечать, комментировать и голосовать.',
'invate_text' => 'Еще не пользователь? Регистрация осуществляется только по приглашению для борьбы со спамом и повышения ответственности. Если вы знаете <a href="/users">текущего пользователя</a> сайта, попросите у него приглашение.',

// form validation on registration page
'nickname_empty' => 'Никнейм не может быть пустым.',
'nickname_least' => 'Никнейм должно быть >= {info} символов.',
'email_empty' => 'Email не может быть пустым.',
'email_valid' => 'Ошибка в Email.',
'password_empty' => 'Пароль не может быть пустым.',
'password_least' => 'Пароль должен быть >= {info} символов.',
'password_again' => 'Введите пароль еще раз.',
'password_mismatch' => 'Пароли не совпадают.',
];
10 changes: 10 additions & 0 deletions app/Languages/ua/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,15 @@
'mail_confirm' => 'Після надсилання заповненої форми вам буде запропоновано підтвердити адресу електронної пошти. Важливо, що ви зможете пройти решту процесу адаптації, доки зробите цього.',
'login_info' => 'Авторизація дає можливість публікувати пости, відповідати, коментувати та голосувати.',
'invate_text' => 'Ще не користувач? Реєстрація здійснюється тільки на запрошення для боротьби зі спамом та підвищення відповідальності. Якщо ви знаєте <a href="/users">поточного користувача</a> сайту, попросіть у нього запрошення.',

// form validation on registration page
'nickname_empty' => 'Нікнейм не може бути порожнім.',
'nickname_least' => 'Нікнейм має бути >= {info} символів.',
'email_empty' => 'Email не може бути пустим.',
'email_valid' => 'Помилка Email.',
'password_empty' => 'Пароль не може бути пустим.',
'password_least' => 'Пароль має бути >= {info} символів.',
'password_again' => 'Введіть пароль ще раз.',
'password_mismatch' => 'Паролі не співпадають.',
];

10 changes: 10 additions & 0 deletions app/Languages/zh_CN/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,15 @@
'mail_confirm' => '提交完整的表格后,你将被要求验证你的电子邮件地址。重要的是要注意,在完成之前,你将无法完成其余的注册流程。',
'login_info' => '授权使你能够发帖、回复、评论和投票。',
'invate_text' => '还不是用户?当前注册仅通过邀请来打击垃圾邮件并增加责任感。如果你知道<a href="/users">此网站的当前用户</a>,请向他/她索取邀请链接。',

// form validation on registration page
'nickname_empty' => '昵称不能为空。',
'nickname_least' => '昵称必须是 >= {info} 个字符。',
'email_empty' => '电子邮件不能为空。',
'email_valid' => '电子邮件错误。',
'password_empty' => '密码不能为空。',
'password_least' => '密码必须是 >= {info} 个字符。',
'password_again' => '再次输入密码。',
'password_mismatch' => '密码不匹配。',
];

10 changes: 10 additions & 0 deletions app/Languages/zh_TW/auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,15 @@
'mail_confirm' => '提交完整的表格後,您將被要求驗證您的電子郵件地址。 重要的是要注意,在完成之前, 您將無法完成其餘的入職流程。',
'login_info' => '授權使您能夠發布帖子、回复、評論和投票。',
'invate_text' => '还不是用户? 注册仅通过邀请来打击垃圾邮件并增加责任。 如果您知道<a href="/users">该网站的当前用户</a>,请向他索取邀请。',

// form validation on registration page
'nickname_empty' => '昵称不能为空。',
'nickname_least' => '昵称必须是 >= {info} 个字符。',
'email_empty' => '电子邮件不能为空。',
'email_valid' => '电子邮件错误。',
'password_empty' => '密码不能为空。',
'password_least' => '密码必须是 >= {info} 个字符。',
'password_again' => '再次输入密码。',
'password_mismatch' => '密码不匹配。',
];

12 changes: 8 additions & 4 deletions resources/views/default/_block/form/registration.php
Original file line number Diff line number Diff line change
@@ -1,27 +1,31 @@
<fieldset>
<label for="login"><?= __('app.nickname'); ?></label>
<input name="login" type="text" required>
<input name="login" id="login" type="text" required>
<div class="help">>= 3 <?= __('app.characters'); ?> (<?= __('app.english'); ?>)</div>
<small class="red"></small>
</fieldset>

<fieldset>
<label for="email"><?= __('app.email'); ?></label>
<input name="email" type="email" required>
<input name="email" id="email" type="email" required>
<div class="help"><?= __('app.work_email'); ?>...</div>
<small class="red"></small>
</fieldset>

<fieldset>
<label for="password"><?= __('app.password'); ?></label>
<input id="password" name="password" type="password" required>
<input id="password" name="password" type="password" autocomplete="off" required>
<span class="showPassword"><svg class="icons">
<use xlink:href="/assets/svg/icons.svg#eye"></use>
</svg></span>
<div class="help">>= 8 <?= __('app.characters'); ?>...</div>
<small class="red"></small>
</fieldset>

<fieldset>
<label for="password_confirm"><?= __('app.password'); ?></label>
<input name="password_confirm" type="password" required>
<input name="password_confirm" id="password_confirm" type="password" autocomplete="off" required>
<small class="red"></small>
</fieldset>

<?= insert('/_block/form/captcha'); ?>
Expand Down
166 changes: 164 additions & 2 deletions resources/views/default/content/auth/register.php
Original file line number Diff line number Diff line change
@@ -1,16 +1,178 @@
<main>
<h1 class="title-max"><?= __('app.' . $data['sheet']); ?></h1>

<form class="max-w300" action="<?= url('register.add'); ?>" method="post">
<form class="max-w300" action="<?= url('register.add'); ?>" id="registration" method="post">
<?php csrf_field(); ?>
<?= insert('/_block/form/registration'); ?>
</form>

<p><?= __('app.agree_rules'); ?>.</p>
<p><?= __('help.security_info'); ?></p>
</main>

<aside>
<div class="p15 bg-violet">
<?= __('auth.mail_confirm'); ?>
</div>
</aside>
</aside>

<script nonce="<?= $_SERVER['nonce']; ?>">
const nicknameEl = document.querySelector('#login');
const emailEl = document.querySelector('#email');
const passwordEl = document.querySelector('#password');
const confirmPasswordEl = document.querySelector('#password_confirm');
const form = document.querySelector('#registration');

const checkNickname = () => {

let valid = false;

const min = 3,
max = 25;

const nickname = nicknameEl.value.trim();

if (!isRequired(nickname)) {
showError(nicknameEl, '<?= __('auth.nickname_empty'); ?>');
} else if (!isBetween(nickname.length, min, max)) {
showError(nicknameEl, `<?= __('auth.nickname_least', ['info' => 3]); ?>`)
} else {
showSuccess(nicknameEl);
valid = true;
}

return valid;
};

const checkEmail = () => {
let valid = false;
const email = emailEl.value.trim();
if (!isRequired(email)) {
showError(emailEl, '<?= __('auth.email_empty'); ?>');
} else if (!isEmailValid(email)) {
showError(emailEl, '<?= __('auth.email_valid'); ?>')
} else {
showSuccess(emailEl);
valid = true;
}

return valid;
};

const checkPassword = () => {

let valid = false;

const min = 8,
max = 32;

const password = passwordEl.value.trim();

if (!isRequired(password)) {
showError(passwordEl, '<?= __('auth.password_empty'); ?>');
} else if (!isBetween(password.length, min, max)) {
showError(passwordEl, '<?= __('auth.password_least', ['info' => 8]); ?>');
} else {
showSuccess(passwordEl);
valid = true;
}

return valid;
};

const checkConfirmPassword = () => {
let valid = false;

const confirmPassword = confirmPasswordEl.value.trim();
const password = passwordEl.value.trim();

if (!isRequired(confirmPassword)) {
showError(confirmPasswordEl, '<?= __('auth.password_again'); ?>');
} else if (password !== confirmPassword) {
showError(confirmPasswordEl, '<?= __('auth.password_mismatch'); ?>');
} else {
showSuccess(confirmPasswordEl);
valid = true;
}

return valid;
};

const isEmailValid = (email) => {
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
};

const isRequired = value => value === '' ? false : true;
const isBetween = (length, min, max) => length < min || length > max ? false : true;

const showError = (input, message) => {

const formField = input.parentElement;

formField.classList.remove('success');
formField.classList.add('error');

const error = formField.querySelector('small');
error.textContent = message;
};

const showSuccess = (input) => {

const formField = input.parentElement;

formField.classList.remove('error');
formField.classList.add('success');

const error = formField.querySelector('small');
error.textContent = '';
}

form.addEventListener('submit', function(e) {

e.preventDefault();

let isUsernameValid = checkNickname(),
isEmailValid = checkEmail(),
isPasswordValid = checkPassword(),
isConfirmPasswordValid = checkConfirmPassword();

let isFormValid = isUsernameValid &&
isEmailValid &&
isPasswordValid &&
isConfirmPasswordValid;

// если надо отправить, если форма действительна
if (isFormValid) {}
});

const debounce = (fn, delay = 500) => {
let timeoutId;
return (...args) => {
if (timeoutId) {
clearTimeout(timeoutId);
}

timeoutId = setTimeout(() => {
fn.apply(null, args)
}, delay);
};
};

form.addEventListener('input', debounce(function(e) {
switch (e.target.id) {
case 'login':
checkNickname();
break;
case 'email':
checkEmail();
break;
case 'password':
checkPassword();
break;
case 'password_confirm':
checkConfirmPassword();
break;
}
}));
</script>

0 comments on commit d62ae6e

Please sign in to comment.