@react-stately/layout 4.0.3-nightly.5042 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GridLayout.main.js +1 -1
- package/dist/GridLayout.main.js.map +1 -1
- package/dist/GridLayout.mjs +1 -1
- package/dist/GridLayout.module.js +1 -1
- package/dist/GridLayout.module.js.map +1 -1
- package/dist/ListLayout.main.js +41 -25
- package/dist/ListLayout.main.js.map +1 -1
- package/dist/ListLayout.mjs +41 -25
- package/dist/ListLayout.module.js +41 -25
- package/dist/ListLayout.module.js.map +1 -1
- package/dist/TableLayout.main.js +45 -34
- package/dist/TableLayout.main.js.map +1 -1
- package/dist/TableLayout.mjs +45 -34
- package/dist/TableLayout.module.js +45 -34
- package/dist/TableLayout.module.js.map +1 -1
- package/dist/types.d.ts +13 -11
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/GridLayout.ts +15 -15
- package/src/ListLayout.ts +60 -46
- package/src/TableLayout.ts +54 -39
package/dist/ListLayout.mjs
CHANGED
|
@@ -15,6 +15,10 @@ import {Rect as $img26$Rect, Size as $img26$Size, LayoutInfo as $img26$LayoutInf
|
|
|
15
15
|
|
|
16
16
|
const $61ef60fc9b1041f4$var$DEFAULT_HEIGHT = 48;
|
|
17
17
|
class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
18
|
+
// Backward compatibility for subclassing.
|
|
19
|
+
get collection() {
|
|
20
|
+
return this.virtualizer.collection;
|
|
21
|
+
}
|
|
18
22
|
getLayoutInfo(key) {
|
|
19
23
|
var _this_layoutNodes_get;
|
|
20
24
|
this.ensureLayoutInfo(key);
|
|
@@ -24,8 +28,8 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
24
28
|
// Adjust rect to keep number of visible rows consistent.
|
|
25
29
|
// (only if height > 1 for getDropTargetFromPoint)
|
|
26
30
|
if (rect.height > 1) {
|
|
27
|
-
var _this_rowHeight;
|
|
28
|
-
let rowHeight = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight;
|
|
31
|
+
var _this_rowHeight, _ref;
|
|
32
|
+
let rowHeight = (_ref = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight) !== null && _ref !== void 0 ? _ref : $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
29
33
|
rect.y = Math.floor(rect.y / rowHeight) * rowHeight;
|
|
30
34
|
rect.height = Math.ceil(rect.height / rowHeight) * rowHeight;
|
|
31
35
|
}
|
|
@@ -71,10 +75,10 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
71
75
|
shouldInvalidateEverything(invalidationContext) {
|
|
72
76
|
// Invalidate cache if the size of the collection changed.
|
|
73
77
|
// In this case, we need to recalculate the entire layout.
|
|
74
|
-
return invalidationContext.sizeChanged;
|
|
78
|
+
return invalidationContext.sizeChanged || false;
|
|
75
79
|
}
|
|
76
80
|
update(invalidationContext) {
|
|
77
|
-
|
|
81
|
+
let collection = this.virtualizer.collection;
|
|
78
82
|
// Reset valid rect if we will have to invalidate everything.
|
|
79
83
|
// Otherwise we can reuse cached layout infos outside the current visible rect.
|
|
80
84
|
this.invalidateEverything = this.shouldInvalidateEverything(invalidationContext);
|
|
@@ -84,23 +88,24 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
84
88
|
}
|
|
85
89
|
this.rootNodes = this.buildCollection();
|
|
86
90
|
// Remove deleted layout nodes
|
|
87
|
-
if (this.lastCollection &&
|
|
88
|
-
for (let key of this.lastCollection.getKeys())if (!
|
|
91
|
+
if (this.lastCollection && collection !== this.lastCollection) {
|
|
92
|
+
for (let key of this.lastCollection.getKeys())if (!collection.getItem(key)) {
|
|
89
93
|
let layoutNode = this.layoutNodes.get(key);
|
|
90
94
|
if (layoutNode) this.layoutNodes.delete(key);
|
|
91
95
|
}
|
|
92
96
|
}
|
|
93
97
|
this.lastWidth = this.virtualizer.visibleRect.width;
|
|
94
|
-
this.lastCollection =
|
|
98
|
+
this.lastCollection = collection;
|
|
95
99
|
this.invalidateEverything = false;
|
|
96
100
|
this.validRect = this.requestedRect.copy();
|
|
97
101
|
}
|
|
98
102
|
buildCollection(y = 0) {
|
|
103
|
+
let collection = this.virtualizer.collection;
|
|
99
104
|
let skipped = 0;
|
|
100
105
|
let nodes = [];
|
|
101
|
-
for (let node of
|
|
102
|
-
var _this_rowHeight;
|
|
103
|
-
let rowHeight = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight;
|
|
106
|
+
for (let node of collection){
|
|
107
|
+
var _this_rowHeight, _ref;
|
|
108
|
+
let rowHeight = (_ref = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight) !== null && _ref !== void 0 ? _ref : $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
104
109
|
// Skip rows before the valid rectangle unless they are already cached.
|
|
105
110
|
if (node.type === 'item' && y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {
|
|
106
111
|
y += rowHeight;
|
|
@@ -111,7 +116,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
111
116
|
y = layoutNode.layoutInfo.rect.maxY;
|
|
112
117
|
nodes.push(layoutNode);
|
|
113
118
|
if (node.type === 'item' && y > this.requestedRect.maxY) {
|
|
114
|
-
y += (
|
|
119
|
+
y += (collection.size - (nodes.length + skipped)) * rowHeight;
|
|
115
120
|
break;
|
|
116
121
|
}
|
|
117
122
|
}
|
|
@@ -139,28 +144,31 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
139
144
|
return this.buildSectionHeader(node, x, y);
|
|
140
145
|
case 'loader':
|
|
141
146
|
return this.buildLoader(node, x, y);
|
|
147
|
+
default:
|
|
148
|
+
throw new Error('Unsupported node type: ' + node.type);
|
|
142
149
|
}
|
|
143
150
|
}
|
|
144
151
|
buildLoader(node, x, y) {
|
|
145
152
|
let rect = new (0, $img26$Rect)(x, y, 0, 0);
|
|
146
153
|
let layoutInfo = new (0, $img26$LayoutInfo)('loader', node.key, rect);
|
|
147
154
|
rect.width = this.virtualizer.contentSize.width;
|
|
148
|
-
rect.height = this.loaderHeight || this.rowHeight || this.estimatedRowHeight;
|
|
155
|
+
rect.height = this.loaderHeight || this.rowHeight || this.estimatedRowHeight || $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
149
156
|
return {
|
|
150
157
|
layoutInfo: layoutInfo,
|
|
151
158
|
validRect: rect.intersection(this.requestedRect)
|
|
152
159
|
};
|
|
153
160
|
}
|
|
154
161
|
buildSection(node, x, y) {
|
|
162
|
+
let collection = this.virtualizer.collection;
|
|
155
163
|
let width = this.virtualizer.visibleRect.width;
|
|
156
164
|
let rect = new (0, $img26$Rect)(0, y, width, 0);
|
|
157
165
|
let layoutInfo = new (0, $img26$LayoutInfo)(node.type, node.key, rect);
|
|
158
166
|
let startY = y;
|
|
159
167
|
let skipped = 0;
|
|
160
168
|
let children = [];
|
|
161
|
-
for (let child of (0, $img26$getChildNodes)(node,
|
|
162
|
-
var _this_rowHeight;
|
|
163
|
-
let rowHeight = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight;
|
|
169
|
+
for (let child of (0, $img26$getChildNodes)(node, collection)){
|
|
170
|
+
var _this_rowHeight, _ref;
|
|
171
|
+
let rowHeight = (_ref = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight) !== null && _ref !== void 0 ? _ref : $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
164
172
|
// Skip rows before the valid rectangle unless they are already cached.
|
|
165
173
|
if (y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {
|
|
166
174
|
y += rowHeight;
|
|
@@ -173,7 +181,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
173
181
|
if (y > this.requestedRect.maxY) {
|
|
174
182
|
// Estimate the remaining height for rows that we don't need to layout right now.
|
|
175
183
|
y += ([
|
|
176
|
-
...(0, $img26$getChildNodes)(node,
|
|
184
|
+
...(0, $img26$getChildNodes)(node, collection)
|
|
177
185
|
].length - (children.length + skipped)) * rowHeight;
|
|
178
186
|
break;
|
|
179
187
|
}
|
|
@@ -198,7 +206,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
198
206
|
let previousLayoutNode = this.layoutNodes.get(node.key);
|
|
199
207
|
let previousLayoutInfo = previousLayoutNode === null || previousLayoutNode === void 0 ? void 0 : previousLayoutNode.layoutInfo;
|
|
200
208
|
if (previousLayoutInfo) {
|
|
201
|
-
let curNode = this.collection.getItem(node.key);
|
|
209
|
+
let curNode = this.virtualizer.collection.getItem(node.key);
|
|
202
210
|
let lastNode = this.lastCollection ? this.lastCollection.getItem(node.key) : null;
|
|
203
211
|
rectHeight = previousLayoutInfo.rect.height;
|
|
204
212
|
isEstimated = width !== this.lastWidth || curNode !== lastNode || previousLayoutInfo.estimatedSize;
|
|
@@ -251,6 +259,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
251
259
|
let layoutNode = this.layoutNodes.get(key);
|
|
252
260
|
// If no layoutInfo, item has been deleted/removed.
|
|
253
261
|
if (!layoutNode) return false;
|
|
262
|
+
let collection = this.virtualizer.collection;
|
|
254
263
|
let layoutInfo = layoutNode.layoutInfo;
|
|
255
264
|
layoutInfo.estimatedSize = false;
|
|
256
265
|
if (layoutInfo.rect.height !== size.height) {
|
|
@@ -265,10 +274,10 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
265
274
|
this.requestedRect.height += newLayoutInfo.rect.height - layoutInfo.rect.height;
|
|
266
275
|
// Invalidate layout for this layout node and all parents
|
|
267
276
|
this.updateLayoutNode(key, layoutInfo, newLayoutInfo);
|
|
268
|
-
let node =
|
|
277
|
+
let node = layoutInfo.parentKey != null ? collection.getItem(layoutInfo.parentKey) : null;
|
|
269
278
|
while(node){
|
|
270
279
|
this.updateLayoutNode(node.key, layoutInfo, newLayoutInfo);
|
|
271
|
-
node =
|
|
280
|
+
node = node.parentKey != null ? collection.getItem(node.parentKey) : null;
|
|
272
281
|
}
|
|
273
282
|
return true;
|
|
274
283
|
}
|
|
@@ -290,10 +299,11 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
290
299
|
x += this.virtualizer.visibleRect.x;
|
|
291
300
|
y += this.virtualizer.visibleRect.y;
|
|
292
301
|
let key = this.virtualizer.keyAtPoint(new (0, $img26$Point)(x, y));
|
|
293
|
-
if (key == null || this.collection.size === 0) return {
|
|
302
|
+
if (key == null || this.virtualizer.collection.size === 0) return {
|
|
294
303
|
type: 'root'
|
|
295
304
|
};
|
|
296
305
|
let layoutInfo = this.getLayoutInfo(key);
|
|
306
|
+
if (!layoutInfo) return null;
|
|
297
307
|
let rect = layoutInfo.rect;
|
|
298
308
|
let target = {
|
|
299
309
|
type: 'item',
|
|
@@ -335,16 +345,22 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
335
345
|
* of the options that can be provided.
|
|
336
346
|
*/ constructor(options = {}){
|
|
337
347
|
super();
|
|
338
|
-
|
|
339
|
-
this.
|
|
340
|
-
|
|
341
|
-
this.
|
|
342
|
-
|
|
348
|
+
var _options_rowHeight;
|
|
349
|
+
this.rowHeight = (_options_rowHeight = options.rowHeight) !== null && _options_rowHeight !== void 0 ? _options_rowHeight : null;
|
|
350
|
+
var _options_estimatedRowHeight;
|
|
351
|
+
this.estimatedRowHeight = (_options_estimatedRowHeight = options.estimatedRowHeight) !== null && _options_estimatedRowHeight !== void 0 ? _options_estimatedRowHeight : null;
|
|
352
|
+
var _options_headingHeight;
|
|
353
|
+
this.headingHeight = (_options_headingHeight = options.headingHeight) !== null && _options_headingHeight !== void 0 ? _options_headingHeight : null;
|
|
354
|
+
var _options_estimatedHeadingHeight;
|
|
355
|
+
this.estimatedHeadingHeight = (_options_estimatedHeadingHeight = options.estimatedHeadingHeight) !== null && _options_estimatedHeadingHeight !== void 0 ? _options_estimatedHeadingHeight : null;
|
|
356
|
+
var _options_loaderHeight;
|
|
357
|
+
this.loaderHeight = (_options_loaderHeight = options.loaderHeight) !== null && _options_loaderHeight !== void 0 ? _options_loaderHeight : null;
|
|
343
358
|
this.dropIndicatorThickness = options.dropIndicatorThickness || 2;
|
|
344
359
|
this.layoutNodes = new Map();
|
|
345
360
|
this.rootNodes = [];
|
|
346
361
|
this.lastWidth = 0;
|
|
347
362
|
this.lastCollection = null;
|
|
363
|
+
this.invalidateEverything = false;
|
|
348
364
|
this.validRect = new (0, $img26$Rect)();
|
|
349
365
|
this.requestedRect = new (0, $img26$Rect)();
|
|
350
366
|
this.contentSize = new (0, $img26$Size)();
|
|
@@ -15,6 +15,10 @@ import {Rect as $img26$Rect, Size as $img26$Size, LayoutInfo as $img26$LayoutInf
|
|
|
15
15
|
|
|
16
16
|
const $61ef60fc9b1041f4$var$DEFAULT_HEIGHT = 48;
|
|
17
17
|
class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
18
|
+
// Backward compatibility for subclassing.
|
|
19
|
+
get collection() {
|
|
20
|
+
return this.virtualizer.collection;
|
|
21
|
+
}
|
|
18
22
|
getLayoutInfo(key) {
|
|
19
23
|
var _this_layoutNodes_get;
|
|
20
24
|
this.ensureLayoutInfo(key);
|
|
@@ -24,8 +28,8 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
24
28
|
// Adjust rect to keep number of visible rows consistent.
|
|
25
29
|
// (only if height > 1 for getDropTargetFromPoint)
|
|
26
30
|
if (rect.height > 1) {
|
|
27
|
-
var _this_rowHeight;
|
|
28
|
-
let rowHeight = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight;
|
|
31
|
+
var _this_rowHeight, _ref;
|
|
32
|
+
let rowHeight = (_ref = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight) !== null && _ref !== void 0 ? _ref : $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
29
33
|
rect.y = Math.floor(rect.y / rowHeight) * rowHeight;
|
|
30
34
|
rect.height = Math.ceil(rect.height / rowHeight) * rowHeight;
|
|
31
35
|
}
|
|
@@ -71,10 +75,10 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
71
75
|
shouldInvalidateEverything(invalidationContext) {
|
|
72
76
|
// Invalidate cache if the size of the collection changed.
|
|
73
77
|
// In this case, we need to recalculate the entire layout.
|
|
74
|
-
return invalidationContext.sizeChanged;
|
|
78
|
+
return invalidationContext.sizeChanged || false;
|
|
75
79
|
}
|
|
76
80
|
update(invalidationContext) {
|
|
77
|
-
|
|
81
|
+
let collection = this.virtualizer.collection;
|
|
78
82
|
// Reset valid rect if we will have to invalidate everything.
|
|
79
83
|
// Otherwise we can reuse cached layout infos outside the current visible rect.
|
|
80
84
|
this.invalidateEverything = this.shouldInvalidateEverything(invalidationContext);
|
|
@@ -84,23 +88,24 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
84
88
|
}
|
|
85
89
|
this.rootNodes = this.buildCollection();
|
|
86
90
|
// Remove deleted layout nodes
|
|
87
|
-
if (this.lastCollection &&
|
|
88
|
-
for (let key of this.lastCollection.getKeys())if (!
|
|
91
|
+
if (this.lastCollection && collection !== this.lastCollection) {
|
|
92
|
+
for (let key of this.lastCollection.getKeys())if (!collection.getItem(key)) {
|
|
89
93
|
let layoutNode = this.layoutNodes.get(key);
|
|
90
94
|
if (layoutNode) this.layoutNodes.delete(key);
|
|
91
95
|
}
|
|
92
96
|
}
|
|
93
97
|
this.lastWidth = this.virtualizer.visibleRect.width;
|
|
94
|
-
this.lastCollection =
|
|
98
|
+
this.lastCollection = collection;
|
|
95
99
|
this.invalidateEverything = false;
|
|
96
100
|
this.validRect = this.requestedRect.copy();
|
|
97
101
|
}
|
|
98
102
|
buildCollection(y = 0) {
|
|
103
|
+
let collection = this.virtualizer.collection;
|
|
99
104
|
let skipped = 0;
|
|
100
105
|
let nodes = [];
|
|
101
|
-
for (let node of
|
|
102
|
-
var _this_rowHeight;
|
|
103
|
-
let rowHeight = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight;
|
|
106
|
+
for (let node of collection){
|
|
107
|
+
var _this_rowHeight, _ref;
|
|
108
|
+
let rowHeight = (_ref = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight) !== null && _ref !== void 0 ? _ref : $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
104
109
|
// Skip rows before the valid rectangle unless they are already cached.
|
|
105
110
|
if (node.type === 'item' && y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {
|
|
106
111
|
y += rowHeight;
|
|
@@ -111,7 +116,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
111
116
|
y = layoutNode.layoutInfo.rect.maxY;
|
|
112
117
|
nodes.push(layoutNode);
|
|
113
118
|
if (node.type === 'item' && y > this.requestedRect.maxY) {
|
|
114
|
-
y += (
|
|
119
|
+
y += (collection.size - (nodes.length + skipped)) * rowHeight;
|
|
115
120
|
break;
|
|
116
121
|
}
|
|
117
122
|
}
|
|
@@ -139,28 +144,31 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
139
144
|
return this.buildSectionHeader(node, x, y);
|
|
140
145
|
case 'loader':
|
|
141
146
|
return this.buildLoader(node, x, y);
|
|
147
|
+
default:
|
|
148
|
+
throw new Error('Unsupported node type: ' + node.type);
|
|
142
149
|
}
|
|
143
150
|
}
|
|
144
151
|
buildLoader(node, x, y) {
|
|
145
152
|
let rect = new (0, $img26$Rect)(x, y, 0, 0);
|
|
146
153
|
let layoutInfo = new (0, $img26$LayoutInfo)('loader', node.key, rect);
|
|
147
154
|
rect.width = this.virtualizer.contentSize.width;
|
|
148
|
-
rect.height = this.loaderHeight || this.rowHeight || this.estimatedRowHeight;
|
|
155
|
+
rect.height = this.loaderHeight || this.rowHeight || this.estimatedRowHeight || $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
149
156
|
return {
|
|
150
157
|
layoutInfo: layoutInfo,
|
|
151
158
|
validRect: rect.intersection(this.requestedRect)
|
|
152
159
|
};
|
|
153
160
|
}
|
|
154
161
|
buildSection(node, x, y) {
|
|
162
|
+
let collection = this.virtualizer.collection;
|
|
155
163
|
let width = this.virtualizer.visibleRect.width;
|
|
156
164
|
let rect = new (0, $img26$Rect)(0, y, width, 0);
|
|
157
165
|
let layoutInfo = new (0, $img26$LayoutInfo)(node.type, node.key, rect);
|
|
158
166
|
let startY = y;
|
|
159
167
|
let skipped = 0;
|
|
160
168
|
let children = [];
|
|
161
|
-
for (let child of (0, $img26$getChildNodes)(node,
|
|
162
|
-
var _this_rowHeight;
|
|
163
|
-
let rowHeight = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight;
|
|
169
|
+
for (let child of (0, $img26$getChildNodes)(node, collection)){
|
|
170
|
+
var _this_rowHeight, _ref;
|
|
171
|
+
let rowHeight = (_ref = (_this_rowHeight = this.rowHeight) !== null && _this_rowHeight !== void 0 ? _this_rowHeight : this.estimatedRowHeight) !== null && _ref !== void 0 ? _ref : $61ef60fc9b1041f4$var$DEFAULT_HEIGHT;
|
|
164
172
|
// Skip rows before the valid rectangle unless they are already cached.
|
|
165
173
|
if (y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {
|
|
166
174
|
y += rowHeight;
|
|
@@ -173,7 +181,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
173
181
|
if (y > this.requestedRect.maxY) {
|
|
174
182
|
// Estimate the remaining height for rows that we don't need to layout right now.
|
|
175
183
|
y += ([
|
|
176
|
-
...(0, $img26$getChildNodes)(node,
|
|
184
|
+
...(0, $img26$getChildNodes)(node, collection)
|
|
177
185
|
].length - (children.length + skipped)) * rowHeight;
|
|
178
186
|
break;
|
|
179
187
|
}
|
|
@@ -198,7 +206,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
198
206
|
let previousLayoutNode = this.layoutNodes.get(node.key);
|
|
199
207
|
let previousLayoutInfo = previousLayoutNode === null || previousLayoutNode === void 0 ? void 0 : previousLayoutNode.layoutInfo;
|
|
200
208
|
if (previousLayoutInfo) {
|
|
201
|
-
let curNode = this.collection.getItem(node.key);
|
|
209
|
+
let curNode = this.virtualizer.collection.getItem(node.key);
|
|
202
210
|
let lastNode = this.lastCollection ? this.lastCollection.getItem(node.key) : null;
|
|
203
211
|
rectHeight = previousLayoutInfo.rect.height;
|
|
204
212
|
isEstimated = width !== this.lastWidth || curNode !== lastNode || previousLayoutInfo.estimatedSize;
|
|
@@ -251,6 +259,7 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
251
259
|
let layoutNode = this.layoutNodes.get(key);
|
|
252
260
|
// If no layoutInfo, item has been deleted/removed.
|
|
253
261
|
if (!layoutNode) return false;
|
|
262
|
+
let collection = this.virtualizer.collection;
|
|
254
263
|
let layoutInfo = layoutNode.layoutInfo;
|
|
255
264
|
layoutInfo.estimatedSize = false;
|
|
256
265
|
if (layoutInfo.rect.height !== size.height) {
|
|
@@ -265,10 +274,10 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
265
274
|
this.requestedRect.height += newLayoutInfo.rect.height - layoutInfo.rect.height;
|
|
266
275
|
// Invalidate layout for this layout node and all parents
|
|
267
276
|
this.updateLayoutNode(key, layoutInfo, newLayoutInfo);
|
|
268
|
-
let node =
|
|
277
|
+
let node = layoutInfo.parentKey != null ? collection.getItem(layoutInfo.parentKey) : null;
|
|
269
278
|
while(node){
|
|
270
279
|
this.updateLayoutNode(node.key, layoutInfo, newLayoutInfo);
|
|
271
|
-
node =
|
|
280
|
+
node = node.parentKey != null ? collection.getItem(node.parentKey) : null;
|
|
272
281
|
}
|
|
273
282
|
return true;
|
|
274
283
|
}
|
|
@@ -290,10 +299,11 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
290
299
|
x += this.virtualizer.visibleRect.x;
|
|
291
300
|
y += this.virtualizer.visibleRect.y;
|
|
292
301
|
let key = this.virtualizer.keyAtPoint(new (0, $img26$Point)(x, y));
|
|
293
|
-
if (key == null || this.collection.size === 0) return {
|
|
302
|
+
if (key == null || this.virtualizer.collection.size === 0) return {
|
|
294
303
|
type: 'root'
|
|
295
304
|
};
|
|
296
305
|
let layoutInfo = this.getLayoutInfo(key);
|
|
306
|
+
if (!layoutInfo) return null;
|
|
297
307
|
let rect = layoutInfo.rect;
|
|
298
308
|
let target = {
|
|
299
309
|
type: 'item',
|
|
@@ -335,16 +345,22 @@ class $61ef60fc9b1041f4$export$cacbb3924155d68e extends (0, $img26$Layout) {
|
|
|
335
345
|
* of the options that can be provided.
|
|
336
346
|
*/ constructor(options = {}){
|
|
337
347
|
super();
|
|
338
|
-
|
|
339
|
-
this.
|
|
340
|
-
|
|
341
|
-
this.
|
|
342
|
-
|
|
348
|
+
var _options_rowHeight;
|
|
349
|
+
this.rowHeight = (_options_rowHeight = options.rowHeight) !== null && _options_rowHeight !== void 0 ? _options_rowHeight : null;
|
|
350
|
+
var _options_estimatedRowHeight;
|
|
351
|
+
this.estimatedRowHeight = (_options_estimatedRowHeight = options.estimatedRowHeight) !== null && _options_estimatedRowHeight !== void 0 ? _options_estimatedRowHeight : null;
|
|
352
|
+
var _options_headingHeight;
|
|
353
|
+
this.headingHeight = (_options_headingHeight = options.headingHeight) !== null && _options_headingHeight !== void 0 ? _options_headingHeight : null;
|
|
354
|
+
var _options_estimatedHeadingHeight;
|
|
355
|
+
this.estimatedHeadingHeight = (_options_estimatedHeadingHeight = options.estimatedHeadingHeight) !== null && _options_estimatedHeadingHeight !== void 0 ? _options_estimatedHeadingHeight : null;
|
|
356
|
+
var _options_loaderHeight;
|
|
357
|
+
this.loaderHeight = (_options_loaderHeight = options.loaderHeight) !== null && _options_loaderHeight !== void 0 ? _options_loaderHeight : null;
|
|
343
358
|
this.dropIndicatorThickness = options.dropIndicatorThickness || 2;
|
|
344
359
|
this.layoutNodes = new Map();
|
|
345
360
|
this.rootNodes = [];
|
|
346
361
|
this.lastWidth = 0;
|
|
347
362
|
this.lastCollection = null;
|
|
363
|
+
this.invalidateEverything = false;
|
|
348
364
|
this.validRect = new (0, $img26$Rect)();
|
|
349
365
|
this.requestedRect = new (0, $img26$Rect)();
|
|
350
366
|
this.contentSize = new (0, $img26$Size)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/@react-stately/layout/src/ListLayout.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, DropTarget, DropTargetDelegate, ItemDropTarget, Key, Node} from '@react-types/shared';\nimport {getChildNodes} from '@react-stately/collections';\nimport {InvalidationContext, Layout, LayoutInfo, Point, Rect, Size} from '@react-stately/virtualizer';\n\nexport interface ListLayoutOptions {\n /** The fixed height of a row in px. */\n rowHeight?: number,\n /** The estimated height of a row, when row heights are variable. */\n estimatedRowHeight?: number,\n /** The fixed height of a section header in px. */\n headingHeight?: number,\n /** The estimated height of a section header, when the height is variable. */\n estimatedHeadingHeight?: number,\n /** The fixed height of a loader element in px. This loader is specifically for\n * \"load more\" elements rendered when loading more rows at the root level or inside nested row/sections.\n */\n loaderHeight?: number,\n /** The thickness of the drop indicator. */\n dropIndicatorThickness?: number\n}\n\n// A wrapper around LayoutInfo that supports hierarchy\nexport interface LayoutNode {\n node?: Node<unknown>,\n layoutInfo: LayoutInfo,\n children?: LayoutNode[],\n validRect: Rect,\n index?: number\n}\n\nconst DEFAULT_HEIGHT = 48;\n\n/**\n * The ListLayout class is an implementation of a virtualizer {@link Layout}.\n * To configure a ListLayout, you can use the properties to define the\n * layouts and/or use the method for defining indentation.\n * The {@link ListKeyboardDelegate} extends the existing virtualizer\n * delegate with an additional method to do this (it uses the same delegate object as\n * the virtualizer itself).\n */\nexport class ListLayout<T, O = any> extends Layout<Node<T>, O> implements DropTargetDelegate {\n protected rowHeight: number;\n protected estimatedRowHeight: number;\n protected headingHeight: number;\n protected estimatedHeadingHeight: number;\n protected loaderHeight: number;\n protected dropIndicatorThickness: number;\n protected layoutNodes: Map<Key, LayoutNode>;\n protected contentSize: Size;\n protected collection: Collection<Node<T>>;\n private lastCollection: Collection<Node<T>>;\n private lastWidth: number;\n protected rootNodes: LayoutNode[];\n private invalidateEverything: boolean;\n /** The rectangle containing currently valid layout infos. */\n protected validRect: Rect;\n /** The rectangle of requested layout infos so far. */\n protected requestedRect: Rect;\n\n /**\n * Creates a new ListLayout with options. See the list of properties below for a description\n * of the options that can be provided.\n */\n constructor(options: ListLayoutOptions = {}) {\n super();\n this.rowHeight = options.rowHeight;\n this.estimatedRowHeight = options.estimatedRowHeight;\n this.headingHeight = options.headingHeight;\n this.estimatedHeadingHeight = options.estimatedHeadingHeight;\n this.loaderHeight = options.loaderHeight;\n this.dropIndicatorThickness = options.dropIndicatorThickness || 2;\n this.layoutNodes = new Map();\n this.rootNodes = [];\n this.lastWidth = 0;\n this.lastCollection = null;\n this.validRect = new Rect();\n this.requestedRect = new Rect();\n this.contentSize = new Size();\n }\n\n getLayoutInfo(key: Key) {\n this.ensureLayoutInfo(key);\n return this.layoutNodes.get(key)?.layoutInfo || null;\n }\n\n getVisibleLayoutInfos(rect: Rect) {\n // Adjust rect to keep number of visible rows consistent.\n // (only if height > 1 for getDropTargetFromPoint)\n if (rect.height > 1) {\n let rowHeight = (this.rowHeight ?? this.estimatedRowHeight);\n rect.y = Math.floor(rect.y / rowHeight) * rowHeight;\n rect.height = Math.ceil(rect.height / rowHeight) * rowHeight;\n }\n\n // If layout hasn't yet been done for the requested rect, union the\n // new rect with the existing valid rect, and recompute.\n this.layoutIfNeeded(rect);\n\n let res: LayoutInfo[] = [];\n\n let addNodes = (nodes: LayoutNode[]) => {\n for (let node of nodes) {\n if (this.isVisible(node, rect)) {\n res.push(node.layoutInfo);\n\n if (node.children) {\n addNodes(node.children);\n }\n }\n }\n };\n\n addNodes(this.rootNodes);\n return res;\n }\n\n protected layoutIfNeeded(rect: Rect) {\n if (!this.lastCollection) {\n return;\n }\n\n if (!this.requestedRect.containsRect(rect)) {\n this.requestedRect = this.requestedRect.union(rect);\n this.rootNodes = this.buildCollection();\n }\n \n // Ensure all of the persisted keys are available.\n for (let key of this.virtualizer.persistedKeys) {\n if (this.ensureLayoutInfo(key)) {\n return;\n }\n }\n }\n\n private ensureLayoutInfo(key: Key) {\n // If the layout info wasn't found, it might be outside the bounds of the area that we've\n // computed layout for so far. This can happen when accessing a random key, e.g pressing Home/End.\n // Compute the full layout and try again.\n if (!this.layoutNodes.has(key) && this.requestedRect.area < this.contentSize.area && this.lastCollection) {\n this.requestedRect = new Rect(0, 0, Infinity, Infinity);\n this.rootNodes = this.buildCollection();\n this.requestedRect = new Rect(0, 0, this.contentSize.width, this.contentSize.height);\n return true;\n }\n\n return false;\n }\n\n protected isVisible(node: LayoutNode, rect: Rect) {\n return node.layoutInfo.rect.intersects(rect) || node.layoutInfo.isSticky || node.layoutInfo.type === 'header' || this.virtualizer.isPersistedKey(node.layoutInfo.key);\n }\n\n protected shouldInvalidateEverything(invalidationContext: InvalidationContext<O>) {\n // Invalidate cache if the size of the collection changed.\n // In this case, we need to recalculate the entire layout.\n return invalidationContext.sizeChanged;\n }\n\n update(invalidationContext: InvalidationContext<O>) {\n this.collection = this.virtualizer.collection;\n\n // Reset valid rect if we will have to invalidate everything.\n // Otherwise we can reuse cached layout infos outside the current visible rect.\n this.invalidateEverything = this.shouldInvalidateEverything(invalidationContext);\n if (this.invalidateEverything) {\n this.requestedRect = this.virtualizer.visibleRect.copy();\n this.layoutNodes.clear();\n }\n\n this.rootNodes = this.buildCollection();\n\n // Remove deleted layout nodes\n if (this.lastCollection && this.collection !== this.lastCollection) {\n for (let key of this.lastCollection.getKeys()) {\n if (!this.collection.getItem(key)) {\n let layoutNode = this.layoutNodes.get(key);\n if (layoutNode) {\n this.layoutNodes.delete(key);\n }\n }\n }\n }\n\n this.lastWidth = this.virtualizer.visibleRect.width;\n this.lastCollection = this.collection;\n this.invalidateEverything = false;\n this.validRect = this.requestedRect.copy();\n }\n\n protected buildCollection(y = 0): LayoutNode[] {\n let skipped = 0;\n let nodes = [];\n for (let node of this.collection) {\n let rowHeight = this.rowHeight ?? this.estimatedRowHeight;\n\n // Skip rows before the valid rectangle unless they are already cached.\n if (node.type === 'item' && y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {\n y += rowHeight;\n skipped++;\n continue;\n }\n\n let layoutNode = this.buildChild(node, 0, y, null);\n y = layoutNode.layoutInfo.rect.maxY;\n nodes.push(layoutNode);\n\n if (node.type === 'item' && y > this.requestedRect.maxY) {\n y += (this.collection.size - (nodes.length + skipped)) * rowHeight;\n break;\n }\n }\n\n this.contentSize = new Size(this.virtualizer.visibleRect.width, y);\n return nodes;\n }\n\n protected isValid(node: Node<T>, y: number) {\n let cached = this.layoutNodes.get(node.key);\n return (\n !this.invalidateEverything &&\n cached &&\n cached.node === node &&\n y === cached.layoutInfo.rect.y &&\n cached.layoutInfo.rect.intersects(this.validRect) &&\n cached.validRect.containsRect(cached.layoutInfo.rect.intersection(this.requestedRect))\n );\n }\n\n protected buildChild(node: Node<T>, x: number, y: number, parentKey: Key | null): LayoutNode {\n if (this.isValid(node, y)) {\n return this.layoutNodes.get(node.key);\n }\n\n let layoutNode = this.buildNode(node, x, y);\n\n layoutNode.layoutInfo.parentKey = parentKey ?? null;\n this.layoutNodes.set(node.key, layoutNode);\n return layoutNode;\n }\n\n protected buildNode(node: Node<T>, x: number, y: number): LayoutNode {\n switch (node.type) {\n case 'section':\n return this.buildSection(node, x, y);\n case 'item':\n return this.buildItem(node, x, y);\n case 'header':\n return this.buildSectionHeader(node, x, y);\n case 'loader':\n return this.buildLoader(node, x, y);\n }\n }\n\n protected buildLoader(node: Node<T>, x: number, y: number): LayoutNode {\n let rect = new Rect(x, y, 0, 0);\n let layoutInfo = new LayoutInfo('loader', node.key, rect);\n rect.width = this.virtualizer.contentSize.width;\n rect.height = this.loaderHeight || this.rowHeight || this.estimatedRowHeight;\n\n return {\n layoutInfo,\n validRect: rect.intersection(this.requestedRect)\n };\n }\n\n protected buildSection(node: Node<T>, x: number, y: number): LayoutNode {\n let width = this.virtualizer.visibleRect.width;\n let rect = new Rect(0, y, width, 0);\n let layoutInfo = new LayoutInfo(node.type, node.key, rect);\n\n let startY = y;\n let skipped = 0;\n let children = [];\n for (let child of getChildNodes(node, this.collection)) {\n let rowHeight = (this.rowHeight ?? this.estimatedRowHeight);\n\n // Skip rows before the valid rectangle unless they are already cached.\n if (y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {\n y += rowHeight;\n skipped++;\n continue;\n }\n\n let layoutNode = this.buildChild(child, x, y, layoutInfo.key);\n y = layoutNode.layoutInfo.rect.maxY;\n children.push(layoutNode);\n\n if (y > this.requestedRect.maxY) {\n // Estimate the remaining height for rows that we don't need to layout right now.\n y += ([...getChildNodes(node, this.collection)].length - (children.length + skipped)) * rowHeight;\n break;\n }\n }\n\n rect.height = y - startY;\n\n return {\n layoutInfo,\n children,\n validRect: layoutInfo.rect.intersection(this.requestedRect),\n node\n };\n }\n\n protected buildSectionHeader(node: Node<T>, x: number, y: number): LayoutNode {\n let width = this.virtualizer.visibleRect.width;\n let rectHeight = this.headingHeight;\n let isEstimated = false;\n\n // If no explicit height is available, use an estimated height.\n if (rectHeight == null) {\n // If a previous version of this layout info exists, reuse its height.\n // Mark as estimated if the size of the overall virtualizer changed,\n // or the content of the item changed.\n let previousLayoutNode = this.layoutNodes.get(node.key);\n let previousLayoutInfo = previousLayoutNode?.layoutInfo;\n if (previousLayoutInfo) {\n let curNode = this.collection.getItem(node.key);\n let lastNode = this.lastCollection ? this.lastCollection.getItem(node.key) : null;\n rectHeight = previousLayoutInfo.rect.height;\n isEstimated = width !== this.lastWidth || curNode !== lastNode || previousLayoutInfo.estimatedSize;\n } else {\n rectHeight = (node.rendered ? this.estimatedHeadingHeight : 0);\n isEstimated = true;\n }\n }\n\n if (rectHeight == null) {\n rectHeight = DEFAULT_HEIGHT;\n }\n\n let headerRect = new Rect(0, y, width, rectHeight);\n let header = new LayoutInfo('header', node.key, headerRect);\n header.estimatedSize = isEstimated;\n return {\n layoutInfo: header,\n children: [],\n validRect: header.rect.intersection(this.requestedRect),\n node\n };\n }\n\n protected buildItem(node: Node<T>, x: number, y: number): LayoutNode {\n let width = this.virtualizer.visibleRect.width;\n let rectHeight = this.rowHeight;\n let isEstimated = false;\n\n // If no explicit height is available, use an estimated height.\n if (rectHeight == null) {\n // If a previous version of this layout info exists, reuse its height.\n // Mark as estimated if the size of the overall virtualizer changed,\n // or the content of the item changed.\n let previousLayoutNode = this.layoutNodes.get(node.key);\n if (previousLayoutNode) {\n rectHeight = previousLayoutNode.layoutInfo.rect.height;\n isEstimated = width !== this.lastWidth || node !== previousLayoutNode.node || previousLayoutNode.layoutInfo.estimatedSize;\n } else {\n rectHeight = this.estimatedRowHeight;\n isEstimated = true;\n }\n }\n\n if (rectHeight == null) {\n rectHeight = DEFAULT_HEIGHT;\n }\n\n let rect = new Rect(x, y, width - x, rectHeight);\n let layoutInfo = new LayoutInfo(node.type, node.key, rect);\n layoutInfo.estimatedSize = isEstimated;\n return {\n layoutInfo,\n children: [],\n validRect: layoutInfo.rect,\n node\n };\n }\n\n updateItemSize(key: Key, size: Size) {\n let layoutNode = this.layoutNodes.get(key);\n // If no layoutInfo, item has been deleted/removed.\n if (!layoutNode) {\n return false;\n }\n\n let layoutInfo = layoutNode.layoutInfo;\n layoutInfo.estimatedSize = false;\n if (layoutInfo.rect.height !== size.height) {\n // Copy layout info rather than mutating so that later caches are invalidated.\n let newLayoutInfo = layoutInfo.copy();\n newLayoutInfo.rect.height = size.height;\n layoutNode.layoutInfo = newLayoutInfo;\n\n // Items after this layoutInfo will need to be repositioned to account for the new height.\n // Adjust the validRect so that only items above remain valid.\n this.validRect.height = Math.min(this.validRect.height, layoutInfo.rect.y - this.validRect.y);\n\n // The requestedRect also needs to be adjusted to account for the height difference.\n this.requestedRect.height += newLayoutInfo.rect.height - layoutInfo.rect.height;\n\n // Invalidate layout for this layout node and all parents\n this.updateLayoutNode(key, layoutInfo, newLayoutInfo);\n\n let node = this.collection.getItem(layoutInfo.parentKey);\n while (node) {\n this.updateLayoutNode(node.key, layoutInfo, newLayoutInfo);\n node = this.collection.getItem(node.parentKey);\n }\n\n return true;\n }\n\n return false;\n }\n\n private updateLayoutNode(key: Key, oldLayoutInfo: LayoutInfo, newLayoutInfo: LayoutInfo) {\n let n = this.layoutNodes.get(key);\n if (n) {\n // Invalidate by intersecting the validRect of this node with the overall validRect.\n n.validRect = n.validRect.intersection(this.validRect);\n\n // Replace layout info in LayoutNode\n if (n.layoutInfo === oldLayoutInfo) {\n n.layoutInfo = newLayoutInfo;\n }\n }\n }\n\n getContentSize() {\n return this.contentSize;\n }\n\n getDropTargetFromPoint(x: number, y: number, isValidDropTarget: (target: DropTarget) => boolean): DropTarget {\n x += this.virtualizer.visibleRect.x;\n y += this.virtualizer.visibleRect.y;\n\n let key = this.virtualizer.keyAtPoint(new Point(x, y));\n if (key == null || this.collection.size === 0) {\n return {type: 'root'};\n }\n\n let layoutInfo = this.getLayoutInfo(key);\n let rect = layoutInfo.rect;\n let target: DropTarget = {\n type: 'item',\n key: layoutInfo.key,\n dropPosition: 'on'\n };\n\n // If dropping on the item isn't accepted, try the target before or after depending on the y position.\n // Otherwise, if dropping on the item is accepted, still try the before/after positions if within 10px\n // of the top or bottom of the item.\n if (!isValidDropTarget(target)) {\n if (y <= rect.y + rect.height / 2 && isValidDropTarget({...target, dropPosition: 'before'})) {\n target.dropPosition = 'before';\n } else if (isValidDropTarget({...target, dropPosition: 'after'})) {\n target.dropPosition = 'after';\n }\n } else if (y <= rect.y + 10 && isValidDropTarget({...target, dropPosition: 'before'})) {\n target.dropPosition = 'before';\n } else if (y >= rect.maxY - 10 && isValidDropTarget({...target, dropPosition: 'after'})) {\n target.dropPosition = 'after';\n }\n\n return target;\n }\n\n getDropTargetLayoutInfo(target: ItemDropTarget): LayoutInfo {\n let layoutInfo = this.getLayoutInfo(target.key);\n let rect: Rect;\n if (target.dropPosition === 'before') {\n rect = new Rect(layoutInfo.rect.x, layoutInfo.rect.y - this.dropIndicatorThickness / 2, layoutInfo.rect.width, this.dropIndicatorThickness);\n } else if (target.dropPosition === 'after') {\n rect = new Rect(layoutInfo.rect.x, layoutInfo.rect.maxY - this.dropIndicatorThickness / 2, layoutInfo.rect.width, this.dropIndicatorThickness);\n } else {\n rect = layoutInfo.rect;\n }\n\n return new LayoutInfo('dropIndicator', target.key + ':' + target.dropPosition, rect);\n }\n}\n"],"names":[],"version":3,"file":"ListLayout.module.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["packages/@react-stately/layout/src/ListLayout.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, DropTarget, DropTargetDelegate, ItemDropTarget, Key, Node} from '@react-types/shared';\nimport {getChildNodes} from '@react-stately/collections';\nimport {InvalidationContext, Layout, LayoutInfo, Point, Rect, Size} from '@react-stately/virtualizer';\n\nexport interface ListLayoutOptions {\n /** The fixed height of a row in px. */\n rowHeight?: number,\n /** The estimated height of a row, when row heights are variable. */\n estimatedRowHeight?: number,\n /** The fixed height of a section header in px. */\n headingHeight?: number,\n /** The estimated height of a section header, when the height is variable. */\n estimatedHeadingHeight?: number,\n /** The fixed height of a loader element in px. This loader is specifically for\n * \"load more\" elements rendered when loading more rows at the root level or inside nested row/sections.\n */\n loaderHeight?: number,\n /** The thickness of the drop indicator. */\n dropIndicatorThickness?: number\n}\n\n// A wrapper around LayoutInfo that supports hierarchy\nexport interface LayoutNode {\n node?: Node<unknown>,\n layoutInfo: LayoutInfo,\n children?: LayoutNode[],\n validRect: Rect,\n index?: number\n}\n\nconst DEFAULT_HEIGHT = 48;\n\n/**\n * The ListLayout class is an implementation of a virtualizer {@link Layout}.\n * To configure a ListLayout, you can use the properties to define the\n * layouts and/or use the method for defining indentation.\n * The {@link ListKeyboardDelegate} extends the existing virtualizer\n * delegate with an additional method to do this (it uses the same delegate object as\n * the virtualizer itself).\n */\nexport class ListLayout<T, O = any> extends Layout<Node<T>, O> implements DropTargetDelegate {\n protected rowHeight: number | null;\n protected estimatedRowHeight: number | null;\n protected headingHeight: number | null;\n protected estimatedHeadingHeight: number | null;\n protected loaderHeight: number | null;\n protected dropIndicatorThickness: number;\n protected layoutNodes: Map<Key, LayoutNode>;\n protected contentSize: Size;\n protected lastCollection: Collection<Node<T>> | null;\n private lastWidth: number;\n protected rootNodes: LayoutNode[];\n private invalidateEverything: boolean;\n /** The rectangle containing currently valid layout infos. */\n protected validRect: Rect;\n /** The rectangle of requested layout infos so far. */\n protected requestedRect: Rect;\n\n /**\n * Creates a new ListLayout with options. See the list of properties below for a description\n * of the options that can be provided.\n */\n constructor(options: ListLayoutOptions = {}) {\n super();\n this.rowHeight = options.rowHeight ?? null;\n this.estimatedRowHeight = options.estimatedRowHeight ?? null;\n this.headingHeight = options.headingHeight ?? null;\n this.estimatedHeadingHeight = options.estimatedHeadingHeight ?? null;\n this.loaderHeight = options.loaderHeight ?? null;\n this.dropIndicatorThickness = options.dropIndicatorThickness || 2;\n this.layoutNodes = new Map();\n this.rootNodes = [];\n this.lastWidth = 0;\n this.lastCollection = null;\n this.invalidateEverything = false;\n this.validRect = new Rect();\n this.requestedRect = new Rect();\n this.contentSize = new Size();\n }\n\n // Backward compatibility for subclassing.\n protected get collection(): Collection<Node<T>> {\n return this.virtualizer!.collection;\n }\n\n getLayoutInfo(key: Key) {\n this.ensureLayoutInfo(key);\n return this.layoutNodes.get(key)?.layoutInfo || null;\n }\n\n getVisibleLayoutInfos(rect: Rect) {\n // Adjust rect to keep number of visible rows consistent.\n // (only if height > 1 for getDropTargetFromPoint)\n if (rect.height > 1) {\n let rowHeight = this.rowHeight ?? this.estimatedRowHeight ?? DEFAULT_HEIGHT;\n rect.y = Math.floor(rect.y / rowHeight) * rowHeight;\n rect.height = Math.ceil(rect.height / rowHeight) * rowHeight;\n }\n\n // If layout hasn't yet been done for the requested rect, union the\n // new rect with the existing valid rect, and recompute.\n this.layoutIfNeeded(rect);\n\n let res: LayoutInfo[] = [];\n\n let addNodes = (nodes: LayoutNode[]) => {\n for (let node of nodes) {\n if (this.isVisible(node, rect)) {\n res.push(node.layoutInfo);\n\n if (node.children) {\n addNodes(node.children);\n }\n }\n }\n };\n\n addNodes(this.rootNodes);\n return res;\n }\n\n protected layoutIfNeeded(rect: Rect) {\n if (!this.lastCollection) {\n return;\n }\n\n if (!this.requestedRect.containsRect(rect)) {\n this.requestedRect = this.requestedRect.union(rect);\n this.rootNodes = this.buildCollection();\n }\n \n // Ensure all of the persisted keys are available.\n for (let key of this.virtualizer!.persistedKeys) {\n if (this.ensureLayoutInfo(key)) {\n return;\n }\n }\n }\n\n private ensureLayoutInfo(key: Key) {\n // If the layout info wasn't found, it might be outside the bounds of the area that we've\n // computed layout for so far. This can happen when accessing a random key, e.g pressing Home/End.\n // Compute the full layout and try again.\n if (!this.layoutNodes.has(key) && this.requestedRect.area < this.contentSize.area && this.lastCollection) {\n this.requestedRect = new Rect(0, 0, Infinity, Infinity);\n this.rootNodes = this.buildCollection();\n this.requestedRect = new Rect(0, 0, this.contentSize.width, this.contentSize.height);\n return true;\n }\n\n return false;\n }\n\n protected isVisible(node: LayoutNode, rect: Rect) {\n return node.layoutInfo.rect.intersects(rect) || node.layoutInfo.isSticky || node.layoutInfo.type === 'header' || this.virtualizer!.isPersistedKey(node.layoutInfo.key);\n }\n\n protected shouldInvalidateEverything(invalidationContext: InvalidationContext<O>) {\n // Invalidate cache if the size of the collection changed.\n // In this case, we need to recalculate the entire layout.\n return invalidationContext.sizeChanged || false;\n }\n\n update(invalidationContext: InvalidationContext<O>) {\n let collection = this.virtualizer!.collection;\n\n // Reset valid rect if we will have to invalidate everything.\n // Otherwise we can reuse cached layout infos outside the current visible rect.\n this.invalidateEverything = this.shouldInvalidateEverything(invalidationContext);\n if (this.invalidateEverything) {\n this.requestedRect = this.virtualizer!.visibleRect.copy();\n this.layoutNodes.clear();\n }\n\n this.rootNodes = this.buildCollection();\n\n // Remove deleted layout nodes\n if (this.lastCollection && collection !== this.lastCollection) {\n for (let key of this.lastCollection.getKeys()) {\n if (!collection.getItem(key)) {\n let layoutNode = this.layoutNodes.get(key);\n if (layoutNode) {\n this.layoutNodes.delete(key);\n }\n }\n }\n }\n\n this.lastWidth = this.virtualizer!.visibleRect.width;\n this.lastCollection = collection;\n this.invalidateEverything = false;\n this.validRect = this.requestedRect.copy();\n }\n\n protected buildCollection(y = 0): LayoutNode[] {\n let collection = this.virtualizer!.collection;\n let skipped = 0;\n let nodes: LayoutNode[] = [];\n for (let node of collection) {\n let rowHeight = this.rowHeight ?? this.estimatedRowHeight ?? DEFAULT_HEIGHT;\n\n // Skip rows before the valid rectangle unless they are already cached.\n if (node.type === 'item' && y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {\n y += rowHeight;\n skipped++;\n continue;\n }\n\n let layoutNode = this.buildChild(node, 0, y, null);\n y = layoutNode.layoutInfo.rect.maxY;\n nodes.push(layoutNode);\n\n if (node.type === 'item' && y > this.requestedRect.maxY) {\n y += (collection.size - (nodes.length + skipped)) * rowHeight;\n break;\n }\n }\n\n this.contentSize = new Size(this.virtualizer!.visibleRect.width, y);\n return nodes;\n }\n\n protected isValid(node: Node<T>, y: number) {\n let cached = this.layoutNodes.get(node.key);\n return (\n !this.invalidateEverything &&\n cached &&\n cached.node === node &&\n y === cached.layoutInfo.rect.y &&\n cached.layoutInfo.rect.intersects(this.validRect) &&\n cached.validRect.containsRect(cached.layoutInfo.rect.intersection(this.requestedRect))\n );\n }\n\n protected buildChild(node: Node<T>, x: number, y: number, parentKey: Key | null): LayoutNode {\n if (this.isValid(node, y)) {\n return this.layoutNodes.get(node.key)!;\n }\n\n let layoutNode = this.buildNode(node, x, y);\n\n layoutNode.layoutInfo.parentKey = parentKey ?? null;\n this.layoutNodes.set(node.key, layoutNode);\n return layoutNode;\n }\n\n protected buildNode(node: Node<T>, x: number, y: number): LayoutNode {\n switch (node.type) {\n case 'section':\n return this.buildSection(node, x, y);\n case 'item':\n return this.buildItem(node, x, y);\n case 'header':\n return this.buildSectionHeader(node, x, y);\n case 'loader':\n return this.buildLoader(node, x, y);\n default:\n throw new Error('Unsupported node type: ' + node.type);\n }\n }\n\n protected buildLoader(node: Node<T>, x: number, y: number): LayoutNode {\n let rect = new Rect(x, y, 0, 0);\n let layoutInfo = new LayoutInfo('loader', node.key, rect);\n rect.width = this.virtualizer!.contentSize.width;\n rect.height = this.loaderHeight || this.rowHeight || this.estimatedRowHeight || DEFAULT_HEIGHT;\n\n return {\n layoutInfo,\n validRect: rect.intersection(this.requestedRect)\n };\n }\n\n protected buildSection(node: Node<T>, x: number, y: number): LayoutNode {\n let collection = this.virtualizer!.collection;\n let width = this.virtualizer!.visibleRect.width;\n let rect = new Rect(0, y, width, 0);\n let layoutInfo = new LayoutInfo(node.type, node.key, rect);\n\n let startY = y;\n let skipped = 0;\n let children: LayoutNode[] = [];\n for (let child of getChildNodes(node, collection)) {\n let rowHeight = (this.rowHeight ?? this.estimatedRowHeight ?? DEFAULT_HEIGHT);\n\n // Skip rows before the valid rectangle unless they are already cached.\n if (y + rowHeight < this.requestedRect.y && !this.isValid(node, y)) {\n y += rowHeight;\n skipped++;\n continue;\n }\n\n let layoutNode = this.buildChild(child, x, y, layoutInfo.key);\n y = layoutNode.layoutInfo.rect.maxY;\n children.push(layoutNode);\n\n if (y > this.requestedRect.maxY) {\n // Estimate the remaining height for rows that we don't need to layout right now.\n y += ([...getChildNodes(node, collection)].length - (children.length + skipped)) * rowHeight;\n break;\n }\n }\n\n rect.height = y - startY;\n\n return {\n layoutInfo,\n children,\n validRect: layoutInfo.rect.intersection(this.requestedRect),\n node\n };\n }\n\n protected buildSectionHeader(node: Node<T>, x: number, y: number): LayoutNode {\n let width = this.virtualizer!.visibleRect.width;\n let rectHeight = this.headingHeight;\n let isEstimated = false;\n\n // If no explicit height is available, use an estimated height.\n if (rectHeight == null) {\n // If a previous version of this layout info exists, reuse its height.\n // Mark as estimated if the size of the overall virtualizer changed,\n // or the content of the item changed.\n let previousLayoutNode = this.layoutNodes.get(node.key);\n let previousLayoutInfo = previousLayoutNode?.layoutInfo;\n if (previousLayoutInfo) {\n let curNode = this.virtualizer!.collection.getItem(node.key);\n let lastNode = this.lastCollection ? this.lastCollection.getItem(node.key) : null;\n rectHeight = previousLayoutInfo.rect.height;\n isEstimated = width !== this.lastWidth || curNode !== lastNode || previousLayoutInfo.estimatedSize;\n } else {\n rectHeight = (node.rendered ? this.estimatedHeadingHeight : 0);\n isEstimated = true;\n }\n }\n\n if (rectHeight == null) {\n rectHeight = DEFAULT_HEIGHT;\n }\n\n let headerRect = new Rect(0, y, width, rectHeight);\n let header = new LayoutInfo('header', node.key, headerRect);\n header.estimatedSize = isEstimated;\n return {\n layoutInfo: header,\n children: [],\n validRect: header.rect.intersection(this.requestedRect),\n node\n };\n }\n\n protected buildItem(node: Node<T>, x: number, y: number): LayoutNode {\n let width = this.virtualizer!.visibleRect.width;\n let rectHeight = this.rowHeight;\n let isEstimated = false;\n\n // If no explicit height is available, use an estimated height.\n if (rectHeight == null) {\n // If a previous version of this layout info exists, reuse its height.\n // Mark as estimated if the size of the overall virtualizer changed,\n // or the content of the item changed.\n let previousLayoutNode = this.layoutNodes.get(node.key);\n if (previousLayoutNode) {\n rectHeight = previousLayoutNode.layoutInfo.rect.height;\n isEstimated = width !== this.lastWidth || node !== previousLayoutNode.node || previousLayoutNode.layoutInfo.estimatedSize;\n } else {\n rectHeight = this.estimatedRowHeight;\n isEstimated = true;\n }\n }\n\n if (rectHeight == null) {\n rectHeight = DEFAULT_HEIGHT;\n }\n\n let rect = new Rect(x, y, width - x, rectHeight);\n let layoutInfo = new LayoutInfo(node.type, node.key, rect);\n layoutInfo.estimatedSize = isEstimated;\n return {\n layoutInfo,\n children: [],\n validRect: layoutInfo.rect,\n node\n };\n }\n\n updateItemSize(key: Key, size: Size) {\n let layoutNode = this.layoutNodes.get(key);\n // If no layoutInfo, item has been deleted/removed.\n if (!layoutNode) {\n return false;\n }\n\n let collection = this.virtualizer!.collection;\n let layoutInfo = layoutNode.layoutInfo;\n layoutInfo.estimatedSize = false;\n if (layoutInfo.rect.height !== size.height) {\n // Copy layout info rather than mutating so that later caches are invalidated.\n let newLayoutInfo = layoutInfo.copy();\n newLayoutInfo.rect.height = size.height;\n layoutNode.layoutInfo = newLayoutInfo;\n\n // Items after this layoutInfo will need to be repositioned to account for the new height.\n // Adjust the validRect so that only items above remain valid.\n this.validRect.height = Math.min(this.validRect.height, layoutInfo.rect.y - this.validRect.y);\n\n // The requestedRect also needs to be adjusted to account for the height difference.\n this.requestedRect.height += newLayoutInfo.rect.height - layoutInfo.rect.height;\n\n // Invalidate layout for this layout node and all parents\n this.updateLayoutNode(key, layoutInfo, newLayoutInfo);\n\n let node = layoutInfo.parentKey != null ? collection.getItem(layoutInfo.parentKey) : null;\n while (node) {\n this.updateLayoutNode(node.key, layoutInfo, newLayoutInfo);\n node = node.parentKey != null ? collection.getItem(node.parentKey) : null;\n }\n\n return true;\n }\n\n return false;\n }\n\n private updateLayoutNode(key: Key, oldLayoutInfo: LayoutInfo, newLayoutInfo: LayoutInfo) {\n let n = this.layoutNodes.get(key);\n if (n) {\n // Invalidate by intersecting the validRect of this node with the overall validRect.\n n.validRect = n.validRect.intersection(this.validRect);\n\n // Replace layout info in LayoutNode\n if (n.layoutInfo === oldLayoutInfo) {\n n.layoutInfo = newLayoutInfo;\n }\n }\n }\n\n getContentSize() {\n return this.contentSize;\n }\n\n getDropTargetFromPoint(x: number, y: number, isValidDropTarget: (target: DropTarget) => boolean): DropTarget | null {\n x += this.virtualizer!.visibleRect.x;\n y += this.virtualizer!.visibleRect.y;\n\n let key = this.virtualizer!.keyAtPoint(new Point(x, y));\n if (key == null || this.virtualizer!.collection.size === 0) {\n return {type: 'root'};\n }\n\n let layoutInfo = this.getLayoutInfo(key);\n if (!layoutInfo) {\n return null;\n }\n\n let rect = layoutInfo.rect;\n let target: DropTarget = {\n type: 'item',\n key: layoutInfo.key,\n dropPosition: 'on'\n };\n\n // If dropping on the item isn't accepted, try the target before or after depending on the y position.\n // Otherwise, if dropping on the item is accepted, still try the before/after positions if within 10px\n // of the top or bottom of the item.\n if (!isValidDropTarget(target)) {\n if (y <= rect.y + rect.height / 2 && isValidDropTarget({...target, dropPosition: 'before'})) {\n target.dropPosition = 'before';\n } else if (isValidDropTarget({...target, dropPosition: 'after'})) {\n target.dropPosition = 'after';\n }\n } else if (y <= rect.y + 10 && isValidDropTarget({...target, dropPosition: 'before'})) {\n target.dropPosition = 'before';\n } else if (y >= rect.maxY - 10 && isValidDropTarget({...target, dropPosition: 'after'})) {\n target.dropPosition = 'after';\n }\n\n return target;\n }\n\n getDropTargetLayoutInfo(target: ItemDropTarget): LayoutInfo {\n let layoutInfo = this.getLayoutInfo(target.key)!;\n let rect: Rect;\n if (target.dropPosition === 'before') {\n rect = new Rect(layoutInfo.rect.x, layoutInfo.rect.y - this.dropIndicatorThickness / 2, layoutInfo.rect.width, this.dropIndicatorThickness);\n } else if (target.dropPosition === 'after') {\n rect = new Rect(layoutInfo.rect.x, layoutInfo.rect.maxY - this.dropIndicatorThickness / 2, layoutInfo.rect.width, this.dropIndicatorThickness);\n } else {\n rect = layoutInfo.rect;\n }\n\n return new LayoutInfo('dropIndicator', target.key + ':' + target.dropPosition, rect);\n }\n}\n"],"names":[],"version":3,"file":"ListLayout.module.js.map"}
|