@revolist/revogrid 4.9.41 → 4.10.0

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 (139) hide show
  1. package/dist/cjs/{column.drag.plugin-fcd892ec.js → column.drag.plugin-7098477f.js} +117 -46
  2. package/dist/cjs/column.drag.plugin-7098477f.js.map +1 -0
  3. package/dist/cjs/{column.service-26c61ed6.js → column.service-f1d5d924.js} +5 -10
  4. package/dist/cjs/column.service-f1d5d924.js.map +1 -0
  5. package/dist/cjs/{edit.utils-179c0800.js → edit.utils-75fa1cab.js} +2 -2
  6. package/dist/cjs/{edit.utils-179c0800.js.map → edit.utils-75fa1cab.js.map} +1 -1
  7. package/dist/cjs/{header-cell-renderer-d879d95e.js → header-cell-renderer-aaaad4c8.js} +2 -2
  8. package/dist/cjs/{header-cell-renderer-d879d95e.js.map → header-cell-renderer-aaaad4c8.js.map} +1 -1
  9. package/dist/cjs/{index-3ab26ab9.js → index-aecb871a.js} +3 -6
  10. package/dist/cjs/index-aecb871a.js.map +1 -0
  11. package/dist/cjs/index.cjs.js +8 -7
  12. package/dist/cjs/index.cjs.js.map +1 -1
  13. package/dist/cjs/{key.utils-f49d7bee.js → key.utils-8f1105f3.js} +2 -2
  14. package/dist/cjs/{key.utils-f49d7bee.js.map → key.utils-8f1105f3.js.map} +1 -1
  15. package/dist/cjs/revo-grid.cjs.entry.js +26 -35
  16. package/dist/cjs/revo-grid.cjs.entry.js.map +1 -1
  17. package/dist/cjs/revogr-attribution_7.cjs.entry.js +6 -6
  18. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +4 -4
  19. package/dist/cjs/revogr-data_4.cjs.entry.js +36 -13
  20. package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -1
  21. package/dist/cjs/{row-header-utils-c37f76e4.js → row-header-utils-208e4026.js} +3 -3
  22. package/dist/cjs/{row-header-utils-c37f76e4.js.map → row-header-utils-208e4026.js.map} +1 -1
  23. package/dist/cjs/{text-editor-b756d6b3.js → text-editor-b64a080e.js} +3 -3
  24. package/dist/cjs/{text-editor-b756d6b3.js.map → text-editor-b64a080e.js.map} +1 -1
  25. package/dist/cjs/{throttle-a57f51f9.js → throttle-3b362440.js} +2 -2
  26. package/dist/cjs/{throttle-a57f51f9.js.map → throttle-3b362440.js.map} +1 -1
  27. package/dist/collection/components/data/revogr-data.js +28 -3
  28. package/dist/collection/components/data/revogr-data.js.map +1 -1
  29. package/dist/collection/components/revoGrid/revo-grid.js +7 -4
  30. package/dist/collection/components/revoGrid/revo-grid.js.map +1 -1
  31. package/dist/collection/components/scroll/revogr-viewport-scroll.js +26 -8
  32. package/dist/collection/components/scroll/revogr-viewport-scroll.js.map +1 -1
  33. package/dist/collection/plugins/filter/filter.plugin.js +3 -0
  34. package/dist/collection/plugins/filter/filter.plugin.js.map +1 -1
  35. package/dist/collection/plugins/sorting/sorting.plugin.js +7 -4
  36. package/dist/collection/plugins/sorting/sorting.plugin.js.map +1 -1
  37. package/dist/collection/services/dimension.provider.js +7 -22
  38. package/dist/collection/services/dimension.provider.js.map +1 -1
  39. package/dist/collection/store/dataSource/trimmed.plugin.js +3 -8
  40. package/dist/collection/store/dataSource/trimmed.plugin.js.map +1 -1
  41. package/dist/collection/store/dimension/dimension.helpers.js +2 -5
  42. package/dist/collection/store/dimension/dimension.helpers.js.map +1 -1
  43. package/dist/collection/store/dimension/dimension.recalculate.plugin.js +35 -0
  44. package/dist/collection/store/dimension/dimension.recalculate.plugin.js.map +1 -0
  45. package/dist/collection/store/dimension/dimension.store.js +46 -66
  46. package/dist/collection/store/dimension/dimension.store.js.map +1 -1
  47. package/dist/collection/store/dimension/dimension.trim.plugin.js +61 -0
  48. package/dist/collection/store/dimension/dimension.trim.plugin.js.map +1 -0
  49. package/dist/collection/types/events.js +1 -0
  50. package/dist/collection/types/events.js.map +1 -1
  51. package/dist/collection/types/interfaces.js.map +1 -1
  52. package/dist/esm/{column.drag.plugin-3cc77986.js → column.drag.plugin-813698d2.js} +117 -46
  53. package/dist/esm/column.drag.plugin-813698d2.js.map +1 -0
  54. package/dist/esm/{column.service-751345b2.js → column.service-aa142672.js} +5 -10
  55. package/dist/esm/column.service-aa142672.js.map +1 -0
  56. package/dist/esm/{edit.utils-6fc686b9.js → edit.utils-cd6a3224.js} +2 -2
  57. package/dist/esm/{edit.utils-6fc686b9.js.map → edit.utils-cd6a3224.js.map} +1 -1
  58. package/dist/esm/{header-cell-renderer-32d2ed96.js → header-cell-renderer-5939221a.js} +2 -2
  59. package/dist/esm/{header-cell-renderer-32d2ed96.js.map → header-cell-renderer-5939221a.js.map} +1 -1
  60. package/dist/esm/{index-1dcad6ef.js → index-dbd1c020.js} +3 -6
  61. package/dist/esm/index-dbd1c020.js.map +1 -0
  62. package/dist/esm/index.js +8 -7
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/{key.utils-17273f42.js → key.utils-5ff2ec82.js} +2 -2
  65. package/dist/esm/{key.utils-17273f42.js.map → key.utils-5ff2ec82.js.map} +1 -1
  66. package/dist/esm/revo-grid.entry.js +26 -35
  67. package/dist/esm/revo-grid.entry.js.map +1 -1
  68. package/dist/esm/revogr-attribution_7.entry.js +6 -6
  69. package/dist/esm/revogr-clipboard_3.entry.js +4 -4
  70. package/dist/esm/revogr-data_4.entry.js +36 -13
  71. package/dist/esm/revogr-data_4.entry.js.map +1 -1
  72. package/dist/esm/{row-header-utils-3dfbb81f.js → row-header-utils-5511678e.js} +3 -3
  73. package/dist/esm/{row-header-utils-3dfbb81f.js.map → row-header-utils-5511678e.js.map} +1 -1
  74. package/dist/esm/{text-editor-901c3eb8.js → text-editor-81767dcb.js} +3 -3
  75. package/dist/esm/{text-editor-901c3eb8.js.map → text-editor-81767dcb.js.map} +1 -1
  76. package/dist/esm/{throttle-138d69c3.js → throttle-4eff5b3c.js} +2 -2
  77. package/dist/esm/{throttle-138d69c3.js.map → throttle-4eff5b3c.js.map} +1 -1
  78. package/dist/revo-grid/column.drag.plugin-813698d2.js +5 -0
  79. package/dist/revo-grid/column.drag.plugin-813698d2.js.map +1 -0
  80. package/dist/revo-grid/{column.service-751345b2.js → column.service-aa142672.js} +2 -2
  81. package/dist/revo-grid/{column.service-751345b2.js.map → column.service-aa142672.js.map} +1 -1
  82. package/dist/revo-grid/{edit.utils-6fc686b9.js → edit.utils-cd6a3224.js} +2 -2
  83. package/dist/revo-grid/{header-cell-renderer-32d2ed96.js → header-cell-renderer-5939221a.js} +2 -2
  84. package/dist/revo-grid/index-dbd1c020.js +5 -0
  85. package/dist/revo-grid/index-dbd1c020.js.map +1 -0
  86. package/dist/revo-grid/index.esm.js +1 -1
  87. package/dist/revo-grid/index.esm.js.map +1 -1
  88. package/dist/revo-grid/{key.utils-17273f42.js → key.utils-5ff2ec82.js} +2 -2
  89. package/dist/revo-grid/revo-grid.entry.js +1 -1
  90. package/dist/revo-grid/revo-grid.entry.js.map +1 -1
  91. package/dist/revo-grid/revogr-attribution_7.entry.js +1 -1
  92. package/dist/revo-grid/revogr-clipboard_3.entry.js +1 -1
  93. package/dist/revo-grid/revogr-data_4.entry.js +1 -1
  94. package/dist/revo-grid/revogr-data_4.entry.js.map +1 -1
  95. package/dist/revo-grid/{row-header-utils-3dfbb81f.js → row-header-utils-5511678e.js} +2 -2
  96. package/dist/revo-grid/{text-editor-901c3eb8.js → text-editor-81767dcb.js} +2 -2
  97. package/dist/revo-grid/{throttle-138d69c3.js → throttle-4eff5b3c.js} +2 -2
  98. package/dist/types/components/data/revogr-data.d.ts +6 -2
  99. package/dist/types/components/revoGrid/revo-grid.d.ts +1 -1
  100. package/dist/types/components/scroll/revogr-viewport-scroll.d.ts +1 -1
  101. package/dist/types/components.d.ts +7 -2
  102. package/dist/types/services/dimension.provider.d.ts +1 -1
  103. package/dist/types/store/dimension/dimension.helpers.d.ts +0 -3
  104. package/dist/types/store/dimension/dimension.recalculate.plugin.d.ts +9 -0
  105. package/dist/types/store/dimension/dimension.store.d.ts +2 -1
  106. package/dist/types/store/dimension/dimension.trim.plugin.d.ts +13 -0
  107. package/dist/types/types/events.d.ts +1 -1
  108. package/dist/types/types/interfaces.d.ts +6 -1
  109. package/hydrate/index.js +170 -93
  110. package/hydrate/index.mjs +170 -93
  111. package/package.json +1 -1
  112. package/standalone/data.store.js +3 -8
  113. package/standalone/data.store.js.map +1 -1
  114. package/standalone/dimension.helpers.js +2 -5
  115. package/standalone/dimension.helpers.js.map +1 -1
  116. package/standalone/index.js +1 -0
  117. package/standalone/index.js.map +1 -1
  118. package/standalone/revo-grid.js +133 -71
  119. package/standalone/revo-grid.js.map +1 -1
  120. package/standalone/revogr-data2.js +6 -1
  121. package/standalone/revogr-data2.js.map +1 -1
  122. package/standalone/revogr-viewport-scroll2.js +26 -8
  123. package/standalone/revogr-viewport-scroll2.js.map +1 -1
  124. package/dist/cjs/column.drag.plugin-fcd892ec.js.map +0 -1
  125. package/dist/cjs/column.service-26c61ed6.js.map +0 -1
  126. package/dist/cjs/index-3ab26ab9.js.map +0 -1
  127. package/dist/esm/column.drag.plugin-3cc77986.js.map +0 -1
  128. package/dist/esm/column.service-751345b2.js.map +0 -1
  129. package/dist/esm/index-1dcad6ef.js.map +0 -1
  130. package/dist/revo-grid/column.drag.plugin-3cc77986.js +0 -5
  131. package/dist/revo-grid/column.drag.plugin-3cc77986.js.map +0 -1
  132. package/dist/revo-grid/index-1dcad6ef.js +0 -5
  133. package/dist/revo-grid/index-1dcad6ef.js.map +0 -1
  134. /package/dist/revo-grid/{edit.utils-6fc686b9.js.map → edit.utils-cd6a3224.js.map} +0 -0
  135. /package/dist/revo-grid/{header-cell-renderer-32d2ed96.js.map → header-cell-renderer-5939221a.js.map} +0 -0
  136. /package/dist/revo-grid/{key.utils-17273f42.js.map → key.utils-5ff2ec82.js.map} +0 -0
  137. /package/dist/revo-grid/{row-header-utils-3dfbb81f.js.map → row-header-utils-5511678e.js.map} +0 -0
  138. /package/dist/revo-grid/{text-editor-901c3eb8.js.map → text-editor-81767dcb.js.map} +0 -0
  139. /package/dist/revo-grid/{throttle-138d69c3.js.map → throttle-4eff5b3c.js.map} +0 -0
