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