virtual-scroller 1.9.1 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +71 -17
- package/bundle/virtual-scroller-dom.js +1 -1
- package/bundle/virtual-scroller-dom.js.map +1 -1
- package/bundle/virtual-scroller-react.js +1 -1
- package/bundle/virtual-scroller-react.js.map +1 -1
- package/bundle/virtual-scroller.js +1 -1
- package/bundle/virtual-scroller.js.map +1 -1
- package/commonjs/DOM/ScrollableContainer.js +13 -1
- package/commonjs/DOM/ScrollableContainer.js.map +1 -1
- package/commonjs/Layout.js +65 -10
- package/commonjs/Layout.js.map +1 -1
- package/commonjs/ScrollableContainerNotReadyError.js +51 -0
- package/commonjs/ScrollableContainerNotReadyError.js.map +1 -0
- package/commonjs/VirtualScroller.constructor.js +22 -7
- package/commonjs/VirtualScroller.constructor.js.map +1 -1
- package/commonjs/VirtualScroller.js +1 -1
- package/commonjs/VirtualScroller.js.map +1 -1
- package/commonjs/VirtualScroller.state.js +20 -6
- package/commonjs/VirtualScroller.state.js.map +1 -1
- package/commonjs/react/VirtualScroller.js +21 -3
- package/commonjs/react/VirtualScroller.js.map +1 -1
- package/commonjs/react/useHandleItemsChange.js.map +1 -1
- package/commonjs/react/useVirtualScroller.js +5 -0
- package/commonjs/react/useVirtualScroller.js.map +1 -1
- package/dom/index.d.ts +1 -1
- package/index.d.ts +5 -4
- package/modules/DOM/ScrollableContainer.js +11 -1
- package/modules/DOM/ScrollableContainer.js.map +1 -1
- package/modules/Layout.js +62 -10
- package/modules/Layout.js.map +1 -1
- package/modules/ScrollableContainerNotReadyError.js +44 -0
- package/modules/ScrollableContainerNotReadyError.js.map +1 -0
- package/modules/VirtualScroller.constructor.js +22 -7
- package/modules/VirtualScroller.constructor.js.map +1 -1
- package/modules/VirtualScroller.js +1 -1
- package/modules/VirtualScroller.js.map +1 -1
- package/modules/VirtualScroller.state.js +20 -6
- package/modules/VirtualScroller.state.js.map +1 -1
- package/modules/react/VirtualScroller.js +21 -3
- package/modules/react/VirtualScroller.js.map +1 -1
- package/modules/react/useHandleItemsChange.js +1 -1
- package/modules/react/useHandleItemsChange.js.map +1 -1
- package/modules/react/useVirtualScroller.js +5 -0
- package/modules/react/useVirtualScroller.js.map +1 -1
- package/package.json +1 -1
- package/react/index.d.ts +53 -15
- package/source/DOM/ScrollableContainer.js +8 -0
- package/source/Layout.js +57 -9
- package/source/ScrollableContainerNotReadyError.js +5 -0
- package/source/VirtualScroller.constructor.js +17 -6
- package/source/VirtualScroller.js +1 -1
- package/source/VirtualScroller.state.js +19 -4
- package/source/react/VirtualScroller.js +20 -1
- package/source/react/useHandleItemsChange.js +1 -1
- package/source/react/useVirtualScroller.js +6 -0
- package/website/index-bypass.html +2 -2
- package/website/index-grid.html +2 -2
- package/website/index-scrollableContainer.html +2 -2
- package/website/index.html +2 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
+
|
|
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
|
+
|
|
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
|
+
|
|
7
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
8
|
+
|
|
9
|
+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
10
|
+
|
|
11
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
12
|
+
|
|
13
|
+
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
|
14
|
+
|
|
15
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
16
|
+
|
|
17
|
+
function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
|
|
18
|
+
|
|
19
|
+
function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
|
|
20
|
+
|
|
21
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
22
|
+
|
|
23
|
+
function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
|
|
24
|
+
|
|
25
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
26
|
+
|
|
27
|
+
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
28
|
+
|
|
29
|
+
var ScrollableContainerNotReadyError = /*#__PURE__*/function (_Error) {
|
|
30
|
+
_inherits(ScrollableContainerNotReadyError, _Error);
|
|
31
|
+
|
|
32
|
+
var _super = _createSuper(ScrollableContainerNotReadyError);
|
|
33
|
+
|
|
34
|
+
function ScrollableContainerNotReadyError() {
|
|
35
|
+
_classCallCheck(this, ScrollableContainerNotReadyError);
|
|
36
|
+
|
|
37
|
+
return _super.call(this, '[virtual-scroller] Scrollable container not found');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return _createClass(ScrollableContainerNotReadyError);
|
|
41
|
+
}( /*#__PURE__*/_wrapNativeSuper(Error));
|
|
42
|
+
|
|
43
|
+
export { ScrollableContainerNotReadyError as default };
|
|
44
|
+
//# sourceMappingURL=ScrollableContainerNotReadyError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableContainerNotReadyError.js","names":["ScrollableContainerNotReadyError","Error"],"sources":["../source/ScrollableContainerNotReadyError.js"],"sourcesContent":["export default class ScrollableContainerNotReadyError extends Error {\r\n\tconstructor() {\r\n\t\tsuper('[virtual-scroller] Scrollable container not found');\r\n\t}\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAqBA,gC;;;;;EACpB,4CAAc;IAAA;;IAAA,yBACP,mDADO;EAEb;;;iCAH4DC,K;;SAAzCD,gC"}
|
|
@@ -37,19 +37,28 @@ export default function VirtualScrollerConstructor(getItemsContainerElement, ite
|
|
|
37
37
|
getItemId = options.getItemId,
|
|
38
38
|
tbody = options.tbody,
|
|
39
39
|
estimatedItemHeight = options.estimatedItemHeight,
|
|
40
|
+
getEstimatedVisibleItemRowsCount = options.getEstimatedVisibleItemRowsCount,
|
|
40
41
|
onItemInitialRender = options.onItemInitialRender,
|
|
41
42
|
onItemFirstRender = options.onItemFirstRender,
|
|
42
43
|
_useTimeoutInRenderLoop = options._useTimeoutInRenderLoop,
|
|
43
44
|
_waitForScrollingToStop = options._waitForScrollingToStop,
|
|
44
45
|
engine = options.engine;
|
|
45
46
|
var bypass = options.bypass,
|
|
47
|
+
getEstimatedItemHeight = options.getEstimatedItemHeight,
|
|
46
48
|
getScrollableContainer = options.getScrollableContainer;
|
|
47
49
|
log('~ Initialize ~'); // Could support non-DOM rendering engines.
|
|
48
50
|
// For example, React Native, `<canvas/>`, etc.
|
|
49
51
|
|
|
50
|
-
this.engine = engine || DOMEngine;
|
|
52
|
+
this.engine = engine || DOMEngine;
|
|
53
|
+
|
|
54
|
+
if (!getEstimatedItemHeight && typeof estimatedItemHeight === 'number') {
|
|
55
|
+
getEstimatedItemHeight = function getEstimatedItemHeight() {
|
|
56
|
+
return estimatedItemHeight;
|
|
57
|
+
};
|
|
58
|
+
} // `scrollableContainer` option is deprecated.
|
|
51
59
|
// Use `getScrollableContainer()` option instead.
|
|
52
60
|
|
|
61
|
+
|
|
53
62
|
if (!getScrollableContainer && scrollableContainer) {
|
|
54
63
|
getScrollableContainer = function getScrollableContainer() {
|
|
55
64
|
return scrollableContainer;
|
|
@@ -164,8 +173,8 @@ export default function VirtualScrollerConstructor(getItemsContainerElement, ite
|
|
|
164
173
|
|
|
165
174
|
log('Items count', items.length);
|
|
166
175
|
|
|
167
|
-
if (
|
|
168
|
-
log('Estimated item height',
|
|
176
|
+
if (getEstimatedItemHeight) {
|
|
177
|
+
log('Estimated item height', getEstimatedItemHeight());
|
|
169
178
|
}
|
|
170
179
|
|
|
171
180
|
createStateHelpers.call(this, {
|
|
@@ -184,7 +193,8 @@ export default function VirtualScrollerConstructor(getItemsContainerElement, ite
|
|
|
184
193
|
createItemsHelpers.call(this);
|
|
185
194
|
createHelpers.call(this, {
|
|
186
195
|
getScrollableContainer: getScrollableContainer,
|
|
187
|
-
|
|
196
|
+
getEstimatedItemHeight: getEstimatedItemHeight,
|
|
197
|
+
getEstimatedVisibleItemRowsCount: getEstimatedVisibleItemRowsCount,
|
|
188
198
|
measureItemsBatchSize: measureItemsBatchSize,
|
|
189
199
|
initialScrollPosition: initialScrollPosition,
|
|
190
200
|
onScrollPositionChange: onScrollPositionChange,
|
|
@@ -203,7 +213,8 @@ function createHelpers(_ref) {
|
|
|
203
213
|
var _this2 = this;
|
|
204
214
|
|
|
205
215
|
var getScrollableContainer = _ref.getScrollableContainer,
|
|
206
|
-
|
|
216
|
+
getEstimatedItemHeight = _ref.getEstimatedItemHeight,
|
|
217
|
+
getEstimatedVisibleItemRowsCount = _ref.getEstimatedVisibleItemRowsCount,
|
|
207
218
|
measureItemsBatchSize = _ref.measureItemsBatchSize,
|
|
208
219
|
initialScrollPosition = _ref.initialScrollPosition,
|
|
209
220
|
onScrollPositionChange = _ref.onScrollPositionChange,
|
|
@@ -232,7 +243,8 @@ function createHelpers(_ref) {
|
|
|
232
243
|
});
|
|
233
244
|
this.layout = new Layout({
|
|
234
245
|
bypass: this.bypass,
|
|
235
|
-
|
|
246
|
+
getInitialEstimatedItemHeight: getEstimatedItemHeight,
|
|
247
|
+
getInitialEstimatedVisibleItemRowsCount: getEstimatedVisibleItemRowsCount,
|
|
236
248
|
measureItemsBatchSize: measureItemsBatchSize,
|
|
237
249
|
getPrerenderMargin: function getPrerenderMargin() {
|
|
238
250
|
return _this2.getPrerenderMargin();
|
|
@@ -262,7 +274,10 @@ function createHelpers(_ref) {
|
|
|
262
274
|
return _this2.itemHeights.getAverage();
|
|
263
275
|
},
|
|
264
276
|
getMaxVisibleAreaHeight: function getMaxVisibleAreaHeight() {
|
|
265
|
-
return _this2.scrollableContainer
|
|
277
|
+
return _this2.scrollableContainer.getHeight();
|
|
278
|
+
},
|
|
279
|
+
isScrollableContainerReady: function isScrollableContainerReady() {
|
|
280
|
+
return _this2.scrollableContainer.isReady();
|
|
266
281
|
},
|
|
267
282
|
//
|
|
268
283
|
// The "previously calculated layout" feature is not currently used.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.constructor.js","names":["supportsTbody","BROWSER_NOT_SUPPORTED_ERROR","DOMEngine","Layout","LAYOUT_REASON","Resize","BeforeResize","Scroll","ListHeightMeasurement","ItemHeights","log","warn","isDebug","reportError","createStateHelpers","createVerticalSpacingHelpers","createColumnsHelpers","createLayoutHelpers","createOnRenderHelpers","createResizeHelpers","createItemsHelpers","VirtualScrollerConstructor","getItemsContainerElement","items","options","render","state","onStateChange","initialScrollPosition","onScrollPositionChange","scrollableContainer","measureItemsBatchSize","getColumnsCount","getItemId","tbody","estimatedItemHeight","onItemInitialRender","onItemFirstRender","_useTimeoutInRenderLoop","_waitForScrollingToStop","engine","bypass","getScrollableContainer","getState","setState","Error","isItemEqual","a","b","item","i","indexOf","length","call","createHelpers","waitForScrollingToStop","itemHeights","readItemHeightsFromState","beforeResize","initializeFromState","itemsContainer","createItemsContainer","clear","createScrollableContainer","container","getItemHeight","setItemHeight","height","layout","getPrerenderMargin","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCountBeforeResize","columnsCount","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getAverage","getMaxVisibleAreaHeight","getHeight","getPreviouslyCalculatedLayout","previouslyCalculatedLayout","resize","getWidth","listenForResize","listener","onResize","onResizeStart","_isResizing","onResizeStop","undefined","onNoChange","onUpdateShownItemIndexes","reason","VIEWPORT_SIZE_UNCHANGED","onHeightChange","VIEWPORT_HEIGHT_CHANGED","onWidthChange","prevWidth","newWidth","scroll","onScroll","delayed","STOPPED_SCROLLING","SCROLL","isImmediateLayoutScheduled","Boolean","layoutTimer","hasNonRenderedItemsAtTheTop","firstShownItemIndex","hasNonRenderedItemsAtTheBottom","lastShownItemIndex","getItemsCount","getLatestLayoutVisibleArea","latestLayoutVisibleArea","getListTopOffset","getListTopOffsetInsideScrollableContainer","listHeightMeasurement","watchListTopOffset","listTopOffsetWatcher","onListTopOffsetChange","TOP_OFFSET_CHANGED"],"sources":["../source/VirtualScroller.constructor.js"],"sourcesContent":["import {\r\n\tsupportsTbody,\r\n\tBROWSER_NOT_SUPPORTED_ERROR\r\n} from './DOM/tbody.js'\r\n\r\nimport DOMEngine from './DOM/Engine.js'\r\n\r\nimport Layout, { LAYOUT_REASON } from './Layout.js'\r\nimport Resize from './Resize.js'\r\nimport BeforeResize from './BeforeResize.js'\r\nimport Scroll from './Scroll.js'\r\nimport ListHeightMeasurement from './ListHeightMeasurement.js'\r\nimport ItemHeights from './ItemHeights.js'\r\n\r\nimport log, { warn, isDebug, reportError } from './utility/debug.js'\r\n\r\nimport createStateHelpers from './VirtualScroller.state.js'\r\nimport createVerticalSpacingHelpers from './VirtualScroller.verticalSpacing.js'\r\nimport createColumnsHelpers from './VirtualScroller.columns.js'\r\nimport createLayoutHelpers from './VirtualScroller.layout.js'\r\nimport createOnRenderHelpers from './VirtualScroller.onRender.js'\r\nimport createResizeHelpers from './VirtualScroller.resize.js'\r\nimport createItemsHelpers from './VirtualScroller.items.js'\r\n\r\n/**\r\n * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n * @param {any[]} items — The list of items.\r\n * @param {Object} [options] — See README.md.\r\n * @return {VirtualScroller}\r\n */\r\nexport default function VirtualScrollerConstructor(\r\n\tgetItemsContainerElement,\r\n\titems,\r\n\toptions = {}\r\n) {\r\n\tconst {\r\n\t\trender,\r\n\t\tstate,\r\n\t\tonStateChange,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\t// `scrollableContainer` option is deprecated.\r\n\t\t// Use `getScrollableContainer()` option instead.\r\n\t\tscrollableContainer,\r\n\t\tmeasureItemsBatchSize = 50,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\ttbody,\r\n\t\testimatedItemHeight,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\t_useTimeoutInRenderLoop,\r\n\t\t_waitForScrollingToStop,\r\n\t\tengine\r\n\t} = options\r\n\r\n\tlet {\r\n\t\tbypass,\r\n\t\tgetScrollableContainer\r\n\t} = options\r\n\r\n\tlog('~ Initialize ~')\r\n\r\n\t// Could support non-DOM rendering engines.\r\n\t// For example, React Native, `<canvas/>`, etc.\r\n\tthis.engine = engine || DOMEngine\r\n\r\n\t// `scrollableContainer` option is deprecated.\r\n\t// Use `getScrollableContainer()` option instead.\r\n\tif (!getScrollableContainer && scrollableContainer) {\r\n\t\tgetScrollableContainer = () => scrollableContainer\r\n\t}\r\n\r\n\t// Sometimes, when `new VirtualScroller()` instance is created,\r\n\t// `getItemsContainerElement()` might not be ready to return the \"container\" DOM Element yet\r\n\t// (for example, because it's not rendered yet). That's the reason why it's a getter function.\r\n\t// For example, in React `<VirtualScroller/>` component, a `VirtualScroller`\r\n\t// instance is created in the React component's `constructor()`, and at that time\r\n\t// the container Element is not yet available. The container Element is available\r\n\t// in `componentDidMount()`, but `componentDidMount()` is not executed on server,\r\n\t// which would mean that React `<VirtualScroller/>` wouldn't render at all\r\n\t// on server side, while with the `getItemsContainerElement()` approach, on server side,\r\n\t// it still \"renders\" a list with a predefined amount of items in it by default.\r\n\t// (`initiallyRenderedItemsCount`, or `1`).\r\n\tthis.getItemsContainerElement = getItemsContainerElement\r\n\r\n\t// if (prerenderMargin === undefined) {\r\n\t// \t// Renders items which are outside of the screen by this \"prerender margin\".\r\n\t// \t// Is the screen height by default: seems to be the optimal value\r\n\t// \t// for \"Page Up\" / \"Page Down\" navigation and optimized mouse wheel scrolling.\r\n\t// \tprerenderMargin = this.scrollableContainer ? this.scrollableContainer.getHeight() : 0\r\n\t// }\r\n\r\n\tif (options.getState || options.setState) {\r\n\t\tthrow new Error('[virtual-scroller] `getState`/`setState` options usage has changed in the new version. See the readme for more details.')\r\n\t}\r\n\r\n\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\tif (tbody) {\r\n\t\tif (this.engine !== DOMEngine) {\r\n\t\t\tthrow new Error('[virtual-scroller] `tbody` option is only supported for DOM rendering engine')\r\n\t\t}\r\n\t\tlog('~ <tbody/> detected ~')\r\n\t\tthis.tbody = true\r\n\t\tif (!supportsTbody()) {\r\n\t\t\tlog('~ <tbody/> not supported ~')\r\n\t\t\treportError(BROWSER_NOT_SUPPORTED_ERROR)\r\n\t\t\tbypass = true\r\n\t\t}\r\n\t}\r\n\r\n\tif (bypass) {\r\n\t\tlog('~ \"bypass\" mode ~')\r\n\t}\r\n\r\n\t// In `bypass` mode, `VirtualScroller` doesn't wait\r\n\t// for the user to scroll down to render all items:\r\n\t// instead, it renders all items right away, as if\r\n\t// the list is rendered without using `VirtualScroller`.\r\n\t// It was added just to measure how much is the\r\n\t// performance difference between using a `VirtualScroller`\r\n\t// and not using a `VirtualScroller`.\r\n\t// It turned out that unmounting large React component trees\r\n\t// is a very long process, so `VirtualScroller` does seem to\r\n\t// make sense when used in a React application.\r\n\tthis.bypass = bypass\r\n\t// this.bypassBatchSize = bypassBatchSize || 10\r\n\r\n\t// Using `setTimeout()` in render loop is a workaround\r\n\t// for avoiding a React error message:\r\n\t// \"Maximum update depth exceeded.\r\n\t// This can happen when a component repeatedly calls\r\n\t// `.setState()` inside `componentWillUpdate()` or `componentDidUpdate()`.\r\n\t// React limits the number of nested updates to prevent infinite loops.\"\r\n\tthis._useTimeoutInRenderLoop = _useTimeoutInRenderLoop\r\n\r\n\tif (getItemId) {\r\n\t\tthis.isItemEqual = (a, b) => getItemId(a) === getItemId(b)\r\n\t} else {\r\n\t\tthis.isItemEqual = (a, b) => a === b\r\n\t}\r\n\r\n\tif (onItemInitialRender) {\r\n\t\tthis.onItemInitialRender = onItemInitialRender\r\n\t}\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\telse if (onItemFirstRender) {\r\n\t\tthis.onItemInitialRender = (item) => {\r\n\t\t\twarn('`onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.')\r\n\t\t\tconst { items } = this.getState()\r\n\t\t\tconst i = items.indexOf(item)\r\n\t\t\t// The `item` could also be non-found due to the inconsistency bug:\r\n\t\t\t// The reason is that `i` can be non-consistent with the `items`\r\n\t\t\t// passed to `<VirtualScroller/>` in React due to `updateState()` not being\r\n\t\t\t// instanteneous: when new `items` are passed to `<VirtualScroller/>`,\r\n\t\t\t// `VirtualScroller.updateState({ items })` is called, and if `onItemFirstRender(i)`\r\n\t\t\t// is called after the aforementioned `updateState()` is called but before it finishes,\r\n\t\t\t// `i` would point to an index in \"previous\" `items` while the application\r\n\t\t\t// would assume that `i` points to an index in the \"new\" `items`,\r\n\t\t\t// resulting in an incorrect item being assumed by the application\r\n\t\t\t// or even in an \"array index out of bounds\" error.\r\n\t\t\tif (i >= 0) {\r\n\t\t\t\tonItemFirstRender(i)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// If initial `state` is passed then use `items` from `state`\r\n\t// instead of the `items` argument.\r\n\tif (state) {\r\n\t\titems = state.items\r\n\t}\r\n\r\n\tlog('Items count', items.length)\r\n\tif (estimatedItemHeight) {\r\n\t\tlog('Estimated item height', estimatedItemHeight)\r\n\t}\r\n\r\n\tcreateStateHelpers.call(this, { state, onStateChange, render, items })\r\n\r\n\tcreateVerticalSpacingHelpers.call(this)\r\n\tcreateColumnsHelpers.call(this, { getColumnsCount })\r\n\r\n\tcreateLayoutHelpers.call(this)\r\n\tcreateOnRenderHelpers.call(this)\r\n\tcreateResizeHelpers.call(this)\r\n\tcreateItemsHelpers.call(this)\r\n\r\n\tcreateHelpers.call(this, {\r\n\t\tgetScrollableContainer,\r\n\t\testimatedItemHeight,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\twaitForScrollingToStop: _waitForScrollingToStop\r\n\t})\r\n\r\n\tif (state) {\r\n\t\t// Initialize `ItemHeights` from previously measured `state.itemHeights`.\r\n\t\tthis.itemHeights.readItemHeightsFromState(state)\r\n\r\n\t\t// Initialize some `BeforeResize` internal flags from a previously saved state.\r\n\t\tthis.beforeResize.initializeFromState(state)\r\n\t}\r\n}\r\n\r\nfunction createHelpers({\r\n\tgetScrollableContainer,\r\n\testimatedItemHeight,\r\n\tmeasureItemsBatchSize,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\twaitForScrollingToStop\r\n}) {\r\n\tthis.itemsContainer = this.engine.createItemsContainer(\r\n\t\tthis.getItemsContainerElement\r\n\t)\r\n\r\n\t// If the items \"container\" element is mounted at this stage,\r\n\t// remove any accidental text nodes from it (like whitespace).\r\n\t//\r\n\t// Also, this guards against cases when someone accidentally tries\r\n\t// using `VirtualScroller` on a non-empty element.\r\n\t//\r\n\tif (this.getItemsContainerElement()) {\r\n\t\tthis.itemsContainer.clear()\r\n\t}\r\n\r\n\tthis.scrollableContainer = this.engine.createScrollableContainer(\r\n\t\tgetScrollableContainer,\r\n\t\tthis.getItemsContainerElement\r\n\t)\r\n\r\n\t// Create `ItemHeights` instance.\r\n\tthis.itemHeights = new ItemHeights({\r\n\t\tcontainer: this.itemsContainer,\r\n\t\tgetItemHeight: (i) => this.getState().itemHeights[i],\r\n\t\tsetItemHeight: (i, height) => this.getState().itemHeights[i] = height\r\n\t})\r\n\r\n\tthis.layout = new Layout({\r\n\t\tbypass: this.bypass,\r\n\t\testimatedItemHeight,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin: () => this.getPrerenderMargin(),\r\n\t\tgetVerticalSpacing: () => this.getVerticalSpacing(),\r\n\t\tgetVerticalSpacingBeforeResize: () => this.getVerticalSpacingBeforeResize(),\r\n\t\tgetColumnsCount: () => this.getColumnsCount(),\r\n\t\tgetColumnsCountBeforeResize: () => this.getState().beforeResize && this.getState().beforeResize.columnsCount,\r\n\t\tgetItemHeight: (i) => this.getState().itemHeights[i],\r\n\t\tgetItemHeightBeforeResize: (i) => this.getState().beforeResize && this.getState().beforeResize.itemHeights[i],\r\n\t\tgetBeforeResizeItemsCount: () => this.getState().beforeResize ? this.getState().beforeResize.itemHeights.length : 0,\r\n\t\tgetAverageItemHeight: () => this.itemHeights.getAverage(),\r\n\t\tgetMaxVisibleAreaHeight: () => this.scrollableContainer && this.scrollableContainer.getHeight(),\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\tgetPreviouslyCalculatedLayout: () => this.previouslyCalculatedLayout\r\n\t})\r\n\r\n\tthis.resize = new Resize({\r\n\t\tbypass: this.bypass,\r\n\t\tgetWidth: () => this.scrollableContainer.getWidth(),\r\n\t\tgetHeight: () => this.scrollableContainer.getHeight(),\r\n\t\tlistenForResize: (listener) => this.scrollableContainer.onResize(listener),\r\n\t\tonResizeStart: () => {\r\n\t\t\tlog('~ Scrollable container resize started ~')\r\n\t\t\tthis._isResizing = true\r\n\t\t},\r\n\t\tonResizeStop: () => {\r\n\t\t\tlog('~ Scrollable container resize finished ~')\r\n\t\t\tthis._isResizing = undefined\r\n\t\t},\r\n\t\tonNoChange: () => {\r\n\t\t\t// There might have been some missed `this.onUpdateShownItemIndexes()` calls\r\n\t\t\t// due to setting `this._isResizing` flag to `true` during the resize.\r\n\t\t\t// So, update shown item indexes just in case.\r\n\t\t\tthis.onUpdateShownItemIndexes({\r\n\t\t\t\treason: LAYOUT_REASON.VIEWPORT_SIZE_UNCHANGED\r\n\t\t\t})\r\n\t\t},\r\n\t\tonHeightChange: () => this.onUpdateShownItemIndexes({\r\n\t\t\treason: LAYOUT_REASON.VIEWPORT_HEIGHT_CHANGED\r\n\t\t}),\r\n\t\tonWidthChange: (prevWidth, newWidth) => {\r\n\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\tthis.onResize()\r\n\t\t}\r\n\t})\r\n\r\n\tthis.scroll = new Scroll({\r\n\t\tbypass: this.bypass,\r\n\t\tscrollableContainer: this.scrollableContainer,\r\n\t\titemsContainer: this.itemsContainer,\r\n\t\twaitForScrollingToStop,\r\n\t\tonScroll: ({ delayed } = {}) => {\r\n\t\t\tthis.onUpdateShownItemIndexes({\r\n\t\t\t\treason: delayed ? LAYOUT_REASON.STOPPED_SCROLLING : LAYOUT_REASON.SCROLL\r\n\t\t\t})\r\n\t\t},\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tisImmediateLayoutScheduled: () => Boolean(this.layoutTimer),\r\n\t\thasNonRenderedItemsAtTheTop: () => this.getState().firstShownItemIndex > 0,\r\n\t\thasNonRenderedItemsAtTheBottom: () => this.getState().lastShownItemIndex < this.getItemsCount() - 1,\r\n\t\tgetLatestLayoutVisibleArea: () => this.latestLayoutVisibleArea,\r\n\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer,\r\n\t\tgetPrerenderMargin: () => this.getPrerenderMargin()\r\n\t})\r\n\r\n\tthis.listHeightMeasurement = new ListHeightMeasurement({\r\n\t\titemsContainer: this.itemsContainer,\r\n\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer\r\n\t})\r\n\r\n\tif (this.engine.watchListTopOffset) {\r\n\t\tthis.listTopOffsetWatcher = this.engine.watchListTopOffset({\r\n\t\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer,\r\n\t\t\tonListTopOffsetChange: ({ reason }) => this.onUpdateShownItemIndexes({\r\n\t\t\t\treason: LAYOUT_REASON.TOP_OFFSET_CHANGED\r\n\t\t\t})\r\n\t\t})\r\n\t}\r\n\r\n\tthis.beforeResize = new BeforeResize({\r\n\t\tgetState: this.getState,\r\n\t\tgetVerticalSpacing: this.getVerticalSpacing,\r\n\t\tgetColumnsCount: this.getColumnsCount\r\n\t})\r\n}"],"mappings":"AAAA,SACCA,aADD,EAECC,2BAFD,QAGO,gBAHP;AAKA,OAAOC,SAAP,MAAsB,iBAAtB;AAEA,OAAOC,MAAP,IAAiBC,aAAjB,QAAsC,aAAtC;AACA,OAAOC,MAAP,MAAmB,aAAnB;AACA,OAAOC,YAAP,MAAyB,mBAAzB;AACA,OAAOC,MAAP,MAAmB,aAAnB;AACA,OAAOC,qBAAP,MAAkC,4BAAlC;AACA,OAAOC,WAAP,MAAwB,kBAAxB;AAEA,OAAOC,GAAP,IAAcC,IAAd,EAAoBC,OAApB,EAA6BC,WAA7B,QAAgD,oBAAhD;AAEA,OAAOC,kBAAP,MAA+B,4BAA/B;AACA,OAAOC,4BAAP,MAAyC,sCAAzC;AACA,OAAOC,oBAAP,MAAiC,8BAAjC;AACA,OAAOC,mBAAP,MAAgC,6BAAhC;AACA,OAAOC,qBAAP,MAAkC,+BAAlC;AACA,OAAOC,mBAAP,MAAgC,6BAAhC;AACA,OAAOC,kBAAP,MAA+B,4BAA/B;AAEA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,0BAAT,CACdC,wBADc,EAEdC,KAFc,EAIb;EAAA;;EAAA,IADDC,OACC,uEADS,EACT;EACD,IACCC,MADD,GAoBID,OApBJ,CACCC,MADD;EAAA,IAECC,KAFD,GAoBIF,OApBJ,CAECE,KAFD;EAAA,IAGCC,aAHD,GAoBIH,OApBJ,CAGCG,aAHD;EAAA,IAICC,qBAJD,GAoBIJ,OApBJ,CAICI,qBAJD;EAAA,IAKCC,sBALD,GAoBIL,OApBJ,CAKCK,sBALD;EAAA,IAQCC,mBARD,GAoBIN,OApBJ,CAQCM,mBARD;EAAA,4BAoBIN,OApBJ,CASCO,qBATD;EAAA,IASCA,qBATD,sCASyB,EATzB;EAAA,IAUCC,eAVD,GAoBIR,OApBJ,CAUCQ,eAVD;EAAA,IAWCC,SAXD,GAoBIT,OApBJ,CAWCS,SAXD;EAAA,IAYCC,KAZD,GAoBIV,OApBJ,CAYCU,KAZD;EAAA,IAaCC,mBAbD,GAoBIX,OApBJ,CAaCW,mBAbD;EAAA,IAcCC,mBAdD,GAoBIZ,OApBJ,CAcCY,mBAdD;EAAA,IAgBCC,iBAhBD,GAoBIb,OApBJ,CAgBCa,iBAhBD;EAAA,IAiBCC,uBAjBD,GAoBId,OApBJ,CAiBCc,uBAjBD;EAAA,IAkBCC,uBAlBD,GAoBIf,OApBJ,CAkBCe,uBAlBD;EAAA,IAmBCC,MAnBD,GAoBIhB,OApBJ,CAmBCgB,MAnBD;EAsBA,IACCC,MADD,GAGIjB,OAHJ,CACCiB,MADD;EAAA,IAECC,sBAFD,GAGIlB,OAHJ,CAECkB,sBAFD;EAKAhC,GAAG,CAAC,gBAAD,CAAH,CA5BC,CA8BD;EACA;;EACA,KAAK8B,MAAL,GAAcA,MAAM,IAAItC,SAAxB,CAhCC,CAkCD;EACA;;EACA,IAAI,CAACwC,sBAAD,IAA2BZ,mBAA/B,EAAoD;IACnDY,sBAAsB,GAAG;MAAA,OAAMZ,mBAAN;IAAA,CAAzB;EACA,CAtCA,CAwCD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;EACA,KAAKR,wBAAL,GAAgCA,wBAAhC,CAnDC,CAqDD;EACA;EACA;EACA;EACA;EACA;;EAEA,IAAIE,OAAO,CAACmB,QAAR,IAAoBnB,OAAO,CAACoB,QAAhC,EAA0C;IACzC,MAAM,IAAIC,KAAJ,CAAU,yHAAV,CAAN;EACA,CA9DA,CAgED;EACA;;;EACA,IAAIX,KAAJ,EAAW;IACV,IAAI,KAAKM,MAAL,KAAgBtC,SAApB,EAA+B;MAC9B,MAAM,IAAI2C,KAAJ,CAAU,8EAAV,CAAN;IACA;;IACDnC,GAAG,CAAC,uBAAD,CAAH;IACA,KAAKwB,KAAL,GAAa,IAAb;;IACA,IAAI,CAAClC,aAAa,EAAlB,EAAsB;MACrBU,GAAG,CAAC,4BAAD,CAAH;MACAG,WAAW,CAACZ,2BAAD,CAAX;MACAwC,MAAM,GAAG,IAAT;IACA;EACD;;EAED,IAAIA,MAAJ,EAAY;IACX/B,GAAG,CAAC,mBAAD,CAAH;EACA,CAjFA,CAmFD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;EACA,KAAK+B,MAAL,GAAcA,MAAd,CA7FC,CA8FD;EAEA;EACA;EACA;EACA;EACA;EACA;;EACA,KAAKH,uBAAL,GAA+BA,uBAA/B;;EAEA,IAAIL,SAAJ,EAAe;IACd,KAAKa,WAAL,GAAmB,UAACC,CAAD,EAAIC,CAAJ;MAAA,OAAUf,SAAS,CAACc,CAAD,CAAT,KAAiBd,SAAS,CAACe,CAAD,CAApC;IAAA,CAAnB;EACA,CAFD,MAEO;IACN,KAAKF,WAAL,GAAmB,UAACC,CAAD,EAAIC,CAAJ;MAAA,OAAUD,CAAC,KAAKC,CAAhB;IAAA,CAAnB;EACA;;EAED,IAAIZ,mBAAJ,EAAyB;IACxB,KAAKA,mBAAL,GAA2BA,mBAA3B;EACA,CAFD,CAGA;EAHA,KAIK,IAAIC,iBAAJ,EAAuB;IAC3B,KAAKD,mBAAL,GAA2B,UAACa,IAAD,EAAU;MACpCtC,IAAI,CAAC,gFAAD,CAAJ;;MACA,qBAAkB,KAAI,CAACgC,QAAL,EAAlB;MAAA,IAAQpB,KAAR,kBAAQA,KAAR;;MACA,IAAM2B,CAAC,GAAG3B,KAAK,CAAC4B,OAAN,CAAcF,IAAd,CAAV,CAHoC,CAIpC;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MACA,IAAIC,CAAC,IAAI,CAAT,EAAY;QACXb,iBAAiB,CAACa,CAAD,CAAjB;MACA;IACD,CAjBD;EAkBA,CArIA,CAuID;EACA;;;EACA,IAAIxB,KAAJ,EAAW;IACVH,KAAK,GAAGG,KAAK,CAACH,KAAd;EACA;;EAEDb,GAAG,CAAC,aAAD,EAAgBa,KAAK,CAAC6B,MAAtB,CAAH;;EACA,IAAIjB,mBAAJ,EAAyB;IACxBzB,GAAG,CAAC,uBAAD,EAA0ByB,mBAA1B,CAAH;EACA;;EAEDrB,kBAAkB,CAACuC,IAAnB,CAAwB,IAAxB,EAA8B;IAAE3B,KAAK,EAALA,KAAF;IAASC,aAAa,EAAbA,aAAT;IAAwBF,MAAM,EAANA,MAAxB;IAAgCF,KAAK,EAALA;EAAhC,CAA9B;EAEAR,4BAA4B,CAACsC,IAA7B,CAAkC,IAAlC;EACArC,oBAAoB,CAACqC,IAArB,CAA0B,IAA1B,EAAgC;IAAErB,eAAe,EAAfA;EAAF,CAAhC;EAEAf,mBAAmB,CAACoC,IAApB,CAAyB,IAAzB;EACAnC,qBAAqB,CAACmC,IAAtB,CAA2B,IAA3B;EACAlC,mBAAmB,CAACkC,IAApB,CAAyB,IAAzB;EACAjC,kBAAkB,CAACiC,IAAnB,CAAwB,IAAxB;EAEAC,aAAa,CAACD,IAAd,CAAmB,IAAnB,EAAyB;IACxBX,sBAAsB,EAAtBA,sBADwB;IAExBP,mBAAmB,EAAnBA,mBAFwB;IAGxBJ,qBAAqB,EAArBA,qBAHwB;IAIxBH,qBAAqB,EAArBA,qBAJwB;IAKxBC,sBAAsB,EAAtBA,sBALwB;IAMxB0B,sBAAsB,EAAEhB;EANA,CAAzB;;EASA,IAAIb,KAAJ,EAAW;IACV;IACA,KAAK8B,WAAL,CAAiBC,wBAAjB,CAA0C/B,KAA1C,EAFU,CAIV;;IACA,KAAKgC,YAAL,CAAkBC,mBAAlB,CAAsCjC,KAAtC;EACA;AACD;;AAED,SAAS4B,aAAT,OAOG;EAAA;;EAAA,IANFZ,sBAME,QANFA,sBAME;EAAA,IALFP,mBAKE,QALFA,mBAKE;EAAA,IAJFJ,qBAIE,QAJFA,qBAIE;EAAA,IAHFH,qBAGE,QAHFA,qBAGE;EAAA,IAFFC,sBAEE,QAFFA,sBAEE;EAAA,IADF0B,sBACE,QADFA,sBACE;EACF,KAAKK,cAAL,GAAsB,KAAKpB,MAAL,CAAYqB,oBAAZ,CACrB,KAAKvC,wBADgB,CAAtB,CADE,CAKF;EACA;EACA;EACA;EACA;EACA;;EACA,IAAI,KAAKA,wBAAL,EAAJ,EAAqC;IACpC,KAAKsC,cAAL,CAAoBE,KAApB;EACA;;EAED,KAAKhC,mBAAL,GAA2B,KAAKU,MAAL,CAAYuB,yBAAZ,CAC1BrB,sBAD0B,EAE1B,KAAKpB,wBAFqB,CAA3B,CAfE,CAoBF;;EACA,KAAKkC,WAAL,GAAmB,IAAI/C,WAAJ,CAAgB;IAClCuD,SAAS,EAAE,KAAKJ,cADkB;IAElCK,aAAa,EAAE,uBAACf,CAAD;MAAA,OAAO,MAAI,CAACP,QAAL,GAAgBa,WAAhB,CAA4BN,CAA5B,CAAP;IAAA,CAFmB;IAGlCgB,aAAa,EAAE,uBAAChB,CAAD,EAAIiB,MAAJ;MAAA,OAAe,MAAI,CAACxB,QAAL,GAAgBa,WAAhB,CAA4BN,CAA5B,IAAiCiB,MAAhD;IAAA;EAHmB,CAAhB,CAAnB;EAMA,KAAKC,MAAL,GAAc,IAAIjE,MAAJ,CAAW;IACxBsC,MAAM,EAAE,KAAKA,MADW;IAExBN,mBAAmB,EAAnBA,mBAFwB;IAGxBJ,qBAAqB,EAArBA,qBAHwB;IAIxBsC,kBAAkB,EAAE;MAAA,OAAM,MAAI,CAACA,kBAAL,EAAN;IAAA,CAJI;IAKxBC,kBAAkB,EAAE;MAAA,OAAM,MAAI,CAACA,kBAAL,EAAN;IAAA,CALI;IAMxBC,8BAA8B,EAAE;MAAA,OAAM,MAAI,CAACA,8BAAL,EAAN;IAAA,CANR;IAOxBvC,eAAe,EAAE;MAAA,OAAM,MAAI,CAACA,eAAL,EAAN;IAAA,CAPO;IAQxBwC,2BAA2B,EAAE;MAAA,OAAM,MAAI,CAAC7B,QAAL,GAAgBe,YAAhB,IAAgC,MAAI,CAACf,QAAL,GAAgBe,YAAhB,CAA6Be,YAAnE;IAAA,CARL;IASxBR,aAAa,EAAE,uBAACf,CAAD;MAAA,OAAO,MAAI,CAACP,QAAL,GAAgBa,WAAhB,CAA4BN,CAA5B,CAAP;IAAA,CATS;IAUxBwB,yBAAyB,EAAE,mCAACxB,CAAD;MAAA,OAAO,MAAI,CAACP,QAAL,GAAgBe,YAAhB,IAAgC,MAAI,CAACf,QAAL,GAAgBe,YAAhB,CAA6BF,WAA7B,CAAyCN,CAAzC,CAAvC;IAAA,CAVH;IAWxByB,yBAAyB,EAAE;MAAA,OAAM,MAAI,CAAChC,QAAL,GAAgBe,YAAhB,GAA+B,MAAI,CAACf,QAAL,GAAgBe,YAAhB,CAA6BF,WAA7B,CAAyCJ,MAAxE,GAAiF,CAAvF;IAAA,CAXH;IAYxBwB,oBAAoB,EAAE;MAAA,OAAM,MAAI,CAACpB,WAAL,CAAiBqB,UAAjB,EAAN;IAAA,CAZE;IAaxBC,uBAAuB,EAAE;MAAA,OAAM,MAAI,CAAChD,mBAAL,IAA4B,MAAI,CAACA,mBAAL,CAAyBiD,SAAzB,EAAlC;IAAA,CAbD;IAcxB;IACA;IACA;IACA;IACA;IACA;IACA;IACAC,6BAA6B,EAAE;MAAA,OAAM,MAAI,CAACC,0BAAX;IAAA;EArBP,CAAX,CAAd;EAwBA,KAAKC,MAAL,GAAc,IAAI7E,MAAJ,CAAW;IACxBoC,MAAM,EAAE,KAAKA,MADW;IAExB0C,QAAQ,EAAE;MAAA,OAAM,MAAI,CAACrD,mBAAL,CAAyBqD,QAAzB,EAAN;IAAA,CAFc;IAGxBJ,SAAS,EAAE;MAAA,OAAM,MAAI,CAACjD,mBAAL,CAAyBiD,SAAzB,EAAN;IAAA,CAHa;IAIxBK,eAAe,EAAE,yBAACC,QAAD;MAAA,OAAc,MAAI,CAACvD,mBAAL,CAAyBwD,QAAzB,CAAkCD,QAAlC,CAAd;IAAA,CAJO;IAKxBE,aAAa,EAAE,yBAAM;MACpB7E,GAAG,CAAC,yCAAD,CAAH;MACA,MAAI,CAAC8E,WAAL,GAAmB,IAAnB;IACA,CARuB;IASxBC,YAAY,EAAE,wBAAM;MACnB/E,GAAG,CAAC,0CAAD,CAAH;MACA,MAAI,CAAC8E,WAAL,GAAmBE,SAAnB;IACA,CAZuB;IAaxBC,UAAU,EAAE,sBAAM;MACjB;MACA;MACA;MACA,MAAI,CAACC,wBAAL,CAA8B;QAC7BC,MAAM,EAAEzF,aAAa,CAAC0F;MADO,CAA9B;IAGA,CApBuB;IAqBxBC,cAAc,EAAE;MAAA,OAAM,MAAI,CAACH,wBAAL,CAA8B;QACnDC,MAAM,EAAEzF,aAAa,CAAC4F;MAD6B,CAA9B,CAAN;IAAA,CArBQ;IAwBxBC,aAAa,EAAE,uBAACC,SAAD,EAAYC,QAAZ,EAAyB;MACvCzF,GAAG,CAAC,2CAAD,EAA8CwF,SAA9C,EAAyD,IAAzD,EAA+DC,QAA/D,EAAyE,GAAzE,CAAH;;MACA,MAAI,CAACb,QAAL;IACA;EA3BuB,CAAX,CAAd;EA8BA,KAAKc,MAAL,GAAc,IAAI7F,MAAJ,CAAW;IACxBkC,MAAM,EAAE,KAAKA,MADW;IAExBX,mBAAmB,EAAE,KAAKA,mBAFF;IAGxB8B,cAAc,EAAE,KAAKA,cAHG;IAIxBL,sBAAsB,EAAtBA,sBAJwB;IAKxB8C,QAAQ,EAAE,oBAAsB;MAAA,gFAAP,EAAO;MAAA,IAAnBC,OAAmB,SAAnBA,OAAmB;;MAC/B,MAAI,CAACV,wBAAL,CAA8B;QAC7BC,MAAM,EAAES,OAAO,GAAGlG,aAAa,CAACmG,iBAAjB,GAAqCnG,aAAa,CAACoG;MADrC,CAA9B;IAGA,CATuB;IAUxB5E,qBAAqB,EAArBA,qBAVwB;IAWxBC,sBAAsB,EAAtBA,sBAXwB;IAYxB4E,0BAA0B,EAAE;MAAA,OAAMC,OAAO,CAAC,MAAI,CAACC,WAAN,CAAb;IAAA,CAZJ;IAaxBC,2BAA2B,EAAE;MAAA,OAAM,MAAI,CAACjE,QAAL,GAAgBkE,mBAAhB,GAAsC,CAA5C;IAAA,CAbL;IAcxBC,8BAA8B,EAAE;MAAA,OAAM,MAAI,CAACnE,QAAL,GAAgBoE,kBAAhB,GAAqC,MAAI,CAACC,aAAL,KAAuB,CAAlE;IAAA,CAdR;IAexBC,0BAA0B,EAAE;MAAA,OAAM,MAAI,CAACC,uBAAX;IAAA,CAfJ;IAgBxBC,gBAAgB,EAAE,KAAKC,yCAhBC;IAiBxB/C,kBAAkB,EAAE;MAAA,OAAM,MAAI,CAACA,kBAAL,EAAN;IAAA;EAjBI,CAAX,CAAd;EAoBA,KAAKgD,qBAAL,GAA6B,IAAI7G,qBAAJ,CAA0B;IACtDoD,cAAc,EAAE,KAAKA,cADiC;IAEtDuD,gBAAgB,EAAE,KAAKC;EAF+B,CAA1B,CAA7B;;EAKA,IAAI,KAAK5E,MAAL,CAAY8E,kBAAhB,EAAoC;IACnC,KAAKC,oBAAL,GAA4B,KAAK/E,MAAL,CAAY8E,kBAAZ,CAA+B;MAC1DH,gBAAgB,EAAE,KAAKC,yCADmC;MAE1DI,qBAAqB,EAAE;QAAA,IAAG3B,MAAH,SAAGA,MAAH;QAAA,OAAgB,MAAI,CAACD,wBAAL,CAA8B;UACpEC,MAAM,EAAEzF,aAAa,CAACqH;QAD8C,CAA9B,CAAhB;MAAA;IAFmC,CAA/B,CAA5B;EAMA;;EAED,KAAK/D,YAAL,GAAoB,IAAIpD,YAAJ,CAAiB;IACpCqC,QAAQ,EAAE,KAAKA,QADqB;IAEpC2B,kBAAkB,EAAE,KAAKA,kBAFW;IAGpCtC,eAAe,EAAE,KAAKA;EAHc,CAAjB,CAApB;AAKA"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.constructor.js","names":["supportsTbody","BROWSER_NOT_SUPPORTED_ERROR","DOMEngine","Layout","LAYOUT_REASON","Resize","BeforeResize","Scroll","ListHeightMeasurement","ItemHeights","log","warn","isDebug","reportError","createStateHelpers","createVerticalSpacingHelpers","createColumnsHelpers","createLayoutHelpers","createOnRenderHelpers","createResizeHelpers","createItemsHelpers","VirtualScrollerConstructor","getItemsContainerElement","items","options","render","state","onStateChange","initialScrollPosition","onScrollPositionChange","scrollableContainer","measureItemsBatchSize","getColumnsCount","getItemId","tbody","estimatedItemHeight","getEstimatedVisibleItemRowsCount","onItemInitialRender","onItemFirstRender","_useTimeoutInRenderLoop","_waitForScrollingToStop","engine","bypass","getEstimatedItemHeight","getScrollableContainer","getState","setState","Error","isItemEqual","a","b","item","i","indexOf","length","call","createHelpers","waitForScrollingToStop","itemHeights","readItemHeightsFromState","beforeResize","initializeFromState","itemsContainer","createItemsContainer","clear","createScrollableContainer","container","getItemHeight","setItemHeight","height","layout","getInitialEstimatedItemHeight","getInitialEstimatedVisibleItemRowsCount","getPrerenderMargin","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCountBeforeResize","columnsCount","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getAverage","getMaxVisibleAreaHeight","getHeight","isScrollableContainerReady","isReady","getPreviouslyCalculatedLayout","previouslyCalculatedLayout","resize","getWidth","listenForResize","listener","onResize","onResizeStart","_isResizing","onResizeStop","undefined","onNoChange","onUpdateShownItemIndexes","reason","VIEWPORT_SIZE_UNCHANGED","onHeightChange","VIEWPORT_HEIGHT_CHANGED","onWidthChange","prevWidth","newWidth","scroll","onScroll","delayed","STOPPED_SCROLLING","SCROLL","isImmediateLayoutScheduled","Boolean","layoutTimer","hasNonRenderedItemsAtTheTop","firstShownItemIndex","hasNonRenderedItemsAtTheBottom","lastShownItemIndex","getItemsCount","getLatestLayoutVisibleArea","latestLayoutVisibleArea","getListTopOffset","getListTopOffsetInsideScrollableContainer","listHeightMeasurement","watchListTopOffset","listTopOffsetWatcher","onListTopOffsetChange","TOP_OFFSET_CHANGED"],"sources":["../source/VirtualScroller.constructor.js"],"sourcesContent":["import {\r\n\tsupportsTbody,\r\n\tBROWSER_NOT_SUPPORTED_ERROR\r\n} from './DOM/tbody.js'\r\n\r\nimport DOMEngine from './DOM/Engine.js'\r\n\r\nimport Layout, { LAYOUT_REASON } from './Layout.js'\r\nimport Resize from './Resize.js'\r\nimport BeforeResize from './BeforeResize.js'\r\nimport Scroll from './Scroll.js'\r\nimport ListHeightMeasurement from './ListHeightMeasurement.js'\r\nimport ItemHeights from './ItemHeights.js'\r\n\r\nimport log, { warn, isDebug, reportError } from './utility/debug.js'\r\n\r\nimport createStateHelpers from './VirtualScroller.state.js'\r\nimport createVerticalSpacingHelpers from './VirtualScroller.verticalSpacing.js'\r\nimport createColumnsHelpers from './VirtualScroller.columns.js'\r\nimport createLayoutHelpers from './VirtualScroller.layout.js'\r\nimport createOnRenderHelpers from './VirtualScroller.onRender.js'\r\nimport createResizeHelpers from './VirtualScroller.resize.js'\r\nimport createItemsHelpers from './VirtualScroller.items.js'\r\n\r\n/**\r\n * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n * @param {any[]} items — The list of items.\r\n * @param {Object} [options] — See README.md.\r\n * @return {VirtualScroller}\r\n */\r\nexport default function VirtualScrollerConstructor(\r\n\tgetItemsContainerElement,\r\n\titems,\r\n\toptions = {}\r\n) {\r\n\tconst {\r\n\t\trender,\r\n\t\tstate,\r\n\t\tonStateChange,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\t// `scrollableContainer` option is deprecated.\r\n\t\t// Use `getScrollableContainer()` option instead.\r\n\t\tscrollableContainer,\r\n\t\tmeasureItemsBatchSize = 50,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\ttbody,\r\n\t\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\t\testimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\t_useTimeoutInRenderLoop,\r\n\t\t_waitForScrollingToStop,\r\n\t\tengine\r\n\t} = options\r\n\r\n\tlet {\r\n\t\tbypass,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetScrollableContainer\r\n\t} = options\r\n\r\n\tlog('~ Initialize ~')\r\n\r\n\t// Could support non-DOM rendering engines.\r\n\t// For example, React Native, `<canvas/>`, etc.\r\n\tthis.engine = engine || DOMEngine\r\n\r\n\tif (!getEstimatedItemHeight && typeof estimatedItemHeight === 'number') {\r\n\t\tgetEstimatedItemHeight = () => estimatedItemHeight\r\n\t}\r\n\r\n\t// `scrollableContainer` option is deprecated.\r\n\t// Use `getScrollableContainer()` option instead.\r\n\tif (!getScrollableContainer && scrollableContainer) {\r\n\t\tgetScrollableContainer = () => scrollableContainer\r\n\t}\r\n\r\n\t// Sometimes, when `new VirtualScroller()` instance is created,\r\n\t// `getItemsContainerElement()` might not be ready to return the \"container\" DOM Element yet\r\n\t// (for example, because it's not rendered yet). That's the reason why it's a getter function.\r\n\t// For example, in React `<VirtualScroller/>` component, a `VirtualScroller`\r\n\t// instance is created in the React component's `constructor()`, and at that time\r\n\t// the container Element is not yet available. The container Element is available\r\n\t// in `componentDidMount()`, but `componentDidMount()` is not executed on server,\r\n\t// which would mean that React `<VirtualScroller/>` wouldn't render at all\r\n\t// on server side, while with the `getItemsContainerElement()` approach, on server side,\r\n\t// it still \"renders\" a list with a predefined amount of items in it by default.\r\n\t// (`initiallyRenderedItemsCount`, or `1`).\r\n\tthis.getItemsContainerElement = getItemsContainerElement\r\n\r\n\t// if (prerenderMargin === undefined) {\r\n\t// \t// Renders items which are outside of the screen by this \"prerender margin\".\r\n\t// \t// Is the screen height by default: seems to be the optimal value\r\n\t// \t// for \"Page Up\" / \"Page Down\" navigation and optimized mouse wheel scrolling.\r\n\t// \tprerenderMargin = this.scrollableContainer ? this.scrollableContainer.getHeight() : 0\r\n\t// }\r\n\r\n\tif (options.getState || options.setState) {\r\n\t\tthrow new Error('[virtual-scroller] `getState`/`setState` options usage has changed in the new version. See the readme for more details.')\r\n\t}\r\n\r\n\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\tif (tbody) {\r\n\t\tif (this.engine !== DOMEngine) {\r\n\t\t\tthrow new Error('[virtual-scroller] `tbody` option is only supported for DOM rendering engine')\r\n\t\t}\r\n\t\tlog('~ <tbody/> detected ~')\r\n\t\tthis.tbody = true\r\n\t\tif (!supportsTbody()) {\r\n\t\t\tlog('~ <tbody/> not supported ~')\r\n\t\t\treportError(BROWSER_NOT_SUPPORTED_ERROR)\r\n\t\t\tbypass = true\r\n\t\t}\r\n\t}\r\n\r\n\tif (bypass) {\r\n\t\tlog('~ \"bypass\" mode ~')\r\n\t}\r\n\r\n\t// In `bypass` mode, `VirtualScroller` doesn't wait\r\n\t// for the user to scroll down to render all items:\r\n\t// instead, it renders all items right away, as if\r\n\t// the list is rendered without using `VirtualScroller`.\r\n\t// It was added just to measure how much is the\r\n\t// performance difference between using a `VirtualScroller`\r\n\t// and not using a `VirtualScroller`.\r\n\t// It turned out that unmounting large React component trees\r\n\t// is a very long process, so `VirtualScroller` does seem to\r\n\t// make sense when used in a React application.\r\n\tthis.bypass = bypass\r\n\t// this.bypassBatchSize = bypassBatchSize || 10\r\n\r\n\t// Using `setTimeout()` in render loop is a workaround\r\n\t// for avoiding a React error message:\r\n\t// \"Maximum update depth exceeded.\r\n\t// This can happen when a component repeatedly calls\r\n\t// `.setState()` inside `componentWillUpdate()` or `componentDidUpdate()`.\r\n\t// React limits the number of nested updates to prevent infinite loops.\"\r\n\tthis._useTimeoutInRenderLoop = _useTimeoutInRenderLoop\r\n\r\n\tif (getItemId) {\r\n\t\tthis.isItemEqual = (a, b) => getItemId(a) === getItemId(b)\r\n\t} else {\r\n\t\tthis.isItemEqual = (a, b) => a === b\r\n\t}\r\n\r\n\tif (onItemInitialRender) {\r\n\t\tthis.onItemInitialRender = onItemInitialRender\r\n\t}\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\telse if (onItemFirstRender) {\r\n\t\tthis.onItemInitialRender = (item) => {\r\n\t\t\twarn('`onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.')\r\n\t\t\tconst { items } = this.getState()\r\n\t\t\tconst i = items.indexOf(item)\r\n\t\t\t// The `item` could also be non-found due to the inconsistency bug:\r\n\t\t\t// The reason is that `i` can be non-consistent with the `items`\r\n\t\t\t// passed to `<VirtualScroller/>` in React due to `updateState()` not being\r\n\t\t\t// instanteneous: when new `items` are passed to `<VirtualScroller/>`,\r\n\t\t\t// `VirtualScroller.updateState({ items })` is called, and if `onItemFirstRender(i)`\r\n\t\t\t// is called after the aforementioned `updateState()` is called but before it finishes,\r\n\t\t\t// `i` would point to an index in \"previous\" `items` while the application\r\n\t\t\t// would assume that `i` points to an index in the \"new\" `items`,\r\n\t\t\t// resulting in an incorrect item being assumed by the application\r\n\t\t\t// or even in an \"array index out of bounds\" error.\r\n\t\t\tif (i >= 0) {\r\n\t\t\t\tonItemFirstRender(i)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// If initial `state` is passed then use `items` from `state`\r\n\t// instead of the `items` argument.\r\n\tif (state) {\r\n\t\titems = state.items\r\n\t}\r\n\r\n\tlog('Items count', items.length)\r\n\tif (getEstimatedItemHeight) {\r\n\t\tlog('Estimated item height', getEstimatedItemHeight())\r\n\t}\r\n\r\n\tcreateStateHelpers.call(this, { state, onStateChange, render, items })\r\n\r\n\tcreateVerticalSpacingHelpers.call(this)\r\n\tcreateColumnsHelpers.call(this, { getColumnsCount })\r\n\r\n\tcreateLayoutHelpers.call(this)\r\n\tcreateOnRenderHelpers.call(this)\r\n\tcreateResizeHelpers.call(this)\r\n\tcreateItemsHelpers.call(this)\r\n\r\n\tcreateHelpers.call(this, {\r\n\t\tgetScrollableContainer,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\twaitForScrollingToStop: _waitForScrollingToStop\r\n\t})\r\n\r\n\tif (state) {\r\n\t\t// Initialize `ItemHeights` from previously measured `state.itemHeights`.\r\n\t\tthis.itemHeights.readItemHeightsFromState(state)\r\n\r\n\t\t// Initialize some `BeforeResize` internal flags from a previously saved state.\r\n\t\tthis.beforeResize.initializeFromState(state)\r\n\t}\r\n}\r\n\r\nfunction createHelpers({\r\n\tgetScrollableContainer,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tmeasureItemsBatchSize,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\twaitForScrollingToStop\r\n}) {\r\n\tthis.itemsContainer = this.engine.createItemsContainer(\r\n\t\tthis.getItemsContainerElement\r\n\t)\r\n\r\n\t// If the items \"container\" element is mounted at this stage,\r\n\t// remove any accidental text nodes from it (like whitespace).\r\n\t//\r\n\t// Also, this guards against cases when someone accidentally tries\r\n\t// using `VirtualScroller` on a non-empty element.\r\n\t//\r\n\tif (this.getItemsContainerElement()) {\r\n\t\tthis.itemsContainer.clear()\r\n\t}\r\n\r\n\tthis.scrollableContainer = this.engine.createScrollableContainer(\r\n\t\tgetScrollableContainer,\r\n\t\tthis.getItemsContainerElement\r\n\t)\r\n\r\n\t// Create `ItemHeights` instance.\r\n\tthis.itemHeights = new ItemHeights({\r\n\t\tcontainer: this.itemsContainer,\r\n\t\tgetItemHeight: (i) => this.getState().itemHeights[i],\r\n\t\tsetItemHeight: (i, height) => this.getState().itemHeights[i] = height\r\n\t})\r\n\r\n\tthis.layout = new Layout({\r\n\t\tbypass: this.bypass,\r\n\t\tgetInitialEstimatedItemHeight: getEstimatedItemHeight,\r\n\t\tgetInitialEstimatedVisibleItemRowsCount: getEstimatedVisibleItemRowsCount,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin: () => this.getPrerenderMargin(),\r\n\t\tgetVerticalSpacing: () => this.getVerticalSpacing(),\r\n\t\tgetVerticalSpacingBeforeResize: () => this.getVerticalSpacingBeforeResize(),\r\n\t\tgetColumnsCount: () => this.getColumnsCount(),\r\n\t\tgetColumnsCountBeforeResize: () => this.getState().beforeResize && this.getState().beforeResize.columnsCount,\r\n\t\tgetItemHeight: (i) => this.getState().itemHeights[i],\r\n\t\tgetItemHeightBeforeResize: (i) => this.getState().beforeResize && this.getState().beforeResize.itemHeights[i],\r\n\t\tgetBeforeResizeItemsCount: () => this.getState().beforeResize ? this.getState().beforeResize.itemHeights.length : 0,\r\n\t\tgetAverageItemHeight: () => this.itemHeights.getAverage(),\r\n\t\tgetMaxVisibleAreaHeight: () => this.scrollableContainer.getHeight(),\r\n\t\tisScrollableContainerReady: () => this.scrollableContainer.isReady(),\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\tgetPreviouslyCalculatedLayout: () => this.previouslyCalculatedLayout\r\n\t})\r\n\r\n\tthis.resize = new Resize({\r\n\t\tbypass: this.bypass,\r\n\t\tgetWidth: () => this.scrollableContainer.getWidth(),\r\n\t\tgetHeight: () => this.scrollableContainer.getHeight(),\r\n\t\tlistenForResize: (listener) => this.scrollableContainer.onResize(listener),\r\n\t\tonResizeStart: () => {\r\n\t\t\tlog('~ Scrollable container resize started ~')\r\n\t\t\tthis._isResizing = true\r\n\t\t},\r\n\t\tonResizeStop: () => {\r\n\t\t\tlog('~ Scrollable container resize finished ~')\r\n\t\t\tthis._isResizing = undefined\r\n\t\t},\r\n\t\tonNoChange: () => {\r\n\t\t\t// There might have been some missed `this.onUpdateShownItemIndexes()` calls\r\n\t\t\t// due to setting `this._isResizing` flag to `true` during the resize.\r\n\t\t\t// So, update shown item indexes just in case.\r\n\t\t\tthis.onUpdateShownItemIndexes({\r\n\t\t\t\treason: LAYOUT_REASON.VIEWPORT_SIZE_UNCHANGED\r\n\t\t\t})\r\n\t\t},\r\n\t\tonHeightChange: () => this.onUpdateShownItemIndexes({\r\n\t\t\treason: LAYOUT_REASON.VIEWPORT_HEIGHT_CHANGED\r\n\t\t}),\r\n\t\tonWidthChange: (prevWidth, newWidth) => {\r\n\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\tthis.onResize()\r\n\t\t}\r\n\t})\r\n\r\n\tthis.scroll = new Scroll({\r\n\t\tbypass: this.bypass,\r\n\t\tscrollableContainer: this.scrollableContainer,\r\n\t\titemsContainer: this.itemsContainer,\r\n\t\twaitForScrollingToStop,\r\n\t\tonScroll: ({ delayed } = {}) => {\r\n\t\t\tthis.onUpdateShownItemIndexes({\r\n\t\t\t\treason: delayed ? LAYOUT_REASON.STOPPED_SCROLLING : LAYOUT_REASON.SCROLL\r\n\t\t\t})\r\n\t\t},\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tisImmediateLayoutScheduled: () => Boolean(this.layoutTimer),\r\n\t\thasNonRenderedItemsAtTheTop: () => this.getState().firstShownItemIndex > 0,\r\n\t\thasNonRenderedItemsAtTheBottom: () => this.getState().lastShownItemIndex < this.getItemsCount() - 1,\r\n\t\tgetLatestLayoutVisibleArea: () => this.latestLayoutVisibleArea,\r\n\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer,\r\n\t\tgetPrerenderMargin: () => this.getPrerenderMargin()\r\n\t})\r\n\r\n\tthis.listHeightMeasurement = new ListHeightMeasurement({\r\n\t\titemsContainer: this.itemsContainer,\r\n\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer\r\n\t})\r\n\r\n\tif (this.engine.watchListTopOffset) {\r\n\t\tthis.listTopOffsetWatcher = this.engine.watchListTopOffset({\r\n\t\t\tgetListTopOffset: this.getListTopOffsetInsideScrollableContainer,\r\n\t\t\tonListTopOffsetChange: ({ reason }) => this.onUpdateShownItemIndexes({\r\n\t\t\t\treason: LAYOUT_REASON.TOP_OFFSET_CHANGED\r\n\t\t\t})\r\n\t\t})\r\n\t}\r\n\r\n\tthis.beforeResize = new BeforeResize({\r\n\t\tgetState: this.getState,\r\n\t\tgetVerticalSpacing: this.getVerticalSpacing,\r\n\t\tgetColumnsCount: this.getColumnsCount\r\n\t})\r\n}"],"mappings":"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"}
|
|
@@ -82,7 +82,7 @@ var VirtualScroller = /*#__PURE__*/function () {
|
|
|
82
82
|
var isRestart = this._isActive === false;
|
|
83
83
|
|
|
84
84
|
if (!isRestart) {
|
|
85
|
-
// If no custom
|
|
85
|
+
// If no custom state storage has been configured, use the default one.
|
|
86
86
|
// Also sets the initial state.
|
|
87
87
|
if (!this._usesCustomStateStorage) {
|
|
88
88
|
this.useDefaultStateStorage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.js","names":["VirtualScrollerConstructor","hasTbodyStyles","addTbodyStyles","LAYOUT_REASON","log","VirtualScroller","getItemsContainerElement","items","options","_isActive","Error","resize","stop","scroll","listTopOffsetWatcher","isStarted","cancelLayoutTimer","hasToBeStarted","onUpdateShownItemIndexes","reason","MANUAL","_onRender","getState","previousState","call","isRestart","_usesCustomStateStorage","useDefaultStateStorage","_render","listHeightMeasurement","reset","_isResizing","undefined","_isSettingNewItems","tbody","stateUpdate","_stoppedStateUpdate","verticalSpacing","verticalSpacingStateUpdate","measureItemHeightsAndSpacing","start","scrollableContainerWidth","scrollableContainer","getWidth","newWidth","prevWidth","onResize","columnsCount","getActualColumnsCount","columnsCountFromState","STARTED","i","itemTopOffsetInList","layout","getItemTopOffset","getListTopOffsetInsideScrollableContainer","_onItemHeightChange","newItemState","_onItemStateChange","newItems","_setItems"],"sources":["../source/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerConstructor from './VirtualScroller.constructor.js'\r\nimport { hasTbodyStyles, addTbodyStyles } from './DOM/tbody.js'\r\nimport { LAYOUT_REASON } from './Layout.js'\r\nimport log from './utility/debug.js'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetItemsContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tVirtualScrollerConstructor.call(\r\n\t\t\tthis,\r\n\t\t\tgetItemsContainerElement,\r\n\t\t\titems,\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tstart() {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\t// If has been stopped previously.\r\n\t\tconst isRestart = this._isActive === false\r\n\r\n\t\tif (!isRestart) {\r\n\t\t\t// If no custom one has been configured, uses the default one.\r\n\t\t\t// Also sets the initial state.\r\n\t\t\tif (!this._usesCustomStateStorage) {\r\n\t\t\t\tthis.useDefaultStateStorage()\r\n\t\t\t}\r\n\t\t\t// If `render()` function parameter was passed,\r\n\t\t\t// perform an initial render.\r\n\t\t\tif (this._render) {\r\n\t\t\t\tthis._render(this.getState())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Start ~')\r\n\r\n\t\t// `this._isActive = true` should be placed somewhere at the start of this function.\r\n\t\tthis._isActive = true\r\n\r\n\t\t// Reset `ListHeightMeasurement` just in case it has some \"leftover\" state.\r\n\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t// Reset `_isResizing` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isResizing = undefined\r\n\r\n\t\t// Reset `_isSettingNewItems` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tif (!hasTbodyStyles(this.getItemsContainerElement())) {\r\n\t\t\t\taddTbodyStyles(this.getItemsContainerElement())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If there was a pending state update that didn't get applied\r\n\t\t// because of stopping the `VirtualScroller`, apply that state update now.\r\n\t\t//\r\n\t\t// The pending state update won't get applied if the scrollable container width\r\n\t\t// has changed but that's ok because that state update currently could only contain:\r\n\t\t// * `scrollableContainerWidth`\r\n\t\t// * `verticalSpacing`\r\n\t\t// * `beforeResize`\r\n\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t//\r\n\t\tlet stateUpdate = this._stoppedStateUpdate\r\n\t\tthis._stoppedStateUpdate = undefined\r\n\r\n\t\t// Reset `this.verticalSpacing` so that it re-measures it in cases when\r\n\t\t// the `VirtualScroller` was previously stopped and is now being restarted.\r\n\t\t// The rationale is that a previously captured inter-item vertical spacing\r\n\t\t// can't be \"trusted\" in a sense that the user might have resized the window\r\n\t\t// after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing after the restart.\r\n\t\t// If it's not a restart then `this.verticalSpacing` is `undefined` anyway.\r\n\t\tthis.verticalSpacing = undefined\r\n\r\n\t\tconst verticalSpacingStateUpdate = this.measureItemHeightsAndSpacing()\r\n\t\tif (verticalSpacingStateUpdate) {\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\t...verticalSpacingStateUpdate\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.resize.start()\r\n\t\tthis.scroll.start()\r\n\r\n\t\t// If `scrollableContainerWidth` hasn't been measured yet,\r\n\t\t// measure it and write it to state.\r\n\t\tif (this.getState().scrollableContainerWidth === undefined) {\r\n\t\t\tconst scrollableContainerWidth = this.scrollableContainer.getWidth()\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\tscrollableContainerWidth\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Reset layout:\r\n\t\t\t// * If the scrollable container width has changed while stopped.\r\n\t\t\t// * If the restored state was calculated for another scrollable container width.\r\n\t\t\tconst newWidth = this.scrollableContainer.getWidth()\r\n\t\t\tconst prevWidth = this.getState().scrollableContainerWidth\r\n\t\t\tif (newWidth !== prevWidth) {\r\n\t\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\t\t// `stateUpdate` doesn't get passed to `this.onResize()`, and, therefore,\r\n\t\t\t\t// won't be applied. But that's ok because currently it could only contain:\r\n\t\t\t\t// * `scrollableContainerWidth`\r\n\t\t\t\t// * `verticalSpacing`\r\n\t\t\t\t// * `beforeResize`\r\n\t\t\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the `VirtualScroller` uses custom (external) state storage, then\r\n\t\t// check if the columns count has changed between calling `.getInitialState()`\r\n\t\t// and `.start()`. If it has, perform a re-layout \"from scratch\".\r\n\t\tif (this._usesCustomStateStorage) {\r\n\t\t\tconst columnsCount = this.getActualColumnsCount()\r\n\t\t\tconst columnsCountFromState = this.getState().columnsCount || 1\r\n\t\t\tif (columnsCount !== columnsCountFromState) {\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Re-calculate layout and re-render the list.\r\n\t\t// Do that even if when an initial `state` parameter, containing layout values,\r\n\t\t// has been passed. The reason is that the `state` parameter can't be \"trusted\"\r\n\t\t// in a way that it could have been snapshotted for another window width and\r\n\t\t// the user might have resized their window since then.\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.STARTED, stateUpdate })\r\n\t}\r\n\r\n\t// Could be passed as a \"callback\" parameter, so bind it to `this`.\r\n\tstop = () => {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t stop a `VirtualScroller` that hasn\\'t been started')\r\n\t\t}\r\n\r\n\t\tthis._isActive = false\r\n\r\n\t\tlog('~ Stop ~')\r\n\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\r\n\t\t// Stop `ListTopOffsetWatcher` if it has been started.\r\n\t\t// There seems to be no need to restart `ListTopOffsetWatcher`.\r\n\t\t// It's mainly a hacky workaround for development mode anyway.\r\n\t\tif (this.listTopOffsetWatcher && this.listTopOffsetWatcher.isStarted()) {\r\n\t\t\tthis.listTopOffsetWatcher.stop()\r\n\t\t}\r\n\r\n\t\t// Cancel any scheduled layout.\r\n\t\tthis.cancelLayoutTimer({})\r\n\t}\r\n\r\n\thasToBeStarted() {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` hasn\\'t been started')\r\n\t\t}\r\n\t}\r\n\r\n\t// Bind it to `this` because this function could hypothetically be passed\r\n\t// as a \"callback\" parameter.\r\n\tupdateLayout = () => {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\t}\r\n\r\n\t// Bind the function to `this` so that it could be passed as a callback\r\n\t// in a random application's code.\r\n\tonRender = () => {\r\n\t\tthis._onRender(this.getState(), this.previousState)\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the scrollable container's top edge.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns the item's scroll Y position. Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemScrollPosition(i) {\r\n\t\tconst itemTopOffsetInList = this.layout.getItemTopOffset(i)\r\n\t\tif (itemTopOffsetInList === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\treturn this.getListTopOffsetInsideScrollableContainer() + itemTopOffsetInList\r\n\t}\r\n\r\n\t/**\r\n\t * Forces a re-measure of an item's height.\r\n\t * @param {number} i — Item index\r\n\t */\r\n\tonItemHeightChange(i) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemHeightChange(i)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates an item's state in `state.itemStates[]`.\r\n\t * @param {number} i — Item index\r\n\t * @param {any} i — Item's new state\r\n\t */\r\n\tonItemStateChange(i, newItemState) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemStateChange(i, newItemState)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\tthis.hasToBeStarted()\r\n\t\treturn this._setItems(newItems, options)\r\n\t}\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["VirtualScrollerConstructor","hasTbodyStyles","addTbodyStyles","LAYOUT_REASON","log","VirtualScroller","getItemsContainerElement","items","options","_isActive","Error","resize","stop","scroll","listTopOffsetWatcher","isStarted","cancelLayoutTimer","hasToBeStarted","onUpdateShownItemIndexes","reason","MANUAL","_onRender","getState","previousState","call","isRestart","_usesCustomStateStorage","useDefaultStateStorage","_render","listHeightMeasurement","reset","_isResizing","undefined","_isSettingNewItems","tbody","stateUpdate","_stoppedStateUpdate","verticalSpacing","verticalSpacingStateUpdate","measureItemHeightsAndSpacing","start","scrollableContainerWidth","scrollableContainer","getWidth","newWidth","prevWidth","onResize","columnsCount","getActualColumnsCount","columnsCountFromState","STARTED","i","itemTopOffsetInList","layout","getItemTopOffset","getListTopOffsetInsideScrollableContainer","_onItemHeightChange","newItemState","_onItemStateChange","newItems","_setItems"],"sources":["../source/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerConstructor from './VirtualScroller.constructor.js'\r\nimport { hasTbodyStyles, addTbodyStyles } from './DOM/tbody.js'\r\nimport { LAYOUT_REASON } from './Layout.js'\r\nimport log from './utility/debug.js'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetItemsContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tVirtualScrollerConstructor.call(\r\n\t\t\tthis,\r\n\t\t\tgetItemsContainerElement,\r\n\t\t\titems,\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tstart() {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\t// If has been stopped previously.\r\n\t\tconst isRestart = this._isActive === false\r\n\r\n\t\tif (!isRestart) {\r\n\t\t\t// If no custom state storage has been configured, use the default one.\r\n\t\t\t// Also sets the initial state.\r\n\t\t\tif (!this._usesCustomStateStorage) {\r\n\t\t\t\tthis.useDefaultStateStorage()\r\n\t\t\t}\r\n\t\t\t// If `render()` function parameter was passed,\r\n\t\t\t// perform an initial render.\r\n\t\t\tif (this._render) {\r\n\t\t\t\tthis._render(this.getState())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Start ~')\r\n\r\n\t\t// `this._isActive = true` should be placed somewhere at the start of this function.\r\n\t\tthis._isActive = true\r\n\r\n\t\t// Reset `ListHeightMeasurement` just in case it has some \"leftover\" state.\r\n\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t// Reset `_isResizing` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isResizing = undefined\r\n\r\n\t\t// Reset `_isSettingNewItems` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tif (!hasTbodyStyles(this.getItemsContainerElement())) {\r\n\t\t\t\taddTbodyStyles(this.getItemsContainerElement())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If there was a pending state update that didn't get applied\r\n\t\t// because of stopping the `VirtualScroller`, apply that state update now.\r\n\t\t//\r\n\t\t// The pending state update won't get applied if the scrollable container width\r\n\t\t// has changed but that's ok because that state update currently could only contain:\r\n\t\t// * `scrollableContainerWidth`\r\n\t\t// * `verticalSpacing`\r\n\t\t// * `beforeResize`\r\n\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t//\r\n\t\tlet stateUpdate = this._stoppedStateUpdate\r\n\t\tthis._stoppedStateUpdate = undefined\r\n\r\n\t\t// Reset `this.verticalSpacing` so that it re-measures it in cases when\r\n\t\t// the `VirtualScroller` was previously stopped and is now being restarted.\r\n\t\t// The rationale is that a previously captured inter-item vertical spacing\r\n\t\t// can't be \"trusted\" in a sense that the user might have resized the window\r\n\t\t// after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing after the restart.\r\n\t\t// If it's not a restart then `this.verticalSpacing` is `undefined` anyway.\r\n\t\tthis.verticalSpacing = undefined\r\n\r\n\t\tconst verticalSpacingStateUpdate = this.measureItemHeightsAndSpacing()\r\n\t\tif (verticalSpacingStateUpdate) {\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\t...verticalSpacingStateUpdate\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.resize.start()\r\n\t\tthis.scroll.start()\r\n\r\n\t\t// If `scrollableContainerWidth` hasn't been measured yet,\r\n\t\t// measure it and write it to state.\r\n\t\tif (this.getState().scrollableContainerWidth === undefined) {\r\n\t\t\tconst scrollableContainerWidth = this.scrollableContainer.getWidth()\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\tscrollableContainerWidth\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Reset layout:\r\n\t\t\t// * If the scrollable container width has changed while stopped.\r\n\t\t\t// * If the restored state was calculated for another scrollable container width.\r\n\t\t\tconst newWidth = this.scrollableContainer.getWidth()\r\n\t\t\tconst prevWidth = this.getState().scrollableContainerWidth\r\n\t\t\tif (newWidth !== prevWidth) {\r\n\t\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\t\t// `stateUpdate` doesn't get passed to `this.onResize()`, and, therefore,\r\n\t\t\t\t// won't be applied. But that's ok because currently it could only contain:\r\n\t\t\t\t// * `scrollableContainerWidth`\r\n\t\t\t\t// * `verticalSpacing`\r\n\t\t\t\t// * `beforeResize`\r\n\t\t\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the `VirtualScroller` uses custom (external) state storage, then\r\n\t\t// check if the columns count has changed between calling `.getInitialState()`\r\n\t\t// and `.start()`. If it has, perform a re-layout \"from scratch\".\r\n\t\tif (this._usesCustomStateStorage) {\r\n\t\t\tconst columnsCount = this.getActualColumnsCount()\r\n\t\t\tconst columnsCountFromState = this.getState().columnsCount || 1\r\n\t\t\tif (columnsCount !== columnsCountFromState) {\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Re-calculate layout and re-render the list.\r\n\t\t// Do that even if when an initial `state` parameter, containing layout values,\r\n\t\t// has been passed. The reason is that the `state` parameter can't be \"trusted\"\r\n\t\t// in a way that it could have been snapshotted for another window width and\r\n\t\t// the user might have resized their window since then.\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.STARTED, stateUpdate })\r\n\t}\r\n\r\n\t// Could be passed as a \"callback\" parameter, so bind it to `this`.\r\n\tstop = () => {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t stop a `VirtualScroller` that hasn\\'t been started')\r\n\t\t}\r\n\r\n\t\tthis._isActive = false\r\n\r\n\t\tlog('~ Stop ~')\r\n\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\r\n\t\t// Stop `ListTopOffsetWatcher` if it has been started.\r\n\t\t// There seems to be no need to restart `ListTopOffsetWatcher`.\r\n\t\t// It's mainly a hacky workaround for development mode anyway.\r\n\t\tif (this.listTopOffsetWatcher && this.listTopOffsetWatcher.isStarted()) {\r\n\t\t\tthis.listTopOffsetWatcher.stop()\r\n\t\t}\r\n\r\n\t\t// Cancel any scheduled layout.\r\n\t\tthis.cancelLayoutTimer({})\r\n\t}\r\n\r\n\thasToBeStarted() {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` hasn\\'t been started')\r\n\t\t}\r\n\t}\r\n\r\n\t// Bind it to `this` because this function could hypothetically be passed\r\n\t// as a \"callback\" parameter.\r\n\tupdateLayout = () => {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\t}\r\n\r\n\t// Bind the function to `this` so that it could be passed as a callback\r\n\t// in a random application's code.\r\n\tonRender = () => {\r\n\t\tthis._onRender(this.getState(), this.previousState)\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the scrollable container's top edge.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns the item's scroll Y position. Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemScrollPosition(i) {\r\n\t\tconst itemTopOffsetInList = this.layout.getItemTopOffset(i)\r\n\t\tif (itemTopOffsetInList === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\treturn this.getListTopOffsetInsideScrollableContainer() + itemTopOffsetInList\r\n\t}\r\n\r\n\t/**\r\n\t * Forces a re-measure of an item's height.\r\n\t * @param {number} i — Item index\r\n\t */\r\n\tonItemHeightChange(i) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemHeightChange(i)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates an item's state in `state.itemStates[]`.\r\n\t * @param {number} i — Item index\r\n\t * @param {any} i — Item's new state\r\n\t */\r\n\tonItemStateChange(i, newItemState) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemStateChange(i, newItemState)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\tthis.hasToBeStarted()\r\n\t\treturn this._setItems(newItems, options)\r\n\t}\r\n}"],"mappings":"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"}
|
|
@@ -164,7 +164,9 @@ export default function createStateHelpers(_ref) {
|
|
|
164
164
|
function getInitialStateFromScratch() {
|
|
165
165
|
var items = initialItems;
|
|
166
166
|
|
|
167
|
-
var state = _objectSpread(_objectSpread({}, getInitialLayoutState.call(this, items
|
|
167
|
+
var state = _objectSpread(_objectSpread({}, getInitialLayoutState.call(this, items, {
|
|
168
|
+
initialLayout: true
|
|
169
|
+
})), {}, {
|
|
168
170
|
items: items,
|
|
169
171
|
itemStates: new Array(items.length)
|
|
170
172
|
});
|
|
@@ -220,18 +222,30 @@ export default function createStateHelpers(_ref) {
|
|
|
220
222
|
columnsCount: this.getActualColumnsCount()
|
|
221
223
|
})) {
|
|
222
224
|
warn('Reset Layout');
|
|
223
|
-
state = _objectSpread(_objectSpread({}, state), getInitialLayoutState.call(this, state.items
|
|
225
|
+
state = _objectSpread(_objectSpread({}, state), getInitialLayoutState.call(this, state.items, {
|
|
226
|
+
initialLayout: false
|
|
227
|
+
}));
|
|
224
228
|
}
|
|
225
229
|
|
|
226
230
|
return state;
|
|
227
231
|
}
|
|
228
232
|
|
|
229
|
-
function getInitialLayoutState(items) {
|
|
233
|
+
function getInitialLayoutState(items, _ref3) {
|
|
234
|
+
var _this2 = this;
|
|
235
|
+
|
|
236
|
+
var initialLayout = _ref3.initialLayout;
|
|
230
237
|
var itemsCount = items.length;
|
|
231
238
|
|
|
239
|
+
var getColumnsCount = function getColumnsCount() {
|
|
240
|
+
return _this2.getActualColumnsCount();
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
var columnsCount = initialLayout ? this.layout.getInitialLayoutValueWithFallback('columnsCount', getColumnsCount, 1) : getColumnsCount();
|
|
244
|
+
|
|
232
245
|
var _this$layout$getIniti = this.layout.getInitialLayoutValues({
|
|
233
246
|
itemsCount: itemsCount,
|
|
234
|
-
columnsCount: this.getActualColumnsCount()
|
|
247
|
+
columnsCount: this.getActualColumnsCount(),
|
|
248
|
+
initialLayout: initialLayout
|
|
235
249
|
}),
|
|
236
250
|
firstShownItemIndex = _this$layout$getIniti.firstShownItemIndex,
|
|
237
251
|
lastShownItemIndex = _this$layout$getIniti.lastShownItemIndex,
|
|
@@ -263,8 +277,8 @@ export default function createStateHelpers(_ref) {
|
|
|
263
277
|
//
|
|
264
278
|
|
|
265
279
|
|
|
266
|
-
function isStateColumnsCountMismatch(state,
|
|
267
|
-
var columnsCount =
|
|
280
|
+
function isStateColumnsCountMismatch(state, _ref4) {
|
|
281
|
+
var columnsCount = _ref4.columnsCount;
|
|
268
282
|
var stateColumnsCount = state.columnsCount || 1;
|
|
269
283
|
|
|
270
284
|
if (stateColumnsCount !== columnsCount) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.state.js","names":["log","warn","isDebug","reportError","cleanUpBeforeResizeState","getStateSnapshot","createStateHelpers","state","onStateChange","render","initialItems","items","_render","_onItemStateChange","i","newItemState","JSON","stringify","getState","itemStates","newItemsWillBeRendered","itemStatesThatChangedWhileNewItemsWereBeingRendered","String","_getState","updateState","stateUpdate","_isSettingNewItems","undefined","previousState","_updateState","getInitialState","getRestoredState","call","getInitialStateFromScratch","useState","_isActive","Error","_usesCustomStateStorage","useDefaultStateStorage","defaultGetState","bind","defaultUpdateState","setInitialState","defaultSetInitialState","newState","onRender","getInitialLayoutState","Array","length","firstShownItemIndex","lastShownItemIndex","verticalSpacing","isStateColumnsCountMismatch","columnsCount","getActualColumnsCount","itemsCount","layout","getInitialLayoutValues","beforeItemsHeight","afterItemsHeight","itemHeights","onBeforeShowItems","getActualColumnsCountForState","stateColumnsCount","Math","floor"],"sources":["../source/VirtualScroller.state.js"],"sourcesContent":["import log, { warn, isDebug, reportError } from './utility/debug.js'\r\nimport { cleanUpBeforeResizeState } from './BeforeResize.js'\r\nimport getStateSnapshot from './utility/getStateSnapshot.js'\r\n\r\n// There're three main places where state is updated:\r\n//\r\n// * On scroll.\r\n// * On window resize.\r\n// * On set new items.\r\n//\r\n// State updates may be \"asynchronous\" (like in React), in which case the\r\n// corresponding operation is \"pending\" until the state update is applied.\r\n//\r\n// If there's a \"pending\" window resize or a \"pending\" update of the set of items,\r\n// then \"on scroll\" updates aren't dispatched.\r\n//\r\n// If there's a \"pending\" on scroll update and the window is resize or a new set\r\n// of items is set, then that \"pending\" on scroll update gets overwritten.\r\n//\r\n// If there's a \"pending\" update of the set of items, then window resize handler\r\n// sees that \"pending\" update and dispatches its own state update so that the\r\n// \"pending\" state update originating from `setItems()` is not lost.\r\n//\r\n// If there's a \"pending\" window resize, and a new set of items is set,\r\n// then the state update of the window resize handler gets overwritten.\r\n\r\nexport default function createStateHelpers({\r\n\tstate,\r\n\tonStateChange,\r\n\trender,\r\n\titems: initialItems\r\n}) {\r\n\tthis.onStateChange = onStateChange\r\n\tthis._render = render\r\n\r\n\tthis._onItemStateChange = (i, newItemState) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Item state changed ~')\r\n\t\t\tlog('Item', i)\r\n\t\t\t// Uses `JSON.stringify()` here instead of just outputting the JSON objects as is\r\n\t\t\t// because outputting JSON objects as is would show different results later when\r\n\t\t\t// the developer inspects those in the web browser console if those state objects\r\n\t\t\t// get modified in between they've been output to the console and the developer\r\n\t\t\t// decided to inspect them.\r\n\t\t\tlog('Previous state' + '\\n' + JSON.stringify(this.getState().itemStates[i], null, 2))\r\n\t\t\tlog('New state' + '\\n' + JSON.stringify(newItemState, null, 2))\r\n\t\t}\r\n\r\n\t\tthis.getState().itemStates[i] = newItemState\r\n\r\n\t\t// Schedule the item state update for after the new items have been rendered.\r\n\t\tif (this.newItemsWillBeRendered) {\r\n\t\t\tif (!this.itemStatesThatChangedWhileNewItemsWereBeingRendered) {\r\n\t\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered = {}\r\n\t\t\t}\r\n\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered[String(i)] = newItemState\r\n\t\t}\r\n\t}\r\n\r\n\tthis.getState = () => this._getState()\r\n\r\n\tthis.updateState = (stateUpdate) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Set state ~')\r\n\t\t\tlog(getStateSnapshot(stateUpdate))\r\n\t\t}\r\n\r\n\t\t// Ensure that a non-initial `stateUpdate` can only contain an `items`\r\n\t\t// property when it comes from a `setItems()` call.\r\n\t\tif (stateUpdate.items) {\r\n\t\t\tif (!this._isSettingNewItems) {\r\n\t\t\t\treportError('A `stateUpdate` can only contain `items` property as a result of calling `.setItems()`')\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Update `state`.\r\n\t\tthis.previousState = this.getState()\r\n\t\tthis._updateState(stateUpdate)\r\n\t}\r\n\r\n\tthis.getInitialState = () => {\r\n\t\tif (state) {\r\n\t\t\treturn getRestoredState.call(this, state)\r\n\t\t}\r\n\t\treturn getInitialStateFromScratch.call(this)\r\n\t}\r\n\r\n\tthis.useState = ({\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t}) => {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\tif (this._getState) {\r\n\t\t\tthrow new Error('[virtual-scroller] Custom state storage has already been configured')\r\n\t\t}\r\n\r\n\t\tif (render) {\r\n\t\t\tthrow new Error('[virtual-scroller] Creating a `VirtualScroller` class instance with a `render()` parameter means using the default (internal) state storage')\r\n\t\t}\r\n\r\n\t\tif (!getState || !updateState) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using a custom state storage, one must supply both `getState()` and `updateState()` functions')\r\n\t\t}\r\n\r\n\t\tthis._usesCustomStateStorage = true\r\n\r\n\t\tthis._getState = getState\r\n\t\tthis._updateState = updateState\r\n\t}\r\n\r\n\tthis.useDefaultStateStorage = () => {\r\n\t\tif (!render) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using the default (internal) state management, one must supply a `render(state, prevState)` function parameter')\r\n\t\t}\r\n\r\n\t\t// Create default `getState()`/`updateState()` functions.\r\n\t\tthis._getState = defaultGetState.bind(this)\r\n\t\tthis._updateState = defaultUpdateState.bind(this)\r\n\r\n\t\t// When `state` is stored externally, a developer is responsible for\r\n\t\t// initializing it with the initial value.\r\n\t\t// Otherwise, if default state management is used, set the initial state now.\r\n\t\tconst setInitialState = defaultSetInitialState.bind(this)\r\n\t\tsetInitialState(this.getInitialState())\r\n\t}\r\n\r\n\tfunction defaultGetState() {\r\n\t\treturn this.state\r\n\t}\r\n\r\n\tfunction defaultSetInitialState(newState) {\r\n\t\tthis.state = newState\r\n\t}\r\n\r\n\tfunction defaultUpdateState(stateUpdate) {\r\n\t\t// Because this variant of `.updateState()` is \"synchronous\" (immediate),\r\n\t\t// it can be written like `...prevState`, and no state updates would be lost.\r\n\t\t// But if it was \"asynchronous\" (not immediate), then `...prevState`\r\n\t\t// wouldn't work in all cases, because it could be stale in cases\r\n\t\t// when more than a single `updateState()` call is made before\r\n\t\t// the state actually updates, making `prevState` stale.\r\n\t\tthis.state = {\r\n\t\t\t...this.state,\r\n\t\t\t...stateUpdate\r\n\t\t}\r\n\r\n\t\trender(this.state, this.previousState)\r\n\r\n\t\tthis.onRender()\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the initial state of the `VirtualScroller` \"from scratch\".\r\n\t * (i.e. not from a previously saved one).\r\n\t * @return {object}\r\n\t */\r\n\tfunction getInitialStateFromScratch() {\r\n\t\tconst items = initialItems\r\n\t\tconst state = {\r\n\t\t\t...getInitialLayoutState.call(this, items),\r\n\t\t\titems,\r\n\t\t\titemStates: new Array(items.length)\r\n\t\t}\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Initial state (autogenerated)', getStateSnapshot(state))\r\n\t\t}\r\n\t\tlog('First shown item index', state.firstShownItemIndex)\r\n\t\tlog('Last shown item index', state.lastShownItemIndex)\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getRestoredState(state) {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Restore state', getStateSnapshot(state))\r\n\t\t}\r\n\r\n\t\t// Possibly clean up \"before resize\" property in state.\r\n\t\t// \"Before resize\" state property is cleaned up when all \"before resize\" item heights\r\n\t\t// have been re-measured in an asynchronous `this.updateState({ beforeResize: undefined })` call.\r\n\t\t// If `VirtualScroller` state was snapshotted externally before that `this.updateState()` call\r\n\t\t// has been applied, then \"before resize\" property might have not been cleaned up properly.\r\n\t\tstate = cleanUpBeforeResizeState(state)\r\n\r\n\t\t// Reset `verticalSpacing` so that it re-measures it after the list\r\n\t\t// has been rendered initially. The rationale is that a previously captured\r\n\t\t// inter-item vertical spacing can't be \"trusted\" in a sense that the user\r\n\t\t// might have resized the window after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing when the `VirtualScroller` is re-created with such previously\r\n\t\t// snapshotted state.\r\n\t\tstate = {\r\n\t\t\t...state,\r\n\t\t\tverticalSpacing: undefined\r\n\t\t}\r\n\r\n\t\t// `this.verticalSpacing` acts as a \"true\" source for vertical spacing value.\r\n\t\t// Vertical spacing is also stored in `state` but `state` updates could be\r\n\t\t// \"asynchronous\" (not applied immediately) and `this.onUpdateShownItemIndexes()`\r\n\t\t// requires vertical spacing to be correct at any time, without any delays.\r\n\t\t// So, vertical spacing is also duplicated in `state`, but the \"true\" source\r\n\t\t// is still `this.verticalSpacing`.\r\n\t\t//\r\n\t\t// `this.verticalSpacing` must be initialized before calling `this.getInitialStateFromScratch()`\r\n\t\t// because `this.getInitialStateFromScratch()` uses `this.verticalSpacing` in its calculations.\r\n\t\t//\r\n\t\t// With the code above, `state.verticalSpacing` is always gonna be `undefined`,\r\n\t\t// so commented out this code. It's safer to just re-measure vertical spacing\r\n\t\t// from scratch when `VirtualScroller` is mounted.\r\n\t\t//\r\n\t\t// this.verticalSpacing = state ? state.verticalSpacing : undefined\r\n\r\n\t\t// Check if the actual `columnsCount` on the screen matches the one from state.\r\n\t\tif (isStateColumnsCountMismatch(state, {\r\n\t\t\tcolumnsCount: this.getActualColumnsCount()\r\n\t\t})) {\r\n\t\t\twarn('Reset Layout')\r\n\t\t\tstate = {\r\n\t\t\t\t...state,\r\n\t\t\t\t...getInitialLayoutState.call(this, state.items)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getInitialLayoutState(items) {\r\n\t\tconst itemsCount = items.length\r\n\t\tconst {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t} = this.layout.getInitialLayoutValues({\r\n\t\t\titemsCount,\r\n\t\t\tcolumnsCount: this.getActualColumnsCount()\r\n\t\t})\r\n\t\tconst itemHeights = new Array(itemsCount)\r\n\t\t// Optionally preload items to be rendered.\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\titems,\r\n\t\t\titemHeights,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t)\r\n\t\treturn {\r\n\t\t\titemHeights,\r\n\t\t\tcolumnsCount: this.getActualColumnsCountForState(),\r\n\t\t\tverticalSpacing: this.verticalSpacing,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t}\r\n\t}\r\n\r\n\t// Checks if the actual `columnsCount` on the screen matches the one from state.\r\n\t//\r\n\t// For example, a developer might snapshot `VirtualScroller` state\r\n\t// when the user navigates from the page containing the list\r\n\t// in order to later restore the list's state when the user goes \"Back\".\r\n\t// But, the user might have also resized the window while being on that\r\n\t// \"other\" page, and when they come \"Back\", their snapshotted state\r\n\t// no longer qualifies. Well, it does qualify, but only partially.\r\n\t// For example, `itemStates` are still valid, but first and last shown\r\n\t// item indexes aren't.\r\n\t//\r\n\tfunction isStateColumnsCountMismatch(state, { columnsCount }) {\r\n\t\tconst stateColumnsCount = state.columnsCount || 1\r\n\t\tif (stateColumnsCount !== columnsCount) {\r\n\t\t\twarn('~ Columns Count changed from', stateColumnsCount, 'to', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t\tconst firstShownItemIndex = Math.floor(state.firstShownItemIndex / columnsCount) * columnsCount\r\n\t\tif (firstShownItemIndex !== state.firstShownItemIndex) {\r\n\t\t\twarn('~ First Shown Item Index', state.firstShownItemIndex, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t}\r\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.state.js","names":["log","warn","isDebug","reportError","cleanUpBeforeResizeState","getStateSnapshot","createStateHelpers","state","onStateChange","render","initialItems","items","_render","_onItemStateChange","i","newItemState","JSON","stringify","getState","itemStates","newItemsWillBeRendered","itemStatesThatChangedWhileNewItemsWereBeingRendered","String","_getState","updateState","stateUpdate","_isSettingNewItems","undefined","previousState","_updateState","getInitialState","getRestoredState","call","getInitialStateFromScratch","useState","_isActive","Error","_usesCustomStateStorage","useDefaultStateStorage","defaultGetState","bind","defaultUpdateState","setInitialState","defaultSetInitialState","newState","onRender","getInitialLayoutState","initialLayout","Array","length","firstShownItemIndex","lastShownItemIndex","verticalSpacing","isStateColumnsCountMismatch","columnsCount","getActualColumnsCount","itemsCount","getColumnsCount","layout","getInitialLayoutValueWithFallback","getInitialLayoutValues","beforeItemsHeight","afterItemsHeight","itemHeights","onBeforeShowItems","getActualColumnsCountForState","stateColumnsCount","Math","floor"],"sources":["../source/VirtualScroller.state.js"],"sourcesContent":["import log, { warn, isDebug, reportError } from './utility/debug.js'\r\nimport { cleanUpBeforeResizeState } from './BeforeResize.js'\r\nimport getStateSnapshot from './utility/getStateSnapshot.js'\r\n\r\n// There're three main places where state is updated:\r\n//\r\n// * On scroll.\r\n// * On window resize.\r\n// * On set new items.\r\n//\r\n// State updates may be \"asynchronous\" (like in React), in which case the\r\n// corresponding operation is \"pending\" until the state update is applied.\r\n//\r\n// If there's a \"pending\" window resize or a \"pending\" update of the set of items,\r\n// then \"on scroll\" updates aren't dispatched.\r\n//\r\n// If there's a \"pending\" on scroll update and the window is resize or a new set\r\n// of items is set, then that \"pending\" on scroll update gets overwritten.\r\n//\r\n// If there's a \"pending\" update of the set of items, then window resize handler\r\n// sees that \"pending\" update and dispatches its own state update so that the\r\n// \"pending\" state update originating from `setItems()` is not lost.\r\n//\r\n// If there's a \"pending\" window resize, and a new set of items is set,\r\n// then the state update of the window resize handler gets overwritten.\r\n\r\nexport default function createStateHelpers({\r\n\tstate,\r\n\tonStateChange,\r\n\trender,\r\n\titems: initialItems\r\n}) {\r\n\tthis.onStateChange = onStateChange\r\n\tthis._render = render\r\n\r\n\tthis._onItemStateChange = (i, newItemState) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Item state changed ~')\r\n\t\t\tlog('Item', i)\r\n\t\t\t// Uses `JSON.stringify()` here instead of just outputting the JSON objects as is\r\n\t\t\t// because outputting JSON objects as is would show different results later when\r\n\t\t\t// the developer inspects those in the web browser console if those state objects\r\n\t\t\t// get modified in between they've been output to the console and the developer\r\n\t\t\t// decided to inspect them.\r\n\t\t\tlog('Previous state' + '\\n' + JSON.stringify(this.getState().itemStates[i], null, 2))\r\n\t\t\tlog('New state' + '\\n' + JSON.stringify(newItemState, null, 2))\r\n\t\t}\r\n\r\n\t\tthis.getState().itemStates[i] = newItemState\r\n\r\n\t\t// Schedule the item state update for after the new items have been rendered.\r\n\t\tif (this.newItemsWillBeRendered) {\r\n\t\t\tif (!this.itemStatesThatChangedWhileNewItemsWereBeingRendered) {\r\n\t\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered = {}\r\n\t\t\t}\r\n\t\t\tthis.itemStatesThatChangedWhileNewItemsWereBeingRendered[String(i)] = newItemState\r\n\t\t}\r\n\t}\r\n\r\n\tthis.getState = () => this._getState()\r\n\r\n\tthis.updateState = (stateUpdate) => {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Set state ~')\r\n\t\t\tlog(getStateSnapshot(stateUpdate))\r\n\t\t}\r\n\r\n\t\t// Ensure that a non-initial `stateUpdate` can only contain an `items`\r\n\t\t// property when it comes from a `setItems()` call.\r\n\t\tif (stateUpdate.items) {\r\n\t\t\tif (!this._isSettingNewItems) {\r\n\t\t\t\treportError('A `stateUpdate` can only contain `items` property as a result of calling `.setItems()`')\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Update `state`.\r\n\t\tthis.previousState = this.getState()\r\n\t\tthis._updateState(stateUpdate)\r\n\t}\r\n\r\n\tthis.getInitialState = () => {\r\n\t\tif (state) {\r\n\t\t\treturn getRestoredState.call(this, state)\r\n\t\t}\r\n\t\treturn getInitialStateFromScratch.call(this)\r\n\t}\r\n\r\n\tthis.useState = ({\r\n\t\tgetState,\r\n\t\tupdateState\r\n\t}) => {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\tif (this._getState) {\r\n\t\t\tthrow new Error('[virtual-scroller] Custom state storage has already been configured')\r\n\t\t}\r\n\r\n\t\tif (render) {\r\n\t\t\tthrow new Error('[virtual-scroller] Creating a `VirtualScroller` class instance with a `render()` parameter means using the default (internal) state storage')\r\n\t\t}\r\n\r\n\t\tif (!getState || !updateState) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using a custom state storage, one must supply both `getState()` and `updateState()` functions')\r\n\t\t}\r\n\r\n\t\tthis._usesCustomStateStorage = true\r\n\r\n\t\tthis._getState = getState\r\n\t\tthis._updateState = updateState\r\n\t}\r\n\r\n\tthis.useDefaultStateStorage = () => {\r\n\t\tif (!render) {\r\n\t\t\tthrow new Error('[virtual-scroller] When using the default (internal) state management, one must supply a `render(state, prevState)` function parameter')\r\n\t\t}\r\n\r\n\t\t// Create default `getState()`/`updateState()` functions.\r\n\t\tthis._getState = defaultGetState.bind(this)\r\n\t\tthis._updateState = defaultUpdateState.bind(this)\r\n\r\n\t\t// When `state` is stored externally, a developer is responsible for\r\n\t\t// initializing it with the initial value.\r\n\t\t// Otherwise, if default state management is used, set the initial state now.\r\n\t\tconst setInitialState = defaultSetInitialState.bind(this)\r\n\t\tsetInitialState(this.getInitialState())\r\n\t}\r\n\r\n\tfunction defaultGetState() {\r\n\t\treturn this.state\r\n\t}\r\n\r\n\tfunction defaultSetInitialState(newState) {\r\n\t\tthis.state = newState\r\n\t}\r\n\r\n\tfunction defaultUpdateState(stateUpdate) {\r\n\t\t// Because this variant of `.updateState()` is \"synchronous\" (immediate),\r\n\t\t// it can be written like `...prevState`, and no state updates would be lost.\r\n\t\t// But if it was \"asynchronous\" (not immediate), then `...prevState`\r\n\t\t// wouldn't work in all cases, because it could be stale in cases\r\n\t\t// when more than a single `updateState()` call is made before\r\n\t\t// the state actually updates, making `prevState` stale.\r\n\t\tthis.state = {\r\n\t\t\t...this.state,\r\n\t\t\t...stateUpdate\r\n\t\t}\r\n\r\n\t\trender(this.state, this.previousState)\r\n\r\n\t\tthis.onRender()\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the initial state of the `VirtualScroller` \"from scratch\".\r\n\t * (i.e. not from a previously saved one).\r\n\t * @return {object}\r\n\t */\r\n\tfunction getInitialStateFromScratch() {\r\n\t\tconst items = initialItems\r\n\t\tconst state = {\r\n\t\t\t...getInitialLayoutState.call(this, items, { initialLayout: true }),\r\n\t\t\titems,\r\n\t\t\titemStates: new Array(items.length)\r\n\t\t}\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Initial state (autogenerated)', getStateSnapshot(state))\r\n\t\t}\r\n\t\tlog('First shown item index', state.firstShownItemIndex)\r\n\t\tlog('Last shown item index', state.lastShownItemIndex)\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getRestoredState(state) {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Restore state', getStateSnapshot(state))\r\n\t\t}\r\n\r\n\t\t// Possibly clean up \"before resize\" property in state.\r\n\t\t// \"Before resize\" state property is cleaned up when all \"before resize\" item heights\r\n\t\t// have been re-measured in an asynchronous `this.updateState({ beforeResize: undefined })` call.\r\n\t\t// If `VirtualScroller` state was snapshotted externally before that `this.updateState()` call\r\n\t\t// has been applied, then \"before resize\" property might have not been cleaned up properly.\r\n\t\tstate = cleanUpBeforeResizeState(state)\r\n\r\n\t\t// Reset `verticalSpacing` so that it re-measures it after the list\r\n\t\t// has been rendered initially. The rationale is that a previously captured\r\n\t\t// inter-item vertical spacing can't be \"trusted\" in a sense that the user\r\n\t\t// might have resized the window after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing when the `VirtualScroller` is re-created with such previously\r\n\t\t// snapshotted state.\r\n\t\tstate = {\r\n\t\t\t...state,\r\n\t\t\tverticalSpacing: undefined\r\n\t\t}\r\n\r\n\t\t// `this.verticalSpacing` acts as a \"true\" source for vertical spacing value.\r\n\t\t// Vertical spacing is also stored in `state` but `state` updates could be\r\n\t\t// \"asynchronous\" (not applied immediately) and `this.onUpdateShownItemIndexes()`\r\n\t\t// requires vertical spacing to be correct at any time, without any delays.\r\n\t\t// So, vertical spacing is also duplicated in `state`, but the \"true\" source\r\n\t\t// is still `this.verticalSpacing`.\r\n\t\t//\r\n\t\t// `this.verticalSpacing` must be initialized before calling `this.getInitialStateFromScratch()`\r\n\t\t// because `this.getInitialStateFromScratch()` uses `this.verticalSpacing` in its calculations.\r\n\t\t//\r\n\t\t// With the code above, `state.verticalSpacing` is always gonna be `undefined`,\r\n\t\t// so commented out this code. It's safer to just re-measure vertical spacing\r\n\t\t// from scratch when `VirtualScroller` is mounted.\r\n\t\t//\r\n\t\t// this.verticalSpacing = state ? state.verticalSpacing : undefined\r\n\r\n\t\t// Check if the actual `columnsCount` on the screen matches the one from state.\r\n\t\tif (isStateColumnsCountMismatch(state, {\r\n\t\t\tcolumnsCount: this.getActualColumnsCount()\r\n\t\t})) {\r\n\t\t\twarn('Reset Layout')\r\n\t\t\tstate = {\r\n\t\t\t\t...state,\r\n\t\t\t\t...getInitialLayoutState.call(this, state.items, { initialLayout: false })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn state\r\n\t}\r\n\r\n\tfunction getInitialLayoutState(items, { initialLayout }) {\r\n\t\tconst itemsCount = items.length\r\n\r\n\t\tconst getColumnsCount = () => this.getActualColumnsCount()\r\n\r\n\t\tconst columnsCount = initialLayout\r\n\t\t\t? this.layout.getInitialLayoutValueWithFallback(\r\n\t\t\t\t'columnsCount',\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\t1\r\n\t\t\t)\r\n\t\t\t: getColumnsCount()\r\n\r\n\t\tconst {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t} = this.layout.getInitialLayoutValues({\r\n\t\t\titemsCount,\r\n\t\t\tcolumnsCount: this.getActualColumnsCount(),\r\n\t\t\tinitialLayout\r\n\t\t})\r\n\r\n\t\tconst itemHeights = new Array(itemsCount)\r\n\r\n\t\t// Optionally preload items to be rendered.\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\titems,\r\n\t\t\titemHeights,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t)\r\n\r\n\t\treturn {\r\n\t\t\titemHeights,\r\n\t\t\tcolumnsCount: this.getActualColumnsCountForState(),\r\n\t\t\tverticalSpacing: this.verticalSpacing,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t}\r\n\t}\r\n\r\n\t// Checks if the actual `columnsCount` on the screen matches the one from state.\r\n\t//\r\n\t// For example, a developer might snapshot `VirtualScroller` state\r\n\t// when the user navigates from the page containing the list\r\n\t// in order to later restore the list's state when the user goes \"Back\".\r\n\t// But, the user might have also resized the window while being on that\r\n\t// \"other\" page, and when they come \"Back\", their snapshotted state\r\n\t// no longer qualifies. Well, it does qualify, but only partially.\r\n\t// For example, `itemStates` are still valid, but first and last shown\r\n\t// item indexes aren't.\r\n\t//\r\n\tfunction isStateColumnsCountMismatch(state, { columnsCount }) {\r\n\t\tconst stateColumnsCount = state.columnsCount || 1\r\n\t\tif (stateColumnsCount !== columnsCount) {\r\n\t\t\twarn('~ Columns Count changed from', stateColumnsCount, 'to', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t\tconst firstShownItemIndex = Math.floor(state.firstShownItemIndex / columnsCount) * columnsCount\r\n\t\tif (firstShownItemIndex !== state.firstShownItemIndex) {\r\n\t\t\twarn('~ First Shown Item Index', state.firstShownItemIndex, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\treturn true\r\n\t\t}\r\n\t}\r\n}"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var _excluded = ["as", "items", "itemComponent", "itemComponentProps", "estimatedItemHeight", "bypass", "tbody", "preserveScrollPosition", "preserveScrollPositionOnPrependItems", "measureItemsBatchSize", "scrollableContainer", "getScrollableContainer", "getColumnsCount", "getItemId", "className", "onMount", "onItemFirstRender", "onItemInitialRender", "initialScrollPosition", "onScrollPositionChange", "onStateChange", "initialState"];
|
|
1
|
+
var _excluded = ["as", "items", "itemComponent", "itemComponentProps", "estimatedItemHeight", "getEstimatedItemHeight", "getEstimatedVisibleItemRowsCount", "bypass", "tbody", "preserveScrollPosition", "preserveScrollPositionOnPrependItems", "measureItemsBatchSize", "scrollableContainer", "getScrollableContainer", "getColumnsCount", "getItemId", "className", "onMount", "onItemFirstRender", "onItemInitialRender", "initialScrollPosition", "onScrollPositionChange", "onStateChange", "initialState"];
|
|
2
2
|
|
|
3
3
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
4
4
|
|
|
@@ -25,6 +25,8 @@ function VirtualScroller(_ref, ref) {
|
|
|
25
25
|
Component = _ref.itemComponent,
|
|
26
26
|
itemComponentProps = _ref.itemComponentProps,
|
|
27
27
|
estimatedItemHeight = _ref.estimatedItemHeight,
|
|
28
|
+
getEstimatedItemHeight = _ref.getEstimatedItemHeight,
|
|
29
|
+
getEstimatedVisibleItemRowsCount = _ref.getEstimatedVisibleItemRowsCount,
|
|
28
30
|
bypass = _ref.bypass,
|
|
29
31
|
tbody = _ref.tbody,
|
|
30
32
|
preserveScrollPosition = _ref.preserveScrollPosition,
|
|
@@ -49,7 +51,11 @@ function VirtualScroller(_ref, ref) {
|
|
|
49
51
|
|
|
50
52
|
var virtualScroller = useVirtualScroller({
|
|
51
53
|
items: items,
|
|
54
|
+
// `estimatedItemHeight` property name is deprecated,
|
|
55
|
+
// use `getEstimatedItemHeight` property instead.
|
|
52
56
|
estimatedItemHeight: estimatedItemHeight,
|
|
57
|
+
getEstimatedItemHeight: getEstimatedItemHeight,
|
|
58
|
+
getEstimatedVisibleItemRowsCount: getEstimatedVisibleItemRowsCount,
|
|
53
59
|
bypass: bypass,
|
|
54
60
|
// bypassBatchSize,
|
|
55
61
|
tbody: tbody,
|
|
@@ -74,7 +80,8 @@ function VirtualScroller(_ref, ref) {
|
|
|
74
80
|
|
|
75
81
|
var _initialState = useMemo(function () {
|
|
76
82
|
return virtualScroller.getInitialState();
|
|
77
|
-
}, []); //
|
|
83
|
+
}, []); // Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.
|
|
84
|
+
// This way, React will re-render the component on every state update.
|
|
78
85
|
|
|
79
86
|
|
|
80
87
|
var _useState = useState({
|
|
@@ -170,7 +177,14 @@ function VirtualScroller(_ref, ref) {
|
|
|
170
177
|
style: style
|
|
171
178
|
}), renderedItems.map(function (item, i) {
|
|
172
179
|
if (i >= firstShownItemIndex && i <= lastShownItemIndex) {
|
|
173
|
-
|
|
180
|
+
// Passing `item` as `children` property is legacy and is deprecated.
|
|
181
|
+
// If version `2.x` is published in some hypothetical future,
|
|
182
|
+
// the `item` and `itemIndex` properties should be moved below
|
|
183
|
+
// `{...itemComponentProps}`.
|
|
184
|
+
return /*#__PURE__*/React.createElement(Component, _extends({
|
|
185
|
+
item: item,
|
|
186
|
+
itemIndex: i
|
|
187
|
+
}, itemComponentProps, {
|
|
174
188
|
key: getItemKey(item, i),
|
|
175
189
|
state: itemStates && itemStates[i],
|
|
176
190
|
onStateChange: getOnItemStateChange(i),
|
|
@@ -192,7 +206,11 @@ VirtualScroller.propTypes = {
|
|
|
192
206
|
items: PropTypes.arrayOf(PropTypes.any).isRequired,
|
|
193
207
|
itemComponent: elementType.isRequired,
|
|
194
208
|
itemComponentProps: PropTypes.object,
|
|
209
|
+
// `estimatedItemHeight` property name is deprecated,
|
|
210
|
+
// use `getEstimatedItemHeight` property instead.
|
|
195
211
|
estimatedItemHeight: PropTypes.number,
|
|
212
|
+
getEstimatedItemHeight: PropTypes.func,
|
|
213
|
+
getEstimatedVisibleItemRowsCount: PropTypes.func,
|
|
196
214
|
bypass: PropTypes.bool,
|
|
197
215
|
// bypassBatchSize: PropTypes.number,
|
|
198
216
|
tbody: PropTypes.bool,
|