diff --git a/src/frontend/flask_app/static/js/dxf_recipe_wizard.js b/src/frontend/flask_app/static/js/dxf_recipe_wizard.js index eec8c60..e735f94 100644 --- a/src/frontend/flask_app/static/js/dxf_recipe_wizard.js +++ b/src/frontend/flask_app/static/js/dxf_recipe_wizard.js @@ -515,8 +515,15 @@ function dxfRecipeWizard(taskId, csrf, msgs) { const vp = this._vpEl(k), v = this.views[k]; if (!vp || !v.w || !v.h || !vp.clientWidth) return; // nascosto o vuoto: niente // altezza utile del viewport (senza bordo), ripiego 240; con 240 secco il contenuto sborda e compare lo scroll - const ch = vp.clientHeight || 240; - let z = Math.min(vp.clientWidth / v.w, ch / v.h); + let cw = vp.clientWidth, ch = vp.clientHeight || 240; + // #113: Adatta premuto da ingrandito: client* escludono le barre di scorrimento che spariranno dopo il fit; + // l'area vera e' offset* meno i bordi (nei test senza DOM offsetWidth manca e restano client*) + if (vp.offsetWidth && typeof getComputedStyle === 'function') { + const cs = getComputedStyle(vp); + cw = vp.offsetWidth - (parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth) || 0); + ch = vp.offsetHeight - (parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth) || 0) || 240; + } + let z = Math.min(cw / v.w, ch / v.h); if (k === 'img') z = Math.min(8, Math.max(0.05, z)); v.zoom = z; v.fit = z; diff --git a/src/frontend/flask_app/tests/js/test_dxf_zoom.js b/src/frontend/flask_app/tests/js/test_dxf_zoom.js index c064491..dc4b9a3 100644 --- a/src/frontend/flask_app/tests/js/test_dxf_zoom.js +++ b/src/frontend/flask_app/tests/js/test_dxf_zoom.js @@ -113,6 +113,13 @@ check('#113 pan: cursore grabbing', w.vCursor('dxf') === 'grabbing'); w.vPanEnd(); check('#113 pan finito', w.viewPanKey === '' && w._viewPan === null); +// #113: Adatta da ingrandito, con barre di scorrimento presenti: area = offset* meno i bordi, non client* +global.getComputedStyle = () => ({ borderLeftWidth: '1px', borderRightWidth: '1px', borderTopWidth: '1px', borderBottomWidth: '1px' }); +w = make(432); w.$refs.vpImg.clientHeight = 228; w.$refs.vpImg.offsetWidth = 444; w.$refs.vpImg.offsetHeight = 240; +w.vSetContent('img', 2464, 2056); +check('#113 Adatta con barre: area senza barre (238/2056)', near(w.views.img.fit, 238 / 2056), String(w.views.img.fit)); +delete global.getComputedStyle; + // Integrazione DXF: loadDxfPreview imposta la misura del viewBox e fa Adatta; file tolto azzera (async () => { const PREVIEW = {