@@ -0,0 +1,13 @@
1
+ import { DimensionSettingsState } from "../../types/index";
2
+ import { Observable, PluginSubscribe } from '../../utils';
3
+ /**
4
+ * Plugin for trimming
5
+ *
6
+ * 1.a. Retrieves the previous sizes value. Saves the resulting trimmed data as a new sizes value.
7
+ * 1.b. Stores a reference to the trimmed data to prevent further changes.
8
+ * 2. Removes multiple and shifts the data based on the trimmed value.
9
+ */
10
+ export declare const trimmedPlugin: (storeService: {
11
+ store: Observable<DimensionSettingsState>;
12
+ setSizes: (k: DimensionSettingsState["sizes"]) => void;
13
+ }) => PluginSubscribe<DimensionSettingsState>;
@@ -1,2 +1,2 @@
1
- export type RevogridEvents = 'contentsizechanged' | 'beforeedit' | 'beforerangeedit' | 'afteredit' | 'beforeautofill' | 'beforerange' | 'afterfocus' | 'roworderchanged' | 'beforesortingapply' | 'beforesorting' | 'rowdragstart' | 'headerclick' | 'beforecellfocus' | 'beforefocuslost' | 'beforesourceset' | 'beforeanysource' | 'aftersourceset' | 'afteranysource' | 'beforecolumnsset' | 'beforecolumnapplied' | 'aftercolumnsset' | 'beforefilterapply' | 'beforefiltertrimmed' | 'beforetrimmed' | 'aftertrimmed' | 'viewportscroll' | 'beforeexport' | 'beforeeditstart' | 'aftercolumnresize' | 'beforerowdefinition' | 'filterconfigchanged' | 'rowheaderschanged' | 'beforegridrender' | 'aftergridrender' | 'aftergridinit' | 'additionaldatachanged' | 'afterthemechanged' | 'beforepaste' | 'beforepasteapply' | 'pasteregion' | 'afterpasteapply' | 'beforecut' | 'clearregion' | 'beforecopy' | 'beforecopyapply' | 'copyregion' | 'beforerowrender' | 'afterrender' | 'beforecellrender' | 'dragstartcell' | 'celledit' | 'closeedit' | 'filterChange' | 'resetChange' | 'beforefocusrender' | 'beforescrollintoview' | 'afterfocus' | 'beforeheaderclick' | 'headerresize' | 'beforeheaderresize' | 'headerdblclick' | 'beforeheaderrender' | 'afterheaderrender' | 'rowdragstartinit' | 'rowdragendinit' | 'rowdragmoveinit' | 'rowdragmousemove' | 'rowdropinit' | 'roworderchange' | 'beforecopyregion' | 'beforepasteregion' | 'celleditapply' | 'beforecellfocusinit' | 'beforenextvpfocus' | 'setedit' | 'beforeapplyrange' | 'beforesetrange' | 'beforeeditrender' | 'setrange' | 'selectall' | 'canceledit' | 'settemprange' | 'beforesettemprange' | 'applyfocus' | 'focuscell' | 'beforerangedataapply' | 'selectionchangeinit' | 'beforerangecopyapply' | 'rangeeditapply' | 'clipboardrangecopy' | 'clipboardrangepaste' | 'beforekeydown' | 'beforekeyup' | 'beforecellsave' | 'scrollview' | 'ref' | 'scrollvirtual' | 'scrollviewport' | 'resizeviewport' | 'scrollchange' | 'scrollviewportsilent' | 'html';
1
+ export type RevogridEvents = 'contentsizechanged' | 'beforeedit' | 'beforerangeedit' | 'afteredit' | 'beforeautofill' | 'beforerange' | 'afterfocus' | 'roworderchanged' | 'beforesortingapply' | 'beforesorting' | 'rowdragstart' | 'headerclick' | 'beforecellfocus' | 'beforefocuslost' | 'beforesourceset' | 'beforeanysource' | 'aftersourceset' | 'afteranysource' | 'beforecolumnsset' | 'beforecolumnapplied' | 'aftercolumnsset' | 'beforefilterapply' | 'beforefiltertrimmed' | 'beforetrimmed' | 'aftertrimmed' | 'viewportscroll' | 'beforeexport' | 'beforeeditstart' | 'aftercolumnresize' | 'beforerowdefinition' | 'filterconfigchanged' | 'rowheaderschanged' | 'beforegridrender' | 'aftergridrender' | 'aftergridinit' | 'additionaldatachanged' | 'afterthemechanged' | 'beforepaste' | 'beforepasteapply' | 'pasteregion' | 'afterpasteapply' | 'beforecut' | 'clearregion' | 'beforecopy' | 'beforecopyapply' | 'copyregion' | 'beforerowrender' | 'afterrender' | 'beforecellrender' | 'beforedatarender' | 'dragstartcell' | 'celledit' | 'closeedit' | 'filterChange' | 'resetChange' | 'beforefocusrender' | 'beforescrollintoview' | 'afterfocus' | 'beforeheaderclick' | 'headerresize' | 'beforeheaderresize' | 'headerdblclick' | 'beforeheaderrender' | 'afterheaderrender' | 'rowdragstartinit' | 'rowdragendinit' | 'rowdragmoveinit' | 'rowdragmousemove' | 'rowdropinit' | 'roworderchange' | 'beforecopyregion' | 'beforepasteregion' | 'celleditapply' | 'beforecellfocusinit' | 'beforenextvpfocus' | 'setedit' | 'beforeapplyrange' | 'beforesetrange' | 'beforeeditrender' | 'setrange' | 'selectall' | 'canceledit' | 'settemprange' | 'beforesettemprange' | 'applyfocus' | 'focuscell' | 'beforerangedataapply' | 'selectionchangeinit' | 'beforerangecopyapply' | 'rangeeditapply' | 'clipboardrangecopy' | 'clipboardrangepaste' | 'beforekeydown' | 'beforekeyup' | 'beforecellsave' | 'scrollview' | 'ref' | 'scrollvirtual' | 'scrollviewport' | 'resizeviewport' | 'scrollchange' | 'scrollviewportsilent' | 'html';
2
2
  export declare const REVOGRID_EVENTS: Map<RevogridEvents, RevogridEvents>;
