Files
SuperSunday/frontend/public/assets/admin.ux.js
karim hassan f1103d67a0 🚀 Patch auto
2025-08-24 23:00:40 +00:00

161 lines
5.9 KiB
JavaScript

import {
bindLoginForm, isAuthenticated, logout,
createTournament, addParticipant, scoreMatch,
listTournaments, listMatches
} from '/assets/api.js?v=10';
const toast = document.getElementById('toast');
const adminSection = document.getElementById('adminSection');
const loginSection = document.getElementById('loginSection');
function showToast(msg, ok=true){
toast.textContent = msg;
toast.style.borderColor = ok ? 'rgba(143,237,255,.45)' : 'rgba(255,120,120,.45)';
toast.classList.add('show');
setTimeout(()=>toast.classList.remove('show'), 2200);
}
function toggleAdminUI(){
const logged = isAuthenticated();
adminSection.classList.toggle('hide', !logged);
loginSection.classList.toggle('hide', logged);
}
function disable(btn, spin, yes){
btn.disabled = !!yes;
spin.classList.toggle('hide', !yes);
}
async function renderTournaments(){
const wrap = document.getElementById('listTournaments');
const p_tid = document.getElementById('p_tid');
const s_tid = document.getElementById('s_tid');
try{
const ts = await listTournaments();
wrap.innerHTML = ts.map(t => `<div class="card"><strong>#${t.id}</strong> — ${t.name} <span class="muted">(${[t.location||'—', t.start_date].filter(Boolean).join(' • ')})</span></div>`).join('') || '<div class="empty">Aucun tournoi.</div>';
const opts = ['<option value="">— choisir un tournoi —</option>'].concat(
ts.map(t => `<option value="${t.id}">#${t.id}${t.name}</option>`)
).join('');
p_tid.innerHTML = opts;
s_tid.innerHTML = opts;
}catch(e){
wrap.innerHTML = `<div class="empty">Erreur chargement: ${e.message}</div>`;
}
}
async function renderMatchesForSelectedTournament(){
const tid = Number(document.getElementById('s_tid').value || '0');
const s_mid = document.getElementById('s_mid');
if(!tid){ s_mid.innerHTML = '<option value="">— choisir un match —</option>'; return; }
try{
const ms = await listMatches(tid);
s_mid.innerHTML = ['<option value="">— choisir un match —</option>'].concat(
ms.map(m => `<option value="${m.id}">#${m.id}${m.team_a} vs ${m.team_b} (${m.court||'—'})</option>`)
).join('');
}catch(e){
s_mid.innerHTML = '<option value="">Erreur chargement matches</option>';
}
}
function bindAuth(){
bindLoginForm({});
const logoutBtn = document.getElementById('logoutBtn');
logoutBtn?.addEventListener('click', ()=>{
logout(); toggleAdminUI(); showToast('Déconnecté.');
});
}
function bindAdminActions(){
document.getElementById('createTournamentBtn')?.addEventListener('click', async (e)=>{
const btn = e.currentTarget;
const spin = document.getElementById('createTournamentSpin');
const err = document.getElementById('createTournamentErr');
err.textContent='';
const name = document.getElementById('t_name').value.trim();
if(!name){ err.textContent='Le nom est requis.'; return; }
const payload = {
name,
location: document.getElementById('t_location').value.trim(),
start_date: document.getElementById('t_start').value || null,
end_date: document.getElementById('t_end').value || null
};
try{
disable(btn, spin, true);
await createTournament(payload);
showToast('Tournoi créé ✔');
document.getElementById('t_name').value='';
document.getElementById('t_location').value='';
document.getElementById('t_start').value='';
document.getElementById('t_end').value='';
renderTournaments();
}catch(e){
err.textContent = e?.payload?.error || e.message;
showToast('Erreur création tournoi', false);
}finally{
disable(btn, spin, false);
}
});
document.getElementById('addParticipantBtn')?.addEventListener('click', async (e)=>{
const btn = e.currentTarget;
const spin = document.getElementById('addParticipantSpin');
const err = document.getElementById('addParticipantErr');
err.textContent='';
const tid = Number(document.getElementById('p_tid').value || '0');
const full_name = document.getElementById('p_fullname').value.trim();
if(!tid){ err.textContent='Choisis un tournoi.'; return; }
if(!full_name){ err.textContent='Nom du joueur requis.'; return; }
try{
disable(btn, spin, true);
await addParticipant(tid, { full_name });
showToast('Joueur ajouté ✔');
document.getElementById('p_fullname').value='';
}catch(e){
err.textContent = e?.payload?.error || e.message;
showToast('Erreur ajout joueur', false);
}finally{
disable(btn, spin, false);
}
});
document.getElementById('s_tid')?.addEventListener('change', renderMatchesForSelectedTournament);
document.getElementById('scoreBtn')?.addEventListener('click', async (e)=>{
const btn = e.currentTarget;
const spin = document.getElementById('scoreSpin');
const err = document.getElementById('scoreErr');
err.textContent='';
const mid = Number(document.getElementById('s_mid').value || '0');
if(!mid){ err.textContent='Choisis un match.'; return; }
const payload = {
score_a: Number(document.getElementById('m_a').value||'0'),
score_b: Number(document.getElementById('m_b').value||'0'),
done: document.getElementById('m_done').checked
};
try{
disable(btn, spin, true);
await scoreMatch(mid, payload);
showToast('Score enregistré ✔');
document.getElementById('m_a').value='';
document.getElementById('m_b').value='';
document.getElementById('m_done').checked=false;
}catch(e){
err.textContent = e?.payload?.error || e.message;
showToast('Erreur scoring', false);
}finally{
disable(btn, spin, false);
}
});
document.getElementById('refreshTournaments')?.addEventListener('click', renderTournaments);
}
function init(){
toggleAdminUI();
bindAuth();
bindAdminActions();
if(isAuthenticated()) renderTournaments();
}
document.addEventListener('DOMContentLoaded', init);