@revolist/revogrid 4.22.1 → 4.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/cjs/{cell-renderer-BQdEGQXP.js → cell-renderer-Dcz022q7.js} +9 -3
  2. package/dist/cjs/{column.drag.plugin-RDjQhKCH.js → column.drag.plugin-DJueWxN_.js} +391 -256
  3. package/dist/cjs/{column.service-DXYMehqK.js → column.service-C1Qvcf5l.js} +10 -1
  4. package/dist/cjs/{dimension.helpers-CiiNnlLa.js → dimension.helpers-B9HgANnM.js} +14 -145
  5. package/dist/cjs/{edit.utils-CecCfA4E.js → edit.utils-pKeiYFLJ.js} +1 -1
  6. package/dist/cjs/{header-cell-renderer-DGyBrK8I.js → header-cell-renderer-QrcXXSkF.js} +1 -1
  7. package/dist/cjs/index-DxaSE5uZ.js +136 -0
  8. package/dist/cjs/index.cjs.js +37 -32
  9. package/dist/cjs/revo-grid.cjs.entry.js +124 -18
  10. package/dist/cjs/revogr-attribution_7.cjs.entry.js +43 -25
  11. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +10 -8
  12. package/dist/cjs/revogr-data_4.cjs.entry.js +74 -32
  13. package/dist/cjs/revogr-filter-panel.cjs.entry.js +2 -1
  14. package/dist/cjs/{text-editor-DnLZW1a-.js → text-editor-B4W-m-r-.js} +3 -3
  15. package/dist/cjs/{throttle-CfgQFkfR.js → throttle-BCwEuJJq.js} +59 -24
  16. package/dist/cjs/viewport.helpers-BND76K2j.js +140 -0
  17. package/dist/cjs/{viewport.store-q6YdR9mg.js → viewport.store-BlKQ4x9H.js} +16 -16
  18. package/dist/collection/components/data/revogr-data.js +5 -3
  19. package/dist/collection/components/header/header-group-renderer.js +1 -1
  20. package/dist/collection/components/header/header-renderer.js +1 -1
  21. package/dist/collection/components/header/revogr-header-style.css +13 -3
  22. package/dist/collection/components/header/revogr-header.js +53 -17
  23. package/dist/collection/components/order/order-row.service.js +6 -5
  24. package/dist/collection/components/overlay/keyboard.service.js +23 -1
  25. package/dist/collection/components/overlay/selection.utils.js +8 -6
  26. package/dist/collection/components/revoGrid/revo-grid.js +69 -5
  27. package/dist/collection/components/revoGrid/viewport.service.js +2 -1
  28. package/dist/collection/components/scroll/revogr-viewport-scroll.js +10 -6
  29. package/dist/collection/components/scrollable/revogr-scroll-virtual.js +4 -10
  30. package/dist/collection/plugins/filter/filter.panel.js +2 -1
  31. package/dist/collection/plugins/filter/filter.plugin.js +11 -4
  32. package/dist/collection/plugins/groupingRow/grouping.row.plugin.js +25 -1
  33. package/dist/collection/plugins/groupingRow/grouping.service.js +9 -0
  34. package/dist/collection/plugins/moveColumn/column.drag.plugin.js +4 -4
  35. package/dist/collection/plugins/sorting/sorting.func.js +173 -15
  36. package/dist/collection/plugins/sorting/sorting.plugin.js +167 -84
  37. package/dist/collection/plugins/sorting/sorting.sign.js +7 -1
  38. package/dist/collection/serve/controller.js +98 -37
  39. package/dist/collection/serve/data.js +273 -144
  40. package/dist/collection/services/dimension.provider.js +16 -1
  41. package/dist/collection/services/local.scroll.service.js +59 -24
  42. package/dist/collection/services/scroll.dimension.helpers.js +83 -0
  43. package/dist/collection/services/selection.store.connector.js +30 -4
  44. package/dist/collection/store/dimension/dimension.recalculate.plugin.js +22 -9
  45. package/dist/collection/store/dimension/dimension.store.js +4 -2
  46. package/dist/collection/store/vp/viewport.helpers.js +9 -0
  47. package/dist/collection/store/vp/viewport.store.js +5 -16
  48. package/dist/collection/utils/store.utils.js +3 -3
  49. package/dist/{revo-grid/cell-renderer-CALsEsnh.js → esm/cell-renderer-BtN-NGCk.js} +9 -3
  50. package/dist/esm/{column.drag.plugin-Dy5ztusn.js → column.drag.plugin-DCZW62Uc.js} +388 -255
  51. package/dist/esm/{column.service-CCvAi5l4.js → column.service-CC_SD8W3.js} +10 -1
  52. package/dist/{revo-grid/debounce-BfO9dz9v.js → esm/debounce-PCRWZliA.js} +1 -1
  53. package/dist/{revo-grid/dimension.helpers-DmIvjIa7.js → esm/dimension.helpers-CGKwSvw6.js} +7 -128
  54. package/dist/esm/{edit.utils-DYN6XZh8.js → edit.utils-Dnnbd0xG.js} +1 -1
  55. package/dist/{revo-grid/header-cell-renderer-DU8wKAbg.js → esm/header-cell-renderer-BsvUQ8GS.js} +1 -1
  56. package/dist/esm/index-Db3qZoW5.js +127 -0
  57. package/dist/esm/index.js +11 -10
  58. package/dist/esm/revo-grid.entry.js +123 -17
  59. package/dist/esm/revogr-attribution_7.entry.js +42 -24
  60. package/dist/esm/revogr-clipboard_3.entry.js +11 -9
  61. package/dist/esm/revogr-data_4.entry.js +75 -33
  62. package/dist/esm/revogr-filter-panel.entry.js +3 -2
  63. package/dist/esm/{text-editor-DpCnd6Fq.js → text-editor-C3RUSwH5.js} +2 -2
  64. package/dist/esm/{throttle-ERvyruXb.js → throttle-CaUDyxyU.js} +60 -25
  65. package/dist/esm/viewport.helpers-CoCAvmZs.js +133 -0
  66. package/dist/{revo-grid/viewport.store-CFjDW-3l.js → esm/viewport.store-COAfzAyu.js} +15 -17
  67. package/dist/{esm/cell-renderer-CALsEsnh.js → revo-grid/cell-renderer-BtN-NGCk.js} +9 -3
  68. package/dist/revo-grid/{column.drag.plugin-Dy5ztusn.js → column.drag.plugin-DCZW62Uc.js} +388 -255
  69. package/dist/revo-grid/{column.service-CCvAi5l4.js → column.service-CC_SD8W3.js} +10 -1
  70. package/dist/{esm/debounce-BfO9dz9v.js → revo-grid/debounce-PCRWZliA.js} +1 -1
  71. package/dist/{esm/dimension.helpers-DmIvjIa7.js → revo-grid/dimension.helpers-CGKwSvw6.js} +7 -128
  72. package/dist/revo-grid/{edit.utils-DYN6XZh8.js → edit.utils-Dnnbd0xG.js} +1 -1
  73. package/dist/{esm/header-cell-renderer-DU8wKAbg.js → revo-grid/header-cell-renderer-BsvUQ8GS.js} +1 -1
  74. package/dist/revo-grid/index-Db3qZoW5.js +127 -0
  75. package/dist/revo-grid/index.esm.js +11 -10
  76. package/dist/revo-grid/revo-grid.entry.js +123 -17
  77. package/dist/revo-grid/revogr-attribution_7.entry.js +42 -24
  78. package/dist/revo-grid/revogr-clipboard_3.entry.js +11 -9
  79. package/dist/revo-grid/revogr-data_4.entry.js +75 -33
  80. package/dist/revo-grid/revogr-filter-panel.entry.js +3 -2
  81. package/dist/revo-grid/{text-editor-DpCnd6Fq.js → text-editor-C3RUSwH5.js} +2 -2
  82. package/dist/revo-grid/{throttle-ERvyruXb.js → throttle-CaUDyxyU.js} +60 -25
  83. package/dist/revo-grid/viewport.helpers-CoCAvmZs.js +133 -0
  84. package/dist/{esm/viewport.store-CFjDW-3l.js → revo-grid/viewport.store-COAfzAyu.js} +15 -17
  85. package/dist/types/components/header/header-group-renderer.d.ts +2 -0
  86. package/dist/types/components/header/header-renderer.d.ts +1 -0
  87. package/dist/types/components/header/revogr-header.d.ts +2 -0
  88. package/dist/types/components/overlay/keyboard.service.d.ts +5 -0
  89. package/dist/types/components/revoGrid/revo-grid.d.ts +12 -0
  90. package/dist/types/plugins/groupingRow/grouping.row.plugin.d.ts +8 -0
  91. package/dist/types/plugins/sorting/sorting.func.d.ts +25 -2
  92. package/dist/types/plugins/sorting/sorting.plugin.d.ts +84 -9
  93. package/dist/types/plugins/sorting/sorting.sign.d.ts +5 -1
  94. package/dist/types/plugins/sorting/sorting.types.d.ts +46 -1
  95. package/dist/types/services/local.scroll.service.d.ts +10 -2
  96. package/dist/types/services/scroll.dimension.helpers.d.ts +20 -0
  97. package/dist/types/services/selection.store.connector.d.ts +6 -0
  98. package/dist/types/store/vp/viewport.helpers.d.ts +2 -0
  99. package/dist/types/types/interfaces.d.ts +11 -0
  100. package/dist/types/types/selection.d.ts +13 -0
  101. package/hydrate/index.js +795 -383
  102. package/hydrate/index.mjs +795 -383
  103. package/package.json +1 -1
  104. package/standalone/column.service.js +1 -1
  105. package/standalone/data.store.js +1 -1
  106. package/standalone/debounce.js +1 -1
  107. package/standalone/dimension.helpers.js +1 -1
  108. package/standalone/index.js +1 -1
  109. package/standalone/local.scroll.timer.js +1 -1
  110. package/standalone/revo-grid.js +1 -1
  111. package/standalone/revogr-data2.js +1 -1
  112. package/standalone/revogr-filter-panel.js +1 -1
  113. package/standalone/revogr-header2.js +1 -1
  114. package/standalone/revogr-order-editor2.js +1 -1
  115. package/standalone/revogr-overlay-selection2.js +1 -1
  116. package/standalone/revogr-row-headers.js +1 -1
  117. package/standalone/revogr-row-headers2.js +1 -1
  118. package/standalone/revogr-scroll-virtual2.js +1 -1
  119. package/standalone/revogr-viewport-scroll2.js +1 -1
  120. package/standalone/selection.utils.js +1 -1
  121. package/standalone/throttle.js +1 -1
  122. package/standalone/toNumber.js +1 -1
  123. package/dist/cjs/viewport.helpers-BAovztDd.js +0 -58
  124. package/dist/esm/viewport.helpers-VXhsJZtn.js +0 -52
  125. package/dist/revo-grid/viewport.helpers-VXhsJZtn.js +0 -52
