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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user