@@ -527,9 +527,14 @@ export interface DimensionCalc {
527
527
  * Object containing information about trimmed data.
528
528
  * Used for hiding entities from visible data source.
529
529
  */
530
- trimmed: Record<any, any>;
530
+ trimmed: {
531
+ [index: number]: number;
532
+ } | null;
531
533
  /**
532
534
  * Object containing size for each visible item.
535
+ * provider stores only changed sizes, not all of them
536
+ * same as indexes but for sizes and positions
537
+ * virtual item index to size
533
538
  */
534
539
  sizes: ViewSettingSizeProp;
535
540
  }
package/hydrate/index.js CHANGED
@@ -6314,18 +6314,13 @@ const createStore = (defaultState, shouldUpdate) => {
6314
6314
  const trimmedPlugin$1 = (store) => ({
6315
6315
  set(k, newVal) {
6316
6316
  switch (k) {
6317
- case 'trimmed':
6317
+ case 'trimmed': {
6318
6318
  const proxy = store.get('proxyItems');
6319
6319
  const trimmed = gatherTrimmedItems(newVal);
6320
- const newItems = proxy.reduce((result, v) => {
6321
- // check if present in new trimmed remove from items (filter)
6322
- if (!trimmed[v]) {
6323
- result.push(v);
6324
- }
6325
- return result;
6326
- }, []);
6320
+ const newItems = proxy.filter(v => !trimmed[v]);
6327
6321
  store.set('items', newItems);
6328
6322
  break;
6323
+ }
6329
6324
  }
6330
6325
  },
6331
6326
  });
@@ -6801,10 +6796,8 @@ function calculateDimensionData(originItemSize, newSizes = {}) {
6801
6796
  const positionIndexes = [];
6802
6797
  const positionIndexToItem = {};
6803
6798
  const indexToItem = {};
6804
- // combine all new sizes
6805
- const sizes = Object.assign({}, newSizes);
6806
6799
  // prepare order sorted new sizes and calculate changed real size
6807
- const newIndexes = Object.keys(sizes).map(Number).sort((a, b) => a - b);
6800
+ const newIndexes = Object.keys(newSizes).map(Number).sort((a, b) => a - b);
6808
6801
  // fill new coordinates based on what is changed
6809
6802
  newIndexes.reduce((previous, itemIndex, i) => {
6810
6803
  const newItem = {
@@ -6820,7 +6813,7 @@ function calculateDimensionData(originItemSize, newSizes = {}) {
6820
6813
  else {
6821
6814
  newItem.start = itemIndex * originItemSize;
6822
6815
  }
6823
- newItem.end = newItem.start + sizes[itemIndex];
6816
+ newItem.end = newItem.start + newSizes[itemIndex];
6824
6817
  positionIndexes.push(newItem.start);
6825
6818
  indexToItem[itemIndex] = positionIndexToItem[i] = newItem;
6826
6819
  return newItem;
@@ -6830,7 +6823,6 @@ function calculateDimensionData(originItemSize, newSizes = {}) {
6830
6823
  positionIndexes: [...positionIndexes],
6831
6824
  positionIndexToItem: Object.assign({}, positionIndexToItem),
6832
6825
  indexToItem,
6833
- sizes,
6834
6826
  };
6835
6827
  }
6836
6828
  /**
@@ -6891,37 +6883,6 @@ function getItemByIndex(dimension, index) {
6891
6883
  return item;
6892
6884
  }
6893
6885
 
6894
- /**
6895
- * Storing pre-calculated
6896
- * Dimension information and sizes
6897
- */
6898
- const trimmedPlugin = (store) => {
6899
- let trimmedSize = {};
6900
- const setTrimmed = (sizes, trimmed) => {
6901
- const newSize = Object.assign({}, sizes);
6902
- trimmedSize = {};
6903
- for (const [index, v] of Object.entries(trimmed)) {
6904
- const i = index;
6905
- if (v && newSize[i]) {
6906
- trimmedSize[i] = newSize[i];
6907
- delete newSize[i];
6908
- }
6909
- }
6910
- store.setDimensionSize(newSize);
6911
- };
6912
- return {
6913
- set(key, val) {
6914
- switch (key) {
6915
- case 'trimmed':
6916
- const trim = val;
6917
- const sizes = store.store.get('sizes');
6918
- // recover trimmed, apply new trim
6919
- setTrimmed(Object.assign(Object.assign({}, sizes), trimmedSize), trim);
6920
- break;
6921
- }
6922
- },
6923
- };
6924
- };
6925
6886
  /**
6926
6887
  * Plugin which recalculates realSize on changes of sizes, originItemSize and count
6927
6888
  */
@@ -6937,7 +6898,7 @@ const recalculateRealSizePlugin = (storeService) => {
6937
6898
  switch (k) {
6938
6899
  case 'count':
6939
6900
  case 'sizes':
6940
- case 'originItemSize':
6901
+ case 'originItemSize': {
6941
6902
  // recalculate realSize
6942
6903
  let realSize = 0;
6943
6904
  const count = storeService.store.get('count');
@@ -6948,19 +6909,81 @@ const recalculateRealSizePlugin = (storeService) => {
6948
6909
  }
6949
6910
  storeService.setStore({ realSize });
6950
6911
  break;
6912
+ }
6951
6913
  }
6952
6914
  },
6953
6915
  };
6954
6916
  };
6917
+
6918
+ /**
6919
+ * Plugin for trimming
6920
+ *
6921
+ * 1.a. Retrieves the previous sizes value. Saves the resulting trimmed data as a new sizes value.
6922
+ * 1.b. Stores a reference to the trimmed data to prevent further changes.
6923
+ * 2. Removes multiple and shifts the data based on the trimmed value.
6924
+ */
6925
+ const trimmedPlugin = (storeService) => {
6926
+ let trimmingObject = null;
6927
+ let trimmedPreviousSizes = null;
6928
+ return {
6929
+ set(key, val) {
6930
+ switch (key) {
6931
+ case 'sizes': {
6932
+ // prevent changes after trimming
6933
+ if (trimmingObject && trimmingObject === val) {
6934
+ trimmingObject = null;
6935
+ return;
6936
+ }
6937
+ trimmedPreviousSizes = null;
6938
+ break;
6939
+ }
6940
+ case 'trimmed': {
6941
+ const trim = val;
6942
+ if (!trimmedPreviousSizes) {
6943
+ trimmedPreviousSizes = storeService.store.get('sizes');
6944
+ }
6945
+ trimmingObject = removeMultipleAndShift(trimmedPreviousSizes, trim || {});
6946
+ // save a reference to the trimmed object to prevent changes after trimming
6947
+ storeService.setSizes(trimmingObject);
6948
+ break;
6949
+ }
6950
+ }
6951
+ },
6952
+ };
6953
+ };
6954
+ function removeMultipleAndShift(items, toRemove) {
6955
+ const newItems = {};
6956
+ const sortedIndexes = Object.keys(items || {})
6957
+ .map(Number)
6958
+ .sort((a, b) => a - b);
6959
+ const lastIndex = sortedIndexes[sortedIndexes.length - 1];
6960
+ let shift = 0;
6961
+ for (let i = 0; i <= lastIndex; i++) {
6962
+ if (toRemove[i] !== undefined) {
6963
+ shift++;
6964
+ // skip already removed
6965
+ if (items[i] !== undefined) {
6966
+ continue;
6967
+ }
6968
+ }
6969
+ if (items[i] !== undefined) {
6970
+ newItems[i - shift] = items[i];
6971
+ }
6972
+ }
6973
+ return newItems;
6974
+ }
6975
+
6976
+ /**
6977
+ * Storing pre-calculated
6978
+ * Dimension information and sizes
6979
+ */
6955
6980
  function initialBase() {
6956
6981
  return {
6957
6982
  indexes: [],
6958
6983
  count: 0,
6959
- // plugin support
6960
- trimmed: {},
6961
- // size operations, this provider stores only changed sizes, not all of them
6962
- // same as indexes but for sizes and positions
6963
- // item index to size
6984
+ // hidden items
6985
+ trimmed: null,
6986
+ // virtual item index to size
6964
6987
  sizes: {},
6965
6988
  // order in indexes[] to coordinate
6966
6989
  positionIndexToItem: {},
@@ -6980,8 +7003,14 @@ class DimensionStore {
6980
7003
  constructor(type) {
6981
7004
  this.type = type;
6982
7005
  this.store = createStore(initialState$1());
6983
- this.store.use(trimmedPlugin(this));
6984
- this.store.use(recalculateRealSizePlugin(this));
7006
+ this.store.use(trimmedPlugin({
7007
+ store: this.store,
7008
+ setSizes: this.setDimensionSize.bind(this),
7009
+ }));
7010
+ this.store.use(recalculateRealSizePlugin({
7011
+ store: this.store,
7012
+ setStore: this.setStore.bind(this),
7013
+ }));
6985
7014
  }
6986
7015
  getCurrentState() {
6987
7016
  const state = initialState$1();
@@ -7006,9 +7035,40 @@ class DimensionStore {
7006
7035
  * Generates new indexes based on sizes
7007
7036
  * @param sizes - sizes to set
7008
7037
  */
7009
- setDimensionSize(sizes) {
7038
+ setDimensionSize(sizes = {}) {
7010
7039
  const dimensionData = calculateDimensionData(this.store.get('originItemSize'), sizes);
7011
- setStore(this.store, dimensionData);
7040
+ setStore(this.store, Object.assign(Object.assign({}, dimensionData), { sizes }));
7041
+ }
7042
+ updateSizesPositionByIndexes(newItemsOrder, prevItemsOrder = []) {
7043
+ // Move custom sizes to new order
7044
+ const customSizes = Object.assign({}, this.store.get('sizes'));
7045
+ if (!Object.keys(customSizes).length) {
7046
+ return;
7047
+ }
7048
+ // Step 1: Create a map of original indices, but allow duplicates by storing arrays of indices
7049
+ const originalIndices = {};
7050
+ prevItemsOrder.forEach((physIndex, virtIndex) => {
7051
+ if (!originalIndices[physIndex]) {
7052
+ originalIndices[physIndex] = [];
7053
+ }
7054
+ originalIndices[physIndex].push(virtIndex); // Store all indices for each value
7055
+ });
7056
+ // Step 2: Create new sizes based on new item order
7057
+ const newSizes = {};
7058
+ newItemsOrder.forEach((physIndex, virtIndex) => {
7059
+ const indices = originalIndices[physIndex]; // Get all original indices for this value
7060
+ if (indices && indices.length > 0) {
7061
+ const originalIndex = indices.shift(); // Get the first available original index
7062
+ if (originalIndex !== undefined && originalIndex !== virtIndex && customSizes[originalIndex]) {
7063
+ newSizes[virtIndex] = customSizes[originalIndex];
7064
+ delete customSizes[originalIndex];
7065
+ }
7066
+ }
7067
+ });
7068
+ // Step 3: Set new sizes if there are changes
7069
+ if (Object.keys(newSizes).length) {
7070
+ this.setDimensionSize(Object.assign(Object.assign({}, customSizes), newSizes));
7071
+ }
7012
7072
  }
7013
7073
  }
7014
7074
 
@@ -10476,11 +10536,13 @@ class DimensionProvider {
10476
10536
  * @param columns - new columns data
10477
10537
  * @param disableVirtualX - disable virtual data for X axis
10478
10538
  */
10479
- applyNewColumns(columns, disableVirtualX) {
10539
+ applyNewColumns(columns, disableVirtualX, keepOld = false) {
10480
10540
  // Apply new columns to dimension provider
10481
10541
  for (let type of columnTypes) {
10482
- // Clear existing data in the dimension provider
10483
- this.stores[type].drop();
10542
+ if (!keepOld) {
10543
+ // Clear existing data in the dimension provider
10544
+ this.stores[type].drop();
10545
+ }
10484
10546
  // Get the new columns for the current type
10485
10547
  const items = columns[type];
10486
10548
  // Determine if virtual data should be disabled for the current type
@@ -10551,25 +10613,8 @@ class DimensionProvider {
10551
10613
  }
10552
10614
  updateSizesPositionByNewDataIndexes(type, newItemsOrder, prevItemsOrder = []) {
10553
10615
  // Move custom sizes to new order
10554
- const dimService = this.stores[type];
10555
- const customSizes = Object.assign({}, dimService.store.get('sizes'));
10556
- if (Object.keys(customSizes).length) {
10557
- const originalIndices = new Map();
10558
- prevItemsOrder.forEach((value, index) => {
10559
- originalIndices.set(value, index);
10560
- });
10561
- const newSizes = {};
10562
- newItemsOrder.forEach((value, newIndex) => {
10563
- const originalIndex = originalIndices.get(value);
10564
- if (originalIndex !== newIndex && customSizes[originalIndex]) {
10565
- newSizes[newIndex] = customSizes[originalIndex];
10566
- delete customSizes[originalIndex];
10567
- }
10568
- });
10569
- if (Object.keys(newSizes).length) {
10570
- this.setCustomSizes(type, Object.assign(Object.assign({}, customSizes), newSizes));
10571
- }
10572
- }
10616
+ this.stores[type].updateSizesPositionByIndexes(newItemsOrder, prevItemsOrder);
10617
+ this.updateViewport(type, true);
10573
10618
  }
10574
10619
  }
10575
10620
 
@@ -11146,6 +11191,9 @@ class FilterPlugin extends BasePlugin {
11146
11191
  }
11147
11192
  });
11148
11193
  }
11194
+ if (Object.keys(this.multiFilterItems).length === 0) {
11195
+ return;
11196
+ }
11149
11197
  await this.runFiltering(this.multiFilterItems);
11150
11198
  };
11151
11199
  this.addEventListener('headerclick', (e) => this.headerclick(e));
@@ -11684,9 +11732,8 @@ class SortingPlugin extends BasePlugin {
11684
11732
  if (beforeApplyEvent.defaultPrevented) {
11685
11733
  return;
11686
11734
  }
11687
- order = beforeApplyEvent.detail.order;
11688
- const cmp = this.getComparer(column, order);
11689
- if (additive && this.sorting) {
11735
+ const cmp = this.getComparer(beforeApplyEvent.detail.column, beforeApplyEvent.detail.order);
11736
+ if (beforeApplyEvent.detail.additive && this.sorting) {
11690
11737
  const sorting = {};
11691
11738
  const sortingFunc = {};
11692
11739
  this.sorting = Object.assign(Object.assign({}, this.sorting), sorting);
@@ -11750,11 +11797,15 @@ class SortingPlugin extends BasePlugin {
11750
11797
  // row indexes
11751
11798
  const proxyItems = storeService.store.get('proxyItems');
11752
11799
  const newItemsOrder = this.sortIndexByItems([...proxyItems], source, sortingFunc);
11753
- this.providers.dimension.updateSizesPositionByNewDataIndexes(type, newItemsOrder, proxyItems);
11800
+ // take row indexes before trim applied and proxy items
11801
+ const prevItems = storeService.store.get('items');
11754
11802
  storeService.setData({
11755
11803
  proxyItems: newItemsOrder,
11756
11804
  source: [...source],
11757
11805
  });
11806
+ // take currently visible row indexes
11807
+ const newItems = storeService.store.get('items');
11808
+ this.providers.dimension.updateSizesPositionByNewDataIndexes(type, newItems, prevItems);
11758
11809
  }
11759
11810
  }
11760
11811
  this.emit('aftersortingapply');
@@ -14128,7 +14179,7 @@ class RevoGridComponent {
14128
14179
  // Column format change will trigger column structure update
14129
14180
  this.columnChanged(this.columns);
14130
14181
  }
14131
- columnChanged(newVal = []) {
14182
+ columnChanged(newVal = [], _prevVal = undefined, __watchName = 'columns', init = false) {
14132
14183
  if (!this.dimensionProvider || !this.columnProvider) {
14133
14184
  return;
14134
14185
  }
@@ -14137,7 +14188,7 @@ class RevoGridComponent {
14137
14188
  if (beforeSetEvent.defaultPrevented) {
14138
14189
  return;
14139
14190
  }
14140
- this.dimensionProvider.applyNewColumns(beforeSetEvent.detail.columns, this.disableVirtualX);
14191
+ this.dimensionProvider.applyNewColumns(beforeSetEvent.detail.columns, this.disableVirtualX, init);
14141
14192
  const beforeApplyEvent = this.beforecolumnapplied.emit(columnGather);
14142
14193
  if (beforeApplyEvent.defaultPrevented) {
14143
14194
  return;
@@ -14426,7 +14477,7 @@ class RevoGridComponent {
14426
14477
  // set data
14427
14478
  this.applyStretch(this.stretch);
14428
14479
  this.themeChanged(this.theme, undefined, undefined, true);
14429
- this.columnChanged(this.columns);
14480
+ this.columnChanged(this.columns, undefined, undefined, true);
14430
14481
  this.dataSourceChanged(this.source, undefined, 'source');
14431
14482
  this.dataSourceChanged(this.pinnedTopSource, undefined, 'pinnedTopSource');
14432
14483
  this.dataSourceChanged(this.pinnedBottomSource, undefined, 'pinnedBottomSource');
@@ -14434,7 +14485,10 @@ class RevoGridComponent {
14434
14485
  this.trimmedRowsChanged(this.trimmedRows);
14435
14486
  }
14436
14487
  this.rowDefChanged(this.rowDefinitions);
14437
- this.groupingChanged(this.grouping);
14488
+ // init grouping
14489
+ if (this.grouping && Object.keys(this.grouping).length > 0) {
14490
+ this.groupingChanged(this.grouping);
14491
+ }
14438
14492
  // init scrolling service
14439
14493
  this.scrollingService = new GridScrollingService((e) => {
14440
14494
  var _a;
@@ -14807,6 +14861,7 @@ class RevogrData {
14807
14861
  this.beforerowrender = createEvent(this, "beforerowrender", 7);
14808
14862
  this.afterrender = createEvent(this, "afterrender", 7);
14809
14863
  this.beforeCellRender = createEvent(this, "beforecellrender", 7);
14864
+ this.beforeDataRender = createEvent(this, "beforedatarender", 7);
14810
14865
  this.dragStartCell = createEvent(this, "dragstartcell", 7);
14811
14866
  /**
14812
14867
  * Rendered rows - virtual index vs vnode
@@ -14872,7 +14927,11 @@ class RevogrData {
14872
14927
  (_b = this.rangeUnsubscribe) === null || _b === void 0 ? void 0 : _b.call(this);
14873
14928
  }
14874
14929
  async componentWillRender() {
14875
- return Promise.all(this.jobsBeforeRender);
14930
+ this.beforeDataRender.emit({
14931
+ rowType: this.type,
14932
+ colType: this.colType,
14933
+ });
14934
+ return Promise.all(this.jobsBeforeRender.map(p => typeof p === 'function' ? p() : p));
14876
14935
  }
14877
14936
  componentDidRender() {
14878
14937
  this.afterrender.emit({ type: this.type });
@@ -16215,7 +16274,8 @@ class RevogrViewportScroll {
16215
16274
  this.scrollchange.emit({ type, hasScroll });
16216
16275
  }
16217
16276
  disconnectedCallback() {
16218
- this.resizeService.destroy();
16277
+ var _a;
16278
+ (_a = this.resizeService) === null || _a === void 0 ? void 0 : _a.destroy();
16219
16279
  }
16220
16280
  async componentDidRender() {
16221
16281
  var _a, _b, _c, _d;
@@ -16243,7 +16303,7 @@ class RevogrViewportScroll {
16243
16303
  this.setScrollVisibility('rgCol', this.horizontalScroll.clientWidth, this.contentWidth);
16244
16304
  }
16245
16305
  render() {
16246
- return (hAsync(Host, { key: '5a7d07c999e59a8b96a99c87e50103acb4f18406', onWheel: this.horizontalMouseWheel, onScroll: (e) => this.applyScroll('rgCol', e) }, hAsync("div", { key: '09ac58def608c3bc169ce12e09dd2dc2df1f90a2', class: "inner-content-table", style: { width: `${this.contentWidth}px` } }, hAsync("div", { key: 'c370a3b8d5d2f4925b77020ac85d5f4d06b876e0', class: "header-wrapper", ref: e => (this.header = e) }, hAsync("slot", { key: 'c5feeeaf90e42715bbf13619b2341d23257447fb', name: HEADER_SLOT })), hAsync("div", { key: '7c04ffd6e7893db57f883a736d0a4932743863ea', class: "vertical-inner", ref: el => (this.verticalScroll = el), onWheel: this.verticalMouseWheel, onScroll: (e) => this.applyScroll('rgRow', e) }, hAsync("div", { key: 'da5db752025ddaaf626411b445b3b90b5b81cdc8', class: "content-wrapper", style: { height: `${this.contentHeight}px` } }, hAsync("slot", { key: 'c5404f4628b68b4b18a6e9143c70e72c50616f9d', name: CONTENT_SLOT }))), hAsync("div", { key: 'ee9e1b5dd297f220aed3efef4b53b4dd74a11837', class: "footer-wrapper", ref: e => (this.footer = e) }, hAsync("slot", { key: '5ff132da3009d959a6e87fbbe3d22930f322c486', name: FOOTER_SLOT })))));
16306
+ return (hAsync(Host, { key: '2bd41b077bb8baff6405cf6d071b48f22928879c', onWheel: this.horizontalMouseWheel, onScroll: (e) => this.applyScroll('rgCol', e) }, hAsync("div", { key: '84367a3fc244706e2d027f8c9e59ea3a6f8fc984', class: "inner-content-table", style: { width: `${this.contentWidth}px` } }, hAsync("div", { key: 'cbb8a1fa15139f07f9061f81e79218d00c14b8e6', class: "header-wrapper", ref: e => (this.header = e) }, hAsync("slot", { key: '521618b45cf787bcc160532d01e9e1fcdd06823b', name: HEADER_SLOT })), hAsync("div", { key: '2b381270fe97e949fb876603be364cc647ebc2d5', class: "vertical-inner", ref: el => (this.verticalScroll = el), onWheel: this.verticalMouseWheel, onScroll: (e) => this.applyScroll('rgRow', e) }, hAsync("div", { key: 'a0a13d79b5d329132421571fdf2ab7b2e36e440e', class: "content-wrapper", style: { height: `${this.contentHeight}px` } }, hAsync("slot", { key: '10279a0876aa194959da09309f914e6ce39b94fd', name: CONTENT_SLOT }))), hAsync("div", { key: '619446ea77a713a8e157ff0f1a9afd0e5dfa356f', class: "footer-wrapper", ref: e => (this.footer = e) }, hAsync("slot", { key: '43966ad2fde89f09c606173abf837672d8d4f822', name: FOOTER_SLOT })))));
16247
16307
  }
16248
16308
  /**
16249
16309
  * Extra layer for scroll event monitoring, where MouseWheel event is not passing
@@ -16286,11 +16346,18 @@ class RevogrViewportScroll {
16286
16346
  * @param e
16287
16347
  */
16288
16348
  onVerticalMouseWheel(type, delta, e) {
16289
- var _a, _b, _c, _d;
16290
- (_a = e.preventDefault) === null || _a === void 0 ? void 0 : _a.call(e);
16291
- const scrollTop = (_c = (_b = this.verticalScroll) === null || _b === void 0 ? void 0 : _b.scrollTop) !== null && _c !== void 0 ? _c : 0;
16349
+ var _a, _b, _c, _d, _e, _f, _g, _h;
16350
+ const scrollTop = (_b = (_a = this.verticalScroll) === null || _a === void 0 ? void 0 : _a.scrollTop) !== null && _b !== void 0 ? _b : 0;
16351
+ const clientHeight = (_d = (_c = this.verticalScroll) === null || _c === void 0 ? void 0 : _c.clientHeight) !== null && _d !== void 0 ? _d : 0;
16352
+ const scrollHeight = (_f = (_e = this.verticalScroll) === null || _e === void 0 ? void 0 : _e.scrollHeight) !== null && _f !== void 0 ? _f : 0;
16353
+ // Detect if the user has reached the bottom
16354
+ const atBottom = (scrollTop + clientHeight >= scrollHeight) && e.deltaY > 0;
16355
+ const atTop = scrollTop === 0 && e.deltaY < 0;
16356
+ if (!atBottom && !atTop) {
16357
+ (_g = e.preventDefault) === null || _g === void 0 ? void 0 : _g.call(e);
16358
+ }
16292
16359
  const pos = scrollTop + e[delta];
16293
- (_d = this.localScrollService) === null || _d === void 0 ? void 0 : _d.scroll(pos, type, undefined, e[delta]);
16360
+ (_h = this.localScrollService) === null || _h === void 0 ? void 0 : _h.scroll(pos, type, undefined, e[delta]);
16294
16361
  this.localScrollTimer.latestScrollUpdate(type);
16295
16362
  }
16296
16363
  /**
@@ -16301,8 +16368,18 @@ class RevogrViewportScroll {
16301
16368
  */
16302
16369
  onHorizontalMouseWheel(type, delta, e) {
16303
16370
  var _a, _b;
16304
- (_a = e.preventDefault) === null || _a === void 0 ? void 0 : _a.call(e);
16305
- const pos = this.horizontalScroll.scrollLeft + e[delta];
16371
+ if (!e.deltaX) {
16372
+ return;
16373
+ }
16374
+ const { scrollLeft, scrollWidth, clientWidth } = this.horizontalScroll;
16375
+ // Detect if the user has reached the right end
16376
+ const atRight = (scrollLeft + clientWidth >= scrollWidth) && e.deltaX > 0;
16377
+ // Detect if the user has reached the left end
16378
+ const atLeft = scrollLeft === 0 && e.deltaX < 0;
16379
+ if (!atRight && !atLeft) {
16380
+ (_a = e.preventDefault) === null || _a === void 0 ? void 0 : _a.call(e);
16381
+ }
16382
+ const pos = scrollLeft + e[delta];
16306
16383
  (_b = this.localScrollService) === null || _b === void 0 ? void 0 : _b.scroll(pos, type, undefined, e[delta]);
16307
16384
  this.localScrollTimer.latestScrollUpdate(type);
16308
16385
  }