@@ -2,14 +2,15 @@
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
4
  import { r as registerInstance, h, e as Host, d as createEvent, g as getElement } from './index-Chp_81rd.js';
5
- import { k as getItemByIndex, b as getSourceItem, j as getItemByPosition, J as FOCUS_CLASS, U as codesLetter, u as timeout, R as RESIZE_INTERVAL, K as MOBILE_CLASS, L as CELL_HANDLER_CLASS, S as SELECTION_BORDER_CLASS, D as DataStore, A as ROW_HEADER_TYPE, o as getScrollbarSize, T as TMP_SELECTION_BG_CLASS } from './dimension.helpers-DmIvjIa7.js';
5
+ import { k as getItemByIndex, b as getSourceItem, j as getItemByPosition, F as FOCUS_CLASS, I as codesLetter, R as RESIZE_INTERVAL, y as MOBILE_CLASS, z as CELL_HANDLER_CLASS, S as SELECTION_BORDER_CLASS, D as DataStore, q as ROW_HEADER_TYPE, T as TMP_SELECTION_BG_CLASS } from './dimension.helpers-CGKwSvw6.js';
6
6
  import { g as getPropertyFromEvent, v as verifyTouchTarget } from './events-BvSmBueA.js';
7
- import { g as getRange, M as ColumnService, z as getCellData, N as getCellEditor, b as isRangeSingleCell } from './column.service-CCvAi5l4.js';
8
- import { c as isClear, d as isTab, f as isEnterKeyValue, h as isCopy, g as isCut, j as isPaste, k as isAll, l as isShortcutModifier, m as isEditInput } from './edit.utils-DYN6XZh8.js';
9
- import { d as debounce } from './debounce-BfO9dz9v.js';
10
- import { V as ViewportStore, f as calculateRowHeaderSize } from './viewport.store-CFjDW-3l.js';
11
- import { H as HEADER_SLOT } from './viewport.helpers-VXhsJZtn.js';
12
- import { L as LocalScrollTimer, a as LocalScrollService, g as getContentSize, t as throttle } from './throttle-ERvyruXb.js';
7
+ import { g as getRange, M as ColumnService, z as getCellData, N as getCellEditor, b as isRangeSingleCell } from './column.service-CC_SD8W3.js';
8
+ import { l as isShortcutModifier, m as isEditInput, c as isClear, d as isTab, f as isEnterKeyValue, h as isCopy, g as isCut, j as isPaste, k as isAll } from './edit.utils-Dnnbd0xG.js';
9
+ import { t as timeout, g as getScrollbarSize } from './index-Db3qZoW5.js';
10
+ import { d as debounce } from './debounce-PCRWZliA.js';
11
+ import { V as ViewportStore, j as calculateRowHeaderSize } from './viewport.store-COAfzAyu.js';
12
+ import { H as HEADER_SLOT } from './viewport.helpers-CoCAvmZs.js';
13
+ import { L as LocalScrollTimer, a as LocalScrollService, g as getContentSize, t as throttle } from './throttle-CaUDyxyU.js';
13
14
 
