// Variables globales let monsters = []; let quests = []; let announcements = []; // Éléments DOM pour les onglets const announcementsTab = document.getElementById('announcementsTab'); const monstersTab = document.getElementById('monstersTab'); const maintenanceTab = document.getElementById('maintenanceTab'); const sectionsEls = document.querySelectorAll('.admin-section'); // Éléments DOM pour les annonces const announcementsListEl = document.getElementById('announcementsList'); const emptyAnnouncementsMessageEl = document.getElementById('emptyAnnouncementsMessage'); const addAnnouncementBtn = document.getElementById('addAnnouncementBtn'); const announcementForm = document.getElementById('announcementForm'); const announcementIdEl = document.getElementById('announcementId'); const announcementTextEl = document.getElementById('announcementText'); const announcementActiveEl = document.getElementById('announcementActive'); const announcementModalTitleEl = document.getElementById('announcementModalTitle'); // Éléments DOM pour les monstres const monstersListEl = document.getElementById('monstersList'); const emptyMonstersMessageEl = document.getElementById('emptyMonstersMessage'); const addMonsterBtn = document.getElementById('addMonsterBtn'); const monsterForm = document.getElementById('monsterForm'); const monsterIdEl = document.getElementById('monsterId'); const monsterNameEl = document.getElementById('monsterName'); const monsterImageEl = document.getElementById('monsterImage'); const monsterModalTitleEl = document.getElementById('monsterModalTitle'); // Éléments DOM pour la maintenance const cleanOldQuestsBtn = document.getElementById('cleanOldQuestsBtn'); const cleanResultEl = document.getElementById('cleanResult'); const totalMonstersCountEl = document.getElementById('totalMonstersCount'); const totalQuestsCountEl = document.getElementById('totalQuestsCount'); const smallCrownQuestsCountEl = document.getElementById('smallCrownQuestsCount'); const largeCrownQuestsCountEl = document.getElementById('largeCrownQuestsCount'); // Éléments DOM pour la confirmation de suppression const confirmDeleteBtn = document.getElementById('confirmDeleteBtn'); const confirmDeleteMessageEl = document.getElementById('confirmDeleteMessage'); const confirmDeleteTitleEl = document.getElementById('confirmDeleteTitle'); // Modales Bootstrap const announcementModal = new bootstrap.Modal(document.getElementById('announcementModal')); const monsterModal = new bootstrap.Modal(document.getElementById('monsterModal')); const confirmDeleteModal = new bootstrap.Modal(document.getElementById('confirmDeleteModal')); // Variables pour la suppression let currentDeletionType = null; let currentDeletionId = null; // Vérifier l'authentification et rediriger si nécessaire function checkAuthentication() { if (localStorage.getItem('admin_authenticated') !== 'true') { window.location.href = 'login.html'; return false; } return true; } // Déconnexion function logout() { localStorage.removeItem('admin_authenticated'); window.location.href = 'login.html?logout=true'; } // Initialisation document.addEventListener('DOMContentLoaded', () => { // Vérifier l'authentification if (!checkAuthentication()) { return; } loadData(); // Événements pour les onglets announcementsTab.addEventListener('click', (e) => { e.preventDefault(); showSection('announcementsSection'); }); monstersTab.addEventListener('click', (e) => { e.preventDefault(); showSection('monstersSection'); }); maintenanceTab.addEventListener('click', (e) => { e.preventDefault(); showSection('maintenanceSection'); updateStatistics(); }); // Événements pour les annonces addAnnouncementBtn.addEventListener('click', () => { resetAnnouncementForm(); announcementModalTitleEl.textContent = 'Ajouter une annonce'; announcementModal.show(); }); announcementForm.addEventListener('submit', handleSaveAnnouncement); // Événements pour les monstres addMonsterBtn.addEventListener('click', () => { resetMonsterForm(); monsterModalTitleEl.textContent = 'Ajouter un monstre'; monsterModal.show(); }); monsterForm.addEventListener('submit', handleSaveMonster); // Événements pour la maintenance cleanOldQuestsBtn.addEventListener('click', handleCleanOldQuests); // Événement pour la confirmation de suppression confirmDeleteBtn.addEventListener('click', handleConfirmDelete); // Événement pour la déconnexion document.getElementById('logoutBtn').addEventListener('click', logout); }); // Fonctions de chargement et sauvegarde des données function loadData() { // Dans une implémentation réelle, ces données seraient chargées depuis des fichiers JSON ou une API // Pour l'instant, nous utilisons des données temporaires monsters = [ { id: 1, name: 'Chatacabra', image: 'img/Chatacabra.jpg' }, { id: 2, name: 'Quematrice', image: 'img/Quematrice.jpg' }, { id: 3, name: 'Lala Barina', image: 'img/Lala_Barina.jpg' }, { id: 4, name: 'Congalala', image: 'img/Congalala.jpg' }, { id: 5, name: 'Balahara', image: 'img/Balahara.jpg' }, { id: 6, name: 'Doshaguma', image: 'img/Doshaguma.jpg' }, { id: 7, name: 'Uth Duna', image: 'img/Uth_Duna.jpg' }, { id: 8, name: 'Rompopolo', image: 'img/Rompopolo.jpg' }, { id: 9, name: 'Rey Dau', image: 'img/Rey_Dau.jpg' }, { id: 10, name: 'Nerscylla', image: 'img/Nerscylla.jpg' }, { id: 11, name: 'Hirabami', image: 'img/Hirabami.jpg' }, { id: 12, name: 'Ajarakan', image: 'img/Ajarakan.jpg' }, { id: 13, name: 'Nu Udra', image: 'img/Nu_Udra.jpg' }, { id: 14, name: 'Doshaguma Gardien', image: 'img/Doshaguma_Gardien.jpg' }, { id: 15, name: 'Rathalos Gardien', image: 'img/Rathalos_Gardien.jpg' }, { id: 16, name: 'Jin Dahaad', image: 'img/Jin_Dahaad.jpg' }, { id: 17, name: 'Odogaron Désastre Gardien', image: 'img/Odogaron_Desastre_Gardien.jpg' }, { id: 18, name: 'Xu Wu', image: 'img/Xu_Wu.jpg' }, { id: 19, name: 'Arkveld Gardien', image: 'img/Arkveld_Gardien.jpg' }, { id: 20, name: 'Zoh Shia', image: 'img/Zoh_Shia.jpg' }, { id: 21, name: 'Yian Kut-Ku', image: 'img/Yian_Kut-Ku.jpg' }, { id: 22, name: 'Gypceros', image: 'img/Gypceros.jpg' }, { id: 23, name: 'Rathian', image: 'img/Rathian.jpg' }, { id: 24, name: 'Anjanath Tonnerre Gardien', image: 'img/Anjanath_Tonnerre_Gardien.jpg' }, { id: 25, name: 'Rathalos', image: 'img/Rathalos.jpg' }, { id: 26, name: 'Gravios', image: 'img/Gravios.jpg' }, { id: 27, name: 'Blangonga', image: 'img/Blangonga.jpg' }, { id: 28, name: 'Gore Malaga', image: 'img/Gore_Malaga.jpg' }, { id: 29, name: 'Arkveld', image: 'img/Arkveld.jpg' } ]; quests = [ { id: 1, monsterId: 1, crownType: 'small', playerName: 'Hunter123', playerId: 'MHW-1234', date: new Date().toISOString() }, { id: 2, monsterId: 1, crownType: 'large', playerName: 'DragonSlayer', playerId: 'MHW-5678', date: new Date().toISOString() }, { id: 3, monsterId: 2, crownType: 'small', playerName: 'ThunderLord', playerId: 'MHW-9012', date: new Date().toISOString() } ]; announcements = [ { id: 1, text: "Bienvenue sur le site de partage de quêtes à couronnes pour Monster Hunter Wilds!", active: true }, { id: 2, text: "De nouveaux monstres ont été ajoutés, consultez la liste!", active: false } ]; // Essayer de charger depuis localStorage s'il y a des données const storedMonsters = localStorage.getItem('mhw_monsters'); const storedQuests = localStorage.getItem('mhw_quests'); const storedAnnouncements = localStorage.getItem('mhw_announcements'); if (storedMonsters) monsters = JSON.parse(storedMonsters); if (storedQuests) quests = JSON.parse(storedQuests); if (storedAnnouncements) announcements = JSON.parse(storedAnnouncements); renderAnnouncementsList(); renderMonstersList(); } function saveData() { // Dans une implémentation réelle, ces données seraient sauvegardées via une API localStorage.setItem('mhw_monsters', JSON.stringify(monsters)); localStorage.setItem('mhw_quests', JSON.stringify(quests)); localStorage.setItem('mhw_announcements', JSON.stringify(announcements)); console.log('Données sauvegardées'); } // Fonctions pour la navigation entre les sections function showSection(sectionId) { // Désactiver tous les onglets et masquer toutes les sections document.querySelectorAll('.list-group-item').forEach(tab => { tab.classList.remove('active'); }); sectionsEls.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') { announcementsTab.classList.add('active'); } else if (sectionId === 'monstersSection') { monstersTab.classList.add('active'); } else if (sectionId === 'maintenanceSection') { maintenanceTab.classList.add('active'); } } // ============ ANNONCES ============ // Rendu de la liste des annonces function renderAnnouncementsList() { if (announcements.length === 0) { announcementsListEl.innerHTML = ''; emptyAnnouncementsMessageEl.classList.remove('d-none'); return; } emptyAnnouncementsMessageEl.classList.add('d-none'); announcementsListEl.innerHTML = announcements.map(announcement => { const statusBadge = announcement.active ? 'Active' : 'Inactive'; return `