Changeset 0.22.10 (#152)

This commit is contained in:
2026-03-04 22:37:57 +00:00
parent 6ed76fb2d3
commit 40d9834f64
15 changed files with 1014 additions and 515 deletions

View File

@@ -211,7 +211,7 @@
<div class="auth-tabs anim anim-a2">
<button class="auth-tab active" id="tabLogin" onclick="_switchTab('login')">Log In</button>
<button class="auth-tab" id="tabRegister" onclick="_switchTab('register')">Register</button>
{{if .RegistrationOpen}}<button class="auth-tab" id="tabRegister" onclick="_switchTab('register')">Register</button>{{end}}
</div>
<!-- LOGIN FORM -->
@@ -229,6 +229,7 @@
</div>
<!-- REGISTER FORM -->
{{if .RegistrationOpen}}
<div id="registerForm" style="display:none;">
<div class="form-field">
<label for="regUsername">Username</label>
@@ -249,6 +250,7 @@
<p class="auth-error" id="regError" style="display:none;"></p>
<button class="btn-login" id="regBtn" onclick="_doRegister()">Create Account</button>
</div>
{{end}}
<div class="auth-footer">
<p>Self-hosted instance &middot; Your data stays on your infrastructure</p>
@@ -272,15 +274,18 @@
<script>
function _switchTab(tab) {
document.getElementById('loginForm').style.display = tab === 'login' ? '' : 'none';
document.getElementById('registerForm').style.display = tab === 'register' ? '' : 'none';
const regForm = document.getElementById('registerForm');
if (regForm) regForm.style.display = tab === 'register' ? '' : 'none';
document.getElementById('tabLogin').classList.toggle('active', tab === 'login');
document.getElementById('tabRegister').classList.toggle('active', tab === 'register');
const regTab = document.getElementById('tabRegister');
if (regTab) regTab.classList.toggle('active', tab === 'register');
document.getElementById('authTitle').textContent = tab === 'login' ? 'Welcome back' : 'Create account';
document.getElementById('authSubtitle').textContent = tab === 'login'
? 'Sign in to your Switchboard instance'
: 'Join your team on Switchboard';
document.getElementById('loginError').textContent = '';
document.getElementById('regError').textContent = '';
const regErr = document.getElementById('regError');
if (regErr) { regErr.textContent = ''; regErr.style.display = 'none'; }
}
async function _doRegister() {
@@ -291,10 +296,11 @@
const errEl = document.getElementById('regError');
const btn = document.getElementById('regBtn');
if (!username || !password) { errEl.textContent = 'Username and password are required'; return; }
if (password.length < 8) { errEl.textContent = 'Password must be at least 8 characters'; return; }
if (password !== confirm) { errEl.textContent = 'Passwords do not match'; return; }
if (!username || !password) { errEl.textContent = 'Username and password are required'; errEl.style.display = ''; return; }
if (password.length < 8) { errEl.textContent = 'Password must be at least 8 characters'; errEl.style.display = ''; return; }
if (password !== confirm) { errEl.textContent = 'Passwords do not match'; errEl.style.display = ''; return; }
errEl.style.display = 'none';
errEl.textContent = '';
btn.disabled = true; btn.textContent = 'Creating account\u2026';
@@ -313,7 +319,8 @@
if (data.pending) {
errEl.textContent = 'Account created — pending admin approval.';
errEl.style.color = 'var(--success)';
setTimeout(() => { errEl.style.color = ''; _switchTab('login'); }, 3000);
errEl.style.display = '';
setTimeout(() => { errEl.style.color = ''; errEl.style.display = 'none'; _switchTab('login'); }, 3000);
} else {
// Auto-login
const storageKey = base ? 'sb_auth_' + base.replace(/\//g, '') : 'sb_auth';
@@ -325,6 +332,7 @@
}
} catch (e) {
errEl.textContent = e.message;
errEl.style.display = '';
} finally {
btn.disabled = false; btn.textContent = 'Create Account';
}
@@ -337,7 +345,7 @@
document.getElementById('loginUsername').addEventListener('keydown', e => {
if (e.key === 'Enter') document.getElementById('loginPassword').focus();
});
document.getElementById('regConfirm').addEventListener('keydown', e => {
document.getElementById('regConfirm')?.addEventListener('keydown', e => {
if (e.key === 'Enter') _doRegister();
});
</script>