diff --git a/apps/mana/apps/web/src/lib/modules/cycles/ListView.svelte b/apps/mana/apps/web/src/lib/modules/cycles/ListView.svelte index 1771afbaf..7d6ec38d8 100644 --- a/apps/mana/apps/web/src/lib/modules/cycles/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/cycles/ListView.svelte @@ -9,7 +9,6 @@ useAllDayLogs, useAllSymptoms, useCurrentCycle, - useDayLog, } from './queries'; import { cyclesStore } from './stores/cycles.svelte'; import { dayLogsStore } from './stores/dayLogs.svelte'; @@ -41,13 +40,11 @@ let logs$ = useAllDayLogs(); let symptoms$ = useAllSymptoms(); let current$ = useCurrentCycle(); - let todayLog$ = useDayLog(todayIso); let cycles = $derived(cycles$.value); let logs = $derived(logs$.value); let symptoms = $derived(symptoms$.value); let currentCycle = $derived(current$.value); - let todayLog = $derived(todayLog$.value); let phase = $derived(derivePhase(todayIso, cycles)); let cycleDay = $derived(currentCycle ? getCycleDayNumber(todayIso, currentCycle) : null); @@ -59,49 +56,77 @@ const FLOWS: Flow[] = ['none', 'spotting', 'light', 'medium', 'heavy']; const MOODS: Mood[] = ['great', 'good', 'neutral', 'low', 'bad']; - let selectedFlow = $derived(todayLog?.flow ?? 'none'); - let selectedMood = $derived(todayLog?.mood ?? null); - let selectedSymptoms = $derived(todayLog?.symptoms ?? []); + // ─ Editing state — defaults to today, can be switched to any past day + let editingDate = $state(todayIso); + let editingLog = $derived(logs.find((l) => l.logDate === editingDate) ?? null); + let isEditingPast = $derived(editingDate !== todayIso); + + let selectedFlow = $derived(editingLog?.flow ?? 'none'); + let selectedMood = $derived(editingLog?.mood ?? null); + let selectedSymptoms = $derived(editingLog?.symptoms ?? []); let temperature = $state(''); let notesText = $state(''); + // Reset temperature/notes inputs when switching the editing target $effect(() => { - if (todayLog) { - temperature = todayLog.temperature?.toString() ?? ''; - notesText = todayLog.notes ?? ''; - } + // Tracking editingDate so the effect re-runs whenever the target switches + void editingDate; + temperature = editingLog?.temperature?.toString() ?? ''; + notesText = editingLog?.notes ?? ''; }); + function selectDay(date: string) { + editingDate = date; + } + + function backToToday() { + editingDate = todayIso; + } + async function setFlow(flow: Flow) { - await dayLogsStore.logDay({ logDate: todayIso, flow }); + await dayLogsStore.logDay({ logDate: editingDate, flow }); } async function setMood(mood: Mood) { const next = selectedMood === mood ? null : mood; - await dayLogsStore.logDay({ logDate: todayIso, mood: next }); + await dayLogsStore.logDay({ logDate: editingDate, mood: next }); } async function toggleSymptom(id: string) { const has = selectedSymptoms.includes(id); const next = has ? selectedSymptoms.filter((s) => s !== id) : [...selectedSymptoms, id]; - await dayLogsStore.logDay({ logDate: todayIso, symptoms: next }); + await dayLogsStore.logDay({ logDate: editingDate, symptoms: next }); } async function saveTemperature() { const num = parseFloat(temperature); await dayLogsStore.logDay({ - logDate: todayIso, + logDate: editingDate, temperature: Number.isFinite(num) ? num : null, }); } async function saveNotes() { - await dayLogsStore.logDay({ logDate: todayIso, notes: notesText.trim() || null }); + await dayLogsStore.logDay({ logDate: editingDate, notes: notesText.trim() || null }); + } + + async function deleteEditingLog() { + if (!editingLog) { + backToToday(); + return; + } + const ok = confirm( + `Tageseintrag vom ${new Date(editingDate).toLocaleDateString('de-DE')} wirklich löschen?` + ); + if (!ok) return; + await dayLogsStore.deleteLog(editingLog.id); + backToToday(); } async function startPeriodToday() { await cyclesStore.createCycle({ startDate: todayIso }); await dayLogsStore.logDay({ logDate: todayIso, flow: 'medium' }); + backToToday(); } async function endPeriodToday() { @@ -153,9 +178,24 @@ - + + {#if isEditingPast} +
+ {/if} + +