154 lines
4.6 KiB
Svelte
154 lines
4.6 KiB
Svelte
<script lang="ts">
|
|
import { resolve } from '$app/paths';
|
|
import { untrack } from 'svelte';
|
|
import AppIcon from '#lib/components/AppIcon.svelte';
|
|
import PostNavigation from '#lib/components/PostNavigation.svelte';
|
|
import type { PageProps } from './$types';
|
|
|
|
let { data }: PageProps = $props();
|
|
let selectedId = $state(untrack(() => data.shows[0]?.showId ?? ''));
|
|
let selected = $derived(
|
|
data.shows.find((show) => show.showId === selectedId) ?? data.shows[0] ?? null
|
|
);
|
|
|
|
function date(value: string | null) {
|
|
if (!value) return 'Datum nicht verfügbar';
|
|
return new Intl.DateTimeFormat('de-DE', {
|
|
timeZone: 'Europe/Berlin',
|
|
dateStyle: 'long'
|
|
}).format(new Date(value));
|
|
}
|
|
</script>
|
|
|
|
<svelte:head><title>Postproduktion | Sendewerk</title></svelte:head>
|
|
|
|
<div class="unified-workspace post-library-workspace">
|
|
<PostNavigation
|
|
query={data.query}
|
|
progress={data.progress}
|
|
sort={data.sort}
|
|
counts={data.counts}
|
|
/>
|
|
<section class="post-show-library workspace-content-pane" aria-labelledby="post-shows-title">
|
|
<header class="page-heading shows-heading post-page-heading">
|
|
<div>
|
|
<h1>Postproduktion</h1>
|
|
<p class="page-intro">YouTube, Social-Clips und Twitch-Highlights vorbereiten.</p>
|
|
</div>
|
|
</header>
|
|
<div class="post-library-content">
|
|
<div class="post-library-heading">
|
|
<div>
|
|
<p class="eyebrow">Abgeschlossene Streams</p>
|
|
<h2 id="post-shows-title">Streams</h2>
|
|
</div>
|
|
<span>{data.shows.length}</span>
|
|
</div>
|
|
{#if data.shows.length}
|
|
<div class="post-show-list">
|
|
{#each data.shows as show (show.showId)}
|
|
<a class="post-show-row" href={resolve('/post/[id]', { id: show.showId })}>
|
|
<div class="post-show-primary">
|
|
<span class="post-progress">{show.progress}</span>
|
|
<h3>{show.title}</h3>
|
|
<p>{date(show.startsAtUtc ?? show.completedAtUtc)}</p>
|
|
</div>
|
|
<dl class="post-show-counts">
|
|
<div>
|
|
<dt>Teile</dt>
|
|
<dd>{show.recordingPartCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Kontext</dt>
|
|
<dd>{show.sourceCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>YouTube</dt>
|
|
<dd>{show.youtubeCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Clips</dt>
|
|
<dd>{show.clipCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Highlights</dt>
|
|
<dd>{show.highlightCount}</dd>
|
|
</div>
|
|
</dl>
|
|
<AppIcon name="chevron-right" />
|
|
</a>
|
|
{/each}
|
|
</div>
|
|
{:else}
|
|
<div class="empty-state compact">
|
|
<h2>Keine abgeschlossene Sendung gefunden</h2>
|
|
<p>Postproduktion beginnt mit einer in Live bewusst abgeschlossenen Sendung.</p>
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
</section>
|
|
<aside
|
|
class="content-quick-inspector stream-inspector builder-pane"
|
|
aria-label="Post-Schnellübersicht"
|
|
>
|
|
{#if selected}<header class="stream-inspector-header">
|
|
<div>
|
|
<p class="eyebrow">Schnellübersicht</p>
|
|
<a
|
|
class="inspector-expand-button"
|
|
href={resolve('/post/[id]', { id: selected.showId })}
|
|
aria-label="Postproduktion vollständig öffnen"
|
|
title="Vollständig bearbeiten"><AppIcon name="expand" /></a
|
|
>
|
|
</div>
|
|
<h2>{selected.title}</h2>
|
|
<p>Material, Texte, Schnitt und Veröffentlichung.</p>
|
|
</header>
|
|
<div class="content-quick-inspector-scroll stream-inspector-form post-overview-inspector">
|
|
<section>
|
|
<span class="post-progress">{selected.progress}</span>
|
|
<p>{date(selected.startsAtUtc ?? selected.completedAtUtc)}</p>
|
|
</section>
|
|
<dl class="quick-fact-list">
|
|
<div>
|
|
<dt>Aufzeichnungsteile</dt>
|
|
<dd>{selected.recordingPartCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Kontextdateien</dt>
|
|
<dd>{selected.sourceCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>YouTube-Videos</dt>
|
|
<dd>{selected.youtubeCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Social-Clips</dt>
|
|
<dd>{selected.clipCount}</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Twitch-Highlights</dt>
|
|
<dd>{selected.highlightCount}</dd>
|
|
</div>
|
|
</dl>
|
|
<section class="workspace-guidance">
|
|
<h3>Vollständige Bearbeitung</h3>
|
|
<p>
|
|
Material, Texte, Uploads, Schnittdaten und Exporte öffnen in der großen
|
|
Bearbeitungsfläche.
|
|
</p>
|
|
</section>
|
|
</div>
|
|
<footer class="stream-inspector-actions single-action">
|
|
<a class="primary-button" href={resolve('/post/[id]', { id: selected.showId })}
|
|
>Postproduktion öffnen</a
|
|
>
|
|
</footer>
|
|
{:else}<div class="content-inspector-empty">
|
|
<AppIcon name="clapperboard" />
|
|
<h2>Stream auswählen</h2>
|
|
<p>Bearbeitungsstand und Inhalte erscheinen hier.</p>
|
|
</div>{/if}
|
|
</aside>
|
|
</div>
|