From 5f6b756342c230e5959c1db867231f2333fb892f Mon Sep 17 00:00:00 2001 From: ginnoir Date: Mon, 1 Jun 2026 19:28:34 -0500 Subject: [PATCH] feat: garden containers crud (task 71) - add listContainers/getContainer/searchContainers queries - add createContainer/updateContainer/deleteContainer server actions with logActivity - add ContainerList, ContainerDetail, ContainerForm client components - add /garden, /garden/containers/[id], /garden/containers/new pages - register garden.container entity with share + search in manifest - add sprout icon to NavIcon registry - add garden e2e test spec --- src/app/garden/containers/[id]/page.tsx | 14 ++ src/app/garden/containers/new/page.tsx | 70 +++++++++ src/app/garden/page.tsx | 12 ++ src/components/nav-icon.tsx | 2 + .../garden/components/container-detail.tsx | 127 ++++++++++++++++ .../garden/components/container-form.tsx | 112 +++++++++++++++ .../garden/components/container-list.tsx | 65 +++++++++ src/modules/garden/manifest.tsx | 55 ++++++- src/modules/garden/server/actions.ts | 96 ++++++++++++- src/modules/garden/server/queries.ts | 136 +++++++++++++++++- src/modules/garden/server/share-queries.ts | 40 ++++++ tests/e2e/garden.spec.ts | 31 ++++ 12 files changed, 756 insertions(+), 4 deletions(-) create mode 100644 src/app/garden/containers/[id]/page.tsx create mode 100644 src/app/garden/containers/new/page.tsx create mode 100644 src/app/garden/page.tsx create mode 100644 src/modules/garden/components/container-detail.tsx create mode 100644 src/modules/garden/components/container-form.tsx create mode 100644 src/modules/garden/components/container-list.tsx create mode 100644 src/modules/garden/server/share-queries.ts create mode 100644 tests/e2e/garden.spec.ts diff --git a/src/app/garden/containers/[id]/page.tsx b/src/app/garden/containers/[id]/page.tsx new file mode 100644 index 0000000..b7c3edc --- /dev/null +++ b/src/app/garden/containers/[id]/page.tsx @@ -0,0 +1,14 @@ +import { notFound } from "next/navigation"; +import { getContainer } from "@/modules/garden/server/queries"; +import { ContainerDetail } from "@/modules/garden/components/container-detail"; + +export default async function ContainerPage({ params }: { params: Promise<{ id: string }> }) { + const { id } = await params; + const container = await getContainer(id); + if (!container) notFound(); + return ( +
+ +
+ ); +} diff --git a/src/app/garden/containers/new/page.tsx b/src/app/garden/containers/new/page.tsx new file mode 100644 index 0000000..c5ecfe3 --- /dev/null +++ b/src/app/garden/containers/new/page.tsx @@ -0,0 +1,70 @@ +import { redirect } from "next/navigation"; +import { createContainer } from "@/modules/garden/server/actions"; + +export default function NewContainerPage() { + async function handleCreate(formData: FormData) { + "use server"; + await createContainer({ + name: formData.get("name") as string, + type: (formData.get("type") as string) || "other", + locationNotes: (formData.get("locationNotes") as string) || null, + }); + redirect("/garden"); + } + + return ( +
+

New container

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