@highcharts/grid-pro 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/css/grid-pro.css +3 -3
  2. package/css/modules/grid-pro.css +1 -1
  3. package/es-modules/Accessibility/Components/ContainerComponent.js +0 -1
  4. package/es-modules/Accessibility/Components/InfoRegionsComponent.js +1 -2
  5. package/es-modules/Accessibility/Components/MenuComponent.js +0 -1
  6. package/es-modules/Accessibility/Components/RangeSelectorComponent.js +0 -1
  7. package/es-modules/Accessibility/Components/SeriesComponent/ForcedMarkers.js +21 -9
  8. package/es-modules/Accessibility/Components/SeriesComponent/NewDataAnnouncer.js +0 -3
  9. package/es-modules/Accessibility/Components/SeriesComponent/SeriesComponent.js +0 -1
  10. package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +0 -1
  11. package/es-modules/Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js +0 -2
  12. package/es-modules/Accessibility/FocusBorder.js +5 -5
  13. package/es-modules/Accessibility/Options/DeprecatedOptions.js +1 -2
  14. package/es-modules/Accessibility/ProxyElement.d.ts +2 -2
  15. package/es-modules/Accessibility/ProxyElement.js +2 -2
  16. package/es-modules/Accessibility/Utils/ChartUtilities.js +0 -1
  17. package/es-modules/Accessibility/Utils/HTMLUtilities.js +0 -1
  18. package/es-modules/Core/Chart/Chart.js +8 -1
  19. package/es-modules/Core/Chart/ChartNavigationComposition.js +0 -1
  20. package/es-modules/Core/Chart/MapChart.js +2 -0
  21. package/es-modules/Core/Color/Color.js +0 -1
  22. package/es-modules/Core/Defaults.js +0 -1
  23. package/es-modules/Core/Delaunay.d.ts +0 -51
  24. package/es-modules/Core/Delaunay.js +5 -3
  25. package/es-modules/Core/Foundation.js +0 -1
  26. package/es-modules/Core/Globals.js +1 -1
  27. package/es-modules/Core/MSPointer.js +0 -1
  28. package/es-modules/Core/Renderer/HTML/HTMLAttributes.d.ts +3 -0
  29. package/es-modules/Core/Renderer/RendererUtilities.js +0 -1
  30. package/es-modules/Core/Renderer/SVG/SVGRenderer.d.ts +1 -1
  31. package/es-modules/Core/Renderer/SVG/Symbols.d.ts +2 -2
  32. package/es-modules/Core/Utilities.js +4 -2
  33. package/es-modules/Data/Connectors/DataConnector.d.ts +4 -4
  34. package/es-modules/Data/Connectors/DataConnector.js +4 -4
  35. package/es-modules/Data/DataPool.js +2 -2
  36. package/es-modules/Grid/Core/Globals.d.ts +2 -2
  37. package/es-modules/Grid/Core/Globals.js +1 -1
  38. package/es-modules/Grid/Core/Grid.js +4 -4
  39. package/es-modules/Grid/Core/Pagination/Pagination.js +5 -5
  40. package/es-modules/Grid/Core/Querying/PaginationController.d.ts +1 -1
  41. package/es-modules/Grid/Core/Querying/PaginationController.js +4 -3
  42. package/es-modules/Grid/Core/Responsive/ResponsiveComposition.js +53 -10
  43. package/es-modules/Grid/Core/Table/Actions/RowsVirtualizer.js +15 -1
  44. package/es-modules/Grid/Pro/Credits/CreditsProComposition.d.ts +1 -1
  45. package/es-modules/Grid/Pro/Data/DataSourceHelper.js +20 -10
  46. package/es-modules/Shared/Utilities.js +3 -11
  47. package/es-modules/masters/grid-pro.src.d.ts +3 -3
  48. package/es-modules/masters/grid-pro.src.js +1 -1
  49. package/grid-pro.d.ts +3 -3
  50. package/grid-pro.js +3 -3
  51. package/grid-pro.js.map +1 -1
  52. package/grid-pro.src.d.ts +3 -3
  53. package/grid-pro.src.js +117 -57
  54. package/package.json +1 -1
