/**
* Baut die Hauptansicht auf und liefert Aktualisierungsfunktionen zurueck.
* Kennt weder Kamera noch Erkennung - alles kommt ueber die Rueckrufe.
*/
export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile }) {
root.innerHTML = `
Noch nichts erfasst
`;
const stacksEl = root.querySelector('#stacks');
const lastEl = root.querySelector('#last');
const statusEl = root.querySelector('#status');
const fileEl = root.querySelector('#file');
const pickFileButtonEl = root.querySelector('#pick-file-button');
root.querySelector('#capture').addEventListener('click', onCapture);
root.querySelector('#undo').addEventListener('click', onUndo);
// Klick auf die sichtbare Schaltflaeche ist selbst die Nutzergeste, die
// die versteckte Dateiauswahl oeffnen darf - anders als ein Aufruf aus dem
// Code heraus, den Handy-Browser blockieren.
pickFileButtonEl.addEventListener('click', () => fileEl.click());
fileEl.addEventListener('change', () => {
if (fileEl.files[0]) onPickFile(fileEl.files[0]);
fileEl.value = '';
});
return {
video: root.querySelector('#preview'),
/** @param {{id: string, count: number}[]} stacks */
setStacks(stacks) {
stacksEl.innerHTML = '';
if (stacks.length === 0) {
// Auch ohne erfasste Stapel muss die Sitzungsliste erreichbar
// bleiben - darueber liegt der einzige Weg zu "Sitzung beenden".
const button = document.createElement('button');
button.textContent = 'Noch keine Stapel';
button.addEventListener('click', onOpenList);
stacksEl.appendChild(button);
return;
}
for (const stack of stacks) {
const button = document.createElement('button');
button.textContent = `${stack.id}: ${stack.count}`;
button.addEventListener('click', onOpenList);
stacksEl.appendChild(button);
}
},
setLast(text) {
lastEl.textContent = text;
},
/** @param {string} text @param {boolean} warn */
setStatus(text, warn = false) {
statusEl.textContent = text;
statusEl.classList.toggle('warn', warn);
},
openFilePicker() {
fileEl.click();
},
/**
* Blendet die Ersatzweg-Schaltflaeche "Bild auswaehlen" ein oder aus.
* Wird eingeblendet, wenn die Kamera nicht zur Verfuegung steht, und
* bleibt dann dauerhaft sichtbar.
* @param {boolean} visible
*/
setFilePickerVisible(visible) {
pickFileButtonEl.hidden = !visible;
},
};
}