handsontable 0.0.0-next-0306a1a-20240826 → 0.0.0-next-1dfe61f-20240910

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of handsontable might be problematic. Click here for more details.

Files changed (106) hide show
  1. package/3rdparty/walkontable/src/calculator/calculationType/fullyVisibleColumns.js +126 -0
  2. package/3rdparty/walkontable/src/calculator/calculationType/fullyVisibleColumns.mjs +122 -0
  3. package/3rdparty/walkontable/src/calculator/calculationType/fullyVisibleRows.js +119 -0
  4. package/3rdparty/walkontable/src/calculator/calculationType/fullyVisibleRows.mjs +115 -0
  5. package/3rdparty/walkontable/src/calculator/calculationType/partiallyVisibleColumns.js +125 -0
  6. package/3rdparty/walkontable/src/calculator/calculationType/partiallyVisibleColumns.mjs +121 -0
  7. package/3rdparty/walkontable/src/calculator/calculationType/partiallyVisibleRows.js +118 -0
  8. package/3rdparty/walkontable/src/calculator/calculationType/partiallyVisibleRows.mjs +114 -0
  9. package/3rdparty/walkontable/src/calculator/{renderAllColumns.js → calculationType/renderedAllColumns.js} +32 -9
  10. package/3rdparty/walkontable/src/calculator/{renderAllColumns.mjs → calculationType/renderedAllColumns.mjs} +31 -8
  11. package/3rdparty/walkontable/src/calculator/{renderAllRows.js → calculationType/renderedAllRows.js} +32 -9
  12. package/3rdparty/walkontable/src/calculator/{renderAllRows.mjs → calculationType/renderedAllRows.mjs} +31 -8
  13. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.js +37 -0
  14. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.mjs +33 -0
  15. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.js +37 -0
  16. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.mjs +33 -0
  17. package/3rdparty/walkontable/src/calculator/index.js +18 -17
  18. package/3rdparty/walkontable/src/calculator/index.mjs +11 -6
  19. package/3rdparty/walkontable/src/calculator/viewportBase.js +92 -0
  20. package/3rdparty/walkontable/src/calculator/viewportBase.mjs +88 -0
  21. package/3rdparty/walkontable/src/calculator/viewportColumns.js +51 -145
  22. package/3rdparty/walkontable/src/calculator/viewportColumns.mjs +51 -145
  23. package/3rdparty/walkontable/src/calculator/viewportRows.js +59 -141
  24. package/3rdparty/walkontable/src/calculator/viewportRows.mjs +59 -141
  25. package/3rdparty/walkontable/src/index.js +2 -0
  26. package/3rdparty/walkontable/src/index.mjs +2 -2
  27. package/3rdparty/walkontable/src/renderer/rows.js +10 -0
  28. package/3rdparty/walkontable/src/renderer/rows.mjs +11 -1
  29. package/3rdparty/walkontable/src/table.js +5 -11
  30. package/3rdparty/walkontable/src/table.mjs +5 -11
  31. package/3rdparty/walkontable/src/utils/column.js +2 -1
  32. package/3rdparty/walkontable/src/utils/column.mjs +2 -1
  33. package/3rdparty/walkontable/src/utils/columnStretching.js +10 -19
  34. package/3rdparty/walkontable/src/utils/columnStretching.mjs +10 -19
  35. package/3rdparty/walkontable/src/viewport.js +35 -46
  36. package/3rdparty/walkontable/src/viewport.mjs +36 -47
  37. package/CHANGELOG.md +27 -0
  38. package/base.js +2 -2
  39. package/base.mjs +2 -2
  40. package/core.d.ts +1 -2
  41. package/core.js +1 -1
  42. package/core.mjs +2 -2
  43. package/dataMap/metaManager/metaSchema.js +5 -6
  44. package/dataMap/metaManager/metaSchema.mjs +5 -6
  45. package/dist/handsontable.css +32 -20
  46. package/dist/handsontable.full.css +32 -20
  47. package/dist/handsontable.full.js +2751 -2091
  48. package/dist/handsontable.full.min.css +5 -5
  49. package/dist/handsontable.full.min.js +148 -148
  50. package/dist/handsontable.js +2752 -2092
  51. package/dist/handsontable.min.css +4 -4
  52. package/dist/handsontable.min.js +32 -32
  53. package/editors/autocompleteEditor/autocompleteEditor.d.ts +1 -1
  54. package/helpers/a11y.js +2 -0
  55. package/helpers/a11y.mjs +1 -0
  56. package/helpers/mixed.js +2 -2
  57. package/helpers/mixed.mjs +2 -2
  58. package/package.json +1 -1
  59. package/pluginHooks.d.ts +1 -1
  60. package/pluginHooks.js +1 -1
  61. package/pluginHooks.mjs +1 -1
  62. package/plugins/autoColumnSize/autoColumnSize.js +1 -1
  63. package/plugins/autoColumnSize/autoColumnSize.mjs +2 -2
  64. package/plugins/autoRowSize/autoRowSize.js +1 -2
  65. package/plugins/autoRowSize/autoRowSize.mjs +1 -2
  66. package/plugins/columnSorting/columnSorting.js +10 -1
  67. package/plugins/columnSorting/columnSorting.mjs +10 -1
  68. package/plugins/contextMenu/menu/menuItemRenderer.js +3 -4
  69. package/plugins/contextMenu/menu/menuItemRenderer.mjs +5 -6
  70. package/plugins/contextMenu/menu/positioner.js +4 -12
  71. package/plugins/contextMenu/menu/positioner.mjs +4 -12
  72. package/plugins/contextMenu/menu/utils.js +11 -0
  73. package/plugins/contextMenu/menu/utils.mjs +10 -0
  74. package/plugins/contextMenu/predefinedItems/alignment.js +67 -49
  75. package/plugins/contextMenu/predefinedItems/alignment.mjs +68 -50
  76. package/plugins/contextMenu/predefinedItems/readOnly.js +11 -0
  77. package/plugins/contextMenu/predefinedItems/readOnly.mjs +11 -0
  78. package/plugins/contextMenu/utils.js +26 -0
  79. package/plugins/contextMenu/utils.mjs +24 -0
  80. package/plugins/copyPaste/copyPaste.js +14 -14
  81. package/plugins/copyPaste/copyPaste.mjs +14 -14
  82. package/plugins/dropdownMenu/dropdownMenu.js +10 -4
  83. package/plugins/dropdownMenu/dropdownMenu.mjs +10 -4
  84. package/plugins/filters/component/condition.js +6 -1
  85. package/plugins/filters/component/condition.mjs +6 -1
  86. package/plugins/filters/component/value.js +6 -1
  87. package/plugins/filters/component/value.mjs +6 -1
  88. package/plugins/filters/conditionCollection.d.ts +4 -3
  89. package/plugins/filters/conditionCollection.js +26 -0
  90. package/plugins/filters/conditionCollection.mjs +26 -0
  91. package/plugins/filters/filters.js +2 -1
  92. package/plugins/filters/filters.mjs +2 -1
  93. package/plugins/filters/ui/multipleSelect.js +7 -9
  94. package/plugins/filters/ui/multipleSelect.mjs +7 -9
  95. package/plugins/manualRowResize/manualRowResize.js +1 -1
  96. package/plugins/manualRowResize/manualRowResize.mjs +2 -2
  97. package/plugins/mergeCells/cellsCollection.js +11 -9
  98. package/plugins/mergeCells/cellsCollection.mjs +12 -10
  99. package/plugins/undoRedo/undoRedo.js +9 -5
  100. package/plugins/undoRedo/undoRedo.mjs +9 -5
  101. package/shortcuts/utils.js +3 -1
  102. package/shortcuts/utils.mjs +3 -1
  103. package/utils/ghostTable.js +11 -9
  104. package/utils/ghostTable.mjs +12 -10
  105. package/3rdparty/walkontable/src/calculator/constants.js +0 -26
  106. package/3rdparty/walkontable/src/calculator/constants.mjs +0 -23
