11// lazy loading
22import React , { useEffect , useState } from "react" ;
3- import { Box , Button , Grid , Stack , Tab , Tabs , Typography } from "@mui/material" ;
3+ import { Box , Button , ButtonGroup , Grid , Stack , Tab , Tabs , Typography } from "@mui/material" ;
44import { useParams , useSearchParams } from "react-router-dom" ;
55import { RootState } from "../../types/data" ;
66import { useDispatch , useSelector } from "react-redux" ;
@@ -27,7 +27,7 @@ import {
2727import Layout from "../Layout" ;
2828import { ActionsMenu } from "./ActionsMenu" ;
2929import { DatasetDetails } from "./DatasetDetails" ;
30- import { FormatListBulleted , InsertDriveFile } from "@material-ui/icons" ;
30+ import { ArrowBack , ArrowForward , FormatListBulleted , InsertDriveFile } from "@material-ui/icons" ;
3131import { Listeners } from "../listeners/Listeners" ;
3232import AssessmentIcon from "@mui/icons-material/Assessment" ;
3333import HistoryIcon from "@mui/icons-material/History" ;
@@ -69,11 +69,12 @@ export const Dataset = (): JSX.Element => {
6969 const listFilesInDataset = (
7070 datasetId : string | undefined ,
7171 folderId : string | null
72- ) => dispatch ( fetchFilesInDataset ( datasetId , folderId ) ) ;
72+ , skip : number | undefined , limit : number | undefined ) => dispatch ( fetchFilesInDataset ( datasetId , folderId , skip , limit ) ) ;
7373 const listFoldersInDataset = (
7474 datasetId : string | undefined ,
75- parentFolder : string | null
76- ) => dispatch ( fetchFoldersInDataset ( datasetId , parentFolder ) ) ;
75+ parentFolder : string | null ,
76+ skip : number | undefined , limit : number | undefined
77+ ) => dispatch ( fetchFoldersInDataset ( datasetId , parentFolder , skip , limit ) ) ;
7778 const listDatasetAbout = ( datasetId : string | undefined ) =>
7879 dispatch ( fetchDatasetAbout ( datasetId ) ) ;
7980 const listDatasetMetadata = ( datasetId : string | undefined ) =>
@@ -100,14 +101,40 @@ export const Dataset = (): JSX.Element => {
100101
101102 const [ paths , setPaths ] = useState ( [ ] ) ;
102103
104+ // TODO add option to determine limit number; default show 20 files each time
105+ const [ currPageNum , setCurrPageNum ] = useState < number > ( 0 ) ;
106+ const [ limit ] = useState < number > ( 10 ) ;
107+ const [ skip , setSkip ] = useState < number | undefined > ( 0 ) ;
108+ const [ prevDisabled , setPrevDisabled ] = useState < boolean > ( true ) ;
109+ const [ nextDisabled , setNextDisabled ] = useState < boolean > ( false ) ;
110+ const filesInDataset = useSelector ( ( state : RootState ) => state . dataset . files ) ;
111+ const foldersInDataset = useSelector ( ( state : RootState ) => state . folder . folders ) ;
112+
103113 // component did mount list all files in dataset
104114 useEffect ( ( ) => {
105- listFilesInDataset ( datasetId , folderId ) ;
106- listFoldersInDataset ( datasetId , folderId ) ;
115+ listFilesInDataset ( datasetId , folderId , skip , limit ) ;
116+ listFoldersInDataset ( datasetId , folderId , skip , limit ) ;
107117 listDatasetAbout ( datasetId ) ;
108118 getFolderPath ( folderId ) ;
109119 } , [ searchParams ] ) ;
110120
121+ useEffect ( ( ) => {
122+ // disable flipping if reaches the last page
123+ if ( filesInDataset . length < limit && foldersInDataset . length < limit )
124+ setNextDisabled ( true ) ;
125+ else
126+ setNextDisabled ( false ) ;
127+ } , [ filesInDataset ] ) ;
128+
129+ useEffect ( ( ) => {
130+ if ( skip !== null && skip !== undefined ) {
131+ listFilesInDataset ( datasetId , folderId , skip , limit ) ;
132+ listFoldersInDataset ( datasetId , folderId , skip , limit ) ;
133+ if ( skip === 0 ) setPrevDisabled ( true ) ;
134+ else setPrevDisabled ( false ) ;
135+ }
136+ } , [ skip ] ) ;
137+
111138 // for breadcrumb
112139 useEffect ( ( ) => {
113140 // for breadcrumb
@@ -132,6 +159,20 @@ export const Dataset = (): JSX.Element => {
132159 setPaths ( tmpPaths ) ;
133160 } , [ about , folderPath ] ) ;
134161
162+ // for pagination keep flipping until the return dataset is less than the limit
163+ const previous = ( ) => {
164+ if ( currPageNum - 1 >= 0 ) {
165+ setSkip ( ( currPageNum - 1 ) * limit ) ;
166+ setCurrPageNum ( currPageNum - 1 ) ;
167+ }
168+ } ;
169+ const next = ( ) => {
170+ if ( filesInDataset . length === limit || foldersInDataset . length === limit ) {
171+ setSkip ( ( currPageNum + 1 ) * limit ) ;
172+ setCurrPageNum ( currPageNum + 1 ) ;
173+ }
174+ } ;
175+
135176 const handleTabChange = (
136177 _event : React . ChangeEvent < { } > ,
137178 newTabIndex : number
@@ -359,6 +400,27 @@ export const Dataset = (): JSX.Element => {
359400 < TabPanel value = { selectedTabIndex } index = { 6 } >
360401 < SharingTab datasetId = { datasetId } />
361402 </ TabPanel >
403+ < Box display = "flex" justifyContent = "center" sx = { { m : 1 } } >
404+ < ButtonGroup
405+ variant = "contained"
406+ aria-label = "previous next buttons"
407+ >
408+ < Button
409+ aria-label = "previous"
410+ onClick = { previous }
411+ disabled = { prevDisabled }
412+ >
413+ < ArrowBack /> Prev
414+ </ Button >
415+ < Button
416+ aria-label = "next"
417+ onClick = { next }
418+ disabled = { nextDisabled }
419+ >
420+ Next < ArrowForward />
421+ </ Button >
422+ </ ButtonGroup >
423+ </ Box >
362424 </ Grid >
363425 < Grid item >
364426 < DatasetDetails details = { about } />
0 commit comments