1
1
import React from 'react' ;
2
2
3
- import { TableWithControlsLayout } from '../TableWithControlsLayout/TableWithControlsLayout' ;
4
-
3
+ import { usePaginatedTableState } from './PaginatedTableContext' ;
5
4
import { TableChunk } from './TableChunk' ;
6
5
import { TableHead } from './TableHead' ;
7
6
import { DEFAULT_TABLE_ROW_HEIGHT } from './constants' ;
@@ -12,7 +11,6 @@ import type {
12
11
GetRowClassName ,
13
12
HandleTableColumnsResize ,
14
13
PaginatedTableData ,
15
- RenderControls ,
16
14
RenderEmptyDataMessage ,
17
15
RenderErrorMessage ,
18
16
SortParams ,
@@ -31,9 +29,9 @@ export interface PaginatedTableProps<T, F> {
31
29
getRowClassName ?: GetRowClassName < T > ;
32
30
rowHeight ?: number ;
33
31
parentRef : React . RefObject < HTMLElement > ;
32
+ tableContainerRef : React . RefObject < HTMLDivElement > ;
34
33
initialSortParams ?: SortParams ;
35
34
onColumnsResize ?: HandleTableColumnsResize ;
36
- renderControls ?: RenderControls ;
37
35
renderEmptyDataMessage ?: RenderEmptyDataMessage ;
38
36
renderErrorMessage ?: RenderErrorMessage ;
39
37
containerClassName ?: string ;
@@ -53,22 +51,38 @@ export const PaginatedTable = <T, F>({
53
51
getRowClassName,
54
52
rowHeight = DEFAULT_TABLE_ROW_HEIGHT ,
55
53
parentRef,
54
+ tableContainerRef,
56
55
initialSortParams,
57
56
onColumnsResize,
58
- renderControls,
59
57
renderErrorMessage,
60
58
renderEmptyDataMessage,
61
59
containerClassName,
62
60
onDataFetched,
63
61
keepCache = true ,
64
62
} : PaginatedTableProps < T , F > ) => {
65
- const initialTotal = initialEntitiesCount || 0 ;
66
- const initialFound = initialEntitiesCount || 1 ;
63
+ // Get state and setters from context
64
+ const { tableState, setSortParams, setTotalEntities, setFoundEntities, setIsInitialLoad} =
65
+ usePaginatedTableState ( ) ;
66
+
67
+ const { sortParams, foundEntities} = tableState ;
67
68
68
- const [ sortParams , setSortParams ] = React . useState < SortParams | undefined > ( initialSortParams ) ;
69
- const [ totalEntities , setTotalEntities ] = React . useState ( initialTotal ) ;
70
- const [ foundEntities , setFoundEntities ] = React . useState ( initialFound ) ;
71
- const [ isInitialLoad , setIsInitialLoad ] = React . useState ( true ) ;
69
+ // Initialize state with props if available
70
+ React . useEffect ( ( ) => {
71
+ if ( initialSortParams ) {
72
+ setSortParams ( initialSortParams ) ;
73
+ }
74
+
75
+ if ( initialEntitiesCount ) {
76
+ setTotalEntities ( initialEntitiesCount ) ;
77
+ setFoundEntities ( initialEntitiesCount ) ;
78
+ }
79
+ } , [
80
+ setSortParams ,
81
+ setTotalEntities ,
82
+ setFoundEntities ,
83
+ initialSortParams ,
84
+ initialEntitiesCount ,
85
+ ] ) ;
72
86
73
87
const tableRef = React . useRef < HTMLDivElement > ( null ) ;
74
88
@@ -105,18 +119,34 @@ export const PaginatedTable = <T, F>({
105
119
onDataFetched ?.( data ) ;
106
120
}
107
121
} ,
108
- [ onDataFetched ] ,
122
+ [ onDataFetched , setFoundEntities , setIsInitialLoad , setTotalEntities ] ,
109
123
) ;
110
124
111
125
// reset table on filters change
112
126
React . useLayoutEffect ( ( ) => {
113
- setTotalEntities ( initialTotal ) ;
114
- setFoundEntities ( initialFound ) ;
127
+ const defaultTotal = initialEntitiesCount || 0 ;
128
+ const defaultFound = initialEntitiesCount || 1 ;
129
+
130
+ setTotalEntities ( defaultTotal ) ;
131
+ setFoundEntities ( defaultFound ) ;
115
132
setIsInitialLoad ( true ) ;
116
- if ( parentRef ?. current ) {
117
- parentRef . current . scrollTo ( 0 , 0 ) ;
133
+
134
+ if ( tableContainerRef . current && parentRef . current ) {
135
+ // Scroll the parent container to the position of the table container
136
+ const tableRect = tableContainerRef . current . getBoundingClientRect ( ) ;
137
+ const parentRect = parentRef . current . getBoundingClientRect ( ) ;
138
+ const scrollTop = tableRect . top - parentRect . top + parentRef . current . scrollTop ;
139
+ parentRef . current . scrollTo ( 0 , scrollTop ) ;
118
140
}
119
- } , [ rawFilters , initialFound , initialTotal , parentRef ] ) ;
141
+ } , [
142
+ rawFilters ,
143
+ initialEntitiesCount ,
144
+ tableContainerRef ,
145
+ setTotalEntities ,
146
+ setFoundEntities ,
147
+ setIsInitialLoad ,
148
+ parentRef ,
149
+ ] ) ;
120
150
121
151
const renderChunks = ( ) => {
122
152
return activeChunks . map ( ( isActive , index ) => (
@@ -148,24 +178,9 @@ export const PaginatedTable = <T, F>({
148
178
</ table >
149
179
) ;
150
180
151
- const renderContent = ( ) => {
152
- if ( renderControls ) {
153
- return (
154
- < TableWithControlsLayout >
155
- < TableWithControlsLayout . Controls >
156
- { renderControls ( { inited : ! isInitialLoad , totalEntities, foundEntities} ) }
157
- </ TableWithControlsLayout . Controls >
158
- < TableWithControlsLayout . Table > { renderTable ( ) } </ TableWithControlsLayout . Table >
159
- </ TableWithControlsLayout >
160
- ) ;
161
- }
162
-
163
- return renderTable ( ) ;
164
- } ;
165
-
166
181
return (
167
182
< div ref = { tableRef } className = { b ( null , containerClassName ) } >
168
- { renderContent ( ) }
183
+ { renderTable ( ) }
169
184
</ div >
170
185
) ;
171
186
} ;
0 commit comments