From 4708f279124a4d9987b67afce2b51c7e4b3ba2ba Mon Sep 17 00:00:00 2001 From: Dicken Date: Thu, 18 Jun 2026 11:27:10 +0200 Subject: [PATCH] fix: TV-Modal schwarze Seite (xREL skip), aufklappbare Sektionen, TV-Staffelinfo --- frontend/src/tools/media.jsx | 159 ++++++++++++++++++++--------------- 1 file changed, 89 insertions(+), 70 deletions(-) diff --git a/frontend/src/tools/media.jsx b/frontend/src/tools/media.jsx index 2bbb1c4..e7548e0 100644 --- a/frontend/src/tools/media.jsx +++ b/frontend/src/tools/media.jsx @@ -387,6 +387,47 @@ function DemnächstGrid({ onOpenModal, xrelIds, onXrelLoaded }) { } // ── Suche ──────────────────────────────────────────────────────────────────── +// ── Aufklappbare Film/Serien-Sektion ───────────────────────────────────────── +function CollapsibleSection({ label, count, children, defaultOpen=true }) { + const [open, setOpen] = useState(defaultOpen); + return ( +
+ + {open && children} +
+ ); +} + +function SectionedGrid({ films, serien, favIds, xrelIds, onToggle, onOpenModal }) { + return ( +
+ {films.length > 0 && ( + +
+ {films.map(m => )} +
+
+ )} + {serien.length > 0 && ( + +
+ {serien.map(m => )} +
+
+ )} +
+ ); +} + function SucheGrid({ onOpenModal, xrelIds, onXrelLoaded }) { const [query, setQuery] = useState(''); const [results, setResults] = useState(null); // null=noch nicht gesucht @@ -465,26 +506,7 @@ function SucheGrid({ onOpenModal, xrelIds, onXrelLoaded }) { {results !== null && results.length > 0 && (() => { const films = results.filter(m => m.media_type !== 'tv'); const serien = results.filter(m => m.media_type === 'tv'); - return ( -
- {films.length > 0 && ( -
-
🎬 FILME ({films.length})
-
- {films.map(m => )} -
-
- )} - {serien.length > 0 && ( -
-
📺 SERIEN ({serien.length})
-
- {serien.map(m => )} -
-
- )} -
- ); + return ; })()} ); @@ -700,45 +722,38 @@ function FavoritenKalender({ onOpenModal }) { )} )} - {/* Filme */} {filmeFavs.length > 0 && ( -
- 🎬 FILME ({filmeFavs.length}) -
+ + {Object.entries(filmGroups).sort(([a],[b]) => a.localeCompare(b)).map(([key, group]) => ( +
+
+ {group.label.toUpperCase()} +
+ {group.items.length}× +
+
+ {group.items.map(f => )} +
+
+ ))} + )} - {Object.entries(filmGroups).sort(([a],[b]) => a.localeCompare(b)).map(([key, group]) => ( -
-
- {group.label.toUpperCase()} -
- {group.items.length} Film{group.items.length!==1?'e':''} -
-
- {group.items.map(f => )} -
-
- ))} - {/* Serien */} {serienFavs.length > 0 && ( -
- 📺 SERIEN ({serienFavs.length}) -
+ + {Object.entries(serienGroups).sort(([a],[b]) => a.localeCompare(b)).map(([key, group]) => ( +
+
+ {group.label.toUpperCase()} +
+ {group.items.length}× +
+
+ {group.items.map(f => )} +
+
+ ))} + )} - {Object.entries(serienGroups).sort(([a],[b]) => a.localeCompare(b)).map(([key, group]) => ( -
-
- {group.label.toUpperCase()} -
- {group.items.length} Serie{group.items.length!==1?'n':''} -
-
- {group.items.map(f => )} -
-
- ))} - {/* Alte groups-Schleife entfernt – DUMMY damit Code nicht bricht */} {false && Object.entries({}).map(([key, group]) => (
@@ -813,25 +828,27 @@ function MovieModal({ tmdbId, mediaType='movie', onClose, mobile, onHasXrel, noY setDetail(d); detailRef.current = d; setLoading(false); - // Gecachte Releases laden sobald wir den Titel kennen - const params = new URLSearchParams({ - title: d.title || '', - orig: d.original_title || '', - imdb_id: d.imdb_id || '', - year: noYearFilter ? '0' : (d.release_date ? d.release_date.slice(0,4) : ''), - }); - api(`/tools/media/movie/${tmdbId}/xrel?${params}`) - .then(r => { - if (r.xrel_dates?.length > 0) setXrelDates(r.xrel_dates); - if (r.xrel?.length > 0) { setXrel(r.xrel); onHasXrel?.(tmdbId); } - }) - .catch(() => {}); + // Gecachte Releases laden (nur für Filme) + if (mediaType !== 'tv') { + const params = new URLSearchParams({ + title: d.title || '', + orig: d.original_title || '', + imdb_id: d.imdb_id || '', + year: noYearFilter ? '0' : (d.release_date ? d.release_date.slice(0,4) : ''), + }); + api(`/tools/media/movie/${tmdbId}/xrel?${params}`) + .then(r => { + if (r.xrel_dates?.length > 0) setXrelDates(r.xrel_dates); + if (r.xrel?.length > 0) { setXrel(r.xrel); onHasXrel?.(tmdbId); } + }) + .catch(() => {}); + } }) .catch(e => { setError(e.message); setLoading(false); }); const prev = document.body.style.overflow; document.body.style.overflow = 'hidden'; return () => { document.body.style.overflow = prev; }; - }, [tmdbId]); + }, [tmdbId, mediaType]); const searchXrel = async (forceRefresh = false) => { const d = detailRef.current; @@ -931,7 +948,9 @@ function MovieModal({ tmdbId, mediaType='movie', onClose, mobile, onHasXrel, noY )}
{detail.vote_average > 0 && ★ {detail.vote_average.toFixed(1)}} - {detail.runtime > 0 && ⏱ {detail.runtime} Min} + {detail.media_type !== 'tv' && detail.runtime > 0 && ⏱ {detail.runtime} Min} + {detail.media_type === 'tv' && detail.number_of_seasons > 0 && 📺 {detail.number_of_seasons} Staffel{detail.number_of_seasons!==1?'n':''}} + {detail.media_type === 'tv' && detail.number_of_episodes > 0 && {detail.number_of_episodes} Ep.} {fskStyle && FSK {detail.fsk}} {detail.release_date && 🇩🇪 {fmtDE(detail.release_date)}} {detail.countries?.length > 0 && 🌍 {detail.countries.slice(0,2).join(' · ')}}