Skip to content

Commit 2317a66

Browse files
authored
Merge pull request #975 from IQSS/add-version-pagination
added pagination to Versions tab on Dataset and File page. Tested Locally and QA server.
2 parents 7a3863b + 0394623 commit 2317a66

15 files changed

Lines changed: 377 additions & 105 deletions

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel
1010

1111
### Changed
1212

13+
- Added pagination to the Versions tabs on Dataset and File pages so version summaries are loaded and displayed one page at a time.
14+
1315
### Fixed
1416

1517
### Removed
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
import { PaginationInfo } from '../../../shared/pagination/domain/models/PaginationInfo'
22

33
export class DatasetVersionPaginationInfo extends PaginationInfo<DatasetVersionPaginationInfo> {
4-
constructor(page = 1, pageSize = 10, totalItems = 0, itemName = 'Version') {
4+
constructor(
5+
page = 1,
6+
pageSize = 10,
7+
totalItems = 0,
8+
itemName = 'Version',
9+
private readonly offsetOverride?: number
10+
) {
511
super(page, pageSize, totalItems, itemName)
612
}
13+
14+
get offset(): number {
15+
return this.offsetOverride ?? super.offset
16+
}
717
}

src/sections/dataset/Dataset.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,8 @@ export function Dataset({
172172
datasetId={dataset.persistentId}
173173
currentVersionNumber={currentVersionNumber}
174174
canUpdateDataset={canUpdateDataset}
175-
isInView={activeTab === 'versions'}
175+
isInView
176176
key={dataset.internalVersionNumber}
177-
isCurrentVersionDeaccessioned={isCurrentVersionDeaccessioned}
178177
/>
179178
</div>
180179
</Tabs.Tab>

src/sections/dataset/dataset-versions/DatasetVersions.module.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@
3434
}
3535
}
3636

37+
.dataset-versions-table-loading {
38+
tbody {
39+
opacity: 0.55;
40+
transition: opacity 120ms ease-in-out;
41+
}
42+
}
43+
3744
.visually-hidden {
3845
position: absolute;
3946
clip: rect(1px, 1px, 1px, 1px);

src/sections/dataset/dataset-versions/DatasetVersions.tsx

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@ import { useDatasetVersionSummaryDescription } from './useDatasetVersionSummaryD
1616
import { DatasetViewDetailButton } from './DatasetViewDetailButton'
1717
import { DatasetVersionState } from '@/dataset/domain/models/Dataset'
1818
import styles from './DatasetVersions.module.scss'
19+
import { DatasetVersionPaginationInfo } from '@/dataset/domain/models/DatasetVersionPaginationInfo'
20+
import { PaginationControls } from '@/sections/shared/pagination/PaginationControls'
1921

2022
interface DatasetVersionsProps {
2123
datasetRepository: DatasetRepository
2224
datasetId: string
2325
currentVersionNumber: string
2426
canUpdateDataset: boolean
2527
isInView: boolean
26-
isCurrentVersionDeaccessioned?: boolean
2728
}
2829

2930
const isVersionDeaccessioned = (version: DatasetVersionSummaryInfo) =>
@@ -36,11 +37,13 @@ export function DatasetVersions({
3637
datasetId,
3738
currentVersionNumber,
3839
canUpdateDataset,
39-
isInView,
40-
isCurrentVersionDeaccessioned
40+
isInView
4141
}: DatasetVersionsProps) {
4242
const { t } = useTranslation('dataset')
4343
const [selectedVersions, setSelectedVersions] = useState<DatasetVersionSummaryInfo[]>([])
44+
const [paginationInfo, setPaginationInfo] = useState<DatasetVersionPaginationInfo>(
45+
new DatasetVersionPaginationInfo()
46+
)
4447
const {
4548
datasetVersionSummaries,
4649
error,
@@ -49,7 +52,7 @@ export function DatasetVersions({
4952
} = useGetDatasetVersionsSummaries({
5053
datasetRepository,
5154
persistentId: datasetId,
52-
autoFetch: isCurrentVersionDeaccessioned ? true : false
55+
autoFetch: false
5356
})
5457

5558
const handleCheckboxChange = (datasetSummary: DatasetVersionSummaryInfo) => {
@@ -64,25 +67,46 @@ export function DatasetVersions({
6467
})
6568
}
6669

70+
const visibleDatasetVersionSummaries = datasetVersionSummaries?.slice(0, paginationInfo.pageSize)
6771
const selectableVersions =
68-
datasetVersionSummaries &&
69-
datasetVersionSummaries.filter((version) => !isVersionDeaccessioned(version))
72+
visibleDatasetVersionSummaries &&
73+
visibleDatasetVersionSummaries.filter((version) => !isVersionDeaccessioned(version))
7074
const isCheckBoxValid = (selectableVersions?.length ?? 0) > 2
7175

7276
useEffect(() => {
73-
if (isInView && !datasetVersionSummaries) {
74-
void fetchSummaries()
77+
if (isInView) {
78+
const paginationInfoToDisplay = new DatasetVersionPaginationInfo(
79+
paginationInfo.page,
80+
paginationInfo.pageSize
81+
)
82+
const paginationInfoToFetch = new DatasetVersionPaginationInfo(
83+
paginationInfo.page,
84+
paginationInfo.pageSize + 1,
85+
0,
86+
'Version',
87+
paginationInfoToDisplay.offset
88+
)
89+
90+
void fetchSummaries(paginationInfoToFetch).then((totalCount) => {
91+
if (typeof totalCount === 'number') {
92+
setPaginationInfo((currentPaginationInfo) => currentPaginationInfo.withTotal(totalCount))
93+
}
94+
})
7595
}
76-
}, [isInView, fetchSummaries, datasetVersionSummaries])
96+
}, [isInView, fetchSummaries, paginationInfo.page, paginationInfo.pageSize])
7797

78-
if (isLoadingDatasetVersionSummaries || !datasetVersionSummaries) {
79-
return <DatasetVersionsLoadingSkeleton />
80-
}
98+
useEffect(() => {
99+
setSelectedVersions([])
100+
}, [paginationInfo.page, paginationInfo.pageSize])
81101

82102
if (error) {
83103
return <Alert variant="danger">Error loading dataset versions</Alert>
84104
}
85105

106+
if (!datasetVersionSummaries) {
107+
return <DatasetVersionsLoadingSkeleton />
108+
}
109+
86110
return (
87111
<>
88112
{selectedVersions.length === 2 && (
@@ -93,7 +117,12 @@ export function DatasetVersions({
93117
/>
94118
)}
95119

96-
<div className={styles['dataset-versions-table']} data-testid="dataset-versions-table">
120+
<div
121+
className={`${styles['dataset-versions-table']} ${
122+
isLoadingDatasetVersionSummaries ? styles['dataset-versions-table-loading'] : ''
123+
}`}
124+
data-testid="dataset-versions-table"
125+
aria-busy={isLoadingDatasetVersionSummaries}>
97126
<Table>
98127
<thead>
99128
<tr>
@@ -110,7 +139,7 @@ export function DatasetVersions({
110139
</tr>
111140
</thead>
112141
<tbody>
113-
{datasetVersionSummaries?.map((dataset, index) => {
142+
{visibleDatasetVersionSummaries?.map((dataset, index) => {
114143
const findLastNonDeaccessionedPreviousVersion = () => {
115144
for (let i = index + 1; i < datasetVersionSummaries.length; i++) {
116145
const version = datasetVersionSummaries[i]
@@ -186,6 +215,10 @@ export function DatasetVersions({
186215
</tbody>
187216
</Table>
188217
</div>
218+
<PaginationControls
219+
initialPaginationInfo={paginationInfo}
220+
onPaginationInfoChange={setPaginationInfo}
221+
/>
189222
</>
190223
)
191224
}

src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useEffect, useState } from 'react'
1+
import { useCallback, useEffect, useRef, useState } from 'react'
22
import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo'
33
import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository'
44
import { getDatasetVersionsSummaries } from '@/dataset/domain/useCases/getDatasetVersionsSummaries'
@@ -8,7 +8,7 @@ interface UseGetDatasetVersionsSummaries {
88
datasetVersionSummaries: DatasetVersionSummaryInfo[] | undefined
99
error: string | null
1010
isLoading: boolean
11-
fetchSummaries: (paginationInfo?: DatasetVersionPaginationInfo) => Promise<void>
11+
fetchSummaries: (paginationInfo?: DatasetVersionPaginationInfo) => Promise<number | undefined>
1212
}
1313

1414
interface Props {
@@ -25,9 +25,12 @@ export const useGetDatasetVersionsSummaries = ({
2525
const [summaries, setSummaries] = useState<DatasetVersionSummaryInfo[]>()
2626
const [isLoading, setIsLoading] = useState<boolean>(autoFetch)
2727
const [error, setError] = useState<string | null>(null)
28+
const latestRequestId = useRef(0)
2829

2930
const fetchSummaries = useCallback(
3031
async (paginationInfo?: DatasetVersionPaginationInfo) => {
32+
const requestId = latestRequestId.current + 1
33+
latestRequestId.current = requestId
3134
setIsLoading(true)
3235
setError(null)
3336

@@ -37,15 +40,25 @@ export const useGetDatasetVersionsSummaries = ({
3740
persistentId,
3841
paginationInfo
3942
)
43+
if (requestId !== latestRequestId.current) {
44+
return undefined
45+
}
4046
setSummaries(versionSummaries.summaries)
47+
return versionSummaries.totalCount
4148
} catch (err) {
49+
if (requestId !== latestRequestId.current) {
50+
return undefined
51+
}
4252
const errorMessage =
4353
err instanceof Error && err.message
4454
? err.message
4555
: 'Something went wrong getting the information from the dataset versions summaries. Try again later.'
4656
setError(errorMessage)
57+
return undefined
4758
} finally {
48-
setIsLoading(false)
59+
if (requestId === latestRequestId.current) {
60+
setIsLoading(false)
61+
}
4962
}
5063
},
5164
[datasetRepository, persistentId]

src/sections/file/file-version/FileVersion.module.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@
1919
}
2020
}
2121

22+
.file-versions-table-loading {
23+
tbody {
24+
opacity: 0.55;
25+
transition: opacity 120ms ease-in-out;
26+
}
27+
}
28+
2229
.no-summary-text {
2330
font-style: italic;
2431
color: $dv-subtext-color;

0 commit comments

Comments
 (0)