Skip to content

Commit 0b43862

Browse files
authored
Pagination for files & folder page under dataset (#797)
1 parent 344efe6 commit 0b43862

File tree

2 files changed

+79
-13
lines changed

2 files changed

+79
-13
lines changed

frontend/src/actions/dataset.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,13 @@ export function removeDatasetUserRole(datasetId, username) {
104104

105105
export const RECEIVE_FILES_IN_DATASET = "RECEIVE_FILES_IN_DATASET";
106106

107-
export function fetchFilesInDataset(datasetId, folderId) {
107+
export function fetchFilesInDataset(datasetId, folderId, skip, limit) {
108108
return (dispatch) => {
109109
return V2.DatasetsService.getDatasetFilesApiV2DatasetsDatasetIdFilesGet(
110110
datasetId,
111-
folderId
111+
folderId,
112+
skip,
113+
limit
112114
)
113115
.then((json) => {
114116
dispatch({
@@ -119,19 +121,21 @@ export function fetchFilesInDataset(datasetId, folderId) {
119121
})
120122
.catch((reason) => {
121123
dispatch(
122-
handleErrors(reason, fetchFilesInDataset(datasetId, folderId))
124+
handleErrors(reason, fetchFilesInDataset(datasetId, folderId, skip, limit))
123125
);
124126
});
125127
};
126128
}
127129

128130
export const RECEIVE_FOLDERS_IN_DATASET = "RECEIVE_FOLDERS_IN_DATASET";
129131

130-
export function fetchFoldersInDataset(datasetId, parentFolder) {
132+
export function fetchFoldersInDataset(datasetId, parentFolder, skip, limit) {
131133
return (dispatch) => {
132134
return V2.DatasetsService.getDatasetFoldersApiV2DatasetsDatasetIdFoldersGet(
133135
datasetId,
134-
parentFolder
136+
parentFolder,
137+
skip,
138+
limit
135139
)
136140
.then((json) => {
137141
dispatch({
@@ -142,7 +146,7 @@ export function fetchFoldersInDataset(datasetId, parentFolder) {
142146
})
143147
.catch((reason) => {
144148
dispatch(
145-
handleErrors(reason, fetchFoldersInDataset(datasetId, parentFolder))
149+
handleErrors(reason, fetchFoldersInDataset(datasetId, parentFolder, skip, limit))
146150
);
147151
});
148152
};

frontend/src/components/datasets/Dataset.tsx

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// lazy loading
22
import 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";
44
import { useParams, useSearchParams } from "react-router-dom";
55
import { RootState } from "../../types/data";
66
import { useDispatch, useSelector } from "react-redux";
@@ -27,7 +27,7 @@ import {
2727
import Layout from "../Layout";
2828
import { ActionsMenu } from "./ActionsMenu";
2929
import { DatasetDetails } from "./DatasetDetails";
30-
import { FormatListBulleted, InsertDriveFile } from "@material-ui/icons";
30+
import {ArrowBack, ArrowForward, FormatListBulleted, InsertDriveFile} from "@material-ui/icons";
3131
import { Listeners } from "../listeners/Listeners";
3232
import AssessmentIcon from "@mui/icons-material/Assessment";
3333
import 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

Comments
 (0)