@revolist/revogrid 4.21.4 → 4.21.6

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/dist/cjs/{cell-renderer-BLcxDHzP.js → cell-renderer-DW8i7ULg.js} +2 -2
  2. package/dist/cjs/{column.drag.plugin-DfTAC5Qc.js → column.drag.plugin-BWX5_5iT.js} +107 -28
  3. package/dist/cjs/{column.service-BmT2HOnj.js → column.service-DvQDqxxx.js} +1 -1
  4. package/dist/cjs/{dimension.helpers-BOxHtX5T.js → dimension.helpers-CaIsYC99.js} +1 -1
  5. package/dist/cjs/{edit.utils-DnvQVP4H.js → edit.utils-CwMzSIVF.js} +1 -1
  6. package/dist/cjs/{header-cell-renderer-7DgGThjq.js → header-cell-renderer-B1dJwgTO.js} +1 -1
  7. package/dist/cjs/index.cjs.js +12 -8
  8. package/dist/cjs/revo-grid.cjs.entry.js +5 -5
  9. package/dist/cjs/revogr-attribution_7.cjs.entry.js +5 -5
  10. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +3 -3
  11. package/dist/cjs/revogr-data_4.cjs.entry.js +5 -5
  12. package/dist/cjs/{text-editor-B9ibcdrl.js → text-editor-BTnGaIl3.js} +2 -2
  13. package/dist/cjs/{throttle-DkuCcmB0.js → throttle-CI4MsAqs.js} +1 -1
  14. package/dist/cjs/{viewport.store-DG-4bWqg.js → viewport.store-Dcjud-a-.js} +1 -1
  15. package/dist/collection/plugins/column.auto-size.plugin.js +11 -2
  16. package/dist/collection/plugins/filter/filter.plugin.js +2 -1
  17. package/dist/collection/plugins/groupingRow/grouping.row.plugin.js +21 -11
  18. package/dist/collection/plugins/groupingRow/grouping.trimmed.service.js +81 -12
  19. package/dist/{revo-grid/cell-renderer-BNeaYjy6.js → esm/cell-renderer-CqVunVBY.js} +2 -2
  20. package/dist/esm/{column.drag.plugin-C9lvlTfl.js → column.drag.plugin-6YvuxWof.js} +108 -29
  21. package/dist/esm/{column.service-8pPNyrKn.js → column.service-Cdz3dYqZ.js} +1 -1
  22. package/dist/{revo-grid/dimension.helpers-B-5OBYes.js → esm/dimension.helpers-DzxqJQqN.js} +1 -1
  23. package/dist/esm/{edit.utils-CQjRmx5n.js → edit.utils-CzfeG98N.js} +1 -1
  24. package/dist/{revo-grid/header-cell-renderer-WkTbrmr7.js → esm/header-cell-renderer-DXhxZMly.js} +1 -1
  25. package/dist/esm/index.js +9 -9
  26. package/dist/esm/revo-grid.entry.js +5 -5
  27. package/dist/esm/revogr-attribution_7.entry.js +5 -5
  28. package/dist/esm/revogr-clipboard_3.entry.js +3 -3
  29. package/dist/esm/revogr-data_4.entry.js +5 -5
  30. package/dist/{revo-grid/text-editor-DZSx2pWr.js → esm/text-editor-C1ks5eQ4.js} +2 -2
  31. package/dist/esm/{throttle-CYM0qC3v.js → throttle-BEjFQa2l.js} +1 -1
  32. package/dist/{revo-grid/viewport.store-BGWR3XfI.js → esm/viewport.store-saAZJHRo.js} +1 -1
  33. package/dist/{esm/cell-renderer-BNeaYjy6.js → revo-grid/cell-renderer-CqVunVBY.js} +2 -2
  34. package/dist/revo-grid/{column.drag.plugin-C9lvlTfl.js → column.drag.plugin-6YvuxWof.js} +108 -29
  35. package/dist/revo-grid/{column.service-8pPNyrKn.js → column.service-Cdz3dYqZ.js} +1 -1
  36. package/dist/{esm/dimension.helpers-B-5OBYes.js → revo-grid/dimension.helpers-DzxqJQqN.js} +1 -1
  37. package/dist/revo-grid/{edit.utils-CQjRmx5n.js → edit.utils-CzfeG98N.js} +1 -1
  38. package/dist/{esm/header-cell-renderer-WkTbrmr7.js → revo-grid/header-cell-renderer-DXhxZMly.js} +1 -1
  39. package/dist/revo-grid/index.esm.js +9 -9
  40. package/dist/revo-grid/revo-grid.entry.js +5 -5
  41. package/dist/revo-grid/revogr-attribution_7.entry.js +5 -5
  42. package/dist/revo-grid/revogr-clipboard_3.entry.js +3 -3
  43. package/dist/revo-grid/revogr-data_4.entry.js +5 -5
  44. package/dist/{esm/text-editor-DZSx2pWr.js → revo-grid/text-editor-C1ks5eQ4.js} +2 -2
  45. package/dist/revo-grid/{throttle-CYM0qC3v.js → throttle-BEjFQa2l.js} +1 -1
  46. package/dist/{esm/viewport.store-BGWR3XfI.js → revo-grid/viewport.store-saAZJHRo.js} +1 -1
  47. package/dist/types/plugins/column.auto-size.plugin.d.ts +1 -1
  48. package/dist/types/plugins/groupingRow/grouping.row.plugin.d.ts +1 -0
  49. package/dist/types/plugins/groupingRow/grouping.trimmed.service.d.ts +18 -0
  50. package/hydrate/index.js +104 -25
  51. package/hydrate/index.mjs +104 -25
  52. package/package.json +4 -3
  53. package/standalone/index.js +1 -1
  54. package/standalone/revo-grid.js +1 -1
