Actualiser js/public.js

This commit is contained in:
2026-06-19 16:20:32 +02:00
parent deaec0fd57
commit d40187f471
+77 -28
View File
@@ -2,7 +2,8 @@ let films = [];
const API_URL = '../api.php'; const API_URL = '../api.php';
let currentPubTab = 'critique'; let currentPubTab = 'critique';
let activeRatingFilter = 0; let activeRatingFilter = 0;
let searchQuery = ''; let activeStreamingFilter = ''; // Nouveau filtre
let searchQuery = ''; // Si vous avez ajouté la recherche
let currentPage = 1; let currentPage = 1;
const itemsPerPage = 12; const itemsPerPage = 12;
@@ -11,36 +12,82 @@ async function loadPublicData() {
const response = await fetch(`${API_URL}?action=get_films`); const response = await fetch(`${API_URL}?action=get_films`);
films = await response.json(); films = await response.json();
renderPublicGrid(); renderPublicGrid();
generateStreamingFilters(); // Générer les filtres dynamiquement
} catch (error) { } catch (error) {
console.error("Erreur de récupération :", 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) { function switchPubTab(tabName) {
currentPubTab = tabName; currentPubTab = tabName;
activeRatingFilter = 0; activeRatingFilter = 0;
activeStreamingFilter = ''; // Reset
currentPage = 1; currentPage = 1;
searchQuery = '';
const searchInput = document.getElementById('pub-search-input');
if (searchInput) searchInput.value = '';
const filterBar = document.getElementById('rating-filter-bar'); 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 => { document.querySelectorAll('.rating-filter-btn').forEach(btn => {
btn.classList.remove('active'); btn.classList.remove('active');
btn.querySelectorAll('.rf-star').forEach(s => s.classList.remove('filled')); 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')); document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active'));
const activeBtn = document.getElementById(`tab-pub-${tabName}s`); const activeBtn = document.getElementById(`tab-pub-${tabName}s`);
if (activeBtn) activeBtn.classList.add('active'); if(activeBtn) activeBtn.classList.add('active');
renderPublicGrid(); renderPublicGrid();
} }
function filterByRating(stars) { function filterByRating(stars) {
if (currentPubTab !== 'critique') return; if (currentPubTab !== 'critique') return;
activeRatingFilter = (activeRatingFilter === stars) ? 0 : stars; activeRatingFilter = (activeRatingFilter === stars) ? 0 : stars;
currentPage = 1;
document.querySelectorAll('.rating-filter-btn').forEach(btn => { document.querySelectorAll('.rating-filter-btn').forEach(btn => {
const n = parseInt(btn.dataset.stars); const n = parseInt(btn.dataset.stars);
@@ -52,6 +99,18 @@ function filterByRating(stars) {
renderPublicGrid(); 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() { function renderPublicGrid() {
const grid = document.getElementById('grid'); const grid = document.getElementById('grid');
const emptyState = document.getElementById('empty-state'); const emptyState = document.getElementById('empty-state');
@@ -66,6 +125,14 @@ function renderPublicGrid() {
filtered = filtered.filter(f => Math.round(parseFloat(f.rating)) === activeRatingFilter); 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) { if (searchQuery) {
const q = searchQuery.toLowerCase(); const q = searchQuery.toLowerCase();
filtered = filtered.filter(f => filtered = filtered.filter(f =>
@@ -101,11 +168,10 @@ function renderPublicGrid() {
? `<div class="card-poster-wrap"><img class="card-poster" src="${f.poster}" alt="${f.title}" loading="lazy"></div>` ? `<div class="card-poster-wrap"><img class="card-poster" src="${f.poster}" alt="${f.title}" loading="lazy"></div>`
: `<div class="card-poster-wrap"><div class="card-poster-placeholder"><i class="ti ti-movie"></i><span>Pas d'affiche</span></div></div>`; : `<div class="card-poster-wrap"><div class="card-poster-placeholder"><i class="ti ti-movie"></i><span>Pas d'affiche</span></div></div>`;
// Badge streaming en haut à droite de l'affiche
let streamingBadge = ''; let streamingBadge = '';
if (f.type === 'critique') { if (f.type === 'critique') {
if (f.streaming && f.streaming !== 'Disponible en support physique ou Cinéma') { if (f.streaming && f.streaming !== 'Disponible en support physique ou Cinéma') {
streamingBadge = `<div class="card-streaming-badge" title="${f.streaming}">📺 ${f.streaming.split(',')[0]}</div>`; streamingBadge = `<div class="card-streaming-badge" title="${f.streaming}"> ${f.streaming.split(',')[0]}</div>`;
} else { } else {
streamingBadge = `<div class="card-physical-badge">🎟️ Physique / Cinéma</div>`; streamingBadge = `<div class="card-physical-badge">🎟️ Physique / Cinéma</div>`;
} }
@@ -154,20 +220,17 @@ function renderPagination(totalPages) {
if (totalPages <= 1) return; if (totalPages <= 1) return;
// Info
const info = document.createElement('span'); const info = document.createElement('span');
info.className = 'pub-pagination-info'; info.className = 'pub-pagination-info';
info.textContent = `Page ${currentPage} / ${totalPages}`; info.textContent = `Page ${currentPage} / ${totalPages}`;
container.appendChild(info); container.appendChild(info);
// Prev
const prevBtn = document.createElement('button'); const prevBtn = document.createElement('button');
prevBtn.innerHTML = '<i class="ti ti-chevron-left"></i>'; prevBtn.innerHTML = '<i class="ti ti-chevron-left"></i>';
prevBtn.disabled = currentPage === 1; prevBtn.disabled = currentPage === 1;
prevBtn.onclick = () => { currentPage--; renderPublicGrid(); window.scrollTo({ top: 0, behavior: 'smooth' }); }; prevBtn.onclick = () => { currentPage--; renderPublicGrid(); window.scrollTo({ top: 0, behavior: 'smooth' }); };
container.appendChild(prevBtn); container.appendChild(prevBtn);
// Pages intelligentes
const maxButtons = 5; const maxButtons = 5;
let startPage = Math.max(1, currentPage - Math.floor(maxButtons / 2)); let startPage = Math.max(1, currentPage - Math.floor(maxButtons / 2));
let endPage = Math.min(totalPages, startPage + maxButtons - 1); let endPage = Math.min(totalPages, startPage + maxButtons - 1);
@@ -187,7 +250,6 @@ function renderPagination(totalPages) {
container.appendChild(createPubPageBtn(totalPages)); container.appendChild(createPubPageBtn(totalPages));
} }
// Next
const nextBtn = document.createElement('button'); const nextBtn = document.createElement('button');
nextBtn.innerHTML = '<i class="ti ti-chevron-right"></i>'; nextBtn.innerHTML = '<i class="ti ti-chevron-right"></i>';
nextBtn.disabled = currentPage === totalPages; nextBtn.disabled = currentPage === totalPages;
@@ -211,7 +273,7 @@ function createPubEllipsis() {
return span; return span;
} }
// ── DÉTAIL (inchangé, juste adapté aux nouvelles notes) ── // ── DÉTAIL ──
function openDetail(id) { function openDetail(id) {
const f = films.find(item => item.id == id); const f = films.find(item => item.id == id);
if (!f) return; if (!f) return;
@@ -288,17 +350,4 @@ function closeDetail() {
if (detailOverlay) detailOverlay.classList.remove('open'); if (detailOverlay) detailOverlay.classList.remove('open');
} }
// ── INITIALISATION ── document.addEventListener('DOMContentLoaded', loadPublicData);
document.addEventListener('DOMContentLoaded', () => {
loadPublicData();
// Écouteur de recherche
const searchInput = document.getElementById('pub-search-input');
if (searchInput) {
searchInput.addEventListener('input', (e) => {
searchQuery = e.target.value;
currentPage = 1;
renderPublicGrid();
});
}
});