2025-03-09 18:45:32 +01:00
/ * *
* 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' ;
} ) ;
}
} ) ;
2025-03-09 19:16:31 +01:00
// 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 ) ;
}
}
2025-03-09 18:45:32 +01:00
/ * *
* 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.' ) ;
} ) ;
}