11import React from 'react' ;
22
3- import { TableWithControlsLayout } from '../TableWithControlsLayout/TableWithControlsLayout' ;
4-
3+ import { usePaginatedTableState } from './PaginatedTableContext' ;
54import { TableChunk } from './TableChunk' ;
65import { TableHead } from './TableHead' ;
76import { DEFAULT_TABLE_ROW_HEIGHT } from './constants' ;
@@ -12,7 +11,6 @@ import type {
1211 GetRowClassName ,
1312 HandleTableColumnsResize ,
1413 PaginatedTableData ,
15- RenderControls ,
1614 RenderEmptyDataMessage ,
1715 RenderErrorMessage ,
1816 SortParams ,
@@ -31,9 +29,9 @@ export interface PaginatedTableProps<T, F> {
3129 getRowClassName ?: GetRowClassName < T > ;
3230 rowHeight ?: number ;
3331 parentRef : React . RefObject < HTMLElement > ;
32+ tableContainerRef : React . RefObject < HTMLDivElement > ;
3433 initialSortParams ?: SortParams ;
3534 onColumnsResize ?: HandleTableColumnsResize ;
36- renderControls ?: RenderControls ;
3735 renderEmptyDataMessage ?: RenderEmptyDataMessage ;
3836 renderErrorMessage ?: RenderErrorMessage ;
3937 containerClassName ?: string ;
@@ -53,22 +51,38 @@ export const PaginatedTable = <T, F>({
5351 getRowClassName,
5452 rowHeight = DEFAULT_TABLE_ROW_HEIGHT ,
5553 parentRef,
54+ tableContainerRef,
5655 initialSortParams,
5756 onColumnsResize,
58- renderControls,
5957 renderErrorMessage,
6058 renderEmptyDataMessage,
6159 containerClassName,
6260 onDataFetched,
6361 keepCache = true ,
6462} : 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 ;
6768
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+ ] ) ;
7286
7387 const tableRef = React . useRef < HTMLDivElement > ( null ) ;
7488
@@ -105,18 +119,34 @@ export const PaginatedTable = <T, F>({
105119 onDataFetched ?.( data ) ;
106120 }
107121 } ,
108- [ onDataFetched ] ,
122+ [ onDataFetched , setFoundEntities , setIsInitialLoad , setTotalEntities ] ,
109123 ) ;
110124
111125 // reset table on filters change
112126 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 ) ;
115132 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 ) ;
118140 }
119- } , [ rawFilters , initialFound , initialTotal , parentRef ] ) ;
141+ } , [
142+ rawFilters ,
143+ initialEntitiesCount ,
144+ tableContainerRef ,
145+ setTotalEntities ,
146+ setFoundEntities ,
147+ setIsInitialLoad ,
148+ parentRef ,
149+ ] ) ;
120150
121151 const renderChunks = ( ) => {
122152 return activeChunks . map ( ( isActive , index ) => (
@@ -148,24 +178,9 @@ export const PaginatedTable = <T, F>({
148178 </ table >
149179 ) ;
150180
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-
166181 return (
167182 < div ref = { tableRef } className = { b ( null , containerClassName ) } >
168- { renderContent ( ) }
183+ { renderTable ( ) }
169184 </ div >
170185 ) ;
171186} ;
0 commit comments