diff --git a/js/build/jsroot.js b/js/build/jsroot.js index 62b3ee8db1f68..003a92ac1189b 100644 --- a/js/build/jsroot.js +++ b/js/build/jsroot.js @@ -1,4 +1,4 @@ -// https://root.cern/js/ v7.11.0 +// https://root.cern/js/ v7.11.1 (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : @@ -10,11 +10,11 @@ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentS /** @summary version id * @desc For the JSROOT release the string in format 'major.minor.patch' like '7.0.0' */ -const version_id = '7.11.0', +const version_id = '7.11.x', /** @summary version date * @desc Release date in format day/month/year like '14/04/2022' */ -version_date = '5/05/2026', +version_date = '23/07/2026', /** @summary version id and date * @desc Produced by concatenation of {@link version_id} and {@link version_date} @@ -81017,6 +81017,13 @@ class JSRootMenu { /** @summary Add menu header - must be first entry */ header(name, title) { + if (name.length > 25) { + if (!title) + title = name; + else if (isStr(title) && title.indexOf('https://') === 0) + title = name + title; + name = name.slice(0, 22) + '...'; + } this.add(sHeader + name, undefined, undefined, title); } @@ -93165,9 +93172,10 @@ class TCanvasPainter extends TPadPainter { this.forEachPainterInPad(pp => { const pad = pp.getRootPad(true); - if (pp.getNumPainters() && pad?.fPrimitives && !pad.fPrimitives.arr.length) { + if (pp.getNumPainters() && pad && !pad.fPrimitives?.arr.length) { + prims.push(pad, pad.fPrimitives); // remember old value // create list of primitives when missing - prims.push(pad.fPrimitives); + pad.fPrimitives = create$1(clTList); pp.forEachPainterInPad(p => { // ignore all secondary painters if (p.isSecondary()) @@ -93226,7 +93234,8 @@ class TCanvasPainter extends TPadPainter { e.hist.fMaximum = e.max; }); - prims.forEach(lst => lst.Clear()); + for (let k = 0; k < prims.length; k += 2) + prims[k].fPrimitives = prims[k + 1]; return res; } @@ -104602,10 +104611,10 @@ function getTF1Value(func, x, skip_eval = undefined) { if (func.evalPar && !iserr) { try { - return func.evalPar(x); + const res = func.evalPar(x); + if (Number.isFinite(res)) + return res; } catch { - /* eslint-disable-next-line no-useless-assignment */ - iserr = true; } } @@ -170607,7 +170616,7 @@ function readStyleFromURL(url) { const b = d.get('batch'); if (b !== undefined) { - setBatchMode(d !== 'off'); + setBatchMode(b !== 'off'); if (b === 'png') internals.batch_png = true; } @@ -175394,12 +175403,14 @@ class TF1Painter extends TH1Painter$2 { let y = 0; try { y = tf1.evalPar(x); + if (!Number.isFinite(y)) + iserror = true; } catch { iserror = true; } if (!iserror) - hist.setBinContent(n + 1, Number.isFinite(y) ? y : 0); + hist.setBinContent(n + 1, y); } if (iserror) @@ -177187,12 +177198,14 @@ class TF2Painter extends TH2Painter { try { z = func.evalPar(x, y); + if (!Number.isFinite(z)) + iserror = true; } catch { iserror = true; } if (!iserror) - hist.setBinContent(hist.getBin(i + 1, j + 1), Number.isFinite(z) ? z : 0); + hist.setBinContent(hist.getBin(i + 1, j + 1), z); } } @@ -177552,10 +177565,16 @@ class TF3Painter extends TH2Painter { let z = 0; try { - for (let k = 0; k < npz; ++k) + for (let k = 0; k < npz; ++k) { arrv[k] = func.evalPar(x, y, arrz[k]); + if (!Number.isFinite(arrv[k])) { + iserror = true; + break; + } + } - z = findZValue(arrz, arrv); + if (!iserror) + z = findZValue(arrz, arrv); } catch { iserror = true; } diff --git a/js/changes.md b/js/changes.md index 9bccbb6f6335d..05ad2c3ef5c70 100644 --- a/js/changes.md +++ b/js/changes.md @@ -1,5 +1,10 @@ # JSROOT changelog +## Changes in 7.11.x +1. Fix - prevent very long header in context menu +2. Fix - JSON production for TWebCanvas +1. Fix - check evaluated value of TF1 + ## Changes in 7.11.0 1. Implement new data types in `RNtuple` diff --git a/js/modules/base/func.mjs b/js/modules/base/func.mjs index 1437d102b6288..1e72a8dd0cc97 100644 --- a/js/modules/base/func.mjs +++ b/js/modules/base/func.mjs @@ -159,10 +159,10 @@ function getTF1Value(func, x, skip_eval = undefined) { if (func.evalPar && !iserr) { try { - return func.evalPar(x); + const res = func.evalPar(x); + if (Number.isFinite(res)) + return res; } catch { - /* eslint-disable-next-line no-useless-assignment */ - iserr = true; } } diff --git a/js/modules/core.mjs b/js/modules/core.mjs index 938b851ca704b..f0c23f15ee438 100644 --- a/js/modules/core.mjs +++ b/js/modules/core.mjs @@ -2,11 +2,11 @@ /** @summary version id * @desc For the JSROOT release the string in format 'major.minor.patch' like '7.0.0' */ -const version_id = '7.11.0', +const version_id = '7.11.x', /** @summary version date * @desc Release date in format day/month/year like '14/04/2022' */ -version_date = '5/05/2026', +version_date = '23/07/2026', /** @summary version id and date * @desc Produced by concatenation of {@link version_id} and {@link version_date} diff --git a/js/modules/gpad/TCanvasPainter.mjs b/js/modules/gpad/TCanvasPainter.mjs index b8f1d40fd6b8e..a023acbe883f4 100644 --- a/js/modules/gpad/TCanvasPainter.mjs +++ b/js/modules/gpad/TCanvasPainter.mjs @@ -1,4 +1,5 @@ -import { BIT, settings, gStyle, internals, browser, create, parse, toJSON, loadScript, isFunc, isStr, clTCanvas } from '../core.mjs'; +import { BIT, settings, gStyle, internals, browser, create, parse, + toJSON, loadScript, isFunc, isStr, clTCanvas, clTList } from '../core.mjs'; import { select as d3_select } from '../d3.mjs'; import { closeCurrentWindow, showProgress, loadOpenui5, ToolbarIcons, getColorExec } from '../gui/utils.mjs'; import { GridDisplay, getHPainter } from '../gui/display.mjs'; @@ -856,9 +857,10 @@ class TCanvasPainter extends TPadPainter { this.forEachPainterInPad(pp => { const pad = pp.getRootPad(true); - if (pp.getNumPainters() && pad?.fPrimitives && !pad.fPrimitives.arr.length) { + if (pp.getNumPainters() && pad && !pad.fPrimitives?.arr.length) { + prims.push(pad, pad.fPrimitives); // remember old value // create list of primitives when missing - prims.push(pad.fPrimitives); + pad.fPrimitives = create(clTList); pp.forEachPainterInPad(p => { // ignore all secondary painters if (p.isSecondary()) @@ -917,7 +919,8 @@ class TCanvasPainter extends TPadPainter { e.hist.fMaximum = e.max; }); - prims.forEach(lst => lst.Clear()); + for (let k = 0; k < prims.length; k += 2) + prims[k].fPrimitives = prims[k + 1]; return res; } diff --git a/js/modules/gui.mjs b/js/modules/gui.mjs index 3d50f70c79a12..53bdf11298ae4 100644 --- a/js/modules/gui.mjs +++ b/js/modules/gui.mjs @@ -50,7 +50,7 @@ function readStyleFromURL(url) { const b = d.get('batch'); if (b !== undefined) { - setBatchMode(d !== 'off'); + setBatchMode(b !== 'off'); if (b === 'png') internals.batch_png = true; } diff --git a/js/modules/gui/menu.mjs b/js/modules/gui/menu.mjs index e62808a2b43a8..e1cd8b923642e 100644 --- a/js/modules/gui/menu.mjs +++ b/js/modules/gui/menu.mjs @@ -109,6 +109,13 @@ class JSRootMenu { /** @summary Add menu header - must be first entry */ header(name, title) { + if (name.length > 25) { + if (!title) + title = name; + else if (isStr(title) && title.indexOf('https://') === 0) + title = name + title; + name = name.slice(0, 22) + '...'; + } this.add(sHeader + name, undefined, undefined, title); } diff --git a/js/modules/hist/TF1Painter.mjs b/js/modules/hist/TF1Painter.mjs index 3fed5f604b02c..44d41a1e7eff6 100644 --- a/js/modules/hist/TF1Painter.mjs +++ b/js/modules/hist/TF1Painter.mjs @@ -175,12 +175,14 @@ class TF1Painter extends TH1Painter { let y = 0; try { y = tf1.evalPar(x); + if (!Number.isFinite(y)) + iserror = true; } catch { iserror = true; } if (!iserror) - hist.setBinContent(n + 1, Number.isFinite(y) ? y : 0); + hist.setBinContent(n + 1, y); } if (iserror) diff --git a/js/modules/hist/TF2Painter.mjs b/js/modules/hist/TF2Painter.mjs index af6d14431c678..d2d3156dcf3f6 100644 --- a/js/modules/hist/TF2Painter.mjs +++ b/js/modules/hist/TF2Painter.mjs @@ -137,12 +137,14 @@ class TF2Painter extends TH2Painter { try { z = func.evalPar(x, y); + if (!Number.isFinite(z)) + iserror = true; } catch { iserror = true; } if (!iserror) - hist.setBinContent(hist.getBin(i + 1, j + 1), Number.isFinite(z) ? z : 0); + hist.setBinContent(hist.getBin(i + 1, j + 1), z); } } diff --git a/js/modules/hist/TF3Painter.mjs b/js/modules/hist/TF3Painter.mjs index 0a177131a260d..b7dcbe277d45a 100644 --- a/js/modules/hist/TF3Painter.mjs +++ b/js/modules/hist/TF3Painter.mjs @@ -165,10 +165,16 @@ class TF3Painter extends TH2Painter { let z = 0; try { - for (let k = 0; k < npz; ++k) + for (let k = 0; k < npz; ++k) { arrv[k] = func.evalPar(x, y, arrz[k]); - - z = findZValue(arrz, arrv); + if (!Number.isFinite(arrv[k])) { + iserror = true; + break; + } + } + + if (!iserror) + z = findZValue(arrz, arrv); } catch { iserror = true; }