virtual-scroller 1.15.0 → 1.15.2
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 +6 -0
- package/README.md +98 -8
- package/bundle/index-dom-bypass.html +3 -4
- package/bundle/index-dom-grid.html +3 -4
- package/bundle/index-dom-scrollableContainer.html +3 -4
- package/bundle/index-dom.html +3 -4
- package/bundle/index-react-bypass.html +56 -62
- package/bundle/index-react-grid.html +55 -61
- package/bundle/index-react-hook.html +209 -0
- package/bundle/index-react-scrollableContainer.html +56 -62
- package/bundle/index-react-strictMode.html +55 -61
- package/bundle/index-react-tbody-scrollableContainer.html +13 -15
- package/bundle/index-react-tbody.html +10 -12
- 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/VirtualScroller.constructor.js +3 -1
- package/commonjs/VirtualScroller.constructor.js.map +1 -1
- package/commonjs/VirtualScroller.items.js +19 -0
- package/commonjs/VirtualScroller.items.js.map +1 -1
- package/commonjs/react/VirtualScroller.js +69 -127
- package/commonjs/react/VirtualScroller.js.map +1 -1
- package/commonjs/react/useCreateVirtualScroller.js +64 -0
- package/commonjs/react/useCreateVirtualScroller.js.map +1 -0
- package/commonjs/react/useInstanceMethods.js +2 -2
- package/commonjs/react/useInstanceMethods.js.map +1 -1
- package/commonjs/react/useMergeRefs.js +52 -0
- package/commonjs/react/useMergeRefs.js.map +1 -0
- package/commonjs/react/{useVirtualScrollerStartStop.js → useStartStopVirtualScroller.js} +1 -1
- package/commonjs/react/{useVirtualScrollerStartStop.js.map → useStartStopVirtualScroller.js.map} +1 -1
- package/commonjs/react/useStyle.js +18 -0
- package/commonjs/react/useStyle.js.map +1 -1
- package/commonjs/react/useVirtualScroller.js +142 -43
- package/commonjs/react/useVirtualScroller.js.map +1 -1
- package/commonjs/test/VirtualScroller.js +17 -1
- package/commonjs/test/VirtualScroller.js.map +1 -1
- package/modules/VirtualScroller.constructor.js +3 -1
- package/modules/VirtualScroller.constructor.js.map +1 -1
- package/modules/VirtualScroller.items.js +19 -0
- package/modules/VirtualScroller.items.js.map +1 -1
- package/modules/react/VirtualScroller.js +68 -119
- package/modules/react/VirtualScroller.js.map +1 -1
- package/modules/react/useCreateVirtualScroller.js +53 -0
- package/modules/react/useCreateVirtualScroller.js.map +1 -0
- package/modules/react/useInstanceMethods.js +2 -2
- package/modules/react/useInstanceMethods.js.map +1 -1
- package/modules/react/useMergeRefs.js +44 -0
- package/modules/react/useMergeRefs.js.map +1 -0
- package/modules/react/{useVirtualScrollerStartStop.js → useStartStopVirtualScroller.js} +1 -1
- package/modules/react/{useVirtualScrollerStartStop.js.map → useStartStopVirtualScroller.js.map} +1 -1
- package/modules/react/useStyle.js +17 -0
- package/modules/react/useStyle.js.map +1 -1
- package/modules/react/useVirtualScroller.js +136 -43
- package/modules/react/useVirtualScroller.js.map +1 -1
- package/modules/test/VirtualScroller.js +17 -1
- package/modules/test/VirtualScroller.js.map +1 -1
- package/package.json +4 -1
- package/react/index.cjs +2 -1
- package/react/index.d.ts +51 -7
- package/react/index.js +1 -0
- package/rollup.config.mjs +15 -1
- package/source/VirtualScroller.constructor.js +3 -0
- package/source/VirtualScroller.items.js +14 -0
- package/source/react/VirtualScroller.js +66 -127
- package/source/react/useCreateVirtualScroller.js +65 -0
- package/source/react/useInstanceMethods.js +2 -2
- package/source/react/useMergeRefs.js +45 -0
- package/source/react/useStyle.js +15 -0
- package/source/react/useVirtualScroller.js +155 -48
- package/source/test/VirtualScroller.js +11 -1
- package/website/index-dom-bypass.html +3 -4
- package/website/index-dom-grid.html +3 -4
- package/website/index-dom-scrollableContainer.html +3 -4
- package/website/index-dom.html +3 -4
- package/website/index-react-bypass.html +56 -62
- package/website/index-react-grid.html +55 -61
- package/website/index-react-hook.html +209 -0
- package/website/index-react-scrollableContainer.html +56 -62
- package/website/index-react-strictMode.html +55 -61
- package/website/index-react-tbody-scrollableContainer.html +13 -15
- package/website/index-react-tbody.html +10 -12
- package/website/index-react.html +55 -61
- package/website/index.html +55 -61
- package/commonjs/react/useForwardedRef.js +0 -50
- package/commonjs/react/useForwardedRef.js.map +0 -1
- package/modules/react/useForwardedRef.js +0 -42
- package/modules/react/useForwardedRef.js.map +0 -1
- package/source/react/useForwardedRef.js +0 -39
- /package/source/react/{useVirtualScrollerStartStop.js → useStartStopVirtualScroller.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStyle.js","names":["px","useStyle","style","tbody","state","
|
|
1
|
+
{"version":3,"file":"useStyle.js","names":["px","reportError","useStyle","style","tbody","state","padding","paddingTop","paddingBottom","beforeItemsHeight","afterItemsHeight"],"sources":["../../source/react/useStyle.js"],"sourcesContent":["import px from '../utility/px.js'\r\nimport { reportError } from '../utility/debug.js'\r\n\r\nexport default function useStyle(style, {\r\n\ttbody,\r\n\tstate\r\n}) {\r\n\tif (tbody) {\r\n\t\treturn style\r\n\t}\r\n\r\n\t// Validate that the passed `style` property doesn't include\r\n\t// `padding-top` or `padding-bottom` or `padding`.\r\n\tif (style) {\r\n\t\tif (typeof style.padding === 'number') {\r\n\t\t\treportError('`style` property can\\'t include any `padding`')\r\n\t\t}\r\n\t\tif (typeof style.paddingTop === 'number') {\r\n\t\t\treportError('`style` property can\\'t include any `paddingTop`')\r\n\t\t}\r\n\t\tif (typeof style.paddingBottom === 'number') {\r\n\t\t\treportError('`style` property can\\'t include any `paddingBottom`')\r\n\t\t}\r\n\t}\r\n\r\n\tconst {\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t} = state\r\n\r\n\treturn {\r\n\t\t...style,\r\n\t\tpaddingTop: px(beforeItemsHeight),\r\n\t\tpaddingBottom: px(afterItemsHeight)\r\n\t}\r\n}"],"mappings":";;;;;;AAAA,OAAOA,EAAP,MAAe,kBAAf;AACA,SAASC,WAAT,QAA4B,qBAA5B;AAEA,eAAe,SAASC,QAAT,CAAkBC,KAAlB,QAGZ;EAAA,IAFFC,KAEE,QAFFA,KAEE;EAAA,IADFC,KACE,QADFA,KACE;;EACF,IAAID,KAAJ,EAAW;IACV,OAAOD,KAAP;EACA,CAHC,CAKF;EACA;;;EACA,IAAIA,KAAJ,EAAW;IACV,IAAI,OAAOA,KAAK,CAACG,OAAb,KAAyB,QAA7B,EAAuC;MACtCL,WAAW,CAAC,+CAAD,CAAX;IACA;;IACD,IAAI,OAAOE,KAAK,CAACI,UAAb,KAA4B,QAAhC,EAA0C;MACzCN,WAAW,CAAC,kDAAD,CAAX;IACA;;IACD,IAAI,OAAOE,KAAK,CAACK,aAAb,KAA+B,QAAnC,EAA6C;MAC5CP,WAAW,CAAC,qDAAD,CAAX;IACA;EACD;;EAED,IACCQ,iBADD,GAGIJ,KAHJ,CACCI,iBADD;EAAA,IAECC,gBAFD,GAGIL,KAHJ,CAECK,gBAFD;EAKA,uCACIP,KADJ;IAECI,UAAU,EAAEP,EAAE,CAACS,iBAAD,CAFf;IAGCD,aAAa,EAAER,EAAE,CAACU,gBAAD;EAHlB;AAKA"}
|
|
@@ -1,55 +1,148 @@
|
|
|
1
|
-
import { useMemo } from 'react';
|
|
2
|
-
import
|
|
1
|
+
import { useLayoutEffect, useMemo, useRef } from 'react';
|
|
2
|
+
import useState from './useState.js';
|
|
3
|
+
import useCreateVirtualScroller from './useCreateVirtualScroller.js';
|
|
4
|
+
import useStartStopVirtualScroller from './useStartStopVirtualScroller.js';
|
|
5
|
+
import useSetNewItemsOnItemsPropertyChange from './useSetNewItemsOnItemsPropertyChange.js';
|
|
6
|
+
import useValidateTableBodyItemsContainer from './useValidateTableBodyItemsContainer.js';
|
|
7
|
+
import useClassName from './useClassName.js';
|
|
8
|
+
import useStyle from './useStyle.js'; // When `items` property changes:
|
|
9
|
+
// * A new `items` property is supplied to the React component.
|
|
10
|
+
// * The React component re-renders itself.
|
|
11
|
+
// * `useSetNewItemsOnItemsPropertyChange()` hook is run.
|
|
12
|
+
// * `useSetNewItemsOnItemsPropertyChange()` hook detects that the `items` property
|
|
13
|
+
// has changed and calls `VirtualScroller.setItems(items)`.
|
|
14
|
+
// * `VirtualScroller.setItems(items)` calls `VirtualScroller.setState()`.
|
|
15
|
+
// * `VirtualScroller.setState()` calls the `setState()` function.
|
|
16
|
+
// * The `setState()` function calls a setter from a `useState()` hook.
|
|
17
|
+
// * The React component re-renders itself the second time.
|
|
3
18
|
|
|
4
|
-
export default function useVirtualScroller(_ref
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
19
|
+
export default function useVirtualScroller(_ref) {
|
|
20
|
+
var itemsProperty = _ref.items,
|
|
21
|
+
tbody = _ref.tbody,
|
|
22
|
+
readyToStart = _ref.readyToStart,
|
|
23
|
+
styleProperty = _ref.style,
|
|
24
|
+
classNameProperty = _ref.className,
|
|
10
25
|
bypass = _ref.bypass,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
initialScrollPosition = _ref.initialScrollPosition,
|
|
14
|
-
onScrollPositionChange = _ref.onScrollPositionChange,
|
|
26
|
+
preserveScrollPosition = _ref.preserveScrollPosition,
|
|
27
|
+
preserveScrollPositionOnPrependItems = _ref.preserveScrollPositionOnPrependItems,
|
|
15
28
|
measureItemsBatchSize = _ref.measureItemsBatchSize,
|
|
16
29
|
scrollableContainer = _ref.scrollableContainer,
|
|
17
30
|
getScrollableContainer = _ref.getScrollableContainer,
|
|
18
31
|
getColumnsCount = _ref.getColumnsCount,
|
|
19
32
|
getItemId = _ref.getItemId,
|
|
33
|
+
onItemFirstRender = _ref.onItemFirstRender,
|
|
34
|
+
onItemInitialRender = _ref.onItemInitialRender,
|
|
35
|
+
initialScrollPosition = _ref.initialScrollPosition,
|
|
36
|
+
onScrollPositionChange = _ref.onScrollPositionChange,
|
|
20
37
|
initialState = _ref.initialState,
|
|
21
38
|
getInitialItemState = _ref.getInitialItemState,
|
|
22
|
-
onStateChange = _ref.onStateChange
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
39
|
+
onStateChange = _ref.onStateChange,
|
|
40
|
+
getEstimatedItemHeight = _ref.getEstimatedItemHeight,
|
|
41
|
+
getEstimatedVisibleItemRowsCount = _ref.getEstimatedVisibleItemRowsCount,
|
|
42
|
+
getEstimatedInterItemVerticalSpacing = _ref.getEstimatedInterItemVerticalSpacing;
|
|
43
|
+
// A `ref` to the items container element.
|
|
44
|
+
var itemsContainerRef = useRef(); // Use `hasMounted` flag to decide if `itemsContainerRef` value should be validated.
|
|
45
|
+
|
|
46
|
+
var hasMounted = useRef(false);
|
|
47
|
+
useLayoutEffect(function () {
|
|
48
|
+
hasMounted.current = true;
|
|
49
|
+
}, []); // Create a `VirtualScroller` instance.
|
|
50
|
+
|
|
51
|
+
var virtualScroller = useCreateVirtualScroller({
|
|
52
|
+
items: itemsProperty,
|
|
53
|
+
getEstimatedItemHeight: getEstimatedItemHeight,
|
|
54
|
+
getEstimatedVisibleItemRowsCount: getEstimatedVisibleItemRowsCount,
|
|
55
|
+
getEstimatedInterItemVerticalSpacing: getEstimatedInterItemVerticalSpacing,
|
|
56
|
+
bypass: bypass,
|
|
57
|
+
// bypassBatchSize,
|
|
58
|
+
onItemInitialRender: onItemInitialRender,
|
|
59
|
+
// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.
|
|
60
|
+
onItemFirstRender: onItemFirstRender,
|
|
61
|
+
initialScrollPosition: initialScrollPosition,
|
|
62
|
+
onScrollPositionChange: onScrollPositionChange,
|
|
63
|
+
measureItemsBatchSize: measureItemsBatchSize,
|
|
64
|
+
// `scrollableContainer` property is deprecated.
|
|
65
|
+
// Use `getScrollableContainer()` property instead.
|
|
66
|
+
scrollableContainer: scrollableContainer,
|
|
67
|
+
getScrollableContainer: getScrollableContainer,
|
|
68
|
+
getColumnsCount: getColumnsCount,
|
|
69
|
+
getItemId: getItemId,
|
|
70
|
+
initialState: initialState,
|
|
71
|
+
getInitialItemState: getInitialItemState,
|
|
72
|
+
onStateChange: onStateChange
|
|
73
|
+
}, {
|
|
74
|
+
getItemsContainerElement: function getItemsContainerElement() {
|
|
75
|
+
// Validate that the developer has correctly passed the returned `itemsContainerRef` property
|
|
76
|
+
// as the items container component's `ref`.
|
|
77
|
+
//
|
|
78
|
+
// `getItemsContainerElement()` function is called both before it has mounted
|
|
79
|
+
// and after it has mounted. Only validate the ref's value after it has mounted.
|
|
80
|
+
//
|
|
81
|
+
if (hasMounted.current) {
|
|
82
|
+
if (!itemsContainerRef.current) {
|
|
83
|
+
throw new Error('[virtual-scroller] Did you forget to pass the returned `itemsContainerRef` property as the items container component\'s `ref`?');
|
|
84
|
+
}
|
|
85
|
+
} // Return the items container element.
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
return itemsContainerRef.current;
|
|
89
|
+
}
|
|
90
|
+
}); // Only compute the initial state once.
|
|
91
|
+
|
|
92
|
+
var _initialState = useMemo(function () {
|
|
93
|
+
return virtualScroller.getInitialState();
|
|
94
|
+
}, []); // Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.
|
|
95
|
+
// This way, React will re-render the component on every state update.
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
var _useState = useState({
|
|
99
|
+
initialState: _initialState,
|
|
100
|
+
onRender: virtualScroller.onRender
|
|
101
|
+
}),
|
|
102
|
+
getState = _useState.getState,
|
|
103
|
+
setState = _useState.setState,
|
|
104
|
+
stateToRender = _useState.stateToRender; // Use custom (external) state storage in the `VirtualScroller`.
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
useMemo(function () {
|
|
108
|
+
virtualScroller.useState({
|
|
109
|
+
getState: getState,
|
|
110
|
+
setState: setState
|
|
52
111
|
});
|
|
53
|
-
}, []);
|
|
112
|
+
}, []); // Start `VirtualScroller` on mount.
|
|
113
|
+
// Stop `VirtualScroller` on unmount.
|
|
114
|
+
|
|
115
|
+
useStartStopVirtualScroller(virtualScroller, {
|
|
116
|
+
readyToStart: readyToStart
|
|
117
|
+
}); // Calls `.setItems()` if `items` property has changed.
|
|
118
|
+
|
|
119
|
+
useSetNewItemsOnItemsPropertyChange(itemsProperty, {
|
|
120
|
+
virtualScroller: virtualScroller,
|
|
121
|
+
// `preserveScrollPosition` property name is deprecated,
|
|
122
|
+
// use `preserveScrollPositionOnPrependItems` property instead.
|
|
123
|
+
preserveScrollPosition: preserveScrollPosition,
|
|
124
|
+
preserveScrollPositionOnPrependItems: preserveScrollPositionOnPrependItems
|
|
125
|
+
}); // A developer might "forget" to pass `itemsContainerComponent="tbody"` property
|
|
126
|
+
// when using a `<tbody/>` as a container for list items.
|
|
127
|
+
// This hook validates that the developer didn't "forget" to do that in such case.
|
|
128
|
+
|
|
129
|
+
useValidateTableBodyItemsContainer({
|
|
130
|
+
virtualScroller: virtualScroller,
|
|
131
|
+
tbody: tbody
|
|
132
|
+
});
|
|
133
|
+
var className = useClassName(classNameProperty, {
|
|
134
|
+
tbody: tbody
|
|
135
|
+
});
|
|
136
|
+
var style = useStyle(styleProperty, {
|
|
137
|
+
tbody: tbody,
|
|
138
|
+
state: stateToRender
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
state: stateToRender,
|
|
142
|
+
style: style,
|
|
143
|
+
className: className,
|
|
144
|
+
itemsContainerRef: itemsContainerRef,
|
|
145
|
+
virtualScroller: virtualScroller
|
|
146
|
+
};
|
|
54
147
|
}
|
|
55
148
|
//# sourceMappingURL=useVirtualScroller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVirtualScroller.js","names":["useMemo","VirtualScroller","useVirtualScroller","items","estimatedItemHeight","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","getEstimatedInterItemVerticalSpacing","bypass","onItemInitialRender","onItemFirstRender","initialScrollPosition","onScrollPositionChange","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","initialState","getInitialItemState","onStateChange","itemsContainer","current","_useTimeoutInRenderLoop","state"],"sources":["../../source/react/useVirtualScroller.js"],"sourcesContent":["import { useMemo } from 'react'\r\n\r\nimport VirtualScroller from '../VirtualScroller.js'\r\n\r\n// Creates a `VirtualScroller` instance.\r\nexport default function useVirtualScroller({\r\n\titems,\r\n\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\testimatedItemHeight,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tgetEstimatedInterItemVerticalSpacing,\r\n\tbypass,\r\n\t// bypassBatchSize,\r\n\tonItemInitialRender,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tinitialState,\r\n\tgetInitialItemState,\r\n\tonStateChange\r\n}, {\r\n\titemsContainer\r\n}) {\r\n\treturn useMemo(() => {\r\n\t\t// Create `virtual-scroller` instance.\r\n\t\treturn new VirtualScroller(\r\n\t\t\t() => itemsContainer.current,\r\n\t\t\titems,\r\n\t\t\t{\r\n\t\t\t\t_useTimeoutInRenderLoop: true,\r\n\t\t\t\t// `estimatedItemHeight` is deprecated, use `getEstimatedItemHeight()` instead.\r\n\t\t\t\testimatedItemHeight,\r\n\t\t\t\tgetEstimatedItemHeight,\r\n\t\t\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\t\t\tgetEstimatedInterItemVerticalSpacing,\r\n\t\t\t\tbypass,\r\n\t\t\t\t// bypassBatchSize,\r\n\t\t\t\tonItemInitialRender,\r\n\t\t\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\t\t\tonItemFirstRender,\r\n\t\t\t\tinitialScrollPosition,\r\n\t\t\t\tonScrollPositionChange,\r\n\t\t\t\tmeasureItemsBatchSize,\r\n\t\t\t\t// `scrollableContainer` property is deprecated.\r\n\t\t\t\t// Use `getScrollableContainer()` property instead.\r\n\t\t\t\tscrollableContainer,\r\n\t\t\t\tgetScrollableContainer,\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\tgetItemId,\r\n\t\t\t\tstate: initialState,\r\n\t\t\t\tgetInitialItemState,\r\n\t\t\t\tonStateChange\r\n\t\t\t}\r\n\t\t)\r\n\t}, [])\r\n}"],"mappings":"AAAA,SAASA,OAAT,QAAwB,OAAxB;AAEA,OAAOC,eAAP,MAA4B,uBAA5B,C,CAEA;;AACA,eAAe,SAASC,kBAAT,cA0BZ;EAAA,IAzBFC,KAyBE,QAzBFA,KAyBE;EAAA,IAvBFC,mBAuBE,QAvBFA,mBAuBE;EAAA,IAtBFC,sBAsBE,QAtBFA,sBAsBE;EAAA,IArBFC,gCAqBE,QArBFA,gCAqBE;EAAA,IApBFC,oCAoBE,QApBFA,oCAoBE;EAAA,IAnBFC,MAmBE,QAnBFA,MAmBE;EAAA,IAjBFC,mBAiBE,QAjBFA,mBAiBE;EAAA,IAfFC,iBAeE,QAfFA,iBAeE;EAAA,IAdFC,qBAcE,QAdFA,qBAcE;EAAA,IAbFC,sBAaE,QAbFA,sBAaE;EAAA,IAZFC,qBAYE,QAZFA,qBAYE;EAAA,IATFC,mBASE,QATFA,mBASE;EAAA,IARFC,sBAQE,QARFA,sBAQE;EAAA,IAPFC,eAOE,QAPFA,eAOE;EAAA,IANFC,SAME,QANFA,SAME;EAAA,IALFC,YAKE,QALFA,YAKE;EAAA,IAJFC,mBAIE,QAJFA,mBAIE;EAAA,IAHFC,aAGE,QAHFA,aAGE;EAAA,IADFC,cACE,SADFA,cACE;EACF,OAAOrB,OAAO,CAAC,YAAM;IACpB;IACA,OAAO,IAAIC,eAAJ,CACN;MAAA,OAAMoB,cAAc,CAACC,OAArB;IAAA,CADM,EAENnB,KAFM,EAGN;MACCoB,uBAAuB,EAAE,IAD1B;MAEC;MACAnB,mBAAmB,EAAnBA,mBAHD;MAICC,sBAAsB,EAAtBA,sBAJD;MAKCC,gCAAgC,EAAhCA,gCALD;MAMCC,oCAAoC,EAApCA,oCAND;MAOCC,MAAM,EAANA,MAPD;MAQC;MACAC,mBAAmB,EAAnBA,mBATD;MAUC;MACAC,iBAAiB,EAAjBA,iBAXD;MAYCC,qBAAqB,EAArBA,qBAZD;MAaCC,sBAAsB,EAAtBA,sBAbD;MAcCC,qBAAqB,EAArBA,qBAdD;MAeC;MACA;MACAC,mBAAmB,EAAnBA,mBAjBD;MAkBCC,sBAAsB,EAAtBA,sBAlBD;MAmBCC,eAAe,EAAfA,eAnBD;MAoBCC,SAAS,EAATA,SApBD;MAqBCO,KAAK,EAAEN,YArBR;MAsBCC,mBAAmB,EAAnBA,mBAtBD;MAuBCC,aAAa,EAAbA;IAvBD,CAHM,CAAP;EA6BA,CA/Ba,EA+BX,EA/BW,CAAd;AAgCA"}
|
|
1
|
+
{"version":3,"file":"useVirtualScroller.js","names":["useLayoutEffect","useMemo","useRef","useState","useCreateVirtualScroller","useStartStopVirtualScroller","useSetNewItemsOnItemsPropertyChange","useValidateTableBodyItemsContainer","useClassName","useStyle","useVirtualScroller","itemsProperty","items","tbody","readyToStart","styleProperty","style","classNameProperty","className","bypass","preserveScrollPosition","preserveScrollPositionOnPrependItems","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","onItemFirstRender","onItemInitialRender","initialScrollPosition","onScrollPositionChange","initialState","getInitialItemState","onStateChange","getEstimatedItemHeight","getEstimatedVisibleItemRowsCount","getEstimatedInterItemVerticalSpacing","itemsContainerRef","hasMounted","current","virtualScroller","getItemsContainerElement","Error","_initialState","getInitialState","onRender","getState","setState","stateToRender","state"],"sources":["../../source/react/useVirtualScroller.js"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef } from 'react'\r\n\r\nimport useState from './useState.js'\r\nimport useCreateVirtualScroller from './useCreateVirtualScroller.js'\r\nimport useStartStopVirtualScroller from './useStartStopVirtualScroller.js'\r\nimport useSetNewItemsOnItemsPropertyChange from './useSetNewItemsOnItemsPropertyChange.js'\r\nimport useValidateTableBodyItemsContainer from './useValidateTableBodyItemsContainer.js'\r\nimport useClassName from './useClassName.js'\r\nimport useStyle from './useStyle.js'\r\n\r\n// When `items` property changes:\r\n// * A new `items` property is supplied to the React component.\r\n// * The React component re-renders itself.\r\n// * `useSetNewItemsOnItemsPropertyChange()` hook is run.\r\n// * `useSetNewItemsOnItemsPropertyChange()` hook detects that the `items` property\r\n// has changed and calls `VirtualScroller.setItems(items)`.\r\n// * `VirtualScroller.setItems(items)` calls `VirtualScroller.setState()`.\r\n// * `VirtualScroller.setState()` calls the `setState()` function.\r\n// * The `setState()` function calls a setter from a `useState()` hook.\r\n// * The React component re-renders itself the second time.\r\n\r\nexport default function useVirtualScroller({\r\n\t// The following are `<VirtualScroller/>` properties.\r\n\t//\r\n\titems: itemsProperty,\r\n\t// Because the use of a `<tbody/>` tag as an items container component can't always be auto-detected,\r\n\t// a developer could manually pass a `tbody: boolean` property.\r\n\t// Futhermore, when using `useVirtualScroller()` hook instead of `<VirtualScroller/>` component,\r\n\t// `itemsContainerComponent` property is not accessible for tag name detection.\r\n\ttbody,\r\n\treadyToStart,\r\n\tstyle: styleProperty,\r\n\tclassName: classNameProperty,\r\n\r\n\t// The following are the \"core\" component options.\r\n\t//\r\n\tbypass,\r\n\t// `preserveScrollPosition` property name is deprecated,\r\n\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\tpreserveScrollPosition,\r\n\tpreserveScrollPositionOnPrependItems,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tonItemInitialRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tinitialState,\r\n\tgetInitialItemState,\r\n\tonStateChange,\r\n\tgetEstimatedItemHeight,\r\n\tgetEstimatedVisibleItemRowsCount,\r\n\tgetEstimatedInterItemVerticalSpacing\r\n}) {\r\n\t// A `ref` to the items container element.\r\n\tconst itemsContainerRef = useRef()\r\n\r\n\t// Use `hasMounted` flag to decide if `itemsContainerRef` value should be validated.\r\n\tconst hasMounted = useRef(false)\r\n\tuseLayoutEffect(() => {\r\n\t\thasMounted.current = true\r\n\t}, [])\r\n\r\n\t// Create a `VirtualScroller` instance.\r\n\tconst virtualScroller = useCreateVirtualScroller({\r\n\t\titems: itemsProperty,\r\n\t\tgetEstimatedItemHeight,\r\n\t\tgetEstimatedVisibleItemRowsCount,\r\n\t\tgetEstimatedInterItemVerticalSpacing,\r\n\t\tbypass,\r\n\t\t// bypassBatchSize,\r\n\t\tonItemInitialRender,\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\tonItemFirstRender,\r\n\t\tinitialScrollPosition,\r\n\t\tonScrollPositionChange,\r\n\t\tmeasureItemsBatchSize,\r\n\t\t// `scrollableContainer` property is deprecated.\r\n\t\t// Use `getScrollableContainer()` property instead.\r\n\t\tscrollableContainer,\r\n\t\tgetScrollableContainer,\r\n\t\tgetColumnsCount,\r\n\t\tgetItemId,\r\n\t\tinitialState,\r\n\t\tgetInitialItemState,\r\n\t\tonStateChange\r\n\t}, {\r\n\t\tgetItemsContainerElement: () => {\r\n\t\t\t// Validate that the developer has correctly passed the returned `itemsContainerRef` property\r\n\t\t\t// as the items container component's `ref`.\r\n\t\t\t//\r\n\t\t\t// `getItemsContainerElement()` function is called both before it has mounted\r\n\t\t\t// and after it has mounted. Only validate the ref's value after it has mounted.\r\n\t\t\t//\r\n\t\t\tif (hasMounted.current) {\r\n\t\t\t\tif (!itemsContainerRef.current) {\r\n\t\t\t\t\tthrow new Error('[virtual-scroller] Did you forget to pass the returned `itemsContainerRef` property as the items container component\\'s `ref`?')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Return the items container element.\r\n\t\t\treturn itemsContainerRef.current\r\n\t\t}\r\n\t})\r\n\r\n\t// Only compute the initial state once.\r\n\tconst _initialState = useMemo(() => {\r\n\t\treturn virtualScroller.getInitialState()\r\n\t}, [])\r\n\r\n\t// Use React's `useState()` hook for managing `VirtualScroller`'s state lifecycle.\r\n\t// This way, React will re-render the component on every state update.\r\n\tconst {\r\n\t\tgetState,\r\n\t\tsetState,\r\n\t\tstateToRender\r\n\t} = useState({\r\n\t\tinitialState: _initialState,\r\n\t\tonRender: virtualScroller.onRender\r\n\t})\r\n\r\n\t// Use custom (external) state storage in the `VirtualScroller`.\r\n\tuseMemo(() => {\r\n\t\tvirtualScroller.useState({\r\n\t\t\tgetState,\r\n\t\t\tsetState\r\n\t\t})\r\n\t}, [])\r\n\r\n\t// Start `VirtualScroller` on mount.\r\n\t// Stop `VirtualScroller` on unmount.\r\n\tuseStartStopVirtualScroller(virtualScroller, { readyToStart })\r\n\r\n\t// Calls `.setItems()` if `items` property has changed.\r\n\tuseSetNewItemsOnItemsPropertyChange(itemsProperty, {\r\n\t\tvirtualScroller,\r\n\t\t// `preserveScrollPosition` property name is deprecated,\r\n\t\t// use `preserveScrollPositionOnPrependItems` property instead.\r\n\t\tpreserveScrollPosition,\r\n\t\tpreserveScrollPositionOnPrependItems\r\n\t})\r\n\r\n\t// A developer might \"forget\" to pass `itemsContainerComponent=\"tbody\"` property\r\n\t// when using a `<tbody/>` as a container for list items.\r\n\t// This hook validates that the developer didn't \"forget\" to do that in such case.\r\n\tuseValidateTableBodyItemsContainer({\r\n\t\tvirtualScroller,\r\n\t\ttbody\r\n\t})\r\n\r\n\tconst className = useClassName(classNameProperty, {\r\n\t\ttbody\r\n\t})\r\n\r\n\tconst style = useStyle(styleProperty, {\r\n\t\ttbody,\r\n\t\tstate: stateToRender\r\n\t})\r\n\r\n\treturn {\r\n\t\tstate: stateToRender,\r\n\t\tstyle,\r\n\t\tclassName,\r\n\t\titemsContainerRef,\r\n\t\tvirtualScroller\r\n\t}\r\n}"],"mappings":"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"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
var _excluded = ["screenWidth", "screenHeight", "columnsCount", "verticalSpacing", "items", "getItemId", "state"];
|
|
2
|
+
|
|
1
3
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
4
|
|
|
3
5
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
6
|
|
|
5
7
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
8
|
|
|
9
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
10
|
+
|
|
11
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
12
|
+
|
|
7
13
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
8
14
|
|
|
9
15
|
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); } }
|
|
@@ -23,10 +29,19 @@ var TestVirtualScroller = /*#__PURE__*/function () {
|
|
|
23
29
|
columnsCount = _ref.columnsCount,
|
|
24
30
|
verticalSpacing = _ref.verticalSpacing,
|
|
25
31
|
items = _ref.items,
|
|
26
|
-
|
|
32
|
+
getItemId = _ref.getItemId,
|
|
33
|
+
initialState = _ref.state,
|
|
34
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
27
35
|
|
|
28
36
|
_classCallCheck(this, TestVirtualScroller);
|
|
29
37
|
|
|
38
|
+
// Validate that no unknown properties are passed.
|
|
39
|
+
// This prevents the cases when a developer confuses
|
|
40
|
+
// `TestVirtualScroller` options for `VirtualScroller` options.
|
|
41
|
+
if (Object.keys(rest).length > 0) {
|
|
42
|
+
throw new Error("Unknown options: ".concat(Object.keys(rest).join(', ')));
|
|
43
|
+
}
|
|
44
|
+
|
|
30
45
|
this.expectedStateUpdates = [];
|
|
31
46
|
var scrollableContainerElement = {
|
|
32
47
|
width: scrollableContainerWidth,
|
|
@@ -107,6 +122,7 @@ var TestVirtualScroller = /*#__PURE__*/function () {
|
|
|
107
122
|
scrollableContainer: scrollableContainerElement,
|
|
108
123
|
engine: Engine,
|
|
109
124
|
_waitForScrollingToStop: false,
|
|
125
|
+
getItemId: getItemId,
|
|
110
126
|
getColumnsCount: getColumnsCount,
|
|
111
127
|
state: initialState,
|
|
112
128
|
onStateChange: function onStateChange(state) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","Engine","DEBUG","TestVirtualScroller","scrollableContainerWidth","screenWidth","scrollableContainerHeight","screenHeight","columnsCount","verticalSpacing","items","initialState","state","expectedStateUpdates","scrollableContainerElement","width","height","containerElement","paddingTop","paddingBottom","children","setScrollableContainerWidth","setScrollableContainerHeight","getItemsContainerElement","__columnsCount","getColumnsCount","getItemWidth","hasPausedStateUpdates","undefined","pausedStateUpdate","pausedStateUpdateAction","onBeforeUpdateState","stateUpdate","length","expectedStateUpdate","shift","expect","to","deep","equal","callback","render","virtualScroller","getState","beforeItemsHeight","afterItemsHeight","firstShownItemIndex","lastShownItemIndex","slice","map","item","getWidth","getHeight","getArea","area","getMarginTop","scrollableContainer","engine","_waitForScrollingToStop","onStateChange","console","log","getInitialState","useState","updateState","stateUpdateAction","onRender","Error","expectedState","should","include","push","firstNonMeasuredItemIndex","getScrollY","scrollPosition","scrollToY","updateScreenDimensions","_triggerResizeListener","JSON","stringify","stop","start","updateLayout","itemOrIndex","getItemScrollPosition","onItemHeightDidChange","newState","setItemState","getAverageItemHeight","newItems","options","setItems"],"sources":["../../source/test/VirtualScroller.js"],"sourcesContent":["import VirtualScroller from '../VirtualScroller.js'\r\nimport Engine from './Engine.js'\r\n\r\nconst DEBUG = false\r\n\r\nexport default class TestVirtualScroller {\r\n\tconstructor({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing,\r\n\t\titems,\r\n\t\tstate: initialState\r\n\t}) {\r\n\t\tthis.expectedStateUpdates = []\r\n\r\n\t\tconst scrollableContainerElement = {\r\n\t\t\twidth: scrollableContainerWidth,\r\n\t\t\theight: scrollableContainerHeight\r\n\t\t}\r\n\r\n\t\tconst containerElement = {\r\n\t\t\tpaddingTop: 0,\r\n\t\t\tpaddingBottom: 0,\r\n\t\t\twidth: scrollableContainerElement.width,\r\n\t\t\tchildren: []\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerWidth = (width) => {\r\n\t\t\tscrollableContainerElement.width = width\r\n\t\t\tcontainerElement.width = width\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerHeight = (height) => {\r\n\t\t\tscrollableContainerElement.height = height\r\n\t\t}\r\n\r\n\t\tconst getItemsContainerElement = () => containerElement\r\n\r\n\t\tthis.__columnsCount = columnsCount\r\n\r\n\t\tconst getColumnsCount = () => this.__columnsCount\r\n\t\tconst getItemWidth = () => scrollableContainerElement.width / getColumnsCount()\r\n\r\n\t\tthis.hasPausedStateUpdates = undefined\r\n\t\tthis.pausedStateUpdate = undefined\r\n\t\tthis.pausedStateUpdateAction = undefined\r\n\r\n\t\tconst onBeforeUpdateState = (stateUpdate) => {\r\n\t\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\t\tconst expectedStateUpdate = this.expectedStateUpdates.shift()\r\n\t\t\t\texpect(stateUpdate).to.deep.equal(expectedStateUpdate.stateUpdate)\r\n\t\t\t\tif (expectedStateUpdate.callback) {\r\n\t\t\t\t\texpectedStateUpdate.callback()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst render = () => {\r\n\t\t\tconst {\r\n\t\t\t\titems,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight,\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex\r\n\t\t\t} = this.virtualScroller.getState()\r\n\r\n\t\t\tcontainerElement.paddingTop = beforeItemsHeight\r\n\t\t\tcontainerElement.paddingBottom = afterItemsHeight\r\n\r\n\t\t\tcontainerElement.children = items\r\n\t\t\t\t.slice(firstShownItemIndex, lastShownItemIndex + 1)\r\n\t\t\t\t.map((item) => ({\r\n\t\t\t\t\tgetWidth: () => getItemWidth(),\r\n\t\t\t\t\tgetHeight: () => (item.getArea ? item.getArea() : item.area) / getItemWidth(),\r\n\t\t\t\t\tgetMarginTop: () => verticalSpacing\r\n\t\t\t\t}))\r\n\t\t}\r\n\r\n\t\tthis.virtualScroller = new VirtualScroller(getItemsContainerElement, items, {\r\n\t\t\tscrollableContainer: scrollableContainerElement,\r\n\t\t\tengine: Engine,\r\n\t\t\t_waitForScrollingToStop: false,\r\n\t\t\tgetColumnsCount,\r\n\t\t\tstate: initialState,\r\n\t\t\tonStateChange(state) {\r\n\t\t\t\tif (DEBUG) {\r\n\t\t\t\t\tconsole.log('~ Updated State ~')\r\n\t\t\t\t\tconsole.log(state)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tlet state = this.virtualScroller.getInitialState()\r\n\r\n\t\tthis.virtualScroller.useState({\r\n\t\t\tgetState: () => state,\r\n\t\t\tupdateState: (stateUpdate) => {\r\n\t\t\t\tconst stateUpdateAction = (stateUpdate) => {\r\n\t\t\t\t\t// Is only used in tests.\r\n\t\t\t\t\tif (onBeforeUpdateState) {\r\n\t\t\t\t\t\tonBeforeUpdateState(stateUpdate)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstate = {\r\n\t\t\t\t\t\t...state,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\trender()\r\n\t\t\t\t\tthis.virtualScroller.onRender()\r\n\t\t\t\t}\r\n\t\t\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\t\t\tthis.pausedStateUpdate = {\r\n\t\t\t\t\t\t...this.pausedStateUpdate,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.pausedStateUpdateAction = stateUpdateAction\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstateUpdateAction(stateUpdate)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\trender()\r\n\t}\r\n\r\n\tpauseStateUpdates() {\r\n\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates have already been paused')\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = true\r\n\t}\r\n\r\n\tresumeStateUpdates() {\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthis.pausedStateUpdateAction(this.pausedStateUpdate)\r\n\t\t\tthis.pausedStateUpdate = undefined\r\n\t\t\tthis.pausedStateUpdateAction = undefined\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = false\r\n\t}\r\n\r\n\tverifyState(expectedState) {\r\n\t\t// `mocha`/`chai`.\r\n\t\tthis.virtualScroller.getState().should.deep.include(expectedState)\r\n\t}\r\n\r\n\texpectStateUpdate(stateUpdate, callback) {\r\n\t\tthis.expectedStateUpdates.push({\r\n\t\t\tstateUpdate,\r\n\t\t\tcallback\r\n\t\t})\r\n\t}\r\n\r\n\tgetFirstNonMeasuredItemIndex() {\r\n\t\treturn this.virtualScroller.firstNonMeasuredItemIndex\r\n\t}\r\n\r\n\tgetScrollY() {\r\n\t\treturn this.virtualScroller.scrollableContainer.getScrollY()\r\n\t}\r\n\r\n\tscrollTo(scrollPosition) {\r\n\t\tthis.virtualScroller.scrollableContainer.scrollToY(scrollPosition)\r\n\t}\r\n\r\n\tupdateScreenDimensions({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount\r\n\t}) {\r\n\t\t// Resize scrollable container.\r\n\t\tthis.setScrollableContainerWidth(scrollableContainerWidth)\r\n\t\tthis.setScrollableContainerHeight(scrollableContainerHeight)\r\n\r\n\t\t// Update columns count.\r\n\t\tthis.__columnsCount = columnsCount\r\n\t}\r\n\r\n\t// Returns a `Promise`.\r\n\ttriggerResize({\r\n\t\tscreenWidth,\r\n\t\tscreenHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing\r\n\t}) {\r\n\t\tthis.updateScreenDimensions({\r\n\t\t\tscreenWidth,\r\n\t\t\tscreenHeight,\r\n\t\t\tcolumnsCount,\r\n\t\t\tverticalSpacing\r\n\t\t})\r\n\r\n\t\t// Call \"on resize\" listener.\r\n\t\treturn this.virtualScroller.scrollableContainer._triggerResizeListener()\r\n\t}\r\n\r\n\tstop() {\r\n\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\tthrow new Error(`[virtual-scroller] Expected ${this.expectedStateUpdates.length} state updates which didn't happen:\\n${JSON.stringify(this.expectedStateUpdates, null, 2)}`)\r\n\t\t}\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates were paused and haven\\'t been resumed afterwards')\r\n\t\t}\r\n\t\tthis.virtualScroller.stop()\r\n\t}\r\n\r\n\tstart() {\r\n\t\tthis.virtualScroller.start()\r\n\t}\r\n\r\n\tgetState() {\r\n\t\treturn this.virtualScroller.getState()\r\n\t}\r\n\r\n\tupdateLayout() {\r\n\t\tthis.virtualScroller.updateLayout()\r\n\t}\r\n\r\n\tgetItemScrollPosition(itemOrIndex) {\r\n\t\treturn this.virtualScroller.getItemScrollPosition(itemOrIndex)\r\n\t}\r\n\r\n\tonItemHeightDidChange(itemOrIndex) {\r\n\t\tthis.virtualScroller.onItemHeightDidChange(itemOrIndex)\r\n\t}\r\n\r\n\tsetItemState(itemOrIndex, newState) {\r\n\t\tthis.virtualScroller.setItemState(itemOrIndex, newState)\r\n\t}\r\n\r\n\tgetAverageItemHeight() {\r\n\t\treturn this.virtualScroller.getAverageItemHeight()\r\n\t}\r\n\r\n\tsetItems(newItems, options) {\r\n\t\tthis.virtualScroller.setItems(newItems, options)\r\n\t}\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","Engine","DEBUG","TestVirtualScroller","scrollableContainerWidth","screenWidth","scrollableContainerHeight","screenHeight","columnsCount","verticalSpacing","items","getItemId","initialState","state","rest","Object","keys","length","Error","join","expectedStateUpdates","scrollableContainerElement","width","height","containerElement","paddingTop","paddingBottom","children","setScrollableContainerWidth","setScrollableContainerHeight","getItemsContainerElement","__columnsCount","getColumnsCount","getItemWidth","hasPausedStateUpdates","undefined","pausedStateUpdate","pausedStateUpdateAction","onBeforeUpdateState","stateUpdate","expectedStateUpdate","shift","expect","to","deep","equal","callback","render","virtualScroller","getState","beforeItemsHeight","afterItemsHeight","firstShownItemIndex","lastShownItemIndex","slice","map","item","getWidth","getHeight","getArea","area","getMarginTop","scrollableContainer","engine","_waitForScrollingToStop","onStateChange","console","log","getInitialState","useState","updateState","stateUpdateAction","onRender","expectedState","should","include","push","firstNonMeasuredItemIndex","getScrollY","scrollPosition","scrollToY","updateScreenDimensions","_triggerResizeListener","JSON","stringify","stop","start","updateLayout","itemOrIndex","getItemScrollPosition","onItemHeightDidChange","newState","setItemState","getAverageItemHeight","newItems","options","setItems"],"sources":["../../source/test/VirtualScroller.js"],"sourcesContent":["import VirtualScroller from '../VirtualScroller.js'\r\nimport Engine from './Engine.js'\r\n\r\nconst DEBUG = false\r\n\r\nexport default class TestVirtualScroller {\r\n\tconstructor({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing,\r\n\t\titems,\r\n\t\tgetItemId,\r\n\t\tstate: initialState,\r\n\t\t...rest\r\n\t}) {\r\n\t\t// Validate that no unknown properties are passed.\r\n\t\t// This prevents the cases when a developer confuses\r\n\t\t// `TestVirtualScroller` options for `VirtualScroller` options.\r\n\t\tif (Object.keys(rest).length > 0) {\r\n\t\t\tthrow new Error(`Unknown options: ${Object.keys(rest).join(', ')}`)\r\n\t\t}\r\n\r\n\t\tthis.expectedStateUpdates = []\r\n\r\n\t\tconst scrollableContainerElement = {\r\n\t\t\twidth: scrollableContainerWidth,\r\n\t\t\theight: scrollableContainerHeight\r\n\t\t}\r\n\r\n\t\tconst containerElement = {\r\n\t\t\tpaddingTop: 0,\r\n\t\t\tpaddingBottom: 0,\r\n\t\t\twidth: scrollableContainerElement.width,\r\n\t\t\tchildren: []\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerWidth = (width) => {\r\n\t\t\tscrollableContainerElement.width = width\r\n\t\t\tcontainerElement.width = width\r\n\t\t}\r\n\r\n\t\tthis.setScrollableContainerHeight = (height) => {\r\n\t\t\tscrollableContainerElement.height = height\r\n\t\t}\r\n\r\n\t\tconst getItemsContainerElement = () => containerElement\r\n\r\n\t\tthis.__columnsCount = columnsCount\r\n\r\n\t\tconst getColumnsCount = () => this.__columnsCount\r\n\t\tconst getItemWidth = () => scrollableContainerElement.width / getColumnsCount()\r\n\r\n\t\tthis.hasPausedStateUpdates = undefined\r\n\t\tthis.pausedStateUpdate = undefined\r\n\t\tthis.pausedStateUpdateAction = undefined\r\n\r\n\t\tconst onBeforeUpdateState = (stateUpdate) => {\r\n\t\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\t\tconst expectedStateUpdate = this.expectedStateUpdates.shift()\r\n\t\t\t\texpect(stateUpdate).to.deep.equal(expectedStateUpdate.stateUpdate)\r\n\t\t\t\tif (expectedStateUpdate.callback) {\r\n\t\t\t\t\texpectedStateUpdate.callback()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst render = () => {\r\n\t\t\tconst {\r\n\t\t\t\titems,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight,\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex\r\n\t\t\t} = this.virtualScroller.getState()\r\n\r\n\t\t\tcontainerElement.paddingTop = beforeItemsHeight\r\n\t\t\tcontainerElement.paddingBottom = afterItemsHeight\r\n\r\n\t\t\tcontainerElement.children = items\r\n\t\t\t\t.slice(firstShownItemIndex, lastShownItemIndex + 1)\r\n\t\t\t\t.map((item) => ({\r\n\t\t\t\t\tgetWidth: () => getItemWidth(),\r\n\t\t\t\t\tgetHeight: () => (item.getArea ? item.getArea() : item.area) / getItemWidth(),\r\n\t\t\t\t\tgetMarginTop: () => verticalSpacing\r\n\t\t\t\t}))\r\n\t\t}\r\n\r\n\t\tthis.virtualScroller = new VirtualScroller(getItemsContainerElement, items, {\r\n\t\t\tscrollableContainer: scrollableContainerElement,\r\n\t\t\tengine: Engine,\r\n\t\t\t_waitForScrollingToStop: false,\r\n\t\t\tgetItemId,\r\n\t\t\tgetColumnsCount,\r\n\t\t\tstate: initialState,\r\n\t\t\tonStateChange(state) {\r\n\t\t\t\tif (DEBUG) {\r\n\t\t\t\t\tconsole.log('~ Updated State ~')\r\n\t\t\t\t\tconsole.log(state)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tlet state = this.virtualScroller.getInitialState()\r\n\r\n\t\tthis.virtualScroller.useState({\r\n\t\t\tgetState: () => state,\r\n\t\t\tupdateState: (stateUpdate) => {\r\n\t\t\t\tconst stateUpdateAction = (stateUpdate) => {\r\n\t\t\t\t\t// Is only used in tests.\r\n\t\t\t\t\tif (onBeforeUpdateState) {\r\n\t\t\t\t\t\tonBeforeUpdateState(stateUpdate)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstate = {\r\n\t\t\t\t\t\t...state,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\trender()\r\n\t\t\t\t\tthis.virtualScroller.onRender()\r\n\t\t\t\t}\r\n\t\t\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\t\t\tthis.pausedStateUpdate = {\r\n\t\t\t\t\t\t...this.pausedStateUpdate,\r\n\t\t\t\t\t\t...stateUpdate\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.pausedStateUpdateAction = stateUpdateAction\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstateUpdateAction(stateUpdate)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\trender()\r\n\t}\r\n\r\n\tpauseStateUpdates() {\r\n\t\tif (this.hasPausedStateUpdates) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates have already been paused')\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = true\r\n\t}\r\n\r\n\tresumeStateUpdates() {\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthis.pausedStateUpdateAction(this.pausedStateUpdate)\r\n\t\t\tthis.pausedStateUpdate = undefined\r\n\t\t\tthis.pausedStateUpdateAction = undefined\r\n\t\t}\r\n\t\tthis.hasPausedStateUpdates = false\r\n\t}\r\n\r\n\tverifyState(expectedState) {\r\n\t\t// `mocha`/`chai`.\r\n\t\tthis.virtualScroller.getState().should.deep.include(expectedState)\r\n\t}\r\n\r\n\texpectStateUpdate(stateUpdate, callback) {\r\n\t\tthis.expectedStateUpdates.push({\r\n\t\t\tstateUpdate,\r\n\t\t\tcallback\r\n\t\t})\r\n\t}\r\n\r\n\tgetFirstNonMeasuredItemIndex() {\r\n\t\treturn this.virtualScroller.firstNonMeasuredItemIndex\r\n\t}\r\n\r\n\tgetScrollY() {\r\n\t\treturn this.virtualScroller.scrollableContainer.getScrollY()\r\n\t}\r\n\r\n\tscrollTo(scrollPosition) {\r\n\t\tthis.virtualScroller.scrollableContainer.scrollToY(scrollPosition)\r\n\t}\r\n\r\n\tupdateScreenDimensions({\r\n\t\tscreenWidth: scrollableContainerWidth,\r\n\t\tscreenHeight: scrollableContainerHeight,\r\n\t\tcolumnsCount\r\n\t}) {\r\n\t\t// Resize scrollable container.\r\n\t\tthis.setScrollableContainerWidth(scrollableContainerWidth)\r\n\t\tthis.setScrollableContainerHeight(scrollableContainerHeight)\r\n\r\n\t\t// Update columns count.\r\n\t\tthis.__columnsCount = columnsCount\r\n\t}\r\n\r\n\t// Returns a `Promise`.\r\n\ttriggerResize({\r\n\t\tscreenWidth,\r\n\t\tscreenHeight,\r\n\t\tcolumnsCount,\r\n\t\tverticalSpacing\r\n\t}) {\r\n\t\tthis.updateScreenDimensions({\r\n\t\t\tscreenWidth,\r\n\t\t\tscreenHeight,\r\n\t\t\tcolumnsCount,\r\n\t\t\tverticalSpacing\r\n\t\t})\r\n\r\n\t\t// Call \"on resize\" listener.\r\n\t\treturn this.virtualScroller.scrollableContainer._triggerResizeListener()\r\n\t}\r\n\r\n\tstop() {\r\n\t\tif (this.expectedStateUpdates.length > 0) {\r\n\t\t\tthrow new Error(`[virtual-scroller] Expected ${this.expectedStateUpdates.length} state updates which didn't happen:\\n${JSON.stringify(this.expectedStateUpdates, null, 2)}`)\r\n\t\t}\r\n\t\tif (this.pausedStateUpdate) {\r\n\t\t\tthrow new Error('[virtual-scroller] State updates were paused and haven\\'t been resumed afterwards')\r\n\t\t}\r\n\t\tthis.virtualScroller.stop()\r\n\t}\r\n\r\n\tstart() {\r\n\t\tthis.virtualScroller.start()\r\n\t}\r\n\r\n\tgetState() {\r\n\t\treturn this.virtualScroller.getState()\r\n\t}\r\n\r\n\tupdateLayout() {\r\n\t\tthis.virtualScroller.updateLayout()\r\n\t}\r\n\r\n\tgetItemScrollPosition(itemOrIndex) {\r\n\t\treturn this.virtualScroller.getItemScrollPosition(itemOrIndex)\r\n\t}\r\n\r\n\tonItemHeightDidChange(itemOrIndex) {\r\n\t\tthis.virtualScroller.onItemHeightDidChange(itemOrIndex)\r\n\t}\r\n\r\n\tsetItemState(itemOrIndex, newState) {\r\n\t\tthis.virtualScroller.setItemState(itemOrIndex, newState)\r\n\t}\r\n\r\n\tgetAverageItemHeight() {\r\n\t\treturn this.virtualScroller.getAverageItemHeight()\r\n\t}\r\n\r\n\tsetItems(newItems, options) {\r\n\t\tthis.virtualScroller.setItems(newItems, options)\r\n\t}\r\n}\r\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "virtual-scroller",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.2",
|
|
4
4
|
"description": "A component for efficiently rendering large lists of variable height items",
|
|
5
5
|
"main": "index.cjs",
|
|
6
6
|
"module": "index.js",
|
|
@@ -46,6 +46,9 @@
|
|
|
46
46
|
"mocha": "^10.0.0",
|
|
47
47
|
"npm-run-all": "^4.1.5",
|
|
48
48
|
"nyc": "^15.1.0",
|
|
49
|
+
"prop-types": "^15.8.1",
|
|
50
|
+
"react": "^19.2.0",
|
|
51
|
+
"react-dom": "^19.2.0",
|
|
49
52
|
"regenerator-runtime": "^0.13.9",
|
|
50
53
|
"rimraf": "^3.0.2",
|
|
51
54
|
"rollup": "^2.73.0",
|
package/react/index.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
exports = module.exports = require('../commonjs/react/VirtualScroller.js').default
|
|
4
|
-
exports['default'] = require('../commonjs/react/VirtualScroller.js').default
|
|
4
|
+
exports['default'] = require('../commonjs/react/VirtualScroller.js').default
|
|
5
|
+
exports.useVirtualScroller = require('../commonjs/react/useVirtualScroller.js').default
|
package/react/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { State, VirtualScrollerCommonOptions } from '../index.d.js';
|
|
1
|
+
import { default as VirtualScrollerCore, State, VirtualScrollerCommonOptions } from '../index.d.js';
|
|
2
2
|
|
|
3
3
|
// `as` property is now deprecated, so `WithAsProperty` type is a legacy one.
|
|
4
4
|
// Use `itemsContainerComponent` property instead.
|
|
@@ -39,6 +39,29 @@ export interface VirtualScrollerRefValue {
|
|
|
39
39
|
// // This is a type of a `ref` that will be passed to a given `Component`.
|
|
40
40
|
// type ComponentRef<Component extends React.ElementType> = React.ComponentPropsWithRef<Component>['ref']
|
|
41
41
|
|
|
42
|
+
// These props are shared between `useVirtualScroller()` hook and `<VirtualScroller/>` component.
|
|
43
|
+
interface PropsBase<
|
|
44
|
+
// `Item` is the type of an element of the `items` array.
|
|
45
|
+
Item,
|
|
46
|
+
|
|
47
|
+
// `ItemComponentState` is the type of an item component state.
|
|
48
|
+
// Example: `interface ItemComponentState { expanded?: boolean }`.
|
|
49
|
+
//
|
|
50
|
+
// In most cases, a developer won't even have to bother about item component state
|
|
51
|
+
// because `ItemComponent` won't have any state.
|
|
52
|
+
// In such cases, type `unknown` is used as a "dummy" placeholder
|
|
53
|
+
// just so that TypeScript doesn't complain about this "generic" being unspecified.
|
|
54
|
+
//
|
|
55
|
+
ItemComponentState = unknown
|
|
56
|
+
> extends VirtualScrollerCommonOptions<Item, ItemComponentState> {
|
|
57
|
+
items: Item[];
|
|
58
|
+
initialState?: State<Item, ItemComponentState>;
|
|
59
|
+
preserveScrollPositionOnPrependItems?: boolean;
|
|
60
|
+
readyToStart?: boolean;
|
|
61
|
+
tbody?: boolean;
|
|
62
|
+
getScrollableContainer?(): HTMLElement;
|
|
63
|
+
}
|
|
64
|
+
|
|
42
65
|
// These are `<VirtualScroller/>` props except the deprecated `as` property.
|
|
43
66
|
// When `as` property is removed in some future, `PropsWithoutAs` could be renamed to just `export Props`.
|
|
44
67
|
interface PropsWithoutAs<
|
|
@@ -65,11 +88,10 @@ interface PropsWithoutAs<
|
|
|
65
88
|
// New applications should always specify `itemsContainerComponent` property value.
|
|
66
89
|
//
|
|
67
90
|
ItemsContainerComponent extends React.ElementType = 'div'
|
|
68
|
-
> extends
|
|
91
|
+
> extends PropsBase<Item, ItemComponentState> {
|
|
69
92
|
ref: React.Ref<VirtualScrollerRefValue>;
|
|
70
93
|
// If `ref` was just "forwarded" to the `ItemsContainerComponent`, its type would have been this:
|
|
71
94
|
// ref: ComponentRef<ItemsContainerComponent>;
|
|
72
|
-
items: Item[];
|
|
73
95
|
itemComponent: ItemComponent;
|
|
74
96
|
itemComponentProps?: Partial<
|
|
75
97
|
Omit<
|
|
@@ -84,10 +106,6 @@ interface PropsWithoutAs<
|
|
|
84
106
|
React.ComponentPropsWithoutRef<ItemsContainerComponent>
|
|
85
107
|
>;
|
|
86
108
|
itemsContainerRef?: React.ComponentPropsWithRef<ItemsContainerComponent>['ref'];
|
|
87
|
-
initialState?: State<Item, ItemComponentState>;
|
|
88
|
-
preserveScrollPositionOnPrependItems?: boolean;
|
|
89
|
-
readyToStart?: boolean;
|
|
90
|
-
getScrollableContainer?(): HTMLElement;
|
|
91
109
|
}
|
|
92
110
|
|
|
93
111
|
// These are `<VirtualScroller/>` props including the deprecated `as` property.
|
|
@@ -175,6 +193,32 @@ declare function VirtualScroller<
|
|
|
175
193
|
|
|
176
194
|
export default VirtualScroller;
|
|
177
195
|
|
|
196
|
+
export function useVirtualScroller<
|
|
197
|
+
// `Item` is the type of an element of the `items` array.
|
|
198
|
+
Item,
|
|
199
|
+
|
|
200
|
+
// `ItemComponentState` is the type of an item component state.
|
|
201
|
+
// Example: `interface ItemComponentState { expanded?: boolean }`.
|
|
202
|
+
//
|
|
203
|
+
// In most cases, a developer won't even have to bother about item component state
|
|
204
|
+
// because `ItemComponent` won't have any state.
|
|
205
|
+
// In such cases, type `unknown` is used as a "dummy" placeholder
|
|
206
|
+
// just so that TypeScript doesn't complain about this "generic" being unspecified.
|
|
207
|
+
//
|
|
208
|
+
ItemComponentState = unknown
|
|
209
|
+
>(
|
|
210
|
+
props: PropsBase<Item, ItemComponentState>
|
|
211
|
+
): UseVirtualScrollerResult<Item, ItemComponentState>;
|
|
212
|
+
|
|
213
|
+
interface UseVirtualScrollerResult<Item, ItemComponentState> {
|
|
214
|
+
// Use this `state` instead of `virtualScroller.getState()`.
|
|
215
|
+
state: State<Item, ItemComponentState>;
|
|
216
|
+
style?: React.CSSProperties;
|
|
217
|
+
className?: string;
|
|
218
|
+
itemsContainerRef: React.Ref<HTMLElement>;
|
|
219
|
+
virtualScroller: VirtualScrollerCore<HTMLElement, Item, ItemComponentState>;
|
|
220
|
+
}
|
|
221
|
+
|
|
178
222
|
// The props that're passed by `<VirtualScroller/>` to `ItemComponent`.
|
|
179
223
|
export interface VirtualScrollerItemComponentProps<Item, ItemComponentState> {
|
|
180
224
|
item: Item;
|
package/react/index.js
CHANGED
package/rollup.config.mjs
CHANGED
|
@@ -37,7 +37,21 @@ export default [
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
|
-
|
|
40
|
+
// Legacy compatibility:
|
|
41
|
+
//
|
|
42
|
+
// Originally, the default export of the `virtual-scroller/react` subpackage
|
|
43
|
+
// was only the `VirtualScroller` component, and there were no other exports.
|
|
44
|
+
//
|
|
45
|
+
// Later, `useVirtualScroller()` hook export was added.
|
|
46
|
+
// In order to maintain legacy compatibility, the new exports shouldn't "break"
|
|
47
|
+
// the existing environments that were using the old versions of the package.
|
|
48
|
+
// This means that in non-ES6-import environments, any additional exports
|
|
49
|
+
// should be added directly to the default `VirtualScroller` export.
|
|
50
|
+
//
|
|
51
|
+
// That's the reason why it uses "modules/react/VirtualScroller.js" file
|
|
52
|
+
// as `input` here instead of "react/index.js".
|
|
53
|
+
//
|
|
54
|
+
input: 'modules/react/VirtualScroller.js',
|
|
41
55
|
plugins: [
|
|
42
56
|
resolveModules,
|
|
43
57
|
commonjs(),
|
|
@@ -125,6 +125,9 @@ export default function VirtualScrollerConstructor(
|
|
|
125
125
|
// React limits the number of nested updates to prevent infinite loops."
|
|
126
126
|
this._useTimeoutInRenderLoop = _useTimeoutInRenderLoop
|
|
127
127
|
|
|
128
|
+
// `_getItemId()` function is used in `_getItemIndexByItemOrIndex()` function.
|
|
129
|
+
this._getItemId = getItemId
|
|
130
|
+
|
|
128
131
|
if (getItemId) {
|
|
129
132
|
this.isItemEqual = (a, b) => getItemId(a) === getItemId(b)
|
|
130
133
|
} else {
|
|
@@ -45,6 +45,20 @@ export default function() {
|
|
|
45
45
|
if (i >= 0 && i < items.length) {
|
|
46
46
|
return i
|
|
47
47
|
}
|
|
48
|
+
} else {
|
|
49
|
+
// It is also possible that the `item` is stale and that items have already been updated
|
|
50
|
+
// via `.setItems()`. In that case, a developer could supply a `getItemId(item)` function
|
|
51
|
+
// in order for this library to be able to detect the items that have stayed even when
|
|
52
|
+
// their "reference" has changed. To support such case, here it has to also attempt a search
|
|
53
|
+
// for the `item` by its `id` rather than just its "reference".
|
|
54
|
+
const getItemId = this._getItemId
|
|
55
|
+
if (getItemId) {
|
|
56
|
+
const itemId = getItemId(item)
|
|
57
|
+
const i = items.findIndex((item) => getItemId(item) === itemId)
|
|
58
|
+
if (i >= 0) {
|
|
59
|
+
return i
|
|
60
|
+
}
|
|
61
|
+
}
|
|
48
62
|
}
|
|
49
63
|
|
|
50
64
|
reportError(`Item not found: ${JSON.stringify(item)}`)
|