@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
package/hydrate/index.mjs CHANGED
@@ -6310,18 +6310,13 @@ const createStore = (defaultState, shouldUpdate) => {
6310
6310
  const trimmedPlugin$1 = (store) => ({
6311
6311
  set(k, newVal) {
6312
6312
  switch (k) {
6313
- case 'trimmed':
6313
+ case 'trimmed': {
6314
6314
  const proxy = store.get('proxyItems');
6315
6315
  const trimmed = gatherTrimmedItems(newVal);
6316
- const newItems = proxy.reduce((result, v) => {
6317
- // check if present in new trimmed remove from items (filter)
6318
- if (!trimmed[v]) {
6319
- result.push(v);
6320
- }
6321
- return result;
6322
- }, []);
6316
+ const newItems = proxy.filter(v => !trimmed[v]);
6323
6317
  store.set('items', newItems);
6324
6318
  break;
6319
+ }
6325
6320
  }
6326
6321
  },
6327
6322
  });
@@ -6797,10 +6792,8 @@ function calculateDimensionData(originItemSize, newSizes = {}) {
6797
6792
  const positionIndexes = [];
6798
6793
  const positionIndexToItem = {};
6799
6794
  const indexToItem = {};
6800
- // combine all new sizes
6801
- const sizes = Object.assign({}, newSizes);
6802
6795
  // prepare order sorted new sizes and calculate changed real size
6803
- const newIndexes = Object.keys(sizes).map(Number).sort((a, b) => a - b);
6796
+ const newIndexes = Object.keys(newSizes).map(Number).sort((a, b) => a - b);
6804
6797
  // fill new coordinates based on what is changed
6805
6798
  newIndexes.reduce((previous, itemIndex, i) => {
6806
6799
  const newItem = {
@@ -6816,7 +6809,7 @@ function calculateDimensionData(originItemSize, newSizes = {}) {
6816
6809
  else {
6817
6810
  newItem.start = itemIndex * originItemSize;
6818
6811
  }
6819
- newItem.end = newItem.start + sizes[itemIndex];
6812
+ newItem.end = newItem.start + newSizes[itemIndex];
6820
6813
  positionIndexes.push(newItem.start);
6821
6814
  indexToItem[itemIndex] = positionIndexToItem[i] = newItem;
6822
6815
  return newItem;
@@ -6826,7 +6819,6 @@ function calculateDimensionData(originItemSize, newSizes = {}) {
6826
6819
  positionIndexes: [...positionIndexes],
6827
6820
  positionIndexToItem: Object.assign({}, positionIndexToItem),
6828
6821
  indexToItem,
6829
- sizes,
6830
6822
  };
6831
6823
  }
6832
6824
  /**
@@ -6887,37 +6879,6 @@ function getItemByIndex(dimension, index) {
6887
6879
  return item;
6888
6880
  }
6889
6881
 
6890
- /**
6891
- * Storing pre-calculated
6892
- * Dimension information and sizes
6893
- */
6894
- const trimmedPlugin = (store) => {
6895
- let trimmedSize = {};
6896
- const setTrimmed = (sizes, trimmed) => {
6897
- const newSize = Object.assign({}, sizes);
6898
- trimmedSize = {};
6899
- for (const [index, v] of Object.entries(trimmed)) {
6900
- const i = index;
6901
- if (v && newSize[i]) {
6902
- trimmedSize[i] = newSize[i];
6903
- delete newSize[i];
6904
- }
6905
- }
6906
- store.setDimensionSize(newSize);
6907
- };
6908
- return {
6909
- set(key, val) {
6910
- switch (key) {
6911
- case 'trimmed':
6912
- const trim = val;
6913
- const sizes = store.store.get('sizes');
6914
- // recover trimmed, apply new trim
6915
- setTrimmed(Object.assign(Object.assign({}, sizes), trimmedSize), trim);
6916
- break;
6917
- }
6918
- },
6919
- };
6920
- };
6921
6882
  /**
6922
6883
  * Plugin which recalculates realSize on changes of sizes, originItemSize and count
6923
6884
  */
@@ -6933,7 +6894,7 @@ const recalculateRealSizePlugin = (storeService) => {
6933
6894
  switch (k) {
6934
6895
  case 'count':
6935
6896
  case 'sizes':
6936
- case 'originItemSize':
6897
+ case 'originItemSize': {
6937
6898
  // recalculate realSize
6938
6899
  let realSize = 0;
6939
6900
  const count = storeService.store.get('count');
@@ -6944,19 +6905,81 @@ const recalculateRealSizePlugin = (storeService) => {
6944
6905
  }
6945
6906
  storeService.setStore({ realSize });
6946
6907
  break;
6908
+ }
6947
6909
  }
6948
6910
  },
6949
6911
  };
6950
6912
  };
6913
+
6914
+ /**
6915
+ * Plugin for trimming
6916
+ *
6917
+ * 1.a. Retrieves the previous sizes value. Saves the resulting trimmed data as a new sizes value.
6918
+ * 1.b. Stores a reference to the trimmed data to prevent further changes.
6919
+ * 2. Removes multiple and shifts the data based on the trimmed value.
6920
+ */
6921
+ const trimmedPlugin = (storeService) => {
6922
+ let trimmingObject = null;
6923
+ let trimmedPreviousSizes = null;
6924
+ return {
6925
+ set(key, val) {
6926
+ switch (key) {
6927
+ case 'sizes': {
6928
+ // prevent changes after trimming
6929
+ if (trimmingObject && trimmingObject === val) {
6930
+ trimmingObject = null;
6931
+ return;
6932
+ }
6933
+ trimmedPreviousSizes = null;
6934
+ break;
6935
+ }
6936
+ case 'trimmed': {
6937
+ const trim = val;
6938
+ if (!trimmedPreviousSizes) {
6939
+ trimmedPreviousSizes = storeService.store.get('sizes');
6940
+ }
6941
+ trimmingObject = removeMultipleAndShift(trimmedPreviousSizes, trim || {});
6942
+ // save a reference to the trimmed object to prevent changes after trimming
6943
+ storeService.setSizes(trimmingObject);
6944
+ break;
6945
+ }
6946
+ }
6947
+ },
6948
+ };
6949
+ };
6950
+ function removeMultipleAndShift(items, toRemove) {
6951
+ const newItems = {};
6952
+ const sortedIndexes = Object.keys(items || {})
6953
+ .map(Number)
6954
+ .sort((a, b) => a - b);
6955
+ const lastIndex = sortedIndexes[sortedIndexes.length - 1];
6956
+ let shift = 0;
6957
+ for (let i = 0; i <= lastIndex; i++) {
6958
+ if (toRemove[i] !== undefined) {
6959
+ shift++;
6960
+ // skip already removed
6961
+ if (items[i] !== undefined) {
6962
+ continue;
6963
+ }
6964
+ }
6965
+ if (items[i] !== undefined) {
6966
+ newItems[i - shift] = items[i];
6967
+ }
6968
+ }
6969
+ return newItems;
6970
+ }
6971
+
6972
+ /**
6973
+ * Storing pre-calculated
6974
+ * Dimension information and sizes
6975
+ */
6951
6976
  function initialBase() {
6952
6977
  return {
6953
6978
  indexes: [],
6954
6979
  count: 0,
6955
- // plugin support
6956
- trimmed: {},
6957
- // size operations, this provider stores only changed sizes, not all of them
6958
- // same as indexes but for sizes and positions
6959
- // item index to size
6980
+ // hidden items
6981
+ trimmed: null,
6982
+ // virtual item index to size
6960
6983
  sizes: {},
6961
6984
  // order in indexes[] to coordinate
6962
6985
  positionIndexToItem: {},
@@ -6976,8 +6999,14 @@ class DimensionStore {
6976
6999
  constructor(type) {
6977
7000
  this.type = type;
6978
7001
  this.store = createStore(initialState$1());
6979
- this.store.use(trimmedPlugin(this));
6980
- this.store.use(recalculateRealSizePlugin(this));
7002
+ this.store.use(trimmedPlugin({
7003
+ store: this.store,
7004
+ setSizes: this.setDimensionSize.bind(this),
7005
+ }));
7006
+ this.store.use(recalculateRealSizePlugin({
7007
+ store: this.store,
7008
+ setStore: this.setStore.bind(this),
7009
+ }));
6981
7010
  }
6982
7011
  getCurrentState() {
6983
7012
  const state = initialState$1();
@@ -7002,9 +7031,40 @@ class DimensionStore {
7002
7031
  * Generates new indexes based on sizes
7003
7032
  * @param sizes - sizes to set
7004
7033
  */
7005
- setDimensionSize(sizes) {
7034
+ setDimensionSize(sizes = {}) {
7006
7035
  const dimensionData = calculateDimensionData(this.store.get('originItemSize'), sizes);
7007
- setStore(this.store, dimensionData);
7036
+ setStore(this.store, Object.assign(Object.assign({}, dimensionData), { sizes }));
7037
+ }
7038
+ updateSizesPositionByIndexes(newItemsOrder, prevItemsOrder = []) {
7039
+ // Move custom sizes to new order
7040
+ const customSizes = Object.assign({}, this.store.get('sizes'));
7041
+ if (!Object.keys(customSizes).length) {
7042
+ return;
7043
+ }
7044
+ // Step 1: Create a map of original indices, but allow duplicates by storing arrays of indices
7045
+ const originalIndices = {};
7046
+ prevItemsOrder.forEach((physIndex, virtIndex) => {
7047
+ if (!originalIndices[physIndex]) {
7048
+ originalIndices[physIndex] = [];
7049
+ }
7050
+ originalIndices[physIndex].push(virtIndex); // Store all indices for each value
7051
+ });
7052
+ // Step 2: Create new sizes based on new item order
7053
+ const newSizes = {};
7054
+ newItemsOrder.forEach((physIndex, virtIndex) => {
7055
+ const indices = originalIndices[physIndex]; // Get all original indices for this value
7056
+ if (indices && indices.length > 0) {
7057
+ const originalIndex = indices.shift(); // Get the first available original index
7058
+ if (originalIndex !== undefined && originalIndex !== virtIndex && customSizes[originalIndex]) {
7059
+ newSizes[virtIndex] = customSizes[originalIndex];
7060
+ delete customSizes[originalIndex];
7061
+ }
7062
+ }
7063
+ });
7064
+ // Step 3: Set new sizes if there are changes
7065
+ if (Object.keys(newSizes).length) {
7066
+ this.setDimensionSize(Object.assign(Object.assign({}, customSizes), newSizes));
7067
+ }
7008
7068
  }
7009
7069
  }
7010
7070
 
@@ -10472,11 +10532,13 @@ class DimensionProvider {
10472
10532
  * @param columns - new columns data
10473
10533
  * @param disableVirtualX - disable virtual data for X axis
10474
10534
  */
10475
- applyNewColumns(columns, disableVirtualX) {
10535
+ applyNewColumns(columns, disableVirtualX, keepOld = false) {
10476
10536
  // Apply new columns to dimension provider
10477
10537
  for (let type of columnTypes) {
10478
- // Clear existing data in the dimension provider
10479
- this.stores[type].drop();
10538
+ if (!keepOld) {
10539
+ // Clear existing data in the dimension provider
10540
+ this.stores[type].drop();
10541
+ }
10480
10542
  // Get the new columns for the current type
10481
10543
  const items = columns[type];
10482
10544
  // Determine if virtual data should be disabled for the current type
@@ -10547,25 +10609,8 @@ class DimensionProvider {
10547
10609
  }
10548
10610
  updateSizesPositionByNewDataIndexes(type, newItemsOrder, prevItemsOrder = []) {
10549
10611
  // Move custom sizes to new order
10550
- const dimService = this.stores[type];
10551
- const customSizes = Object.assign({}, dimService.store.get('sizes'));
10552
- if (Object.keys(customSizes).length) {
10553
- const originalIndices = new Map();
10554
- prevItemsOrder.forEach((value, index) => {
10555
- originalIndices.set(value, index);
10556
- });
10557
- const newSizes = {};
10558
- newItemsOrder.forEach((value, newIndex) => {
10559
- const originalIndex = originalIndices.get(value);
10560
- if (originalIndex !== newIndex && customSizes[originalIndex]) {
10561
- newSizes[newIndex] = customSizes[originalIndex];
10562
- delete customSizes[originalIndex];
10563
- }
10564
- });
10565
- if (Object.keys(newSizes).length) {
10566
- this.setCustomSizes(type, Object.assign(Object.assign({}, customSizes), newSizes));
10567
- }
10568
- }
10612
+ this.stores[type].updateSizesPositionByIndexes(newItemsOrder, prevItemsOrder);
10613
+ this.updateViewport(type, true);
10569
10614
  }
10570
10615
  }
10571
10616
 
@@ -11142,6 +11187,9 @@ class FilterPlugin extends BasePlugin {
11142
11187
  }
11143
11188
  });
11144
11189
  }
11190
+ if (Object.keys(this.multiFilterItems).length === 0) {
11191
+ return;
11192
+ }
11145
11193
  await this.runFiltering(this.multiFilterItems);
11146
11194
  };
11147
11195
  this.addEventListener('headerclick', (e) => this.headerclick(e));
@@ -11680,9 +11728,8 @@ class SortingPlugin extends BasePlugin {
11680
11728
  if (beforeApplyEvent.defaultPrevented) {
11681
11729
  return;
11682
11730
  }
11683
- order = beforeApplyEvent.detail.order;
11684
- const cmp = this.getComparer(column, order);
11685
- if (additive && this.sorting) {
11731
+ const cmp = this.getComparer(beforeApplyEvent.detail.column, beforeApplyEvent.detail.order);
11732
+ if (beforeApplyEvent.detail.additive && this.sorting) {
11686
11733
  const sorting = {};
11687
11734
  const sortingFunc = {};
11688
11735
  this.sorting = Object.assign(Object.assign({}, this.sorting), sorting);
@@ -11746,11 +11793,15 @@ class SortingPlugin extends BasePlugin {
11746
11793
  // row indexes
11747
11794
  const proxyItems = storeService.store.get('proxyItems');
11748
11795
  const newItemsOrder = this.sortIndexByItems([...proxyItems], source, sortingFunc);
11749
- this.providers.dimension.updateSizesPositionByNewDataIndexes(type, newItemsOrder, proxyItems);
11796
+ // take row indexes before trim applied and proxy items
11797
+ const prevItems = storeService.store.get('items');
11750
11798
  storeService.setData({
11751
11799
  proxyItems: newItemsOrder,
11752
11800
  source: [...source],
11753
11801
  });
11802
+ // take currently visible row indexes
11803
+ const newItems = storeService.store.get('items');
11804
+ this.providers.dimension.updateSizesPositionByNewDataIndexes(type, newItems, prevItems);
11754
11805
  }
11755
11806
  }
11756
11807
  this.emit('aftersortingapply');
@@ -14124,7 +14175,7 @@ class RevoGridComponent {
14124
14175
  // Column format change will trigger column structure update
14125
14176
  this.columnChanged(this.columns);
14126
14177
  }
14127
- columnChanged(newVal = []) {
14178
+ columnChanged(newVal = [], _prevVal = undefined, __watchName = 'columns', init = false) {
14128
14179
  if (!this.dimensionProvider || !this.columnProvider) {
14129
14180
  return;
14130
14181
  }
@@ -14133,7 +14184,7 @@ class RevoGridComponent {
14133
14184
  if (beforeSetEvent.defaultPrevented) {
14134
14185
  return;
14135
14186
  }
14136
- this.dimensionProvider.applyNewColumns(beforeSetEvent.detail.columns, this.disableVirtualX);
14187
+ this.dimensionProvider.applyNewColumns(beforeSetEvent.detail.columns, this.disableVirtualX, init);
14137
14188
  const beforeApplyEvent = this.beforecolumnapplied.emit(columnGather);
14138
14189
  if (beforeApplyEvent.defaultPrevented) {
14139
14190
  return;
@@ -14422,7 +14473,7 @@ class RevoGridComponent {
14422
14473
  // set data
14423
14474
  this.applyStretch(this.stretch);
14424
14475
  this.themeChanged(this.theme, undefined, undefined, true);
14425
- this.columnChanged(this.columns);
14476
+ this.columnChanged(this.columns, undefined, undefined, true);
14426
14477
  this.dataSourceChanged(this.source, undefined, 'source');
14427
14478
  this.dataSourceChanged(this.pinnedTopSource, undefined, 'pinnedTopSource');
14428
14479
  this.dataSourceChanged(this.pinnedBottomSource, undefined, 'pinnedBottomSource');
@@ -14430,7 +14481,10 @@ class RevoGridComponent {
14430
14481
  this.trimmedRowsChanged(this.trimmedRows);
14431
14482
  }
14432
14483
  this.rowDefChanged(this.rowDefinitions);
14433
- this.groupingChanged(this.grouping);
14484
+ // init grouping
14485
+ if (this.grouping && Object.keys(this.grouping).length > 0) {
14486
+ this.groupingChanged(this.grouping);
14487
+ }
14434
14488
  // init scrolling service
14435
14489
  this.scrollingService = new GridScrollingService((e) => {
14436
14490
  var _a;
@@ -14803,6 +14857,7 @@ class RevogrData {
14803
14857
  this.beforerowrender = createEvent(this, "beforerowrender", 7);
14804
14858
  this.afterrender = createEvent(this, "afterrender", 7);
14805
14859
  this.beforeCellRender = createEvent(this, "beforecellrender", 7);
14860
+ this.beforeDataRender = createEvent(this, "beforedatarender", 7);
14806
14861
  this.dragStartCell = createEvent(this, "dragstartcell", 7);
14807
14862
  /**
14808
14863
  * Rendered rows - virtual index vs vnode
@@ -14868,7 +14923,11 @@ class RevogrData {
14868
14923
  (_b = this.rangeUnsubscribe) === null || _b === void 0 ? void 0 : _b.call(this);
14869
14924
  }
14870
14925
  async componentWillRender() {
14871
- return Promise.all(this.jobsBeforeRender);
14926
+ this.beforeDataRender.emit({
14927
+ rowType: this.type,
14928
+ colType: this.colType,
14929
+ });
14930
+ return Promise.all(this.jobsBeforeRender.map(p => typeof p === 'function' ? p() : p));
14872
14931
  }
14873
14932
  componentDidRender() {
14874
14933
  this.afterrender.emit({ type: this.type });
@@ -16211,7 +16270,8 @@ class RevogrViewportScroll {
16211
16270
  this.scrollchange.emit({ type, hasScroll });
16212
16271
  }
16213
16272
  disconnectedCallback() {
16214
- this.resizeService.destroy();
16273
+ var _a;
16274
+ (_a = this.resizeService) === null || _a === void 0 ? void 0 : _a.destroy();
16215
16275
  }
16216
16276
  async componentDidRender() {
16217
16277
  var _a, _b, _c, _d;
@@ -16239,7 +16299,7 @@ class RevogrViewportScroll {
16239
16299
  this.setScrollVisibility('rgCol', this.horizontalScroll.clientWidth, this.contentWidth);
16240
16300
  }
16241
16301
  render() {
16242
- 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 })))));
16302
+ 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 })))));
16243
16303
  }
16244
16304
  /**
16245
16305
  * Extra layer for scroll event monitoring, where MouseWheel event is not passing
@@ -16282,11 +16342,18 @@ class RevogrViewportScroll {
16282
16342
  * @param e
16283
16343
  */
16284
16344
  onVerticalMouseWheel(type, delta, e) {
16285
- var _a, _b, _c, _d;
16286
- (_a = e.preventDefault) === null || _a === void 0 ? void 0 : _a.call(e);
16287
- const scrollTop = (_c = (_b = this.verticalScroll) === null || _b === void 0 ? void 0 : _b.scrollTop) !== null && _c !== void 0 ? _c : 0;
16345
+ var _a, _b, _c, _d, _e, _f, _g, _h;
16346
+ const scrollTop = (_b = (_a = this.verticalScroll) === null || _a === void 0 ? void 0 : _a.scrollTop) !== null && _b !== void 0 ? _b : 0;
16347
+ const clientHeight = (_d = (_c = this.verticalScroll) === null || _c === void 0 ? void 0 : _c.clientHeight) !== null && _d !== void 0 ? _d : 0;
16348
+ const scrollHeight = (_f = (_e = this.verticalScroll) === null || _e === void 0 ? void 0 : _e.scrollHeight) !== null && _f !== void 0 ? _f : 0;
16349
+ // Detect if the user has reached the bottom
16350
+ const atBottom = (scrollTop + clientHeight >= scrollHeight) && e.deltaY > 0;
16351
+ const atTop = scrollTop === 0 && e.deltaY < 0;
16352
+ if (!atBottom && !atTop) {
16353
+ (_g = e.preventDefault) === null || _g === void 0 ? void 0 : _g.call(e);
16354
+ }
16288
16355
  const pos = scrollTop + e[delta];
16289
- (_d = this.localScrollService) === null || _d === void 0 ? void 0 : _d.scroll(pos, type, undefined, e[delta]);
16356
+ (_h = this.localScrollService) === null || _h === void 0 ? void 0 : _h.scroll(pos, type, undefined, e[delta]);
16290
16357
  this.localScrollTimer.latestScrollUpdate(type);
16291
16358
  }
16292
16359
  /**
@@ -16297,8 +16364,18 @@ class RevogrViewportScroll {
16297
16364
  */
16298
16365
  onHorizontalMouseWheel(type, delta, e) {
16299
16366
  var _a, _b;
16300
- (_a = e.preventDefault) === null || _a === void 0 ? void 0 : _a.call(e);
16301
- const pos = this.horizontalScroll.scrollLeft + e[delta];
16367
+ if (!e.deltaX) {
16368
+ return;
16369
+ }
16370
+ const { scrollLeft, scrollWidth, clientWidth } = this.horizontalScroll;
16371
+ // Detect if the user has reached the right end
16372
+ const atRight = (scrollLeft + clientWidth >= scrollWidth) && e.deltaX > 0;
16373
+ // Detect if the user has reached the left end
16374
+ const atLeft = scrollLeft === 0 && e.deltaX < 0;
16375
+ if (!atRight && !atLeft) {
16376
+ (_a = e.preventDefault) === null || _a === void 0 ? void 0 : _a.call(e);
16377
+ }
16378
+ const pos = scrollLeft + e[delta];
16302
16379
  (_b = this.localScrollService) === null || _b === void 0 ? void 0 : _b.scroll(pos, type, undefined, e[delta]);
16303
16380
  this.localScrollTimer.latestScrollUpdate(type);
16304
16381
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revolist/revogrid",
3
- "version": "4.9.41",
3
+ "version": "4.10.0",
4
4
  "type": "module",
5
5
  "description": "Virtual reactive data grid spreadsheet component - RevoGrid.",
6
6
  "license": "MIT",
@@ -2977,18 +2977,13 @@ const createStore = (defaultState, shouldUpdate) => {
2977
2977
  const trimmedPlugin = (store) => ({
2978
2978
  set(k, newVal) {
2979
2979
  switch (k) {
2980
- case 'trimmed':
2980
+ case 'trimmed': {
2981
2981
  const proxy = store.get('proxyItems');
2982
2982
  const trimmed = gatherTrimmedItems(newVal);
2983
- const newItems = proxy.reduce((result, v) => {
2984
- // check if present in new trimmed remove from items (filter)
2985
- if (!trimmed[v]) {
2986
- result.push(v);
2987
- }
2988
- return result;
2989
- }, []);
2983
+ const newItems = proxy.filter(v => !trimmed[v]);
2990
2984
  store.set('items', newItems);
2991
2985
  break;
2986
+ }
2992
2987
  }
2993
2988
  },
2994
2989
  });