/** * Reine Leser fuer FormData-Werte — ohne Datenbank- oder Next.js-Bezug, * damit sie sich unabhaengig testen lassen (siehe * app/admin/actions/image-slots.test.ts). Die Admin-Actions importieren sie * weiterhin ueber admin/actions/_shared.ts, das sie re-exportiert. */ /** Alle Werte eines wiederholten Feldes, getrimmt, ohne leere Eintraege. */ export function strArray(formData: FormData, key: string): string[] { return formData .getAll(key) .map((value) => String(value).trim()) .filter(Boolean); } /** * Wie strArray, aber POSITIONSERHALTEND: ein leerer Eintrag bleibt als "" * stehen, statt herauszufallen. * * Gedacht fuer Felder, bei denen die Position eine Bedeutung traegt. Chargen- * und Erntebilder sind genau so ein Fall: Slot 1 fuellt die linke, Slot 2 die * rechte Kachel auf /charge/[code]. Mit strArray liesse sich das zweite Bild * gar nicht allein setzen — ohne erstes Bild rueckte das zweite auf Position 0 * und landete in der falschen Kachel. * * Nur am Ende stehende leere Slots werden entfernt, damit ein vollstaendig * leeres Feld weiterhin ein leeres Array ergibt statt ["", ""]. */ export function strArraySlots(formData: FormData, key: string): string[] { const slots = formData.getAll(key).map((value) => String(value).trim()); while (slots.length > 0 && slots[slots.length - 1] === "") slots.pop(); return slots; }