package/grid-pro.src.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts Grid Pro v2.3.0 (2026-03-12)
2
+ * @license Highcharts Grid Pro v2.3.1 (2026-03-24)
3
3
  * @module grid/grid-pro
4
4
  *
5
5
  * (c) 2009-2026 Highsoft AS
@@ -112,11 +112,11 @@ declare const G: {
112
112
  helpers: Record<string, Function>;
113
113
  numberFormat: (this: Templating.Owner | void, number: number, decimals: number, decimalPoint?: string, thousandsSep?: string) => string;
114
114
  };
115
- readonly version: "2.3.0";
115
+ readonly version: "2.3.1";
116
116
  readonly win: Window & typeof globalThis;
117
117
  };
118
118
  export { AST, CellContentPro, CellRenderer, CellRendererRegistry, Column, ColumnResizing, DataConnector, DataConverter, DataCursor, DataModifier, DataProviderRegistry, DataPool, DataTable, _Grid as Grid, HeaderCell, _Options as Options, Pagination, Popup, SvgIcons, Table, TableCell, Templating };
119
- export declare const classNamePrefix: string, defaultOptions: import("./es-modules/Shared/Types").DeepPartial<_Options>, grid: typeof _Grid.grid, grids: (_Grid | undefined)[], isHighContrastModeActive: () => boolean, product: "Grid Pro", setOptions: typeof import("./es-modules/Grid/Core/Defaults.js").setOptions, version: "2.3.0", win: Window & typeof globalThis;
119
+ export declare const classNamePrefix: string, defaultOptions: import("./es-modules/Shared/Types").DeepPartial<_Options>, grid: typeof _Grid.grid, grids: (_Grid | undefined)[], isHighContrastModeActive: () => boolean, product: "Grid Pro", setOptions: typeof import("./es-modules/Grid/Core/Defaults.js").setOptions, version: "2.3.1", win: Window & typeof globalThis;
120
120
  declare namespace G {
121
121
  type Options = _Options;
122
122
  }
package/grid-pro.src.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: LicenseRef-Highcharts
2
2
  /**
3
- * @license Highcharts Grid Pro v2.3.0 (2026-03-12)
3
+ * @license Highcharts Grid Pro v2.3.1 (2026-03-24)
4
4
  * @module grid/grid-pro
5
5
  *
6
6
  * (c) 2009-2026 Highsoft AS
@@ -79,7 +79,7 @@ var Globals;
79
79
  * Constants
80
80
  *
81
81
  * */
