refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
/* Auth Module JavaScript - Login, Register, Forgot Password, Reset Password */
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Toggle password visibility
|
|
|
|
|
* @param {string} inputId - ID of the password input
|
|
|
|
|
* @param {string} eyeIconId - ID of the eye icon
|
|
|
|
|
* @param {string} eyeOffIconId - ID of the eye-off icon
|
|
|
|
|
*/
|
2026-01-06 22:57:00 -03:00
|
|
|
function togglePassword(
|
|
|
|
|
inputId = "password",
|
|
|
|
|
eyeIconId = "eye-icon",
|
|
|
|
|
eyeOffIconId = "eye-off-icon",
|
|
|
|
|
) {
|
|
|
|
|
const passwordInput = document.getElementById(inputId);
|
|
|
|
|
const eyeIcon = document.getElementById(eyeIconId);
|
|
|
|
|
const eyeOffIcon = document.getElementById(eyeOffIconId);
|
|
|
|
|
|
|
|
|
|
if (passwordInput.type === "password") {
|
|
|
|
|
passwordInput.type = "text";
|
|
|
|
|
if (eyeIcon) eyeIcon.style.display = "none";
|
|
|
|
|
if (eyeOffIcon) eyeOffIcon.style.display = "block";
|
|
|
|
|
} else {
|
|
|
|
|
passwordInput.type = "password";
|
|
|
|
|
if (eyeIcon) eyeIcon.style.display = "block";
|
|
|
|
|
if (eyeOffIcon) eyeOffIcon.style.display = "none";
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initiate OAuth login flow
|
|
|
|
|
* @param {string} provider - OAuth provider name (google, microsoft, github, apple)
|
|
|
|
|
*/
|
|
|
|
|
function oauthLogin(provider) {
|
2026-01-06 22:57:00 -03:00
|
|
|
window.location.href = `/api/auth/oauth/${provider}`;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Show 2FA challenge section
|
|
|
|
|
* @param {string} sessionToken - Session token for 2FA verification
|
|
|
|
|
*/
|
|
|
|
|
function showTwoFAChallenge(sessionToken) {
|
2026-01-06 22:57:00 -03:00
|
|
|
document.getElementById("login-section").style.display = "none";
|
|
|
|
|
document.getElementById("twofa-section").classList.add("visible");
|
|
|
|
|
document.getElementById("session-token").value = sessionToken;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2026-01-06 22:57:00 -03:00
|
|
|
// Focus first code input
|
|
|
|
|
const firstInput = document.querySelector('.code-input[data-index="0"]');
|
|
|
|
|
if (firstInput) firstInput.focus();
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return to login section from 2FA
|
|
|
|
|
*/
|
|
|
|
|
function backToLogin() {
|
2026-01-06 22:57:00 -03:00
|
|
|
document.getElementById("login-section").style.display = "block";
|
|
|
|
|
document.getElementById("twofa-section").classList.remove("visible");
|
|
|
|
|
|
|
|
|
|
// Clear code inputs
|
|
|
|
|
document.querySelectorAll(".code-input").forEach((input) => {
|
|
|
|
|
input.value = "";
|
|
|
|
|
input.classList.remove("filled");
|
|
|
|
|
});
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update the hidden full code field from individual inputs
|
|
|
|
|
*/
|
|
|
|
|
function updateFullCode() {
|
2026-01-06 22:57:00 -03:00
|
|
|
const codeInputs = document.querySelectorAll(".code-input");
|
|
|
|
|
const code = Array.from(codeInputs)
|
|
|
|
|
.map((input) => input.value)
|
|
|
|
|
.join("");
|
|
|
|
|
const fullCodeInput = document.getElementById("full-code");
|
|
|
|
|
if (fullCodeInput) fullCodeInput.value = code;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initialize 2FA code input handling
|
|
|
|
|
*/
|
|
|
|
|
function initCodeInputs() {
|
2026-01-06 22:57:00 -03:00
|
|
|
const codeInputs = document.querySelectorAll(".code-input");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2026-01-06 22:57:00 -03:00
|
|
|
codeInputs.forEach((input, index) => {
|
|
|
|
|
input.addEventListener("input", (e) => {
|
|
|
|
|
const value = e.target.value;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2026-01-06 22:57:00 -03:00
|
|
|
// Only allow numbers
|
|
|
|
|
e.target.value = value.replace(/[^0-9]/g, "");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2026-01-06 22:57:00 -03:00
|
|
|
if (e.target.value) {
|
|
|
|
|
e.target.classList.add("filled");
|
|
|
|
|
// Move to next input
|
|
|
|
|
if (index < codeInputs.length - 1) {
|
|
|
|
|
codeInputs[index + 1].focus();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
e.target.classList.remove("filled");
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2026-01-06 22:57:00 -03:00
|
|
|
updateFullCode();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
input.addEventListener("keydown", (e) => {
|
|
|
|
|
// Handle backspace
|
|
|
|
|
if (e.key === "Backspace" && !e.target.value && index > 0) {
|
|
|
|
|
codeInputs[index - 1].focus();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle paste
|
|
|
|
|
if (e.key === "v" && (e.ctrlKey || e.metaKey)) {
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
navigator.clipboard.readText().then((text) => {
|
|
|
|
|
const code = text.replace(/[^0-9]/g, "").slice(0, 6);
|
|
|
|
|
code.split("").forEach((char, i) => {
|
|
|
|
|
if (codeInputs[i]) {
|
|
|
|
|
codeInputs[i].value = char;
|
|
|
|
|
codeInputs[i].classList.add("filled");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
2026-01-06 22:57:00 -03:00
|
|
|
});
|
|
|
|
|
updateFullCode();
|
|
|
|
|
if (code.length === 6) {
|
|
|
|
|
codeInputs[5].focus();
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
});
|
2026-01-06 22:57:00 -03:00
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
});
|
2026-01-06 22:57:00 -03:00
|
|
|
|
|
|
|
|
// Handle paste directly on input
|
|
|
|
|
input.addEventListener("paste", (e) => {
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
const text = e.clipboardData.getData("text");
|
|
|
|
|
const code = text.replace(/[^0-9]/g, "").slice(0, 6);
|
|
|
|
|
code.split("").forEach((char, i) => {
|
|
|
|
|
if (codeInputs[i]) {
|
|
|
|
|
codeInputs[i].value = char;
|
|
|
|
|
codeInputs[i].classList.add("filled");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
updateFullCode();
|
|
|
|
|
if (code.length === 6) {
|
|
|
|
|
codeInputs[5].focus();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Resend 2FA code with cooldown
|
|
|
|
|
*/
|
|
|
|
|
let resendCooldown = 0;
|
|
|
|
|
function resendCode() {
|
2026-01-06 22:57:00 -03:00
|
|
|
if (resendCooldown > 0) return;
|
|
|
|
|
|
|
|
|
|
const sessionToken = document.getElementById("session-token").value;
|
|
|
|
|
fetch("/api/auth/2fa/resend", {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers: { "Content-Type": "application/json" },
|
|
|
|
|
body: JSON.stringify({ session_token: sessionToken }),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Start cooldown
|
|
|
|
|
resendCooldown = 60;
|
|
|
|
|
const resendBtn = document.getElementById("resend-btn");
|
|
|
|
|
resendBtn.disabled = true;
|
|
|
|
|
|
|
|
|
|
const interval = setInterval(() => {
|
|
|
|
|
resendCooldown--;
|
|
|
|
|
resendBtn.textContent = `Resend code (${resendCooldown}s)`;
|
|
|
|
|
|
|
|
|
|
if (resendCooldown <= 0) {
|
|
|
|
|
clearInterval(interval);
|
|
|
|
|
resendBtn.textContent = "Resend code";
|
|
|
|
|
resendBtn.disabled = false;
|
|
|
|
|
}
|
|
|
|
|
}, 1000);
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Show error message
|
|
|
|
|
* @param {string} message - Error message to display
|
|
|
|
|
*/
|
|
|
|
|
function showError(message) {
|
2026-01-06 22:57:00 -03:00
|
|
|
const errorBox = document.getElementById("error-message");
|
|
|
|
|
const errorText = document.getElementById("error-text");
|
|
|
|
|
if (errorText) errorText.textContent = message;
|
|
|
|
|
if (errorBox) errorBox.classList.add("visible");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Hide error message
|
|
|
|
|
*/
|
|
|
|
|
function hideError() {
|
2026-01-06 22:57:00 -03:00
|
|
|
const errorBox = document.getElementById("error-message");
|
|
|
|
|
if (errorBox) errorBox.classList.remove("visible");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Show success message
|
|
|
|
|
* @param {string} message - Success message to display
|
|
|
|
|
*/
|
|
|
|
|
function showSuccess(message) {
|
2026-01-06 22:57:00 -03:00
|
|
|
const successBox = document.getElementById("success-message");
|
|
|
|
|
const successText = document.getElementById("success-text");
|
|
|
|
|
if (successText) successText.textContent = message;
|
|
|
|
|
if (successBox) successBox.classList.add("visible");
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set loading state on a button
|
|
|
|
|
* @param {string} btnId - Button ID
|
|
|
|
|
* @param {boolean} loading - Loading state
|
|
|
|
|
*/
|
|
|
|
|
function setLoading(btnId, loading) {
|
2026-01-06 22:57:00 -03:00
|
|
|
const btn = document.getElementById(btnId);
|
|
|
|
|
if (!btn) return;
|
|
|
|
|
|
|
|
|
|
if (loading) {
|
|
|
|
|
btn.classList.add("loading");
|
|
|
|
|
btn.disabled = true;
|
|
|
|
|
} else {
|
|
|
|
|
btn.classList.remove("loading");
|
|
|
|
|
btn.disabled = false;
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check password strength
|
|
|
|
|
* @param {string} password - Password to check
|
|
|
|
|
* @returns {object} - Strength level and requirements met
|
|
|
|
|
*/
|
|
|
|
|
function checkPasswordStrength(password) {
|
2026-01-06 22:57:00 -03:00
|
|
|
const requirements = {
|
|
|
|
|
length: password.length >= 8,
|
|
|
|
|
lowercase: /[a-z]/.test(password),
|
|
|
|
|
uppercase: /[A-Z]/.test(password),
|
|
|
|
|
number: /[0-9]/.test(password),
|
|
|
|
|
special: /[!@#$%^&*(),.?":{}|<>]/.test(password),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const metCount = Object.values(requirements).filter(Boolean).length;
|
|
|
|
|
|
|
|
|
|
let strength = "weak";
|
|
|
|
|
if (metCount >= 5) strength = "strong";
|
|
|
|
|
else if (metCount >= 4) strength = "good";
|
|
|
|
|
else if (metCount >= 3) strength = "fair";
|
|
|
|
|
|
|
|
|
|
return { strength, requirements, metCount };
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update password strength indicator
|
|
|
|
|
* @param {string} password - Password to check
|
|
|
|
|
*/
|
|
|
|
|
function updatePasswordStrength(password) {
|
2026-01-06 22:57:00 -03:00
|
|
|
const { strength, requirements } = checkPasswordStrength(password);
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
|
2026-01-06 22:57:00 -03:00
|
|
|
const strengthFill = document.querySelector(".strength-fill");
|
|
|
|
|
const strengthText = document.querySelector(".strength-text");
|
|
|
|
|
|
|
|
|
|
if (strengthFill) {
|
|
|
|
|
strengthFill.className = "strength-fill " + strength;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (strengthText) {
|
|
|
|
|
const labels = {
|
|
|
|
|
weak: "Weak",
|
|
|
|
|
fair: "Fair",
|
|
|
|
|
good: "Good",
|
|
|
|
|
strong: "Strong",
|
|
|
|
|
};
|
|
|
|
|
strengthText.textContent = labels[strength];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update requirement indicators
|
|
|
|
|
Object.entries(requirements).forEach(([key, met]) => {
|
|
|
|
|
const reqEl = document.querySelector(`.requirement[data-req="${key}"]`);
|
|
|
|
|
if (reqEl) {
|
|
|
|
|
reqEl.classList.toggle("met", met);
|
|
|
|
|
}
|
|
|
|
|
});
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initialize password strength checker
|
|
|
|
|
*/
|
|
|
|
|
function initPasswordStrength() {
|
2026-01-06 22:57:00 -03:00
|
|
|
const passwordInput = document.getElementById("password");
|
|
|
|
|
if (passwordInput) {
|
|
|
|
|
passwordInput.addEventListener("input", (e) => {
|
|
|
|
|
updatePasswordStrength(e.target.value);
|
|
|
|
|
});
|
|
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Handle HTMX events for auth forms
|
|
|
|
|
*/
|
|
|
|
|
function initHtmxHandlers() {
|
2026-01-06 22:57:00 -03:00
|
|
|
document.body.addEventListener("htmx:beforeRequest", function (event) {
|
|
|
|
|
hideError();
|
|
|
|
|
if (event.target.id === "login-form") {
|
|
|
|
|
setLoading("login-btn", true);
|
|
|
|
|
} else if (event.target.id === "twofa-form") {
|
|
|
|
|
setLoading("verify-btn", true);
|
|
|
|
|
} else if (event.target.id === "register-form") {
|
|
|
|
|
setLoading("register-btn", true);
|
|
|
|
|
} else if (event.target.id === "forgot-form") {
|
|
|
|
|
setLoading("forgot-btn", true);
|
|
|
|
|
} else if (event.target.id === "reset-form") {
|
|
|
|
|
setLoading("reset-btn", true);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
document.body.addEventListener("htmx:afterRequest", function (event) {
|
|
|
|
|
if (event.target.id === "login-form") {
|
|
|
|
|
setLoading("login-btn", false);
|
|
|
|
|
} else if (event.target.id === "twofa-form") {
|
|
|
|
|
setLoading("verify-btn", false);
|
|
|
|
|
} else if (event.target.id === "register-form") {
|
|
|
|
|
setLoading("register-btn", false);
|
|
|
|
|
} else if (event.target.id === "forgot-form") {
|
|
|
|
|
setLoading("forgot-btn", false);
|
|
|
|
|
} else if (event.target.id === "reset-form") {
|
|
|
|
|
setLoading("reset-btn", false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (event.detail.successful) {
|
|
|
|
|
try {
|
|
|
|
|
const response = JSON.parse(event.detail.xhr.responseText);
|
|
|
|
|
|
|
|
|
|
// Check if 2FA is required
|
|
|
|
|
if (response.requires_2fa) {
|
|
|
|
|
showTwoFAChallenge(response.session_token);
|
|
|
|
|
return;
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
2026-01-07 07:03:07 -03:00
|
|
|
// Save token using GBAuth service if available
|
2026-01-06 22:57:00 -03:00
|
|
|
if (response.access_token) {
|
|
|
|
|
const rememberMe = document.getElementById("remember");
|
2026-01-07 07:03:07 -03:00
|
|
|
const remember = rememberMe && rememberMe.checked;
|
|
|
|
|
|
|
|
|
|
if (window.AuthService && window.AuthService.storeTokens) {
|
|
|
|
|
window.AuthService.storeTokens(
|
|
|
|
|
response.access_token,
|
|
|
|
|
response.refresh_token,
|
|
|
|
|
response.expires_in,
|
|
|
|
|
remember,
|
|
|
|
|
);
|
|
|
|
|
if (response.user_id) {
|
|
|
|
|
window.AuthService.currentUser = { id: response.user_id };
|
|
|
|
|
}
|
2026-01-06 22:57:00 -03:00
|
|
|
} else {
|
2026-01-07 07:03:07 -03:00
|
|
|
// Fallback to direct storage with correct keys
|
|
|
|
|
const storage = remember ? localStorage : sessionStorage;
|
|
|
|
|
storage.setItem("gb-access-token", response.access_token);
|
|
|
|
|
if (response.refresh_token) {
|
|
|
|
|
storage.setItem("gb-refresh-token", response.refresh_token);
|
|
|
|
|
}
|
|
|
|
|
if (response.expires_in) {
|
|
|
|
|
const expiresAt = Date.now() + response.expires_in * 1000;
|
|
|
|
|
storage.setItem("gb-token-expires", expiresAt.toString());
|
|
|
|
|
}
|
2026-01-06 22:57:00 -03:00
|
|
|
}
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
2026-01-06 22:57:00 -03:00
|
|
|
// Successful login/register - redirect
|
|
|
|
|
if (response.redirect || response.success) {
|
|
|
|
|
window.location.href = response.redirect || "/";
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
2026-01-06 22:57:00 -03:00
|
|
|
|
|
|
|
|
// Show success message
|
|
|
|
|
if (response.message) {
|
|
|
|
|
showSuccess(response.message);
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// If response is not JSON, check for redirect header
|
|
|
|
|
if (event.detail.xhr.status === 200) {
|
|
|
|
|
window.location.href = "/";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// Show error
|
|
|
|
|
try {
|
|
|
|
|
const response = JSON.parse(event.detail.xhr.responseText);
|
|
|
|
|
showError(response.error || "An error occurred. Please try again.");
|
|
|
|
|
} catch (e) {
|
|
|
|
|
showError("An error occurred. Please try again.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initialize auth module
|
|
|
|
|
*/
|
|
|
|
|
function initAuth() {
|
2026-01-06 22:57:00 -03:00
|
|
|
initCodeInputs();
|
|
|
|
|
initPasswordStrength();
|
|
|
|
|
initHtmxHandlers();
|
|
|
|
|
|
|
|
|
|
// Clear error when user starts typing
|
|
|
|
|
document.querySelectorAll(".form-input").forEach((input) => {
|
|
|
|
|
input.addEventListener("input", hideError);
|
|
|
|
|
});
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Auto-initialize when DOM is ready
|
2026-01-06 22:57:00 -03:00
|
|
|
if (document.readyState === "loading") {
|
|
|
|
|
document.addEventListener("DOMContentLoaded", initAuth);
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
} else {
|
2026-01-06 22:57:00 -03:00
|
|
|
initAuth();
|
refactor: Extract inline CSS/JS to separate files for monitoring module
- Create individual CSS files: monitoring.css, alerts.css, health.css, logs.css, metrics.css, resources.css
- Create individual JS files: monitoring.js, alerts.js, health.js, logs.js, metrics.js, resources.js
- Update HTML files to reference external CSS/JS files
- Add CSS/JS files for other modules (analytics, chat, mail, meet, tasks, etc.)
- Remove obsolete implementation plan files
2025-12-07 09:56:27 -03:00
|
|
|
}
|