diff --git a/js/public.js b/js/public.js index f4e0244..e58d081 100644 --- a/js/public.js +++ b/js/public.js @@ -2,7 +2,8 @@ let films = []; const API_URL = '../api.php'; let currentPubTab = 'critique'; let activeRatingFilter = 0; -let searchQuery = ''; +let activeStreamingFilter = ''; // Nouveau filtre +let searchQuery = ''; // Si vous avez ajouté la recherche let currentPage = 1; const itemsPerPage = 12; @@ -11,36 +12,82 @@ async function loadPublicData() { const response = await fetch(`${API_URL}?action=get_films`); films = await response.json(); renderPublicGrid(); + generateStreamingFilters(); // Générer les filtres dynamiquement } catch (error) { console.error("Erreur de récupération :", error); } } +// ── GÉNÉRATION DYNAMIQUE DES FILTRES STREAMING ── +function generateStreamingFilters() { + const container = document.getElementById('streaming-filter-buttons'); + if (!container) return; + + // Extraire toutes les plateformes uniques + const platforms = new Set(); + films.forEach(f => { + if (f.type === 'critique' && f.streaming && f.streaming !== 'Disponible en support physique ou Cinéma') { + // Séparer par virgule si plusieurs plateformes + f.streaming.split(',').forEach(p => { + const platform = p.trim(); + if (platform) platforms.add(platform); + }); + } + }); + + // Trier alphabétiquement + const sortedPlatforms = Array.from(platforms).sort(); + + // Bouton "Toutes" + const allBtn = document.createElement('button'); + allBtn.className = 'streaming-filter-btn active'; + allBtn.textContent = 'Toutes'; + allBtn.onclick = () => filterByStreaming(''); + container.appendChild(allBtn); + + // Boutons pour chaque plateforme + sortedPlatforms.forEach(platform => { + const btn = document.createElement('button'); + btn.className = 'streaming-filter-btn'; + btn.textContent = platform; + btn.onclick = () => filterByStreaming(platform); + container.appendChild(btn); + }); +} + function switchPubTab(tabName) { currentPubTab = tabName; activeRatingFilter = 0; + activeStreamingFilter = ''; // Reset currentPage = 1; - searchQuery = ''; - const searchInput = document.getElementById('pub-search-input'); - if (searchInput) searchInput.value = ''; const filterBar = document.getElementById('rating-filter-bar'); - if (filterBar) filterBar.style.display = (tabName === 'critique') ? 'flex' : 'none'; + if(filterBar) filterBar.style.display = (tabName === 'critique') ? 'flex' : 'none'; + + const streamingBar = document.getElementById('streaming-filter-bar'); + if(streamingBar) streamingBar.style.display = (tabName === 'critique') ? 'flex' : 'none'; document.querySelectorAll('.rating-filter-btn').forEach(btn => { btn.classList.remove('active'); btn.querySelectorAll('.rf-star').forEach(s => s.classList.remove('filled')); }); + + // Reset filtres streaming + document.querySelectorAll('.streaming-filter-btn').forEach(btn => { + btn.classList.remove('active'); + }); + const allBtn = document.querySelector('.streaming-filter-btn'); + if(allBtn) allBtn.classList.add('active'); + document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active')); const activeBtn = document.getElementById(`tab-pub-${tabName}s`); - if (activeBtn) activeBtn.classList.add('active'); + if(activeBtn) activeBtn.classList.add('active'); renderPublicGrid(); } function filterByRating(stars) { if (currentPubTab !== 'critique') return; activeRatingFilter = (activeRatingFilter === stars) ? 0 : stars; - currentPage = 1; document.querySelectorAll('.rating-filter-btn').forEach(btn => { const n = parseInt(btn.dataset.stars); @@ -52,6 +99,18 @@ function filterByRating(stars) { renderPublicGrid(); } +// ── NOUVEAU : FILTRE PAR STREAMING ─ +function filterByStreaming(platform) { + if (currentPubTab !== 'critique') return; + activeStreamingFilter = platform; + + document.querySelectorAll('.streaming-filter-btn').forEach(btn => { + btn.classList.toggle('active', btn.textContent === (platform || 'Toutes')); + }); + + renderPublicGrid(); +} + function renderPublicGrid() { const grid = document.getElementById('grid'); const emptyState = document.getElementById('empty-state'); @@ -66,6 +125,14 @@ function renderPublicGrid() { filtered = filtered.filter(f => Math.round(parseFloat(f.rating)) === activeRatingFilter); } + // NOUVEAU : Filtre par plateforme + if (currentPubTab === 'critique' && activeStreamingFilter) { + filtered = filtered.filter(f => { + if (!f.streaming || f.streaming === 'Disponible en support physique ou Cinéma') return false; + return f.streaming.split(',').map(p => p.trim()).includes(activeStreamingFilter); + }); + } + if (searchQuery) { const q = searchQuery.toLowerCase(); filtered = filtered.filter(f => @@ -101,11 +168,10 @@ function renderPublicGrid() { ? `