diff --git a/src/frontend/flask_app/blueprints/measure.py b/src/frontend/flask_app/blueprints/measure.py index dc19562..5448d3b 100644 --- a/src/frontend/flask_app/blueprints/measure.py +++ b/src/frontend/flask_app/blueprints/measure.py @@ -440,7 +440,8 @@ def task_complete(recipe_id: int): m["subtask"] = st m["task_info"] = subtask_task_map.get(m.get("subtask_id"), {}) # Compute deviation if not present - if m.get("deviation") is None and st.get("nominal") is not None: + # #118: quota non misurata (value None): la deviazione resta None (il template mostra NaN) + if m.get("deviation") is None and st.get("nominal") is not None and m.get("value") is not None: try: m["deviation"] = m["value"] - st["nominal"] except (TypeError, KeyError): diff --git a/src/frontend/flask_app/static/js/save_image.js b/src/frontend/flask_app/static/js/save_image.js index a723490..49f0496 100644 --- a/src/frontend/flask_app/static/js/save_image.js +++ b/src/frontend/flask_app/static/js/save_image.js @@ -40,17 +40,22 @@ async function tmfBlobToPng(blob) { // #119: scarica `src`, lo porta a PNG e lo salva; true = salvato, false = annullato dall'utente o errore async function tmfSaveImage(src, baseName) { + if (!src) return false; // #119: nessuna immagine mostrata try { + var name = tmfSaveImageName(baseName, new Date()); + // #119: «Salva con nome» per primo, finche' vale il gesto dell'utente (Chrome lo rifiuta dopo ~5 s di fetch e conversione) + var handle = null; + if (typeof window !== 'undefined' && typeof window.showSaveFilePicker === 'function') { + handle = await window.showSaveFilePicker({ + suggestedName: name, + types: [{ description: 'PNG', accept: { 'image/png': ['.png'] } }], + }); + } var resp = await fetch(src); if (!resp.ok) return false; var blob = await resp.blob(); if (blob.type !== 'image/png') blob = await tmfBlobToPng(blob); - var name = tmfSaveImageName(baseName, new Date()); - if (typeof window !== 'undefined' && typeof window.showSaveFilePicker === 'function') { - var handle = await window.showSaveFilePicker({ - suggestedName: name, - types: [{ description: 'PNG', accept: { 'image/png': ['.png'] } }], - }); + if (handle) { var w = await handle.createWritable(); await w.write(blob); await w.close();