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);