From c125e91941752b1dee4798c0e1f7727fd1ab6aa7 Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Fri, 25 Sep 2026 20:41:59 +0200 Subject: [PATCH] feat(admin): Produkt anlegen gegliedert wie Produkt bearbeiten Gemeinsame Formularbausteine in components/admin-form.tsx (Feld, Auswahl, Abschnitt, Schalter, Formularrahmen mit fester Speicherleiste). Das Anlegen-Formular nutzt dieselben Abschnitte wie das Bearbeiten und blendet Ernte/Charge sowie Geschmack per :has() aus, sobald keine Honig-Kategorie gewaehlt ist. Eingabefelder in Rastern stehen buendig, auch wenn Beschriftungen mobil umbrechen. Co-Authored-By: Claude Opus 5.5 (1M context) --- src/app/admin/produkte/[id]/page.tsx | 218 +++++++++----------------- src/app/admin/produkte/neu/page.tsx | 221 +++++++++++---------------- src/components/admin-form.tsx | 148 ++++++++++++++++++ src/i18n/dictionaries/de.ts | 5 + src/i18n/dictionaries/en.ts | 5 + src/i18n/dictionary-type.ts | 5 + 6 files changed, 324 insertions(+), 278 deletions(-) create mode 100644 src/components/admin-form.tsx diff --git a/src/app/admin/produkte/[id]/page.tsx b/src/app/admin/produkte/[id]/page.tsx index 083afd1..6c8386e 100644 --- a/src/app/admin/produkte/[id]/page.tsx +++ b/src/app/admin/produkte/[id]/page.tsx @@ -4,12 +4,21 @@ import { prisma } from "@/lib/prisma"; import { asStringArray } from "@/lib/json-array"; import { BackLink } from "@/components/back-link"; import { AdminImageListField } from "@/components/admin-image-list-field"; +import { + AdminField, + AdminFieldset, + AdminFormPanel, + AdminHint, + AdminSwitch, + AdminTextarea, +} from "@/components/admin-form"; import { updateProductAction } from "../../actions"; import { getLocale } from "@/i18n/locale"; import { getDictionary } from "@/i18n/get-dictionary"; export default async function AdminProductEditPage(props: PageProps<"/admin/produkte/[id]">) { const t = getDictionary(await getLocale()); + const te = t.adminProductEditPage; const { id } = await props.params; const rawProduct = await prisma.product.findUnique({ where: { id }, @@ -24,173 +33,98 @@ export default async function AdminProductEditPage(props: PageProps<"/admin/prod return (
- -

{t.adminProductEditPage.title}

+ +

{te.title}

{t.common.categories[product.category]} {product.harvest && product.batch - ? t.adminProductEditPage.harvestBatchSuffix( - product.harvest.type, - product.harvest.year, - product.batch.code - ) + ? te.harvestBatchSuffix(product.harvest.type, product.harvest.year, product.batch.code) : null}

-
+ {te.save}}> -
- {t.adminProductEditPage.sectionText} - - -