virtual-scroller 1.8.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +337 -160
  3. package/bundle/virtual-scroller-dom.js +1 -1
  4. package/bundle/virtual-scroller-dom.js.map +1 -1
  5. package/bundle/virtual-scroller-react.js +1 -1
  6. package/bundle/virtual-scroller-react.js.map +1 -1
  7. package/bundle/virtual-scroller.js +1 -1
  8. package/bundle/virtual-scroller.js.map +1 -1
  9. package/commonjs/BeforeResize.js +23 -27
  10. package/commonjs/BeforeResize.js.map +1 -1
  11. package/commonjs/DOM/Engine.js +7 -7
  12. package/commonjs/DOM/Engine.js.map +1 -1
  13. package/commonjs/DOM/ItemsContainer.js +1 -1
  14. package/commonjs/DOM/ItemsContainer.js.map +1 -1
  15. package/commonjs/DOM/ListTopOffsetWatcher.js +15 -9
  16. package/commonjs/DOM/ListTopOffsetWatcher.js.map +1 -1
  17. package/commonjs/DOM/ScrollableContainer.js +28 -28
  18. package/commonjs/DOM/ScrollableContainer.js.map +1 -1
  19. package/commonjs/DOM/VirtualScroller.js +20 -17
  20. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  21. package/commonjs/DOM/tbody.js +16 -10
  22. package/commonjs/DOM/tbody.js.map +1 -1
  23. package/commonjs/ItemHeights.js +13 -7
  24. package/commonjs/ItemHeights.js.map +1 -1
  25. package/commonjs/Layout.js +15 -13
  26. package/commonjs/Layout.js.map +1 -1
  27. package/commonjs/Layout.test.js +8 -3
  28. package/commonjs/Layout.test.js.map +1 -1
  29. package/commonjs/{ListHeightChangeWatcher.js → ListHeightMeasurement.js} +26 -28
  30. package/commonjs/ListHeightMeasurement.js.map +1 -0
  31. package/commonjs/Resize.js +38 -28
  32. package/commonjs/Resize.js.map +1 -1
  33. package/commonjs/Scroll.js +28 -44
  34. package/commonjs/Scroll.js.map +1 -1
  35. package/commonjs/VirtualScroller.columns.js +43 -0
  36. package/commonjs/VirtualScroller.columns.js.map +1 -0
  37. package/commonjs/VirtualScroller.constructor.js +408 -0
  38. package/commonjs/VirtualScroller.constructor.js.map +1 -0
  39. package/commonjs/VirtualScroller.items.js +305 -0
  40. package/commonjs/VirtualScroller.items.js.map +1 -0
  41. package/commonjs/VirtualScroller.js +132 -1872
  42. package/commonjs/VirtualScroller.js.map +1 -1
  43. package/commonjs/VirtualScroller.layout.js +562 -0
  44. package/commonjs/VirtualScroller.layout.js.map +1 -0
  45. package/commonjs/VirtualScroller.onRender.js +357 -0
  46. package/commonjs/VirtualScroller.onRender.js.map +1 -0
  47. package/commonjs/VirtualScroller.resize.js +186 -0
  48. package/commonjs/VirtualScroller.resize.js.map +1 -0
  49. package/commonjs/VirtualScroller.state.js +301 -0
  50. package/commonjs/VirtualScroller.state.js.map +1 -0
  51. package/commonjs/VirtualScroller.verticalSpacing.js +65 -0
  52. package/commonjs/VirtualScroller.verticalSpacing.js.map +1 -0
  53. package/commonjs/getItemCoordinates.js.map +1 -1
  54. package/commonjs/getItemsDiff.js.map +1 -1
  55. package/commonjs/getVerticalSpacing.js.map +1 -1
  56. package/commonjs/package.json +5 -0
  57. package/commonjs/react/VirtualScroller.js +180 -620
  58. package/commonjs/react/VirtualScroller.js.map +1 -1
  59. package/commonjs/react/useClassName.js +26 -0
  60. package/commonjs/react/useClassName.js.map +1 -0
  61. package/commonjs/react/useHandleItemsChange.js +116 -0
  62. package/commonjs/react/useHandleItemsChange.js.map +1 -0
  63. package/commonjs/react/useInstanceMethods.js +37 -0
  64. package/commonjs/react/useInstanceMethods.js.map +1 -0
  65. package/commonjs/react/useItemKeys.js +60 -0
  66. package/commonjs/react/useItemKeys.js.map +1 -0
  67. package/commonjs/react/useOnItemHeightChange.js +32 -0
  68. package/commonjs/react/useOnItemHeightChange.js.map +1 -0
  69. package/commonjs/react/useOnItemStateChange.js +32 -0
  70. package/commonjs/react/useOnItemStateChange.js.map +1 -0
  71. package/commonjs/react/useState.js +140 -0
  72. package/commonjs/react/useState.js.map +1 -0
  73. package/commonjs/react/useStyle.js +29 -0
  74. package/commonjs/react/useStyle.js.map +1 -0
  75. package/commonjs/react/useVirtualScroller.js +62 -0
  76. package/commonjs/react/useVirtualScroller.js.map +1 -0
  77. package/commonjs/react/useVirtualScrollerStartStop.js +20 -0
  78. package/commonjs/react/useVirtualScrollerStartStop.js.map +1 -0
  79. package/commonjs/test/Engine.js +23 -0
  80. package/commonjs/test/Engine.js.map +1 -0
  81. package/commonjs/test/ItemsContainer.js +127 -0
  82. package/commonjs/test/ItemsContainer.js.map +1 -0
  83. package/commonjs/test/ScrollableContainer.js +130 -0
  84. package/commonjs/test/ScrollableContainer.js.map +1 -0
  85. package/commonjs/test/VirtualScroller.js +281 -0
  86. package/commonjs/test/VirtualScroller.js.map +1 -0
  87. package/commonjs/utility/debounce.js +2 -2
  88. package/commonjs/utility/debounce.js.map +1 -1
  89. package/commonjs/utility/debug.js.map +1 -1
  90. package/commonjs/utility/getStateSnapshot.js +2 -2
  91. package/commonjs/utility/getStateSnapshot.js.map +1 -1
  92. package/commonjs/utility/px.js.map +1 -1
  93. package/commonjs/utility/px.test.js +1 -1
  94. package/commonjs/utility/px.test.js.map +1 -1
  95. package/commonjs/utility/shallowEqual.js +1 -1
  96. package/commonjs/utility/shallowEqual.js.map +1 -1
  97. package/commonjs/utility/throttle.js.map +1 -1
  98. package/dom/index.cjs +4 -0
  99. package/dom/index.cjs.js +9 -0
  100. package/dom/index.d.ts +6 -4
  101. package/dom/index.js +1 -1
  102. package/dom/package.json +10 -4
  103. package/index.cjs +4 -0
  104. package/index.cjs.js +9 -0
  105. package/index.d.ts +30 -15
  106. package/index.js +1 -1
  107. package/modules/BeforeResize.js +22 -27
  108. package/modules/BeforeResize.js.map +1 -1
  109. package/modules/DOM/Engine.js +6 -6
  110. package/modules/DOM/Engine.js.map +1 -1
  111. package/modules/DOM/ItemsContainer.js +1 -1
  112. package/modules/DOM/ItemsContainer.js.map +1 -1
  113. package/modules/DOM/ListTopOffsetWatcher.js +15 -9
  114. package/modules/DOM/ListTopOffsetWatcher.js.map +1 -1
  115. package/modules/DOM/ScrollableContainer.js +28 -28
  116. package/modules/DOM/ScrollableContainer.js.map +1 -1
  117. package/modules/DOM/VirtualScroller.js +19 -16
  118. package/modules/DOM/VirtualScroller.js.map +1 -1
  119. package/modules/DOM/tbody.js +11 -9
  120. package/modules/DOM/tbody.js.map +1 -1
  121. package/modules/ItemHeights.js +12 -6
  122. package/modules/ItemHeights.js.map +1 -1
  123. package/modules/Layout.js +14 -12
  124. package/modules/Layout.js.map +1 -1
  125. package/modules/Layout.test.js +8 -3
  126. package/modules/Layout.test.js.map +1 -1
  127. package/modules/{ListHeightChangeWatcher.js → ListHeightMeasurement.js} +25 -27
  128. package/modules/ListHeightMeasurement.js.map +1 -0
  129. package/modules/Resize.js +38 -28
  130. package/modules/Resize.js.map +1 -1
  131. package/modules/Scroll.js +28 -44
  132. package/modules/Scroll.js.map +1 -1
  133. package/modules/VirtualScroller.columns.js +36 -0
  134. package/modules/VirtualScroller.columns.js.map +1 -0
  135. package/modules/VirtualScroller.constructor.js +371 -0
  136. package/modules/VirtualScroller.constructor.js.map +1 -0
  137. package/modules/VirtualScroller.items.js +288 -0
  138. package/modules/VirtualScroller.items.js.map +1 -0
  139. package/modules/VirtualScroller.js +132 -1860
  140. package/modules/VirtualScroller.js.map +1 -1
  141. package/modules/VirtualScroller.layout.js +549 -0
  142. package/modules/VirtualScroller.layout.js.map +1 -0
  143. package/modules/VirtualScroller.onRender.js +337 -0
  144. package/modules/VirtualScroller.onRender.js.map +1 -0
  145. package/modules/VirtualScroller.resize.js +176 -0
  146. package/modules/VirtualScroller.resize.js.map +1 -0
  147. package/modules/VirtualScroller.state.js +283 -0
  148. package/modules/VirtualScroller.state.js.map +1 -0
  149. package/modules/VirtualScroller.verticalSpacing.js +54 -0
  150. package/modules/VirtualScroller.verticalSpacing.js.map +1 -0
  151. package/modules/getItemCoordinates.js.map +1 -1
  152. package/modules/getItemsDiff.js.map +1 -1
  153. package/modules/getVerticalSpacing.js.map +1 -1
  154. package/modules/react/VirtualScroller.js +176 -625
  155. package/modules/react/VirtualScroller.js.map +1 -1
  156. package/modules/react/useClassName.js +18 -0
  157. package/modules/react/useClassName.js.map +1 -0
  158. package/modules/react/useHandleItemsChange.js +108 -0
  159. package/modules/react/useHandleItemsChange.js.map +1 -0
  160. package/modules/react/useInstanceMethods.js +28 -0
  161. package/modules/react/useInstanceMethods.js.map +1 -0
  162. package/modules/react/useItemKeys.js +52 -0
  163. package/modules/react/useItemKeys.js.map +1 -0
  164. package/modules/react/useOnItemHeightChange.js +24 -0
  165. package/modules/react/useOnItemHeightChange.js.map +1 -0
  166. package/modules/react/useOnItemStateChange.js +24 -0
  167. package/modules/react/useOnItemStateChange.js.map +1 -0
  168. package/modules/react/useState.js +132 -0
  169. package/modules/react/useState.js.map +1 -0
  170. package/modules/react/useStyle.js +19 -0
  171. package/modules/react/useStyle.js.map +1 -0
  172. package/modules/react/useVirtualScroller.js +51 -0
  173. package/modules/react/useVirtualScroller.js.map +1 -0
  174. package/modules/react/useVirtualScrollerStartStop.js +12 -0
  175. package/modules/react/useVirtualScrollerStartStop.js.map +1 -0
  176. package/modules/test/Engine.js +11 -0
  177. package/modules/test/Engine.js.map +1 -0
  178. package/modules/test/ItemsContainer.js +120 -0
  179. package/modules/test/ItemsContainer.js.map +1 -0
  180. package/modules/test/ScrollableContainer.js +123 -0
  181. package/modules/test/ScrollableContainer.js.map +1 -0
  182. package/modules/test/VirtualScroller.js +270 -0
  183. package/modules/test/VirtualScroller.js.map +1 -0
  184. package/modules/utility/debounce.js +2 -2
  185. package/modules/utility/debounce.js.map +1 -1
  186. package/modules/utility/debug.js.map +1 -1
  187. package/modules/utility/getStateSnapshot.js +2 -2
  188. package/modules/utility/getStateSnapshot.js.map +1 -1
  189. package/modules/utility/px.js.map +1 -1
  190. package/modules/utility/px.test.js +1 -1
  191. package/modules/utility/px.test.js.map +1 -1
  192. package/modules/utility/shallowEqual.js +1 -1
  193. package/modules/utility/shallowEqual.js.map +1 -1
  194. package/modules/utility/throttle.js.map +1 -1
  195. package/package.json +46 -23
  196. package/react/index.cjs +4 -0
  197. package/react/index.cjs.js +9 -0
  198. package/react/index.d.ts +10 -9
  199. package/react/index.js +1 -1
  200. package/react/package.json +10 -4
  201. package/rollup.config.mjs +62 -0
  202. package/runnable/create-commonjs-package-json.js +11 -0
  203. package/source/BeforeResize.js +16 -21
  204. package/source/DOM/Engine.js +8 -10
  205. package/source/DOM/ListTopOffsetWatcher.js +13 -8
  206. package/source/DOM/ScrollableContainer.js +23 -21
  207. package/source/DOM/VirtualScroller.js +27 -11
  208. package/source/DOM/tbody.js +30 -21
  209. package/source/ItemHeights.js +9 -4
  210. package/source/Layout.js +12 -9
  211. package/source/Layout.test.js +8 -3
  212. package/source/{ListHeightChangeWatcher.js → ListHeightMeasurement.js} +21 -20
  213. package/source/Resize.js +41 -25
  214. package/source/Scroll.js +27 -35
  215. package/source/VirtualScroller.columns.js +26 -0
  216. package/source/VirtualScroller.constructor.js +336 -0
  217. package/source/VirtualScroller.items.js +302 -0
  218. package/source/VirtualScroller.js +144 -1875
  219. package/source/VirtualScroller.layout.js +539 -0
  220. package/source/VirtualScroller.onRender.js +345 -0
  221. package/source/VirtualScroller.resize.js +189 -0
  222. package/source/VirtualScroller.state.js +284 -0
  223. package/source/VirtualScroller.verticalSpacing.js +51 -0
  224. package/source/react/VirtualScroller.js +243 -587
  225. package/source/react/useClassName.js +14 -0
  226. package/source/react/useHandleItemsChange.js +115 -0
  227. package/source/react/useInstanceMethods.js +25 -0
  228. package/source/react/useItemKeys.js +59 -0
  229. package/source/react/useOnItemHeightChange.js +28 -0
  230. package/source/react/useOnItemStateChange.js +28 -0
  231. package/source/react/useState.js +114 -0
  232. package/source/react/useStyle.js +20 -0
  233. package/source/react/useVirtualScroller.js +59 -0
  234. package/source/react/useVirtualScrollerStartStop.js +12 -0
  235. package/source/test/Engine.js +11 -0
  236. package/source/test/ItemsContainer.js +87 -0
  237. package/source/test/ScrollableContainer.js +88 -0
  238. package/source/test/VirtualScroller.js +232 -0
  239. package/source/utility/debounce.js +2 -2
  240. package/source/utility/px.test.js +1 -1
  241. package/babel.config.js +0 -25
  242. package/babel.js +0 -5
  243. package/commonjs/ListHeightChangeWatcher.js.map +0 -1
  244. package/dom/index.commonjs.js +0 -4
  245. package/index.commonjs.js +0 -4
  246. package/modules/ListHeightChangeWatcher.js.map +0 -1
  247. package/react/index.commonjs.js +0 -4
