virtual-scroller 1.16.1 → 1.16.3
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/README.md +4 -0
- package/commonjs/Layout.test.js +26 -24
- package/commonjs/Layout.test.js.map +1 -1
- package/commonjs/test/VirtualScroller.js +6 -2
- package/commonjs/test/VirtualScroller.js.map +1 -1
- package/commonjs/utility/px.test.js +9 -5
- package/commonjs/utility/px.test.js.map +1 -1
- package/modules/Layout.test.js +20 -19
- package/modules/Layout.test.js.map +1 -1
- package/modules/test/VirtualScroller.js +3 -1
- package/modules/test/VirtualScroller.js.map +1 -1
- package/modules/utility/px.test.js +5 -3
- package/modules/utility/px.test.js.map +1 -1
- package/package.json +6 -5
- package/react/index.d.ts +1 -1
- package/source/Layout.test.js +21 -20
- package/source/test/VirtualScroller.js +4 -1
- package/source/utility/px.test.js +6 -3
package/README.md
CHANGED
|
@@ -1272,6 +1272,10 @@ For now, I don't see it as a bug that would be worth fixing. The user could just
|
|
|
1272
1272
|
#####
|
|
1273
1273
|
-->
|
|
1274
1274
|
|
|
1275
|
+
### Rendering items as `<table/>` rows
|
|
1276
|
+
|
|
1277
|
+
When using a `<table/>` as an items container, all column widths must be strictly defined. Otherwise, the `<table/>` will automatically adjust column widths based on the content. This "intelligent" approach would've worked in classic HTML when all data is output at once, but it won't work with `virtual-scroller` when only a small subset of data it output at a given moment, and that subset constantly changes, resulting in column widths constantly changing, which not only looks weird but it also makes all row heights contantly change, causing a warning: `"Item index N height changed unexpectedly"`.
|
|
1278
|
+
|
|
1275
1279
|
### Using `<tbody/>` in Internet Explorer
|
|
1276
1280
|
|
|
1277
1281
|
Due to the [inherent limitations](https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1) of the `<tbody/>` HTML tag, when a `<tbody/>` is used as a container for the list items, the `VirtualScroller` ["core"](#core) component has to use a workaround that is based on CSS variables, and CSS variables aren't supported in Internet Explorer. Because of that, using a `<tbody/>` as a list items container won't work in Internet Explorer. In that case, `VirtualScroller` will render itself in "bypass" mode, i.e. it will just render all items from the start, without any "virtualization".
|
package/commonjs/Layout.test.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _mocha = require("mocha");
|
|
4
|
+
|
|
5
|
+
var _chai = require("chai");
|
|
4
6
|
|
|
5
|
-
var
|
|
7
|
+
var _Layout = _interopRequireDefault(require("./Layout.js"));
|
|
6
8
|
|
|
7
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
8
10
|
|
|
9
|
-
describe('Layout', function () {
|
|
10
|
-
it('should work', function () {
|
|
11
|
+
(0, _mocha.describe)('Layout', function () {
|
|
12
|
+
(0, _mocha.it)('should work', function () {
|
|
11
13
|
var SCREEN_HEIGHT = 400;
|
|
12
14
|
var scrollableContainer = {
|
|
13
15
|
width: 800,
|
|
@@ -41,62 +43,62 @@ describe('Layout', function () {
|
|
|
41
43
|
}
|
|
42
44
|
}); // Initial render.
|
|
43
45
|
|
|
44
|
-
layout.getShownItemIndexes({
|
|
46
|
+
(0, _chai.expect)(layout.getShownItemIndexes({
|
|
45
47
|
itemsCount: items.length,
|
|
46
48
|
visibleAreaInsideTheList: {
|
|
47
49
|
top: 0,
|
|
48
50
|
bottom: SCREEN_HEIGHT
|
|
49
51
|
}
|
|
50
|
-
}).
|
|
52
|
+
})).to.deep.equal({
|
|
51
53
|
firstShownItemIndex: 0,
|
|
52
54
|
lastShownItemIndex: 2
|
|
53
55
|
}); // The first item is almost hidden.
|
|
54
56
|
|
|
55
|
-
layout.getShownItemIndexes({
|
|
57
|
+
(0, _chai.expect)(layout.getShownItemIndexes({
|
|
56
58
|
itemsCount: items.length,
|
|
57
59
|
visibleAreaInsideTheList: {
|
|
58
60
|
top: SCREEN_HEIGHT + ITEM_HEIGHT - 1,
|
|
59
61
|
bottom: SCREEN_HEIGHT + ITEM_HEIGHT - 1 + SCREEN_HEIGHT
|
|
60
62
|
}
|
|
61
|
-
}).
|
|
63
|
+
})).to.deep.equal({
|
|
62
64
|
firstShownItemIndex: 0,
|
|
63
65
|
lastShownItemIndex: 4
|
|
64
66
|
}); // The first item is hidden.
|
|
65
67
|
|
|
66
|
-
layout.getShownItemIndexes({
|
|
68
|
+
(0, _chai.expect)(layout.getShownItemIndexes({
|
|
67
69
|
itemsCount: items.length,
|
|
68
70
|
visibleAreaInsideTheList: {
|
|
69
71
|
top: SCREEN_HEIGHT + ITEM_HEIGHT,
|
|
70
72
|
bottom: SCREEN_HEIGHT + ITEM_HEIGHT + SCREEN_HEIGHT
|
|
71
73
|
}
|
|
72
|
-
}).
|
|
74
|
+
})).to.deep.equal({
|
|
73
75
|
firstShownItemIndex: 1,
|
|
74
76
|
lastShownItemIndex: 4
|
|
75
77
|
}); // A new item at the bottom is almost visible.
|
|
76
78
|
|
|
77
|
-
layout.getShownItemIndexes({
|
|
79
|
+
(0, _chai.expect)(layout.getShownItemIndexes({
|
|
78
80
|
itemsCount: items.length,
|
|
79
81
|
visibleAreaInsideTheList: {
|
|
80
82
|
top: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,
|
|
81
83
|
bottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT
|
|
82
84
|
}
|
|
83
|
-
}).
|
|
85
|
+
})).to.deep.equal({
|
|
84
86
|
firstShownItemIndex: 1,
|
|
85
87
|
lastShownItemIndex: 4
|
|
86
88
|
}); // A new item at the bottom is visible.
|
|
87
89
|
|
|
88
|
-
layout.getShownItemIndexes({
|
|
90
|
+
(0, _chai.expect)(layout.getShownItemIndexes({
|
|
89
91
|
itemsCount: items.length,
|
|
90
92
|
visibleAreaInsideTheList: {
|
|
91
93
|
top: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,
|
|
92
94
|
bottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT
|
|
93
95
|
}
|
|
94
|
-
}).
|
|
96
|
+
})).to.deep.equal({
|
|
95
97
|
firstShownItemIndex: 1,
|
|
96
98
|
lastShownItemIndex: 5
|
|
97
99
|
});
|
|
98
100
|
});
|
|
99
|
-
it('should update layout for items incremental change', function () {
|
|
101
|
+
(0, _mocha.it)('should update layout for items incremental change', function () {
|
|
100
102
|
var scrollableContainer = {
|
|
101
103
|
width: 800,
|
|
102
104
|
height: 400
|
|
@@ -128,7 +130,7 @@ describe('Layout', function () {
|
|
|
128
130
|
return scrollableContainer.height;
|
|
129
131
|
}
|
|
130
132
|
});
|
|
131
|
-
layout.getLayoutUpdateForItemsDiff({
|
|
133
|
+
(0, _chai.expect)(layout.getLayoutUpdateForItemsDiff({
|
|
132
134
|
firstShownItemIndex: 3,
|
|
133
135
|
lastShownItemIndex: 5,
|
|
134
136
|
beforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),
|
|
@@ -139,14 +141,14 @@ describe('Layout', function () {
|
|
|
139
141
|
}, {
|
|
140
142
|
itemsCount: 5 + 5 + items.length,
|
|
141
143
|
columnsCount: 1
|
|
142
|
-
}).
|
|
144
|
+
})).to.deep.equal({
|
|
143
145
|
firstShownItemIndex: 5 + 3,
|
|
144
146
|
lastShownItemIndex: 5 + 5,
|
|
145
147
|
beforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),
|
|
146
148
|
afterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)
|
|
147
149
|
});
|
|
148
150
|
});
|
|
149
|
-
it('should update layout for items incremental change (rows get rebalanced)', function () {
|
|
151
|
+
(0, _mocha.it)('should update layout for items incremental change (rows get rebalanced)', function () {
|
|
150
152
|
var scrollableContainer = {
|
|
151
153
|
width: 800,
|
|
152
154
|
height: 400
|
|
@@ -186,7 +188,7 @@ describe('Layout', function () {
|
|
|
186
188
|
errors.push(error);
|
|
187
189
|
};
|
|
188
190
|
|
|
189
|
-
layout.getLayoutUpdateForItemsDiff({
|
|
191
|
+
(0, _chai.expect)(layout.getLayoutUpdateForItemsDiff({
|
|
190
192
|
firstShownItemIndex: 3,
|
|
191
193
|
lastShownItemIndex: 5,
|
|
192
194
|
beforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),
|
|
@@ -201,7 +203,7 @@ describe('Layout', function () {
|
|
|
201
203
|
onResetGridLayout: function onResetGridLayout() {
|
|
202
204
|
return shouldResetGridLayout = true;
|
|
203
205
|
}
|
|
204
|
-
}).
|
|
206
|
+
})).to.deep.equal({
|
|
205
207
|
firstShownItemIndex: 0,
|
|
206
208
|
lastShownItemIndex: 5 + 5,
|
|
207
209
|
beforeItemsHeight: 0,
|
|
@@ -211,10 +213,10 @@ describe('Layout', function () {
|
|
|
211
213
|
|
|
212
214
|
global.VirtualScrollerCatchError = undefined; // Verify the errors that have been `throw`-n.
|
|
213
215
|
|
|
214
|
-
errors.length.
|
|
215
|
-
errors[0].message.
|
|
216
|
-
errors[1].message.
|
|
217
|
-
shouldResetGridLayout.
|
|
216
|
+
(0, _chai.expect)(errors.length).to.equal(2);
|
|
217
|
+
(0, _chai.expect)(errors[0].message).to.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~');
|
|
218
|
+
(0, _chai.expect)(errors[1].message).to.equal('[virtual-scroller] Layout reset required');
|
|
219
|
+
(0, _chai.expect)(shouldResetGridLayout).to.equal(true);
|
|
218
220
|
});
|
|
219
221
|
});
|
|
220
222
|
//# sourceMappingURL=Layout.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.test.js","names":["describe","it","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","Layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","getShownItemIndexes","itemsCount","length","visibleAreaInsideTheList","top","bottom","should","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldResetGridLayout","errors","global","VirtualScrollerCatchError","error","push","shouldRestoreScrollPosition","onResetGridLayout","undefined","message"],"sources":["../source/Layout.test.js"],"sourcesContent":["import Layout from './Layout.js'\r\n\r\nimport Engine from './test/Engine.js'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tbottom: SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlet shouldResetGridLayout\r\n\r\n\t\t// Don't `throw` `VirtualScroller` errors but rather collect them in an array.\r\n\t\tconst errors = []\r\n\t\tglobal.VirtualScrollerCatchError = (error) => {\r\n\t\t\terrors.push(error)\r\n\t\t}\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\r\n\t\t// Stop collecting `VirtualScroller` errors in the `errors` array.\r\n\t\t// Use the default behavior of just `throw`-ing such errors.\r\n\t\tglobal.VirtualScrollerCatchError = undefined\r\n\t\t// Verify the errors that have been `throw`-n.\r\n\t\terrors.length.should.equal(2)\r\n\t\terrors[0].message.should.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~')\r\n\t\terrors[1].message.should.equal('[virtual-scroller] Layout reset required')\r\n\r\n\t\tshouldResetGridLayout.should.equal(true)\r\n\t})\r\n})"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Layout.test.js","names":["describe","it","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","Layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","expect","getShownItemIndexes","itemsCount","length","visibleAreaInsideTheList","top","bottom","to","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldResetGridLayout","errors","global","VirtualScrollerCatchError","error","push","shouldRestoreScrollPosition","onResetGridLayout","undefined","message"],"sources":["../source/Layout.test.js"],"sourcesContent":["import { describe, it } from 'mocha'\r\nimport { expect } from 'chai'\r\n\r\nimport Layout from './Layout.js'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tbottom: SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\texpect(layout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t)).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlet shouldResetGridLayout\r\n\r\n\t\t// Don't `throw` `VirtualScroller` errors but rather collect them in an array.\r\n\t\tconst errors = []\r\n\t\tglobal.VirtualScrollerCatchError = (error) => {\r\n\t\t\terrors.push(error)\r\n\t\t}\r\n\r\n\t\texpect(layout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t}\r\n\t\t)).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\r\n\t\t// Stop collecting `VirtualScroller` errors in the `errors` array.\r\n\t\t// Use the default behavior of just `throw`-ing such errors.\r\n\t\tglobal.VirtualScrollerCatchError = undefined\r\n\t\t// Verify the errors that have been `throw`-n.\r\n\t\texpect(errors.length).to.equal(2)\r\n\t\texpect(errors[0].message).to.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~')\r\n\t\texpect(errors[1].message).to.equal('[virtual-scroller] Layout reset required')\r\n\r\n\t\texpect(shouldResetGridLayout).to.equal(true)\r\n\t})\r\n})"],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports["default"] = void 0;
|
|
7
7
|
|
|
8
|
+
var _mocha = require("mocha");
|
|
9
|
+
|
|
10
|
+
var _chai = require("chai");
|
|
11
|
+
|
|
8
12
|
var _VirtualScroller = _interopRequireDefault(require("../VirtualScroller.js"));
|
|
9
13
|
|
|
10
14
|
var _Engine = _interopRequireDefault(require("./Engine.js"));
|
|
@@ -96,7 +100,7 @@ var TestVirtualScroller = /*#__PURE__*/function () {
|
|
|
96
100
|
if (_this.expectedStateUpdates.length > 0) {
|
|
97
101
|
var expectedStateUpdate = _this.expectedStateUpdates.shift();
|
|
98
102
|
|
|
99
|
-
expect(stateUpdate).to.deep.equal(expectedStateUpdate.stateUpdate);
|
|
103
|
+
(0, _chai.expect)(stateUpdate).to.deep.equal(expectedStateUpdate.stateUpdate);
|
|
100
104
|
|
|
101
105
|
if (expectedStateUpdate.callback) {
|
|
102
106
|
expectedStateUpdate.callback();
|
|
@@ -196,7 +200,7 @@ var TestVirtualScroller = /*#__PURE__*/function () {
|
|
|
196
200
|
key: "verifyState",
|
|
197
201
|
value: function verifyState(expectedState) {
|
|
198
202
|
// `mocha`/`chai`.
|
|
199
|
-
this.virtualScroller.getState().
|
|
203
|
+
(0, _chai.expect)(this.virtualScroller.getState()).to.deep.include(expectedState);
|
|
200
204
|
}
|
|
201
205
|
}, {
|
|
202
206
|
key: "expectStateUpdate",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualScroller.js","names":["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","VirtualScroller","scrollableContainer","engine","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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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["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","VirtualScroller","scrollableContainer","engine","Engine","_waitForScrollingToStop","onStateChange","console","log","getInitialState","useState","updateState","stateUpdateAction","onRender","expectedState","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 { describe, it } from 'mocha'\r\nimport { expect } from 'chai'\r\n\r\nimport 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\texpect(this.virtualScroller.getState()).to.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,14 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _mocha = require("mocha");
|
|
4
|
+
|
|
5
|
+
var _chai = require("chai");
|
|
6
|
+
|
|
3
7
|
var _px = _interopRequireDefault(require("./px.js"));
|
|
4
8
|
|
|
5
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
6
10
|
|
|
7
|
-
describe('utility/px', function () {
|
|
8
|
-
it('should truncate px values', function () {
|
|
9
|
-
(0, _px["default"])(0).
|
|
10
|
-
(0, _px["default"])(1).
|
|
11
|
-
(0, _px["default"])(1.2345).
|
|
11
|
+
(0, _mocha.describe)('utility/px', function () {
|
|
12
|
+
(0, _mocha.it)('should truncate px values', function () {
|
|
13
|
+
(0, _chai.expect)((0, _px["default"])(0)).to.equal('0px');
|
|
14
|
+
(0, _chai.expect)((0, _px["default"])(1)).to.equal('1px');
|
|
15
|
+
(0, _chai.expect)((0, _px["default"])(1.2345)).to.equal('1.23px');
|
|
12
16
|
});
|
|
13
17
|
});
|
|
14
18
|
//# sourceMappingURL=px.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"px.test.js","names":["describe","it","px","
|
|
1
|
+
{"version":3,"file":"px.test.js","names":["describe","it","expect","px","to","equal"],"sources":["../../source/utility/px.test.js"],"sourcesContent":["import { describe, it } from 'mocha'\r\nimport { expect } from 'chai'\r\n\r\nimport px from './px.js'\r\n\r\ndescribe('utility/px', function() {\r\n\tit('should truncate px values', function() {\r\n\t\texpect(px(0)).to.equal('0px')\r\n\t\texpect(px(1)).to.equal('1px')\r\n\t\texpect(px(1.2345)).to.equal('1.23px')\r\n\t})\r\n})"],"mappings":";;AAAA;;AACA;;AAEA;;;;AAEA,IAAAA,eAAA,EAAS,YAAT,EAAuB,YAAW;EACjC,IAAAC,SAAA,EAAG,2BAAH,EAAgC,YAAW;IAC1C,IAAAC,YAAA,EAAO,IAAAC,cAAA,EAAG,CAAH,CAAP,EAAcC,EAAd,CAAiBC,KAAjB,CAAuB,KAAvB;IACA,IAAAH,YAAA,EAAO,IAAAC,cAAA,EAAG,CAAH,CAAP,EAAcC,EAAd,CAAiBC,KAAjB,CAAuB,KAAvB;IACA,IAAAH,YAAA,EAAO,IAAAC,cAAA,EAAG,MAAH,CAAP,EAAmBC,EAAnB,CAAsBC,KAAtB,CAA4B,QAA5B;EACA,CAJD;AAKA,CAND"}
|
package/modules/Layout.test.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { describe, it } from 'mocha';
|
|
2
|
+
import { expect } from 'chai';
|
|
1
3
|
import Layout from './Layout.js';
|
|
2
|
-
import Engine from './test/Engine.js';
|
|
3
4
|
describe('Layout', function () {
|
|
4
5
|
it('should work', function () {
|
|
5
6
|
var SCREEN_HEIGHT = 400;
|
|
@@ -35,57 +36,57 @@ describe('Layout', function () {
|
|
|
35
36
|
}
|
|
36
37
|
}); // Initial render.
|
|
37
38
|
|
|
38
|
-
layout.getShownItemIndexes({
|
|
39
|
+
expect(layout.getShownItemIndexes({
|
|
39
40
|
itemsCount: items.length,
|
|
40
41
|
visibleAreaInsideTheList: {
|
|
41
42
|
top: 0,
|
|
42
43
|
bottom: SCREEN_HEIGHT
|
|
43
44
|
}
|
|
44
|
-
}).
|
|
45
|
+
})).to.deep.equal({
|
|
45
46
|
firstShownItemIndex: 0,
|
|
46
47
|
lastShownItemIndex: 2
|
|
47
48
|
}); // The first item is almost hidden.
|
|
48
49
|
|
|
49
|
-
layout.getShownItemIndexes({
|
|
50
|
+
expect(layout.getShownItemIndexes({
|
|
50
51
|
itemsCount: items.length,
|
|
51
52
|
visibleAreaInsideTheList: {
|
|
52
53
|
top: SCREEN_HEIGHT + ITEM_HEIGHT - 1,
|
|
53
54
|
bottom: SCREEN_HEIGHT + ITEM_HEIGHT - 1 + SCREEN_HEIGHT
|
|
54
55
|
}
|
|
55
|
-
}).
|
|
56
|
+
})).to.deep.equal({
|
|
56
57
|
firstShownItemIndex: 0,
|
|
57
58
|
lastShownItemIndex: 4
|
|
58
59
|
}); // The first item is hidden.
|
|
59
60
|
|
|
60
|
-
layout.getShownItemIndexes({
|
|
61
|
+
expect(layout.getShownItemIndexes({
|
|
61
62
|
itemsCount: items.length,
|
|
62
63
|
visibleAreaInsideTheList: {
|
|
63
64
|
top: SCREEN_HEIGHT + ITEM_HEIGHT,
|
|
64
65
|
bottom: SCREEN_HEIGHT + ITEM_HEIGHT + SCREEN_HEIGHT
|
|
65
66
|
}
|
|
66
|
-
}).
|
|
67
|
+
})).to.deep.equal({
|
|
67
68
|
firstShownItemIndex: 1,
|
|
68
69
|
lastShownItemIndex: 4
|
|
69
70
|
}); // A new item at the bottom is almost visible.
|
|
70
71
|
|
|
71
|
-
layout.getShownItemIndexes({
|
|
72
|
+
expect(layout.getShownItemIndexes({
|
|
72
73
|
itemsCount: items.length,
|
|
73
74
|
visibleAreaInsideTheList: {
|
|
74
75
|
top: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,
|
|
75
76
|
bottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT
|
|
76
77
|
}
|
|
77
|
-
}).
|
|
78
|
+
})).to.deep.equal({
|
|
78
79
|
firstShownItemIndex: 1,
|
|
79
80
|
lastShownItemIndex: 4
|
|
80
81
|
}); // A new item at the bottom is visible.
|
|
81
82
|
|
|
82
|
-
layout.getShownItemIndexes({
|
|
83
|
+
expect(layout.getShownItemIndexes({
|
|
83
84
|
itemsCount: items.length,
|
|
84
85
|
visibleAreaInsideTheList: {
|
|
85
86
|
top: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,
|
|
86
87
|
bottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT
|
|
87
88
|
}
|
|
88
|
-
}).
|
|
89
|
+
})).to.deep.equal({
|
|
89
90
|
firstShownItemIndex: 1,
|
|
90
91
|
lastShownItemIndex: 5
|
|
91
92
|
});
|
|
@@ -122,7 +123,7 @@ describe('Layout', function () {
|
|
|
122
123
|
return scrollableContainer.height;
|
|
123
124
|
}
|
|
124
125
|
});
|
|
125
|
-
layout.getLayoutUpdateForItemsDiff({
|
|
126
|
+
expect(layout.getLayoutUpdateForItemsDiff({
|
|
126
127
|
firstShownItemIndex: 3,
|
|
127
128
|
lastShownItemIndex: 5,
|
|
128
129
|
beforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),
|
|
@@ -133,7 +134,7 @@ describe('Layout', function () {
|
|
|
133
134
|
}, {
|
|
134
135
|
itemsCount: 5 + 5 + items.length,
|
|
135
136
|
columnsCount: 1
|
|
136
|
-
}).
|
|
137
|
+
})).to.deep.equal({
|
|
137
138
|
firstShownItemIndex: 5 + 3,
|
|
138
139
|
lastShownItemIndex: 5 + 5,
|
|
139
140
|
beforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),
|
|
@@ -180,7 +181,7 @@ describe('Layout', function () {
|
|
|
180
181
|
errors.push(error);
|
|
181
182
|
};
|
|
182
183
|
|
|
183
|
-
layout.getLayoutUpdateForItemsDiff({
|
|
184
|
+
expect(layout.getLayoutUpdateForItemsDiff({
|
|
184
185
|
firstShownItemIndex: 3,
|
|
185
186
|
lastShownItemIndex: 5,
|
|
186
187
|
beforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),
|
|
@@ -195,7 +196,7 @@ describe('Layout', function () {
|
|
|
195
196
|
onResetGridLayout: function onResetGridLayout() {
|
|
196
197
|
return shouldResetGridLayout = true;
|
|
197
198
|
}
|
|
198
|
-
}).
|
|
199
|
+
})).to.deep.equal({
|
|
199
200
|
firstShownItemIndex: 0,
|
|
200
201
|
lastShownItemIndex: 5 + 5,
|
|
201
202
|
beforeItemsHeight: 0,
|
|
@@ -205,10 +206,10 @@ describe('Layout', function () {
|
|
|
205
206
|
|
|
206
207
|
global.VirtualScrollerCatchError = undefined; // Verify the errors that have been `throw`-n.
|
|
207
208
|
|
|
208
|
-
errors.length.
|
|
209
|
-
errors[0].message.
|
|
210
|
-
errors[1].message.
|
|
211
|
-
shouldResetGridLayout.
|
|
209
|
+
expect(errors.length).to.equal(2);
|
|
210
|
+
expect(errors[0].message).to.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~');
|
|
211
|
+
expect(errors[1].message).to.equal('[virtual-scroller] Layout reset required');
|
|
212
|
+
expect(shouldResetGridLayout).to.equal(true);
|
|
212
213
|
});
|
|
213
214
|
});
|
|
214
215
|
//# sourceMappingURL=Layout.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.test.js","names":["Layout","Engine","describe","it","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","getShownItemIndexes","itemsCount","length","visibleAreaInsideTheList","top","bottom","should","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldResetGridLayout","errors","global","VirtualScrollerCatchError","error","push","shouldRestoreScrollPosition","onResetGridLayout","undefined","message"],"sources":["../source/Layout.test.js"],"sourcesContent":["import Layout from './Layout.js'\r\n\r\nimport Engine from './test/Engine.js'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tbottom: SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlet shouldResetGridLayout\r\n\r\n\t\t// Don't `throw` `VirtualScroller` errors but rather collect them in an array.\r\n\t\tconst errors = []\r\n\t\tglobal.VirtualScrollerCatchError = (error) => {\r\n\t\t\terrors.push(error)\r\n\t\t}\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\r\n\t\t// Stop collecting `VirtualScroller` errors in the `errors` array.\r\n\t\t// Use the default behavior of just `throw`-ing such errors.\r\n\t\tglobal.VirtualScrollerCatchError = undefined\r\n\t\t// Verify the errors that have been `throw`-n.\r\n\t\terrors.length.should.equal(2)\r\n\t\terrors[0].message.should.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~')\r\n\t\terrors[1].message.should.equal('[virtual-scroller] Layout reset required')\r\n\r\n\t\tshouldResetGridLayout.should.equal(true)\r\n\t})\r\n})"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Layout.test.js","names":["describe","it","expect","Layout","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","getShownItemIndexes","itemsCount","length","visibleAreaInsideTheList","top","bottom","to","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldResetGridLayout","errors","global","VirtualScrollerCatchError","error","push","shouldRestoreScrollPosition","onResetGridLayout","undefined","message"],"sources":["../source/Layout.test.js"],"sourcesContent":["import { describe, it } from 'mocha'\r\nimport { expect } from 'chai'\r\n\r\nimport Layout from './Layout.js'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tbottom: SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\texpect(layout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t})).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\texpect(layout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t)).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlet shouldResetGridLayout\r\n\r\n\t\t// Don't `throw` `VirtualScroller` errors but rather collect them in an array.\r\n\t\tconst errors = []\r\n\t\tglobal.VirtualScrollerCatchError = (error) => {\r\n\t\t\terrors.push(error)\r\n\t\t}\r\n\r\n\t\texpect(layout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t}\r\n\t\t)).to.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\r\n\t\t// Stop collecting `VirtualScroller` errors in the `errors` array.\r\n\t\t// Use the default behavior of just `throw`-ing such errors.\r\n\t\tglobal.VirtualScrollerCatchError = undefined\r\n\t\t// Verify the errors that have been `throw`-n.\r\n\t\texpect(errors.length).to.equal(2)\r\n\t\texpect(errors[0].message).to.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~')\r\n\t\texpect(errors[1].message).to.equal('[virtual-scroller] Layout reset required')\r\n\r\n\t\texpect(shouldResetGridLayout).to.equal(true)\r\n\t})\r\n})"],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+
|
|
|
16
16
|
|
|
17
17
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
18
18
|
|
|
19
|
+
import { describe, it } from 'mocha';
|
|
20
|
+
import { expect } from 'chai';
|
|
19
21
|
import VirtualScroller from '../VirtualScroller.js';
|
|
20
22
|
import Engine from './Engine.js';
|
|
21
23
|
var DEBUG = false;
|
|
@@ -185,7 +187,7 @@ var TestVirtualScroller = /*#__PURE__*/function () {
|
|
|
185
187
|
key: "verifyState",
|
|
186
188
|
value: function verifyState(expectedState) {
|
|
187
189
|
// `mocha`/`chai`.
|
|
188
|
-
this.virtualScroller.getState().
|
|
190
|
+
expect(this.virtualScroller.getState()).to.deep.include(expectedState);
|
|
189
191
|
}
|
|
190
192
|
}, {
|
|
191
193
|
key: "expectStateUpdate",
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"VirtualScroller.js","names":["describe","it","expect","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","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","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 { describe, it } from 'mocha'\r\nimport { expect } from 'chai'\r\n\r\nimport 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\texpect(this.virtualScroller.getState()).to.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,9 +1,11 @@
|
|
|
1
|
+
import { describe, it } from 'mocha';
|
|
2
|
+
import { expect } from 'chai';
|
|
1
3
|
import px from './px.js';
|
|
2
4
|
describe('utility/px', function () {
|
|
3
5
|
it('should truncate px values', function () {
|
|
4
|
-
px(0).
|
|
5
|
-
px(1).
|
|
6
|
-
px(1.2345).
|
|
6
|
+
expect(px(0)).to.equal('0px');
|
|
7
|
+
expect(px(1)).to.equal('1px');
|
|
8
|
+
expect(px(1.2345)).to.equal('1.23px');
|
|
7
9
|
});
|
|
8
10
|
});
|
|
9
11
|
//# sourceMappingURL=px.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"px.test.js","names":["
|
|
1
|
+
{"version":3,"file":"px.test.js","names":["describe","it","expect","px","to","equal"],"sources":["../../source/utility/px.test.js"],"sourcesContent":["import { describe, it } from 'mocha'\r\nimport { expect } from 'chai'\r\n\r\nimport px from './px.js'\r\n\r\ndescribe('utility/px', function() {\r\n\tit('should truncate px values', function() {\r\n\t\texpect(px(0)).to.equal('0px')\r\n\t\texpect(px(1)).to.equal('1px')\r\n\t\texpect(px(1.2345)).to.equal('1.23px')\r\n\t})\r\n})"],"mappings":"AAAA,SAASA,QAAT,EAAmBC,EAAnB,QAA6B,OAA7B;AACA,SAASC,MAAT,QAAuB,MAAvB;AAEA,OAAOC,EAAP,MAAe,SAAf;AAEAH,QAAQ,CAAC,YAAD,EAAe,YAAW;EACjCC,EAAE,CAAC,2BAAD,EAA8B,YAAW;IAC1CC,MAAM,CAACC,EAAE,CAAC,CAAD,CAAH,CAAN,CAAcC,EAAd,CAAiBC,KAAjB,CAAuB,KAAvB;IACAH,MAAM,CAACC,EAAE,CAAC,CAAD,CAAH,CAAN,CAAcC,EAAd,CAAiBC,KAAjB,CAAuB,KAAvB;IACAH,MAAM,CAACC,EAAE,CAAC,MAAD,CAAH,CAAN,CAAmBC,EAAnB,CAAsBC,KAAtB,CAA4B,QAA5B;EACA,CAJC,CAAF;AAKA,CANO,CAAR"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "virtual-scroller",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.3",
|
|
4
4
|
"description": "A component for efficiently rendering large lists of variable height items",
|
|
5
5
|
"main": "index.cjs",
|
|
6
6
|
"module": "index.js",
|
|
@@ -57,11 +57,12 @@
|
|
|
57
57
|
"rollup-plugin-terser": "^7.0.2"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
|
60
|
-
"test": "mocha --
|
|
60
|
+
"test": "mocha --bail --require ./test/globals.js \"source/**/*.test.js\" \"test/*.test.js\" \"test/!(exports)/**/*.test.js\"",
|
|
61
|
+
"test:exports": "mocha --bail \"test/exports/**/*.test.js\"",
|
|
61
62
|
"test-coverage": "npm-run-all build:commonjs:clean build:commonjs build:commonjs:tests test-coverage:commonjs",
|
|
62
|
-
"test-coverage:commonjs": "
|
|
63
|
+
"test-coverage:commonjs": "instanbul cover -x \"*.test.js\" -x \"commonjs/DOM/**/*.js\" -x \"react/DOM/**/*.js\" -x \"commonjs/utility/shallowEqual.js\" -x \"commonjs/utility/debounce.js\" -x \"commonjs/utility/debug.js\" node_modules/mocha/bin/_mocha -- --colors --reporter dot --require regenerator-runtime --require ./test/globals.js \"commonjs/**/*.test.js\" --recursive",
|
|
63
64
|
"coveralls": "nyc report --reporter=text-lcov | coveralls",
|
|
64
|
-
"build:commonjs:tests": "cross-env babel ./test/**/*.js --out-dir ./commonjs/test --source-maps --ignore \"test/exports.test.js\",\"test/VirtualScroller.js\",\"test/
|
|
65
|
+
"build:commonjs:tests": "cross-env babel ./test/**/*.js --out-dir ./commonjs/test --source-maps --ignore \"test/exports.test.js\",\"test/VirtualScroller.js\",\"test/globals.js\"",
|
|
65
66
|
"build:browser": "rollup --config rollup.config.mjs",
|
|
66
67
|
"build:clean": "npm-run-all build:commonjs:clean build:es6:clean",
|
|
67
68
|
"build:commonjs:clean": "rimraf ./commonjs/**/*",
|
|
@@ -71,7 +72,7 @@
|
|
|
71
72
|
"build:es6": "cross-env BABEL_ENV=es6 babel ./source --out-dir ./modules --source-maps --ignore *.test.js",
|
|
72
73
|
"build:es6:clean": "rimraf ./modules/**/*",
|
|
73
74
|
"build": "npm-run-all build:clean build:commonjs build:es6 build:browser",
|
|
74
|
-
"prepublishOnly": "npm-run-all build test"
|
|
75
|
+
"prepublishOnly": "npm-run-all build test test:exports"
|
|
75
76
|
},
|
|
76
77
|
"repository": {
|
|
77
78
|
"type": "git",
|
package/react/index.d.ts
CHANGED
package/source/Layout.test.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { describe, it } from 'mocha'
|
|
2
|
+
import { expect } from 'chai'
|
|
2
3
|
|
|
3
|
-
import
|
|
4
|
+
import Layout from './Layout.js'
|
|
4
5
|
|
|
5
6
|
describe('Layout', function() {
|
|
6
7
|
it('should work', function() {
|
|
@@ -29,61 +30,61 @@ describe('Layout', function() {
|
|
|
29
30
|
})
|
|
30
31
|
|
|
31
32
|
// Initial render.
|
|
32
|
-
layout.getShownItemIndexes({
|
|
33
|
+
expect(layout.getShownItemIndexes({
|
|
33
34
|
itemsCount: items.length,
|
|
34
35
|
visibleAreaInsideTheList: {
|
|
35
36
|
top: 0,
|
|
36
37
|
bottom: SCREEN_HEIGHT
|
|
37
38
|
}
|
|
38
|
-
}).
|
|
39
|
+
})).to.deep.equal({
|
|
39
40
|
firstShownItemIndex: 0,
|
|
40
41
|
lastShownItemIndex: 2
|
|
41
42
|
})
|
|
42
43
|
|
|
43
44
|
// The first item is almost hidden.
|
|
44
|
-
layout.getShownItemIndexes({
|
|
45
|
+
expect(layout.getShownItemIndexes({
|
|
45
46
|
itemsCount: items.length,
|
|
46
47
|
visibleAreaInsideTheList: {
|
|
47
48
|
top: SCREEN_HEIGHT + ITEM_HEIGHT - 1,
|
|
48
49
|
bottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT
|
|
49
50
|
}
|
|
50
|
-
}).
|
|
51
|
+
})).to.deep.equal({
|
|
51
52
|
firstShownItemIndex: 0,
|
|
52
53
|
lastShownItemIndex: 4
|
|
53
54
|
})
|
|
54
55
|
|
|
55
56
|
// The first item is hidden.
|
|
56
|
-
layout.getShownItemIndexes({
|
|
57
|
+
expect(layout.getShownItemIndexes({
|
|
57
58
|
itemsCount: items.length,
|
|
58
59
|
visibleAreaInsideTheList: {
|
|
59
60
|
top: SCREEN_HEIGHT + ITEM_HEIGHT,
|
|
60
61
|
bottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT
|
|
61
62
|
}
|
|
62
|
-
}).
|
|
63
|
+
})).to.deep.equal({
|
|
63
64
|
firstShownItemIndex: 1,
|
|
64
65
|
lastShownItemIndex: 4
|
|
65
66
|
})
|
|
66
67
|
|
|
67
68
|
// A new item at the bottom is almost visible.
|
|
68
|
-
layout.getShownItemIndexes({
|
|
69
|
+
expect(layout.getShownItemIndexes({
|
|
69
70
|
itemsCount: items.length,
|
|
70
71
|
visibleAreaInsideTheList: {
|
|
71
72
|
top: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,
|
|
72
73
|
bottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT
|
|
73
74
|
}
|
|
74
|
-
}).
|
|
75
|
+
})).to.deep.equal({
|
|
75
76
|
firstShownItemIndex: 1,
|
|
76
77
|
lastShownItemIndex: 4
|
|
77
78
|
})
|
|
78
79
|
|
|
79
80
|
// A new item at the bottom is visible.
|
|
80
|
-
layout.getShownItemIndexes({
|
|
81
|
+
expect(layout.getShownItemIndexes({
|
|
81
82
|
itemsCount: items.length,
|
|
82
83
|
visibleAreaInsideTheList: {
|
|
83
84
|
top: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,
|
|
84
85
|
bottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT
|
|
85
86
|
}
|
|
86
|
-
}).
|
|
87
|
+
})).to.deep.equal({
|
|
87
88
|
firstShownItemIndex: 1,
|
|
88
89
|
lastShownItemIndex: 5
|
|
89
90
|
})
|
|
@@ -112,7 +113,7 @@ describe('Layout', function() {
|
|
|
112
113
|
getScrollableContainerHeight: () => scrollableContainer.height
|
|
113
114
|
})
|
|
114
115
|
|
|
115
|
-
layout.getLayoutUpdateForItemsDiff(
|
|
116
|
+
expect(layout.getLayoutUpdateForItemsDiff(
|
|
116
117
|
{
|
|
117
118
|
firstShownItemIndex: 3,
|
|
118
119
|
lastShownItemIndex: 5,
|
|
@@ -126,7 +127,7 @@ describe('Layout', function() {
|
|
|
126
127
|
itemsCount: 5 + 5 + items.length,
|
|
127
128
|
columnsCount: 1
|
|
128
129
|
}
|
|
129
|
-
).
|
|
130
|
+
)).to.deep.equal({
|
|
130
131
|
firstShownItemIndex: 5 + 3,
|
|
131
132
|
lastShownItemIndex: 5 + 5,
|
|
132
133
|
beforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),
|
|
@@ -164,7 +165,7 @@ describe('Layout', function() {
|
|
|
164
165
|
errors.push(error)
|
|
165
166
|
}
|
|
166
167
|
|
|
167
|
-
layout.getLayoutUpdateForItemsDiff(
|
|
168
|
+
expect(layout.getLayoutUpdateForItemsDiff(
|
|
168
169
|
{
|
|
169
170
|
firstShownItemIndex: 3,
|
|
170
171
|
lastShownItemIndex: 5,
|
|
@@ -180,7 +181,7 @@ describe('Layout', function() {
|
|
|
180
181
|
shouldRestoreScrollPosition: true,
|
|
181
182
|
onResetGridLayout: () => shouldResetGridLayout = true
|
|
182
183
|
}
|
|
183
|
-
).
|
|
184
|
+
)).to.deep.equal({
|
|
184
185
|
firstShownItemIndex: 0,
|
|
185
186
|
lastShownItemIndex: 5 + 5,
|
|
186
187
|
beforeItemsHeight: 0,
|
|
@@ -191,10 +192,10 @@ describe('Layout', function() {
|
|
|
191
192
|
// Use the default behavior of just `throw`-ing such errors.
|
|
192
193
|
global.VirtualScrollerCatchError = undefined
|
|
193
194
|
// Verify the errors that have been `throw`-n.
|
|
194
|
-
errors.length.
|
|
195
|
-
errors[0].message.
|
|
196
|
-
errors[1].message.
|
|
195
|
+
expect(errors.length).to.equal(2)
|
|
196
|
+
expect(errors[0].message).to.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~')
|
|
197
|
+
expect(errors[1].message).to.equal('[virtual-scroller] Layout reset required')
|
|
197
198
|
|
|
198
|
-
shouldResetGridLayout.
|
|
199
|
+
expect(shouldResetGridLayout).to.equal(true)
|
|
199
200
|
})
|
|
200
201
|
})
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { describe, it } from 'mocha'
|
|
2
|
+
import { expect } from 'chai'
|
|
3
|
+
|
|
1
4
|
import VirtualScroller from '../VirtualScroller.js'
|
|
2
5
|
import Engine from './Engine.js'
|
|
3
6
|
|
|
@@ -151,7 +154,7 @@ export default class TestVirtualScroller {
|
|
|
151
154
|
|
|
152
155
|
verifyState(expectedState) {
|
|
153
156
|
// `mocha`/`chai`.
|
|
154
|
-
this.virtualScroller.getState().
|
|
157
|
+
expect(this.virtualScroller.getState()).to.deep.include(expectedState)
|
|
155
158
|
}
|
|
156
159
|
|
|
157
160
|
expectStateUpdate(stateUpdate, callback) {
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { describe, it } from 'mocha'
|
|
2
|
+
import { expect } from 'chai'
|
|
3
|
+
|
|
1
4
|
import px from './px.js'
|
|
2
5
|
|
|
3
6
|
describe('utility/px', function() {
|
|
4
7
|
it('should truncate px values', function() {
|
|
5
|
-
px(0).
|
|
6
|
-
px(1).
|
|
7
|
-
px(1.2345).
|
|
8
|
+
expect(px(0)).to.equal('0px')
|
|
9
|
+
expect(px(1)).to.equal('1px')
|
|
10
|
+
expect(px(1.2345)).to.equal('1.23px')
|
|
8
11
|
})
|
|
9
12
|
})
|