import { workerStatusLabel } from '../../lib/workersView' import { FLOORS, FLOOR_TITLES, ROLES } from '../../lib/workersRoster' // Statuspunkt je Dienst-Status (Wörterbuch statt zusammengesetzter Klasse: der CSS-Test in workers.css findet die Namen) const DOT = { arbeitet: 'wk-dot-arbeitet', wartet: 'wk-dot-wartet', leerlauf: 'wk-dot-leerlauf', grau: 'wk-dot-grau', fehler: 'wk-dot-fehler', } // Etagen von oben nach unten mit ihren Workern; Etagen ohne Worker (Pult, Tresor) entfallen const GROUPS = FLOORS.map((floor) => ({ floor, roles: ROLES.filter((r) => r.floor === floor) })).filter((g) => g.roles.length > 0) const isRecord = (v) => v !== null && typeof v === 'object' && !Array.isArray(v) // workers = Tabelle nach workerId (indexWorkers/reduceEvents) oder die Liste aus state.workers; unbekannt -> null function entryOf(workers, workerId) { if (Array.isArray(workers)) return workers.find((w) => isRecord(w) && w.workerId === workerId) ?? null return isRecord(workers) && Object.hasOwn(workers, workerId) && isRecord(workers[workerId]) ? workers[workerId] : null } // Status aus dem Eintrag; ein nicht angeschlossener Worker ist grau (wie in indexWorkers) function statusOf(entry) { if (!entry) return '' return entry.connected === false ? 'grau' : entry.status } // Alle Worker je Etage als Knopfliste. Ein Klick meldet die workerId über onSelect, der gewählte Knopf ist aria-pressed. export default function WorkerList({ workers, selectedId, onSelect }) { return (
{GROUPS.map((group) => (

{FLOOR_TITLES[group.floor]}

))}
) }