@praxisjs/decorators 0.8.0 → 1.0.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/CHANGELOG.md +139 -3
- package/dist/__tests__/lazy.test.js +74 -10
- package/dist/__tests__/lazy.test.js.map +1 -1
- package/dist/__tests__/properties.test.js +61 -3
- package/dist/__tests__/properties.test.js.map +1 -1
- package/dist/component/index.d.ts +0 -1
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/index.js +0 -1
- package/dist/component/index.js.map +1 -1
- package/dist/component/lazy.d.ts +15 -1
- package/dist/component/lazy.d.ts.map +1 -1
- package/dist/component/lazy.js +15 -9
- package/dist/component/lazy.js.map +1 -1
- package/dist/create-class-decorator.d.ts.map +1 -1
- package/dist/create-class-decorator.js +16 -3
- package/dist/create-class-decorator.js.map +1 -1
- package/dist/create-field-decorator.d.ts +1 -1
- package/dist/create-field-decorator.d.ts.map +1 -1
- package/dist/create-field-decorator.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/properties/compose.d.ts +8 -1
- package/dist/properties/compose.d.ts.map +1 -1
- package/dist/properties/compose.js +18 -3
- package/dist/properties/compose.js.map +1 -1
- package/dist/properties/deep-state.d.ts +2 -1
- package/dist/properties/deep-state.d.ts.map +1 -1
- package/dist/properties/deep-state.js.map +1 -1
- package/dist/properties/history.d.ts +1 -1
- package/dist/properties/history.d.ts.map +1 -1
- package/dist/properties/index.d.ts +1 -1
- package/dist/properties/index.d.ts.map +1 -1
- package/dist/properties/index.js +1 -1
- package/dist/properties/index.js.map +1 -1
- package/dist/properties/persisted.d.ts +1 -1
- package/dist/properties/persisted.d.ts.map +1 -1
- package/dist/properties/prop.d.ts +1 -1
- package/dist/properties/prop.d.ts.map +1 -1
- package/dist/properties/resource.d.ts +1 -1
- package/dist/properties/resource.d.ts.map +1 -1
- package/dist/properties/slot.d.ts +1 -1
- package/dist/properties/slot.d.ts.map +1 -1
- package/dist/properties/state.d.ts +2 -1
- package/dist/properties/state.d.ts.map +1 -1
- package/dist/properties/state.js.map +1 -1
- package/dist/properties/synced.d.ts +1 -1
- package/dist/properties/synced.d.ts.map +1 -1
- package/dist/reactive-host.d.ts +4 -0
- package/dist/reactive-host.d.ts.map +1 -0
- package/dist/reactive-host.js +2 -0
- package/dist/reactive-host.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/lazy.test.ts +88 -10
- package/src/__tests__/properties.test.ts +71 -3
- package/src/component/index.ts +0 -1
- package/src/component/lazy.ts +29 -7
- package/src/create-class-decorator.ts +16 -4
- package/src/create-field-decorator.ts +3 -3
- package/src/index.ts +3 -1
- package/src/properties/compose.ts +21 -8
- package/src/properties/deep-state.ts +3 -1
- package/src/properties/index.ts +1 -1
- package/src/properties/state.ts +3 -1
- package/src/reactive-host.ts +3 -0
- package/dist/__tests__/virtual.test.d.ts +0 -2
- package/dist/__tests__/virtual.test.d.ts.map +0 -1
- package/dist/__tests__/virtual.test.js +0 -352
- package/dist/__tests__/virtual.test.js.map +0 -1
- package/dist/component/virtual.d.ts +0 -3
- package/dist/component/virtual.d.ts.map +0 -1
- package/dist/component/virtual.js +0 -102
- package/dist/component/virtual.js.map +0 -1
- package/src/__tests__/virtual.test.ts +0 -371
- package/src/component/virtual.tsx +0 -163
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { describe, it, expect, vi } from "vitest";
|
|
3
|
-
import { StatefulComponent } from "@praxisjs/core";
|
|
4
|
-
import { Virtual } from "../component/virtual";
|
|
5
|
-
function applyVirtual(cls, itemHeight, buffer) {
|
|
6
|
-
return buffer !== undefined
|
|
7
|
-
? Virtual(itemHeight, buffer)(cls, {})
|
|
8
|
-
: Virtual(itemHeight)(cls, {});
|
|
9
|
-
}
|
|
10
|
-
// A base component with items and renderItem for virtual scrolling
|
|
11
|
-
class ListComp extends StatefulComponent {
|
|
12
|
-
constructor() {
|
|
13
|
-
super(...arguments);
|
|
14
|
-
this.items = [];
|
|
15
|
-
}
|
|
16
|
-
renderItem(item, _index) {
|
|
17
|
-
const div = document.createElement("div");
|
|
18
|
-
div.textContent = String(item);
|
|
19
|
-
return div;
|
|
20
|
-
}
|
|
21
|
-
render() { return null; }
|
|
22
|
-
}
|
|
23
|
-
describe("Virtual decorator", () => {
|
|
24
|
-
it("warns and returns null when renderItem is not defined", () => {
|
|
25
|
-
class NoRenderItem extends StatefulComponent {
|
|
26
|
-
constructor() {
|
|
27
|
-
super(...arguments);
|
|
28
|
-
this.items = ["a", "b"];
|
|
29
|
-
}
|
|
30
|
-
render() { return null; }
|
|
31
|
-
}
|
|
32
|
-
const Wrapped = applyVirtual(NoRenderItem, 50);
|
|
33
|
-
const instance = new Wrapped();
|
|
34
|
-
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
35
|
-
const result = instance.render();
|
|
36
|
-
expect(result).toBeNull();
|
|
37
|
-
expect(warn).toHaveBeenCalledWith(expect.stringContaining("[Virtual]"));
|
|
38
|
-
warn.mockRestore();
|
|
39
|
-
});
|
|
40
|
-
it("renders a container div with the total height", () => {
|
|
41
|
-
class MyList extends StatefulComponent {
|
|
42
|
-
constructor() {
|
|
43
|
-
super(...arguments);
|
|
44
|
-
this.items = ["a", "b", "c"];
|
|
45
|
-
}
|
|
46
|
-
renderItem(item) {
|
|
47
|
-
const el = document.createElement("div");
|
|
48
|
-
el.textContent = String(item);
|
|
49
|
-
return el;
|
|
50
|
-
}
|
|
51
|
-
render() { return null; }
|
|
52
|
-
}
|
|
53
|
-
const Wrapped = applyVirtual(MyList, 50);
|
|
54
|
-
const instance = new Wrapped();
|
|
55
|
-
const result = instance.render();
|
|
56
|
-
expect(result).toBeInstanceOf(HTMLElement);
|
|
57
|
-
expect(result.tagName.toLowerCase()).toBe("div");
|
|
58
|
-
// Total height = 3 items * 50px
|
|
59
|
-
expect(result.getAttribute("style")).toContain("150px");
|
|
60
|
-
});
|
|
61
|
-
it("renders visible items within the viewport", () => {
|
|
62
|
-
class MyList extends StatefulComponent {
|
|
63
|
-
constructor() {
|
|
64
|
-
super(...arguments);
|
|
65
|
-
this.items = [1, 2, 3, 4, 5];
|
|
66
|
-
}
|
|
67
|
-
renderItem(item) {
|
|
68
|
-
const el = document.createElement("div");
|
|
69
|
-
el.textContent = String(item);
|
|
70
|
-
return el;
|
|
71
|
-
}
|
|
72
|
-
render() { return null; }
|
|
73
|
-
}
|
|
74
|
-
const Wrapped = applyVirtual(MyList, 100, 0);
|
|
75
|
-
const instance = new Wrapped();
|
|
76
|
-
const outer = instance.render();
|
|
77
|
-
// Should render some content
|
|
78
|
-
expect(outer).not.toBeNull();
|
|
79
|
-
expect(outer.children.length).toBeGreaterThan(0);
|
|
80
|
-
});
|
|
81
|
-
it("handles empty items list without errors", () => {
|
|
82
|
-
class EmptyList extends StatefulComponent {
|
|
83
|
-
constructor() {
|
|
84
|
-
super(...arguments);
|
|
85
|
-
this.items = [];
|
|
86
|
-
}
|
|
87
|
-
renderItem(_item) {
|
|
88
|
-
return document.createElement("div");
|
|
89
|
-
}
|
|
90
|
-
render() { return null; }
|
|
91
|
-
}
|
|
92
|
-
const Wrapped = applyVirtual(EmptyList, 50);
|
|
93
|
-
const instance = new Wrapped();
|
|
94
|
-
expect(() => instance.render()).not.toThrow();
|
|
95
|
-
});
|
|
96
|
-
it("onMount sets container styles when _anchor has a parent", () => {
|
|
97
|
-
const Wrapped = applyVirtual(ListComp, 50);
|
|
98
|
-
const instance = new Wrapped();
|
|
99
|
-
instance.items = ["a", "b"];
|
|
100
|
-
const container = document.createElement("div");
|
|
101
|
-
document.body.appendChild(container);
|
|
102
|
-
const anchor = document.createComment("end");
|
|
103
|
-
container.appendChild(anchor);
|
|
104
|
-
instance._anchor = anchor;
|
|
105
|
-
instance.onMount?.();
|
|
106
|
-
expect(container.style.overflowY).toBe("auto");
|
|
107
|
-
expect(container.style.position).toBe("relative");
|
|
108
|
-
document.body.removeChild(container);
|
|
109
|
-
});
|
|
110
|
-
it("onMount does nothing when _anchor has no parent", () => {
|
|
111
|
-
const Wrapped = applyVirtual(ListComp, 50);
|
|
112
|
-
const instance = new Wrapped();
|
|
113
|
-
const anchor = document.createComment("end");
|
|
114
|
-
instance._anchor = anchor;
|
|
115
|
-
expect(() => instance.onMount?.()).not.toThrow();
|
|
116
|
-
});
|
|
117
|
-
it("onUnmount disconnects scroll listener and cleans up effects", () => {
|
|
118
|
-
const Wrapped = applyVirtual(ListComp, 50);
|
|
119
|
-
const instance = new Wrapped();
|
|
120
|
-
const container = document.createElement("div");
|
|
121
|
-
document.body.appendChild(container);
|
|
122
|
-
const anchor = document.createComment("end");
|
|
123
|
-
container.appendChild(anchor);
|
|
124
|
-
instance._anchor = anchor;
|
|
125
|
-
instance.onMount?.();
|
|
126
|
-
// Should not throw
|
|
127
|
-
expect(() => instance.onUnmount?.()).not.toThrow();
|
|
128
|
-
document.body.removeChild(container);
|
|
129
|
-
});
|
|
130
|
-
it("re-renders visible items when scrollTop changes (covers while loop cleanup)", async () => {
|
|
131
|
-
class ScrollList extends StatefulComponent {
|
|
132
|
-
constructor() {
|
|
133
|
-
super(...arguments);
|
|
134
|
-
this.items = Array.from({ length: 20 }, (_, i) => i);
|
|
135
|
-
}
|
|
136
|
-
renderItem(item) {
|
|
137
|
-
const el = document.createElement("div");
|
|
138
|
-
el.textContent = String(item);
|
|
139
|
-
return el;
|
|
140
|
-
}
|
|
141
|
-
render() { return null; }
|
|
142
|
-
}
|
|
143
|
-
const Wrapped = applyVirtual(ScrollList, 50, 0);
|
|
144
|
-
const instance = new Wrapped();
|
|
145
|
-
const container = document.createElement("div");
|
|
146
|
-
document.body.appendChild(container);
|
|
147
|
-
const anchor = document.createComment("end");
|
|
148
|
-
container.appendChild(anchor);
|
|
149
|
-
instance._anchor = anchor;
|
|
150
|
-
instance.onMount?.();
|
|
151
|
-
// First render - sets up effects with the spacerTop/itemsSlot/spacerBottom elements
|
|
152
|
-
const outer = instance.render();
|
|
153
|
-
// Change scrollTop to trigger effect re-run (covers the while loop removing old nodes)
|
|
154
|
-
Object.defineProperty(container, "scrollTop", { configurable: true, value: 500 });
|
|
155
|
-
container.dispatchEvent(new Event("scroll"));
|
|
156
|
-
await Promise.resolve();
|
|
157
|
-
// buffer=0, itemHeight=50, scrollTop=500 → startIdx=10 → offsetTop=500px
|
|
158
|
-
const spacerTop = outer.children[0];
|
|
159
|
-
expect(spacerTop.getAttribute("style")).toContain("500px");
|
|
160
|
-
document.body.removeChild(container);
|
|
161
|
-
});
|
|
162
|
-
it("renderItem returning an array appends all child nodes", () => {
|
|
163
|
-
class ArrayItemList extends StatefulComponent {
|
|
164
|
-
constructor() {
|
|
165
|
-
super(...arguments);
|
|
166
|
-
this.items = ["item"];
|
|
167
|
-
}
|
|
168
|
-
renderItem(item) {
|
|
169
|
-
const a = document.createElement("span");
|
|
170
|
-
a.textContent = String(item) + "-1";
|
|
171
|
-
const b = document.createElement("span");
|
|
172
|
-
b.textContent = String(item) + "-2";
|
|
173
|
-
return [a, b];
|
|
174
|
-
}
|
|
175
|
-
render() { return null; }
|
|
176
|
-
}
|
|
177
|
-
const Wrapped = applyVirtual(ArrayItemList, 50, 0);
|
|
178
|
-
const instance = new Wrapped();
|
|
179
|
-
const outer = instance.render();
|
|
180
|
-
// outer structure: spacerTop, itemsSlot, spacerBottom
|
|
181
|
-
const itemsSlot = outer.children[1];
|
|
182
|
-
const wrapper = itemsSlot.children[0];
|
|
183
|
-
expect(wrapper.children.length).toBe(2);
|
|
184
|
-
});
|
|
185
|
-
it("renderItem returning null produces an empty wrapper div", () => {
|
|
186
|
-
class NullItemList extends StatefulComponent {
|
|
187
|
-
constructor() {
|
|
188
|
-
super(...arguments);
|
|
189
|
-
this.items = ["x"];
|
|
190
|
-
}
|
|
191
|
-
renderItem() { return null; }
|
|
192
|
-
render() { return null; }
|
|
193
|
-
}
|
|
194
|
-
const Wrapped = applyVirtual(NullItemList, 50, 0);
|
|
195
|
-
const instance = new Wrapped();
|
|
196
|
-
expect(() => instance.render()).not.toThrow();
|
|
197
|
-
const outer = instance.render();
|
|
198
|
-
const itemsSlot = outer.children[1];
|
|
199
|
-
const wrapper = itemsSlot.children[0];
|
|
200
|
-
// rendered is null — no child nodes appended
|
|
201
|
-
expect(wrapper.children.length).toBe(0);
|
|
202
|
-
});
|
|
203
|
-
it("uses empty array when items is undefined (host.items ?? [])", () => {
|
|
204
|
-
class NoItems extends StatefulComponent {
|
|
205
|
-
// items is intentionally not defined
|
|
206
|
-
renderItem() { return document.createElement("div"); }
|
|
207
|
-
render() { return null; }
|
|
208
|
-
}
|
|
209
|
-
const Wrapped = applyVirtual(NoItems, 50, 0);
|
|
210
|
-
const instance = new Wrapped();
|
|
211
|
-
// render() should work fine with 0 items
|
|
212
|
-
const result = instance.render();
|
|
213
|
-
expect(result).toBeInstanceOf(HTMLElement);
|
|
214
|
-
const style = result.getAttribute("style") ?? "";
|
|
215
|
-
expect(style).toContain("0px"); // totalH = 0 * 50 = 0
|
|
216
|
-
});
|
|
217
|
-
it("onUnmount without prior onMount does not throw", () => {
|
|
218
|
-
const Wrapped = applyVirtual(ListComp, 50);
|
|
219
|
-
const instance = new Wrapped();
|
|
220
|
-
// _container is undefined — onUnmount should be a no-op
|
|
221
|
-
expect(() => instance.onUnmount?.()).not.toThrow();
|
|
222
|
-
});
|
|
223
|
-
it("updates scrollTop on scroll event", async () => {
|
|
224
|
-
const Wrapped = applyVirtual(ListComp, 50);
|
|
225
|
-
const instance = new Wrapped();
|
|
226
|
-
instance.items = Array.from({ length: 20 }, (_, i) => i);
|
|
227
|
-
const container = document.createElement("div");
|
|
228
|
-
document.body.appendChild(container);
|
|
229
|
-
const anchor = document.createComment("end");
|
|
230
|
-
container.appendChild(anchor);
|
|
231
|
-
instance._anchor = anchor;
|
|
232
|
-
instance.onMount?.();
|
|
233
|
-
// Render to set up effects that observe scrollTop
|
|
234
|
-
const outer = instance.render();
|
|
235
|
-
Object.defineProperty(container, "scrollTop", { configurable: true, value: 200 });
|
|
236
|
-
container.dispatchEvent(new Event("scroll"));
|
|
237
|
-
await Promise.resolve();
|
|
238
|
-
// buffer=3, itemHeight=50, scrollTop=200 → startIdx=1 → offsetTop=50px
|
|
239
|
-
const spacerTop = outer.children[0];
|
|
240
|
-
expect(spacerTop.getAttribute("style")).toContain("50px");
|
|
241
|
-
document.body.removeChild(container);
|
|
242
|
-
});
|
|
243
|
-
it("itemHeight = 0 throws a descriptive error on onMount", () => {
|
|
244
|
-
class ZeroHeightList extends StatefulComponent {
|
|
245
|
-
constructor() {
|
|
246
|
-
super(...arguments);
|
|
247
|
-
this.items = ["a", "b"];
|
|
248
|
-
}
|
|
249
|
-
renderItem(item) {
|
|
250
|
-
const el = document.createElement("div");
|
|
251
|
-
el.textContent = String(item);
|
|
252
|
-
return el;
|
|
253
|
-
}
|
|
254
|
-
render() { return null; }
|
|
255
|
-
}
|
|
256
|
-
const Wrapped = applyVirtual(ZeroHeightList, 0);
|
|
257
|
-
const instance = new Wrapped();
|
|
258
|
-
const container = document.createElement("div");
|
|
259
|
-
document.body.appendChild(container);
|
|
260
|
-
const anchor = document.createComment("end");
|
|
261
|
-
container.appendChild(anchor);
|
|
262
|
-
instance._anchor = anchor;
|
|
263
|
-
expect(() => instance.onMount?.()).toThrow(/itemHeight must be a positive number/);
|
|
264
|
-
document.body.removeChild(container);
|
|
265
|
-
});
|
|
266
|
-
it("itemHeight = 0 in render() does not divide by zero (no container)", () => {
|
|
267
|
-
class ZeroHeightList2 extends StatefulComponent {
|
|
268
|
-
constructor() {
|
|
269
|
-
super(...arguments);
|
|
270
|
-
this.items = ["a", "b"];
|
|
271
|
-
}
|
|
272
|
-
renderItem(item) {
|
|
273
|
-
return document.createElement("div");
|
|
274
|
-
}
|
|
275
|
-
render() { return null; }
|
|
276
|
-
}
|
|
277
|
-
// render() is called before onMount, so no throw yet — but it still computes total height
|
|
278
|
-
const Wrapped = applyVirtual(ZeroHeightList2, 0);
|
|
279
|
-
const instance = new Wrapped();
|
|
280
|
-
// Render without mounting — no onMount guard triggered, but division happens in computed
|
|
281
|
-
// The guard is in onMount, so render still runs. Verify it doesn't produce NaN/Infinity
|
|
282
|
-
expect(() => instance.render()).not.toThrow();
|
|
283
|
-
});
|
|
284
|
-
it("renderItem() that throws — does not crash the entire component", () => {
|
|
285
|
-
class ThrowingList extends StatefulComponent {
|
|
286
|
-
constructor() {
|
|
287
|
-
super(...arguments);
|
|
288
|
-
this.items = ["x"];
|
|
289
|
-
}
|
|
290
|
-
renderItem() {
|
|
291
|
-
throw new Error("render item failed");
|
|
292
|
-
}
|
|
293
|
-
render() { return null; }
|
|
294
|
-
}
|
|
295
|
-
const Wrapped = applyVirtual(ThrowingList, 50, 0);
|
|
296
|
-
const instance = new Wrapped();
|
|
297
|
-
// Render triggers the effect which calls renderItem — it should propagate the error
|
|
298
|
-
expect(() => instance.render()).toThrow("render item failed");
|
|
299
|
-
});
|
|
300
|
-
it("scrollTop > totalHeight renders last visible items without crash", () => {
|
|
301
|
-
class ShortList extends StatefulComponent {
|
|
302
|
-
constructor() {
|
|
303
|
-
super(...arguments);
|
|
304
|
-
this.items = [1, 2, 3]; // only 3 items × 50px = 150px total
|
|
305
|
-
}
|
|
306
|
-
renderItem(item) {
|
|
307
|
-
const el = document.createElement("div");
|
|
308
|
-
el.textContent = String(item);
|
|
309
|
-
return el;
|
|
310
|
-
}
|
|
311
|
-
render() { return null; }
|
|
312
|
-
}
|
|
313
|
-
const Wrapped = applyVirtual(ShortList, 50, 0);
|
|
314
|
-
const instance = new Wrapped();
|
|
315
|
-
const container = document.createElement("div");
|
|
316
|
-
document.body.appendChild(container);
|
|
317
|
-
const anchor = document.createComment("end");
|
|
318
|
-
container.appendChild(anchor);
|
|
319
|
-
instance._anchor = anchor;
|
|
320
|
-
instance.onMount?.();
|
|
321
|
-
const outer = instance.render();
|
|
322
|
-
// Simulate scrollTop way past end of list (e.g., 9999px for a 150px list)
|
|
323
|
-
Object.defineProperty(container, "scrollTop", { configurable: true, value: 9999 });
|
|
324
|
-
expect(() => container.dispatchEvent(new Event("scroll"))).not.toThrow();
|
|
325
|
-
// The outer container should still be present
|
|
326
|
-
expect(outer).toBeInstanceOf(HTMLElement);
|
|
327
|
-
document.body.removeChild(container);
|
|
328
|
-
});
|
|
329
|
-
it("buffer applied correctly — renders extra items beyond visible area", () => {
|
|
330
|
-
class BufferList extends StatefulComponent {
|
|
331
|
-
constructor() {
|
|
332
|
-
super(...arguments);
|
|
333
|
-
this.items = Array.from({ length: 20 }, (_, i) => i);
|
|
334
|
-
}
|
|
335
|
-
renderItem(item) {
|
|
336
|
-
const el = document.createElement("div");
|
|
337
|
-
el.textContent = String(item);
|
|
338
|
-
return el;
|
|
339
|
-
}
|
|
340
|
-
render() { return null; }
|
|
341
|
-
}
|
|
342
|
-
// itemHeight=100, buffer=2, viewHeight defaults to 600 → visible=6 items + 2 buffer each side
|
|
343
|
-
const Wrapped = applyVirtual(BufferList, 100, 2);
|
|
344
|
-
const instance = new Wrapped();
|
|
345
|
-
const outer = instance.render();
|
|
346
|
-
// With scrollTop=0, buffer=2: startIdx=max(0, 0-2)=0, endIdx=min(19, ceil(600/100)+2)=8
|
|
347
|
-
// So 9 items should be rendered (indices 0..8)
|
|
348
|
-
const itemsSlot = outer.children[1];
|
|
349
|
-
expect(itemsSlot.children.length).toBe(9);
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
//# sourceMappingURL=virtual.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.test.js","sourceRoot":"","sources":["../../src/__tests__/virtual.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { type RootComponent } from "@praxisjs/core/internal";
|
|
2
|
-
export declare function Virtual(itemHeight: number, buffer?: number): <T extends new (...args: any[]) => RootComponent<Record<string, any>>>(constructor: T, _context: ClassDecoratorContext) => T;
|
|
3
|
-
//# sourceMappingURL=virtual.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../../src/component/virtual.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AA2JjC,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAI,mBA/HP,GAC9C,0GAgIA"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { computed, effect, signal, } from "@praxisjs/core/internal";
|
|
2
|
-
import { ClassBehavior, createClassDecorator, } from "../create-class-decorator";
|
|
3
|
-
class VirtualBehavior extends ClassBehavior {
|
|
4
|
-
constructor(itemHeight, buffer) {
|
|
5
|
-
super();
|
|
6
|
-
this.itemHeight = itemHeight;
|
|
7
|
-
this.buffer = buffer;
|
|
8
|
-
}
|
|
9
|
-
create(instance) {
|
|
10
|
-
const { itemHeight, buffer } = this;
|
|
11
|
-
const host = instance;
|
|
12
|
-
const scrollTop = signal(0);
|
|
13
|
-
const viewHeight = signal(600);
|
|
14
|
-
let container;
|
|
15
|
-
let scrollHandler;
|
|
16
|
-
const cleanups = [];
|
|
17
|
-
return {
|
|
18
|
-
onMount() {
|
|
19
|
-
if (itemHeight <= 0) {
|
|
20
|
-
throw new Error(`[Virtual] itemHeight must be a positive number, got ${String(itemHeight)}`);
|
|
21
|
-
}
|
|
22
|
-
container = host._anchor?.parentElement ?? undefined;
|
|
23
|
-
if (!container)
|
|
24
|
-
return;
|
|
25
|
-
container.style.overflowY = "auto";
|
|
26
|
-
container.style.position = "relative";
|
|
27
|
-
viewHeight.set(container.clientHeight || 600);
|
|
28
|
-
const currentContainer = container;
|
|
29
|
-
scrollHandler = () => {
|
|
30
|
-
scrollTop.set(currentContainer.scrollTop);
|
|
31
|
-
};
|
|
32
|
-
container.addEventListener("scroll", scrollHandler);
|
|
33
|
-
},
|
|
34
|
-
onUnmount() {
|
|
35
|
-
if (container && scrollHandler) {
|
|
36
|
-
container.removeEventListener("scroll", scrollHandler);
|
|
37
|
-
}
|
|
38
|
-
cleanups.forEach((c) => {
|
|
39
|
-
c();
|
|
40
|
-
});
|
|
41
|
-
cleanups.length = 0;
|
|
42
|
-
},
|
|
43
|
-
render(originalRender) {
|
|
44
|
-
const items = host.items ?? [];
|
|
45
|
-
const total = items.length;
|
|
46
|
-
const totalH = total * itemHeight;
|
|
47
|
-
if (typeof host.renderItem !== "function") {
|
|
48
|
-
console.warn(`[Virtual] component must implement renderItem(item, index)`);
|
|
49
|
-
return originalRender();
|
|
50
|
-
}
|
|
51
|
-
const renderItem = host.renderItem.bind(host);
|
|
52
|
-
const startIdx = computed(() => Math.max(0, Math.floor(scrollTop() / itemHeight) - buffer));
|
|
53
|
-
const endIdx = computed(() => Math.min(total - 1, Math.ceil((scrollTop() + viewHeight()) / itemHeight) + buffer));
|
|
54
|
-
const visibleItems = computed(() => {
|
|
55
|
-
const result = [];
|
|
56
|
-
for (let i = startIdx(); i <= endIdx(); i++) {
|
|
57
|
-
result.push({ item: items[i], index: i });
|
|
58
|
-
}
|
|
59
|
-
return result;
|
|
60
|
-
});
|
|
61
|
-
const offsetTop = computed(() => startIdx() * itemHeight);
|
|
62
|
-
const offsetBottom = computed(() => (total - 1 - endIdx()) * itemHeight);
|
|
63
|
-
const outer = document.createElement("div");
|
|
64
|
-
outer.setAttribute("style", `height:${String(totalH)}px; position:relative;`);
|
|
65
|
-
const spacerTop = document.createElement("div");
|
|
66
|
-
cleanups.push(effect(() => {
|
|
67
|
-
spacerTop.setAttribute("style", `height:${String(offsetTop())}px;`);
|
|
68
|
-
}));
|
|
69
|
-
const itemsSlot = document.createElement("div");
|
|
70
|
-
cleanups.push(effect(() => {
|
|
71
|
-
while (itemsSlot.firstChild)
|
|
72
|
-
itemsSlot.removeChild(itemsSlot.firstChild);
|
|
73
|
-
visibleItems().forEach(({ item, index }) => {
|
|
74
|
-
const wrapper = document.createElement("div");
|
|
75
|
-
wrapper.setAttribute("style", `height:${String(itemHeight)}px; overflow:hidden;`);
|
|
76
|
-
const rendered = renderItem(item, index);
|
|
77
|
-
if (rendered) {
|
|
78
|
-
(Array.isArray(rendered)
|
|
79
|
-
? rendered.flat()
|
|
80
|
-
: [rendered]).forEach((n) => {
|
|
81
|
-
wrapper.appendChild(n);
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
itemsSlot.appendChild(wrapper);
|
|
85
|
-
});
|
|
86
|
-
}));
|
|
87
|
-
const spacerBottom = document.createElement("div");
|
|
88
|
-
cleanups.push(effect(() => {
|
|
89
|
-
spacerBottom.setAttribute("style", `height:${String(offsetBottom())}px;`);
|
|
90
|
-
}));
|
|
91
|
-
outer.appendChild(spacerTop);
|
|
92
|
-
outer.appendChild(itemsSlot);
|
|
93
|
-
outer.appendChild(spacerBottom);
|
|
94
|
-
return outer;
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
export function Virtual(itemHeight, buffer = 3) {
|
|
100
|
-
return createClassDecorator(new VirtualBehavior(itemHeight, buffer));
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=virtual.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../../src/component/virtual.tsx"],"names":[],"mappings":"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"}
|