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.
This commit is contained in:
2026-07-29 13:05:37 +02:00
parent b94639ccd1
commit 5a055923fe
2 changed files with 28 additions and 3 deletions
+4
View File
@@ -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
+24 -3
View File
@@ -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 = `
<div class="stack-id" id="ambiguous-dialog-heading" style="font-size:34px">Nicht eindeutig</div>
<div class="stack-id" id="ambiguous-dialog-heading" style="font-size:34px">${heading}</div>
<div class="detail" id="hint"></div>
<div class="detail">Gelesen: <span id="read"></span></div>
<div class="choices" id="choices"></div>
`;
// 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);