Skip to content

Commit 6dfa9ad

Browse files
Add password strength indicator.
1 parent 5eabd47 commit 6dfa9ad

12 files changed

+1098
-911
lines changed

assets/js/password/check.js

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
const passwordField = document.querySelector('.js-password-input');
2+
const passwordStrength = document.querySelector('.js-password-strength');
3+
const username = document.querySelector('.js-username');
4+
const email = document.querySelector('.js-email-address');
5+
6+
function resetBackgroundColor() {
7+
for (let i = 0; i < 5; i++) {
8+
passwordStrength.children.item(i).classList.add('u-bg-gray-20');
9+
passwordStrength.children.item(i).classList.remove('u-bg-red');
10+
passwordStrength.children.item(i).classList.remove('u-bg-bewelcome');
11+
passwordStrength.children.item(i).classList.remove('u-bg-bewelcome-dark');
12+
passwordStrength.children.item(i).classList.remove('u-bg-green');
13+
passwordStrength.children.item(i).classList.remove('u-bg-green-dark');
14+
}
15+
}
16+
async function getPasswordScore() {
17+
// Collect form data (username, email address and password)
18+
// Send to server to calculate score
19+
// Change colors
20+
const formData = new FormData();
21+
formData.append('username', username.value);
22+
formData.append('email', email.value);
23+
formData.append('password', passwordField.value);
24+
25+
let score = 0;
26+
try {
27+
const response = await fetch("/password/check/", {
28+
method: "POST",
29+
// Set the FormData instance as the request body
30+
body: formData,
31+
});
32+
const json = await response.json();
33+
score = json.score;
34+
} catch (e) {
35+
console.error(e);
36+
}
37+
38+
let backgroundColor;
39+
switch(score) {
40+
case 0: backgroundColor = 'u-bg-red'; break;
41+
case 1: backgroundColor = 'u-bg-bewelcome-dark'; break;
42+
case 2: backgroundColor = 'u-bg-bewelcome'; break;
43+
case 3: backgroundColor = 'u-bg-green'; break;
44+
case 4: backgroundColor = 'u-bg-green-dark'; break;
45+
}
46+
47+
resetBackgroundColor();
48+
for (let i = 0; i < 5; i++) {
49+
if (i <= score) {
50+
passwordStrength.children.item(i).classList.remove('u-bg-gray-20');
51+
passwordStrength.children.item(i).classList.add(backgroundColor);
52+
}
53+
}
54+
}
55+
56+
let timeout;
57+
58+
passwordField.addEventListener('keyup', () => {
59+
clearTimeout(timeout);
60+
if (passwordField.value == '') {
61+
for (let i = 0; i < 5; i++) {
62+
resetBackgroundColor();
63+
}
64+
} else {
65+
timeout = setTimeout(() => { getPasswordScore(); }, 500);
66+
}
67+
});
68+
69+
if (passwordField.value != '') {
70+
g
71+
}

assets/js/password/showhide.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
const passwordField = document.querySelector('input[type="password"]');
2-
const showHidePasswordButton = document.getElementById("password_show_hide");
1+
const passwordField = document.querySelector('.js-password-input');
2+
const showHidePasswordButton = document.querySelector('.js-password-show-hide');
3+
34
const showHidePassword = (event) => {
45
if (passwordField.type === 'text') {
56
passwordField.type = 'password';

assets/scss/bewelcome.scss

+12
Original file line numberDiff line numberDiff line change
@@ -587,3 +587,15 @@ $avatar-sizes: 30, 50, 75, 100, 150, 200, 500;
587587
color: white;
588588
background-color: #ffb474;
589589
}
590+
591+
.js-password-input:placeholder-shown ~ .js-password-show-hide {
592+
visibility: hidden;
593+
}
594+
595+
.js-password-input:not(:placeholder-shown) ~ .js-password-show-hide {
596+
visibility: visible;
597+
}
598+
599+
.js-password-input.is-invalid ~ .js-password-show-hide {
600+
right: 24px;
601+
}

composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"api-platform/core": "2.*",
2525
"babdev/pagerfanta-bundle": "3.*",
2626
"beberlei/doctrineextensions": "^1.3",
27+
"bjeavons/zxcvbn-php": "^1.3",
2728
"doctrine/doctrine-bundle": "^2.0",
2829
"doctrine/doctrine-migrations-bundle": "^2.0",
2930
"doctrine/orm": "^2.8.4",

0 commit comments

Comments
 (0)