diff --git a/apps/mana/apps/web/src/lib/modules/dreams/ListView.svelte b/apps/mana/apps/web/src/lib/modules/dreams/ListView.svelte index 0755d26cf..7e8318e29 100644 --- a/apps/mana/apps/web/src/lib/modules/dreams/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/dreams/ListView.svelte @@ -11,7 +11,7 @@ useAllDreams, } from './queries'; import { dreamsStore } from './stores/dreams.svelte'; - import { MOOD_COLORS, MOOD_LABELS, type Dream, type DreamMood } from './types'; + import { MOOD_COLORS, MOOD_LABELS, type Dream, type DreamMood, type SleepQuality } from './types'; import type { ViewProps } from '$lib/app-registry'; import { ContextMenu, type ContextMenuItem } from '@mana/shared-ui'; import { PencilSimple, PushPin, Trash } from '@mana/shared-icons'; @@ -21,6 +21,10 @@ let dreams$ = useAllDreams(); let dreams = $derived(dreams$.value); + type FilterMode = 'all' | 'lucid' | 'nightmare' | 'recurring'; + let filterMode = $state('all'); + let symbolFilter = $state(null); + let searchQuery = $state(''); let editingId = $state(null); let editTitle = $state(''); @@ -28,12 +32,36 @@ let editSymbols = $state(''); let editMood = $state(null); let editIsLucid = $state(false); + let editIsRecurring = $state(false); + let editDreamDate = $state(''); + let editBedtime = $state(''); + let editWakeTime = $state(''); + let editSleepQuality = $state(null); let newTitle = $state(''); - let filtered = $derived(searchDreams(dreams, searchQuery)); + let filteredByMode = $derived.by(() => { + switch (filterMode) { + case 'lucid': + return dreams.filter((d) => d.isLucid); + case 'nightmare': + return dreams.filter((d) => d.mood === 'albtraum'); + case 'recurring': + return dreams.filter((d) => d.isRecurring); + default: + return dreams; + } + }); + let filteredBySymbol = $derived( + symbolFilter ? filteredByMode.filter((d) => d.symbols?.includes(symbolFilter!)) : filteredByMode + ); + let filtered = $derived(searchDreams(filteredBySymbol, searchQuery)); let grouped = $derived(groupByMonth(filtered)); let insights = $derived(computeInsights(dreams)); + function selectSymbol(name: string) { + symbolFilter = symbolFilter === name ? null : name; + } + async function handleQuickCreate(e: KeyboardEvent) { if (e.key !== 'Enter' || !newTitle.trim()) return; e.preventDefault(); @@ -50,6 +78,11 @@ editSymbols = (dream.symbols ?? []).join(', '); editMood = dream.mood; editIsLucid = dream.isLucid; + editIsRecurring = dream.isRecurring; + editDreamDate = dream.dreamDate; + editBedtime = dream.bedtime ?? ''; + editWakeTime = dream.wakeTime ?? ''; + editSleepQuality = dream.sleepQuality; } async function saveEdit() { @@ -64,10 +97,19 @@ symbols, mood: editMood, isLucid: editIsLucid, + isRecurring: editIsRecurring, + dreamDate: editDreamDate || new Date().toISOString().slice(0, 10), + bedtime: editBedtime || null, + wakeTime: editWakeTime || null, + sleepQuality: editSleepQuality, }); editingId = null; } + function setSleepQuality(q: SleepQuality) { + editSleepQuality = editSleepQuality === q ? null : q; + } + async function handleDelete(id: string) { await dreamsStore.deleteDream(id); if (editingId === id) editingId = null; @@ -143,8 +185,51 @@ ✨ {insights.lucidCount} Klarträume {/if} {#each insights.topSymbols as sym} - {sym.name} · {sym.count} + {/each} + {#if symbolFilter} + + {/if} + + {/if} + + + {#if dreams.length > 0} +
+ + + +
{/if} @@ -206,10 +291,49 @@ {/each} -