diff --git a/app/public/assets/css/main.css b/app/public/assets/css/main.css index 384eb6a..57f8dd5 100644 --- a/app/public/assets/css/main.css +++ b/app/public/assets/css/main.css @@ -563,3 +563,64 @@ flex-direction: column; } } + +.dashboard-card-grid { + display: grid; + gap: 0.85rem; +} + +.dashboard-programme-card { + text-align: left; + display: grid; + grid-template-columns: 64px 1fr; + gap: 0.75rem; + align-items: center; + width: 100%; + border: 1px solid var(--border); + border-radius: 14px; + padding: 0.85rem; + background: var(--panel-2); + color: var(--text); + cursor: pointer; +} + +.dashboard-programme-card:hover { + background: var(--panel-3); + transform: translateY(-1px); +} + +.dashboard-programme-card img { + grid-row: span 3; + width: 64px; + height: 44px; + object-fit: contain; + background: var(--panel); + border: 1px solid var(--border); + border-radius: 0.6rem; + padding: 4px; +} + +.dashboard-programme-card strong { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dashboard-programme-card span { + color: var(--muted); + font-size: 0.88rem; +} + +.dashboard-progress { + height: 8px; + background: var(--panel); + border: 1px solid var(--border); + border-radius: 999px; + overflow: hidden; +} + +.dashboard-progress div { + height: 100%; + background: var(--accent); + border-radius: 999px; +} diff --git a/app/public/assets/js/modules/modal.js b/app/public/assets/js/modules/modal.js index 3cfa4b9..01ad38f 100644 --- a/app/public/assets/js/modules/modal.js +++ b/app/public/assets/js/modules/modal.js @@ -85,7 +85,7 @@ export function initProgrammeModal() { document.body.classList.remove("modal-open"); }; - document.querySelectorAll(".timeline-programme").forEach((programme) => { + document.querySelectorAll(".timeline-programme, .dashboard-programme").forEach((programme) => { programme.addEventListener("click", () => openModal(programme)); }); diff --git a/app/templates/home.php b/app/templates/home.php index 1ac6800..5398a0e 100644 --- a/app/templates/home.php +++ b/app/templates/home.php @@ -1,23 +1,53 @@ getTimestamp() : (string)$start; + return md5($channelId . '|' . $startKey . '|' . $title); +} + +function dashboardAddProgrammeIndex(array &$programmeIndex, string $id, string $channelId, array $channel, array $p): void { + $metadata = $p['metadata'] ?? []; + + $programmeIndex[$id] = [ + 'id' => $id, + 'channel_id' => $channelId, + 'channel' => $channel['name'] ?? $channelId, + 'channel_number' => $channel['number'] ?? 999999, + 'favorite' => $channel['favorite'] ?? false, + 'title' => $p['title'] ?? '', + 'subtitle' => $p['subtitle'] ?? '', + 'description' => $p['desc'] ?? $p['description'] ?? '', + 'category' => $p['category'] ?? '', + 'metadata' => $metadata, + 'year' => $metadata['year'] ?? '', + 'rating' => $metadata['age_rating'] ?? '', + 'country' => $metadata['country'] ?? '', + 'start' => $p['start'] instanceof DateTimeInterface ? $p['start']->format('H:i') : date('H:i', (int)($p['start'] ?? 0)), + 'stop' => $p['stop'] instanceof DateTimeInterface ? $p['stop']->format('H:i') : date('H:i', (int)($p['stop'] ?? 0)), + ]; +} foreach ($programmes as $channelId => $items) { $channel = $channels[$channelId] ?? null; - - if (!$channel) { - continue; - } + if (!$channel) continue; foreach ($items as $p) { $start = $p['start']; - $stop = $p['stop']; + if (!$start instanceof DateTimeInterface) continue; if ($start >= $now && $start <= $now->modify('+30 minutes')) { + $id = dashboardProgrammeId($channelId, $start, $p['title'] ?? ''); + dashboardAddProgrammeIndex($programmeIndex, $id, $channelId, $channel, $p); + $upcoming[] = [ + 'id' => $id, 'channel_id' => $channelId, 'channel' => $channel, 'programme' => $p, @@ -27,7 +57,11 @@ foreach ($programmes as $channelId => $items) { if ($start->format('Y-m-d') === $now->format('Y-m-d') && $start->format('H:i') >= '20:00' && $start->format('H:i') <= '23:00') { + $id = dashboardProgrammeId($channelId, $start, $p['title'] ?? ''); + dashboardAddProgrammeIndex($programmeIndex, $id, $channelId, $channel, $p); + $primetime[] = [ + 'id' => $id, 'channel_id' => $channelId, 'channel' => $channel, 'programme' => $p, @@ -36,13 +70,32 @@ foreach ($programmes as $channelId => $items) { } } +foreach ($currentProgrammes as $item) { + $id = dashboardProgrammeId($item['channel_id'], $item['start'], $item['title'] ?? ''); + + $programmeIndex[$id] = [ + 'id' => $id, + 'channel_id' => $item['channel_id'], + 'channel' => $item['channel_name'], + 'channel_number' => $item['channel_number'], + 'favorite' => $item['favorite'], + 'title' => $item['title'], + 'subtitle' => $item['subtitle'], + 'description' => $item['description'], + 'category' => $item['category'], + 'metadata' => $item['metadata'] ?? [], + 'year' => $item['year'] ?? '', + 'rating' => $item['rating'] ?? '', + 'country' => $item['country'] ?? '', + 'start' => date('H:i', $item['start']), + 'stop' => date('H:i', $item['stop']), + ]; +} + usort($upcoming, fn($a, $b) => $a['programme']['start'] <=> $b['programme']['start']); usort($primetime, fn($a, $b) => $a['programme']['start'] <=> $b['programme']['start']); -$favoritesNow = array_values(array_filter( - $currentProgrammes, - fn($item) => !empty($item['favorite']) -)); +$favoritesNow = array_values(array_filter($currentProgrammes, fn($item) => !empty($item['favorite']))); ?>
@@ -57,29 +110,33 @@ $favoritesNow = array_values(array_filter(

đŸ”„ Jetzt lĂ€uft

- - - -
+
+ + +
-
- +
+
+
+ + +

⏰ Beginnt gleich

- - - -
+
+ +
-
- + + +
In den nÀchsten 30 Minuten beginnt keine Sendung.
@@ -89,15 +146,19 @@ $favoritesNow = array_values(array_filter(

⭐ Favoriten jetzt

- - - -
+
+ + +
-
- +
+
+
+ + +
Aktuell lÀuft auf deinen Favoriten nichts.
@@ -107,18 +168,44 @@ $favoritesNow = array_values(array_filter(

đŸ“ș Heute Abend

- - - -
+
+ +
-
- + + +
FĂŒr heute Abend wurden keine Sendungen gefunden.
+ + + +