From 74291306305c9bba25e30bed12897d2fb0ad5d58 Mon Sep 17 00:00:00 2001 From: grabowski Date: Thu, 9 Apr 2026 16:07:27 +0700 Subject: [PATCH] Add open todo count badge to sidebar menu Shows number of non-done todos (todo + in_progress) next to the Todos nav item. Hides when count is zero. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/lib/components/layout/Sidebar.svelte | 3 ++- src/routes/(app)/+layout.server.ts | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index ae0988f..0120c7b 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -4,7 +4,7 @@ interface Props { open: boolean; onToggle: () => void; - counts: { devices: number; components: number; needsRepair: number }; + counts: { devices: number; components: number; needsRepair: number; openTodos: number }; } let { open, onToggle, counts }: Props = $props(); @@ -40,6 +40,7 @@ { href: '/todos', label: 'Todos', + badge: counts.openTodos || undefined, icon: 'M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z' }, { diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts index f731ddc..0d50e90 100644 --- a/src/routes/(app)/+layout.server.ts +++ b/src/routes/(app)/+layout.server.ts @@ -1,8 +1,8 @@ import type { LayoutServerLoad } from './$types'; import { redirect } from '@sveltejs/kit'; import { db } from '$lib/server/db/index.js'; -import { devices, components, componentInstances } from '$lib/server/db/schema.js'; -import { count, eq, or, and } from 'drizzle-orm'; +import { devices, components, componentInstances, todos } from '$lib/server/db/schema.js'; +import { count, eq, or, and, ne } from 'drizzle-orm'; export const load: LayoutServerLoad = async ({ locals }) => { if (!locals.user) { @@ -20,12 +20,18 @@ export const load: LayoutServerLoad = async ({ locals }) => { .from(devices) .where(and(eq(devices.disabled, false), or(eq(devices.condition, 'In Repair'), eq(devices.condition, 'Waiting for Repair')))); + const [openTodos] = await db + .select({ value: count() }) + .from(todos) + .where(ne(todos.status, 'done')); + return { user: locals.user, counts: { devices: deviceCount?.value ?? 0, components: componentCount?.value ?? 0, - needsRepair: repairCount?.value ?? 0 + needsRepair: repairCount?.value ?? 0, + openTodos: openTodos?.value ?? 0 } }; };