handsontable 14.5.0-next-ede811d-20240717 → 14.5.0-next-7541a88-20240725

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) 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/table.js +5 -11
  28. package/3rdparty/walkontable/src/table.mjs +5 -11
  29. package/3rdparty/walkontable/src/utils/column.js +2 -1
  30. package/3rdparty/walkontable/src/utils/column.mjs +2 -1
  31. package/3rdparty/walkontable/src/utils/columnStretching.js +10 -19
  32. package/3rdparty/walkontable/src/utils/columnStretching.mjs +10 -19
  33. package/3rdparty/walkontable/src/viewport.js +35 -46
  34. package/3rdparty/walkontable/src/viewport.mjs +36 -47
  35. package/base.js +2 -2
  36. package/base.mjs +2 -2
  37. package/core.js +1 -1
  38. package/core.mjs +2 -2
  39. package/dist/handsontable.css +2 -2
  40. package/dist/handsontable.full.css +2 -2
  41. package/dist/handsontable.full.js +2494 -1961
  42. package/dist/handsontable.full.min.css +2 -2
  43. package/dist/handsontable.full.min.js +148 -148
  44. package/dist/handsontable.js +2495 -1962
  45. package/dist/handsontable.min.css +2 -2
  46. package/dist/handsontable.min.js +32 -32
  47. package/helpers/mixed.js +1 -1
  48. package/helpers/mixed.mjs +1 -1
  49. package/package.json +1 -1
  50. package/plugins/autoColumnSize/autoColumnSize.js +1 -1
  51. package/plugins/autoColumnSize/autoColumnSize.mjs +2 -2
  52. package/plugins/manualRowResize/manualRowResize.js +1 -1
  53. package/plugins/manualRowResize/manualRowResize.mjs +2 -2
  54. package/3rdparty/walkontable/src/calculator/constants.js +0 -26
  55. 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;