588 lines
20 KiB
JavaScript
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.');
|
|
});
|
|
} |