feat(#447): permission-gated reader dashboard #477

Merged
marcel merged 25 commits from worktree-feat+issue-447-reader-dashboard into main 2026-05-08 15:56:54 +02:00
Showing only changes of commit 5fd4c6425c - Show all commits

View File

@@ -5,6 +5,11 @@ import MissionControlStrip from '$lib/document/MissionControlStrip.svelte';
import DashboardFamilyPulse from '$lib/shared/dashboard/DashboardFamilyPulse.svelte'; import DashboardFamilyPulse from '$lib/shared/dashboard/DashboardFamilyPulse.svelte';
import DashboardActivityFeed from '$lib/activity/DashboardActivityFeed.svelte'; import DashboardActivityFeed from '$lib/activity/DashboardActivityFeed.svelte';
import EnrichmentBlock from '$lib/document/EnrichmentBlock.svelte'; import EnrichmentBlock from '$lib/document/EnrichmentBlock.svelte';
import ReaderStatsStrip from '$lib/shared/dashboard/ReaderStatsStrip.svelte';
import ReaderPersonChips from '$lib/shared/dashboard/ReaderPersonChips.svelte';
import ReaderDraftsModule from '$lib/shared/dashboard/ReaderDraftsModule.svelte';
import ReaderRecentDocs from '$lib/shared/dashboard/ReaderRecentDocs.svelte';
import ReaderRecentStories from '$lib/shared/dashboard/ReaderRecentStories.svelte';
import { m } from '$lib/paraglide/messages.js'; import { m } from '$lib/paraglide/messages.js';
let { data } = $props(); let { data } = $props();
@@ -31,6 +36,30 @@ const greetingText = $derived.by(() => {
</div> </div>
{/if} {/if}
{#if data.isReader}
<div class="flex flex-col gap-5">
<ReaderStatsStrip
documents={data.readerStats?.totalDocuments ?? null}
persons={data.readerStats?.totalPersons ?? null}
stories={null}
/>
{#if data.canBlogWrite}
<ReaderDraftsModule drafts={data.drafts ?? []} />
{/if}
<ReaderPersonChips persons={data.topPersons ?? []} />
<div class="flex flex-col gap-5 md:flex-row">
<div class="flex-[3]">
<ReaderRecentDocs documents={data.recentDocs ?? []} />
</div>
<div class="flex-[2]">
<ReaderRecentStories stories={data.recentStories ?? []} />
</div>
</div>
</div>
{:else}
<div class="grid grid-cols-1 gap-5 lg:grid-cols-[1fr_320px] lg:items-start"> <div class="grid grid-cols-1 gap-5 lg:grid-cols-[1fr_320px] lg:items-start">
<div class="flex flex-col gap-5"> <div class="flex flex-col gap-5">
<DashboardResumeStrip resumeDoc={data.resumeDoc ?? null} /> <DashboardResumeStrip resumeDoc={data.resumeDoc ?? null} />
@@ -63,4 +92,5 @@ const greetingText = $derived.by(() => {
{/if} {/if}
</div> </div>
</div> </div>
{/if}
</main> </main>