Actualiser js/admin.js
This commit is contained in:
+154
-183
@@ -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() {
|
window.onload = function() {
|
||||||
const user = JSON.parse(localStorage.getItem('currentUser'));
|
const user = JSON.parse(localStorage.getItem('currentUser'));
|
||||||
if (!user || user.role !== 'admin') {
|
if (!user || user.role !== 'admin') {
|
||||||
window.location.href = 'index.html';
|
window.location.href = 'index.html';
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
document.getElementById('adminName').textContent = user.username;
|
document.getElementById('adminName').textContent = user.username;
|
||||||
loadAdminData();
|
loadAdminStats();
|
||||||
};
|
};
|
||||||
|
|
||||||
function logout() {
|
function logout() {
|
||||||
localStorage.removeItem('currentUser');
|
localStorage.removeItem('currentUser');
|
||||||
|
localStorage.removeItem('authToken');
|
||||||
window.location.href = 'index.html';
|
window.location.href = 'index.html';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,207 +46,156 @@ function showAdminSection(sectionId) {
|
|||||||
if (sectionId === 'results') loadResultsDropdown();
|
if (sectionId === 'results') loadResultsDropdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadAdminData() {
|
async function loadAdminStats() {
|
||||||
document.getElementById('totalMatches').textContent = tournamentMatches.length;
|
try {
|
||||||
document.getElementById('totalPlayers').textContent = Object.keys(playersData).length;
|
const users = await apiCall('users.php');
|
||||||
document.getElementById('totalUsers').textContent = typeof users !== 'undefined' ? users.length : 0;
|
const matches = await apiCall('matches.php');
|
||||||
|
const players = await apiCall('players.php');
|
||||||
const allPredictions = JSON.parse(localStorage.getItem('userPredictions') || '[]');
|
|
||||||
document.getElementById('totalPredictions').textContent = allPredictions.length;
|
document.getElementById('totalUsers').textContent = users.users ? users.users.length : 0;
|
||||||
|
document.getElementById('totalMatches').textContent = matches.matches ? matches.matches.length : 0;
|
||||||
// Populate player selects
|
document.getElementById('totalPlayers').textContent = players.players ? players.players.length : 0;
|
||||||
const playerSelects = ['matchPlayer1', 'matchPlayer2'];
|
|
||||||
playerSelects.forEach(selectId => {
|
} catch (error) {
|
||||||
const select = document.getElementById(selectId);
|
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 = `
|
||||||
|
<td>${match.round}</td>
|
||||||
|
<td>${p1Name}</td>
|
||||||
|
<td>${p2Name}</td>
|
||||||
|
<td>${new Date(match.match_date || match.date).toLocaleDateString('fr-FR')}</td>
|
||||||
|
<td>${match.status === 'completed' ? 'Terminé' : 'À venir'}</td>
|
||||||
|
<td>
|
||||||
|
<button class="btn-danger" onclick="deleteMatch(${match.id})">Supprimer</button>
|
||||||
|
</td>
|
||||||
|
`;
|
||||||
|
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 = `
|
||||||
|
<td>${user.id}</td>
|
||||||
|
<td>${user.username}</td>
|
||||||
|
<td>${user.email}</td>
|
||||||
|
<td>${user.role}</td>
|
||||||
|
<td>${user.points || 0}</td>
|
||||||
|
<td>
|
||||||
|
<button class="btn-danger" onclick="deleteUser(${user.id})">Supprimer</button>
|
||||||
|
</td>
|
||||||
|
`;
|
||||||
|
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 = '';
|
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');
|
const option = document.createElement('option');
|
||||||
option.value = player.id;
|
option.value = match.id;
|
||||||
option.textContent = player.name;
|
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);
|
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');
|
updateWinnerSelect();
|
||||||
row.innerHTML = `
|
select.addEventListener('change', updateWinnerSelect);
|
||||||
<td>${match.round}</td>
|
} catch(e) { console.error(e); }
|
||||||
<td>${p1.name}</td>
|
|
||||||
<td>${p2.name}</td>
|
|
||||||
<td>${new Date(match.date).toLocaleDateString('fr-FR')}</td>
|
|
||||||
<td>${match.status === 'completed' ? 'Terminé' : 'À venir'}</td>
|
|
||||||
<td>
|
|
||||||
<button class="btn-danger" onclick="deleteMatch(${match.id})">Supprimer</button>
|
|
||||||
</td>
|
|
||||||
`;
|
|
||||||
tbody.appendChild(row);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadUsersTable() {
|
|
||||||
const tbody = document.getElementById('usersTable');
|
|
||||||
tbody.innerHTML = '';
|
|
||||||
|
|
||||||
users.forEach(user => {
|
|
||||||
const row = document.createElement('tr');
|
|
||||||
row.innerHTML = `
|
|
||||||
<td>${user.id}</td>
|
|
||||||
<td>${user.username}</td>
|
|
||||||
<td>${user.email}</td>
|
|
||||||
<td>${user.role}</td>
|
|
||||||
<td>${user.points || 0}</td>
|
|
||||||
<td>
|
|
||||||
<button class="btn-danger" onclick="deleteUser(${user.id})">Supprimer</button>
|
|
||||||
</td>
|
|
||||||
`;
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateWinnerSelect() {
|
function updateWinnerSelect() {
|
||||||
const select = document.getElementById('resultMatch');
|
const select = document.getElementById('resultMatch');
|
||||||
const winnerSelect = document.getElementById('resultWinner');
|
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 = '';
|
winnerSelect.innerHTML = '';
|
||||||
if (selectedOption.dataset.p1) {
|
if (match) {
|
||||||
const p1 = playersData[selectedOption.dataset.p1];
|
const p1Id = match.p1_id || (match.player1 && match.player1.id);
|
||||||
const p2 = playersData[selectedOption.dataset.p2];
|
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 = `
|
winnerSelect.innerHTML = `
|
||||||
<option value="${p1.id}">${p1.name}</option>
|
<option value="${p1Id}">${p1Name}</option>
|
||||||
<option value="${p2.id}">${p2.name}</option>
|
<option value="${p2Id}">${p2Name}</option>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateResult() {
|
async function updateResult() {
|
||||||
const matchId = parseInt(document.getElementById('resultMatch').value);
|
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 score = document.getElementById('resultScore').value;
|
||||||
|
|
||||||
const match = tournamentMatches.find(m => m.id === matchId);
|
try {
|
||||||
if (match) {
|
await apiCall('results.php', 'POST', {
|
||||||
match.status = 'completed';
|
match_id: matchId,
|
||||||
match.winner = winner;
|
winner_id: winnerId,
|
||||||
match.score = score;
|
score: score
|
||||||
|
});
|
||||||
// Calculer les points pour les utilisateurs
|
alert('Résultat mis à jour avec succès ! Les points ont été distribués.');
|
||||||
calculateUserPoints(matchId, winner);
|
loadResultsDropdown();
|
||||||
|
} catch (error) {
|
||||||
alert('Résultat mis à jour avec succès!');
|
alert(error.message);
|
||||||
loadAdminData();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user