From 37bc7663afc192e0ffab35fd2e5bc87b80f49db9 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 16 Aug 2026 09:19:08 +0200 Subject: [PATCH] Web: Einheiten-Felder als zusammenhaengender Block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Im Grillwurst-Fall stand dieselbe Zahl zweimal im Formular, mit zwei Bedeutungen und in identischer Aufmachung: "Packungsgroesse 3" (1 Packung = 3 Stueck) und "Zweiteinheit 3 Stk ≙ 250 g" (3 Stueck wiegen 250 g). Dazu sass der Zweiteinheit-Block zwischen Gebinde/MHD und Mindestbestand/Gruppe, hiess nach einem Fachbegriff und benutzte ≙ statt eines Satzes. Jetzt steht alles zur Einheit unter einer Ueberschrift und liest sich als Satz: "Gezaehlt wird in Stueck", "Gebinde Packung", "1 Packung sind 3 Stueck". Das Gebinde steht dafuer vor der Packungsgroesse - die Zeile darunter nennt es beim Namen. Die Umrechnung heisst nach dem, was sie liefert (Gewicht / Volumen / Stueckzahl) und beginnt mit einer einzigen Auswahl; erst danach erscheint der Satz "3 Stk wiegen 250 g" mit passendem Verb und Ein-/Mehrzahl. Die linke Zahl wird beim Waehlen der Zielart EINMALIG mit der Packungsgroesse vorbelegt - zu tippen bleibt nur die 250. Bewusst keine dauerhafte Kopplung: wer die Packung spaeter auf 4 aendert, hat dieselbe Wurst, und ein mitgezogener Wert wuerde stillschweigend behaupten, sie sei leichter geworden. MHD-Angabe wandert aus dem Einheiten-Block zur Gruppen-Zeile; sie stand nur zufaellig neben dem Gebinde. Reine Oberflaeche - Datenmodell, API und Backend-Tests unveraendert. Co-Authored-By: Claude Opus 5 --- web/src/pages/ProductForm.jsx | 126 +++++++++++++++++++++++++--------- 1 file changed, 92 insertions(+), 34 deletions(-) diff --git a/web/src/pages/ProductForm.jsx b/web/src/pages/ProductForm.jsx index 8fdf7aa..8c54614 100644 --- a/web/src/pages/ProductForm.jsx +++ b/web/src/pages/ProductForm.jsx @@ -590,6 +590,40 @@ export default function ProductForm() { const BASE_SHORT_OF_KIND = { count: "Stk", weight: "g", volume: "ml" }; // Basiseinheit je Art – die eigene Art fliegt aus der Zweiteinheit-Auswahl. const BASE_OF_KIND = { count: "piece", weight: "gram", volume: "milliliter" }; + // Die Umrechnung heißt nach dem, was sie liefert – „Zweiteinheit" musste man + // erst übersetzen. Ohne gewählte Zielart ein neutraler Titel. + const ZWEIT_TITEL = { gram: "Gewicht", milliliter: "Volumen", piece: "Stückzahl" }; + // Verb passend zur Zielart und zur Anzahl: „1 Stück wiegt" / „3 Stück wiegen". + const ZWEIT_VERB = { + gram: ["wiegt", "wiegen"], milliliter: ["fasst", "fassen"], piece: ["ist", "sind"], + }; + const zweitTitel = ZWEIT_TITEL[form.secondary_base] || "Umrechnung"; + const zweitVerb = (() => { + const paar = ZWEIT_VERB[form.secondary_base]; + if (!paar) return ""; + return Number(form.secondary_count) === 1 ? paar[0] : paar[1]; + })(); + // Das Gebinde beim Namen nennen: „1 Packung sind …". Ohne Auswahl der + // Standard, sonst stünde dort „1 sind 3 Stück". + const gebindeName = form.package_label.trim() || "Packung"; + + // Zielart wählen: die linke Zahl einmalig mit der Packungsgröße vorbelegen – + // im Normalfall ist sie genau das („1 Packung = 3 Stück, und die wiegen + // 250 g"). BEWUSST keine dauerhafte Kopplung: wer die Packung später auf 4 + // ändert, hat dieselbe Wurst, und ein mitgezogener Wert würde stillschweigend + // behaupten, sie sei leichter geworden. + function waehleZweitart(basis) { + if (basis && form.secondary_count === "") { + setForm((f) => ({ + ...f, + secondary_base: basis, + secondary_count: f.package_size !== "" ? f.package_size : "1", + })); + return; + } + set("secondary_base", basis); + } + // Ausgerechneter Wert als Kontrolle: „1 Stk ≈ 83,33 g". const zweitHinweis = (() => { const f = zweitFaktor({ @@ -600,6 +634,7 @@ export default function ProductForm() { if (!f) return ""; return `1 ${BASE_SHORT_OF_KIND[selectedUnit?.kind] || "Einheit"} \u2248 ` + `${fmt(f)} ${unitShort(form.secondary_base)}. ` + + "Damit zählt der Artikel auch in Gruppen, die in dieser Einheit rechnen. " + "Bestände bleiben beim Ändern unverändert – nur ihre Umrechnung verschiebt sich."; })(); const baseShort = selectedUnit @@ -799,9 +834,17 @@ export default function ProductForm() { {/* Lebensmittel ODER Verbrauchsgegenstand: Einheit, Packung, MHD, Mindestbestand (mit Einheit), Gruppe, Mindestbestand je Lagerort. */} {foodLike && (<> + {/* Alles rund um Einheit, Packung und Umrechnung steht zusammen und + liest sich als Satz. Vorher lagen die Felder verstreut, und die + Packungsgroesse stand als blanke Zahl neben einer zweiten, gleich + aussehenden Zahl aus der Umrechnung – das war nicht zu trennen. */} +
+ +

Einheit und Menge

+
- -
-
+ {/* Gebinde VOR der Packungsgröße: die Zeile darunter nennt es beim + Namen („1 Packung sind …"). */} +
+
+
+ + {/* Umrechnung in die ANDERE Art: „3 Stück wiegen 250 g". Solange + keine Zielart gewählt ist, steht hier nur eine Auswahl. */} +
+ +

{zweitTitel} (optional)

+
+
+
- {/* Zweiteinheit: dieselbe Ware in der ANDEREN Art lesbar machen. - Links steht die Basiseinheit des Artikels fest, rechts die - Gegenart. Ohne Eintrag bleibt alles wie bisher getrennt. */} -
-
+ )} {zweitHinweis &&

{zweitHinweis}

}
{/* Beim Anlegen gibt es den Artikel noch nicht, also auch keine @@ -904,6 +952,16 @@ export default function ProductForm() {
)} +