diff --git a/js/admin.js b/js/admin.js index f843156..866aa2e 100644 --- a/js/admin.js +++ b/js/admin.js @@ -5,14 +5,11 @@ async function apiCall(endpoint, method = 'GET', data = null) { method: method, headers: { 'Content-Type': 'application/json' } }; - const token = localStorage.getItem('authToken'); if (token) options.headers['Authorization'] = `Bearer ${token}`; - if (data && (method === 'POST' || method === 'PUT')) { options.body = JSON.stringify(data); } - const response = await fetch(`${API_BASE_URL}/${endpoint}`, options); const result = await response.json(); if (!response.ok) throw new Error(result.error || 'Erreur serveur'); @@ -39,9 +36,13 @@ function showAdminSection(sectionId) { document.querySelectorAll('.section').forEach(s => s.classList.remove('active')); document.querySelectorAll('.sidebar li').forEach(l => l.classList.remove('active')); document.getElementById(sectionId).classList.add('active'); - event.target.classList.add('active'); - - if (sectionId === 'matches') loadMatchesTable(); + if (window.event && window.event.target) { + window.event.target.closest('li').classList.add('active'); + } + if (sectionId === 'matches') { + loadMatchesTable(); + loadPlayersDropdowns(); + } if (sectionId === 'users') loadUsersTable(); if (sectionId === 'results') loadResultsDropdown(); } @@ -50,55 +51,125 @@ async function loadAdminStats() { try { const users = await apiCall('users.php'); const matches = await apiCall('matches.php'); - const players = await apiCall('players.php'); - + const players = await apiCall('player.php'); document.getElementById('totalUsers').textContent = users.users ? users.users.length : 0; document.getElementById('totalMatches').textContent = matches.matches ? matches.matches.length : 0; document.getElementById('totalPlayers').textContent = players.players ? players.players.length : 0; - } catch (error) { console.error('Erreur stats admin', error); } } +async function loadPlayersDropdowns() { + try { + const result = await apiCall('player.php'); + const p1Select = document.getElementById('matchPlayer1'); + const p2Select = document.getElementById('matchPlayer2'); + if (!p1Select || !p2Select) return; + p1Select.innerHTML = ''; + p2Select.innerHTML = ''; + if (result.players) { + result.players.forEach(p => { + const opt1 = document.createElement('option'); + opt1.value = p.id; + opt1.textContent = `${p.name} (#${p.ranking})`; + p1Select.appendChild(opt1); + const opt2 = document.createElement('option'); + opt2.value = p.id; + opt2.textContent = `${p.name} (#${p.ranking})`; + p2Select.appendChild(opt2); + }); + } + } catch (e) { + console.error('Erreur chargement joueurs:', e); + } +} + +async function addMatch() { + const round = document.getElementById('matchRound').value; + const player1_id = parseInt(document.getElementById('matchPlayer1').value); + const player2_id = parseInt(document.getElementById('matchPlayer2').value); + const match_date = document.getElementById('matchDate').value; + const court = document.getElementById('matchCourt').value || 'Court Philippe-Chatrier'; + + if (!match_date || isNaN(player1_id) || isNaN(player2_id)) { + alert('Veuillez remplir tous les champs requis.'); + return; + } + if (player1_id === player2_id) { + alert('Veuillez sélectionner deux joueurs différents.'); + return; + } + try { + await apiCall('matches.php', 'POST', { round, player1_id, player2_id, match_date, court }); + alert('Match ajouté avec succès !'); + loadMatchesTable(); + loadAdminStats(); + } catch (error) { + alert(error.message); + } +} + +async function addPlayer() { + const name = document.getElementById('playerName').value.trim(); + const nationality = document.getElementById('playerNationality').value.trim(); + const age = parseInt(document.getElementById('playerAge').value); + const handedness = document.getElementById('playerHandedness').value; + const ranking = parseInt(document.getElementById('playerRanking').value); + + if (!name || !nationality || isNaN(age) || isNaN(ranking)) { + alert('Veuillez remplir tous les champs requis.'); + return; + } + const player_code = name.toLowerCase().replace(/[^a-z0-9]/g, ''); + try { + await apiCall('player.php', 'POST', { + player_code, name, nationality, age, handedness, ranking, + points: 0, clay_win_rate: 0.75, hard_win_rate: 0.70, grass_win_rate: 0.65 + }); + alert('Joueur ajouté avec succès !'); + document.getElementById('playerName').value = ''; + document.getElementById('playerNationality').value = ''; + document.getElementById('playerAge').value = ''; + document.getElementById('playerRanking').value = ''; + loadAdminStats(); + } catch (error) { + alert(error.message); + } +} + async function loadMatchesTable() { try { const result = await apiCall('matches.php'); const tbody = document.getElementById('matchesTable'); - if(!tbody) return; + if (!tbody) return; tbody.innerHTML = ''; - - if(result.matches) { + if (result.matches) { result.matches.forEach(match => { const row = document.createElement('tr'); - // Gestion de l'affichage selon le format retourné par getAllMatches() const p1Name = match.p1_name || (match.player1 && match.player1.name) || 'Inconnu'; const p2Name = match.p2_name || (match.player2 && match.player2.name) || 'Inconnu'; - row.innerHTML = `