82
- Globals.SVG_NS = 'http://www.w3.org/2000/svg', Globals.product = 'Highcharts', Globals.version = '2.3.0', Globals.win = (typeof window !== 'undefined' ?
82
+ Globals.SVG_NS = 'http://www.w3.org/2000/svg', Globals.product = 'Highcharts', Globals.version = '2.3.1', Globals.win = (typeof window !== 'undefined' ?
83
83
  window :
84
84
  {}), // eslint-disable-line node/no-unsupported-features/es-builtins
85
85
  Globals.doc = Globals.win.document, Globals.svg = !!Globals.doc?.createElementNS?.(Globals.SVG_NS, 'svg')?.createSVGRect, Globals.pageLang = Globals.doc?.documentElement?.closest('[lang]')?.lang, Globals.userAgent = Globals.win.navigator?.userAgent || '', Globals.isChrome = Globals.win.chrome, Globals.isFirefox = Globals.userAgent.indexOf('Firefox') !== -1, Globals.isMS = /(edge|msie|trident)/i.test(Globals.userAgent) && !Globals.win.opera, Globals.isSafari = !Globals.isChrome && Globals.userAgent.indexOf('Safari') !== -1, Globals.isTouchDevice = /(Mobile|Android|Windows Phone)/.test(Globals.userAgent), Globals.isWebKit = Globals.userAgent.indexOf('AppleWebKit') !== -1, Globals.deg2rad = Math.PI * 2 / 360, Globals.marginNames = [
@@ -191,7 +191,6 @@ var Globals;
191
191
  * */
192
192
 
193
193
  const { doc, win } = Core_Globals;
194
- /* eslint-disable valid-jsdoc */
195
194
  /**
196
195
  * Add an event listener.
197
196
  *
@@ -217,7 +216,6 @@ const { doc, win } = Core_Globals;
217
216
  * A callback function to remove the added event.
218
217
  */
219
218
  function addEvent(el, type, fn, options = {}) {
220
- /* eslint-enable valid-jsdoc */
221
219
  // Add hcEvents to either the prototype (in case we're running addEvent on a
222
220
  // class) or the instance. If hasOwnProperty('hcEvents') is false, it is
223
221
  // inherited down the prototype chain, in which case we need to set the
@@ -616,7 +614,6 @@ function erase(arr, item) {
616
614
  * Object a, the original object.
617
615
  */
618
616
  function extend(a, b) {
619
- /* eslint-enable valid-jsdoc */
620
617
  let n;
621
618
  if (!a) {
622
619
  a = {};
@@ -649,7 +646,6 @@ function extendClass(parent, members) {
649
646
  extend(obj.prototype, members);
650
647
  return obj;
651
648
  }
652
- /* eslint-disable valid-jsdoc */
653
649
  /**
654
650
  * Fire an event that was registered with {@link Highcharts#addEvent}.
655
651
  *
@@ -673,7 +669,6 @@ function extendClass(parent, members) {
673
669
  * @return {void}
674
670
  */
675
671
  function fireEvent(el, type, eventArguments, defaultFunction) {
676
- /* eslint-enable valid-jsdoc */
677
672
  eventArguments = eventArguments || {};
678
673
  if (doc?.createEvent &&
679
674
  (el.dispatchEvent ||
@@ -810,7 +805,7 @@ function getMagnitude(num) {
810
805
  * @param {string} path
811
806
  * Path to the property, for example `custom.myValue`.
812
807
  *
813
- * @param {unknown} obj
808
+ * @param {unknown} parent
814
809
  * Instance containing the property on the specific path.
815
810
  *
816
811
  * @return {unknown}
@@ -1184,7 +1179,6 @@ function normalizeTickInterval(interval, multiples, magnitude, allowDecimals, ha
1184
1179
  retInterval = correctFloat(retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10));
1185
1180
  return retInterval;
1186
1181
  }
1187
- /* eslint-disable valid-jsdoc */
1188
1182
  /**
1189
1183
  * Iterate over object key pairs in an object.
1190
1184
  *
@@ -1203,7 +1197,6 @@ function normalizeTickInterval(interval, multiples, magnitude, allowDecimals, ha
1203
1197
  * The context.
1204
1198
  */
1205
1199
  function objectEach(obj, fn, ctx) {
1206
- /* eslint-enable valid-jsdoc */
1207
1200
  for (const key in obj) {
1208
1201
  if (Object.hasOwnProperty.call(obj, key)) {
1209
1202
  fn.call(ctx || obj[key], obj[key], key, obj);
@@ -1259,7 +1252,7 @@ function pad(number, length, padder) {
1259
1252
  .replace('-', '')
1260
1253
  .length).join(padder || '0') + number;
1261
1254
  }
1262
- /* eslint-disable valid-jsdoc */
1255
+ /* eslint-disable jsdoc/check-param-names */
1263
1256
  /**
1264
1257
  * Return the first value that is not null or undefined.
1265
1258
  *
@@ -1281,6 +1274,7 @@ function Utilities_pick() {
1281
1274
  }
1282
1275
  }
1283
1276
  }
1277
+ /* eslint-enable jsdoc/check-param-names */
1284
1278
  /**
1285
1279
  * Shortcut for parseInt
1286
1280
  *
@@ -1369,7 +1363,6 @@ function replaceNested(text, ...replacements) {
1369
1363
  } while (text !== previous);
1370
1364
  return text;
1371
1365
  }
1372
- /* eslint-disable valid-jsdoc */
1373
1366
  /**
1374
1367
  * Remove an event that was added with {@link Highcharts#addEvent}.
1375
1368
  *
@@ -1389,7 +1382,6 @@ function replaceNested(text, ...replacements) {
1389
1382
  * @return {void}
1390
1383
  */
1391
1384
  function removeEvent(el, type, fn) {
1392
- /* eslint-enable valid-jsdoc */
1393
1385
  /** @internal */
1394
1386
  function removeOneEvent(type, fn) {
1395
1387
  const removeEventListener = el.removeEventListener;
@@ -1764,6 +1756,7 @@ if (Utilities_win.jQuery) {
1764
1756
  *
1765
1757
  * @external JQuery
1766
1758
  */
1759
+ /* eslint-disable jsdoc/check-param-names */
1767
1760
  /**
1768
1761
  * Helper function to return the chart of the current JQuery selector
1769
1762
  * element.
@@ -1808,6 +1801,7 @@ if (Utilities_win.jQuery) {
1808
1801
  return charts[attr(this[0], 'data-highcharts-chart')];
1809
1802
  }
1810
1803
  };
1804
+ /* eslint-enable jsdoc/check-param-names */
1811
1805
  }
1812
1806
  /* *
1813
1807
  *
@@ -1867,7 +1861,7 @@ if (Utilities_win.jQuery) {
1867
1861
  */ /**
1868
1862
  * Radius of the element border.
1869
1863
  * @name Highcharts.CSSObject#borderRadius
1870
- * @type {number|undefined}
1864
+ * @type {string|undefined}
1871
1865
  */ /**
1872
1866
  * Color used in the element. The 'contrast' option is a Highcharts custom
1873
1867
  * property that results in black or white, depending on the background of the
@@ -1886,7 +1880,7 @@ if (Utilities_win.jQuery) {
1886
1880
  */ /**
1887
1881
  * Font size of the element text.
1888
1882
  * @name Highcharts.CSSObject#fontSize
1889
- * @type {string|undefined}
1883
+ * @type {number|string|undefined}
1890
1884
  */ /**
1891
1885
  * Font weight of the element text.
1892
1886
  * @name Highcharts.CSSObject#fontWeight
@@ -6177,7 +6171,6 @@ const defaultOptions = {
6177
6171
  * @since 1.3
6178
6172
  * @apioption legend.labelFormat
6179
6173
  */
6180
- /* eslint-disable valid-jsdoc */
6181
6174
  /**
6182
6175
  * Callback function to format each of the series' labels. The `this`
6183
6176
  * keyword refers to the series object, or the point object in case of
@@ -10700,10 +10693,10 @@ class DataConnector {
10700
10693
  /**
10701
10694
  * Updates the connector with new options.
10702
10695
  *
10703
- * @param newOptions
10696
+ * @param {object} newOptions
10704
10697
  * The new options to be applied to the connector.
10705
10698
  *
10706
- * @param reload
10699
+ * @param {boolean} [reload=true]
10707
10700
  * Whether to reload the connector after applying the new options.
10708
10701
  */
10709
10702
  async update(newOptions, reload = true) {
@@ -10808,10 +10801,10 @@ class DataConnector {
10808
10801
  /**
10809
10802
  * Registers a callback for a specific connector event.
10810
10803
  *
10811
- * @param type
10804
+ * @param {string} type
10812
10805
  * Event type.
10813
10806
  *
10814
- * @param callback
10807
+ * @param {Function} callback
10815
10808
  * Function to register for the connector callback.
10816
10809
  *
10817
10810
  * @return {Function}
@@ -11919,7 +11912,7 @@ const whcm = {
11919
11912
  *
11920
11913
  * */
11921
11914
  const classNamePrefix = 'hcg-';
11922
- const version = '2.3.0';
11915
+ const version = '2.3.1';
11923
11916
  const rawClassNames = {
11924
11917
  container: 'container',
11925
11918
  tableElement: 'table',
@@ -12742,7 +12735,6 @@ const simulatedEventTarget = HTMLUtilities_win.EventTarget && new HTMLUtilities_
12742
12735
  * Functions
12743
12736
  *
12744
12737
  * */
12745
- /* eslint-disable valid-jsdoc */
12746
12738
  /**
12747
12739
  * @private
12748
12740
  * @param {Highcharts.HTMLDOMElement} el
@@ -14045,7 +14037,7 @@ class Pagination {
14045
14037
  return;
14046
14038
  }
14047
14039
  const { currentPage, currentPageSize, totalItems, totalPages } = this.controller;
14048
- const startItem = (currentPage - 1) * currentPageSize + 1;
14040
+ const startItem = Math.min(Math.max(0, (currentPage - 1) * currentPageSize + 1), totalItems);
14049
14041
  const endItem = Math.min(currentPage * currentPageSize, totalItems);
14050
14042
  const pageInfoText = Pagination_formatText(this.lang?.pageInfo ?? '', {
14051
14043
  start: startItem,
@@ -14590,10 +14582,10 @@ class Pagination {
14590
14582
  * Destroy the pagination instance.
14591
14583
  */
14592
14584
  destroy() {
14593
- const position = this.options?.position;
14594
- if (position === 'footer') {
14595
- // For footer position, remove the entire tfoot element.
14596
- this.paginationContainer?.parentElement?.parentElement?.remove();
14585
+ // Fixed container removal when switching from custom to footer.
14586
+ const tfoot = this.paginationContainer?.closest('tfoot');
14587
+ if (tfoot) {
14588
+ tfoot.remove();
14597
14589
  }
14598
14590
  else {
14599
14591
  this.contentWrapper?.remove();
@@ -19141,8 +19133,22 @@ class RowsVirtualizer {
19141
19133
  // Render missing rows, drop out-of-range ones, and ensure last row.
19142
19134
  await this.renderRows(this.rowCursor);
19143
19135
  const rows = this.viewport.rows;
19136
+ // For non-virtualized rows, re-order rows to match data order.
19137
+ if (!this.viewport.virtualRows) {
19138
+ let node = tbody.firstElementChild;
19139
+ for (let i = 0, iEnd = rows.length; i < iEnd; ++i) {
19140
+ if (node === rows[i].htmlElement) {
19141
+ node = node.nextElementSibling;
19142
+ continue;
19143
+ }
19144
+ // Mismatch found, so append the rest in the correct order.
19145
+ for (let j = i; j < iEnd; ++j) {
19146
+ tbody.appendChild(rows[j].htmlElement);
19147
+ }
19148
+ break;
19149
+ }
19150
+ }
19144
19151
  for (let i = 0, iEnd = rows.length; i < iEnd; ++i) {
19145
- // Update row data so indices map to fresh provider values.
19146
19152
  await rows[i].update();
19147
19153
  }
19148
19154
  if (this.viewport.virtualRows && defined(oldScrollTop)) {
@@ -21483,13 +21489,14 @@ class PaginationController {
21483
21489
  return this.currentPageSize > 0 ? Math.ceil(this.totalItems / this.currentPageSize) : 1;
21484
21490
  }
21485
21491
  /**
21486
- * Clamps the current page to the total number of pages.
21492
+ * Clamps the current page to the valid range [1, totalPages].
21487
21493
  */
21488
21494
  clampPage() {
21489
- if (this.currentPage <= this.totalPages) {
21495
+ const target = Math.max(1, Math.min(this.currentPage, this.totalPages || 1));
21496
+ if (this.currentPage === target) {
21490
21497
  return;
21491
21498
  }
21492
- this.currentPage = this.totalPages;
21499
+ this.currentPage = target;
21493
21500
  this.querying.shouldBeUpdated = true;
21494
21501
  }
21495
21502
  /**
@@ -22550,14 +22557,14 @@ class Grid {
22550
22557
  */
22551
22558
  async renderViewport() {
22552
22559
  const viewportMeta = this.viewport?.getStateMeta();
22553
- const pagination = this.pagination;
22554
- const paginationPosition = pagination?.options?.position;
22555
- this.enabledColumns = await this.getEnabledColumnIDs();
22556
22560
  this.credits?.destroy();
22557
22561
  this.viewport?.destroy();
22558
22562
  delete this.viewport;
22559
- this.resetContentWrapper();
22560
22563
  fireEvent(this, 'beforeRenderViewport');
22564
+ this.resetContentWrapper();
22565
+ this.enabledColumns = await this.getEnabledColumnIDs();
22566
+ const pagination = this.pagination;
22567
+ const paginationPosition = pagination?.options?.position;
22561
22568
  this.renderCaption();
22562
22569
  // Render top pagination if enabled (before table)
22563
22570
  if (paginationPosition === 'top') {
@@ -23081,10 +23088,10 @@ class DataPool {
23081
23088
  /**
23082
23089
  * Sets connector options under the specified `options.id`.
23083
23090
  *
23084
- * @param options
23091
+ * @param {object} options
23085
23092
  * Connector options to set.
23086
23093
  *
23087
- * @param update
23094
+ * @param {boolean} [update]
23088
23095
  * Whether to update the existing connector with the new options and reload
23089
23096
  * it (`true`) or replace it with a new connector instance (`false`).
23090
23097
  */
@@ -23182,14 +23189,36 @@ function compose(GridClass) {
23182
23189
  */
23183
23190
  function initResizeObserver() {
23184
23191
  destroyResizeObserver.call(this);
23185
- if (!this.container) {
23192
+ if (!this.container || !this.contentWrapper) {
23186
23193
  return;
23187
23194
  }
23188
23195
  this.activeRules = new Set();
23196
+ // Synchronously evaluate responsive rules so the first render already
23197
+ // uses the correct options (avoids a redundant second render).
23198
+ if (!this.updatingResponsive) {
23199
+ const rules = this.options?.responsive?.rules || [];
23200
+ if (rules.length > 0) {
23201
+ const { clientWidth: width, clientHeight: height } = this.container;
23202
+ const fakeEntry = {
23203
+ contentRect: { width, height }
23204
+ };
23205
+ const matchingRules = [];
23206
+ for (const rule of rules) {
23207
+ if (typeof rule._id === 'undefined') {
23208
+ rule._id = uniqueKey();
23209
+ }
23210
+ if (matchResponsiveRule.call(this, rule, fakeEntry)) {
23211
+ matchingRules.push(rule);
23212
+ }
23213
+ }
23214
+ this.activeRules = new Set(matchingRules);
23215
+ setResponsive.call(this, matchingRules, false);
23216
+ }
23217
+ }
23189
23218
  this.resizeObserver = new ResizeObserver((entries) => {
23190
23219
  onResize.call(this, entries[0]);
23191
23220
  });
23192
- this.resizeObserver.observe(this.container);
23221
+ this.resizeObserver.observe(this.contentWrapper);
23193
23222
  }
23194
23223
  /**
23195
23224
  * Destroys the resize observer.
@@ -23229,20 +23258,28 @@ function matchResponsiveRule(rule, entry) {
23229
23258
  *
23230
23259
  * @param matchingRules
23231
23260
  * Active responsive rules.
23261
+ *
23262
+ * @param redraw
23263
+ * Whether to redraw the grid. Default is `true`.
23232
23264
  */
23233
- function setResponsive(matchingRules) {
23265
+ function setResponsive(matchingRules, redraw = true) {
23234
23266
  const ruleIds = matchingRules.map((rule) => rule._id);
23235
23267
  const ruleIdsString = (ruleIds.toString() || void 0);
23236
23268
  const currentRuleIds = this.currentResponsive?.ruleIds;
23237
- if (ruleIdsString === currentRuleIds) {
23269
+ if (ruleIdsString === currentRuleIds || this.updatingResponsive) {
23238
23270
  return;
23239
23271
  }
23272
+ this.updatingResponsive = true;
23273
+ let lastUpdate;
23240
23274
  if (this.currentResponsive) {
23241
23275
  const undoOptions = this.currentResponsive.undoOptions;
23242
23276
  this.currentResponsive = void 0;
23243
- this.updatingResponsive = true;
23244
- void this.update(undoOptions, true);
23245
- this.updatingResponsive = false;
23277
+ if (redraw) {
23278
+ lastUpdate = this.update(undoOptions, true);
23279
+ }
23280
+ else {
23281
+ this.update(undoOptions, false);
23282
+ }
23246
23283
  }
23247
23284
  if (ruleIdsString) {
23248
23285
  const mergedOptions = merge(...matchingRules.map((rule) => rule.gridOptions));
@@ -23259,9 +23296,22 @@ function setResponsive(matchingRules) {
23259
23296
  mergedOptions,
23260
23297
  undoOptions
23261
23298
  };
23262
- if (!this.updatingResponsive) {
23263
- void this.update(mergedOptions, true);
23299
+ if (redraw) {
23300
+ lastUpdate = this.update(mergedOptions, true);
23264
23301
  }
23302
+ else {
23303
+ this.update(mergedOptions, false);
23304
+ }
23305
+ }
23306
+ // Keep the flag alive until the last queued update finishes so that
23307
+ // ResizeObserver callbacks arriving in the meantime are ignored.
23308
+ if (lastUpdate !== void 0) {
23309
+ void lastUpdate.then(() => {
23310
+ this.updatingResponsive = false;
23311
+ });
23312
+ }
23313
+ else {
23314
+ this.updatingResponsive = false;
23265
23315
  }
23266
23316
  }
23267
23317
  /**
@@ -23342,7 +23392,7 @@ function syncColumnIds(undoOptions, mergedOptions) {
23342
23392
  * The resize observer entry.
23343
23393
  */
23344
23394
  function onResize(entry) {
23345
- if (!this.activeRules) {
23395
+ if (!this.activeRules || this.updatingResponsive) {
23346
23396
  return;
23347
23397
  }
23348
23398
  const rules = this.options?.responsive?.rules || [];
@@ -29742,9 +29792,11 @@ const filterOperatorMap = {
29742
29792
  '<': 'lessThan',
29743
29793
  '<=': 'lessThanOrEqualTo',
29744
29794
  contains: 'contains',
29795
+ notContains: 'doesNotContain',
29745
29796
  startsWith: 'beginsWith',
29746
29797
  endsWith: 'endsWith',
29747
- empty: 'empty'
29798
+ empty: 'empty',
29799
+ notEmpty: 'notEmpty'
29748
29800
  };
29749
29801
  /**
29750
29802
  * Recursively extracts filter conditions from the Grid's FilterCondition
@@ -29764,21 +29816,29 @@ function extractFilterConditions(condition, filterColumns = []) {
29764
29816
  return filterColumns;
29765
29817
  }
29766
29818
  if (condition.operator === 'and' || condition.operator === 'or') {
29767
- // Logical condition - extract from nested conditions
29768
29819
  if (condition.conditions) {
29769
29820
  for (const subCondition of condition.conditions) {
29770
29821
  extractFilterConditions(subCondition, filterColumns);
29771
29822
  }
29772
29823
  }
29773
29824
  }
29774
- else if (condition.columnId) {
29775
- // Single condition
29776
- const mappedOperator = filterOperatorMap[condition.operator] || condition.operator;
29777
- filterColumns.push({
29778
- id: condition.columnId,
29779
- condition: mappedOperator,
29780
- value: condition.value
29781
- });
29825
+ else if (condition.columnId || condition.condition?.columnId) {
29826
+ const conditionToUse = condition.columnId ?
29827
+ condition : condition.condition;
29828
+ let key = conditionToUse.operator;
29829
+ if (condition.operator === 'not') {
29830
+ key = condition.operator +
29831
+ conditionToUse.operator.charAt(0).toUpperCase() +
29832
+ conditionToUse.operator.slice(1);
29833
+ }
29834
+ const mapped = filterOperatorMap[key] || conditionToUse.operator;
29835
+ if (conditionToUse.columnId) {
29836
+ filterColumns.push({
29837
+ id: conditionToUse.columnId,
29838
+ condition: mapped,
29839
+ value: conditionToUse.value
29840
+ });
29841
+ }
29782
29842
  }
29783
29843
  return filterColumns;
29784
29844
  }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@highcharts/grid-pro",
3
3
  "description": "Highcharts Grid Pro framework",
4
4
  "homepage": "https://www.highcharts.com/products/grid/",
5
- "version": "2.3.0",
5
+ "version": "2.3.1",
6
6
  "author": "Highsoft AS <support@highcharts.com> (http://www.highcharts.com/about)",
7
7
  "main": "grid-pro.js",
8
8
  "module": "./es-modules/masters/grid-pro.src.js",