// Stato di calibrazione della camera di una stazione (#83). // La calibrazione vive nell'acquisitore (camera_service): qui si legge solo lo stato // tramite il proxy Flask e si offre il link alla sua pagina «Calibra». // Uso: x-data="stationCalibrationCell(station, msgs)" (msgs: stringhe tradotte). Dipende da Alpine.js. // Formatta px/mm e data nella lingua della pagina (es. «20,03 px/mm · 23/10/2026») function formatCalibration(cal) { const lang = document.documentElement.lang || 'it'; let text = new Intl.NumberFormat(lang, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) .format(Number(cal.px_per_mm)) + ' px/mm'; if (cal.calibrated_at) { const d = new Date(cal.calibrated_at); if (!isNaN(d)) text += ' · ' + d.toLocaleDateString(lang); } return text; } // Legge lo stato dal proxy: ritorna {state, calibration, calibration_url, detail} async function fetchStationCalibration(stationId) { try { const resp = await fetch(`/maker/api/stations/${stationId}/camera/calibration`); const body = await resp.json().catch(() => ({})); if (!resp.ok) return { state: 'unreachable', detail: body.detail || '' }; return body; } catch (e) { return { state: 'unreachable', detail: String(e) }; } } function stationCalibrationCell(station, msgs) { return { hasCamera: !!(station.camera_url && station.camera_source), cameraUrl: station.camera_url || '', state: '', // '' = in lettura | calibrated | uncalibrated | unreachable label: '', calibrationUrl: '', msgs: msgs || {}, async init() { if (!this.hasCamera) return; const r = await fetchStationCalibration(station.id); this.state = r.state || 'unreachable'; // Link «Acquisizione» (#88, era «Calibra»): dal proxy, altrimenti costruito dall'indirizzo della camera this.calibrationUrl = r.calibration_url || (this.cameraUrl.replace(/\/+$/, '') + '/acquisizione'); if (this.state === 'calibrated') this.label = formatCalibration(r.calibration || {}); else if (this.state === 'uncalibrated') this.label = this.msgs.uncalibrated || 'not calibrated'; else this.label = this.msgs.unreachable || 'camera service unreachable'; }, }; }