/** * Script d'administration pour MH Wilds - Partage de Quêtes à Couronnes */ // Variables globales let currentDeletionType = null; let currentDeletionId = null; // Initialisation au chargement du DOM document.addEventListener('DOMContentLoaded', () => { // Éléments DOM pour les onglets const announcementsTab = document.getElementById('announcementsTab'); const monstersTab = document.getElementById('monstersTab'); const maintenanceTab = document.getElementById('maintenanceTab'); // Éléments DOM pour les annonces const announcementsListEl = document.getElementById('announcementsList'); const addAnnouncementBtn = document.getElementById('addAnnouncementBtn'); const announcementForm = document.getElementById('announcementForm'); // Éléments DOM pour les monstres const monstersListEl = document.getElementById('monstersList'); const addMonsterBtn = document.getElementById('addMonsterBtn'); const monsterForm = document.getElementById('monsterForm'); // Éléments DOM pour la maintenance const cleanOldQuestsBtn = document.getElementById('cleanOldQuestsBtn'); // Éléments DOM pour la confirmation de suppression const confirmDeleteBtn = document.getElementById('confirmDeleteBtn'); // Événements pour les onglets if (announcementsTab) { announcementsTab.addEventListener('click', (e) => { e.preventDefault(); showSection('announcementsSection'); }); } if (monstersTab) { monstersTab.addEventListener('click', (e) => { e.preventDefault(); showSection('monstersSection'); }); } if (maintenanceTab) { maintenanceTab.addEventListener('click', (e) => { e.preventDefault(); showSection('maintenanceSection'); updateStatistics(); }); } // Événements pour les annonces if (addAnnouncementBtn) { addAnnouncementBtn.addEventListener('click', () => { resetAnnouncementForm(); document.getElementById('announcementModalTitle').textContent = 'Ajouter une annonce'; new bootstrap.Modal(document.getElementById('announcementModal')).show(); }); } if (announcementForm) { announcementForm.addEventListener('submit', handleSaveAnnouncement); } // Ajouter les événements pour les boutons d'édition et de suppression des annonces if (announcementsListEl) { document.querySelectorAll('.edit-announcement-btn').forEach(btn => { btn.addEventListener('click', () => { const announcementId = parseInt(btn.dataset.id); editAnnouncement(announcementId); }); }); document.querySelectorAll('.delete-announcement-btn').forEach(btn => { btn.addEventListener('click', () => { const announcementId = parseInt(btn.dataset.id); showDeleteConfirmation('announcement', announcementId); }); }); } // Événements pour les monstres if (addMonsterBtn) { addMonsterBtn.addEventListener('click', () => { resetMonsterForm(); document.getElementById('monsterModalTitle').textContent = 'Ajouter un monstre'; new bootstrap.Modal(document.getElementById('monsterModal')).show(); }); } if (monsterForm) { monsterForm.addEventListener('submit', handleSaveMonster); } // Ajouter les événements pour les boutons d'édition et de suppression des monstres if (monstersListEl) { document.querySelectorAll('.edit-monster-btn').forEach(btn => { btn.addEventListener('click', () => { const monsterId = parseInt(btn.dataset.id); editMonster(monsterId); }); }); document.querySelectorAll('.delete-monster-btn').forEach(btn => { btn.addEventListener('click', () => { const monsterId = parseInt(btn.dataset.id); showDeleteConfirmation('monster', monsterId); }); }); } // Événements pour la maintenance if (cleanOldQuestsBtn) { cleanOldQuestsBtn.addEventListener('click', handleCleanOldQuests); } // Événement pour la confirmation de suppression if (confirmDeleteBtn) { confirmDeleteBtn.addEventListener('click', handleConfirmDelete); } // Événement pour la déconnexion const logoutBtn = document.getElementById('logoutBtn'); if (logoutBtn) { logoutBtn.addEventListener('click', () => { window.location.href = 'logout.php'; }); } }); // Changement du mot de passe admin // Éléments DOM pour le changement de mot de passe const passwordTab = document.getElementById('passwordTab'); const changePasswordForm = document.getElementById('changePasswordForm'); const passwordResult = document.getElementById('passwordResult'); // Événements pour l'onglet mot de passe if (passwordTab) { passwordTab.addEventListener('click', (e) => { e.preventDefault(); showSection('passwordSection'); }); } // Gestion du formulaire de changement de mot de passe if (changePasswordForm) { changePasswordForm.addEventListener('submit', function(e) { e.preventDefault(); const currentPassword = document.getElementById('currentPassword').value; const newPassword = document.getElementById('newPassword').value; const confirmPassword = document.getElementById('confirmPassword').value; // Vérifier que les mots de passe correspondent if (newPassword !== confirmPassword) { showPasswordResult('Les nouveaux mots de passe ne correspondent pas.', false); return; } // Vérifier la longueur du mot de passe if (newPassword.length < 8) { showPasswordResult('Le nouveau mot de passe doit contenir au moins 8 caractères.', false); return; } // Préparer les données const formData = new FormData(); formData.append('currentPassword', currentPassword); formData.append('newPassword', newPassword); formData.append('confirmPassword', confirmPassword); formData.append('csrf_token', document.querySelector('input[name="csrf_token"]').value); // Envoyer la requête fetch('../api.php?action=updatePassword', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.success) { showPasswordResult(data.message, true); changePasswordForm.reset(); } else { showPasswordResult(data.message, false); } }) .catch(error => { console.error('Erreur:', error); showPasswordResult('Erreur de connexion. Veuillez réessayer.', false); }); }); } /** * Afficher le résultat du changement de mot de passe * * @param {string} message Message à afficher * @param {boolean} success Succès ou échec */ function showPasswordResult(message, success) { passwordResult.textContent = message; passwordResult.classList.remove('d-none', 'alert-success', 'alert-danger'); passwordResult.classList.add(success ? 'alert-success' : 'alert-danger'); // Masquer le message après quelques secondes si c'est un succès if (success) { setTimeout(() => { passwordResult.classList.add('d-none'); }, 5000); } } /** * Fonctions pour la navigation entre les sections * * @param {string} sectionId ID de la section à afficher */ function showSection(sectionId) { // Désactiver tous les onglets et masquer toutes les sections document.querySelectorAll('.list-group-item').forEach(tab => { tab.classList.remove('active'); }); document.querySelectorAll('.admin-section').forEach(section => { section.classList.add('d-none'); }); // Activer l'onglet sélectionné et afficher sa section document.getElementById(sectionId).classList.remove('d-none'); if (sectionId === 'announcementsSection') { document.getElementById('announcementsTab').classList.add('active'); } else if (sectionId === 'monstersSection') { document.getElementById('monstersTab').classList.add('active'); } else if (sectionId === 'maintenanceSection') { document.getElementById('maintenanceTab').classList.add('active'); } } /** * ============ ANNONCES ============ */ /** * Réinitialiser le formulaire d'annonce */ function resetAnnouncementForm() { const form = document.getElementById('announcementForm'); form.reset(); document.getElementById('announcementId').value = ''; } /** * Éditer une annonce * * @param {number} announcementId ID de l'annonce à éditer */ function editAnnouncement(announcementId) { // Récupérer les données de l'annonce via AJAX fetch(`../api.php?action=getAnnouncements`) .then(response => response.json()) .then(data => { if (data.success) { const announcement = data.announcements.find(a => a.id == announcementId); if (announcement) { document.getElementById('announcementId').value = announcement.id; document.getElementById('announcementText').value = announcement.text; document.getElementById('announcementActive').checked = announcement.active == 1; document.getElementById('announcementModalTitle').textContent = 'Modifier l\'annonce'; new bootstrap.Modal(document.getElementById('announcementModal')).show(); } } else { alert('Erreur lors de la récupération des données de l\'annonce.'); } }) .catch(error => { console.error('Erreur:', error); alert('Erreur de connexion. Veuillez réessayer.'); }); } /** * Gérer la sauvegarde d'une annonce * * @param {Event} e Événement de soumission du formulaire */ function handleSaveAnnouncement(e) { e.preventDefault(); const announcementId = document.getElementById('announcementId').value.trim(); const announcementText = document.getElementById('announcementText').value.trim(); const announcementActive = document.getElementById('announcementActive').checked; if (!announcementText) { alert('Veuillez saisir le texte de l\'annonce'); return; } const formData = new FormData(); formData.append('text', announcementText); formData.append('active', announcementActive ? 1 : 0); formData.append('csrf_token', document.querySelector('input[name="csrf_token"]').value); let url = '../api.php?action='; if (announcementId) { // Mode édition url += 'updateAnnouncement'; formData.append('id', announcementId); } else { // Mode ajout url += 'addAnnouncement'; } // Envoyer la requête fetch(url, { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.success) { // Fermer la modale bootstrap.Modal.getInstance(document.getElementById('announcementModal')).hide(); // Recharger la page pour mettre à jour la liste window.location.reload(); } else { alert('Erreur lors de la sauvegarde de l\'annonce: ' + (data.message || 'Erreur inconnue')); } }) .catch(error => { console.error('Erreur:', error); alert('Erreur de connexion. Veuillez réessayer.'); }); } /** * ============ MONSTRES ============ */ /** * Réinitialiser le formulaire de monstre */ function resetMonsterForm() { const form = document.getElementById('monsterForm'); form.reset(); document.getElementById('monsterId').value = ''; } /** * Éditer un monstre * * @param {number} monsterId ID du monstre à éditer */ function editMonster(monsterId) { // Récupérer les données du monstre via AJAX fetch(`../api.php?action=getMonsters`) .then(response => response.json()) .then(data => { if (data.success) { const monster = data.monsters.find(m => m.id == monsterId); if (monster) { document.getElementById('monsterId').value = monster.id; document.getElementById('monsterName').value = monster.name; // Retirer le préfixe pour l'affichage dans le formulaire let imagePath = monster.image; if (imagePath.startsWith('assets/img/')) { imagePath = imagePath.substring(11); } document.getElementById('monsterImage').value = imagePath; document.getElementById('monsterModalTitle').textContent = 'Modifier le monstre'; new bootstrap.Modal(document.getElementById('monsterModal')).show(); } } else { alert('Erreur lors de la récupération des données du monstre.'); } }) .catch(error => { console.error('Erreur:', error); alert('Erreur de connexion. Veuillez réessayer.'); }); } /** * Gérer la sauvegarde d'un monstre * * @param {Event} e Événement de soumission du formulaire */ function handleSaveMonster(e) { e.preventDefault(); const monsterId = document.getElementById('monsterId').value.trim(); const monsterName = document.getElementById('monsterName').value.trim(); let monsterImage = document.getElementById('monsterImage').value.trim(); // Ajouter le préfixe 'assets/img/' si ce n'est pas déjà fait if (!monsterImage.startsWith('assets/img/')) { monsterImage = 'assets/img/' + monsterImage; } if (!monsterName || !monsterImage) { alert('Veuillez remplir tous les champs'); return; } const formData = new FormData(); formData.append('name', monsterName); formData.append('image', monsterImage); formData.append('csrf_token', document.querySelector('input[name="csrf_token"]').value); let url = '../api.php?action='; if (monsterId) { // Mode édition url += 'updateMonster'; formData.append('id', monsterId); } else { // Mode ajout url += 'addMonster'; } // Envoyer la requête fetch(url, { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.success) { // Fermer la modale bootstrap.Modal.getInstance(document.getElementById('monsterModal')).hide(); // Recharger la page pour mettre à jour la liste window.location.reload(); } else { alert('Erreur lors de la sauvegarde du monstre: ' + (data.message || 'Erreur inconnue')); } }) .catch(error => { console.error('Erreur:', error); alert('Erreur de connexion. Veuillez réessayer.'); }); } /** * ============ MAINTENANCE ============ */ /** * Mettre à jour les statistiques */ function updateStatistics() { // Récupérer les statistiques via AJAX fetch('../api.php?action=getStatistics') .then(response => response.json()) .then(data => { if (data.success) { document.getElementById('totalMonstersCount').textContent = data.stats.total_monsters; document.getElementById('totalQuestsCount').textContent = data.stats.total_quests; document.getElementById('smallCrownQuestsCount').textContent = data.stats.small_crown_quests; document.getElementById('largeCrownQuestsCount').textContent = data.stats.large_crown_quests; } }) .catch(error => { console.error('Erreur lors de la récupération des statistiques:', error); }); } /** * Nettoyer les quêtes anciennes */ function handleCleanOldQuests() { if (!confirm('Êtes-vous sûr de vouloir supprimer toutes les quêtes datant de plus de 15 jours ?')) { return; } const formData = new FormData(); formData.append('csrf_token', document.querySelector('input[name="csrf_token"]').value); // Envoyer la requête fetch('../api.php?action=cleanOldQuests', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.success) { const cleanResult = document.getElementById('cleanResult'); cleanResult.innerHTML = `${data.cleanedCount} quête(s) supprimée(s) avec succès.`; cleanResult.classList.remove('d-none'); // Mettre à jour les statistiques updateStatistics(); // Masquer le message après 3 secondes setTimeout(() => { cleanResult.classList.add('d-none'); }, 3000); } else { alert('Erreur lors du nettoyage des quêtes: ' + (data.message || 'Erreur inconnue')); } }) .catch(error => { console.error('Erreur:', error); alert('Erreur de connexion. Veuillez réessayer.'); }); } /** * ============ SUPPRESSION ============ */ /** * Afficher la confirmation de suppression * * @param {string} type Type d'élément à supprimer ('announcement' ou 'monster') * @param {number} id ID de l'élément à supprimer */ function showDeleteConfirmation(type, id) { currentDeletionType = type; currentDeletionId = id; const confirmDeleteForm = document.getElementById('confirmDeleteForm'); confirmDeleteForm.querySelector('input[name="deletionType"]').value = type; confirmDeleteForm.querySelector('input[name="deletionId"]').value = id; if (type === 'announcement') { document.getElementById('confirmDeleteTitle').textContent = 'Supprimer l\'annonce'; document.getElementById('confirmDeleteMessage').textContent = 'Êtes-vous sûr de vouloir supprimer cette annonce ?'; } else if (type === 'monster') { document.getElementById('confirmDeleteTitle').textContent = 'Supprimer le monstre'; document.getElementById('confirmDeleteMessage').textContent = 'Êtes-vous sûr de vouloir supprimer ce monstre ? Cette action supprimera également toutes les quêtes associées.'; } new bootstrap.Modal(document.getElementById('confirmDeleteModal')).show(); } /** * Gérer la confirmation de suppression */ function handleConfirmDelete() { const formData = new FormData(document.getElementById('confirmDeleteForm')); let url = '../api.php?action='; if (currentDeletionType === 'announcement') { url += 'deleteAnnouncement'; } else if (currentDeletionType === 'monster') { url += 'deleteMonster'; } else { return; } // Envoyer la requête fetch(url, { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.success) { // Fermer la modale bootstrap.Modal.getInstance(document.getElementById('confirmDeleteModal')).hide(); // Recharger la page pour mettre à jour la liste window.location.reload(); } else { alert('Erreur lors de la suppression: ' + (data.message || 'Erreur inconnue')); } }) .catch(error => { console.error('Erreur:', error); alert('Erreur de connexion. Veuillez réessayer.'); }); }