diff --git a/admin.html b/admin.html index 8ffc1d4..c676186 100644 --- a/admin.html +++ b/admin.html @@ -236,6 +236,9 @@ + + + \ No newline at end of file diff --git a/index.html b/index.html index 394af55..1636df1 100644 --- a/index.html +++ b/index.html @@ -229,6 +229,8 @@ + + \ No newline at end of file diff --git a/js/admin.js b/js/admin.js index c82d111..24ef54a 100644 --- a/js/admin.js +++ b/js/admin.js @@ -122,67 +122,38 @@ document.addEventListener('DOMContentLoaded', () => { // 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); + // Vérifier si les données de jeu sont disponibles depuis data.js + if (window.gameData) { + // Charger les monstres depuis les données du jeu + monsters = [...window.gameData.monsters]; + + // Charger les quêtes depuis localStorage ou utiliser les données par défaut + const storedQuests = localStorage.getItem('mhw_quests'); + quests = storedQuests ? JSON.parse(storedQuests) : [...window.gameData.initialQuests]; + + // Charger les annonces depuis localStorage ou utiliser les données par défaut + const storedAnnouncements = localStorage.getItem('mhw_announcements'); + announcements = storedAnnouncements ? JSON.parse(storedAnnouncements) : [...window.gameData.initialAnnouncements]; + } else { + // Fallback au cas où data.js n'est pas chargé + console.warn("Données de jeu non disponibles. Utilisation des données locales de secours."); + monsters = []; + // Essayer de charger depuis localStorage + 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 + // Sauvegarder dans le localStorage localStorage.setItem('mhw_monsters', JSON.stringify(monsters)); localStorage.setItem('mhw_quests', JSON.stringify(quests)); localStorage.setItem('mhw_announcements', JSON.stringify(announcements)); diff --git a/js/data.js b/js/data.js new file mode 100644 index 0000000..e3f6128 --- /dev/null +++ b/js/data.js @@ -0,0 +1,52 @@ +/** + * Fichier de données pour l'application MH Wilds - Quêtes à Couronnes + * Contient la liste des monstres du jeu + */ + +// Créer l'objet de données global +window.gameData = { + // Liste des monstres du jeu + 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' } + ], + + // Données initiales pour les quêtes (à titre d'exemple) + initialQuests: [ + { 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() } + ], + + // Données initiales pour les annonces + initialAnnouncements: [ + { id: 1, text: "Bienvenue sur le site de partage de quêtes à couronnes pour Monster Hunter Wilds !", active: true } + ] +}; \ No newline at end of file diff --git a/js/main.js b/js/main.js index 218a58d..af05efb 100644 --- a/js/main.js +++ b/js/main.js @@ -1,45 +1,7 @@ -// Liste des monstres du jeu -let 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' } -]; - -let 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() } -]; - -let announcements = [ - { id: 1, text: "Bienvenue sur le site de partage de quêtes à couronnes pour Monster Hunter Wilds!", active: true } -]; +// Variables globales pour les données +let monsters = []; +let quests = []; +let announcements = []; // Éléments DOM const monsterListEl = document.getElementById('monsterList'); @@ -66,7 +28,7 @@ const deleteQuestModal = new bootstrap.Modal(document.getElementById('deleteQues document.addEventListener('DOMContentLoaded', () => { loadData(); renderMonsterList(); - setupMonsterSearchSelect(); + initMonsterSearchSelect(); displayAnnouncements(); // Événements @@ -83,23 +45,37 @@ document.addEventListener('DOMContentLoaded', () => { // Événements pour la recherche monsterSearchEl.addEventListener('input', searchMonsters); clearSearchBtn.addEventListener('click', clearSearch); - - // Initialiser le sélecteur de monstre avec recherche - initMonsterSearchSelect(); }); // Fonctions de chargement et sauvegarde des données function loadData() { - // Essayer de charger depuis localStorage s'il y a des données - const storedQuests = localStorage.getItem('mhw_quests'); - const storedAnnouncements = localStorage.getItem('mhw_announcements'); - - if (storedQuests) quests = JSON.parse(storedQuests); - if (storedAnnouncements) announcements = JSON.parse(storedAnnouncements); + // Vérifier si les données de jeu sont disponibles depuis data.js + if (window.gameData) { + // Copier les monstres depuis gameData + monsters = [...window.gameData.monsters]; + + // Charger les quêtes depuis localStorage ou utiliser les données par défaut + const storedQuests = localStorage.getItem('mhw_quests'); + quests = storedQuests ? JSON.parse(storedQuests) : [...window.gameData.initialQuests]; + + // Charger les annonces depuis localStorage ou utiliser les données par défaut + const storedAnnouncements = localStorage.getItem('mhw_announcements'); + announcements = storedAnnouncements ? JSON.parse(storedAnnouncements) : [...window.gameData.initialAnnouncements]; + } else { + console.error("Erreur: données de jeu non disponibles. Assurez-vous que data.js est chargé avant main.js"); + monsterListEl.innerHTML = ` +
+
+ Erreur de chargement des données. Veuillez rafraîchir la page. +
+
+ `; + } } function saveData() { localStorage.setItem('mhw_quests', JSON.stringify(quests)); + localStorage.setItem('mhw_announcements', JSON.stringify(announcements)); console.log('Données sauvegardées'); } @@ -325,85 +301,6 @@ function handleDeleteQuest() { currentQuestToDelete = null; } -// Préparer le HTML pour le sélecteur de monstre avec recherche -function setupMonsterSearchSelect() { - // Récupérer le conteneur du formulaire - const monsterFieldContainer = document.querySelector('.mb-3:has(#monsterSelect)'); - - if (!monsterFieldContainer) return; - - // Remplacer le contenu par notre nouveau sélecteur - monsterFieldContainer.innerHTML = ` - -
-
- 🔍 - - -
-
- -
-
-
Veuillez sélectionner un monstre
- `; - - // Ajouter les styles CSS nécessaires s'ils n'existent pas déjà - if (!document.getElementById('monster-search-styles')) { - const styleEl = document.createElement('style'); - styleEl.id = 'monster-search-styles'; - styleEl.textContent = ` - /* Styles pour le select searchable personnalisé */ - .monster-search-container { - position: relative; - } - - .monster-search-results { - position: absolute; - width: 100%; - max-height: 250px; - overflow-y: auto; - background-color: var(--mh-light-bg); - border: 1px solid var(--mh-accent); - border-radius: 0.375rem; - z-index: 1050; - margin-top: 2px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); - } - - .monster-search-item { - padding: 8px 12px; - cursor: pointer; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - color: var(--mh-light); - } - - .monster-search-item:hover, - .monster-search-item.active { - background-color: var(--mh-dark); - } - - .monster-search-item:last-child { - border-bottom: none; - } - - .selected-monster { - font-weight: bold; - color: var(--mh-accent); - } - - .monster-search-no-results { - padding: 10px; - text-align: center; - color: var(--mh-light); - font-style: italic; - } - `; - document.head.appendChild(styleEl); - } -} - // Initialiser le sélecteur de monstre avec recherche function initMonsterSearchSelect() { const searchInput = document.getElementById('monsterSearchSelect');