package/modules/Layout.js CHANGED
@@ -1,6 +1,6 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
2
 
3
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
4
 
5
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
6
 
@@ -8,9 +8,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
8
8
 
9
9
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
10
10
 
11
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
11
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
12
12
 
13
- import log, { warn } from './utility/debug';
13
+ import log, { warn } from './utility/debug.js';
14
14
 
15
15
  var Layout = /*#__PURE__*/function () {
16
16
  function Layout(_ref) {
@@ -136,7 +136,8 @@ var Layout = /*#__PURE__*/function () {
136
136
  appendedItemsCount = _ref5.appendedItemsCount;
137
137
  var itemsCount = _ref6.itemsCount,
138
138
  columnsCount = _ref6.columnsCount,
139
- shouldRestoreScrollPosition = _ref6.shouldRestoreScrollPosition;
139
+ shouldRestoreScrollPosition = _ref6.shouldRestoreScrollPosition,
140
+ onResetGridLayout = _ref6.onResetGridLayout;
140
141
  // const layoutUpdate = {}
141
142
  // If the layout stays the same, then simply increase
142
143
  // the top and bottom margins proportionally to the amount
@@ -209,8 +210,9 @@ var Layout = /*#__PURE__*/function () {
209
210
  // row heights, but I don't want to write code for such an extremely rare
210
211
  // use case. Instead, use the `getColumnsCount()` parameter function when
211
212
  // fetching previous items.
213
+ onResetGridLayout();
212
214
  warn('~ Prepended items count', prependedItemsCount, 'is not divisible by Columns Count', columnsCount, '~');
213
- warn('Reset Layout');
215
+ warn('Layout reset required');
214
216
  var shownItemsCountBeforeItemsUpdate = lastShownItemIndex - firstShownItemIndex + 1;
215
217
  firstShownItemIndex = 0;
216
218
  beforeItemsHeight = 0;
@@ -243,20 +245,20 @@ var Layout = /*#__PURE__*/function () {
243
245
  // The reason is that only this way subsequent `setItems()` calls
244
246
  // will be truly "stateless" when a chain of `setItems()` calls
245
247
  // could be replaced with just the last one in a scenario when
246
- // `setState()` calls are "asynchronous" (delayed execution).
248
+ // `updateState()` calls are "asynchronous" (delayed execution).
247
249
  //
248
250
  // So, for example, the user calls `setItems()` with one set of items.
249
- // A `setState()` call has been dispatched but the `state` hasn't been updated yet.
251
+ // A `updateState()` call has been dispatched but the `state` hasn't been updated yet.
250
252
  // Then the user calls `setItems()` with another set of items.
251
253
  // If this function only returned a minimal set of properties that actually change,
252
254
  // the other layout properties of the second `setItems()` call wouldn't overwrite the ones
253
255
  // scheduled for update during the first `setItems()` call, resulting in an inconsistent `state`.
254
256
  //
255
- // For example, the first `setItems()` call does a `setState()` call where it updates
257
+ // For example, the first `setItems()` call does a `updateState()` call where it updates
256
258
  // `afterItemsHeight`, and then the second `setItems()` call only updates `beforeItemsHeight`
257
259
  // and `firstShownItemIndex` and `lastShownItemIndex`. If the second `setItems()` call was to
258
260
  // overwrite any effects of the pending-but-not-yet-applied first `setItems()` call, it would
259
- // have to call `setState()` with an `afterItemsHeight` property too, even though it hasn't change.
261
+ // have to call `updateState()` with an `afterItemsHeight` property too, even though it hasn't change.
260
262
  // That would be just to revert the change to `afterItemsHeight` state property already scheduled
261
263
  // by the first `setItems()` call.
262
264
  //
@@ -745,8 +747,8 @@ export var LAYOUT_REASON = {
745
747
  SCROLL: 'scroll',
746
748
  STOPPED_SCROLLING: 'stopped scrolling',
747
749
  MANUAL: 'manual',
748
- MOUNTED: 'mounted',
749
- ACTUAL_ITEM_HEIGHTS_HAVE_BEEN_MEASURED: 'actual item heights have been measured',
750
+ STARTED: 'started',
751
+ NON_MEASURED_ITEMS_HAVE_BEEN_MEASURED: 'non-measured item heights have been measured',
750
752
  VIEWPORT_WIDTH_CHANGED: 'viewport width changed',
751
753
  VIEWPORT_HEIGHT_CHANGED: 'viewport height changed',
752
754
  VIEWPORT_SIZE_UNCHANGED: 'viewport size unchanged',
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/Layout.js"],"names":["log","warn","Layout","bypass","estimatedItemHeight","measureItemsBatchSize","getPrerenderMargin","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCount","getColumnsCountBeforeResize","getItemHeight","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getMaxVisibleAreaHeight","getPreviouslyCalculatedLayout","itemsCount","columnsCount","firstShownItemIndex","lastShownItemIndex","getInitialLastShownItemIndex","beforeItemsHeight","afterItemsHeight","estimatedRowsCount","getEstimatedRowsCountForHeight","Math","min","height","getEstimatedItemHeight","verticalSpacing","ceil","prependedItemsCount","appendedItemsCount","shouldRestoreScrollPosition","averageItemHeight","appendedRowsCount","addedHeightAfter","prependedRowsCount","addedHeightBefore","shownItemsCountBeforeItemsUpdate","afterItemsCount","i","nonMeasuredAreaHeight","indexOfTheFirstItemInTheRow","itemsCountToRenderForMeasurement","Infinity","undefined","firstNonMeasuredItemIndex","visibleAreaTop","visibleAreaBottom","indexes","_getShownItemIndex","fromIndex","findFirstShownItemIndex","getNonVisibleListShownItemIndexes","findLastShownItemIndex","parameters","beforeResize","Error","beforeResizeItemsCount","notFound","beforeResizeItemsHeight","floor","currentRowFirstItemIndex","hasMoreRows","verticalSpacingAfterCurrentRow","currentRowHeight","columnIndex","itemHeight","getItemNotMeasuredIndexes","max","itemsHeightFromFirstRowToThisRow","rowStepsIntoVisibleAreaTop","rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder","layout","beforeItemsCount","getBeforeItemsHeight","rowHeight","lastShownRowIndex","topOffsetInsideScrollableContainer","beforeResizeRowsCount","maxBeforeResizeRowsCount","beforeResizeRowIndex","itemRowIndex","rowIndex","LAYOUT_REASON","SCROLL","STOPPED_SCROLLING","MANUAL","MOUNTED","ACTUAL_ITEM_HEIGHTS_HAVE_BEEN_MEASURED","VIEWPORT_WIDTH_CHANGED","VIEWPORT_HEIGHT_CHANGED","VIEWPORT_SIZE_UNCHANGED","ITEM_HEIGHT_CHANGED","ITEMS_CHANGED","TOP_OFFSET_CHANGED"],"mappings":"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","sourcesContent":["import log, { warn } from './utility/debug'\r\n\r\nexport default class Layout {\r\n\tconstructor({\r\n\t\tbypass,\r\n\t\testimatedItemHeight,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin,\r\n\t\tgetVerticalSpacing,\r\n\t\tgetVerticalSpacingBeforeResize,\r\n\t\tgetColumnsCount,\r\n\t\tgetColumnsCountBeforeResize,\r\n\t\tgetItemHeight,\r\n\t\tgetItemHeightBeforeResize,\r\n\t\tgetBeforeResizeItemsCount,\r\n\t\tgetAverageItemHeight,\r\n\t\tgetMaxVisibleAreaHeight,\r\n\t\tgetPreviouslyCalculatedLayout\r\n\t}) {\r\n\t\tthis.bypass = bypass\r\n\t\tthis.estimatedItemHeight = estimatedItemHeight\r\n\t\tthis.measureItemsBatchSize = measureItemsBatchSize\r\n\t\tthis.getPrerenderMargin = getPrerenderMargin\r\n\t\tthis.getVerticalSpacing = getVerticalSpacing\r\n\t\tthis.getVerticalSpacingBeforeResize = getVerticalSpacingBeforeResize\r\n\t\tthis.getColumnsCount = getColumnsCount\r\n\t\tthis.getColumnsCountBeforeResize = getColumnsCountBeforeResize\r\n\t\tthis.getItemHeight = getItemHeight\r\n\t\tthis.getItemHeightBeforeResize = getItemHeightBeforeResize\r\n\t\tthis.getBeforeResizeItemsCount = getBeforeResizeItemsCount\r\n\t\tthis.getAverageItemHeight = getAverageItemHeight\r\n\t\tthis.getMaxVisibleAreaHeight = getMaxVisibleAreaHeight\r\n\t\t//\r\n\t\t// The \"previously calculated layout\" feature is not currently used.\r\n\t\t//\r\n\t\t// The current layout snapshot could be stored as a \"previously calculated layout\" variable\r\n\t\t// so that it could theoretically be used when calculating new layout incrementally\r\n\t\t// rather than from scratch, which would be an optimization.\r\n\t\t//\r\n\t\tthis.getPreviouslyCalculatedLayout = getPreviouslyCalculatedLayout\r\n\t}\r\n\r\n\tgetInitialLayoutValues({\r\n\t\titemsCount,\r\n\t\tcolumnsCount\r\n\t}) {\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\t\t// If there're no items then `firstShownItemIndex` stays `undefined`.\r\n\t\tif (itemsCount > 0) {\r\n\t\t\tfirstShownItemIndex = 0\r\n\t\t\tlastShownItemIndex = this.getInitialLastShownItemIndex({\r\n\t\t\t\titemsCount,\r\n\t\t\t\tcolumnsCount,\r\n\t\t\t\tfirstShownItemIndex\r\n\t\t\t})\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 0,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\tgetInitialLastShownItemIndex({\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tfirstShownItemIndex\r\n\t}) {\r\n\t\tif (this.bypass) {\r\n\t\t\treturn itemsCount - 1\r\n\t\t}\r\n\t\t// On server side, at initialization time,\r\n\t\t// `scrollableContainer` is `undefined`,\r\n\t\t// so default to `1` estimated rows count.\r\n\t\tlet estimatedRowsCount = 1\r\n\t\tif (this.getMaxVisibleAreaHeight()) {\r\n\t\t\testimatedRowsCount = this.getEstimatedRowsCountForHeight(this.getMaxVisibleAreaHeight() + this.getPrerenderMargin())\r\n\t\t}\r\n\t\treturn Math.min(\r\n\t\t\tfirstShownItemIndex + (estimatedRowsCount * columnsCount - 1),\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\t}\r\n\r\n\tgetEstimatedRowsCountForHeight(height) {\r\n\t\tconst estimatedItemHeight = this.getEstimatedItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\t\tif (estimatedItemHeight) {\r\n\t\t\treturn Math.ceil((height + verticalSpacing) / (estimatedItemHeight + verticalSpacing))\r\n\t\t} else {\r\n\t\t\t// If no items have been rendered yet, and no `estimatedItemHeight` option\r\n\t\t\t// has been passed, then default to `1` estimated rows count in any `height`.\r\n\t\t\treturn 1\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns estimated list item height.\r\n\t * (depends on which items have been previously rendered and measured).\r\n\t * @return {number}\r\n\t */\r\n\tgetEstimatedItemHeight() {\r\n\t\treturn this.getAverageItemHeight() || this.estimatedItemHeight || 0\r\n\t}\r\n\r\n\tgetLayoutUpdateForItemsDiff({\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex,\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t}, {\r\n\t\tprependedItemsCount,\r\n\t\tappendedItemsCount\r\n\t}, {\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tshouldRestoreScrollPosition\r\n\t}) {\r\n\t\t// const layoutUpdate = {}\r\n\r\n\t\t// If the layout stays the same, then simply increase\r\n\t\t// the top and bottom margins proportionally to the amount\r\n\t\t// of the items added.\r\n\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\r\n\t\tif (appendedItemsCount > 0) {\r\n\t\t\tconst appendedRowsCount = Math.ceil(appendedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightAfter = appendedRowsCount * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\tafterItemsHeight += addedHeightAfter\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tafterItemsHeight\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\tif (prependedItemsCount > 0) {\r\n\t\t\tconst prependedRowsCount = Math.ceil(prependedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightBefore = prependedRowsCount * (averageItemHeight + verticalSpacing)\r\n\r\n\t\t\tfirstShownItemIndex += prependedItemsCount\r\n\t\t\tlastShownItemIndex += prependedItemsCount\r\n\t\t\tbeforeItemsHeight += addedHeightBefore\r\n\r\n\t\t\t// If the currently shown items position on screen should be preserved\r\n\t\t\t// when prepending new items, then it means that:\r\n\t\t\t// * The current scroll position should be snapshotted.\r\n\t\t\t// * The current list height should be snapshotted.\r\n\t\t\t// * All prepended items should be shown so that their height could be\r\n\t\t\t// measured after they're rendered. Based on the prepended items' height,\r\n\t\t\t// the scroll position will be restored so that there's no \"jump of content\".\r\n\t\t\tif (shouldRestoreScrollPosition) {\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\t\t\t}\r\n\r\n\t\t\tif (prependedItemsCount % columnsCount > 0) {\r\n\t\t\t\t// Rows will be rebalanced as a result of prepending new items,\r\n\t\t\t\t// and row heights can change as a result, so re-layout items\r\n\t\t\t\t// after they've been measured (after the upcoming re-render).\r\n\t\t\t\t//\r\n\t\t\t\t// For example, consider a web page where item rows are `display: flex`.\r\n\t\t\t\t// Suppose there're 3 columns and it shows items from 4 to 6.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Apples are | Bananas | Cranberries |\r\n\t\t\t\t// | green | | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Dates | Elderberry | Figs are |\r\n\t\t\t\t// | | | tasty |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t//\r\n\t\t\t\t// Now, 1 item gets prepended. As a result, all existing rows will have\r\n\t\t\t\t// a different set of items, which means that the row heights will change.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Zucchini | Apples are | Bananas |\r\n\t\t\t\t// | | green | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Cranberries | Dates | Elderberry |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Figs |\r\n\t\t\t\t// | are tasty |\r\n\t\t\t\t// ---------------\r\n\t\t\t\t//\r\n\t\t\t\t// As it can be seen above, the second row's height has changed from 2 to 1.\r\n\t\t\t\t// Not only that, but `itemHeights` have changed as well, so if you thought\r\n\t\t\t\t// that the library could easily recalculate row heights using `Math.max()` — \r\n\t\t\t\t// turns out it's not always the case.\r\n\t\t\t\t//\r\n\t\t\t\t// There could be an explicit opt-in option for automatically recalculating\r\n\t\t\t\t// row heights, but I don't want to write code for such an extremely rare\r\n\t\t\t\t// use case. Instead, use the `getColumnsCount()` parameter function when\r\n\t\t\t\t// fetching previous items.\r\n\r\n\t\t\t\twarn('~ Prepended items count', prependedItemsCount, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\t\twarn('Reset Layout')\r\n\r\n\t\t\t\tconst shownItemsCountBeforeItemsUpdate = lastShownItemIndex - firstShownItemIndex + 1\r\n\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\r\n\t\t\t\tif (!shouldRestoreScrollPosition) {\r\n\t\t\t\t\t// Limit shown items count if too many items have been prepended.\r\n\t\t\t\t\tif (prependedItemsCount > shownItemsCountBeforeItemsUpdate) {\r\n\t\t\t\t\t\tlastShownItemIndex = this.getInitialLastShownItemIndex({\r\n\t\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\t\tcolumnsCount,\r\n\t\t\t\t\t\t\tfirstShownItemIndex\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\t// Approximate `afterItemsHeight` calculation.\r\n\t\t\t\t\t\tconst afterItemsCount = itemsCount - (lastShownItemIndex + 1)\r\n\t\t\t\t\t\tafterItemsHeight = Math.ceil(afterItemsCount / columnsCount) * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\t\t\t\t// layoutUpdate = {\r\n\t\t\t\t\t\t// \t...layoutUpdate,\r\n\t\t\t\t\t\t// \tafterItemsHeight\r\n\t\t\t\t\t\t// }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tbeforeItemsHeight,\r\n\t\t\t// \tfirstShownItemIndex,\r\n\t\t\t// \tlastShownItemIndex\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// return layoutUpdate\r\n\r\n\t\t// Overwrite all four props in all scenarios.\r\n\t\t// The reason is that only this way subsequent `setItems()` calls\r\n\t\t// will be truly \"stateless\" when a chain of `setItems()` calls\r\n\t\t// could be replaced with just the last one in a scenario when\r\n\t\t// `setState()` calls are \"asynchronous\" (delayed execution).\r\n\t\t//\r\n\t\t// So, for example, the user calls `setItems()` with one set of items.\r\n\t\t// A `setState()` call has been dispatched but the `state` hasn't been updated yet.\r\n\t\t// Then the user calls `setItems()` with another set of items.\r\n\t\t// If this function only returned a minimal set of properties that actually change,\r\n\t\t// the other layout properties of the second `setItems()` call wouldn't overwrite the ones\r\n\t\t// scheduled for update during the first `setItems()` call, resulting in an inconsistent `state`.\r\n\t\t//\r\n\t\t// For example, the first `setItems()` call does a `setState()` call where it updates\r\n\t\t// `afterItemsHeight`, and then the second `setItems()` call only updates `beforeItemsHeight`\r\n\t\t// and `firstShownItemIndex` and `lastShownItemIndex`. If the second `setItems()` call was to\r\n\t\t// overwrite any effects of the pending-but-not-yet-applied first `setItems()` call, it would\r\n\t\t// have to call `setState()` with an `afterItemsHeight` property too, even though it hasn't change.\r\n\t\t// That would be just to revert the change to `afterItemsHeight` state property already scheduled\r\n\t\t// by the first `setItems()` call.\r\n\t\t//\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t// If an item that hasn't been shown (and measured) yet is encountered\r\n\t// then show such item and then retry after it has been measured.\r\n\tgetItemNotMeasuredIndexes(i, {\r\n\t\titemsCount,\r\n\t\tfirstShownItemIndex,\r\n\t\tnonMeasuredAreaHeight,\r\n\t\tindexOfTheFirstItemInTheRow\r\n\t}) {\r\n\t\tlog('Item index', i, 'height is required for calculations but hasn\\'t been measured yet. Mark the item as \"shown\", rerender the list, measure the item\\'s height and redo the layout.')\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\r\n\t\tconst itemsCountToRenderForMeasurement = Math.min(\r\n\t\t\tthis.getEstimatedRowsCountForHeight(nonMeasuredAreaHeight) * columnsCount,\r\n\t\t\tthis.measureItemsBatchSize || Infinity,\r\n\t\t)\r\n\r\n\t\tif (firstShownItemIndex === undefined) {\r\n\t\t\tfirstShownItemIndex = indexOfTheFirstItemInTheRow\r\n\t\t}\r\n\r\n\t\tconst lastShownItemIndex = Math.min(\r\n\t\t\tindexOfTheFirstItemInTheRow + itemsCountToRenderForMeasurement - 1,\r\n\t\t\t// Guard against index overflow.\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\r\n\t\treturn {\r\n\t\t\tfirstNonMeasuredItemIndex: i,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the indexes of the currently visible items.\r\n\t * @return {object} `{ firstShownItemIndex: number, lastShownItemIndex: number, firstNonMeasuredItemIndex: number? }`\r\n\t */\r\n\tgetShownItemIndexes({\r\n\t\titemsCount,\r\n\t\tvisibleAreaTop,\r\n\t\tvisibleAreaBottom\r\n\t}) {\r\n\t\tlet indexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: 0,\r\n\t\t\tvisibleAreaTop,\r\n\t\t\tvisibleAreaBottom,\r\n\t\t\tfindFirstShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { firstShownItemIndex, beforeItemsHeight } = indexes\r\n\r\n\t\tindexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: firstShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tvisibleAreaTop,\r\n\t\t\tvisibleAreaBottom,\r\n\t\t\tfindLastShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { lastShownItemIndex } = indexes\r\n\r\n\t\treturn {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t_getShownItemIndex(parameters) {\r\n\t\tconst {\r\n\t\t\tbeforeResize,\r\n\t\t\titemsCount,\r\n\t\t\tvisibleAreaTop,\r\n\t\t\tvisibleAreaBottom,\r\n\t\t\tfindFirstShownItemIndex,\r\n\t\t\tfindLastShownItemIndex,\r\n\t\t\t// backwards\r\n\t\t} = parameters\r\n\r\n\t\tlet {\r\n\t\t\tfromIndex,\r\n\t\t\tbeforeItemsHeight\r\n\t\t} = parameters\r\n\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\t\t//\r\n\t\t// If someone would attempt to use a \"previously calculated layout\" here\r\n\t\t// then `shownItemsHeight` would also have to be returned from this function:\r\n\t\t// the total height of all shown items including vertical spacing between them.\r\n\t\t//\r\n\t\t// If \"previously calculated layout\" would be used then it would first find\r\n\t\t// `firstShownItemIndex` and then find `lastShownItemIndex` as part of two\r\n\t\t// separate calls of this function, each with or without `backwards` flag,\r\n\t\t// depending on whether `visibleAreaTop` and `visibleAreBottom` have shifted up or down.\r\n\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\r\n\t\t// It's not always required to pass `beforeItemsHeight` parameter:\r\n\t\t// when `fromIndex` is `0`, it's also assumed to be `0`.\r\n\t\tif (fromIndex === 0) {\r\n\t\t\tbeforeItemsHeight = 0\r\n\t\t}\r\n\r\n\t\tif (beforeItemsHeight === undefined) {\r\n\t\t\tthrow new Error('[virtual-scroller] `beforeItemsHeight` not passed to `Layout.getShownItemIndexes()` when starting from index ' + fromIndex);\r\n\t\t}\r\n\r\n\t\t// const backwards = false\r\n\t\t// while (backwards ? i >= 0 : i < itemsCount) {}\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\t\tif (beforeResizeItemsCount > fromIndex) {\r\n\t\t\t\t// First search for the item in \"before resize\" items.\r\n\t\t\t\tconst {\r\n\t\t\t\t\tnotFound,\r\n\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight,\r\n\t\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\t\tlastShownItemIndex\r\n\t\t\t\t} = this._getShownItemIndex({\r\n\t\t\t\t\t...parameters,\r\n\t\t\t\t\tbeforeResize: true,\r\n\t\t\t\t\titemsCount: beforeResizeItemsCount\r\n\t\t\t\t})\r\n\r\n\t\t\t\t// If the item was not found in \"before resize\" items\r\n\t\t\t\t// then search in regular items skipping \"before resize\" ones.\r\n\t\t\t\tif (notFound) {\r\n\t\t\t\t\tbeforeItemsHeight = beforeResizeItemsHeight\r\n\t\t\t\t\tfromIndex += beforeResizeItemsCount\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// If the item was found in \"before resize\" items\r\n\t\t\t\t\t// then return the result.\r\n\t\t\t\t\t// Rebalance first / last shown item indexes based on\r\n\t\t\t\t\t// the current columns count, if required.\r\n\t\t\t\t\tconst columnsCount = this.getColumnsCount()\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: firstShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(firstShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tlastShownItemIndex: lastShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(lastShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\tlet i = fromIndex\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tconst hasMoreRows = itemsCount > currentRowFirstItemIndex + columnsCount\r\n\t\t\tconst verticalSpacingAfterCurrentRow = hasMoreRows ? verticalSpacing : 0\r\n\r\n\t\t\tlet currentRowHeight = 0\r\n\r\n\t\t\t// Calculate current row height.\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tconst itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\r\n\t\t\t\t// If this item hasn't been measured yet (or re-measured after a resize)\r\n\t\t\t\t// then mark it as the first non-measured one.\r\n\t\t\t\t//\r\n\t\t\t\t// Can't happen by definition when `beforeResize` parameter is `true`.\r\n\t\t\t\t//\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn this.getItemNotMeasuredIndexes(i, {\r\n\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\tfirstShownItemIndex: findLastShownItemIndex ? fromIndex : undefined,\r\n\t\t\t\t\t\tindexOfTheFirstItemInTheRow: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tnonMeasuredAreaHeight: (visibleAreaBottom + this.getPrerenderMargin()) - beforeItemsHeight\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcurrentRowHeight = Math.max(currentRowHeight, itemHeight)\r\n\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t\ti++\r\n\t\t\t}\r\n\r\n\t\t\tconst itemsHeightFromFirstRowToThisRow = beforeItemsHeight + currentRowHeight\r\n\r\n\t\t\tconst rowStepsIntoVisibleAreaTop = itemsHeightFromFirstRowToThisRow > visibleAreaTop - this.getPrerenderMargin()\r\n\t\t\tconst rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder = itemsHeightFromFirstRowToThisRow + verticalSpacingAfterCurrentRow >= visibleAreaBottom + this.getPrerenderMargin()\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsOutOfVisibleAreaTop) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex + columnsCount\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsIntoVisibleAreaBottom) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tlastShownItemIndex: currentRowFirstItemIndex + columnsCount - 1\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t}\r\n\t\t\t// }\r\n\r\n\t\t\tif (findFirstShownItemIndex) {\r\n\t\t\t\tif (rowStepsIntoVisibleAreaTop) {\r\n\t\t\t\t\t// If item is the first one visible in the viewport\r\n\t\t\t\t\t// then start showing items from this row.\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tbeforeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (findLastShownItemIndex) {\r\n\t\t\t\tif (rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tlastShownItemIndex: Math.min(\r\n\t\t\t\t\t\t\t// The index of the last item in the current row.\r\n\t\t\t\t\t\t\tcurrentRowFirstItemIndex + columnsCount - 1,\r\n\t\t\t\t\t\t\t// Guards against index overflow.\r\n\t\t\t\t\t\t\titemsCount - 1\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += currentRowHeight + verticalSpacingAfterCurrentRow\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \t// Set `i` to be the first item of the current row.\r\n\t\t\t// \ti -= columnsCount\r\n\t\t\t// \tconst prevoiusRowIsBeforeResize = i - 1 < this.getBeforeResizeItemsCount()\r\n\t\t\t// \tconst previousRowColumnsCount = prevoiusRowIsBeforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\t\t// \t// Set `i` to be the first item of the previous row.\r\n\t\t\t// \ti -= previousRowColumnsCount\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// if (backwards) {\r\n\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t// \t\twarn('The list is supposed to be visible but no visible item has been found (while traversing backwards)')\r\n\t\t// \t\treturn null\r\n\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t// \t\treturn {\r\n\t\t// \t\t\tfirstShownItemIndex: 0\r\n\t\t// \t\t}\r\n\t\t// \t}\r\n\t\t// }\r\n\r\n\t\tif (beforeResize) {\r\n\t\t\treturn {\r\n\t\t\t\tnotFound: true,\r\n\t\t\t\tbeforeItemsHeight\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// This case isn't supposed to happen but it could hypothetically happen\r\n\t\t// because the list height is measured from the user's screen and\r\n\t\t// not necessarily can be trusted.\r\n\t\tif (findFirstShownItemIndex) {\r\n\t\t\twarn('The list is supposed to be visible but no visible item has been found')\r\n\t\t\treturn null\r\n\t\t} else if (findLastShownItemIndex) {\r\n\t\t\treturn {\r\n\t\t\t\tlastShownItemIndex: itemsCount - 1\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetNonVisibleListShownItemIndexes() {\r\n\t\tconst layout = {\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 0\r\n\t\t}\r\n\t\tif (this.getItemHeight(0) === undefined) {\r\n\t\t\tlayout.firstNonMeasuredItemIndex = 0\r\n\t\t}\r\n\t\treturn layout\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"before\" items height.\r\n\t * @param {number} beforeItemsCount — Basically, first shown item index.\r\n\t * @return {number}\r\n\t */\r\n\tgetBeforeItemsHeight(\r\n\t\tbeforeItemsCount,\r\n\t\t{ beforeResize } = {}\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tlet beforeItemsHeight = 0\r\n\t\tlet i = 0\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\r\n\t\t\tif (beforeResizeItemsCount > 0) {\r\n\t\t\t\t// First add all \"before resize\" item heights.\r\n\t\t\t\tbeforeItemsHeight = this.getBeforeItemsHeight(\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be greater than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls down.\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be less than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls up.\r\n\t\t\t\t\tMath.min(beforeItemsCount, beforeResizeItemsCount),\r\n\t\t\t\t\t{ beforeResize: true }\r\n\t\t\t\t)\r\n\t\t\t\ti = beforeResizeItemsCount\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\twhile (i < beforeItemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\t// Not checking for `itemsCount` overflow here because `i = beforeItemsCount`\r\n\t\t\t// can only start at the start of a row, meaning that when calculating\r\n\t\t\t// \"before items height\" it's not supposed to add item heights from the\r\n\t\t\t// last row of items because in that case it would have to iterate from\r\n\t\t\t// `i === beforeItemsCount` and that condition is already checked above.\r\n\t\t\t// while (i < itemsCount) {\r\n\t\t\twhile (columnIndex < columnsCount) {\r\n\t\t\t\tlet itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\t// `itemHeight` can only be `undefined` when not `beforeResize`.\r\n\t\t\t\t\t// Use the current \"average item height\" as a substitute.\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += rowHeight\r\n\t\t\tbeforeItemsHeight += verticalSpacing\r\n\t\t}\r\n\r\n\t\treturn beforeItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"after\" items height.\r\n\t * @param {number} lastShownItemIndex — Last shown item index.\r\n\t * @param {number} itemsCount — Items count.\r\n\t * @return {number}\r\n\t */\r\n\tgetAfterItemsHeight(\r\n\t\tlastShownItemIndex,\r\n\t\titemsCount\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\t\tconst lastShownRowIndex = Math.floor(lastShownItemIndex / columnsCount)\r\n\r\n\t\tlet afterItemsHeight = 0\r\n\r\n\t\tlet i = lastShownItemIndex + 1\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tlet itemHeight = this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\t// Add all \"after\" items height.\r\n\t\t\tafterItemsHeight += this.getVerticalSpacing()\r\n\t\t\tafterItemsHeight += rowHeight\r\n\t\t}\r\n\r\n\t\treturn afterItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the top edge of the first item.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemTopOffset(i) {\r\n\t\tlet topOffsetInsideScrollableContainer = 0\r\n\r\n\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\tconst beforeResizeRowsCount = beforeResizeItemsCount === 0\r\n\t\t\t? 0\r\n\t\t\t: Math.ceil(beforeResizeItemsCount / this.getColumnsCountBeforeResize())\r\n\r\n\t\tconst maxBeforeResizeRowsCount = i < beforeResizeItemsCount\r\n\t\t\t? Math.floor(i / this.getColumnsCountBeforeResize())\r\n\t\t\t: beforeResizeRowsCount\r\n\r\n\t\tlet beforeResizeRowIndex = 0\r\n\t\twhile (beforeResizeRowIndex < maxBeforeResizeRowsCount) {\r\n\t\t\tconst rowHeight = this.getItemHeightBeforeResize(\r\n\t\t\t\tbeforeResizeRowIndex * this.getColumnsCountBeforeResize()\r\n\t\t\t)\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacingBeforeResize()\r\n\r\n\t\t\tbeforeResizeRowIndex++\r\n\t\t}\r\n\r\n\t\tconst itemRowIndex = Math.floor((i - beforeResizeItemsCount) / this.getColumnsCount())\r\n\r\n\t\tlet rowIndex = 0\r\n\t\twhile (rowIndex < itemRowIndex) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < this.getColumnsCount()) {\r\n\t\t\t\tconst itemHeight = this.getItemHeight(\r\n\t\t\t\t\tbeforeResizeItemsCount + rowIndex * this.getColumnsCount() + columnIndex\r\n\t\t\t\t)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacing()\r\n\r\n\t\t\trowIndex++\r\n\t\t}\r\n\r\n\t\treturn topOffsetInsideScrollableContainer\r\n\t}\r\n}\r\n\r\nexport const LAYOUT_REASON = {\r\n\tSCROLL: 'scroll',\r\n\tSTOPPED_SCROLLING: 'stopped scrolling',\r\n\tMANUAL: 'manual',\r\n\tMOUNTED: 'mounted',\r\n\tACTUAL_ITEM_HEIGHTS_HAVE_BEEN_MEASURED: 'actual item heights have been measured',\r\n\tVIEWPORT_WIDTH_CHANGED: 'viewport width changed',\r\n\tVIEWPORT_HEIGHT_CHANGED: 'viewport height changed',\r\n\tVIEWPORT_SIZE_UNCHANGED: 'viewport size unchanged',\r\n\tITEM_HEIGHT_CHANGED: 'item height changed',\r\n\tITEMS_CHANGED: 'items changed',\r\n\tTOP_OFFSET_CHANGED: 'list top offset changed'\r\n}"],"file":"Layout.js"}
1
+ {"version":3,"file":"Layout.js","names":["log","warn","Layout","bypass","estimatedItemHeight","measureItemsBatchSize","getPrerenderMargin","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCount","getColumnsCountBeforeResize","getItemHeight","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getMaxVisibleAreaHeight","getPreviouslyCalculatedLayout","itemsCount","columnsCount","firstShownItemIndex","lastShownItemIndex","getInitialLastShownItemIndex","beforeItemsHeight","afterItemsHeight","estimatedRowsCount","getEstimatedRowsCountForHeight","Math","min","height","getEstimatedItemHeight","verticalSpacing","ceil","prependedItemsCount","appendedItemsCount","shouldRestoreScrollPosition","onResetGridLayout","averageItemHeight","appendedRowsCount","addedHeightAfter","prependedRowsCount","addedHeightBefore","shownItemsCountBeforeItemsUpdate","afterItemsCount","i","nonMeasuredAreaHeight","indexOfTheFirstItemInTheRow","itemsCountToRenderForMeasurement","Infinity","undefined","firstNonMeasuredItemIndex","visibleAreaTop","visibleAreaBottom","indexes","_getShownItemIndex","fromIndex","findFirstShownItemIndex","getNonVisibleListShownItemIndexes","findLastShownItemIndex","parameters","beforeResize","Error","beforeResizeItemsCount","notFound","beforeResizeItemsHeight","floor","currentRowFirstItemIndex","hasMoreRows","verticalSpacingAfterCurrentRow","currentRowHeight","columnIndex","itemHeight","getItemNotMeasuredIndexes","max","itemsHeightFromFirstRowToThisRow","rowStepsIntoVisibleAreaTop","rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder","layout","beforeItemsCount","getBeforeItemsHeight","rowHeight","lastShownRowIndex","topOffsetInsideScrollableContainer","beforeResizeRowsCount","maxBeforeResizeRowsCount","beforeResizeRowIndex","itemRowIndex","rowIndex","LAYOUT_REASON","SCROLL","STOPPED_SCROLLING","MANUAL","STARTED","NON_MEASURED_ITEMS_HAVE_BEEN_MEASURED","VIEWPORT_WIDTH_CHANGED","VIEWPORT_HEIGHT_CHANGED","VIEWPORT_SIZE_UNCHANGED","ITEM_HEIGHT_CHANGED","ITEMS_CHANGED","TOP_OFFSET_CHANGED"],"sources":["../source/Layout.js"],"sourcesContent":["import log, { warn } from './utility/debug.js'\r\n\r\nexport default class Layout {\r\n\tconstructor({\r\n\t\tbypass,\r\n\t\testimatedItemHeight,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin,\r\n\t\tgetVerticalSpacing,\r\n\t\tgetVerticalSpacingBeforeResize,\r\n\t\tgetColumnsCount,\r\n\t\tgetColumnsCountBeforeResize,\r\n\t\tgetItemHeight,\r\n\t\tgetItemHeightBeforeResize,\r\n\t\tgetBeforeResizeItemsCount,\r\n\t\tgetAverageItemHeight,\r\n\t\tgetMaxVisibleAreaHeight,\r\n\t\tgetPreviouslyCalculatedLayout\r\n\t}) {\r\n\t\tthis.bypass = bypass\r\n\t\tthis.estimatedItemHeight = estimatedItemHeight\r\n\t\tthis.measureItemsBatchSize = measureItemsBatchSize\r\n\t\tthis.getPrerenderMargin = getPrerenderMargin\r\n\t\tthis.getVerticalSpacing = getVerticalSpacing\r\n\t\tthis.getVerticalSpacingBeforeResize = getVerticalSpacingBeforeResize\r\n\t\tthis.getColumnsCount = getColumnsCount\r\n\t\tthis.getColumnsCountBeforeResize = getColumnsCountBeforeResize\r\n\t\tthis.getItemHeight = getItemHeight\r\n\t\tthis.getItemHeightBeforeResize = getItemHeightBeforeResize\r\n\t\tthis.getBeforeResizeItemsCount = getBeforeResizeItemsCount\r\n\t\tthis.getAverageItemHeight = getAverageItemHeight\r\n\t\tthis.getMaxVisibleAreaHeight = getMaxVisibleAreaHeight\r\n\t\t//\r\n\t\t// The \"previously calculated layout\" feature is not currently used.\r\n\t\t//\r\n\t\t// The current layout snapshot could be stored as a \"previously calculated layout\" variable\r\n\t\t// so that it could theoretically be used when calculating new layout incrementally\r\n\t\t// rather than from scratch, which would be an optimization.\r\n\t\t//\r\n\t\tthis.getPreviouslyCalculatedLayout = getPreviouslyCalculatedLayout\r\n\t}\r\n\r\n\tgetInitialLayoutValues({\r\n\t\titemsCount,\r\n\t\tcolumnsCount\r\n\t}) {\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\t\t// If there're no items then `firstShownItemIndex` stays `undefined`.\r\n\t\tif (itemsCount > 0) {\r\n\t\t\tfirstShownItemIndex = 0\r\n\t\t\tlastShownItemIndex = this.getInitialLastShownItemIndex({\r\n\t\t\t\titemsCount,\r\n\t\t\t\tcolumnsCount,\r\n\t\t\t\tfirstShownItemIndex\r\n\t\t\t})\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 0,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\tgetInitialLastShownItemIndex({\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tfirstShownItemIndex\r\n\t}) {\r\n\t\tif (this.bypass) {\r\n\t\t\treturn itemsCount - 1\r\n\t\t}\r\n\t\t// On server side, at initialization time,\r\n\t\t// `scrollableContainer` is `undefined`,\r\n\t\t// so default to `1` estimated rows count.\r\n\t\tlet estimatedRowsCount = 1\r\n\t\tif (this.getMaxVisibleAreaHeight()) {\r\n\t\t\testimatedRowsCount = this.getEstimatedRowsCountForHeight(this.getMaxVisibleAreaHeight() + this.getPrerenderMargin())\r\n\t\t}\r\n\t\treturn Math.min(\r\n\t\t\tfirstShownItemIndex + (estimatedRowsCount * columnsCount - 1),\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\t}\r\n\r\n\tgetEstimatedRowsCountForHeight(height) {\r\n\t\tconst estimatedItemHeight = this.getEstimatedItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\t\tif (estimatedItemHeight) {\r\n\t\t\treturn Math.ceil((height + verticalSpacing) / (estimatedItemHeight + verticalSpacing))\r\n\t\t} else {\r\n\t\t\t// If no items have been rendered yet, and no `estimatedItemHeight` option\r\n\t\t\t// has been passed, then default to `1` estimated rows count in any `height`.\r\n\t\t\treturn 1\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns estimated list item height.\r\n\t * (depends on which items have been previously rendered and measured).\r\n\t * @return {number}\r\n\t */\r\n\tgetEstimatedItemHeight() {\r\n\t\treturn this.getAverageItemHeight() || this.estimatedItemHeight || 0\r\n\t}\r\n\r\n\tgetLayoutUpdateForItemsDiff({\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex,\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t}, {\r\n\t\tprependedItemsCount,\r\n\t\tappendedItemsCount\r\n\t}, {\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tshouldRestoreScrollPosition,\r\n\t\tonResetGridLayout\r\n\t}) {\r\n\t\t// const layoutUpdate = {}\r\n\r\n\t\t// If the layout stays the same, then simply increase\r\n\t\t// the top and bottom margins proportionally to the amount\r\n\t\t// of the items added.\r\n\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\r\n\t\tif (appendedItemsCount > 0) {\r\n\t\t\tconst appendedRowsCount = Math.ceil(appendedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightAfter = appendedRowsCount * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\tafterItemsHeight += addedHeightAfter\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tafterItemsHeight\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\tif (prependedItemsCount > 0) {\r\n\t\t\tconst prependedRowsCount = Math.ceil(prependedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightBefore = prependedRowsCount * (averageItemHeight + verticalSpacing)\r\n\r\n\t\t\tfirstShownItemIndex += prependedItemsCount\r\n\t\t\tlastShownItemIndex += prependedItemsCount\r\n\t\t\tbeforeItemsHeight += addedHeightBefore\r\n\r\n\t\t\t// If the currently shown items position on screen should be preserved\r\n\t\t\t// when prepending new items, then it means that:\r\n\t\t\t// * The current scroll position should be snapshotted.\r\n\t\t\t// * The current list height should be snapshotted.\r\n\t\t\t// * All prepended items should be shown so that their height could be\r\n\t\t\t// measured after they're rendered. Based on the prepended items' height,\r\n\t\t\t// the scroll position will be restored so that there's no \"jump of content\".\r\n\t\t\tif (shouldRestoreScrollPosition) {\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\t\t\t}\r\n\r\n\t\t\tif (prependedItemsCount % columnsCount > 0) {\r\n\t\t\t\t// Rows will be rebalanced as a result of prepending new items,\r\n\t\t\t\t// and row heights can change as a result, so re-layout items\r\n\t\t\t\t// after they've been measured (after the upcoming re-render).\r\n\t\t\t\t//\r\n\t\t\t\t// For example, consider a web page where item rows are `display: flex`.\r\n\t\t\t\t// Suppose there're 3 columns and it shows items from 4 to 6.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Apples are | Bananas | Cranberries |\r\n\t\t\t\t// | green | | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Dates | Elderberry | Figs are |\r\n\t\t\t\t// | | | tasty |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t//\r\n\t\t\t\t// Now, 1 item gets prepended. As a result, all existing rows will have\r\n\t\t\t\t// a different set of items, which means that the row heights will change.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Zucchini | Apples are | Bananas |\r\n\t\t\t\t// | | green | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Cranberries | Dates | Elderberry |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Figs |\r\n\t\t\t\t// | are tasty |\r\n\t\t\t\t// ---------------\r\n\t\t\t\t//\r\n\t\t\t\t// As it can be seen above, the second row's height has changed from 2 to 1.\r\n\t\t\t\t// Not only that, but `itemHeights` have changed as well, so if you thought\r\n\t\t\t\t// that the library could easily recalculate row heights using `Math.max()` — \r\n\t\t\t\t// turns out it's not always the case.\r\n\t\t\t\t//\r\n\t\t\t\t// There could be an explicit opt-in option for automatically recalculating\r\n\t\t\t\t// row heights, but I don't want to write code for such an extremely rare\r\n\t\t\t\t// use case. Instead, use the `getColumnsCount()` parameter function when\r\n\t\t\t\t// fetching previous items.\r\n\r\n\t\t\t\tonResetGridLayout()\r\n\r\n\t\t\t\twarn('~ Prepended items count', prependedItemsCount, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\t\twarn('Layout reset required')\r\n\r\n\t\t\t\tconst shownItemsCountBeforeItemsUpdate = lastShownItemIndex - firstShownItemIndex + 1\r\n\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\r\n\t\t\t\tif (!shouldRestoreScrollPosition) {\r\n\t\t\t\t\t// Limit shown items count if too many items have been prepended.\r\n\t\t\t\t\tif (prependedItemsCount > shownItemsCountBeforeItemsUpdate) {\r\n\t\t\t\t\t\tlastShownItemIndex = this.getInitialLastShownItemIndex({\r\n\t\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\t\tcolumnsCount,\r\n\t\t\t\t\t\t\tfirstShownItemIndex\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\t// Approximate `afterItemsHeight` calculation.\r\n\t\t\t\t\t\tconst afterItemsCount = itemsCount - (lastShownItemIndex + 1)\r\n\t\t\t\t\t\tafterItemsHeight = Math.ceil(afterItemsCount / columnsCount) * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\t\t\t\t// layoutUpdate = {\r\n\t\t\t\t\t\t// \t...layoutUpdate,\r\n\t\t\t\t\t\t// \tafterItemsHeight\r\n\t\t\t\t\t\t// }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tbeforeItemsHeight,\r\n\t\t\t// \tfirstShownItemIndex,\r\n\t\t\t// \tlastShownItemIndex\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// return layoutUpdate\r\n\r\n\t\t// Overwrite all four props in all scenarios.\r\n\t\t// The reason is that only this way subsequent `setItems()` calls\r\n\t\t// will be truly \"stateless\" when a chain of `setItems()` calls\r\n\t\t// could be replaced with just the last one in a scenario when\r\n\t\t// `updateState()` calls are \"asynchronous\" (delayed execution).\r\n\t\t//\r\n\t\t// So, for example, the user calls `setItems()` with one set of items.\r\n\t\t// A `updateState()` call has been dispatched but the `state` hasn't been updated yet.\r\n\t\t// Then the user calls `setItems()` with another set of items.\r\n\t\t// If this function only returned a minimal set of properties that actually change,\r\n\t\t// the other layout properties of the second `setItems()` call wouldn't overwrite the ones\r\n\t\t// scheduled for update during the first `setItems()` call, resulting in an inconsistent `state`.\r\n\t\t//\r\n\t\t// For example, the first `setItems()` call does a `updateState()` call where it updates\r\n\t\t// `afterItemsHeight`, and then the second `setItems()` call only updates `beforeItemsHeight`\r\n\t\t// and `firstShownItemIndex` and `lastShownItemIndex`. If the second `setItems()` call was to\r\n\t\t// overwrite any effects of the pending-but-not-yet-applied first `setItems()` call, it would\r\n\t\t// have to call `updateState()` with an `afterItemsHeight` property too, even though it hasn't change.\r\n\t\t// That would be just to revert the change to `afterItemsHeight` state property already scheduled\r\n\t\t// by the first `setItems()` call.\r\n\t\t//\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t// If an item that hasn't been shown (and measured) yet is encountered\r\n\t// then show such item and then retry after it has been measured.\r\n\tgetItemNotMeasuredIndexes(i, {\r\n\t\titemsCount,\r\n\t\tfirstShownItemIndex,\r\n\t\tnonMeasuredAreaHeight,\r\n\t\tindexOfTheFirstItemInTheRow\r\n\t}) {\r\n\t\tlog('Item index', i, 'height is required for calculations but hasn\\'t been measured yet. Mark the item as \"shown\", rerender the list, measure the item\\'s height and redo the layout.')\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\r\n\t\tconst itemsCountToRenderForMeasurement = Math.min(\r\n\t\t\tthis.getEstimatedRowsCountForHeight(nonMeasuredAreaHeight) * columnsCount,\r\n\t\t\tthis.measureItemsBatchSize || Infinity,\r\n\t\t)\r\n\r\n\t\tif (firstShownItemIndex === undefined) {\r\n\t\t\tfirstShownItemIndex = indexOfTheFirstItemInTheRow\r\n\t\t}\r\n\r\n\t\tconst lastShownItemIndex = Math.min(\r\n\t\t\tindexOfTheFirstItemInTheRow + itemsCountToRenderForMeasurement - 1,\r\n\t\t\t// Guard against index overflow.\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\r\n\t\treturn {\r\n\t\t\tfirstNonMeasuredItemIndex: i,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the indexes of the currently visible items.\r\n\t * @return {object} `{ firstShownItemIndex: number, lastShownItemIndex: number, firstNonMeasuredItemIndex: number? }`\r\n\t */\r\n\tgetShownItemIndexes({\r\n\t\titemsCount,\r\n\t\tvisibleAreaTop,\r\n\t\tvisibleAreaBottom\r\n\t}) {\r\n\t\tlet indexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: 0,\r\n\t\t\tvisibleAreaTop,\r\n\t\t\tvisibleAreaBottom,\r\n\t\t\tfindFirstShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { firstShownItemIndex, beforeItemsHeight } = indexes\r\n\r\n\t\tindexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: firstShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tvisibleAreaTop,\r\n\t\t\tvisibleAreaBottom,\r\n\t\t\tfindLastShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { lastShownItemIndex } = indexes\r\n\r\n\t\treturn {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t_getShownItemIndex(parameters) {\r\n\t\tconst {\r\n\t\t\tbeforeResize,\r\n\t\t\titemsCount,\r\n\t\t\tvisibleAreaTop,\r\n\t\t\tvisibleAreaBottom,\r\n\t\t\tfindFirstShownItemIndex,\r\n\t\t\tfindLastShownItemIndex,\r\n\t\t\t// backwards\r\n\t\t} = parameters\r\n\r\n\t\tlet {\r\n\t\t\tfromIndex,\r\n\t\t\tbeforeItemsHeight\r\n\t\t} = parameters\r\n\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\t\t//\r\n\t\t// If someone would attempt to use a \"previously calculated layout\" here\r\n\t\t// then `shownItemsHeight` would also have to be returned from this function:\r\n\t\t// the total height of all shown items including vertical spacing between them.\r\n\t\t//\r\n\t\t// If \"previously calculated layout\" would be used then it would first find\r\n\t\t// `firstShownItemIndex` and then find `lastShownItemIndex` as part of two\r\n\t\t// separate calls of this function, each with or without `backwards` flag,\r\n\t\t// depending on whether `visibleAreaTop` and `visibleAreBottom` have shifted up or down.\r\n\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\r\n\t\t// It's not always required to pass `beforeItemsHeight` parameter:\r\n\t\t// when `fromIndex` is `0`, it's also assumed to be `0`.\r\n\t\tif (fromIndex === 0) {\r\n\t\t\tbeforeItemsHeight = 0\r\n\t\t}\r\n\r\n\t\tif (beforeItemsHeight === undefined) {\r\n\t\t\tthrow new Error('[virtual-scroller] `beforeItemsHeight` not passed to `Layout.getShownItemIndexes()` when starting from index ' + fromIndex);\r\n\t\t}\r\n\r\n\t\t// const backwards = false\r\n\t\t// while (backwards ? i >= 0 : i < itemsCount) {}\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\t\tif (beforeResizeItemsCount > fromIndex) {\r\n\t\t\t\t// First search for the item in \"before resize\" items.\r\n\t\t\t\tconst {\r\n\t\t\t\t\tnotFound,\r\n\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight,\r\n\t\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\t\tlastShownItemIndex\r\n\t\t\t\t} = this._getShownItemIndex({\r\n\t\t\t\t\t...parameters,\r\n\t\t\t\t\tbeforeResize: true,\r\n\t\t\t\t\titemsCount: beforeResizeItemsCount\r\n\t\t\t\t})\r\n\r\n\t\t\t\t// If the item was not found in \"before resize\" items\r\n\t\t\t\t// then search in regular items skipping \"before resize\" ones.\r\n\t\t\t\tif (notFound) {\r\n\t\t\t\t\tbeforeItemsHeight = beforeResizeItemsHeight\r\n\t\t\t\t\tfromIndex += beforeResizeItemsCount\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// If the item was found in \"before resize\" items\r\n\t\t\t\t\t// then return the result.\r\n\t\t\t\t\t// Rebalance first / last shown item indexes based on\r\n\t\t\t\t\t// the current columns count, if required.\r\n\t\t\t\t\tconst columnsCount = this.getColumnsCount()\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: firstShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(firstShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tlastShownItemIndex: lastShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(lastShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\tlet i = fromIndex\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tconst hasMoreRows = itemsCount > currentRowFirstItemIndex + columnsCount\r\n\t\t\tconst verticalSpacingAfterCurrentRow = hasMoreRows ? verticalSpacing : 0\r\n\r\n\t\t\tlet currentRowHeight = 0\r\n\r\n\t\t\t// Calculate current row height.\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tconst itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\r\n\t\t\t\t// If this item hasn't been measured yet (or re-measured after a resize)\r\n\t\t\t\t// then mark it as the first non-measured one.\r\n\t\t\t\t//\r\n\t\t\t\t// Can't happen by definition when `beforeResize` parameter is `true`.\r\n\t\t\t\t//\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn this.getItemNotMeasuredIndexes(i, {\r\n\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\tfirstShownItemIndex: findLastShownItemIndex ? fromIndex : undefined,\r\n\t\t\t\t\t\tindexOfTheFirstItemInTheRow: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tnonMeasuredAreaHeight: (visibleAreaBottom + this.getPrerenderMargin()) - beforeItemsHeight\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcurrentRowHeight = Math.max(currentRowHeight, itemHeight)\r\n\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t\ti++\r\n\t\t\t}\r\n\r\n\t\t\tconst itemsHeightFromFirstRowToThisRow = beforeItemsHeight + currentRowHeight\r\n\r\n\t\t\tconst rowStepsIntoVisibleAreaTop = itemsHeightFromFirstRowToThisRow > visibleAreaTop - this.getPrerenderMargin()\r\n\t\t\tconst rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder = itemsHeightFromFirstRowToThisRow + verticalSpacingAfterCurrentRow >= visibleAreaBottom + this.getPrerenderMargin()\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsOutOfVisibleAreaTop) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex + columnsCount\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsIntoVisibleAreaBottom) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tlastShownItemIndex: currentRowFirstItemIndex + columnsCount - 1\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t}\r\n\t\t\t// }\r\n\r\n\t\t\tif (findFirstShownItemIndex) {\r\n\t\t\t\tif (rowStepsIntoVisibleAreaTop) {\r\n\t\t\t\t\t// If item is the first one visible in the viewport\r\n\t\t\t\t\t// then start showing items from this row.\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tbeforeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (findLastShownItemIndex) {\r\n\t\t\t\tif (rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tlastShownItemIndex: Math.min(\r\n\t\t\t\t\t\t\t// The index of the last item in the current row.\r\n\t\t\t\t\t\t\tcurrentRowFirstItemIndex + columnsCount - 1,\r\n\t\t\t\t\t\t\t// Guards against index overflow.\r\n\t\t\t\t\t\t\titemsCount - 1\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += currentRowHeight + verticalSpacingAfterCurrentRow\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \t// Set `i` to be the first item of the current row.\r\n\t\t\t// \ti -= columnsCount\r\n\t\t\t// \tconst prevoiusRowIsBeforeResize = i - 1 < this.getBeforeResizeItemsCount()\r\n\t\t\t// \tconst previousRowColumnsCount = prevoiusRowIsBeforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\t\t// \t// Set `i` to be the first item of the previous row.\r\n\t\t\t// \ti -= previousRowColumnsCount\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// if (backwards) {\r\n\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t// \t\twarn('The list is supposed to be visible but no visible item has been found (while traversing backwards)')\r\n\t\t// \t\treturn null\r\n\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t// \t\treturn {\r\n\t\t// \t\t\tfirstShownItemIndex: 0\r\n\t\t// \t\t}\r\n\t\t// \t}\r\n\t\t// }\r\n\r\n\t\tif (beforeResize) {\r\n\t\t\treturn {\r\n\t\t\t\tnotFound: true,\r\n\t\t\t\tbeforeItemsHeight\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// This case isn't supposed to happen but it could hypothetically happen\r\n\t\t// because the list height is measured from the user's screen and\r\n\t\t// not necessarily can be trusted.\r\n\t\tif (findFirstShownItemIndex) {\r\n\t\t\twarn('The list is supposed to be visible but no visible item has been found')\r\n\t\t\treturn null\r\n\t\t} else if (findLastShownItemIndex) {\r\n\t\t\treturn {\r\n\t\t\t\tlastShownItemIndex: itemsCount - 1\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetNonVisibleListShownItemIndexes() {\r\n\t\tconst layout = {\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 0\r\n\t\t}\r\n\t\tif (this.getItemHeight(0) === undefined) {\r\n\t\t\tlayout.firstNonMeasuredItemIndex = 0\r\n\t\t}\r\n\t\treturn layout\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"before\" items height.\r\n\t * @param {number} beforeItemsCount — Basically, first shown item index.\r\n\t * @return {number}\r\n\t */\r\n\tgetBeforeItemsHeight(\r\n\t\tbeforeItemsCount,\r\n\t\t{ beforeResize } = {}\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tlet beforeItemsHeight = 0\r\n\t\tlet i = 0\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\r\n\t\t\tif (beforeResizeItemsCount > 0) {\r\n\t\t\t\t// First add all \"before resize\" item heights.\r\n\t\t\t\tbeforeItemsHeight = this.getBeforeItemsHeight(\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be greater than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls down.\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be less than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls up.\r\n\t\t\t\t\tMath.min(beforeItemsCount, beforeResizeItemsCount),\r\n\t\t\t\t\t{ beforeResize: true }\r\n\t\t\t\t)\r\n\t\t\t\ti = beforeResizeItemsCount\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\twhile (i < beforeItemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\t// Not checking for `itemsCount` overflow here because `i = beforeItemsCount`\r\n\t\t\t// can only start at the start of a row, meaning that when calculating\r\n\t\t\t// \"before items height\" it's not supposed to add item heights from the\r\n\t\t\t// last row of items because in that case it would have to iterate from\r\n\t\t\t// `i === beforeItemsCount` and that condition is already checked above.\r\n\t\t\t// while (i < itemsCount) {\r\n\t\t\twhile (columnIndex < columnsCount) {\r\n\t\t\t\tlet itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\t// `itemHeight` can only be `undefined` when not `beforeResize`.\r\n\t\t\t\t\t// Use the current \"average item height\" as a substitute.\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += rowHeight\r\n\t\t\tbeforeItemsHeight += verticalSpacing\r\n\t\t}\r\n\r\n\t\treturn beforeItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"after\" items height.\r\n\t * @param {number} lastShownItemIndex — Last shown item index.\r\n\t * @param {number} itemsCount — Items count.\r\n\t * @return {number}\r\n\t */\r\n\tgetAfterItemsHeight(\r\n\t\tlastShownItemIndex,\r\n\t\titemsCount\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\t\tconst lastShownRowIndex = Math.floor(lastShownItemIndex / columnsCount)\r\n\r\n\t\tlet afterItemsHeight = 0\r\n\r\n\t\tlet i = lastShownItemIndex + 1\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tlet itemHeight = this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\t// Add all \"after\" items height.\r\n\t\t\tafterItemsHeight += this.getVerticalSpacing()\r\n\t\t\tafterItemsHeight += rowHeight\r\n\t\t}\r\n\r\n\t\treturn afterItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the top edge of the first item.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemTopOffset(i) {\r\n\t\tlet topOffsetInsideScrollableContainer = 0\r\n\r\n\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\tconst beforeResizeRowsCount = beforeResizeItemsCount === 0\r\n\t\t\t? 0\r\n\t\t\t: Math.ceil(beforeResizeItemsCount / this.getColumnsCountBeforeResize())\r\n\r\n\t\tconst maxBeforeResizeRowsCount = i < beforeResizeItemsCount\r\n\t\t\t? Math.floor(i / this.getColumnsCountBeforeResize())\r\n\t\t\t: beforeResizeRowsCount\r\n\r\n\t\tlet beforeResizeRowIndex = 0\r\n\t\twhile (beforeResizeRowIndex < maxBeforeResizeRowsCount) {\r\n\t\t\tconst rowHeight = this.getItemHeightBeforeResize(\r\n\t\t\t\tbeforeResizeRowIndex * this.getColumnsCountBeforeResize()\r\n\t\t\t)\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacingBeforeResize()\r\n\r\n\t\t\tbeforeResizeRowIndex++\r\n\t\t}\r\n\r\n\t\tconst itemRowIndex = Math.floor((i - beforeResizeItemsCount) / this.getColumnsCount())\r\n\r\n\t\tlet rowIndex = 0\r\n\t\twhile (rowIndex < itemRowIndex) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < this.getColumnsCount()) {\r\n\t\t\t\tconst itemHeight = this.getItemHeight(\r\n\t\t\t\t\tbeforeResizeItemsCount + rowIndex * this.getColumnsCount() + columnIndex\r\n\t\t\t\t)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacing()\r\n\r\n\t\t\trowIndex++\r\n\t\t}\r\n\r\n\t\treturn topOffsetInsideScrollableContainer\r\n\t}\r\n}\r\n\r\nexport const LAYOUT_REASON = {\r\n\tSCROLL: 'scroll',\r\n\tSTOPPED_SCROLLING: 'stopped scrolling',\r\n\tMANUAL: 'manual',\r\n\tSTARTED: 'started',\r\n\tNON_MEASURED_ITEMS_HAVE_BEEN_MEASURED: 'non-measured item heights have been measured',\r\n\tVIEWPORT_WIDTH_CHANGED: 'viewport width changed',\r\n\tVIEWPORT_HEIGHT_CHANGED: 'viewport height changed',\r\n\tVIEWPORT_SIZE_UNCHANGED: 'viewport size unchanged',\r\n\tITEM_HEIGHT_CHANGED: 'item height changed',\r\n\tITEMS_CHANGED: 'items changed',\r\n\tTOP_OFFSET_CHANGED: 'list top offset changed'\r\n}"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import Layout from './Layout';
2
- import Engine from '../test/Engine';
1
+ import Layout from './Layout.js';
2
+ import Engine from './test/Engine.js';
3
3
  describe('Layout', function () {
4
4
  it('should work', function () {
5
5
  var SCREEN_HEIGHT = 400;
@@ -162,6 +162,7 @@ describe('Layout', function () {
162
162
  return scrollableContainer.height;
163
163
  }
164
164
  });
165
+ var shouldResetGridLayout;
165
166
  layout.getLayoutUpdateForItemsDiff({
166
167
  firstShownItemIndex: 3,
167
168
  lastShownItemIndex: 5,
@@ -173,13 +174,17 @@ describe('Layout', function () {
173
174
  }, {
174
175
  itemsCount: 5 + 5 + items.length,
175
176
  columnsCount: 4,
176
- shouldRestoreScrollPosition: true
177
+ shouldRestoreScrollPosition: true,
178
+ onResetGridLayout: function onResetGridLayout() {
179
+ return shouldResetGridLayout = true;
180
+ }
177
181
  }).should.deep.equal({
178
182
  firstShownItemIndex: 0,
179
183
  lastShownItemIndex: 5 + 5,
180
184
  beforeItemsHeight: 0,
181
185
  afterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)
182
186
  });
187
+ shouldResetGridLayout.should.equal(true);
183
188
  });
184
189
  });
185
190
  //# sourceMappingURL=Layout.test.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/Layout.test.js"],"names":["Layout","Engine","describe","it","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","getShownItemIndexes","itemsCount","length","visibleAreaTop","visibleAreaBottom","should","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldRestoreScrollPosition"],"mappings":"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","sourcesContent":["import Layout from './Layout'\r\n\r\nimport Engine from '../test/Engine'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: 0,\r\n\t\t\tvisibleAreaBottom: SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\tvisibleAreaBottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\tvisibleAreaBottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\tvisibleAreaBottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\tvisibleAreaBottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n})"],"file":"Layout.test.js"}
1
+ {"version":3,"file":"Layout.test.js","names":["Layout","Engine","describe","it","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","getShownItemIndexes","itemsCount","length","visibleAreaTop","visibleAreaBottom","should","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldResetGridLayout","shouldRestoreScrollPosition","onResetGridLayout"],"sources":["../source/Layout.test.js"],"sourcesContent":["import Layout from './Layout.js'\r\n\r\nimport Engine from './test/Engine.js'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: 0,\r\n\t\t\tvisibleAreaBottom: SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\tvisibleAreaBottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\tvisibleAreaBottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\tvisibleAreaBottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaTop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\tvisibleAreaBottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlet shouldResetGridLayout\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\r\n\t\tshouldResetGridLayout.should.equal(true)\r\n\t})\r\n})"],"mappings":"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"}
@@ -2,29 +2,33 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
2
2
 
3
3
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
4
4
 
5
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
5
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
6
6
 
7
- var ListHeightChangeWatcher = /*#__PURE__*/function () {
8
- function ListHeightChangeWatcher(_ref) {
7
+ var ListHeightMeasurement = /*#__PURE__*/function () {
8
+ function ListHeightMeasurement(_ref) {
9
9
  var itemsContainer = _ref.itemsContainer,
10
10
  getListTopOffset = _ref.getListTopOffset;
11
11
 
12
- _classCallCheck(this, ListHeightChangeWatcher);
12
+ _classCallCheck(this, ListHeightMeasurement);
13
13
 
14
14
  this.itemsContainer = itemsContainer;
15
15
  this.getListTopOffset = getListTopOffset;
16
16
  }
17
17
  /**
18
- * `<ReactVirtualScroller/>` calls this method.
18
+ * Snapshots the list height while `previousItems` are still rendered,
19
+ * before rendering `newItems`. The list height will be re-measured
20
+ * after the new items have been rendered, yielding the list height difference
21
+ * which is gonna be the amount to scroll vertically in order to restore
22
+ * the previous scroll position. Is only used when prepending items.
19
23
  * @param {any[]} previousItems
20
24
  * @param {any[]} newItems
21
25
  * @param {number} prependedItemsCount
22
26
  */
23
27
 
24
28
 
25
- _createClass(ListHeightChangeWatcher, [{
26
- key: "snapshot",
27
- value: function snapshot(_ref2) {
29
+ _createClass(ListHeightMeasurement, [{
30
+ key: "snapshotListHeightBeforeAddingNewItems",
31
+ value: function snapshotListHeightBeforeAddingNewItems(_ref2) {
28
32
  var previousItems = _ref2.previousItems,
29
33
  newItems = _ref2.newItems,
30
34
  prependedItemsCount = _ref2.prependedItemsCount;
@@ -50,23 +54,17 @@ var ListHeightChangeWatcher = /*#__PURE__*/function () {
50
54
  // i--
51
55
  // }
52
56
  // }
53
- // If the scroll position has already been captured for restoration,
54
- // then don't capture it the second time.
55
- // Capturing scroll position could happen when using `<ReactVirtualScroller/>`
56
- // because it calls `ListHeightChangeWatcher.snapshot()` inside `ReactVirtualScroller.render()`
57
- // which is followed by `<VirtualScroller/>`'s `.componentDidUpdate()`
58
- // that also calls `ListHeightChangeWatcher.snapshot()` with the same arguments,
59
- // so that second call to `ListHeightChangeWatcher.snapshot()` is ignored.
60
- // Calling `ListHeightChangeWatcher.snapshot()` inside `ReactVirtualScroller.render()`
61
- // is done to prevent scroll Y position from jumping
62
- // when showing the first page of the "Previous items".
63
- // See the long section of comments in `ReactVirtualScroller.render()`
64
- // method for more info on why is `ListHeightChangeWatcher.snapshot()` called there.
65
-
57
+ // This part is longer relevant: <ReactVirtualScroller/> no longer calls
58
+ // this function two times consequtively.
59
+ //
60
+ // // If the scroll position has already been captured for restoration,
61
+ // // then don't capture it the second time.
62
+ // if (this._snapshot &&
63
+ // this._snapshot.previousItems === previousItems &&
64
+ // this._snapshot.newItems === newItems) {
65
+ // return
66
+ // }
66
67
 
67
- if (this._snapshot && this._snapshot.previousItems === previousItems && this._snapshot.newItems === newItems) {
68
- return;
69
- }
70
68
 
71
69
  this._snapshot = {
72
70
  previousItems: previousItems,
@@ -112,8 +110,8 @@ var ListHeightChangeWatcher = /*#__PURE__*/function () {
112
110
  }
113
111
  }]);
114
112
 
115
- return ListHeightChangeWatcher;
113
+ return ListHeightMeasurement;
116
114
  }();
117
115
 
118
- export { ListHeightChangeWatcher as default };
119
- //# sourceMappingURL=ListHeightChangeWatcher.js.map
116
+ export { ListHeightMeasurement as default };
117
+ //# sourceMappingURL=ListHeightMeasurement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListHeightMeasurement.js","names":["ListHeightMeasurement","itemsContainer","getListTopOffset","previousItems","newItems","prependedItemsCount","length","_snapshot","itemIndex","itemTopOffset","getNthRenderedItemTopOffset","listTopOffset","undefined","itemTopOffsetNew","listTopOffsetNew"],"sources":["../source/ListHeightMeasurement.js"],"sourcesContent":["export default class ListHeightMeasurement {\r\n\tconstructor({\r\n\t\titemsContainer,\r\n\t\tgetListTopOffset\r\n\t}) {\r\n\t\tthis.itemsContainer = itemsContainer\r\n\t\tthis.getListTopOffset = getListTopOffset\r\n\t}\r\n\r\n\t/**\r\n\t * Snapshots the list height while `previousItems` are still rendered,\r\n\t * before rendering `newItems`. The list height will be re-measured\r\n\t * after the new items have been rendered, yielding the list height difference\r\n\t * which is gonna be the amount to scroll vertically in order to restore\r\n\t * the previous scroll position. Is only used when prepending items.\r\n\t * @param {any[]} previousItems\r\n\t * @param {any[]} newItems\r\n\t * @param {number} prependedItemsCount\r\n\t */\r\n\tsnapshotListHeightBeforeAddingNewItems({\r\n\t\tpreviousItems,\r\n\t\tnewItems,\r\n\t\tprependedItemsCount\r\n\t}) {\r\n\t\t// If there were no items in the list\r\n\t\t// then there's no point in restoring scroll position.\r\n\t\tif (previousItems.length === 0) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// If no items were prepended then no need to restore scroll position.\r\n\t\tif (prependedItemsCount === 0) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// The first item is supposed to be shown when the user clicks\r\n\t\t// \"Show previous items\" button. If it isn't shown though,\r\n\t\t// could still calculate the first item's top position using\r\n\t\t// the values from `itemHeights` and `verticalSpacing`.\r\n\t\t// But that would be a weird non-realistic scenario.\r\n\t\t// if (firstShownItemIndex > 0) {\r\n\t\t// \tlet i = firstShownItemIndex - 1\r\n\t\t// \twhile (i >= 0) {\r\n\t\t// \t\tfirstItemTopOffset += itemHeights[i] + verticalSpacing\r\n\t\t// \t\ti--\r\n\t\t// \t}\r\n\t\t// }\r\n\r\n\t\t// This part is longer relevant: <ReactVirtualScroller/> no longer calls\r\n\t\t// this function two times consequtively.\r\n\t\t//\r\n\t\t// // If the scroll position has already been captured for restoration,\r\n\t\t// // then don't capture it the second time.\r\n\t\t// if (this._snapshot &&\r\n\t\t// \tthis._snapshot.previousItems === previousItems &&\r\n\t\t// \tthis._snapshot.newItems === newItems) {\r\n\t\t// \treturn\r\n\t\t// }\r\n\r\n\t\tthis._snapshot = {\r\n\t\t\tpreviousItems,\r\n\t\t\tnewItems,\r\n\t\t\titemIndex: prependedItemsCount,\r\n\t\t\titemTopOffset: this.itemsContainer.getNthRenderedItemTopOffset(0),\r\n\t\t\t// Snapshot list top offset inside the scrollable container too\r\n\t\t\t// because it's common to hide the \"Show previous items\" button\r\n\t\t\t// when the user has browsed to the top of the list, which causes\r\n\t\t\t// the list's top position to shift upwards due to the button\r\n\t\t\t// no longer being rendered. Tracking list top offset doesn't\r\n\t\t\t// fit here that well, but it makes sense in real-world applications.\r\n\t\t\tlistTopOffset: this.getListTopOffset()\r\n\t\t}\r\n\t}\r\n\r\n\tgetAnchorItemIndex() {\r\n\t\treturn this._snapshot.itemIndex\r\n\t}\r\n\r\n\thasSnapshot() {\r\n\t\treturn this._snapshot !== undefined\r\n\t}\r\n\r\n\tgetListBottomOffsetChange() {\r\n\t\tconst { itemIndex, itemTopOffset, listTopOffset } = this._snapshot\r\n\t\t// `firstShownItemIndex` is supposed to be `0` at this point,\r\n\t\t// so `renderedElementIndex` would be the same as the `itemIndex`.\r\n\t\tconst itemTopOffsetNew = this.itemsContainer.getNthRenderedItemTopOffset(itemIndex)\r\n\t\tconst listTopOffsetNew = this.getListTopOffset()\r\n\t\treturn (itemTopOffsetNew - itemTopOffset) + (listTopOffsetNew - listTopOffset)\r\n\t}\r\n\r\n\treset() {\r\n\t\tthis._snapshot = undefined\r\n\t}\r\n}"],"mappings":";;;;;;IAAqBA,qB;EACpB,qCAGG;IAAA,IAFFC,cAEE,QAFFA,cAEE;IAAA,IADFC,gBACE,QADFA,gBACE;;IAAA;;IACF,KAAKD,cAAL,GAAsBA,cAAtB;IACA,KAAKC,gBAAL,GAAwBA,gBAAxB;EACA;EAED;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;WACC,uDAIG;MAAA,IAHFC,aAGE,SAHFA,aAGE;MAAA,IAFFC,QAEE,SAFFA,QAEE;MAAA,IADFC,mBACE,SADFA,mBACE;;MACF;MACA;MACA,IAAIF,aAAa,CAACG,MAAd,KAAyB,CAA7B,EAAgC;QAC/B;MACA,CALC,CAOF;;;MACA,IAAID,mBAAmB,KAAK,CAA5B,EAA+B;QAC9B;MACA,CAVC,CAYF;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MAEA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;;MAEA,KAAKE,SAAL,GAAiB;QAChBJ,aAAa,EAAbA,aADgB;QAEhBC,QAAQ,EAARA,QAFgB;QAGhBI,SAAS,EAAEH,mBAHK;QAIhBI,aAAa,EAAE,KAAKR,cAAL,CAAoBS,2BAApB,CAAgD,CAAhD,CAJC;QAKhB;QACA;QACA;QACA;QACA;QACA;QACAC,aAAa,EAAE,KAAKT,gBAAL;MAXC,CAAjB;IAaA;;;WAED,8BAAqB;MACpB,OAAO,KAAKK,SAAL,CAAeC,SAAtB;IACA;;;WAED,uBAAc;MACb,OAAO,KAAKD,SAAL,KAAmBK,SAA1B;IACA;;;WAED,qCAA4B;MAC3B,sBAAoD,KAAKL,SAAzD;MAAA,IAAQC,SAAR,mBAAQA,SAAR;MAAA,IAAmBC,aAAnB,mBAAmBA,aAAnB;MAAA,IAAkCE,aAAlC,mBAAkCA,aAAlC,CAD2B,CAE3B;MACA;;MACA,IAAME,gBAAgB,GAAG,KAAKZ,cAAL,CAAoBS,2BAApB,CAAgDF,SAAhD,CAAzB;MACA,IAAMM,gBAAgB,GAAG,KAAKZ,gBAAL,EAAzB;MACA,OAAQW,gBAAgB,GAAGJ,aAApB,IAAsCK,gBAAgB,GAAGH,aAAzD,CAAP;IACA;;;WAED,iBAAQ;MACP,KAAKJ,SAAL,GAAiBK,SAAjB;IACA;;;;;;SA7FmBZ,qB"}