From dd9ab3736b87d5e5e63eb5110dbd63f7ebaa2efd Mon Sep 17 00:00:00 2001 From: s4luorth Date: Mon, 21 Sep 2026 11:57:59 +0200 Subject: [PATCH] =?UTF-8?q?Konfigurator:=20Sammelbestellung=20ohne=20Empf?= =?UTF-8?q?=C3=A4ngerliste=20>=2025=20wieder=20bestellbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die neue Mengen-Sperre (entries.length === quantity) hätte identische Sammelkarten ohne Empfängerliste oberhalb der Tabellengrenze blockiert: dort wuchs entries nie auf die Menge, weil der Sync-Effekt pauschal bei > 25 pausierte. Der Sync pausiert jetzt nur noch, wenn pro Zeile wirklich Daten nötig sind (Empfänger-/Individualtext-Schritt oder eigene Platzhalter im Brieftext). Ohne solche Daten erzeugt die Menge N Blanko-Zeilen – auch > 25. Extern-Modus unverändert. Co-Authored-By: Claude Opus 4.8 --- src/routes/Configurator.tsx | 38 ++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/routes/Configurator.tsx b/src/routes/Configurator.tsx index d015cea..617b2e6 100644 --- a/src/routes/Configurator.tsx +++ b/src/routes/Configurator.tsx @@ -584,23 +584,6 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri useEffect(() => { setPreviewSession(null); }, [textTemplate, font, format, realistisch, labeling, needsEnvelope, umschlagText, entries]); - // Empfängerzeilen an die Menge angleichen (nur im Tabellenmodus). Gilt auch im - // Extern-Modus: die (vom Betreiber vorgegebene) Menge erzeugt die passende - // Anzahl Zeilen – egal ob mit oder ohne Kuvert/Empfänger. - useEffect(() => { - // Bei vielen Empfängern (Tabelle unpraktisch) wird auf Excel verwiesen und - // nicht synchronisiert – AUSSER im Extern-Modus ohne Empfänger-Schritt, wo die - // Menge einfach N Blanko-Dokumente erzeugen muss (auch über der Tabellengrenze). - if (nurUpload && (!externModus || empfaengerSchritt)) return; - setEntries((prev) => { - if (prev.length === quantity) return prev; - if (prev.length < quantity) { - return [...prev, ...Array.from({ length: quantity - prev.length }, leereEntry)]; - } - return prev.slice(0, quantity); - }); - }, [quantity, nurUpload, externModus, empfaengerSchritt]); - // Extern-Preset (vom Betreiber im Direktlink gesetzt) – der Kunde wählt nichts: // ?extern=1&versand=sammel|einzeln&kuvert=0|1&beschriftung=empfaenger|freitext|keine&menge=N // Die Menge ist maßgeblich (greift immer); nur ein Excel-Import passt sie an die @@ -806,6 +789,27 @@ export default function Configurator({ vorwahlProdukt }: { vorwahlProdukt?: stri const eigeneImText = genutztePlatzhalter.filter((p) => !standardSet.has(p.toLowerCase())); /** Platzhalter im individuellen Umschlagtext – analog zur Text-Tabelle. */ const genutztePlatzhalterUmschlag = useMemo(() => textPlatzhalter(umschlagText), [umschlagText]); + + // Müssen pro Dokument eigene Daten erfasst werden? Das ist der Fall bei einem + // Empfänger-/Individualtext-Schritt oder bei eigenen Platzhaltern im Brieftext + // (jede Zeile trägt andere Werte → oberhalb der Tabellengrenze via Excel). + const zeilenDatenNoetig = !!empfaengerSchritt || eigeneImText.length > 0; + + // Empfängerzeilen an die Menge angleichen. Unterhalb der Tabellengrenze immer; + // darüber nur, wenn KEINE Pflicht-Zeilendaten nötig sind (z. B. identische + // Sammelkarten ohne Empfängerliste) – dann erzeugt die Menge N Blanko-Zeilen. + // Werden pro Zeile Daten gebraucht, bleibt es beim Excel-Upload (nicht syncen). + // Im Extern-Modus wie bisher: syncen außer bei Empfänger-/Individualtext-Schritt. + useEffect(() => { + if (nurUpload && (externModus ? empfaengerSchritt : zeilenDatenNoetig)) return; + setEntries((prev) => { + if (prev.length === quantity) return prev; + if (prev.length < quantity) { + return [...prev, ...Array.from({ length: quantity - prev.length }, leereEntry)]; + } + return prev.slice(0, quantity); + }); + }, [quantity, nurUpload, externModus, empfaengerSchritt, zeilenDatenNoetig]); /** * Entry für den Versand ans Backend: löst ALLE im Text/Umschlag genutzten * Platzhalter explizit auf (Standard-Platzhalter aus der Adresse via standardWert,