502 lines
17 KiB
JavaScript
502 lines
17 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';
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
|
||
|
/**
|
||
|
* 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 7 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.');
|
||
|
});
|
||
|
}
|