diff --git a/k8s/family/duckdb-backend.yaml b/k8s/family/duckdb-backend.yaml index 9a19cc3..3113180 100644 --- a/k8s/family/duckdb-backend.yaml +++ b/k8s/family/duckdb-backend.yaml @@ -54,7 +54,10 @@ spec: else git fetch origin main fi - git pull --rebase --autostash origin main || true + git rebase --abort 2>/dev/null || true + git merge --abort 2>/dev/null || true + git reset --hard origin/main + git clean -fd fi env: - name: GIT_SYNC_USERNAME diff --git a/projects/duckdb-backend/app/engine.py b/projects/duckdb-backend/app/engine.py index f6ac132..1e26478 100644 --- a/projects/duckdb-backend/app/engine.py +++ b/projects/duckdb-backend/app/engine.py @@ -974,16 +974,24 @@ class DuckDBEngine: "last_wake_iso": last_wake_iso, "last_feed_iso": last_feed_iso, "last_feed_time_str": last_feed_time_str, + "last_feed_time": last_feed_time_str, "last_feed_since_str": last_feed_since_str, "last_feed_since_minutes": last_feed_since_minutes, + "last_feed_elapsed_minutes": last_feed_since_minutes, "last_feed_summary": last_feed_summary, + "last_feed_item": (last_feed[5] or ("Fläschchen" if last_feed[6] == "feeding.bottle" else "Mahlzeit")) if last_feed else None, + "last_feed_amount": (last_feed[3] or last_feed[4]) if last_feed else None, "last_diaper_iso": last_diaper_iso, "last_diaper_time_str": last_diaper_time_str, + "last_diaper_time": last_diaper_time_str, "last_diaper_since_str": last_diaper_since_str, "last_diaper_since_minutes": last_diaper_since_minutes, + "last_diaper_elapsed_minutes": last_diaper_since_minutes, "last_diaper_type": last_diaper_type, "last_stool_iso": last_stool_iso, "last_stool_str": last_stool_str, + "last_stool_time": st_dt.strftime("%H:%M") if last_stool else None, + "last_stool_elapsed_minutes": st_mins if last_stool else None, }, "today": { "total_sleep_hours_str": today_tot_hours, diff --git a/projects/mila/src/App.vue b/projects/mila/src/App.vue index 1e2c45c..64800c3 100644 --- a/projects/mila/src/App.vue +++ b/projects/mila/src/App.vue @@ -200,10 +200,30 @@ const wakeWindowStatus = computed(() => { } }) +// Whether any diaper or poo was recorded today +const hasDiaperToday = computed(() => { + if (!data.value) return false + const diapersCount = data.value.today?.diapers?.length || 0 + const changesCount = data.value.today?.diaper_summary?.total_changes || 0 + return diapersCount > 0 || changesCount > 0 +}) + // Feed Interval status const feedIntervalStatus = computed(() => { if (!data.value) return null - const elapsed = data.value.live_status.last_feed_elapsed_minutes + const ls = data.value.live_status + + // Calculate dynamic live elapsed if iso is available + let elapsed = ls.last_feed_since_minutes ?? (ls as any).last_feed_elapsed_minutes + if (ls.last_feed_iso) { + try { + const feedTime = new Date(ls.last_feed_iso).getTime() + if (!isNaN(feedTime)) { + elapsed = Math.max(0, Math.floor((nowEpoch.value - feedTime) / 60000)) + } + } catch {} + } + if (elapsed === null || elapsed === undefined) { return { text: 'Keine Mahlzeit', elapsedStr: '—', isDue: false } } @@ -216,11 +236,27 @@ const feedIntervalStatus = computed(() => { } }) +// Last Feed detail information +const lastFeedDetail = computed(() => { + if (!data.value?.live_status) return null + const ls = data.value.live_status + const time = ls.last_feed_time_str || (ls as any).last_feed_time + if (!time) return null + const summary = ls.last_feed_summary || ( + ((ls as any).last_feed_amount ? `${(ls as any).last_feed_amount} ` : '') + ((ls as any).last_feed_item || 'Fläschchen') + ) + return { + time, + summary, + } +}) + // Diaper / Stool status const diaperStatus = computed(() => { if (!data.value) return null - const elapsed = data.value.live_status.last_diaper_elapsed_minutes - const elapsedStool = data.value.live_status.last_stool_elapsed_minutes + const ls = data.value.live_status + const elapsed = ls.last_diaper_since_minutes ?? (ls as any).last_diaper_elapsed_minutes + const elapsedStool = (ls as any).last_stool_elapsed_minutes const formatElapsed = (mins: number | null | undefined) => { if (mins === null || mins === undefined) return null @@ -348,7 +384,7 @@ const currentAgeMonths = computed(() => { Eltern-Cockpit: Sofort-Überblick -
+
{ {{ feedIntervalStatus ? `vor ${feedIntervalStatus.elapsedStr}` : '—' }}
- - {{ data.live_status.last_feed_amount ? data.live_status.last_feed_amount + ' ' : '' }}{{ data.live_status.last_feed_item || 'Fläschchen' }} um {{ data.live_status.last_feed_time }} Uhr + + {{ lastFeedDetail.summary }} um {{ lastFeedDetail.time }} Uhr Heute noch keine Nahrung
@@ -430,8 +466,8 @@ const currentAgeMonths = computed(() => {
- -
+ +
diff --git a/projects/mila/src/types.ts b/projects/mila/src/types.ts index 11ce58b..76e6a60 100644 --- a/projects/mila/src/types.ts +++ b/projects/mila/src/types.ts @@ -110,14 +110,26 @@ export interface MilaDashboardData { wake_window_str: string last_wake_time_str: string last_wake_iso: string - last_feed_time: string | null - last_feed_elapsed_minutes: number | null - last_feed_item: string | null - last_feed_amount: number | null - last_diaper_time: string | null - last_diaper_elapsed_minutes: number | null - last_stool_time: string | null - last_stool_elapsed_minutes: number | null + last_feed_iso?: string | null + last_feed_time_str?: string | null + last_feed_time?: string | null + last_feed_since_str?: string | null + last_feed_since_minutes?: number | null + last_feed_elapsed_minutes?: number | null + last_feed_summary?: string | null + last_feed_item?: string | null + last_feed_amount?: number | null + last_diaper_iso?: string | null + last_diaper_time_str?: string | null + last_diaper_time?: string | null + last_diaper_since_str?: string | null + last_diaper_since_minutes?: number | null + last_diaper_elapsed_minutes?: number | null + last_diaper_type?: string | null + last_stool_iso?: string | null + last_stool_str?: string | null + last_stool_time?: string | null + last_stool_elapsed_minutes?: number | null } age_norms?: AgeNorms today: {