@@ -1,87 +1,59 @@
1
1
  import "core-js/modules/es.error.cause.js";
2
- import "core-js/modules/es.array.at.js";
3
2
  import "core-js/modules/es.array.push.js";
4
- function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
5
- function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
6
3
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
7
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
8
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
9
- function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
10
- function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
11
- function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
12
- import { RENDER_TYPE, FULLY_VISIBLE_TYPE } from "./constants.mjs";
6
+ import { ViewportBaseCalculator } from "./viewportBase.mjs";
7
+ export const DEFAULT_WIDTH = 50;
8
+
13
9
  /**
14
10
  * @typedef {object} ViewportColumnsCalculatorOptions
11
+ * @property {Map<string, ViewportBaseCalculator>} calculationTypes The calculation types to be performed.
15
12
  * @property {number} viewportWidth Width of the viewport.
16
13
  * @property {number} scrollOffset Current horizontal scroll position of the viewport.
17
14
  * @property {number} totalColumns Total number of columns.
18
15
  * @property {Function} columnWidthFn Function that returns the width of the column at a given index (in px).
19
- * @property {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by
20
- * MergeCells plugin).
21
- * @property {string} calculationType String which describes types of calculation which will be performed.
16
+ * @property {Function} overrideFn Function that allows to adjust the `startRow` and `endRow` parameters.
22
17
  * @property {string} inlineStartOffset Inline-start offset of the parent container.
23
- * @property {string} stretchMode Stretch mode 'all' or 'last'.
24
- * @property {Function} stretchingColumnWidthFn Function that returns the new width of the stretched column.
25
18
  */
