588 lines
20 KiB
JavaScript

/**
* 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';
// Ajouter l'ID avec le nom attendu par l'API
formData.append('id', formData.get('deletionId'));
} else if (currentDeletionType === 'monster') {
url += 'deleteMonster';
// Ajouter l'ID avec le nom attendu par l'API
formData.append('id', formData.get('deletionId'));
} 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.');
});
}