diff --git a/js/admin.js b/js/admin.js index 3aa01c7..f843156 100644 --- a/js/admin.js +++ b/js/admin.js @@ -1,15 +1,37 @@ -// Vérification admin +const API_BASE_URL = 'https://monpetitpari.fr/api'; + +async function apiCall(endpoint, method = 'GET', data = null) { + const options = { + 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'); + return result; +} + window.onload = function() { const user = JSON.parse(localStorage.getItem('currentUser')); if (!user || user.role !== 'admin') { window.location.href = 'index.html'; + return; } document.getElementById('adminName').textContent = user.username; - loadAdminData(); + loadAdminStats(); }; function logout() { localStorage.removeItem('currentUser'); + localStorage.removeItem('authToken'); window.location.href = 'index.html'; } @@ -24,207 +46,156 @@ function showAdminSection(sectionId) { if (sectionId === 'results') loadResultsDropdown(); } -function loadAdminData() { - document.getElementById('totalMatches').textContent = tournamentMatches.length; - document.getElementById('totalPlayers').textContent = Object.keys(playersData).length; - document.getElementById('totalUsers').textContent = typeof users !== 'undefined' ? users.length : 0; - - const allPredictions = JSON.parse(localStorage.getItem('userPredictions') || '[]'); - document.getElementById('totalPredictions').textContent = allPredictions.length; - - // Populate player selects - const playerSelects = ['matchPlayer1', 'matchPlayer2']; - playerSelects.forEach(selectId => { - const select = document.getElementById(selectId); +async function loadAdminStats() { + try { + const users = await apiCall('users.php'); + const matches = await apiCall('matches.php'); + const players = await apiCall('players.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 loadMatchesTable() { + try { + const result = await apiCall('matches.php'); + const tbody = document.getElementById('matchesTable'); + if(!tbody) return; + tbody.innerHTML = ''; + + 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 = ` + ${match.round} + ${p1Name} + ${p2Name} + ${new Date(match.match_date || match.date).toLocaleDateString('fr-FR')} + ${match.status === 'completed' ? 'Terminé' : 'À venir'} + + + + `; + tbody.appendChild(row); + }); + } + } catch(e) { console.error(e); } +} + +async function loadUsersTable() { + try { + const result = await apiCall('users.php'); + const tbody = document.getElementById('usersTable'); + if(!tbody) return; + tbody.innerHTML = ''; + + if(result.users) { + result.users.forEach(user => { + const row = document.createElement('tr'); + row.innerHTML = ` + ${user.id} + ${user.username} + ${user.email} + ${user.role} + ${user.points || 0} + + + + `; + tbody.appendChild(row); + }); + } + } catch(e) { console.error(e); } +} + +async function deleteUser(id) { + if (confirm('Êtes-vous sûr de vouloir supprimer cet utilisateur ?')) { + try { + await apiCall(`users.php?id=${id}`, 'DELETE'); + loadUsersTable(); + loadAdminStats(); + } catch(e) { alert(e.message); } + } +} + +async function deleteMatch(id) { + if (confirm('Êtes-vous sûr de vouloir supprimer ce match ?')) { + try { + await apiCall(`matches.php?id=${id}`, 'DELETE'); + loadMatchesTable(); + loadAdminStats(); + } catch(e) { alert(e.message); } + } +} + +async function loadResultsDropdown() { + try { + const result = await apiCall('matches.php'); + const select = document.getElementById('resultMatch'); + if(!select) return; select.innerHTML = ''; - Object.values(playersData).forEach(player => { + + window.currentAdminMatches = result.matches || []; + + window.currentAdminMatches.filter(m => m.status !== 'completed').forEach(match => { const option = document.createElement('option'); - option.value = player.id; - option.textContent = player.name; + option.value = match.id; + const p1Name = match.p1_name || (match.player1 && match.player1.name); + const p2Name = match.p2_name || (match.player2 && match.player2.name); + option.textContent = `${match.round} : ${p1Name} vs ${p2Name}`; select.appendChild(option); }); - }); -} - -function loadMatchesTable() { - const tbody = document.getElementById('matchesTable'); - tbody.innerHTML = ''; - - tournamentMatches.forEach(match => { - const p1 = playersData[match.player1]; - const p2 = playersData[match.player2]; - const row = document.createElement('tr'); - row.innerHTML = ` - ${match.round} - ${p1.name} - ${p2.name} - ${new Date(match.date).toLocaleDateString('fr-FR')} - ${match.status === 'completed' ? 'Terminé' : 'À venir'} - - - - `; - tbody.appendChild(row); - }); -} - -function loadUsersTable() { - const tbody = document.getElementById('usersTable'); - tbody.innerHTML = ''; - - users.forEach(user => { - const row = document.createElement('tr'); - row.innerHTML = ` - ${user.id} - ${user.username} - ${user.email} - ${user.role} - ${user.points || 0} - - - - `; - tbody.appendChild(row); - }); -} - -function addMatch() { - const newMatch = { - id: Date.now(), - round: document.getElementById('matchRound').value, - player1: document.getElementById('matchPlayer1').value, - player2: document.getElementById('matchPlayer2').value, - date: document.getElementById('matchDate').value, - court: document.getElementById('matchCourt').value, - status: 'upcoming' - }; - - tournamentMatches.push(newMatch); - alert('Match ajouté avec succès!'); - loadAdminData(); - loadMatchesTable(); -} - -function deleteMatch(id) { - if (confirm('Êtes-vous sûr de vouloir supprimer ce match?')) { - const index = tournamentMatches.findIndex(m => m.id === id); - if (index > -1) { - tournamentMatches.splice(index, 1); - loadMatchesTable(); - loadAdminData(); - } - } -} - -function addPlayer() { - const newPlayer = { - id: document.getElementById('playerName').value.toLowerCase().replace(' ', ''), - name: document.getElementById('playerName').value, - nationality: document.getElementById('playerNationality').value, - age: parseInt(document.getElementById('playerAge').value), - handedness: document.getElementById('playerHandedness').value, - ranking: parseInt(document.getElementById('playerRanking').value), - photo: 'https://www.atptour.com/-/media/tennis/players/head-shot/2024/default.png', - strengths: ['Nouveau joueur'], - weaknesses: ['À définir'], - surfaceStats: { - clay: { winRate: 0.5, titles: 0 }, - hard: { winRate: 0.5, titles: 0 }, - grass: { winRate: 0.5, titles: 0 } - }, - recentForm: ['W', 'L', 'W', 'L', 'W'] - }; - - playersData[newPlayer.id] = newPlayer; - alert('Joueur ajouté avec succès!'); - loadAdminData(); -} - -function deleteUser(id) { - if (confirm('Êtes-vous sûr de vouloir supprimer cet utilisateur?')) { - const index = users.findIndex(u => u.id === id); - if (index > -1) { - users.splice(index, 1); - localStorage.setItem('users', JSON.stringify(users)); - loadUsersTable(); - loadAdminData(); - } - } -} - -function loadResultsDropdown() { - const select = document.getElementById('resultMatch'); - select.innerHTML = ''; - - tournamentMatches.filter(m => m.status === 'upcoming').forEach(match => { - const p1 = playersData[match.player1]; - const p2 = playersData[match.player2]; - const option = document.createElement('option'); - option.value = match.id; - option.textContent = `${match.round}: ${p1.name} vs ${p2.name}`; - option.dataset.p1 = match.player1; - option.dataset.p2 = match.player2; - select.appendChild(option); - }); - - updateWinnerSelect(); - - select.addEventListener('change', updateWinnerSelect); + updateWinnerSelect(); + select.addEventListener('change', updateWinnerSelect); + } catch(e) { console.error(e); } } function updateWinnerSelect() { const select = document.getElementById('resultMatch'); const winnerSelect = document.getElementById('resultWinner'); - const selectedOption = select.options[select.selectedIndex]; + + if(select.selectedIndex === -1 || !window.currentAdminMatches) return; + const matchId = parseInt(select.value); + const match = window.currentAdminMatches.find(m => m.id === matchId); winnerSelect.innerHTML = ''; - if (selectedOption.dataset.p1) { - const p1 = playersData[selectedOption.dataset.p1]; - const p2 = playersData[selectedOption.dataset.p2]; + if (match) { + const p1Id = match.p1_id || (match.player1 && match.player1.id); + const p1Name = match.p1_name || (match.player1 && match.player1.name); + const p2Id = match.p2_id || (match.player2 && match.player2.id); + const p2Name = match.p2_name || (match.player2 && match.player2.name); winnerSelect.innerHTML = ` - - + + `; } } -function updateResult() { +async function updateResult() { const matchId = parseInt(document.getElementById('resultMatch').value); - const winner = document.getElementById('resultWinner').value; + const winnerId = parseInt(document.getElementById('resultWinner').value); const score = document.getElementById('resultScore').value; - const match = tournamentMatches.find(m => m.id === matchId); - if (match) { - match.status = 'completed'; - match.winner = winner; - match.score = score; - - // Calculer les points pour les utilisateurs - calculateUserPoints(matchId, winner); - - alert('Résultat mis à jour avec succès!'); - loadAdminData(); + try { + await apiCall('results.php', 'POST', { + match_id: matchId, + winner_id: winnerId, + score: score + }); + alert('Résultat mis à jour avec succès ! Les points ont été distribués.'); + loadResultsDropdown(); + } catch (error) { + alert(error.message); } -} - -function calculateUserPoints(matchId, winner) { - const allPredictions = JSON.parse(localStorage.getItem('userPredictions') || '[]'); - const matchPredictions = allPredictions.filter(p => p.matchId === matchId); - - matchPredictions.forEach(pred => { - const user = users.find(u => u.id === pred.userId); - if (user && pred.predictedWinner === winner) { - user.points = (user.points || 0) + 50; // 50 points pour un pronostic juste - - // Mettre à jour localStorage - const currentUser = JSON.parse(localStorage.getItem('currentUser')); - if (currentUser && currentUser.id === user.id) { - localStorage.setItem('currentUser', JSON.stringify(user)); - } - } - }); - - localStorage.setItem('users', JSON.stringify(users)); } \ No newline at end of file