@versini/ui-datagrid 0.3.8 → 0.4.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/README.md +106 -29
- package/dist/DataGrid/DataGrid.js +1 -1
- package/dist/DataGrid/DataGridContext.js +1 -1
- package/dist/DataGrid/index.js +1 -1
- package/dist/DataGridAnimated/AnimatedWrapper.d.ts +11 -7
- package/dist/DataGridAnimated/AnimatedWrapper.js +12 -8
- package/dist/DataGridAnimated/index.js +1 -1
- package/dist/DataGridAnimated/useAnimatedHeight.js +1 -1
- package/dist/DataGridBody/DataGridBody.js +12 -56
- package/dist/DataGridBody/getBodyClass.d.ts +9 -0
- package/dist/DataGridBody/getBodyClass.js +23 -0
- package/dist/DataGridBody/index.js +1 -1
- package/dist/DataGridBody/useColumnMeasurement.d.ts +10 -0
- package/dist/DataGridBody/useColumnMeasurement.js +67 -0
- package/dist/DataGridCell/DataGridCell.js +1 -1
- package/dist/DataGridCell/index.js +1 -1
- package/dist/DataGridCellSort/DataGridCellSort.js +1 -1
- package/dist/DataGridCellSort/index.js +1 -1
- package/dist/DataGridConstants/DataGridConstants.js +1 -1
- package/dist/DataGridConstants/index.js +1 -1
- package/dist/DataGridFooter/DataGridFooter.js +1 -1
- package/dist/DataGridFooter/index.js +1 -1
- package/dist/DataGridHeader/DataGridHeader.js +1 -1
- package/dist/DataGridHeader/index.js +1 -1
- package/dist/DataGridInfinite/DataGridInfiniteBody.d.ts +52 -0
- package/dist/DataGridInfinite/DataGridInfiniteBody.js +309 -0
- package/dist/DataGridInfinite/index.d.ts +2 -4
- package/dist/DataGridInfinite/index.js +4 -8
- package/dist/DataGridRow/DataGridRow.js +1 -1
- package/dist/DataGridRow/index.js +1 -1
- package/dist/DataGridSorting/index.js +1 -1
- package/dist/DataGridSorting/sortingUtils.js +1 -1
- package/dist/utilities/classes.js +1 -1
- package/package.json +2 -2
- package/dist/DataGridInfinite/InfiniteScrollMarker.d.ts +0 -31
- package/dist/DataGridInfinite/InfiniteScrollMarker.js +0 -54
- package/dist/DataGridInfinite/useInfiniteScroll.d.ts +0 -92
- package/dist/DataGridInfinite/useInfiniteScroll.js +0 -136
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
@versini/ui-datagrid v0.3.8
|
|
3
|
-
© 2026 gizmette.com
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { useCallback, useEffect, useRef, useState } from "react";
|
|
7
|
-
|
|
8
|
-
;// CONCATENATED MODULE: external "react"
|
|
9
|
-
|
|
10
|
-
;// CONCATENATED MODULE: ./src/DataGridInfinite/useInfiniteScroll.ts
|
|
11
|
-
|
|
12
|
-
const DEFAULT_BATCH_SIZE = 20;
|
|
13
|
-
const DEFAULT_THRESHOLD = 5;
|
|
14
|
-
const DEFAULT_ROOT_MARGIN = "20px";
|
|
15
|
-
/**
|
|
16
|
-
* Finds the nearest scrollable ancestor of an element. Returns null if no
|
|
17
|
-
* scrollable ancestor is found (uses viewport).
|
|
18
|
-
*/ function findScrollableAncestor(element) {
|
|
19
|
-
let parent = element.parentElement;
|
|
20
|
-
while(parent){
|
|
21
|
-
const style = getComputedStyle(parent);
|
|
22
|
-
const overflowY = style.overflowY;
|
|
23
|
-
if (overflowY === "auto" || overflowY === "scroll") {
|
|
24
|
-
return parent;
|
|
25
|
-
}
|
|
26
|
-
parent = parent.parentElement;
|
|
27
|
-
}
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Hook for implementing infinite scroll with IntersectionObserver.
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```tsx
|
|
35
|
-
* const { visibleCount, hasMore, markerRef } = useInfiniteScroll({
|
|
36
|
-
* totalItems: data.length,
|
|
37
|
-
* batchSize: 25,
|
|
38
|
-
* });
|
|
39
|
-
*
|
|
40
|
-
* return (
|
|
41
|
-
* <DataGrid>
|
|
42
|
-
* <DataGridBody>
|
|
43
|
-
* {data.slice(0, visibleCount).map((item, index) => (
|
|
44
|
-
* <DataGridRow key={item.id}>...</DataGridRow>
|
|
45
|
-
* ))}
|
|
46
|
-
* {hasMore && <InfiniteScrollMarker ref={markerRef} />}
|
|
47
|
-
* </DataGridBody>
|
|
48
|
-
* </DataGrid>
|
|
49
|
-
* );
|
|
50
|
-
* ```
|
|
51
|
-
*
|
|
52
|
-
*/ function useInfiniteScroll({ batchSize = DEFAULT_BATCH_SIZE, threshold = DEFAULT_THRESHOLD, rootMargin = DEFAULT_ROOT_MARGIN, totalItems, initialVisibleCount, onLoadMore, scrollContainer }) {
|
|
53
|
-
const observerRef = useRef(null);
|
|
54
|
-
const initialCount = initialVisibleCount ?? batchSize + threshold;
|
|
55
|
-
const [visibleCount, setVisibleCount] = useState(Math.min(initialCount, totalItems));
|
|
56
|
-
const hasMore = visibleCount < totalItems;
|
|
57
|
-
/**
|
|
58
|
-
* IntersectionObserver callback - triggered when marker becomes visible.
|
|
59
|
-
*/ const handleIntersection = useCallback((entries)=>{
|
|
60
|
-
const target = entries[0];
|
|
61
|
-
if (target?.isIntersecting) {
|
|
62
|
-
setVisibleCount((prev)=>{
|
|
63
|
-
const newCount = Math.min(prev + batchSize, totalItems);
|
|
64
|
-
if (onLoadMore && newCount > prev) {
|
|
65
|
-
onLoadMore(newCount);
|
|
66
|
-
}
|
|
67
|
-
return newCount;
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
}, [
|
|
71
|
-
batchSize,
|
|
72
|
-
totalItems,
|
|
73
|
-
onLoadMore
|
|
74
|
-
]);
|
|
75
|
-
/**
|
|
76
|
-
* Callback ref for the marker element. Creates/disconnects observer as needed.
|
|
77
|
-
*/ const markerRef = useCallback((node)=>{
|
|
78
|
-
// Disconnect previous observer.
|
|
79
|
-
if (observerRef.current) {
|
|
80
|
-
observerRef.current.disconnect();
|
|
81
|
-
observerRef.current = null;
|
|
82
|
-
}
|
|
83
|
-
if (node && typeof IntersectionObserver !== "undefined") {
|
|
84
|
-
// Find the scrollable ancestor if not explicitly provided.
|
|
85
|
-
const root = scrollContainer ?? findScrollableAncestor(node);
|
|
86
|
-
const options = {
|
|
87
|
-
root,
|
|
88
|
-
rootMargin
|
|
89
|
-
};
|
|
90
|
-
observerRef.current = new IntersectionObserver(handleIntersection, options);
|
|
91
|
-
observerRef.current.observe(node);
|
|
92
|
-
}
|
|
93
|
-
}, [
|
|
94
|
-
handleIntersection,
|
|
95
|
-
rootMargin,
|
|
96
|
-
scrollContainer
|
|
97
|
-
]);
|
|
98
|
-
/**
|
|
99
|
-
* Reset to initial count.
|
|
100
|
-
*/ const reset = useCallback(()=>{
|
|
101
|
-
setVisibleCount(Math.min(initialCount, totalItems));
|
|
102
|
-
}, [
|
|
103
|
-
initialCount,
|
|
104
|
-
totalItems
|
|
105
|
-
]);
|
|
106
|
-
/**
|
|
107
|
-
* Expand visible count to include a specific index. Useful for scroll-to-row
|
|
108
|
-
* functionality.
|
|
109
|
-
*/ const expandToInclude = useCallback((index)=>{
|
|
110
|
-
if (index >= visibleCount) {
|
|
111
|
-
setVisibleCount(index + threshold);
|
|
112
|
-
}
|
|
113
|
-
}, [
|
|
114
|
-
visibleCount,
|
|
115
|
-
threshold
|
|
116
|
-
]);
|
|
117
|
-
/**
|
|
118
|
-
* Cleanup observer on unmount.
|
|
119
|
-
*/ useEffect(()=>{
|
|
120
|
-
return ()=>{
|
|
121
|
-
if (observerRef.current) {
|
|
122
|
-
observerRef.current.disconnect();
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
}, []);
|
|
126
|
-
return {
|
|
127
|
-
visibleCount,
|
|
128
|
-
hasMore,
|
|
129
|
-
markerRef,
|
|
130
|
-
reset,
|
|
131
|
-
setVisibleCount,
|
|
132
|
-
expandToInclude
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export { findScrollableAncestor, useInfiniteScroll };
|