78 lines
2.2 KiB
JavaScript
78 lines
2.2 KiB
JavaScript
/**
|
|
* GLOBAL PASSWORD VALIDATION
|
|
* ----------------------------------
|
|
* - Min 12 characters
|
|
* - Uppercase, lowercase
|
|
* - Number & symbol
|
|
*/
|
|
|
|
window.PasswordValidator = (function () {
|
|
let states = {};
|
|
|
|
function validate(value) {
|
|
const errors = [];
|
|
|
|
if (value.length < 12) errors.push("Minimum 12 characters");
|
|
if (!/[a-z]/.test(value)) errors.push("At least 1 lowercase letter");
|
|
if (!/[A-Z]/.test(value)) errors.push("At least 1 uppercase letter");
|
|
if (!/[0-9]/.test(value)) errors.push("At least 1 number");
|
|
if (!/[@$!%*#?&^()_\-+=]/.test(value)) errors.push("At least 1 symbol");
|
|
|
|
return errors;
|
|
}
|
|
|
|
function bind(options) {
|
|
const { inputId, errorId, formSelector, required = true } = options;
|
|
|
|
const input = document.getElementById(inputId);
|
|
const errorBox = document.getElementById(errorId);
|
|
const form = document.querySelector(formSelector);
|
|
|
|
if (!input || !errorBox || !form) return;
|
|
|
|
states[inputId] = !required;
|
|
|
|
input.addEventListener("input", () => {
|
|
const value = input.value.trim();
|
|
|
|
if (!required && value === "") {
|
|
reset(input, errorBox);
|
|
states[inputId] = true;
|
|
return;
|
|
}
|
|
|
|
const errors = validate(value);
|
|
|
|
if (errors.length) {
|
|
input.classList.add("is-invalid");
|
|
errorBox.classList.remove("d-none");
|
|
errorBox.innerHTML = errors.map((e) => `• ${e}`).join("<br>");
|
|
states[inputId] = false;
|
|
} else {
|
|
reset(input, errorBox);
|
|
states[inputId] = true;
|
|
}
|
|
});
|
|
|
|
form.addEventListener("submit", (e) => {
|
|
if (!states[inputId]) {
|
|
e.preventDefault();
|
|
Swal.fire({
|
|
icon: "error",
|
|
title: "Invalid Password",
|
|
text: "Password does not meet the required criteria.",
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function reset(input, errorBox) {
|
|
input.classList.remove("is-invalid");
|
|
errorBox.classList.add("d-none");
|
|
}
|
|
|
|
return {
|
|
bind,
|
|
};
|
|
})();
|