44import * as Redux from 'redux'
55import { ChevronLeftRounded , ChevronRightRounded } from '@mui/icons-material'
66import {
7+ Chip ,
78 Container ,
89 Table ,
910 TableBody ,
@@ -35,12 +36,11 @@ interface StateProps {
3536 isDatasetsLoading : boolean
3637 isDatasetsInit : boolean
3738 selectedNamespace : Nullable < string >
39+ totalCount : number
3840}
3941
4042interface DatasetsState {
41- datasets : Dataset [ ]
4243 page : number
43- pageIsLast : boolean
4444}
4545
4646interface DispatchProps {
@@ -50,52 +50,29 @@ interface DispatchProps {
5050
5151type DatasetsProps = StateProps & DispatchProps
5252
53+ const PAGE_SIZE = 20
54+
5355const Datasets : React . FC < DatasetsProps > = ( {
5456 datasets,
57+ totalCount,
5558 isDatasetsLoading,
5659 isDatasetsInit,
5760 selectedNamespace,
5861 fetchDatasets,
5962 resetDatasets,
6063} ) => {
61- const PAGE_SIZE = 20
62- const mounted = React . useRef < boolean > ( false )
63- const prevSelectedNamespace = React . useRef < Nullable < string > > ( )
64-
6564 const defaultState = {
66- datasets : [ ] ,
67- page : 1 ,
68- pageIsLast : false ,
65+ page : 0 ,
6966 }
7067 const [ state , setState ] = React . useState < DatasetsState > ( defaultState )
7168
7269 const theme = createTheme ( useTheme ( ) )
7370
7471 React . useEffect ( ( ) => {
75- if ( ! mounted . current ) {
76- // on mount
77- if ( selectedNamespace ) {
78- fetchDatasets ( selectedNamespace , PAGE_SIZE )
79- }
80- mounted . current = true
81- } else {
82- // on update
83- if ( prevSelectedNamespace . current !== selectedNamespace && selectedNamespace ) {
84- fetchDatasets ( selectedNamespace , PAGE_SIZE )
85- setState ( defaultState )
86- }
87-
88- if ( datasets !== state . datasets ) {
89- setState ( {
90- ...state ,
91- datasets,
92- pageIsLast : datasets . length < state . page * PAGE_SIZE ,
93- } )
94- }
95-
96- prevSelectedNamespace . current = selectedNamespace
72+ if ( selectedNamespace ) {
73+ fetchDatasets ( selectedNamespace , PAGE_SIZE , state . page * PAGE_SIZE )
9774 }
98- } )
75+ } , [ selectedNamespace , state . page ] )
9976
10077 React . useEffect ( ( ) => {
10178 return ( ) => {
@@ -104,28 +81,13 @@ const Datasets: React.FC<DatasetsProps> = ({
10481 }
10582 } , [ ] )
10683
107- const pageNavigation = ( ) => {
108- const { datasets, page, pageIsLast } = state
109- const titlePos =
110- datasets . length < PAGE_SIZE && page === 1
111- ? `1 - ${ datasets . length } `
112- : datasets . length > PAGE_SIZE && page === 1
113- ? `1 - ${ PAGE_SIZE } `
114- : datasets . length && page > 1 && pageIsLast === false
115- ? `${ PAGE_SIZE * page - PAGE_SIZE + 1 } - ${ PAGE_SIZE * page } `
116- : datasets . length && page > 1 && pageIsLast
117- ? `${ PAGE_SIZE * page - PAGE_SIZE + 1 } - ${ datasets . length } `
118- : `${ datasets . length } `
119- return `${ page } (${ titlePos } )`
120- }
121-
12284 const handleClickPage = ( direction : 'prev' | 'next' ) => {
12385 const directionPage = direction === 'next' ? state . page + 1 : state . page - 1
12486
125- if ( selectedNamespace ) {
126- fetchDatasets ( selectedNamespace , PAGE_SIZE * directionPage )
127- setState ( { ... state , page : directionPage } )
128- }
87+ fetchDatasets ( selectedNamespace || '' , PAGE_SIZE , directionPage * PAGE_SIZE )
88+ // reset page scroll
89+ window . scrollTo ( 0 , 0 )
90+ setState ( { ... state , page : directionPage } )
12991 }
13092
13193 const i18next = require ( 'i18next' )
@@ -141,36 +103,15 @@ const Datasets: React.FC<DatasetsProps> = ({
141103 </ Box >
142104 ) : (
143105 < >
144- < Box display = { 'flex' } justifyContent = { 'space-between' } p = { 2 } >
145- < Box >
146- < MqText heading > { i18next . t ( 'datasets_route.heading' ) } </ MqText >
147- Page: { pageNavigation ( ) }
148- </ Box >
149- < Box >
150- < Tooltip title = { i18next . t ( 'events_route.previous_page' ) } >
151- < IconButton
152- sx = { {
153- marginLeft : theme . spacing ( 2 ) ,
154- } }
155- color = 'primary'
156- disabled = { state . page === 1 }
157- onClick = { ( ) => handleClickPage ( 'prev' ) }
158- size = 'large'
159- >
160- < ChevronLeftRounded />
161- </ IconButton >
162- </ Tooltip >
163- < Tooltip title = { i18next . t ( 'events_route.next_page' ) } >
164- < IconButton
165- color = 'primary'
166- disabled = { state . pageIsLast }
167- onClick = { ( ) => handleClickPage ( 'next' ) }
168- size = 'large'
169- >
170- < ChevronRightRounded />
171- </ IconButton >
172- </ Tooltip >
173- </ Box >
106+ < Box p = { 2 } display = { 'flex' } >
107+ < MqText heading > { i18next . t ( 'datasets_route.heading' ) } </ MqText >
108+ < Chip
109+ size = { 'small' }
110+ variant = { 'outlined' }
111+ color = { 'primary' }
112+ sx = { { marginLeft : 1 } }
113+ label = { totalCount + ' total' }
114+ > </ Chip >
174115 </ Box >
175116 < Table size = 'small' >
176117 < TableHead >
@@ -233,6 +174,41 @@ const Datasets: React.FC<DatasetsProps> = ({
233174 } ) }
234175 </ TableBody >
235176 </ Table >
177+ < Box display = { 'flex' } justifyContent = { 'flex-end' } alignItems = { 'center' } mb = { 2 } >
178+ < MqText subdued >
179+ < >
180+ { PAGE_SIZE * state . page + 1 } -{ ' ' }
181+ { Math . min ( PAGE_SIZE * ( state . page + 1 ) , totalCount ) } of { totalCount }
182+ </ >
183+ </ MqText >
184+ < Tooltip title = { i18next . t ( 'events_route.previous_page' ) } >
185+ < span >
186+ < IconButton
187+ sx = { {
188+ marginLeft : theme . spacing ( 2 ) ,
189+ } }
190+ color = 'primary'
191+ disabled = { state . page === 0 }
192+ onClick = { ( ) => handleClickPage ( 'prev' ) }
193+ size = 'large'
194+ >
195+ < ChevronLeftRounded />
196+ </ IconButton >
197+ </ span >
198+ </ Tooltip >
199+ < Tooltip title = { i18next . t ( 'events_route.next_page' ) } >
200+ < span >
201+ < IconButton
202+ color = 'primary'
203+ onClick = { ( ) => handleClickPage ( 'next' ) }
204+ size = 'large'
205+ disabled = { state . page === Math . ceil ( totalCount / PAGE_SIZE ) - 1 }
206+ >
207+ < ChevronRightRounded />
208+ </ IconButton >
209+ </ span >
210+ </ Tooltip >
211+ </ Box >
236212 </ >
237213 ) }
238214 </ >
@@ -243,6 +219,7 @@ const Datasets: React.FC<DatasetsProps> = ({
243219
244220const mapStateToProps = ( state : IState ) => ( {
245221 datasets : state . datasets . result ,
222+ totalCount : state . datasets . totalCount ,
246223 isDatasetsLoading : state . datasets . isLoading ,
247224 isDatasetsInit : state . datasets . init ,
248225 selectedNamespace : state . namespaces . selectedNamespace ,
0 commit comments