14
15
  const Attribution = class {
15
16
  constructor(hostRef) {
@@ -107,8 +108,8 @@ function getCurrentCell({ x, y }, { el, rows, cols }) {
107
108
  cellX = width - 1;
108
109
  }
109
110
  // Get the row and column items based on the cell position
110
- const rgRow = getItemByPosition(rows, cellY);
111
- const rgCol = getItemByPosition(cols, cellX);
111
+ const rgRow = getItemByPosition(rows, cellY + (rows.renderOffset || 0));
112
+ const rgCol = getItemByPosition(cols, cellX + (cols.renderOffset || 0));
112
113
  // Set the row and column index to 0 if they are before the first item
113
114
  if (rgCol.itemIndex < 0) {
114
115
  rgCol.itemIndex = 0;
@@ -178,10 +179,12 @@ function styleByCellProps(styles) {
178
179
  };
179
180
  }
180
181
  function getCell({ x, y, x1, y1 }, dimensionRow, dimensionCol) {
181
- const top = getItemByIndex(dimensionRow, y).start;
182
- const left = getItemByIndex(dimensionCol, x).start;
183
- const bottom = getItemByIndex(dimensionRow, y1).end;
184
- const right = getItemByIndex(dimensionCol, x1).end;
182
+ const rowOffset = dimensionRow.renderOffset || 0;
183
+ const colOffset = dimensionCol.renderOffset || 0;
184
+ const top = getItemByIndex(dimensionRow, y).start - rowOffset;
185
+ const left = getItemByIndex(dimensionCol, x).start - colOffset;
186
+ const bottom = getItemByIndex(dimensionRow, y1).end - rowOffset;
187
+ const right = getItemByIndex(dimensionCol, x1).end - colOffset;
185
188
  return {
186
189
  left,
187
190
  right,
@@ -279,9 +282,29 @@ class KeyboardService {
279
282
  constructor(sv) {
280
283
  this.sv = sv;
281
284
  }
285
+ /**
286
+ * Appends printable key input that arrives after edit mode was requested
287
+ * but before the editor input has mounted or received focus.
288
+ */
289
+ appendPendingEditValue(e) {
290
+ if (isShortcutModifier(e) ||
291
+ e.key.length !== 1 ||
292
+ (e.target instanceof HTMLElement && isEditInput(e.target))) {
293
+ return false;
294
+ }
295
+ const editCell = this.sv.selectionStore.get('edit');
296
+ if (typeof (editCell === null || editCell === void 0 ? void 0 : editCell.val) !== 'string') {
297
+ return false;
298
+ }
299
+ this.sv.selectionStore.set('edit', Object.assign(Object.assign({}, editCell), { val: `${editCell.val}${e.key}` }));
300
+ return true;
301
+ }
282
302
  async keyDown(e, canRange, isEditMode, { range, focus }) {
283
303
  // IF EDIT MODE
284
304
  if (isEditMode) {
305
+ if (this.appendPendingEditValue(e)) {
306
+ return;
307
+ }
285
308
  switch (e.code) {
286
309
  case codesLetter.ESCAPE:
287
310
  this.sv.cancel();
@@ -375,7 +398,8 @@ class KeyboardService {
375
398
  }
376
399
  const eData = this.sv.getData();
377
400
  if (isMulti) {
378
- if (isAfterLast(data.end, eData.lastCell) || isBeforeFirst(data.start)) {
401
+ const isOutOfBounds = [data.start, data.end].some(cell => isAfterLast(cell, eData.lastCell) || isBeforeFirst(cell));
402
+ if (isOutOfBounds) {
379
403
  return false;
380
404
  }
381
405
  const range = getRange(data.start, data.end);
@@ -1286,15 +1310,9 @@ const RevogrScrollVirtual = class {
1286
1310
  */
1287
1311
  async changeScroll(e) {
1288
1312
  if (e.delta) {
1289
- switch (e.dimension) {
1290
- case 'rgCol':
1291
- e.coordinate = this.element.scrollLeft + e.delta;
1292
- break;
1293
- case 'rgRow':
1294
- e.coordinate = this.element.scrollTop + e.delta;
1295
- break;
1296
- }
1297
- this.setScroll(e);
1313
+ const scrollProperty = e.dimension === 'rgRow' ? 'scrollTop' : 'scrollLeft';
1314
+ const currentPhysicalCoordinate = this.element[scrollProperty];
1315
+ return this.localScrollService.setScrollByDelta(e, currentPhysicalCoordinate);
1298
1316
  }
1299
1317
  return e;
1300
1318
  }
@@ -1357,7 +1375,7 @@ const RevogrScrollVirtual = class {
1357
1375
  }
1358
1376
  render() {
1359
1377
  const size = getContentSize(this.realSize, this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth, this.clientSize);
1360
- return (h(Host, { key: '57f81ec9deb2395e96b283338c03b9ad44f1e929', onScroll: (e) => this.onScroll(e) }, h("div", { key: '1a8c869adab53b362c351dae8d53664f33c4212c', style: {
1378
+ return (h(Host, { key: '7213817ef941eee4050b714266598ec0c2961ee9', onScroll: (e) => this.onScroll(e) }, h("div", { key: '501da49c63253ab943172494b9dbf5399be56cee', style: {
1361
1379
  [this.dimension === 'rgRow' ? 'height' : 'width']: `${size}px`,
1362
1380
  } })));
1363
1381
  }
@@ -2,10 +2,11 @@
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
4
  import { r as registerInstance, d as createEvent, h, e as Host, g as getElement } from './index-Chp_81rd.js';
5
- import { N as EDIT_INPUT_WR, j as getItemByPosition, b as getSourceItem, O as DRAGG_TEXT } from './dimension.helpers-DmIvjIa7.js';
6
- import { T as TextEditor } from './text-editor-DpCnd6Fq.js';
7
- import { n as isEditorCtrConstructible } from './edit.utils-DYN6XZh8.js';
8
- import { d as debounce } from './debounce-BfO9dz9v.js';
5
+ import { E as EDIT_INPUT_WR, j as getItemByPosition, b as getSourceItem, A as DRAGG_TEXT } from './dimension.helpers-CGKwSvw6.js';
6
+ import { T as TextEditor } from './text-editor-C3RUSwH5.js';
7
+ import { n as isEditorCtrConstructible } from './edit.utils-Dnnbd0xG.js';
8
+ import { d as debounce } from './debounce-PCRWZliA.js';
9
+ import './index-Db3qZoW5.js';
9
10
 
10
11
  const Clipboard = class {
11
12
  constructor(hostRef) {
@@ -332,11 +333,12 @@ class RowOrderService {
332
333
  getRow(y, { el, rows }) {
333
334
  const { top } = el.getBoundingClientRect();
334
335
  const topRelative = y - top;
335
- const rgRow = getItemByPosition(rows, topRelative);
336
+ const rowOffset = rows.renderOffset || 0;
337
+ const rgRow = getItemByPosition(rows, topRelative + rowOffset);
336
338
  const absolutePosition = {
337
339
  itemIndex: rgRow.itemIndex,
338
- start: rgRow.start + top,
339
- end: rgRow.end + top,
340
+ start: rgRow.start - rowOffset + top,
341
+ end: rgRow.end - rowOffset + top,
340
342
  };
341
343
  return absolutePosition;
342
344
  }
@@ -345,8 +347,8 @@ class RowOrderService {
345
347
  const { top, left } = el.getBoundingClientRect();
346
348
  const topRelative = y - top;
347
349
  const leftRelative = x - left;
348
- const rgRow = getItemByPosition(rows, topRelative);
349
- const rgCol = getItemByPosition(cols, leftRelative);
350
+ const rgRow = getItemByPosition(rows, topRelative + (rows.renderOffset || 0));
351
+ const rgCol = getItemByPosition(cols, leftRelative + (cols.renderOffset || 0));
350
352
  return { x: rgCol.itemIndex, y: rgRow.itemIndex };
351
353
  }
352
354
  }
@@ -2,14 +2,14 @@
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
4
  import { r as registerInstance, d as createEvent, h, e as Host, g as getElement } from './index-Chp_81rd.js';
5
- import { M as ColumnService, u as isGrouping } from './column.service-CCvAi5l4.js';
6
- import { Q as ROW_FOCUSED_CLASS, b as getSourceItem, y as DATA_ROW, x as DATA_COL, M as MIN_COL_SIZE, B as HEADER_SORTABLE_CLASS, H as HEADER_CLASS, J as FOCUS_CLASS, k as getItemByIndex, E as HEADER_ROW_CLASS, F as HEADER_ACTUAL_ROW_CLASS } from './dimension.helpers-DmIvjIa7.js';
7
- import { G as GroupingRowRenderer, C as CellRenderer, R as RowRenderer, P as PADDING_DEPTH, S as SortingSign } from './cell-renderer-CALsEsnh.js';
5
+ import { M as ColumnService, u as isGrouping } from './column.service-CC_SD8W3.js';
6
+ import { B as ROW_FOCUSED_CLASS, b as getSourceItem, n as DATA_ROW, m as DATA_COL, M as MIN_COL_SIZE, r as HEADER_SORTABLE_CLASS, H as HEADER_CLASS, F as FOCUS_CLASS, k as getItemByIndex, u as HEADER_ROW_CLASS, v as HEADER_ACTUAL_ROW_CLASS } from './dimension.helpers-CGKwSvw6.js';
7
+ import { G as GroupingRowRenderer, C as CellRenderer, R as RowRenderer, P as PADDING_DEPTH, S as SortingSign } from './cell-renderer-BtN-NGCk.js';
8
8
  import { c as FilterButton } from './filter.button-C8XTWPU2.js';
9
- import { H as HeaderCellRenderer } from './header-cell-renderer-DU8wKAbg.js';
10
- import { t as throttle, L as LocalScrollTimer, a as LocalScrollService } from './throttle-ERvyruXb.js';
11
- import { H as HEADER_SLOT, C as CONTENT_SLOT, F as FOOTER_SLOT } from './viewport.helpers-VXhsJZtn.js';
12
- import './debounce-BfO9dz9v.js';
9
+ import { H as HeaderCellRenderer } from './header-cell-renderer-BsvUQ8GS.js';
10
+ import { t as throttle, L as LocalScrollTimer, a as LocalScrollService, g as getContentSize } from './throttle-CaUDyxyU.js';
11
+ import { H as HEADER_SLOT, C as CONTENT_SLOT, F as FOOTER_SLOT } from './viewport.helpers-CoCAvmZs.js';
12
+ import './debounce-PCRWZliA.js';
13
13
 
14
14
  /**
15
15
  * Class is responsible for highlighting rows in a table.
@@ -168,11 +168,13 @@ const RevogrData = class {
168
168
  const depth = this.dataStore.get('groupingDepth');
169
169
  const groupingCustomRenderer = this.dataStore.get('groupingCustomRenderer');
170
170
  const groupDepth = this.columnService.hasGrouping ? depth : 0;
171
+ const rowRenderOffset = this.viewportRow.get('renderOffset') || 0;
172
+ const colRenderOffset = this.viewportCol.get('renderOffset') || 0;
171
173
  for (let rgRow of rows) {
172
174
  const dataItem = getSourceItem(this.dataStore, rgRow.itemIndex);
173
175
  // #region Grouping
174
176
  if (isGrouping(dataItem)) {
175
- const gmodel = Object.assign(Object.assign({}, rgRow), { index: rgRow.itemIndex, model: dataItem, groupingCustomRenderer,
177
+ const gmodel = Object.assign(Object.assign({}, rgRow), { start: rgRow.start - rowRenderOffset, index: rgRow.itemIndex, model: dataItem, groupingCustomRenderer,
176
178
  // Only show expand button if grouping is enabled and not in row headers
177
179
  hasExpand: this.columnService.hasGrouping && this.colType !== 'rowHeaders', columnItems: cols, providers: this.providers });
178
180
  rowsEls.push(h(GroupingRowRenderer, Object.assign({}, gmodel)));
@@ -195,7 +197,7 @@ const RevogrData = class {
195
197
  [DATA_ROW]: rowProps.itemIndex,
196
198
  style: {
197
199
  width: `${columnProps.size}px`,
198
- transform: `translateX(${columnProps.start}px)`,
200
+ transform: `translateX(${columnProps.start - colRenderOffset}px)`,
199
201
  height: rowProps.size ? `${rowProps.size}px` : undefined,
200
202
  },
201
203
  };
@@ -223,7 +225,7 @@ const RevogrData = class {
223
225
  if (this.rowHighlightPlugin.isRowFocused(rgRow.itemIndex)) {
224
226
  rowClass += ` ${ROW_FOCUSED_CLASS}`;
225
227
  }
226
- const row = (h(RowRenderer, { index: rgRow.itemIndex, rowClass: rowClass, size: rgRow.size, start: rgRow.start, groupingLevel: groupDepth || undefined }, cells));
228
+ const row = (h(RowRenderer, { index: rgRow.itemIndex, rowClass: rowClass, size: rgRow.size, start: rgRow.start - rowRenderOffset, groupingLevel: groupDepth || undefined }, cells));
227
229
  this.beforerowrender.emit({
228
230
  node: row,
229
231
  item: rgRow,
@@ -278,7 +280,7 @@ const HeaderRenderer = (p) => {
278
280
  class: cellClass,
279
281
  style: {
280
282
  width: `${p.column.size}px`,
281
- transform: `translateX(${p.column.start}px)`,
283
+ transform: `translateX(${p.column.start - (p.renderOffset || 0)}px)`,
282
284
  },
283
285
  onResize: p.onResize,
284
286
  onDblClick(originalEvent) {
@@ -323,7 +325,7 @@ const HeaderGroupRenderer = (p) => {
323
325
  [HEADER_CLASS]: true,
324
326
  },
325
327
  style: {
326
- transform: `translateX(${p.start}px)`,
328
+ transform: `translateX(${p.start - (p.renderOffset || 0)}px)`,
327
329
  width: `${p.end - p.start}px`,
328
330
  },
329
331
  onResize: p.onResize,
@@ -331,7 +333,7 @@ const HeaderGroupRenderer = (p) => {
331
333
  return (h(HeaderCellRenderer, { data: Object.assign(Object.assign({}, p.group), { prop: '', providers: p.providers, index: p.start }), props: groupProps, additionalData: p.additionalData }));
332
334
  };
333
335
 
334
- const revogrHeaderStyleCss = () => `@charset "UTF-8";revogr-header{position:relative;z-index:5;display:block}revogr-header .header-rgRow{display:block;position:relative}revogr-header .header-rgRow.group{z-index:0}revogr-header .group-rgRow{position:relative;overflow:hidden}revogr-header .rgHeaderCell{position:absolute;box-sizing:border-box;height:100%;z-index:1;display:flex}revogr-header .rgHeaderCell.align-center{text-align:center}revogr-header .rgHeaderCell.align-left{text-align:left}revogr-header .rgHeaderCell.align-right{text-align:right}revogr-header .rgHeaderCell.sortable{cursor:pointer}revogr-header .rgHeaderCell i.asc:after,revogr-header .rgHeaderCell i.desc:after{font-size:13px}revogr-header .rgHeaderCell i.asc:after{content:"↑"}revogr-header .rgHeaderCell i.desc:after{content:"↓"}revogr-header .rgHeaderCell.active{z-index:10}revogr-header .rgHeaderCell.active .resizable{background-color:deepskyblue}revogr-header .rgHeaderCell .header-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}revogr-header .rgHeaderCell .resizable{display:block;position:absolute;z-index:90;touch-action:none;user-select:none}revogr-header .rgHeaderCell .resizable:hover{background-color:deepskyblue}revogr-header .rgHeaderCell>.resizable-r{cursor:ew-resize;width:6px;right:0;top:0;height:100%}revogr-header .rgHeaderCell>.resizable-rb{cursor:se-resize;width:6px;height:6px;right:0;bottom:0}revogr-header .rgHeaderCell>.resizable-b{cursor:s-resize;height:6px;bottom:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-lb{cursor:sw-resize;width:6px;height:6px;left:0;bottom:0}revogr-header .rgHeaderCell>.resizable-l{cursor:w-resize;width:6px;left:0;height:100%;top:0}revogr-header .rgHeaderCell>.resizable-lt{cursor:nw-resize;width:6px;height:6px;left:0;top:0}revogr-header .rgHeaderCell>.resizable-t{cursor:n-resize;height:6px;top:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-rt{cursor:ne-resize;width:6px;height:6px;right:0;top:0}revogr-header .rv-filter{visibility:hidden}`;
336
+ const revogrHeaderStyleCss = () => `@charset "UTF-8";revogr-header{position:relative;z-index:5;display:block}revogr-header .header-rgRow{display:block;position:relative}revogr-header .header-rgRow.group{z-index:0}revogr-header .group-rgRow{position:relative;overflow:hidden}revogr-header .rgHeaderCell{position:absolute;box-sizing:border-box;height:100%;z-index:1;display:flex}revogr-header .rgHeaderCell.align-center{text-align:center}revogr-header .rgHeaderCell.align-left{text-align:left}revogr-header .rgHeaderCell.align-right{text-align:right}revogr-header .rgHeaderCell.sortable{cursor:pointer}revogr-header .rgHeaderCell .sort-indicator{display:inline-flex;align-items:flex-start;gap:1px}revogr-header .rgHeaderCell .sort-indicator i.asc:after,revogr-header .rgHeaderCell .sort-indicator i.desc:after{font-size:13px}revogr-header .rgHeaderCell .sort-indicator i.asc:after{content:"↑"}revogr-header .rgHeaderCell .sort-indicator i.desc:after{content:"↓"}revogr-header .rgHeaderCell .sort-indicator .sort-order-index{font-size:10px;line-height:1;top:0}revogr-header .rgHeaderCell.active{z-index:10}revogr-header .rgHeaderCell.active .resizable{background-color:deepskyblue}revogr-header .rgHeaderCell .header-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}revogr-header .rgHeaderCell .resizable{display:block;position:absolute;z-index:90;touch-action:none;user-select:none}revogr-header .rgHeaderCell .resizable:hover{background-color:deepskyblue}revogr-header .rgHeaderCell>.resizable-r{cursor:ew-resize;width:6px;right:0;top:0;height:100%}revogr-header .rgHeaderCell>.resizable-rb{cursor:se-resize;width:6px;height:6px;right:0;bottom:0}revogr-header .rgHeaderCell>.resizable-b{cursor:s-resize;height:6px;bottom:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-lb{cursor:sw-resize;width:6px;height:6px;left:0;bottom:0}revogr-header .rgHeaderCell>.resizable-l{cursor:w-resize;width:6px;left:0;height:100%;top:0}revogr-header .rgHeaderCell>.resizable-lt{cursor:nw-resize;width:6px;height:6px;left:0;top:0}revogr-header .rgHeaderCell>.resizable-t{cursor:n-resize;height:6px;top:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-rt{cursor:ne-resize;width:6px;height:6px;right:0;top:0}revogr-header .rv-filter{visibility:hidden}`;
335
337
 
336
338
  const RevogrHeaderComponent = class {
337
339
  constructor(hostRef) {
@@ -387,6 +389,7 @@ const RevogrHeaderComponent = class {
387
389
  }
388
390
  renderHeaderColumns(cols, range) {
389
391
  const columnsToRender = [];
392
+ const renderOffset = this.viewportCol.get('renderOffset') || 0;
390
393
  for (let rgCol of cols) {
391
394
  const colData = this.colData[rgCol.itemIndex];
392
395
  const props = {
@@ -395,6 +398,7 @@ const RevogrHeaderComponent = class {
395
398
  data: Object.assign(Object.assign({}, colData), { index: rgCol.itemIndex, providers: this.providers }),
396
399
  canFilter: !!this.columnFilter,
397
400
  canResize: this.canResize,
401
+ renderOffset,
398
402
  active: this.resizeHandler,
399
403
  additionalData: this.additionalData,
400
404
  onResize: e => this.onResize(e, rgCol.itemIndex),
@@ -430,37 +434,71 @@ const RevogrHeaderComponent = class {
430
434
  ];
431
435
  }
432
436
  renderGroupColumn(group, level, visibleGroupRange) {
433
- var _a;
434
- const groupStartIndex = (_a = group.indexes[0]) !== null && _a !== void 0 ? _a : -1;
435
- if (groupStartIndex < 0) {
436
- return;
437
- }
438
- const groupEndIndex = groupStartIndex + group.indexes.length - 1;
439
- if (!visibleGroupRange ||
440
- !isGroupInVisibleRange(groupStartIndex, groupEndIndex, visibleGroupRange)) {
441
- return;
442
- }
443
- const groupStart = getItemByIndex(this.dimensionCol.state, groupStartIndex).start;
444
- const groupEnd = getItemByIndex(this.dimensionCol.state, groupEndIndex).end;
437
+ const groupRange = this.getGroupIndexRange(group);
438
+ const groupBounds = this.getGroupBounds(groupRange);
445
439
  const props = {
440
+ level,
446
441
  providers: this.providers,
447
- start: groupStart,
448
- end: groupEnd,
442
+ start: groupBounds.start,
443
+ end: groupBounds.end,
449
444
  group,
445
+ renderOffset: this.viewportCol.get('renderOffset') || 0,
450
446
  active: this.resizeHandler,
451
447
  canResize: this.canResize,
452
448
  additionalData: this.additionalData,
453
449
  onResize: e => {
454
450
  var _a;
455
- return this.onResizeGroup((_a = e.changedX) !== null && _a !== void 0 ? _a : 0, groupStartIndex, groupEndIndex);
451
+ return groupRange
452
+ ? this.onResizeGroup((_a = e.changedX) !== null && _a !== void 0 ? _a : 0, groupRange.startIndex, groupRange.endIndex)
453
+ : undefined;
456
454
  },
457
455
  };
458
456
  const event = this.beforeGroupHeaderRender.emit(props);
459
457
  if (event.defaultPrevented) {
460
458
  return;
461
459
  }
460
+ const renderRange = this.getGroupIndexRange(event.detail.group);
461
+ if (!renderRange ||
462
+ !visibleGroupRange ||
463
+ !isGroupInVisibleRange(renderRange.startIndex, renderRange.endIndex, visibleGroupRange)) {
464
+ return;
465
+ }
466
+ if (event.detail.onResize === props.onResize) {
467
+ event.detail.onResize = e => {
468
+ var _a;
469
+ return this.onResizeGroup((_a = e.changedX) !== null && _a !== void 0 ? _a : 0, renderRange.startIndex, renderRange.endIndex);
470
+ };
471
+ }
472
+ const renderBounds = this.getGroupBounds(renderRange);
473
+ if (event.detail.start === props.start) {
474
+ event.detail.start = renderBounds.start;
475
+ }
476
+ if (event.detail.end === props.end) {
477
+ event.detail.end = renderBounds.end;
478
+ }
462
479
  return h(HeaderGroupRenderer, Object.assign({ key: this.getGroupHeaderCellKey(event.detail.group, level) }, event.detail));
463
480
  }
481
+ getGroupIndexRange(group) {
482
+ var _a;
483
+ const startIndex = (_a = group.indexes[0]) !== null && _a !== void 0 ? _a : -1;
484
+ if (startIndex < 0) {
485
+ return;
486
+ }
487
+ const endIndex = group.indexes[group.indexes.length - 1];
488
+ return {
489
+ startIndex,
490
+ endIndex,
491
+ };
492
+ }
493
+ getGroupBounds(range) {
494
+ if (!range) {
495
+ return { start: 0, end: 0 };
496
+ }
497
+ return {
498
+ start: getItemByIndex(this.dimensionCol.state, range.startIndex).start,
499
+ end: getItemByIndex(this.dimensionCol.state, range.endIndex).end,
500
+ };
501
+ }
464
502
  getVisibleGroupRange() {
465
503
  const visibleColumns = this.viewportCol.get('items');
466
504
  if (!visibleColumns.length) {
@@ -601,7 +639,7 @@ const RevogrViewportScroll = class {
601
639
  * @param e
602
640
  */
603
641
  async changeScroll(e, silent = false) {
604
- var _a, _b;
642
+ var _a, _b, _c, _d;
605
643
  if (silent) {
606
644
  if (e.coordinate && this.verticalScroll) {
607
645
  switch (e.dimension) {
@@ -614,15 +652,16 @@ const RevogrViewportScroll = class {
614
652
  return;
615
653
  }
616
654
  if (e.delta) {
655
+ let currentPhysicalCoordinate = 0;
617
656
  switch (e.dimension) {
618
657
  case 'rgCol':
619
- e.coordinate = this.horizontalScroll.scrollLeft + e.delta;
658
+ currentPhysicalCoordinate = this.horizontalScroll.scrollLeft;
620
659
  break;
621
660
  case 'rgRow':
622
- e.coordinate = ((_b = (_a = this.verticalScroll) === null || _a === void 0 ? void 0 : _a.scrollTop) !== null && _b !== void 0 ? _b : 0) + e.delta;
661
+ currentPhysicalCoordinate = (_b = (_a = this.verticalScroll) === null || _a === void 0 ? void 0 : _a.scrollTop) !== null && _b !== void 0 ? _b : 0;
623
662
  break;
624
663
  }
625
- this.setScroll(e);
664
+ return (_d = (_c = this.localScrollService) === null || _c === void 0 ? void 0 : _c.setScrollByDelta(e, currentPhysicalCoordinate)) !== null && _d !== void 0 ? _d : e;
626
665
  }
627
666
  return e;
628
667
  }
@@ -774,7 +813,10 @@ const RevogrViewportScroll = class {
774
813
  this.setScrollVisibility('rgCol', this.horizontalScroll.clientWidth, this.contentWidth);
775
814
  }
776
815
  render() {
777
- return (h(Host, { key: 'adc7378dba1794ca2ec263d52b09abefe50bcbfd', onWheel: this.horizontalMouseWheel, onScroll: (e) => this.applyScroll('rgCol', e) }, h("div", { key: '7b57a8a0ea44629fefcfe4d2cd77bf0f048d8e06', class: "inner-content-table", style: { width: `${this.contentWidth}px` } }, h("div", { key: 'cca3de158bc2a7f0651f578a281819be5698b257', class: "header-wrapper", ref: e => (this.header = e) }, h("slot", { key: '1d170147dabe034f2c35481a8e2fedd6de2b6aed', name: HEADER_SLOT })), h("div", { key: 'b6dd29a91bb1f380a83a035dfdb749ca669936f2', class: "vertical-inner", ref: el => (this.verticalScroll = el), onWheel: this.verticalMouseWheel, onScroll: (e) => this.applyScroll('rgRow', e) }, h("div", { key: '9bce27bf8ec4d3b679aa9a34eb6379a8c2d46cac', class: "content-wrapper", style: { height: `${this.contentHeight}px` } }, h("slot", { key: 'b44a082c9fbb948fd87bd235b4cd4356fd4a3536', name: CONTENT_SLOT }))), h("div", { key: '28c305ff6bc664f1d1bbb117e8b8565c8d4bb6b2', class: "footer-wrapper", ref: e => (this.footer = e) }, h("slot", { key: '96312fb7f18198fd1feb9dcc00c79cde74ba9c9f', name: FOOTER_SLOT })))));
816
+ var _a, _b, _c, _d;
817
+ const physicalContentHeight = getContentSize(this.contentHeight, (_b = (_a = this.verticalScroll) === null || _a === void 0 ? void 0 : _a.clientHeight) !== null && _b !== void 0 ? _b : 0);
818
+ const physicalContentWidth = getContentSize(this.contentWidth, (_d = (_c = this.horizontalScroll) === null || _c === void 0 ? void 0 : _c.clientWidth) !== null && _d !== void 0 ? _d : 0);
819
+ return (h(Host, { key: 'a0c47dede9d131dea8c8ca449e8a323f24d9b113', onWheel: this.horizontalMouseWheel, onScroll: (e) => this.applyScroll('rgCol', e) }, h("div", { key: '6c960e753ffe522ba4afb1c379264873b6c617f3', class: "inner-content-table", style: { width: `${physicalContentWidth}px` } }, h("div", { key: '1a6cbcbd3634e84756b54c8150aebd25c824e14a', class: "header-wrapper", ref: e => (this.header = e) }, h("slot", { key: 'e4202c687bc39b4f78f3ed9840e979b032f06af8', name: HEADER_SLOT })), h("div", { key: '651415b5b32e72735065b183317386a34042bb85', class: "vertical-inner", ref: el => (this.verticalScroll = el), onWheel: this.verticalMouseWheel, onScroll: (e) => this.applyScroll('rgRow', e) }, h("div", { key: 'e65623b78d80957d8676adb019618953ef267ec3', class: "content-wrapper", style: { height: `${physicalContentHeight}px` } }, h("slot", { key: '5af47b12ef1226587cf774233447b5252d65e836', name: CONTENT_SLOT }))), h("div", { key: 'cbc0fd64fbfb53d3b18e547bbe34e32b7bb9c043', class: "footer-wrapper", ref: e => (this.footer = e) }, h("slot", { key: 'a8e4bfaef400973121090bac3069eb85469a95f3', name: FOOTER_SLOT })))));
778
820
  }
779
821
  /**
780
822
  * Extra layer for scroll event monitoring, where MouseWheel event is not passing
@@ -2,7 +2,7 @@
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
4
  import { r as registerInstance, d as createEvent, h, e as Host, g as getElement } from './index-Chp_81rd.js';
5
- import { d as debounce } from './debounce-BfO9dz9v.js';
5
+ import { d as debounce } from './debounce-PCRWZliA.js';
6
6
  import { i as isFilterBtn, e as AndOrButton, d as TrashButton } from './filter.button-C8XTWPU2.js';
7
7
 
8
8
  (function closest() {
@@ -267,7 +267,8 @@ const FilterPanel = class {
267
267
  const options = [];
268
268
  const prop = this.changes.prop;
269
269
  const hidden = new Set();
270
- Object.entries(this.filterItems).forEach(([_, values]) => {
270
+ Object.keys(this.filterItems).forEach((prop) => {
271
+ const values = this.filterItems[prop];
271
272
  values.forEach((filter) => {
272
273
  if (filter.hidden) {
273
274
  hidden.add(filter.type);
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
- import { d as isTab, f as isEnterKeyValue } from './edit.utils-DYN6XZh8.js';
5
- import { u as timeout } from './dimension.helpers-DmIvjIa7.js';
4
+ import { d as isTab, f as isEnterKeyValue } from './edit.utils-Dnnbd0xG.js';
5
+ import { t as timeout } from './index-Db3qZoW5.js';
6
6
 
7
7
  class TextEditor {
8
8
  constructor(data, saveCallback) {
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
- import { q as scaleValue } from './dimension.helpers-DmIvjIa7.js';
5
- import { d as debounce, a as isObject } from './debounce-BfO9dz9v.js';
4
+ import { g as getScrollDimension } from './viewport.helpers-CoCAvmZs.js';
5
+ import { d as debounce, i as isObject } from './debounce-PCRWZliA.js';
6
6
 
7
7
  const initialParams = {
8
8
  contentSize: 0,
@@ -16,10 +16,11 @@ const NO_COORDINATE = -1;
16
16
  * return full size
17
17
  */
18
18
  function getContentSize(contentSize, clientSize, virtualSize = 0) {
19
- if (virtualSize > contentSize) {
20
- return 0;
21
- }
22
- return contentSize + (virtualSize ? clientSize - virtualSize : 0);
19
+ return getScrollDimension({
20
+ contentSize,
21
+ clientSize,
22
+ virtualSize,
23
+ }).physicalContentSize;
23
24
  }
24
25
  class LocalScrollService {
25
26
  constructor(cfg) {
@@ -33,14 +34,20 @@ class LocalScrollService {
33
34
  rgRow: NO_COORDINATE,
34
35
  rgCol: NO_COORDINATE,
35
36
  };
37
+ this.previousLogicalScroll = {
38
+ rgRow: 0,
39
+ rgCol: 0,
40
+ };
36
41
  this.params = {
37
42
  rgRow: Object.assign({}, initialParams),
38
43
  rgCol: Object.assign({}, initialParams),
39
44
  };
40
45
  }
41
46
  setParams(params, dimension) {
42
- const virtualContentSize = getContentSize(params.contentSize, params.clientSize, params.virtualSize);
43
- this.params[dimension] = Object.assign(Object.assign({}, params), { maxSize: virtualContentSize - params.clientSize, virtualContentSize });
47
+ const scrollDimension = getScrollDimension(params);
48
+ const virtualContentSize = scrollDimension.physicalContentSize;
49
+ this.params[dimension] = Object.assign(Object.assign({}, params), { maxSize: virtualContentSize - params.clientSize, virtualContentSize,
50
+ scrollDimension });
44
51
  }
45
52
  // apply scroll values after scroll done
46
53
  async setScroll(e) {
@@ -60,16 +67,27 @@ class LocalScrollService {
60
67
  await frameAnimation;
61
68
  const params = this.getParams(e.dimension);
62
69
  e.coordinate = Math.ceil(e.coordinate);
63
- this.previousScroll[e.dimension] = this.wrapCoordinate(e.coordinate, params);
70
+ this.previousLogicalScroll[e.dimension] = this.wrapLogicalCoordinate(e.coordinate, params);
71
+ const physicalCoordinate = this.toPhysicalCoordinate(e.coordinate, params);
72
+ this.previousScroll[e.dimension] = this.wrapPhysicalCoordinate(physicalCoordinate, params);
64
73
  this.preventArtificialScroll[e.dimension] = null;
65
- this.cfg.applyScroll(Object.assign(Object.assign({}, e), { coordinate: params.virtualSize
66
- ? this.convert(e.coordinate, params, false)
67
- : e.coordinate }));
74
+ this.cfg.applyScroll(Object.assign(Object.assign({}, e), { coordinate: physicalCoordinate }));
68
75
  }
69
76
  catch (id) {
70
77
  window.cancelAnimationFrame(id);
71
78
  }
72
79
  }
80
+ async setScrollByDelta(e, currentPhysicalCoordinate) {
81
+ var _a;
82
+ const params = this.getParams(e.dimension);
83
+ const baseCoordinate = this.previousScroll[e.dimension] === NO_COORDINATE
84
+ ? this.toLogicalCoordinate(currentPhysicalCoordinate, params)
85
+ : this.previousLogicalScroll[e.dimension];
86
+ const coordinate = this.wrapLogicalCoordinate(baseCoordinate + ((_a = e.delta) !== null && _a !== void 0 ? _a : 0), params);
87
+ const nextEvent = Object.assign(Object.assign({}, e), { coordinate });
88
+ await this.setScroll(nextEvent);
89
+ return nextEvent;
90
+ }
73
91
  /**
74
92
  * On scroll event started
75
93
  */
@@ -82,21 +100,21 @@ class LocalScrollService {
82
100
  return;
83
101
  }
84
102
  const param = this.getParams(dimension);
103
+ const logicalCoordinate = this.toLogicalScrollCoordinate(coordinate, dimension, param, delta);
85
104
  // let component know about scroll event started
86
105
  this.cfg.runScroll({
87
106
  dimension: dimension,
88
- coordinate: param.virtualSize
89
- ? this.convert(coordinate, param)
90
- : coordinate,
107
+ coordinate: logicalCoordinate,
91
108
  delta,
92
109
  outside,
93
110
  });
111
+ this.previousLogicalScroll[dimension] = logicalCoordinate;
94
112
  }
95
113
  getParams(dimension) {
96
114
  return this.params[dimension];
97
115
  }
98
116
  // check if scroll outside of region to avoid looping
99
- wrapCoordinate(c, param) {
117
+ wrapPhysicalCoordinate(c, param) {
100
118
  if (c < 0) {
101
119
  return NO_COORDINATE;
102
120
  }
@@ -105,22 +123,39 @@ class LocalScrollService {
105
123
  }
106
124
  return c;
107
125
  }
126
+ wrapLogicalCoordinate(c, param) {
127
+ var _a, _b;
128
+ if (c < 0) {
129
+ return 0;
130
+ }
131
+ return Math.min(c, (_b = (_a = param.scrollDimension) === null || _a === void 0 ? void 0 : _a.logicalScrollSize) !== null && _b !== void 0 ? _b : c);
132
+ }
108
133
  // prevent already started scroll, performance optimization
109
134
  cancelScroll(dimension) {
110
135
  var _a, _b;
111
136
  (_b = (_a = this.preventArtificialScroll)[dimension]) === null || _b === void 0 ? void 0 : _b.call(_a);
112
137
  this.preventArtificialScroll[dimension] = null;
113
138
  }
114
- /* convert virtual to real and back, scale range */
115
- convert(pos, param, toReal = true) {
116
- var _a;
117
- const minRange = param.clientSize;
118
- const from = [0, ((_a = param.virtualContentSize) !== null && _a !== void 0 ? _a : minRange) - minRange];
119
- const to = [0, param.contentSize - param.virtualSize];
120
- if (toReal) {
121
- return scaleValue(pos, from, to);
139
+ toLogicalScrollCoordinate(coordinate, dimension, param, delta) {
140
+ const scrollDimension = param.scrollDimension;
141
+ if (!scrollDimension) {
142
+ return coordinate;
143
+ }
144
+ if (typeof delta === 'number' && scrollDimension.isCompressed) {
145
+ const base = this.previousScroll[dimension] === NO_COORDINATE
146
+ ? scrollDimension.toLogicalCoordinate(coordinate - delta)
147
+ : this.previousLogicalScroll[dimension];
148
+ return scrollDimension.toLogicalCoordinate(scrollDimension.toPhysicalCoordinate(base + delta));
122
149
  }
123
- return scaleValue(pos, to, from);
150
+ return scrollDimension.toLogicalCoordinate(coordinate);
151
+ }
152
+ toPhysicalCoordinate(coordinate, param) {
153
+ var _a, _b;
154
+ return (_b = (_a = param.scrollDimension) === null || _a === void 0 ? void 0 : _a.toPhysicalCoordinate(coordinate)) !== null && _b !== void 0 ? _b : coordinate;
155
+ }
156
+ toLogicalCoordinate(coordinate, param) {
157
+ var _a, _b;
158
+ return (_b = (_a = param.scrollDimension) === null || _a === void 0 ? void 0 : _a.toLogicalCoordinate(coordinate)) !== null && _b !== void 0 ? _b : coordinate;
124
159
  }
125
160
  }
126
161