From e61c4ec0773e74df08ba26e9ba376fb8c1d8d174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christopher=20M=C3=BChl?= Date: Thu, 26 Feb 2026 16:22:19 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20all=20route=20pages=20=E2=80=94=20dashb?= =?UTF-8?q?oard,=20scan,=20items,=20locations,=20labels,=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dashboard with stats grid, checked-out/low-stock/recent items - Scan route with check-in/out flow - Items list with search, filters (category/type/custody), sorting - Item detail with full metadata, check-in/out, edit, delete - New item form wired to inventory store - Locations browser with tree view and items-at-location - Labels page with batch generation and PDF download - Settings page with DB stats - Fixed Svelte 5 event modifier syntax (no pipe modifiers) Co-Authored-By: Claude Opus 4.6 --- src/lib/components/ItemForm.svelte | 2 +- src/lib/components/LocationTree.svelte | 2 +- src/routes/+layout.svelte | 18 +- src/routes/+page.svelte | 86 ++++++++- src/routes/items/+page.svelte | 142 ++++++++++++++- src/routes/items/[id]/+page.svelte | 239 ++++++++++++++++++++++++- src/routes/items/new/+page.svelte | 45 ++++- src/routes/labels/+page.svelte | 133 +++++++++++++- src/routes/locations/+page.svelte | 53 +++++- src/routes/scan/+page.svelte | 191 +++++++++++++++++++- src/routes/settings/+page.svelte | 41 ++++- 11 files changed, 924 insertions(+), 28 deletions(-) diff --git a/src/lib/components/ItemForm.svelte b/src/lib/components/ItemForm.svelte index b346d03..fa96e57 100644 --- a/src/lib/components/ItemForm.svelte +++ b/src/lib/components/ItemForm.svelte @@ -73,7 +73,7 @@ } -
+ { e.preventDefault(); handleSubmit(); }} class="space-y-4 p-4">
diff --git a/src/lib/components/LocationTree.svelte b/src/lib/components/LocationTree.svelte index 8b3fe99..d88866d 100644 --- a/src/lib/components/LocationTree.svelte +++ b/src/lib/components/LocationTree.svelte @@ -55,7 +55,7 @@ {#if hasChildren(location.id)} + +
+ + {:else} + + {/if} + {:else} +
+

Check In

+
+ + +
+ +
+ {/if} + + +
+ + {#if !confirmDelete} + + {:else} + + {/if} +
+ + +
+

{item.barcodeUri}

+
+ +{/if} diff --git a/src/routes/items/new/+page.svelte b/src/routes/items/new/+page.svelte index 9764867..26da338 100644 --- a/src/routes/items/new/+page.svelte +++ b/src/routes/items/new/+page.svelte @@ -1,7 +1,50 @@

New Item

-

Add a new item to your inventory.

+ goto('/items')} />
diff --git a/src/routes/labels/+page.svelte b/src/routes/labels/+page.svelte index aef585f..e0752c6 100644 --- a/src/routes/labels/+page.svelte +++ b/src/routes/labels/+page.svelte @@ -1,7 +1,134 @@ -
-

Labels

-

Generate and print barcode label sheets.

+
+

Labels

+ + {#if error} +
+ {error} +
+ {/if} + + +
+
+
{unassigned.length}
+
Available IDs
+
+
+
{inventory.items.length}
+
Assigned Items
+
+
+ + +
+

Generate ID Batch

+

+ Pre-generate IDs for label printing. IDs can be assigned to items later when scanned. +

+
+
+ + +
+ +
+
+ + +
+

Print Label Sheet

+

+ Generate a PDF with QR code stickers for all unassigned IDs ({unassigned.length} labels). +

+ +
+ + + {#if unassigned.length > 0} +
+

Unassigned IDs

+
+ {#each unassigned as entry} + {entry.id} + {/each} +
+
+ {/if}
diff --git a/src/routes/locations/+page.svelte b/src/routes/locations/+page.svelte index 2f60ed3..d00662f 100644 --- a/src/routes/locations/+page.svelte +++ b/src/routes/locations/+page.svelte @@ -1,7 +1,54 @@ -
-

Places

-

Manage your locations and rooms.

+
+

Places

+ +
+ +
+ +
+ + + {#if selectedLocation} +
+
+

{selectedLocation.name}

+ {itemsAtLocation.length} items +
+ + {#if selectedLocation.description} +

{selectedLocation.description}

+ {/if} + +
+ {#each itemsAtLocation as item} + goto(`/items/${item.shortId}`)} /> + {:else} +

No items here

+ {/each} +
+
+ {:else} +
+ Select a location to view items +
+ {/if} +
diff --git a/src/routes/scan/+page.svelte b/src/routes/scan/+page.svelte index 90f3016..ed84c99 100644 --- a/src/routes/scan/+page.svelte +++ b/src/routes/scan/+page.svelte @@ -1,7 +1,192 @@ -
-

Scan

-

Scan a barcode to look up or check in/out an item.

+
+

Scan

+ + {#if !scannedItem} + + + {#if scanError} +
+

{scanError}

+ + Create New Item + +
+ {/if} + {:else} + +
+ goto(`/items/${scannedItem!.shortId}`)} /> + + {#if scannedItem.custodyState === 'checked-in'} + + {#if !showCheckOut} +
+ + +
+ {:else} +
+

Check Out

+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ {/if} + {:else} + +
+

Check In

+

+ Currently {scannedItem.checkedOutReason ?? 'out'} + {#if scannedItem.checkedOutFrom} + from {inventory.locations.find((l) => l.id === scannedItem!.checkedOutFrom)?.name ?? scannedItem.checkedOutFrom} + {/if} +

+ +
+ + +
+ +
+ + +
+
+ {/if} +
+ {/if}
diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte index 51a0e87..a3033ab 100644 --- a/src/routes/settings/+page.svelte +++ b/src/routes/settings/+page.svelte @@ -1,7 +1,42 @@ -
-

Settings

-

App configuration and sync settings.

+
+

Settings

+ + +
+

Database

+
+ Items + {itemCount} +
+
+ Locations + {locationCount} +
+
+ + +
+

Sync

+

+ Automerge CRDT sync and Solid Pod integration will be available in a future update. +

+
+ + +
+

About

+

+ SolidHaus v0.1.0 — Local-first household inventory +

+

+ Data is stored locally in IndexedDB. No data leaves your device. +

+