package/hydrate/index.js CHANGED
@@ -8543,7 +8543,7 @@ function setCacheAdd(value) {
8543
8543
  * @name has
8544
8544
  * @memberOf SetCache
8545
8545
  * @param {*} value The value to search for.
8546
- * @returns {number} Returns `true` if `value` is found, else `false`.
8546
+ * @returns {boolean} Returns `true` if `value` is found, else `false`.
8547
8547
  */
8548
8548
  function setCacheHas(value) {
8549
8549
  return this.__data__.has(value);
@@ -15009,6 +15009,15 @@ class BasePlugin {
15009
15009
  * Add support for automatic column resize
15010
15010
  */
15011
15011
  const LETTER_BLOCK_SIZE = 7;
15012
+ var ColumnAutoSizeMode;
15013
+ (function (ColumnAutoSizeMode) {
15014
+ // increases column width on header click according the largest text value
15015
+ ColumnAutoSizeMode["headerClickAutosize"] = "headerClickAutoSize";
15016
+ // increases column width on data set and text edit, decreases performance
15017
+ ColumnAutoSizeMode["autoSizeOnTextOverlap"] = "autoSizeOnTextOverlap";
15018
+ // increases and decreases column width based on all items sizes, worst for performance
15019
+ ColumnAutoSizeMode["autoSizeAll"] = "autoSizeAll";
15020
+ })(ColumnAutoSizeMode || (ColumnAutoSizeMode = {}));
15012
15021
  class AutoSizeColumnPlugin extends BasePlugin {
15013
15022
  constructor(revogrid, providers, config) {
15014
15023
  super(revogrid, providers);
@@ -15032,13 +15041,13 @@ class AutoSizeColumnPlugin extends BasePlugin {
15032
15041
  };
15033
15042
  this.addEventListener('beforecolumnsset', beforecolumnsset);
15034
15043
  switch (config === null || config === void 0 ? void 0 : config.mode) {
15035
- case "autoSizeOnTextOverlap" /* ColumnAutoSizeMode.autoSizeOnTextOverlap */:
15044
+ case ColumnAutoSizeMode.autoSizeOnTextOverlap:
15036
15045
  this.addEventListener('aftersourceset', aftersourceset);
15037
15046
  this.addEventListener('afteredit', ({ detail }) => {
15038
15047
  this.afteredit(detail);
15039
15048
  });
15040
15049
  break;
15041
- case "autoSizeAll" /* ColumnAutoSizeMode.autoSizeAll */:
15050
+ case ColumnAutoSizeMode.autoSizeAll:
15042
15051
  this.addEventListener('aftersourceset', aftersourceset);
15043
15052
  this.addEventListener('afteredit', ({ detail }) => {
15044
15053
  this.afterEditAll(detail);
@@ -15420,6 +15429,7 @@ class FilterPlugin extends BasePlugin {
15420
15429
  if (Object.keys(this.multiFilterItems).length === 0) {
15421
15430
  return;
15422
15431
  }
15432
+ await timeout();
15423
15433
  await this.runFiltering(this.multiFilterItems);
15424
15434
  };
15425
15435
  this.addEventListener('headerclick', e => this.headerclick(e));
@@ -16584,6 +16594,23 @@ function doExpand(vIndex, source, rowItemsIndexes) {
16584
16594
  }
16585
16595
 
16586
16596
  const TRIMMED_GROUPING = 'grouping';
16597
+ /**
16598
+ * Converts a trim row index through the index maps produced while regrouping.
16599
+ *
16600
+ * Group rows are synthetic, so they may not exist in the first map. When a
16601
+ * second map is available, fall back to the original index so trims created
16602
+ * against the grouped physical source can still be remapped. If neither path
16603
+ * resolves to a number, the caller drops the stale trim entry.
16604
+ */
16605
+ function convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap) {
16606
+ const sourceIndex = Number.parseInt(initialIndex, 10);
16607
+ const firstConversionIndex = firstLevelMap[sourceIndex];
16608
+ if (!secondLevelMap) {
16609
+ return firstConversionIndex;
16610
+ }
16611
+ const secondConversionKey = typeof firstConversionIndex === 'number' ? firstConversionIndex : sourceIndex;
16612
+ return secondLevelMap[secondConversionKey];
16613
+ }
16587
16614
  /**
16588
16615
  * Prepare trimming updated indexes for grouping
16589
16616
  * @param initiallyTrimed
@@ -16602,31 +16629,73 @@ function processDoubleConversionTrimmed(initiallyTrimed, firstLevelMap, secondLe
16602
16629
  const items = initiallyTrimed[type];
16603
16630
  const newItems = {};
16604
16631
  for (let initialIndex in items) {
16632
+ if (!items[initialIndex]) {
16633
+ continue;
16634
+ }
16605
16635
  /**
16606
16636
  * if item exists we find it in collection
16607
16637
  * we support 2 level of conversions
16608
16638
  */
16609
- let newConversionIndex = firstLevelMap[initialIndex];
16610
- if (secondLevelMap) {
16611
- newConversionIndex = secondLevelMap[newConversionIndex];
16639
+ const newConversionIndex = convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap);
16640
+ // Group rows do not exist in the ungrouped index map and must not leak into new trims.
16641
+ if (typeof newConversionIndex !== 'number') {
16642
+ continue;
16612
16643
  }
16613
16644
  /**
16614
16645
  * if item was trimmed previously
16615
16646
  * trimming makes sense to apply
16616
16647
  */
16617
- if (items[initialIndex]) {
16618
- newItems[newConversionIndex] = true;
16619
- /**
16620
- * If changes present apply changes to new source
16621
- */
16622
- if (newConversionIndex !== parseInt(initialIndex, 10)) {
16623
- trimemedOptionsToUpgrade[type] = newItems;
16624
- }
16625
- }
16648
+ newItems[newConversionIndex] = true;
16626
16649
  }
16650
+ trimemedOptionsToUpgrade[type] = newItems;
16627
16651
  }
16628
16652
  return trimemedOptionsToUpgrade;
16629
16653
  }
16654
+ function hasVisibleGroupItems(source, trimmed, groupIndex) {
16655
+ var _a;
16656
+ const depth = (_a = source[groupIndex]) === null || _a === void 0 ? void 0 : _a[GROUP_DEPTH];
16657
+ if (depth == null) {
16658
+ return false;
16659
+ }
16660
+ // A group is visible when at least one descendant data row survives filtering.
16661
+ for (let i = groupIndex + 1; i < source.length; i++) {
16662
+ const model = source[i];
16663
+ if (isGrouping(model)) {
16664
+ if (model[GROUP_DEPTH] <= depth) {
16665
+ break;
16666
+ }
16667
+ continue;
16668
+ }
16669
+ if (!trimmed[i]) {
16670
+ return true;
16671
+ }
16672
+ }
16673
+ return false;
16674
+ }
16675
+ /**
16676
+ * Preserves data-row filter results and recalculates group-row visibility
16677
+ * from the filtered state of each group's descendant data rows.
16678
+ *
16679
+ * @param source - Grouped row source that contains group rows and data rows.
16680
+ * @param filterTrimmed - Current filter trim map keyed by physical row index.
16681
+ * @returns Filter trim map with empty group rows hidden and matching group rows visible.
16682
+ */
16683
+ function filterOutEmptyGroupRows(source, filterTrimmed) {
16684
+ const trimmed = Object.assign({}, filterTrimmed);
16685
+ // Recalculate only group rows; data-row filter results are preserved as-is.
16686
+ source.forEach((model, index) => {
16687
+ if (!isGrouping(model)) {
16688
+ return;
16689
+ }
16690
+ if (hasVisibleGroupItems(source, trimmed, index)) {
16691
+ delete trimmed[index];
16692
+ }
16693
+ else {
16694
+ trimmed[index] = true;
16695
+ }
16696
+ });
16697
+ return trimmed;
16698
+ }
16630
16699
 
16631
16700
  const PADDING_DEPTH = 10;
16632
16701
  const RowRenderer = ({ rowClass, index, size, start, depth }, cells) => {
@@ -16736,16 +16805,18 @@ class GroupingRowPlugin extends BasePlugin {
16736
16805
  }
16737
16806
  }
16738
16807
  beforeTrimmedApply(trimmed, type) {
16739
- /** Before filter apply remove grouping filtering */
16808
+ /** Filter trim must keep group headers in sync with their visible children. */
16740
16809
  if (type === FILTER_TRIMMED_TYPE) {
16741
16810
  const source = this.getStore().get('source');
16742
- for (let index in trimmed) {
16743
- if (trimmed[index] && isGrouping(source[index])) {
16744
- trimmed[index] = false;
16745
- }
16746
- }
16811
+ const updatedTrimmed = filterOutEmptyGroupRows(source, trimmed);
16812
+ Object.keys(trimmed).forEach(index => delete trimmed[Number.parseInt(index, 10)]);
16813
+ Object.assign(trimmed, updatedTrimmed);
16747
16814
  }
16748
16815
  }
16816
+ beforeFilterTrimmed(trimmed) {
16817
+ const source = this.getStore().get('source');
16818
+ return filterOutEmptyGroupRows(source, trimmed);
16819
+ }
16749
16820
  isSortingRunning() {
16750
16821
  const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
16751
16822
  return !!(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sortingPromise);
@@ -16771,7 +16842,7 @@ class GroupingRowPlugin extends BasePlugin {
16771
16842
  const customRenderer = options === null || options === void 0 ? void 0 : options.groupLabelTemplate;
16772
16843
  // setup source
16773
16844
  this.providers.data.setData(sourceWithGroups, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, { depth, customRenderer }, true);
16774
- this.updateTrimmed(trimmed, oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap);
16845
+ this.updateTrimmed(trimmed, oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, sourceWithGroups);
16775
16846
  }
16776
16847
  /**
16777
16848
  * Apply grouping on data set
@@ -16790,7 +16861,7 @@ class GroupingRowPlugin extends BasePlugin {
16790
16861
  const { sourceWithGroups, depth, trimmed, oldNewIndexMap, } = gatherGrouping(source, ((_b = this.options) === null || _b === void 0 ? void 0 : _b.props) || [], options);
16791
16862
  data.source = sourceWithGroups;
16792
16863
  this.providers.data.setGrouping({ depth });
16793
- this.updateTrimmed(trimmed, oldNewIndexMap);
16864
+ this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups);
16794
16865
  }
16795
16866
  /**
16796
16867
  * External call to apply grouping. Called by revogrid when prop changed.
@@ -16839,6 +16910,10 @@ class GroupingRowPlugin extends BasePlugin {
16839
16910
  * based on new results can be new grouping
16840
16911
  */
16841
16912
  this.addEventListener('beforetrimmed', ({ detail: { trimmed, trimmedType } }) => this.beforeTrimmedApply(trimmed, trimmedType));
16913
+ /** Filter plugin owns data-row matching; grouping decides which headers remain visible. */
16914
+ this.addEventListener('beforefiltertrimmed', ({ detail }) => {
16915
+ detail.itemsToFilter = this.beforeFilterTrimmed(detail.itemsToFilter);
16916
+ });
16842
16917
  /**
16843
16918
  * sorting applied need to clear grouping and apply again
16844
16919
  * based on new results whole grouping order will changed
@@ -16884,12 +16959,16 @@ class GroupingRowPlugin extends BasePlugin {
16884
16959
  // clear rows
16885
16960
  const { source, oldNewIndexes } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'), true);
16886
16961
  this.providers.data.setData(source, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, undefined, true);
16887
- this.updateTrimmed(undefined, undefined, oldNewIndexes);
16962
+ this.updateTrimmed(undefined, undefined, oldNewIndexes, source);
16888
16963
  }
16889
- updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap) {
16964
+ updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source')) {
16890
16965
  // map previously trimmed data
16891
16966
  const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(this.getStore().get('trimmed'), firstLevelMap, secondLevelMap);
16892
16967
  for (let type in trimemedOptionsToUpgrade) {
16968
+ if (type === FILTER_TRIMMED_TYPE) {
16969
+ /** Regrouping changes physical indexes, so filter trim needs fresh group-header state. */
16970
+ trimemedOptionsToUpgrade[type] = filterOutEmptyGroupRows(source, trimemedOptionsToUpgrade[type]);
16971
+ }
16893
16972
  this.revogrid.addTrimmed(trimemedOptionsToUpgrade[type], type);
16894
16973
  }
16895
16974
  // const emptyGroups = this.filterOutEmptyGroups(trimemedOptionsToUpgrade, childrenByGroup);
package/hydrate/index.mjs CHANGED
@@ -8541,7 +8541,7 @@ function setCacheAdd(value) {
8541
8541
  * @name has
8542
8542
  * @memberOf SetCache
8543
8543
  * @param {*} value The value to search for.
8544
- * @returns {number} Returns `true` if `value` is found, else `false`.
8544
+ * @returns {boolean} Returns `true` if `value` is found, else `false`.
8545
8545
  */
8546
8546
  function setCacheHas(value) {
8547
8547
  return this.__data__.has(value);
@@ -15007,6 +15007,15 @@ class BasePlugin {
15007
15007
  * Add support for automatic column resize
15008
15008
  */
15009
15009
  const LETTER_BLOCK_SIZE = 7;
15010
+ var ColumnAutoSizeMode;
15011
+ (function (ColumnAutoSizeMode) {
15012
+ // increases column width on header click according the largest text value
15013
+ ColumnAutoSizeMode["headerClickAutosize"] = "headerClickAutoSize";
15014
+ // increases column width on data set and text edit, decreases performance
15015
+ ColumnAutoSizeMode["autoSizeOnTextOverlap"] = "autoSizeOnTextOverlap";
15016
+ // increases and decreases column width based on all items sizes, worst for performance
15017
+ ColumnAutoSizeMode["autoSizeAll"] = "autoSizeAll";
15018
+ })(ColumnAutoSizeMode || (ColumnAutoSizeMode = {}));
15010
15019
  class AutoSizeColumnPlugin extends BasePlugin {
15011
15020
  constructor(revogrid, providers, config) {
15012
15021
  super(revogrid, providers);
@@ -15030,13 +15039,13 @@ class AutoSizeColumnPlugin extends BasePlugin {
15030
15039
  };
15031
15040
  this.addEventListener('beforecolumnsset', beforecolumnsset);
15032
15041
  switch (config === null || config === void 0 ? void 0 : config.mode) {
15033
- case "autoSizeOnTextOverlap" /* ColumnAutoSizeMode.autoSizeOnTextOverlap */:
15042
+ case ColumnAutoSizeMode.autoSizeOnTextOverlap:
15034
15043
  this.addEventListener('aftersourceset', aftersourceset);
15035
15044
  this.addEventListener('afteredit', ({ detail }) => {
15036
15045
  this.afteredit(detail);
15037
15046
  });
15038
15047
  break;
15039
- case "autoSizeAll" /* ColumnAutoSizeMode.autoSizeAll */:
15048
+ case ColumnAutoSizeMode.autoSizeAll:
15040
15049
  this.addEventListener('aftersourceset', aftersourceset);
15041
15050
  this.addEventListener('afteredit', ({ detail }) => {
15042
15051
  this.afterEditAll(detail);
@@ -15418,6 +15427,7 @@ class FilterPlugin extends BasePlugin {
15418
15427
  if (Object.keys(this.multiFilterItems).length === 0) {
15419
15428
  return;
15420
15429
  }
15430
+ await timeout();
15421
15431
  await this.runFiltering(this.multiFilterItems);
15422
15432
  };
15423
15433
  this.addEventListener('headerclick', e => this.headerclick(e));
@@ -16582,6 +16592,23 @@ function doExpand(vIndex, source, rowItemsIndexes) {
16582
16592
  }
16583
16593
 
16584
16594
  const TRIMMED_GROUPING = 'grouping';
16595
+ /**
16596
+ * Converts a trim row index through the index maps produced while regrouping.
16597
+ *
16598
+ * Group rows are synthetic, so they may not exist in the first map. When a
16599
+ * second map is available, fall back to the original index so trims created
16600
+ * against the grouped physical source can still be remapped. If neither path
16601
+ * resolves to a number, the caller drops the stale trim entry.
16602
+ */
16603
+ function convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap) {
16604
+ const sourceIndex = Number.parseInt(initialIndex, 10);
16605
+ const firstConversionIndex = firstLevelMap[sourceIndex];
16606
+ if (!secondLevelMap) {
16607
+ return firstConversionIndex;
16608
+ }
16609
+ const secondConversionKey = typeof firstConversionIndex === 'number' ? firstConversionIndex : sourceIndex;
16610
+ return secondLevelMap[secondConversionKey];
16611
+ }
16585
16612
  /**
16586
16613
  * Prepare trimming updated indexes for grouping
16587
16614
  * @param initiallyTrimed
@@ -16600,31 +16627,73 @@ function processDoubleConversionTrimmed(initiallyTrimed, firstLevelMap, secondLe
16600
16627
  const items = initiallyTrimed[type];
16601
16628
  const newItems = {};
16602
16629
  for (let initialIndex in items) {
16630
+ if (!items[initialIndex]) {
16631
+ continue;
16632
+ }
16603
16633
  /**
16604
16634
  * if item exists we find it in collection
16605
16635
  * we support 2 level of conversions
16606
16636
  */
16607
- let newConversionIndex = firstLevelMap[initialIndex];
16608
- if (secondLevelMap) {
16609
- newConversionIndex = secondLevelMap[newConversionIndex];
16637
+ const newConversionIndex = convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap);
16638
+ // Group rows do not exist in the ungrouped index map and must not leak into new trims.
16639
+ if (typeof newConversionIndex !== 'number') {
16640
+ continue;
16610
16641
  }
16611
16642
  /**
16612
16643
  * if item was trimmed previously
16613
16644
  * trimming makes sense to apply
16614
16645
  */
16615
- if (items[initialIndex]) {
16616
- newItems[newConversionIndex] = true;
16617
- /**
16618
- * If changes present apply changes to new source
16619
- */
16620
- if (newConversionIndex !== parseInt(initialIndex, 10)) {
16621
- trimemedOptionsToUpgrade[type] = newItems;
16622
- }
16623
- }
16646
+ newItems[newConversionIndex] = true;
16624
16647
  }
16648
+ trimemedOptionsToUpgrade[type] = newItems;
16625
16649
  }
16626
16650
  return trimemedOptionsToUpgrade;
16627
16651
  }
16652
+ function hasVisibleGroupItems(source, trimmed, groupIndex) {
16653
+ var _a;
16654
+ const depth = (_a = source[groupIndex]) === null || _a === void 0 ? void 0 : _a[GROUP_DEPTH];
16655
+ if (depth == null) {
16656
+ return false;
16657
+ }
16658
+ // A group is visible when at least one descendant data row survives filtering.
16659
+ for (let i = groupIndex + 1; i < source.length; i++) {
16660
+ const model = source[i];
16661
+ if (isGrouping(model)) {
16662
+ if (model[GROUP_DEPTH] <= depth) {
16663
+ break;
16664
+ }
16665
+ continue;
16666
+ }
16667
+ if (!trimmed[i]) {
16668
+ return true;
16669
+ }
16670
+ }
16671
+ return false;
16672
+ }
16673
+ /**
16674
+ * Preserves data-row filter results and recalculates group-row visibility
16675
+ * from the filtered state of each group's descendant data rows.
16676
+ *
16677
+ * @param source - Grouped row source that contains group rows and data rows.
16678
+ * @param filterTrimmed - Current filter trim map keyed by physical row index.
16679
+ * @returns Filter trim map with empty group rows hidden and matching group rows visible.
16680
+ */
16681
+ function filterOutEmptyGroupRows(source, filterTrimmed) {
16682
+ const trimmed = Object.assign({}, filterTrimmed);
16683
+ // Recalculate only group rows; data-row filter results are preserved as-is.
16684
+ source.forEach((model, index) => {
16685
+ if (!isGrouping(model)) {
16686
+ return;
16687
+ }
16688
+ if (hasVisibleGroupItems(source, trimmed, index)) {
16689
+ delete trimmed[index];
16690
+ }
16691
+ else {
16692
+ trimmed[index] = true;
16693
+ }
16694
+ });
16695
+ return trimmed;
16696
+ }
16628
16697
 
16629
16698
  const PADDING_DEPTH = 10;
16630
16699
  const RowRenderer = ({ rowClass, index, size, start, depth }, cells) => {
@@ -16734,16 +16803,18 @@ class GroupingRowPlugin extends BasePlugin {
16734
16803
  }
16735
16804
  }
16736
16805
  beforeTrimmedApply(trimmed, type) {
16737
- /** Before filter apply remove grouping filtering */
16806
+ /** Filter trim must keep group headers in sync with their visible children. */
16738
16807
  if (type === FILTER_TRIMMED_TYPE) {
16739
16808
  const source = this.getStore().get('source');
16740
- for (let index in trimmed) {
16741
- if (trimmed[index] && isGrouping(source[index])) {
16742
- trimmed[index] = false;
16743
- }
16744
- }
16809
+ const updatedTrimmed = filterOutEmptyGroupRows(source, trimmed);
16810
+ Object.keys(trimmed).forEach(index => delete trimmed[Number.parseInt(index, 10)]);
16811
+ Object.assign(trimmed, updatedTrimmed);
16745
16812
  }
16746
16813
  }
16814
+ beforeFilterTrimmed(trimmed) {
16815
+ const source = this.getStore().get('source');
16816
+ return filterOutEmptyGroupRows(source, trimmed);
16817
+ }
16747
16818
  isSortingRunning() {
16748
16819
  const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
16749
16820
  return !!(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sortingPromise);
@@ -16769,7 +16840,7 @@ class GroupingRowPlugin extends BasePlugin {
16769
16840
  const customRenderer = options === null || options === void 0 ? void 0 : options.groupLabelTemplate;
16770
16841
  // setup source
16771
16842
  this.providers.data.setData(sourceWithGroups, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, { depth, customRenderer }, true);
16772
- this.updateTrimmed(trimmed, oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap);
16843
+ this.updateTrimmed(trimmed, oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, sourceWithGroups);
16773
16844
  }
16774
16845
  /**
16775
16846
  * Apply grouping on data set
@@ -16788,7 +16859,7 @@ class GroupingRowPlugin extends BasePlugin {
16788
16859
  const { sourceWithGroups, depth, trimmed, oldNewIndexMap, } = gatherGrouping(source, ((_b = this.options) === null || _b === void 0 ? void 0 : _b.props) || [], options);
16789
16860
  data.source = sourceWithGroups;
16790
16861
  this.providers.data.setGrouping({ depth });
16791
- this.updateTrimmed(trimmed, oldNewIndexMap);
16862
+ this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups);
16792
16863
  }
16793
16864
  /**
16794
16865
  * External call to apply grouping. Called by revogrid when prop changed.
@@ -16837,6 +16908,10 @@ class GroupingRowPlugin extends BasePlugin {
16837
16908
  * based on new results can be new grouping
16838
16909
  */
16839
16910
  this.addEventListener('beforetrimmed', ({ detail: { trimmed, trimmedType } }) => this.beforeTrimmedApply(trimmed, trimmedType));
16911
+ /** Filter plugin owns data-row matching; grouping decides which headers remain visible. */
16912
+ this.addEventListener('beforefiltertrimmed', ({ detail }) => {
16913
+ detail.itemsToFilter = this.beforeFilterTrimmed(detail.itemsToFilter);
16914
+ });
16840
16915
  /**
16841
16916
  * sorting applied need to clear grouping and apply again
16842
16917
  * based on new results whole grouping order will changed
@@ -16882,12 +16957,16 @@ class GroupingRowPlugin extends BasePlugin {
16882
16957
  // clear rows
16883
16958
  const { source, oldNewIndexes } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'), true);
16884
16959
  this.providers.data.setData(source, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, undefined, true);
16885
- this.updateTrimmed(undefined, undefined, oldNewIndexes);
16960
+ this.updateTrimmed(undefined, undefined, oldNewIndexes, source);
16886
16961
  }
16887
- updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap) {
16962
+ updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source')) {
16888
16963
  // map previously trimmed data
16889
16964
  const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(this.getStore().get('trimmed'), firstLevelMap, secondLevelMap);
16890
16965
  for (let type in trimemedOptionsToUpgrade) {
16966
+ if (type === FILTER_TRIMMED_TYPE) {
16967
+ /** Regrouping changes physical indexes, so filter trim needs fresh group-header state. */
16968
+ trimemedOptionsToUpgrade[type] = filterOutEmptyGroupRows(source, trimemedOptionsToUpgrade[type]);
16969
+ }
16891
16970
  this.revogrid.addTrimmed(trimemedOptionsToUpgrade[type], type);
16892
16971
  }
16893
16972
  // const emptyGroups = this.filterOutEmptyGroups(trimemedOptionsToUpgrade, childrenByGroup);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revolist/revogrid",
3
- "version": "4.21.4",
3
+ "version": "4.21.6",
4
4
  "type": "module",
5
5
  "description": "Virtual reactive data grid spreadsheet component - RevoGrid.",
6
6
  "license": "MIT",
@@ -100,6 +100,7 @@
100
100
  "readme": "node ./scripts/generate_readme.mjs",
101
101
  "test": "stencil test --spec",
102
102
  "test:e2e": "playwright test",
103
+ "test:e2e:ui": "playwright test --ui",
103
104
  "dev": "stencil build --dev --watch --serve",
104
105
  "release": "npm run build && npm publish --public --tag pre-release && npm run package:update"
105
106
  },
@@ -118,7 +119,7 @@
118
119
  "@stencil/vue-output-target": "^0.8.9",
119
120
  "@types/events": "^3.0.3",
120
121
  "@types/jest": "^29.5.14",
121
- "@types/lodash": "^4.17.14",
122
+ "@types/lodash": "^4.17.24",
122
123
  "@types/node": "^20.14.2",
123
124
  "@types/react": "^18.3.3",
124
125
  "@types/react-dom": "^18.3.0",
@@ -129,7 +130,7 @@
129
130
  "jest": "^29.7.0",
130
131
  "jest-cli": "^29.7.0",
131
132
  "json2md": "^2.0.1",
132
- "lodash": "npm:lodash-es@4.17.23",
133
+ "lodash": "npm:lodash-es@4.18.1",
133
134
  "minimist": "^1.2.8",
134
135
  "path": "^0.12.7",
135
136
  "prettier": "3.3.2",
@@ -1,4 +1,4 @@
1
1
  /*!
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
- import{setMode as _}from"@stencil/core/internal/client";export{getAssetPath,h,render,setAssetPath,setNonce,setPlatformOptions}from"@stencil/core/internal/client";import{g as O,B as L}from"./revo-grid.js";export{A as AutoSizeColumnPlugin,C as ColumnMovePlugin,D as DimensionStore,b as ExportCsv,E as ExportFilePlugin,c as FILTER_CONFIG_CHANGED_EVENT,F as FILTER_TRIMMED_TYPE,d as FILTE_PANEL,e as FilterPlugin,G as GroupingRowPlugin,RevoGrid,S as SelectionStore,n as SortingPlugin,a as StretchColumn,o as defaultCellCompare,defineCustomElement as defineCustomElementRevoGrid,p as descCellCompare,k as doCollapse,l as doExpand,f as filterCoreFunctionsIndexedByType,j as filterNames,h as filterTypes,r as getComparer,m as getLeftRelative,q as getNextOrder,i as isStretchPlugin,s as sortIndexByItems}from"./revo-grid.js";export{o as GROUPING_ROW_TYPE,j as GROUP_COLUMN_PROP,G as GROUP_DEPTH,h as GROUP_EXPANDED,l as GROUP_EXPAND_BTN,m as GROUP_EXPAND_EVENT,k as GROUP_ORIGINAL_INDEX,f as PSEUDO_GROUP_COLUMN,P as PSEUDO_GROUP_ITEM,d as PSEUDO_GROUP_ITEM_ID,e as PSEUDO_GROUP_ITEM_VALUE,c as columnTypes,a as cropCellToMax,H as gatherGroup,s as gatherGrouping,z as getCellData,B as getCellDataParsed,A as getCellRaw,I as getColumnByProp,D as getColumnSizes,C as getColumnType,F as getColumns,q as getExpanded,t as getGroupingName,x as getParsedGroup,g as getRange,p as getSource,E as isColGrouping,u as isGrouping,v as isGroupingColumn,b as isRangeSingleCell,i as isRowType,y as isSameGroup,w as measureEqualDepth,n as nextCell,r as rowTypes}from"./column.service.js";export{S as SortingSign,d as dispatch,a as dispatchByEvent}from"./revogr-header2.js";export{a as applyMixins,f as findPositionInArray,g as getScrollbarSize,m as mergeSortedArray,p as pushSorted,r as range,s as scaleValue,t as timeout}from"./index2.js";export{C as CellRenderer,G as GroupingRowRenderer,e as expandEvent,a as expandSvgIconVNode}from"./revogr-data2.js";export{T as TextEditor,k as isAll,c as isClear,h as isCopy,a as isCtrlKey,b as isCtrlMetaKey,g as isCut,l as isEditInput,m as isEditorCtrConstructible,f as isEnterKeyValue,i as isMetaKey,j as isPaste,d as isTab,e as isTabKeyValue}from"./revogr-edit2.js";export{RevogrAttribution,defineCustomElement as defineCustomElementRevogrAttribution}from"./revogr-attribution.js";export{RevogrClipboard,defineCustomElement as defineCustomElementRevogrClipboard}from"./revogr-clipboard.js";export{RevogrData,defineCustomElement as defineCustomElementRevogrData}from"./revogr-data.js";export{RevogrEdit,defineCustomElement as defineCustomElementRevogrEdit}from"./revogr-edit.js";export{RevogrExtra,defineCustomElement as defineCustomElementRevogrExtra}from"./revogr-extra.js";export{RevogrFilterPanel,defineCustomElement as defineCustomElementRevogrFilterPanel}from"./revogr-filter-panel.js";export{RevogrFocus,defineCustomElement as defineCustomElementRevogrFocus}from"./revogr-focus.js";export{RevogrHeader,defineCustomElement as defineCustomElementRevogrHeader}from"./revogr-header.js";export{RevogrOrderEditor,defineCustomElement as defineCustomElementRevogrOrderEditor}from"./revogr-order-editor.js";export{RevogrOverlaySelection,defineCustomElement as defineCustomElementRevogrOverlaySelection}from"./revogr-overlay-selection.js";export{RevogrRowHeaders,defineCustomElement as defineCustomElementRevogrRowHeaders}from"./revogr-row-headers.js";export{RevogrScrollVirtual,defineCustomElement as defineCustomElementRevogrScrollVirtual}from"./revogr-scroll-virtual.js";export{RevogrTempRange,defineCustomElement as defineCustomElementRevogrTempRange}from"./revogr-temp-range.js";export{RevogrViewportScroll,defineCustomElement as defineCustomElementRevogrViewportScroll}from"./revogr-viewport-scroll.js";export{VnodeHtml,defineCustomElement as defineCustomElementVnodeHtml}from"./vnode-html.js";export{D as DataStore,h as gatherTrimmedItems,g as getPhysical,b as getSourceItem,f as getSourceItemVirtualIndexByProp,c as getSourcePhysicalIndex,a as getVisibleSourceItem,p as proxyPlugin,e as setItems,d as setSourceByPhysicalIndex,s as setSourceByVirtualIndex,i as setStore,t as trimmedPlugin}from"./data.store.js";export{c as calculateDimensionData,a as getItemByIndex,g as getItemByPosition}from"./dimension.helpers.js";export{V as ViewportStore,a as addMissingItems,f as calculateRowHeaderSize,d as getFirstItem,b as getItems,e as getLastItem,g as getUpdatedItemsByPosition,i as isActiveRange,c as isActiveRangeOutsideLastItem,r as recombineByOffset,s as setItemSizes,u as updateMissingAndRange}from"./revogr-row-headers2.js";export{A as AND_OR_BUTTON,e as AndOrButton,a as FILTER_BUTTON_ACTIVE,F as FILTER_BUTTON_CLASS,b as FILTER_PROP,c as FilterButton,T as TRASH_BUTTON,d as TrashButton,i as isFilterBtn}from"./filter.button.js";export{C as CELL_CLASS,j as CELL_HANDLER_CLASS,D as DATA_COL,a as DATA_ROW,b as DISABLED_CLASS,h as DRAGGABLE_CLASS,k as DRAGG_TEXT,g as DRAG_ICON_CLASS,E as EDIT_INPUT_WR,F as FOCUS_CLASS,G as GRID_INTERNALS,f as HEADER_ACTUAL_ROW_CLASS,H as HEADER_CLASS,e as HEADER_ROW_CLASS,d as HEADER_SORTABLE_CLASS,M as MIN_COL_SIZE,i as MOBILE_CLASS,R as RESIZE_INTERVAL,l as ROW_FOCUSED_CLASS,c as ROW_HEADER_TYPE,S as SELECTION_BORDER_CLASS,T as TMP_SELECTION_BG_CLASS}from"./consts.js";export{c as codesLetter,k as keyValues}from"./platform.js";const N=function(){_((e=>{let r=e.theme||e.getAttribute("theme");"string"==typeof r&&(r=r.trim());const o=O(r);return o!==r&&e.setAttribute("theme",o),o}))}||(()=>{}),U=new Map([["contentsizechanged","contentsizechanged"],["beforeedit","beforeedit"],["beforerangeedit","beforerangeedit"],["afteredit","afteredit"],["beforeautofill","beforeautofill"],["beforerange","beforerange"],["afterfocus","afterfocus"],["roworderchanged","roworderchanged"],["beforesorting","beforesorting"],["beforesourcesortingapply","beforesourcesortingapply"],["beforesortingapply","beforesortingapply"],["rowdragstart","rowdragstart"],["headerclick","headerclick"],["beforecellfocus","beforecellfocus"],["beforefocuslost","beforefocuslost"],["beforesourceset","beforesourceset"],["beforeanysource","beforeanysource"],["aftersourceset","aftersourceset"],["afteranysource","afteranysource"],["beforecolumnsgather","beforecolumnsgather"],["beforecolumnsset","beforecolumnsset"],["beforecolumnapplied","beforecolumnapplied"],["aftercolumnsset","aftercolumnsset"],["beforefilterapply","beforefilterapply"],["beforefiltertrimmed","beforefiltertrimmed"],["beforetrimmed","beforetrimmed"],["aftertrimmed","aftertrimmed"],["viewportscroll","viewportscroll"],["beforeexport","beforeexport"],["beforeeditstart","beforeeditstart"],["aftercolumnresize","aftercolumnresize"],["beforerowdefinition","beforerowdefinition"],["filterconfigchanged","filterconfigchanged"],["sortingconfigchanged","sortingconfigchanged"],["rowheaderschanged","rowheaderschanged"],["beforegridrender","beforegridrender"],["aftergridrender","aftergridrender"],["aftergridinit","aftergridinit"],["additionaldatachanged","additionaldatachanged"],["afterthemechanged","afterthemechanged"],["created","created"],["beforepaste","beforepaste"],["beforepasteapply","beforepasteapply"],["pasteregion","pasteregion"],["afterpasteapply","afterpasteapply"],["beforecut","beforecut"],["clearregion","clearregion"],["beforecopy","beforecopy"],["beforecopyapply","beforecopyapply"],["copyregion","copyregion"],["beforerowrender","beforerowrender"],["afterrender","afterrender"],["beforecellrender","beforecellrender"],["beforedatarender","beforedatarender"],["dragstartcell","dragstartcell"],["celleditinit","celleditinit"],["closeedit","closeedit"],["filterChange","filterChange"],["resetChange","resetChange"],["beforefocusrender","beforefocusrender"],["beforescrollintoview","beforescrollintoview"],["afterfocus","afterfocus"],["beforeheaderclick","beforeheaderclick"],["headerresize","headerresize"],["beforeheaderresize","beforeheaderresize"],["headerdblclick","headerdblclick"],["beforeheaderrender","beforeheaderrender"],["beforegroupheaderrender","beforegroupheaderrender"],["afterheaderrender","afterheaderrender"],["rowdragstartinit","rowdragstartinit"],["rowdragendinit","rowdragendinit"],["rowdragmoveinit","rowdragmoveinit"],["rowdragmousemove","rowdragmousemove"],["rowdropinit","rowdropinit"],["roworderchange","roworderchange"],["beforecopyregion","beforecopyregion"],["beforepasteregion","beforepasteregion"],["celleditapply","celleditapply"],["beforecellfocusinit","beforecellfocusinit"],["beforenextvpfocus","beforenextvpfocus"],["setedit","setedit"],["beforeapplyrange","beforeapplyrange"],["beforesetrange","beforesetrange"],["setrange","setrange"],["beforeeditrender","beforeeditrender"],["selectall","selectall"],["canceledit","canceledit"],["settemprange","settemprange"],["beforesettemprange","beforesettemprange"],["applyfocus","applyfocus"],["focuscell","focuscell"],["beforerangedataapply","beforerangedataapply"],["selectionchangeinit","selectionchangeinit"],["beforerangecopyapply","beforerangecopyapply"],["rangeeditapply","rangeeditapply"],["clipboardrangecopy","clipboardrangecopy"],["clipboardrangepaste","clipboardrangepaste"],["beforekeydown","beforekeydown"],["beforekeyup","beforekeyup"],["beforecellsave","beforecellsave"],["celledit","celledit"],["scrollview","scrollview"],["ref","ref"],["scrollvirtual","scrollvirtual"],["scrollviewport","scrollviewport"],["resizeviewport","resizeviewport"],["scrollchange","scrollchange"],["scrollviewportsilent","scrollviewportsilent"],["html","html"]]);class W extends L{constructor(e,r){super(e,r),this.addEventListener("beforepasteapply",(e=>this.handleBeforePasteApply(e)))}handleBeforePasteApply(e){const r=this.providers.selection.focused;if(!r||null!=this.providers.selection.edit)return;const o=this.providers.data.stores.rgRow.store.get("items").length,t=r.y+e.detail.parsed.length;if(o<t){const e=Array.from({length:t-o},((e,r)=>({index:o+r,data:{}}))),r=this.emit("newRows",{newRows:e});if(r.defaultPrevented)return;const a=[...this.providers.data.stores.rgRow.store.get("source"),...r.detail.newRows.map((e=>e.data))];this.providers.data.setData(a)}}}N();export{W as AutoAddRowsPlugin,L as BasePlugin,U as REVOGRID_EVENTS}
4
+ import{setMode as _}from"@stencil/core/internal/client";export{getAssetPath,h,render,setAssetPath,setNonce,setPlatformOptions}from"@stencil/core/internal/client";import{g as O,B as L}from"./revo-grid.js";export{A as AutoSizeColumnPlugin,C as ColumnAutoSizeMode,m as ColumnMovePlugin,D as DimensionStore,b as ExportCsv,E as ExportFilePlugin,c as FILTER_CONFIG_CHANGED_EVENT,F as FILTER_TRIMMED_TYPE,d as FILTE_PANEL,e as FilterPlugin,G as GroupingRowPlugin,RevoGrid,S as SelectionStore,o as SortingPlugin,a as StretchColumn,p as defaultCellCompare,defineCustomElement as defineCustomElementRevoGrid,q as descCellCompare,k as doCollapse,l as doExpand,f as filterCoreFunctionsIndexedByType,j as filterNames,h as filterTypes,t as getComparer,n as getLeftRelative,r as getNextOrder,i as isStretchPlugin,s as sortIndexByItems}from"./revo-grid.js";export{o as GROUPING_ROW_TYPE,j as GROUP_COLUMN_PROP,G as GROUP_DEPTH,h as GROUP_EXPANDED,l as GROUP_EXPAND_BTN,m as GROUP_EXPAND_EVENT,k as GROUP_ORIGINAL_INDEX,f as PSEUDO_GROUP_COLUMN,P as PSEUDO_GROUP_ITEM,d as PSEUDO_GROUP_ITEM_ID,e as PSEUDO_GROUP_ITEM_VALUE,c as columnTypes,a as cropCellToMax,H as gatherGroup,s as gatherGrouping,z as getCellData,B as getCellDataParsed,A as getCellRaw,I as getColumnByProp,D as getColumnSizes,C as getColumnType,F as getColumns,q as getExpanded,t as getGroupingName,x as getParsedGroup,g as getRange,p as getSource,E as isColGrouping,u as isGrouping,v as isGroupingColumn,b as isRangeSingleCell,i as isRowType,y as isSameGroup,w as measureEqualDepth,n as nextCell,r as rowTypes}from"./column.service.js";export{S as SortingSign,d as dispatch,a as dispatchByEvent}from"./revogr-header2.js";export{a as applyMixins,f as findPositionInArray,g as getScrollbarSize,m as mergeSortedArray,p as pushSorted,r as range,s as scaleValue,t as timeout}from"./index2.js";export{C as CellRenderer,G as GroupingRowRenderer,e as expandEvent,a as expandSvgIconVNode}from"./revogr-data2.js";export{T as TextEditor,k as isAll,c as isClear,h as isCopy,a as isCtrlKey,b as isCtrlMetaKey,g as isCut,l as isEditInput,m as isEditorCtrConstructible,f as isEnterKeyValue,i as isMetaKey,j as isPaste,d as isTab,e as isTabKeyValue}from"./revogr-edit2.js";export{RevogrAttribution,defineCustomElement as defineCustomElementRevogrAttribution}from"./revogr-attribution.js";export{RevogrClipboard,defineCustomElement as defineCustomElementRevogrClipboard}from"./revogr-clipboard.js";export{RevogrData,defineCustomElement as defineCustomElementRevogrData}from"./revogr-data.js";export{RevogrEdit,defineCustomElement as defineCustomElementRevogrEdit}from"./revogr-edit.js";export{RevogrExtra,defineCustomElement as defineCustomElementRevogrExtra}from"./revogr-extra.js";export{RevogrFilterPanel,defineCustomElement as defineCustomElementRevogrFilterPanel}from"./revogr-filter-panel.js";export{RevogrFocus,defineCustomElement as defineCustomElementRevogrFocus}from"./revogr-focus.js";export{RevogrHeader,defineCustomElement as defineCustomElementRevogrHeader}from"./revogr-header.js";export{RevogrOrderEditor,defineCustomElement as defineCustomElementRevogrOrderEditor}from"./revogr-order-editor.js";export{RevogrOverlaySelection,defineCustomElement as defineCustomElementRevogrOverlaySelection}from"./revogr-overlay-selection.js";export{RevogrRowHeaders,defineCustomElement as defineCustomElementRevogrRowHeaders}from"./revogr-row-headers.js";export{RevogrScrollVirtual,defineCustomElement as defineCustomElementRevogrScrollVirtual}from"./revogr-scroll-virtual.js";export{RevogrTempRange,defineCustomElement as defineCustomElementRevogrTempRange}from"./revogr-temp-range.js";export{RevogrViewportScroll,defineCustomElement as defineCustomElementRevogrViewportScroll}from"./revogr-viewport-scroll.js";export{VnodeHtml,defineCustomElement as defineCustomElementVnodeHtml}from"./vnode-html.js";export{D as DataStore,h as gatherTrimmedItems,g as getPhysical,b as getSourceItem,f as getSourceItemVirtualIndexByProp,c as getSourcePhysicalIndex,a as getVisibleSourceItem,p as proxyPlugin,e as setItems,d as setSourceByPhysicalIndex,s as setSourceByVirtualIndex,i as setStore,t as trimmedPlugin}from"./data.store.js";export{c as calculateDimensionData,a as getItemByIndex,g as getItemByPosition}from"./dimension.helpers.js";export{V as ViewportStore,a as addMissingItems,f as calculateRowHeaderSize,d as getFirstItem,b as getItems,e as getLastItem,g as getUpdatedItemsByPosition,i as isActiveRange,c as isActiveRangeOutsideLastItem,r as recombineByOffset,s as setItemSizes,u as updateMissingAndRange}from"./revogr-row-headers2.js";export{A as AND_OR_BUTTON,e as AndOrButton,a as FILTER_BUTTON_ACTIVE,F as FILTER_BUTTON_CLASS,b as FILTER_PROP,c as FilterButton,T as TRASH_BUTTON,d as TrashButton,i as isFilterBtn}from"./filter.button.js";export{C as CELL_CLASS,j as CELL_HANDLER_CLASS,D as DATA_COL,a as DATA_ROW,b as DISABLED_CLASS,h as DRAGGABLE_CLASS,k as DRAGG_TEXT,g as DRAG_ICON_CLASS,E as EDIT_INPUT_WR,F as FOCUS_CLASS,G as GRID_INTERNALS,f as HEADER_ACTUAL_ROW_CLASS,H as HEADER_CLASS,e as HEADER_ROW_CLASS,d as HEADER_SORTABLE_CLASS,M as MIN_COL_SIZE,i as MOBILE_CLASS,R as RESIZE_INTERVAL,l as ROW_FOCUSED_CLASS,c as ROW_HEADER_TYPE,S as SELECTION_BORDER_CLASS,T as TMP_SELECTION_BG_CLASS}from"./consts.js";export{c as codesLetter,k as keyValues}from"./platform.js";const N=function(){_((e=>{let r=e.theme||e.getAttribute("theme");"string"==typeof r&&(r=r.trim());const o=O(r);return o!==r&&e.setAttribute("theme",o),o}))}||(()=>{}),U=new Map([["contentsizechanged","contentsizechanged"],["beforeedit","beforeedit"],["beforerangeedit","beforerangeedit"],["afteredit","afteredit"],["beforeautofill","beforeautofill"],["beforerange","beforerange"],["afterfocus","afterfocus"],["roworderchanged","roworderchanged"],["beforesorting","beforesorting"],["beforesourcesortingapply","beforesourcesortingapply"],["beforesortingapply","beforesortingapply"],["rowdragstart","rowdragstart"],["headerclick","headerclick"],["beforecellfocus","beforecellfocus"],["beforefocuslost","beforefocuslost"],["beforesourceset","beforesourceset"],["beforeanysource","beforeanysource"],["aftersourceset","aftersourceset"],["afteranysource","afteranysource"],["beforecolumnsgather","beforecolumnsgather"],["beforecolumnsset","beforecolumnsset"],["beforecolumnapplied","beforecolumnapplied"],["aftercolumnsset","aftercolumnsset"],["beforefilterapply","beforefilterapply"],["beforefiltertrimmed","beforefiltertrimmed"],["beforetrimmed","beforetrimmed"],["aftertrimmed","aftertrimmed"],["viewportscroll","viewportscroll"],["beforeexport","beforeexport"],["beforeeditstart","beforeeditstart"],["aftercolumnresize","aftercolumnresize"],["beforerowdefinition","beforerowdefinition"],["filterconfigchanged","filterconfigchanged"],["sortingconfigchanged","sortingconfigchanged"],["rowheaderschanged","rowheaderschanged"],["beforegridrender","beforegridrender"],["aftergridrender","aftergridrender"],["aftergridinit","aftergridinit"],["additionaldatachanged","additionaldatachanged"],["afterthemechanged","afterthemechanged"],["created","created"],["beforepaste","beforepaste"],["beforepasteapply","beforepasteapply"],["pasteregion","pasteregion"],["afterpasteapply","afterpasteapply"],["beforecut","beforecut"],["clearregion","clearregion"],["beforecopy","beforecopy"],["beforecopyapply","beforecopyapply"],["copyregion","copyregion"],["beforerowrender","beforerowrender"],["afterrender","afterrender"],["beforecellrender","beforecellrender"],["beforedatarender","beforedatarender"],["dragstartcell","dragstartcell"],["celleditinit","celleditinit"],["closeedit","closeedit"],["filterChange","filterChange"],["resetChange","resetChange"],["beforefocusrender","beforefocusrender"],["beforescrollintoview","beforescrollintoview"],["afterfocus","afterfocus"],["beforeheaderclick","beforeheaderclick"],["headerresize","headerresize"],["beforeheaderresize","beforeheaderresize"],["headerdblclick","headerdblclick"],["beforeheaderrender","beforeheaderrender"],["beforegroupheaderrender","beforegroupheaderrender"],["afterheaderrender","afterheaderrender"],["rowdragstartinit","rowdragstartinit"],["rowdragendinit","rowdragendinit"],["rowdragmoveinit","rowdragmoveinit"],["rowdragmousemove","rowdragmousemove"],["rowdropinit","rowdropinit"],["roworderchange","roworderchange"],["beforecopyregion","beforecopyregion"],["beforepasteregion","beforepasteregion"],["celleditapply","celleditapply"],["beforecellfocusinit","beforecellfocusinit"],["beforenextvpfocus","beforenextvpfocus"],["setedit","setedit"],["beforeapplyrange","beforeapplyrange"],["beforesetrange","beforesetrange"],["setrange","setrange"],["beforeeditrender","beforeeditrender"],["selectall","selectall"],["canceledit","canceledit"],["settemprange","settemprange"],["beforesettemprange","beforesettemprange"],["applyfocus","applyfocus"],["focuscell","focuscell"],["beforerangedataapply","beforerangedataapply"],["selectionchangeinit","selectionchangeinit"],["beforerangecopyapply","beforerangecopyapply"],["rangeeditapply","rangeeditapply"],["clipboardrangecopy","clipboardrangecopy"],["clipboardrangepaste","clipboardrangepaste"],["beforekeydown","beforekeydown"],["beforekeyup","beforekeyup"],["beforecellsave","beforecellsave"],["celledit","celledit"],["scrollview","scrollview"],["ref","ref"],["scrollvirtual","scrollvirtual"],["scrollviewport","scrollviewport"],["resizeviewport","resizeviewport"],["scrollchange","scrollchange"],["scrollviewportsilent","scrollviewportsilent"],["html","html"]]);class W extends L{constructor(e,r){super(e,r),this.addEventListener("beforepasteapply",(e=>this.handleBeforePasteApply(e)))}handleBeforePasteApply(e){const r=this.providers.selection.focused;if(!r||null!=this.providers.selection.edit)return;const o=this.providers.data.stores.rgRow.store.get("items").length,t=r.y+e.detail.parsed.length;if(o<t){const e=Array.from({length:t-o},((e,r)=>({index:o+r,data:{}}))),r=this.emit("newRows",{newRows:e});if(r.defaultPrevented)return;const a=[...this.providers.data.stores.rgRow.store.get("source"),...r.detail.newRows.map((e=>e.data))];this.providers.data.setData(a)}}}N();export{W as AutoAddRowsPlugin,L as BasePlugin,U as REVOGRID_EVENTS}