+71
-24
@@ -43,6 +43,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
document.getElementById('saveLink').addEventListener('click', saveLink);
|
||||
document.getElementById('saveShape').addEventListener('click', saveShape);
|
||||
document.getElementById('addUserBtn').addEventListener('click', addUser);
|
||||
document.getElementById('logoutBtn').addEventListener('click', logout);
|
||||
document.getElementById('teamFilter').addEventListener('change', renderTimeline);
|
||||
document.getElementById('searchEvents').addEventListener('input', renderTimeline);
|
||||
document.getElementById('shapeOpacity').addEventListener('input', (e) => {
|
||||
@@ -892,43 +893,89 @@ let currentRole = null;
|
||||
async function checkSession() {
|
||||
try {
|
||||
const res = await fetch('/api/session');
|
||||
if (res.redirected || !res.ok) {
|
||||
window.location.replace('/login.php');
|
||||
return;
|
||||
}
|
||||
const data = await res.json();
|
||||
if (data.loggedin) {
|
||||
currentUser = data.username;
|
||||
currentRole = data.role;
|
||||
document.getElementById('userDisplay').textContent = data.username;
|
||||
if (data.role === 'admin' || data.admin_count === 0) {
|
||||
if (data.role === 'admin') {
|
||||
document.getElementById('settingsBtn').classList.remove('d-none');
|
||||
}
|
||||
document.getElementById('loginOverlay').style.display = 'none';
|
||||
return;
|
||||
}
|
||||
} catch (_) {}
|
||||
// Show login overlay
|
||||
document.getElementById('loginOverlay').style.display = 'flex';
|
||||
}
|
||||
|
||||
async function performLogin(authToken) {
|
||||
const errEl = document.getElementById('loginError');
|
||||
const sucEl = document.getElementById('loginSuccess');
|
||||
errEl.style.display = 'none';
|
||||
sucEl.style.display = 'none';
|
||||
try {
|
||||
const res = await fetch('/api/login', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ auth_token: authToken })
|
||||
});
|
||||
const data = await res.json();
|
||||
if (data.status === 'success') {
|
||||
currentUser = data.username;
|
||||
currentRole = data.role;
|
||||
document.getElementById('userDisplay').textContent = data.username;
|
||||
if (data.role === 'admin') document.getElementById('settingsBtn').classList.remove('d-none');
|
||||
document.getElementById('loginOverlay').style.display = 'none';
|
||||
// Clean URL
|
||||
window.history.replaceState({}, '', '/');
|
||||
// Reload data
|
||||
loadTeams().then(() => loadEvents());
|
||||
loadNetworkData();
|
||||
} else {
|
||||
window.location.replace('/login.php');
|
||||
errEl.textContent = data.error || 'Login failed';
|
||||
errEl.style.display = 'block';
|
||||
}
|
||||
} catch (e) {
|
||||
// Retry once after a brief delay in case of transient network issue
|
||||
setTimeout(async () => {
|
||||
try {
|
||||
const res = await fetch('/api/session');
|
||||
if (!res.ok || res.redirected) throw new Error();
|
||||
const data = await res.json();
|
||||
if (data.loggedin) {
|
||||
currentUser = data.username;
|
||||
currentRole = data.role;
|
||||
document.getElementById('userDisplay').textContent = data.username;
|
||||
if (data.role === 'admin' || data.admin_count === 0) {
|
||||
document.getElementById('settingsBtn').classList.remove('d-none');
|
||||
}
|
||||
return;
|
||||
}
|
||||
} catch (_) {}
|
||||
window.location.replace('/login.php');
|
||||
}, 500);
|
||||
errEl.textContent = 'Connection error';
|
||||
errEl.style.display = 'block';
|
||||
}
|
||||
}
|
||||
|
||||
async function logout() {
|
||||
await apiFetch('logout', { method: 'POST' });
|
||||
currentUser = null;
|
||||
currentRole = null;
|
||||
document.getElementById('settingsBtn').classList.add('d-none');
|
||||
document.getElementById('userDisplay').textContent = '';
|
||||
document.getElementById('loginOverlay').style.display = 'flex';
|
||||
}
|
||||
|
||||
// Check for auth token in URL on page load
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const authToken = params.get('auth');
|
||||
if (authToken) {
|
||||
// Show a loading state on overlay
|
||||
document.getElementById('loginOverlay').style.display = 'flex';
|
||||
document.querySelector('#loginOverlay .btn').textContent = 'Authenticating...';
|
||||
performLogin(authToken);
|
||||
}
|
||||
|
||||
checkSession().then(() => {
|
||||
// Init canvas and load data
|
||||
canvas = document.getElementById('networkCanvas');
|
||||
ctx = canvas.getContext('2d');
|
||||
resizeCanvas();
|
||||
|
||||
loadTeams().then(() => loadEvents());
|
||||
loadNetworkData();
|
||||
|
||||
document.getElementById('loginBtn').addEventListener('click', () => {
|
||||
const callbackUrl = window.location.origin + '/?auth_callback=1';
|
||||
window.location.href = 'https://auth.jakach.ch/?send_to=' + encodeURIComponent(callbackUrl);
|
||||
});
|
||||
|
||||
async function loadUsers() {
|
||||
const list = document.getElementById('userList');
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user