feat(frontend): Bienenstaende-Views (Modul 2)

/apiaries: Liste mit Status-Badge; /apiaries/new: Anlegen-Formular;
/apiaries/[id]: Bearbeiten (Name/Standort/Adresse/Notizen) + Deaktivieren.
Editierbares Formular liest den Ausgangszustand direkt aus der geladenen
Apiary (kein useEffect+setState-Sync, React-Key-Reset-Pattern statt
Effect - vermeidet kaskadierende Renders).

(app)/layout.tsx: einfache Nav-Leiste (Bienenstände fuer alle, Benutzer
nur fuer Admins) - Platzhalter bis zur echten Bottom-Nav/Sidebar aus
Modul 15. proxy.ts-Matcher um /apiaries/* erweitert.

Live im Browser gefunden+behoben: Base-UI-Button meldete fehlende
native Button-Semantik beim Rendern als Link (`nativeButton={false}`
noetig, wenn Button auf ein <a> zeigt).

8 Vitest-Tests, Lint, Typecheck und Build gruen. Kompletter Flow
(Anlegen, Liste, Bearbeiten, Deaktivieren, Navigation) live verifiziert.
This commit is contained in:
Nick Szaunig committed 2026-08-21 08:59:18 +02:00
1 parent 5c92c810e1
commit d59153a697
10 files changed
+428 -3

No files matched your search

+15 -1
View File
@@ -1,6 +1,7 @@
"use client";
import { ReactNode, useEffect } from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useAuth } from "@/lib/auth/auth-context";
import { Button } from "@/components/ui/button";
@@ -22,7 +23,20 @@ export default function AppLayout({ children }: { children: ReactNode }) {
return (
<div className="flex min-h-screen flex-col">
<header className="flex items-center justify-between border-b px-4 py-3">
<span className="font-semibold">ApiCore</span>
<nav className="flex items-center gap-4">
<span className="font-semibold">ApiCore</span>
<Link className="text-sm text-muted-foreground hover:text-foreground" href="/apiaries">
Bienenstände
</Link>
{user.role === "ADMIN" ? (
<Link
className="text-sm text-muted-foreground hover:text-foreground"
href="/settings/users"
>
Benutzer
</Link>
) : null}
</nav>
<div className="flex items-center gap-3 text-sm">
<span className="text-muted-foreground">{user.email}</span>
<Button