26
19
  /**
27
- * Calculates indexes of columns to render OR columns that are visible.
28
- * To redo the calculation, you need to create a new calculator.
20
+ * Calculates indexes of columns to render OR columns that are visible OR partially visible in the viewport.
29
21
  *
30
22
  * @class ViewportColumnsCalculator
31
23
  */
32
- var _options = /*#__PURE__*/new WeakMap();
33
- export class ViewportColumnsCalculator {
34
- /**
35
- * Default column width.
36
- *
37
- * @type {number}
38
- */
39
- static get DEFAULT_WIDTH() {
40
- return 50;
41
- }
42
-
43
- /**
44
- * Number of rendered/visible columns.
45
- *
46
- * @type {number}
47
- */
48
-
24
+ export class ViewportColumnsCalculator extends ViewportBaseCalculator {
49
25
  /**
50
26
  * @param {ViewportColumnsCalculatorOptions} options Object with all options specified for column viewport calculation.
51
27
  */
52
- constructor(options) {
53
- _defineProperty(this, "count", 0);
54
- /**
55
- * Index of the first rendered/visible column (can be overwritten using overrideFn).
56
- *
57
- * @type {number|null}
58
- */
59
- _defineProperty(this, "startColumn", null);
60
- /**
61
- * Index of the last rendered/visible column (can be overwritten using overrideFn).
62
- *
63
- * @type {null}
64
- */
65
- _defineProperty(this, "endColumn", null);
66
- /**
67
- * Position of the first rendered/visible column (in px).
68
- *
69
- * @type {number|null}
70
- */
71
- _defineProperty(this, "startPosition", null);
72
- /**
73
- * Determines if the viewport is visible in the trimming container.
74
- *
75
- * @type {boolean}
76
- */
77
- _defineProperty(this, "isVisibleInTrimmingContainer", false);
78
- /**
79
- * The calculator options.
80
- *
81
- * @type {ViewportColumnsCalculatorOptions}
82
- */
83
- _classPrivateFieldInitSpec(this, _options, void 0);
84
- _classPrivateFieldSet(_options, this, options);
28
+ constructor(_ref) {
29
+ let {
30
+ calculationTypes,
31
+ viewportWidth,
32
+ scrollOffset,
33
+ totalColumns,
34
+ columnWidthFn,
35
+ overrideFn,
36
+ inlineStartOffset
37
+ } = _ref;
38
+ super(calculationTypes);
39
+ _defineProperty(this, "viewportWidth", 0);
40
+ _defineProperty(this, "scrollOffset", 0);
41
+ _defineProperty(this, "zeroBasedScrollOffset", 0);
42
+ _defineProperty(this, "totalColumns", 0);
43
+ _defineProperty(this, "columnWidthFn", null);
44
+ _defineProperty(this, "columnWidth", 0);
45
+ _defineProperty(this, "overrideFn", null);
46
+ _defineProperty(this, "inlineStartOffset", 0);
47
+ _defineProperty(this, "totalCalculatedWidth", 0);
48
+ _defineProperty(this, "startPositions", []);
49
+ _defineProperty(this, "needReverse", true);
50
+ this.viewportWidth = viewportWidth;
51
+ this.scrollOffset = scrollOffset;
52
+ this.zeroBasedScrollOffset = Math.max(scrollOffset, 0);
53
+ this.totalColumns = totalColumns;
54
+ this.columnWidthFn = columnWidthFn;
55
+ this.overrideFn = overrideFn;
56
+ this.inlineStartOffset = inlineStartOffset;
85
57
  this.calculate();
86
58
  }
87
59
 
@@ -89,96 +61,30 @@ export class ViewportColumnsCalculator {
89
61
  * Calculates viewport.
90
62
  */
91
63
  calculate() {
92
- const {
93
- calculationType,
94
- overrideFn,
95
- scrollOffset,
96
- totalColumns,
97
- viewportWidth
98
- } = _classPrivateFieldGet(_options, this);
99
- const zeroBasedScrollOffset = Math.max(_classPrivateFieldGet(_options, this).scrollOffset, 0);
100
- // +1 pixel for row header width compensation for horizontal scroll > 0
101
- const compensatedViewportWidth = zeroBasedScrollOffset > 0 ? viewportWidth + 1 : viewportWidth;
102
- let sum = 0;
103
- let needReverse = true;
104
- const startPositions = [];
105
- let columnWidth;
106
- let firstVisibleColumnWidth = 0;
107
- let lastVisibleColumnWidth = 0;
108
- for (let i = 0; i < totalColumns; i++) {
109
- columnWidth = this._getColumnWidth(i);
110
- if (sum <= zeroBasedScrollOffset && calculationType !== FULLY_VISIBLE_TYPE) {
111
- this.startColumn = i;
112
- firstVisibleColumnWidth = columnWidth;
113
- }
114
- if (sum >= zeroBasedScrollOffset && sum + (calculationType === FULLY_VISIBLE_TYPE ? columnWidth : 0) <= zeroBasedScrollOffset + compensatedViewportWidth) {
115
- if (this.startColumn === null || this.startColumn === undefined) {
116
- this.startColumn = i;
117
- firstVisibleColumnWidth = columnWidth;
118
- }
119
- this.endColumn = i;
120
- }
121
- startPositions.push(sum);
122
- sum += columnWidth;
123
- lastVisibleColumnWidth = columnWidth;
124
- if (calculationType !== FULLY_VISIBLE_TYPE) {
125
- this.endColumn = i;
126
- }
127
- if (sum >= zeroBasedScrollOffset + viewportWidth) {
128
- needReverse = false;
64
+ this._initialize(this);
65
+ for (let column = 0; column < this.totalColumns; column++) {
66
+ this.columnWidth = this.getColumnWidth(column);
67
+ this._process(column, this);
68
+ this.startPositions.push(this.totalCalculatedWidth);
69
+ this.totalCalculatedWidth += this.columnWidth;
70
+ if (this.totalCalculatedWidth >= this.zeroBasedScrollOffset + this.viewportWidth) {
71
+ this.needReverse = false;
129
72
  break;
130
73
  }
131
74
  }
132
- const mostRightScrollOffset = scrollOffset + viewportWidth - compensatedViewportWidth;
133
- const inlineEndColumnOffset = calculationType === FULLY_VISIBLE_TYPE ? 0 : lastVisibleColumnWidth;
134
- const inlineStartColumnOffset = calculationType === FULLY_VISIBLE_TYPE ? firstVisibleColumnWidth : 0;
135
- if (
136
- // the table is to the left of the viewport
137
- mostRightScrollOffset < -1 * _classPrivateFieldGet(_options, this).inlineStartOffset || scrollOffset > startPositions.at(-1) + inlineEndColumnOffset ||
138
- // the table is to the right of the viewport
139
- -1 * _classPrivateFieldGet(_options, this).scrollOffset - _classPrivateFieldGet(_options, this).viewportWidth > -1 * inlineStartColumnOffset) {
140
- this.isVisibleInTrimmingContainer = false;
141
- } else {
142
- this.isVisibleInTrimmingContainer = true;
143
- }
144
- if (this.endColumn === totalColumns - 1 && needReverse) {
145
- this.startColumn = this.endColumn;
146
- while (this.startColumn > 0) {
147
- const viewportSum = startPositions[this.endColumn] + columnWidth - startPositions[this.startColumn - 1];
148
- if (viewportSum <= viewportWidth || calculationType !== FULLY_VISIBLE_TYPE) {
149
- this.startColumn -= 1;
150
- }
151
- if (viewportSum > viewportWidth) {
152
- break;
153
- }
154
- }
155
- }
156
- if (calculationType === RENDER_TYPE && this.startColumn !== null && overrideFn) {
157
- overrideFn(this);
158
- }
159
- this.startPosition = startPositions[this.startColumn];
160
- if (this.startPosition === undefined) {
161
- this.startPosition = null;
162
- }
163
-
164
- // If totalColumns exceeded its total columns size set endColumn to the latest item
165
- if (totalColumns < this.endColumn) {
166
- this.endColumn = totalColumns - 1;
167
- }
168
- if (this.startColumn !== null) {
169
- this.count = this.endColumn - this.startColumn + 1;
170
- }
75
+ this._finalize(this);
171
76
  }
172
77
 
173
78
  /**
174
- * @param {number} column The visual column index.
79
+ * Gets the column width at the specified column index.
80
+ *
81
+ * @param {number} column Column index.
175
82
  * @returns {number}
176
- * @private
177
83
  */
178
- _getColumnWidth(column) {
179
- let width = _classPrivateFieldGet(_options, this).columnWidthFn(column);
84
+ getColumnWidth(column) {
85
+ const width = this.columnWidthFn(column);
180
86
  if (isNaN(width)) {
181
- width = ViewportColumnsCalculator.DEFAULT_WIDTH;
87
+ return DEFAULT_WIDTH;
182
88
  }
183
89
  return width;
184
90
  }
@@ -2,86 +2,63 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  require("core-js/modules/es.error.cause.js");
5
- require("core-js/modules/es.array.at.js");
6
5
  require("core-js/modules/es.array.push.js");
7
- var _constants = require("./constants");
8
- function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
9
- function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
6
+ var _viewportBase = require("./viewportBase");
10
7
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
11
8
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
12
9
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
- function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
14
- function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
15
- function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
10
+ const DEFAULT_HEIGHT = exports.DEFAULT_HEIGHT = 23;
11
+
16
12
  /**
17
13
  * @typedef {object} ViewportRowsCalculatorOptions
14
+ * @property {Map<string, ViewportBaseCalculator>} calculationTypes The calculation types to be performed.
18
15
  * @property {number} viewportHeight Height of the viewport.
19
16
  * @property {number} scrollOffset Current vertical scroll position of the viewport.
20
17
  * @property {number} totalRows Total number of rows.
21
18
  * @property {Function} rowHeightFn Function that returns the height of the row at a given index (in px).
22
- * @property {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin).
23
- * @property {string} calculationType String which describes types of calculation which will be performed.
19
+ * @property {Function} overrideFn Function that allows to adjust the `startRow` and `endRow` parameters.
24
20
  * @property {number} horizontalScrollbarHeight The scrollbar height.
25
21
  */
26
22
  /**
27
- * Calculates indexes of rows to render OR rows that are visible.
28
- * To redo the calculation, you need to create a new calculator.
23
+ * Calculates indexes of rows to render OR rows that are visible OR partially visible in the viewport.
29
24
  *
30
25
  * @class ViewportRowsCalculator
31
26
  */
32
- var _options = /*#__PURE__*/new WeakMap();
33
- class ViewportRowsCalculator {
34
- /**
35
- * Default row height.
36
- *
37
- * @type {number}
38
- */
39
- static get DEFAULT_HEIGHT() {
40
- return 23;
41
- }
42
-
43
- /**
44
- * Number of rendered/visible rows.
45
- *
46
- * @type {number}
47
- */
48
-
27
+ class ViewportRowsCalculator extends _viewportBase.ViewportBaseCalculator {
49
28
  /**
50
29
  * @param {ViewportRowsCalculatorOptions} options Object with all options specified for row viewport calculation.
51
30
  */
52
- constructor(options) {
53
- _defineProperty(this, "count", 0);
54
- /**
55
- * Index of the first rendered/visible row (can be overwritten using overrideFn).
56
- *
57
- * @type {number|null}
58
- */
59
- _defineProperty(this, "startRow", null);
60
- /**
61
- * Index of the last rendered/visible row (can be overwritten using overrideFn).
62
- *
63
- * @type {null}
64
- */
65
- _defineProperty(this, "endRow", null);
66
- /**
67
- * Position of the first rendered/visible row (in px).
68
- *
69
- * @type {number|null}
70
- */
71
- _defineProperty(this, "startPosition", null);
72
- /**
73
- * Determines if the viewport is visible in the trimming container.
74
- *
75
- * @type {boolean}
76
- */
77
- _defineProperty(this, "isVisibleInTrimmingContainer", false);
78
- /**
79
- * The calculator options.
80
- *
81
- * @type {ViewportRowsCalculatorOptions}
82
- */
83
- _classPrivateFieldInitSpec(this, _options, void 0);
84
- _classPrivateFieldSet(_options, this, options);
31
+ constructor(_ref) {
32
+ let {
33
+ calculationTypes,
34
+ viewportHeight,
35
+ scrollOffset,
36
+ totalRows,
37
+ rowHeightFn,
38
+ overrideFn,
39
+ horizontalScrollbarHeight
40
+ } = _ref;
41
+ super(calculationTypes);
42
+ _defineProperty(this, "viewportHeight", 0);
43
+ _defineProperty(this, "scrollOffset", 0);
44
+ _defineProperty(this, "zeroBasedScrollOffset", 0);
45
+ _defineProperty(this, "totalRows", 0);
46
+ _defineProperty(this, "rowHeightFn", null);
47
+ _defineProperty(this, "rowHeight", 0);
48
+ _defineProperty(this, "overrideFn", null);
49
+ _defineProperty(this, "horizontalScrollbarHeight", 0);
50
+ _defineProperty(this, "innerViewportHeight", 0);
51
+ _defineProperty(this, "totalCalculatedHeight", 0);
52
+ _defineProperty(this, "startPositions", []);
53
+ _defineProperty(this, "needReverse", true);
54
+ this.viewportHeight = viewportHeight;
55
+ this.scrollOffset = scrollOffset;
56
+ this.zeroBasedScrollOffset = Math.max(scrollOffset, 0);
57
+ this.totalRows = totalRows;
58
+ this.rowHeightFn = rowHeightFn;
59
+ this.overrideFn = overrideFn;
60
+ this.horizontalScrollbarHeight = horizontalScrollbarHeight !== null && horizontalScrollbarHeight !== void 0 ? horizontalScrollbarHeight : 0;
61
+ this.innerViewportHeight = this.zeroBasedScrollOffset + this.viewportHeight - this.horizontalScrollbarHeight;
85
62
  this.calculate();
86
63
  }
87
64
 
@@ -89,91 +66,32 @@ class ViewportRowsCalculator {
89
66
  * Calculates viewport.
90
67
  */
91
68
  calculate() {
92
- const {
93
- calculationType,
94
- overrideFn,
95
- rowHeightFn,
96
- scrollOffset,
97
- totalRows,
98
- viewportHeight
99
- } = _classPrivateFieldGet(_options, this);
100
- const zeroBasedScrollOffset = Math.max(_classPrivateFieldGet(_options, this).scrollOffset, 0);
101
- const horizontalScrollbarHeight = _classPrivateFieldGet(_options, this).horizontalScrollbarHeight || 0;
102
- const innerViewportHeight = zeroBasedScrollOffset + viewportHeight - horizontalScrollbarHeight;
103
- let sum = 0;
104
- let needReverse = true;
105
- const startPositions = [];
106
- let rowHeight;
107
- let firstVisibleRowHeight = 0;
108
- let lastVisibleRowHeight = 0;
109
-
110
- // Calculate the number (start and end index) of rows needed
111
- for (let i = 0; i < totalRows; i++) {
112
- rowHeight = rowHeightFn(i);
113
- if (isNaN(rowHeight)) {
114
- rowHeight = ViewportRowsCalculator.DEFAULT_HEIGHT;
115
- }
116
- if (sum <= zeroBasedScrollOffset && calculationType !== _constants.FULLY_VISIBLE_TYPE) {
117
- this.startRow = i;
118
- firstVisibleRowHeight = rowHeight;
119
- }
120
- if (sum >= zeroBasedScrollOffset && sum + (calculationType === _constants.FULLY_VISIBLE_TYPE ? rowHeight : 0) <= innerViewportHeight) {
121
- if (this.startRow === null) {
122
- this.startRow = i;
123
- firstVisibleRowHeight = rowHeight;
124
- }
125
- this.endRow = i;
126
- }
127
- startPositions.push(sum);
128
- sum += rowHeight;
129
- lastVisibleRowHeight = rowHeight;
130
- if (calculationType !== _constants.FULLY_VISIBLE_TYPE) {
131
- this.endRow = i;
132
- }
133
- if (sum >= innerViewportHeight) {
134
- needReverse = false;
69
+ this._initialize(this);
70
+ for (let row = 0; row < this.totalRows; row++) {
71
+ this.rowHeight = this.getRowHeight(row);
72
+ this._process(row, this);
73
+ this.startPositions.push(this.totalCalculatedHeight);
74
+ this.totalCalculatedHeight += this.rowHeight;
75
+ if (this.totalCalculatedHeight >= this.innerViewportHeight) {
76
+ this.needReverse = false;
135
77
  break;
136
78
  }
137
79
  }
138
- const mostBottomScrollOffset = scrollOffset + viewportHeight - horizontalScrollbarHeight;
139
- const topRowOffset = calculationType === _constants.FULLY_VISIBLE_TYPE ? firstVisibleRowHeight : 0;
140
- const bottomRowOffset = calculationType === _constants.FULLY_VISIBLE_TYPE ? 0 : lastVisibleRowHeight;
141
- if (mostBottomScrollOffset < topRowOffset || scrollOffset > startPositions.at(-1) + bottomRowOffset) {
142
- this.isVisibleInTrimmingContainer = false;
143
- } else {
144
- this.isVisibleInTrimmingContainer = true;
145
- }
146
-
147
- // If the estimation has reached the last row and there is still some space available in the viewport,
148
- // we need to render in reverse in order to fill the whole viewport with rows
149
- if (this.endRow === totalRows - 1 && needReverse) {
150
- this.startRow = this.endRow;
151
- while (this.startRow > 0) {
152
- // rowHeight is the height of the last row
153
- const viewportSum = startPositions[this.endRow] + rowHeight - startPositions[this.startRow - 1];
154
- if (viewportSum <= viewportHeight - horizontalScrollbarHeight || calculationType !== _constants.FULLY_VISIBLE_TYPE) {
155
- this.startRow -= 1;
156
- }
157
- if (viewportSum >= viewportHeight - horizontalScrollbarHeight) {
158
- break;
159
- }
160
- }
161
- }
162
- if (calculationType === _constants.RENDER_TYPE && this.startRow !== null && overrideFn) {
163
- overrideFn(this);
164
- }
165
- this.startPosition = startPositions[this.startRow];
166
- if (this.startPosition === undefined) {
167
- this.startPosition = null;
168
- }
80
+ this._finalize(this);
81
+ }
169
82
 
170
- // If totalRows exceeded its total rows size set endRow to the latest item
171
- if (totalRows < this.endRow) {
172
- this.endRow = totalRows - 1;
173
- }
174
- if (this.startRow !== null) {
175
- this.count = this.endRow - this.startRow + 1;
83
+ /**
84
+ * Gets the row height at the specified row index.
85
+ *
86
+ * @param {number} row Row index.
87
+ * @returns {number}
88
+ */
89
+ getRowHeight(row) {
90
+ const rowHeight = this.rowHeightFn(row);
91
+ if (isNaN(rowHeight)) {
92
+ return DEFAULT_HEIGHT;
176
93
  }
94
+ return rowHeight;
177
95
  }
178
96
  }
179
97
  exports.ViewportRowsCalculator = ViewportRowsCalculator;