feat(admin): Formulare fuer Gutscheine, Versand, Benutzer, Ernten und Chargen vereinheitlicht

Alle Anlege- und Bearbeiten-Formulare nutzen jetzt die Bausteine aus
components/admin-form.tsx wie das Produktformular: Rahmen mit fester
Speicherleiste, Abschnitte mit Serif-Ueberschrift (Gutschein: Code und
Rabatt / Bedingungen / Zeitraum und Status; Ernte: Angaben / Bilder /
Sichtbarkeit; Charge: Abfuellung und Bestand / Bilder), Schalter statt
Checkbox, buendige Eingabefelder in Rastern.

Benutzer bearbeiten: Sicherheitsbereich mit Status-Badges, Passwort-Reset
als Sekundaerknopf, Sperren/Loeschen in eigenem abgesetzten Bereich.
AdminField/AdminSelect koennen jetzt min und einen Hinweistext.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-09-25 21:14:10 +02:00
1 parent a09057d960
commit b7a75dddca
12 files changed
+364 -524

No files matched your search

+10
View File
@@ -13,6 +13,8 @@ export function AdminField({
defaultValue,
placeholder,
required = false,
min,
hint,
}: {
name: string;
label: string;
@@ -20,6 +22,9 @@ export function AdminField({
defaultValue?: string;
placeholder?: string;
required?: boolean;
min?: number;
/** Kurzer Zusatz unter dem Feld, statt ihn in die Beschriftung zu packen. */
hint?: string;
}) {
return (
<label className="block text-sm">
@@ -30,8 +35,10 @@ export function AdminField({
defaultValue={defaultValue}
placeholder={placeholder}
required={required}
min={min}
className={inputClass}
/>
{hint ? <span className="mt-1 block text-xs text-ink/65">{hint}</span> : null}
</label>
);
}
@@ -61,11 +68,13 @@ export function AdminSelect({
name,
label,
defaultValue,
hint,
children,
}: {
name: string;
label: string;
defaultValue?: string;
hint?: string;
children: ReactNode;
}) {
return (
@@ -74,6 +83,7 @@ export function AdminSelect({
<select name={name} defaultValue={defaultValue} className={inputClass}>
{children}
</select>
{hint ? <span className="mt-1 block text-xs text-ink/65">{hint}</span> : null}
</label>
);
}