From 5a055923fe836c92ffb0727f73a198d02d09f39f Mon Sep 17 00:00:00 2001 From: TanerUslu Date: Wed, 29 Jul 2026 13:05:37 +0200 Subject: [PATCH] Trenne Dialogtexte fuer echte Mehrdeutigkeit und nichts erkannt Der rote Dialog zeigte bisher immer "Nicht eindeutig", auch wenn die Erkennung schlicht nichts Verwertbares geliefert hat (kein Barcode, kein brauchbarer Klartext). Das verwirrt: es klingt nach mehreren Kandidaten, obwohl gar keine Erkennung stattfand. askForStack() bekommt einen expliziten Parameter nothingRecognized, da sich die beiden Lagen nicht zweifelsfrei aus spec/candidates ableiten lassen (main.js reicht bei "nichts erkannt" als Rueckfall alle vorhandenen Stapel als candidates durch). main.js setzt ihn anhand von plan.kind === 'ambiguous' (echte Mehrdeutigkeit) vs. allem anderen (nur wegen roter Konfidenz im Dialog). Signatur, Rueckgabeform, Schaltflaechen, Klassennamen, die Mehrfachausloese-Sperre und die inert-Handhabung bleiben unveraendert. --- src/main.js | 4 ++++ src/ui/ambiguous-dialog.js | 27 ++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main.js b/src/main.js index 026d468..d79f5cd 100644 --- a/src/main.js +++ b/src/main.js @@ -112,6 +112,10 @@ async function processCapture(getFrame) { candidates: plan.kind === 'ambiguous' ? plan.candidates : targetSession.stacks.map((stack) => stack.id), + // Nur eine echte Stapel-Mehrdeutigkeit (plan.kind === 'ambiguous') + // bedeutet "mehrere passen" - alles andere landet nur wegen roter + // Konfidenz hier, also weil nichts Verwertbares erkannt wurde. + nothingRecognized: plan.kind !== 'ambiguous', }); // "nochmal scannen": abbrechen, ohne zu buchen. Der fruehe return liegt diff --git a/src/ui/ambiguous-dialog.js b/src/ui/ambiguous-dialog.js index 761c039..2558f82 100644 --- a/src/ui/ambiguous-dialog.js +++ b/src/ui/ambiguous-dialog.js @@ -19,21 +19,42 @@ function describeReading(spec) { * Reine Darstellung: kennt weder Stapel-Logik noch Erkennung, * bekommt die zur Wahl stehenden Stapel als Liste herein. * + * Der Dialog deckt zwei grundverschiedene Lagen ab, die main.js nicht + * auseinanderhaelt, wenn man nur spec/candidates ansieht: mehrere Stapel + * passen (echte Mehrdeutigkeit) oder die Erkennung hat schlicht nichts + * Verwertbares geliefert. Da beide Lagen mit leerem spec und/oder nicht- + * leeren candidates auftreten koennen (main.js reicht bei "nichts erkannt" + * als Rueckfall alle vorhandenen Stapel als candidates durch, damit der + * Dialog trotzdem Schaltflaechen hat), laesst sich die Unterscheidung nicht + * zweifelsfrei aus spec/candidates ableiten - deshalb der ausdrueckliche + * Parameter nothingRecognized. + * * @param {HTMLElement} root - * @param {{spec: object, candidates: string[]}} args + * @param {{spec: object, candidates: string[], nothingRecognized?: boolean}} args + * nothingRecognized: true, wenn weder Barcode noch Texterkennung etwas + * Verwertbares geliefert haben (main.js: confidence 'red' ausserhalb + * einer echten Stapel-Mehrdeutigkeit) - dann ist der Dialog eine + * Rueckfallebene und kein Angebot mehrerer passender Stapel. * @returns {Promise<{action: 'stack', stackId: string}|{action: 'new'}|{action: 'retry'}>} */ -export function askForStack(root, { spec, candidates }) { +export function askForStack(root, { spec, candidates, nothingRecognized = false }) { const overlay = document.createElement('div'); overlay.className = 'overlay red'; overlay.setAttribute('role', 'dialog'); overlay.setAttribute('aria-modal', 'true'); overlay.setAttribute('aria-labelledby', 'ambiguous-dialog-heading'); + const heading = nothingRecognized ? 'Nichts erkannt' : 'Nicht eindeutig'; + const hint = nothingRecognized + ? 'Etikett näher heranhalten, auf gleichmäßiges Licht achten und Spiegelungen vermeiden. Sonst hier den Stapel selbst wählen.' + : 'Mehrere Stapel passen zu diesem Modul – bitte auswählen.'; overlay.innerHTML = ` -
Nicht eindeutig
+
${heading}
+
Gelesen:
`; + // Der Hinweistext ist fest vorgegeben (kein Fremdinhalt), textContent genuegt trotzdem als sichere Wahl. + overlay.querySelector('#hint').textContent = hint; // Der gelesene Wert stammt aus dem Etikett (Fremdeingabe) - als Text setzen, nicht als Auszeichnung. overlay.querySelector('#read').textContent = describeReading(spec);