1bfcfaa5f2
Rotte maker: elenco stazioni con camera, grab per stazione, stato calibrazione dall'acquisitore (C1), inoltro a B3. Pagina stazioni: stato e link «Calibra». Test con api_client e requests finti; traduzioni IT/EN. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
51 lines
2.2 KiB
JavaScript
51 lines
2.2 KiB
JavaScript
// 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 «Calibra»: dal proxy, altrimenti costruito dall'indirizzo della camera
|
|
this.calibrationUrl = r.calibration_url || (this.cameraUrl.replace(/\/+$/, '') + '/calibrazione');
|
|
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';
|
|
},
|
|
};
|
|
}
|