From 8a644ea1b02909687357ccec419044562a451349 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 30 Oct 2025 17:32:06 -0400 Subject: [PATCH 1/9] feat: add query para --- package-lock.json | 8 ++-- package.json | 2 +- .../models/DatasetVersionSummaryInfo.ts | 5 +++ .../domain/repositories/DatasetRepository.ts | 8 +++- .../useCases/getDatasetVersionsSummaries.ts | 10 +++-- .../DatasetJSDataverseRepository.ts | 16 ++++--- .../domain/models/FileVersionSummaryInfo.ts | 5 +++ .../domain/repositories/FileRepository.ts | 8 +++- .../useCases/getFileVersionSummaries.ts | 10 +++-- .../FileJSDataverseRepository.ts | 10 +++-- .../useGetDatasetVersionsSummaries.ts | 42 +++++++++++-------- .../useGetFileVersionsSummaries.ts | 42 +++++++++++-------- .../dataset/DatasetErrorMockRepository.ts | 8 +++- .../dataset/DatasetLoadingMockRepository.ts | 8 +++- src/stories/dataset/DatasetMockRepository.ts | 8 +++- .../DeaccessionDatasetModal.stories.tsx | 21 ++++++---- src/stories/file/FileMockRepository.ts | 11 +++-- .../models/DatasetVersionsSummariesMother.ts | 15 +++++-- .../sections/dataset/Dataset.spec.tsx | 4 +- .../DeaccessionDatasetButton.spec.tsx | 29 +++++++++---- .../dataset-versions/DatasetVersions.spec.tsx | 36 ++++++++++------ .../useGetDatasetVersionsSummaries.spec.tsx | 17 +++++--- .../EditDatasetMetadata.spec.tsx | 4 +- .../file/file-version/FileVersions.spec.tsx | 22 +++++++--- .../useGetFileVersionsSummaries.spec.tsx | 10 +++-- 25 files changed, 242 insertions(+), 117 deletions(-) diff --git a/package-lock.json b/package-lock.json index f6f4c9780..36dc68d12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.0.0-alpha.77", + "@iqss/dataverse-client-javascript": "2.1.0-pr395.061ad8e", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", @@ -1954,9 +1954,9 @@ }, "node_modules/@iqss/dataverse-client-javascript": { "name": "@IQSS/dataverse-client-javascript", - "version": "2.0.0-alpha.77", - "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-alpha.77/a12678016bb88b43b940910a1d55b65518e38691", - "integrity": "sha512-mGbm5Wd+jU9H0w2x4iyCLX8VwIAy7oYSH4juZlYuCcLbftmIObyLVcspxJ61XINColLfZY6Rs63+lOWBwYktZg==", + "version": "2.1.0-pr395.061ad8e", + "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.1.0-pr395.061ad8e/7572037bdd5d62b4672421f948ce08dffe2ff2ef", + "integrity": "sha512-wgQT4y5QSrzVIylI5NL9xiak6VjJd8f5haTydsLOy6qZy50tZDMscTi39akdSg36zUOKh/OTQ/BFPYHIysz+dw==", "license": "MIT", "dependencies": { "@types/node": "^18.15.11", diff --git a/package.json b/package.json index 1063690f6..7622037c7 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.0.0-alpha.77", + "@iqss/dataverse-client-javascript": "2.1.0-pr395.061ad8e", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", diff --git a/src/dataset/domain/models/DatasetVersionSummaryInfo.ts b/src/dataset/domain/models/DatasetVersionSummaryInfo.ts index 8de8378e7..f96485d83 100644 --- a/src/dataset/domain/models/DatasetVersionSummaryInfo.ts +++ b/src/dataset/domain/models/DatasetVersionSummaryInfo.ts @@ -1,3 +1,8 @@ +export interface DatasetVersionSummarySubset { + summaries: DatasetVersionSummaryInfo[] + totalCount: number +} + export interface DatasetVersionSummaryInfo { id: number versionNumber: string diff --git a/src/dataset/domain/repositories/DatasetRepository.ts b/src/dataset/domain/repositories/DatasetRepository.ts index 4c49740e3..3d7a91cbb 100644 --- a/src/dataset/domain/repositories/DatasetRepository.ts +++ b/src/dataset/domain/repositories/DatasetRepository.ts @@ -4,7 +4,7 @@ import { DatasetPaginationInfo } from '../models/DatasetPaginationInfo' import { DatasetDTO } from '../useCases/DTOs/DatasetDTO' import { DatasetsWithCount } from '../models/DatasetsWithCount' import { VersionUpdateType } from '../models/VersionUpdateType' -import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo' +import { DatasetVersionSummarySubset } from '../models/DatasetVersionSummaryInfo' import { DatasetDeaccessionDTO } from '../useCases/DTOs/DatasetDTO' import { DatasetDownloadCount } from '../models/DatasetDownloadCount' import { FormattedCitation, CitationFormat } from '../models/DatasetCitation' @@ -44,7 +44,11 @@ export interface DatasetRepository { paginationInfo: DatasetPaginationInfo ) => Promise publish(persistentId: string, versionUpdateType: VersionUpdateType): Promise - getDatasetVersionsSummaries: (datasetId: number | string) => Promise + getDatasetVersionsSummaries: ( + datasetId: number | string, + limit?: number, + offset?: number + ) => Promise getDownloadCount: ( datasetId: string | number, includeMDC?: boolean diff --git a/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts b/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts index 547e952dd..54023c382 100644 --- a/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts +++ b/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts @@ -1,11 +1,13 @@ import { DatasetRepository } from '../repositories/DatasetRepository' -import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo' +import { DatasetVersionSummarySubset } from '../models/DatasetVersionSummaryInfo' export function getDatasetVersionsSummaries( datasetRepository: DatasetRepository, - datasetId: number | string -): Promise { - return datasetRepository.getDatasetVersionsSummaries(datasetId).catch((error) => { + datasetId: number | string, + limit?: number, + offset?: number +): Promise { + return datasetRepository.getDatasetVersionsSummaries(datasetId, limit, offset).catch((error) => { throw error }) } diff --git a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts index d965cd9df..246aef64d 100644 --- a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts +++ b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts @@ -46,7 +46,7 @@ import { DatasetDTO } from '../../domain/useCases/DTOs/DatasetDTO' import { DatasetDTOMapper } from '../mappers/DatasetDTOMapper' import { DatasetsWithCount } from '../../domain/models/DatasetsWithCount' import { VersionUpdateType } from '../../domain/models/VersionUpdateType' -import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo' +import { DatasetVersionSummarySubset } from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { DatasetDownloadCount } from '@/dataset/domain/models/DatasetDownloadCount' import { FormattedCitation, CitationFormat } from '@/dataset/domain/models/DatasetCitation' import { axiosInstance } from '@/axiosInstance' @@ -373,10 +373,16 @@ export class DatasetJSDataverseRepository implements DatasetRepository { throw new Error(error.message) }) } - getDatasetVersionsSummaries(datasetId: number | string): Promise { - return getDatasetVersionsSummaries.execute(datasetId).catch((error: ReadError) => { - throw error - }) + getDatasetVersionsSummaries( + datasetId: number | string, + limit?: number, + offset?: number + ): Promise { + return getDatasetVersionsSummaries + .execute(datasetId, limit, offset) + .catch((error: ReadError) => { + throw error + }) } getDownloadCount( datasetId: string | number, diff --git a/src/files/domain/models/FileVersionSummaryInfo.ts b/src/files/domain/models/FileVersionSummaryInfo.ts index caca9ed50..9c128ad04 100644 --- a/src/files/domain/models/FileVersionSummaryInfo.ts +++ b/src/files/domain/models/FileVersionSummaryInfo.ts @@ -1,5 +1,10 @@ import { DatasetVersionState } from '@/dataset/domain/models/Dataset' +export interface FileVersionSummarySubset { + summaries: FileVersionSummaryInfo[] + totalCount: number +} + export interface FileVersionSummaryInfo { datasetVersion: string contributors?: string diff --git a/src/files/domain/repositories/FileRepository.ts b/src/files/domain/repositories/FileRepository.ts index 587e8a1be..4ad963b35 100644 --- a/src/files/domain/repositories/FileRepository.ts +++ b/src/files/domain/repositories/FileRepository.ts @@ -11,7 +11,7 @@ import { UploadedFileDTO } from '@iqss/dataverse-client-javascript' import { FixityAlgorithm } from '../models/FixityAlgorithm' import { FileMetadataDTO } from '@/files/domain/useCases/DTOs/FileMetadataDTO' import { RestrictFileDTO } from '../useCases/restrictFileDTO' -import { FileVersionSummaryInfo } from '../models/FileVersionSummaryInfo' +import { FileVersionSummarySubset } from '../models/FileVersionSummaryInfo' export interface FileRepository { getAllByDatasetPersistentId: ( @@ -32,7 +32,11 @@ export interface FileRepository { criteria?: FileCriteria, includeDeaccessioned?: boolean ) => Promise - getFileVersionSummaries: (fileId: number | string) => Promise + getFileVersionSummaries: ( + fileId: number | string, + limit?: number, + offset?: number + ) => Promise getById: (id: number, datasetVersionNumber?: string) => Promise getMultipleFileDownloadUrl: (ids: number[], downloadMode: FileDownloadMode) => string getFileDownloadUrl: (id: number, downloadMode: FileDownloadMode) => string diff --git a/src/files/domain/useCases/getFileVersionSummaries.ts b/src/files/domain/useCases/getFileVersionSummaries.ts index dd454bba7..ab6fde785 100644 --- a/src/files/domain/useCases/getFileVersionSummaries.ts +++ b/src/files/domain/useCases/getFileVersionSummaries.ts @@ -1,9 +1,11 @@ import { FileRepository } from '../repositories/FileRepository' -import { FileVersionSummaryInfo } from '../models/FileVersionSummaryInfo' +import { FileVersionSummarySubset } from '../models/FileVersionSummaryInfo' export function getFileVersionSummaries( fileRepository: FileRepository, - fileId: number | string -): Promise { - return fileRepository.getFileVersionSummaries(fileId) + fileId: number | string, + limit?: number, + offset?: number +): Promise { + return fileRepository.getFileVersionSummaries(fileId, limit, offset) } diff --git a/src/files/infrastructure/FileJSDataverseRepository.ts b/src/files/infrastructure/FileJSDataverseRepository.ts index 29c287ce7..ebfb92247 100644 --- a/src/files/infrastructure/FileJSDataverseRepository.ts +++ b/src/files/infrastructure/FileJSDataverseRepository.ts @@ -45,7 +45,7 @@ import { FixityAlgorithm } from '../domain/models/FixityAlgorithm' import { RestrictFileDTO } from '../domain/useCases/restrictFileDTO' import { FileMetadataDTO } from '@/files/domain/useCases/DTOs/FileMetadataDTO' import { JSDataverseReadErrorHandler } from '@/shared/helpers/JSDataverseReadErrorHandler' -import { FileVersionSummaryInfo } from '../domain/models/FileVersionSummaryInfo' +import { FileVersionSummarySubset } from '../domain/models/FileVersionSummaryInfo' const includeDeaccessioned = true @@ -249,8 +249,12 @@ export class FileJSDataverseRepository implements FileRepository { throw new Error(error.message) }) } - getFileVersionSummaries(fileId: number | string): Promise { - return getFileVersionSummaries.execute(fileId) + getFileVersionSummaries( + fileId: number | string, + limit?: number, + offset?: number + ): Promise { + return getFileVersionSummaries.execute(fileId, limit, offset) } getById(id: number, datasetVersionNumber?: string): Promise { diff --git a/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts b/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts index 007357c4f..49d90c05b 100644 --- a/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts +++ b/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts @@ -7,7 +7,7 @@ interface UseGetDatasetVersionsSummaries { datasetVersionSummaries: DatasetVersionSummaryInfo[] | undefined error: string | null isLoading: boolean - fetchSummaries: () => Promise + fetchSummaries: (limit?: number, offset?: number) => Promise } interface Props { @@ -25,23 +25,31 @@ export const useGetDatasetVersionsSummaries = ({ const [isLoading, setIsLoading] = useState(autoFetch) const [error, setError] = useState(null) - const fetchSummaries = useCallback(async () => { - setIsLoading(true) - setError(null) + const fetchSummaries = useCallback( + async (limit?: number, offset?: number) => { + setIsLoading(true) + setError(null) - try { - const versionSummaries = await getDatasetVersionsSummaries(datasetRepository, persistentId) - setSummaries(versionSummaries) - } catch (err) { - const errorMessage = - err instanceof Error && err.message - ? err.message - : 'Something went wrong getting the information from the dataset versions summaries. Try again later.' - setError(errorMessage) - } finally { - setIsLoading(false) - } - }, [datasetRepository, persistentId]) + try { + const versionSummaries = await getDatasetVersionsSummaries( + datasetRepository, + persistentId, + limit, + offset + ) + setSummaries(versionSummaries.summaries) + } catch (err) { + const errorMessage = + err instanceof Error && err.message + ? err.message + : 'Something went wrong getting the information from the dataset versions summaries. Try again later.' + setError(errorMessage) + } finally { + setIsLoading(false) + } + }, + [datasetRepository, persistentId] + ) useEffect(() => { if (autoFetch) { diff --git a/src/sections/file/file-version/useGetFileVersionsSummaries.ts b/src/sections/file/file-version/useGetFileVersionsSummaries.ts index 1fc52408f..f6c38ffd2 100644 --- a/src/sections/file/file-version/useGetFileVersionsSummaries.ts +++ b/src/sections/file/file-version/useGetFileVersionsSummaries.ts @@ -7,7 +7,7 @@ interface UseGetFileVersionsSummaries { fileVersionSummaries: FileVersionSummaryInfo[] | undefined error: string | null isLoading: boolean - fetchSummaries: () => Promise + fetchSummaries: (limit?: number, offset?: number) => Promise } interface Props { @@ -25,22 +25,30 @@ export const useGetFileVersionsSummaries = ({ const [isLoading, setIsLoading] = useState(autoFetch) const [error, setError] = useState(null) - const fetchSummaries = useCallback(async () => { - setIsLoading(true) - setError(null) - try { - const versionSummaries = await getFileVersionSummaries(fileRepository, fileId) - setSummaries(versionSummaries) - } catch (err) { - const errorMessage = - err instanceof Error && err.message - ? err.message - : 'Something went wrong getting the information from the file versions summaries. Try again later.' - setError(errorMessage) - } finally { - setIsLoading(false) - } - }, [fileRepository, fileId]) + const fetchSummaries = useCallback( + async (limit?: number, offset?: number) => { + setIsLoading(true) + setError(null) + try { + const versionSummaries = await getFileVersionSummaries( + fileRepository, + fileId, + limit, + offset + ) + setSummaries(versionSummaries.summaries) + } catch (err) { + const errorMessage = + err instanceof Error && err.message + ? err.message + : 'Something went wrong getting the information from the file versions summaries. Try again later.' + setError(errorMessage) + } finally { + setIsLoading(false) + } + }, + [fileRepository, fileId] + ) useEffect(() => { if (autoFetch) { diff --git a/src/stories/dataset/DatasetErrorMockRepository.ts b/src/stories/dataset/DatasetErrorMockRepository.ts index a6d6d0d34..b4fbb7658 100644 --- a/src/stories/dataset/DatasetErrorMockRepository.ts +++ b/src/stories/dataset/DatasetErrorMockRepository.ts @@ -6,8 +6,8 @@ import { DatasetDTO } from '../../dataset/domain/useCases/DTOs/DatasetDTO' import { FakerHelper } from '../../../tests/component/shared/FakerHelper' import { VersionUpdateType } from '../../dataset/domain/models/VersionUpdateType' import { DatasetVersionDiff } from '@/dataset/domain/models/DatasetVersionDiff' -import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { DatasetDeaccessionDTO } from '@iqss/dataverse-client-javascript' +import { DatasetVersionSummarySubset } from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { DatasetDownloadCount } from '@/dataset/domain/models/DatasetDownloadCount' import { CitationFormat, FormattedCitation } from '@/dataset/domain/models/DatasetCitation' import { DatasetTemplate } from '@/dataset/domain/models/DatasetTemplate' @@ -87,7 +87,11 @@ export class DatasetErrorMockRepository implements DatasetMockRepository { }) } - getDatasetVersionsSummaries(_datasetId: number | string): Promise { + getDatasetVersionsSummaries( + _datasetId: number | string, + _limit?: number, + _offset?: number + ): Promise { return new Promise((_resolve, reject) => { setTimeout(() => { reject('Error thrown from mock') diff --git a/src/stories/dataset/DatasetLoadingMockRepository.ts b/src/stories/dataset/DatasetLoadingMockRepository.ts index 625b5ba98..ecd99fae7 100644 --- a/src/stories/dataset/DatasetLoadingMockRepository.ts +++ b/src/stories/dataset/DatasetLoadingMockRepository.ts @@ -1,7 +1,7 @@ import { DatasetMockRepository } from './DatasetMockRepository' import { DatasetPaginationInfo } from '../../dataset/domain/models/DatasetPaginationInfo' import { DatasetsWithCount } from '../../dataset/domain/models/DatasetsWithCount' -import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo' +import { DatasetVersionSummarySubset } from '@/dataset/domain/models/DatasetVersionSummaryInfo' export class DatasetLoadingMockRepository extends DatasetMockRepository { getDatasetsWithCount: ( @@ -14,7 +14,11 @@ export class DatasetLoadingMockRepository extends DatasetMockRepository { return new Promise(() => {}) } - getDatasetVersionsSummaries(_datasetId: number | string): Promise { + getDatasetVersionsSummaries( + _datasetId: number | string, + _limit?: number, + _offset?: number + ): Promise { return new Promise(() => {}) } } diff --git a/src/stories/dataset/DatasetMockRepository.ts b/src/stories/dataset/DatasetMockRepository.ts index 9719ef5de..d2457bd79 100644 --- a/src/stories/dataset/DatasetMockRepository.ts +++ b/src/stories/dataset/DatasetMockRepository.ts @@ -10,7 +10,7 @@ import { DatasetDTO } from '../../dataset/domain/useCases/DTOs/DatasetDTO' import { DatasetsWithCount } from '../../dataset/domain/models/DatasetsWithCount' import { FakerHelper } from '../../../tests/component/shared/FakerHelper' import { VersionUpdateType } from '../../dataset/domain/models/VersionUpdateType' -import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo' +import { DatasetVersionSummarySubset } from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { DatasetDeaccessionDTO } from '@iqss/dataverse-client-javascript' import { DatasetDownloadCount } from '@/dataset/domain/models/DatasetDownloadCount' import { DatasetDownloadCountMother } from '@tests/component/dataset/domain/models/DatasetDownloadCountMother' @@ -98,7 +98,11 @@ export class DatasetMockRepository implements DatasetRepository { }) } - getDatasetVersionsSummaries(_datasetId: number | string): Promise { + getDatasetVersionsSummaries( + _datasetId: number | string, + _limit?: number, + _offset?: number + ): Promise { return new Promise((resolve) => { setTimeout(() => { resolve(DatasetVersionsSummariesMother.create()) diff --git a/src/stories/dataset/deaccession-dataset/DeaccessionDatasetModal.stories.tsx b/src/stories/dataset/deaccession-dataset/DeaccessionDatasetModal.stories.tsx index 3f709112e..ab476e609 100644 --- a/src/stories/dataset/deaccession-dataset/DeaccessionDatasetModal.stories.tsx +++ b/src/stories/dataset/deaccession-dataset/DeaccessionDatasetModal.stories.tsx @@ -37,15 +37,18 @@ export const WithOneVersion: Story = { datasetMockRepository.getDatasetVersionsSummaries = () => { return new Promise((resolve) => { setTimeout(() => { - resolve([ - { - id: 1, - contributors: 'contributors', - versionNumber: '1.0', - publishedOn: '2023-01-01', - summary: DatasetVersionSummaryStringValues.firstPublished - } - ]) + resolve({ + summaries: [ + { + id: 1, + contributors: 'contributors', + versionNumber: '1.0', + publishedOn: '2023-01-01', + summary: DatasetVersionSummaryStringValues.firstPublished + } + ], + totalCount: 1 + }) }, 1_000) }) } diff --git a/src/stories/file/FileMockRepository.ts b/src/stories/file/FileMockRepository.ts index bef568dd7..208281fa7 100644 --- a/src/stories/file/FileMockRepository.ts +++ b/src/stories/file/FileMockRepository.ts @@ -17,7 +17,7 @@ import { UploadedFileDTO } from '@iqss/dataverse-client-javascript' import { FixityAlgorithm } from '@/files/domain/models/FixityAlgorithm' import { FileMetadataDTO } from '@/files/domain/useCases/DTOs/FileMetadataDTO' import { RestrictFileDTO } from '@/files/domain/useCases/restrictFileDTO' -import { FileVersionSummaryInfo } from '@/files/domain/models/FileVersionSummaryInfo' +import { FileVersionSummarySubset } from '@/files/domain/models/FileVersionSummaryInfo' export class FileMockRepository implements FileRepository { constructor(public readonly fileMock?: File) {} @@ -158,10 +158,15 @@ export class FileMockRepository implements FileRepository { }) } - getFileVersionSummaries(_id: number | string): Promise { + getFileVersionSummaries( + _id: number | string, + _limit?: number, + _offset?: number + ): Promise { return new Promise((resolve) => { setTimeout(() => { - resolve(FileMother.createFileVersionSummary()) + const summaries = FileMother.createFileVersionSummary() + resolve({ summaries, totalCount: summaries.length }) }, FakerHelper.loadingTimout()) }) } diff --git a/tests/component/dataset/domain/models/DatasetVersionsSummariesMother.ts b/tests/component/dataset/domain/models/DatasetVersionsSummariesMother.ts index 3c6dc38b8..978a05b1d 100644 --- a/tests/component/dataset/domain/models/DatasetVersionsSummariesMother.ts +++ b/tests/component/dataset/domain/models/DatasetVersionsSummariesMother.ts @@ -1,11 +1,12 @@ import { DatasetVersionSummaryInfo, DatasetVersionSummaryStringValues, + DatasetVersionSummarySubset, Deaccessioned } from '@/dataset/domain/models/DatasetVersionSummaryInfo' export class DatasetVersionsSummariesMother { - static create(): DatasetVersionSummaryInfo[] { + static create(): DatasetVersionSummarySubset { const versionSummaryInfo: DatasetVersionSummaryInfo[] = [ { id: 11, @@ -103,10 +104,13 @@ export class DatasetVersionsSummariesMother { publishedOn: '2025-03-11' } ] - return versionSummaryInfo + return { + summaries: versionSummaryInfo, + totalCount: versionSummaryInfo.length + } } - static createDeaccessioned(): DatasetVersionSummaryInfo[] { + static createDeaccessioned(): DatasetVersionSummarySubset { const deaccessioned: Deaccessioned = { reason: 'deaccessioned test' } @@ -160,6 +164,9 @@ export class DatasetVersionsSummariesMother { publishedOn: '2025-03-11' } ] - return versionSummaryInfo + return { + summaries: versionSummaryInfo, + totalCount: versionSummaryInfo.length + } } } diff --git a/tests/component/sections/dataset/Dataset.spec.tsx b/tests/component/sections/dataset/Dataset.spec.tsx index 2a37cb2ca..b9bf485fc 100644 --- a/tests/component/sections/dataset/Dataset.spec.tsx +++ b/tests/component/sections/dataset/Dataset.spec.tsx @@ -648,7 +648,9 @@ describe('Dataset', () => { }) it('renders the Dataset Version tab', () => { - datasetRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaryInfo) + datasetRepository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: versionSummaryInfo, totalCount: versionSummaryInfo.length }) mountWithDataset( { summary: {} }) ] + const versionSummariesSubset = { + summaries: versionSummaries, + totalCount: versionSummaries.length + } beforeEach(() => { - repository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaries) + repository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummariesSubset) }) it('renders the DeaccessionDatasetButton if the user has publish dataset permissions and the dataset is released', () => { @@ -118,7 +122,9 @@ describe('DeaccessionDatasetButton', () => { }) ] - repository.getDatasetVersionsSummaries = cy.stub().resolves(singleVersionList) + repository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: singleVersionList, totalCount: singleVersionList.length }) const dataset = DatasetMother.create({ permissions: DatasetPermissionsMother.createWithPublishingDatasetAllowed(), @@ -156,7 +162,9 @@ describe('DeaccessionDatasetButton', () => { summary: {} } ] - repository.getDatasetVersionsSummaries = cy.stub().resolves(singleVersionList) + repository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: singleVersionList, totalCount: singleVersionList.length }) const dataset = DatasetMother.create({ permissions: DatasetPermissionsMother.createWithPublishingDatasetAllowed(), @@ -249,9 +257,10 @@ describe('DeaccessionDatasetButton', () => { publishedOn: '2021-01-02', id: 2 }) - repository.getDatasetVersionsSummaries = cy - .stub() - .resolves([versionSummary1, versionSummary2]) + repository.getDatasetVersionsSummaries = cy.stub().resolves({ + summaries: [versionSummary1, versionSummary2], + totalCount: 2 + }) repository.deaccession = cy.stub().resolves() const dataset = DatasetMother.create({ permissions: DatasetPermissionsMother.createWithPublishingDatasetAllowed(), @@ -300,7 +309,9 @@ describe('DeaccessionDatasetButton', () => { summary: {} } ] - repository.getDatasetVersionsSummaries = cy.stub().resolves(versionsSummaries) + repository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: versionsSummaries, totalCount: versionsSummaries.length }) const dataset = DatasetMother.create({ permissions: DatasetPermissionsMother.createWithPublishingDatasetAllowed(), version: DatasetVersionMother.createReleased() @@ -339,7 +350,9 @@ describe('DeaccessionDatasetButton', () => { } ] - repository.getDatasetVersionsSummaries = cy.stub().resolves(versionsSummaries) + repository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: versionsSummaries, totalCount: versionsSummaries.length }) const dataset = DatasetMother.create({ permissions: DatasetPermissionsMother.createWithPublishingDatasetAllowed(), diff --git a/tests/component/sections/dataset/dataset-versions/DatasetVersions.spec.tsx b/tests/component/sections/dataset/dataset-versions/DatasetVersions.spec.tsx index ece0e1b2a..32002ba2f 100644 --- a/tests/component/sections/dataset/dataset-versions/DatasetVersions.spec.tsx +++ b/tests/component/sections/dataset/dataset-versions/DatasetVersions.spec.tsx @@ -1,5 +1,8 @@ import { DatasetVersions } from '@/sections/dataset/dataset-versions/DatasetVersions' -import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo' +import { + DatasetVersionSummaryInfo, + DatasetVersionSummarySubset +} from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' import { DatasetVersionDiff } from '@/dataset/domain/models/DatasetVersionDiff' import { DatasetVersionState } from '@/dataset/domain/models/Dataset' @@ -8,7 +11,7 @@ import { DatasetVersionDiffMother } from '../../../dataset/domain/models/Dataset const datasetsRepository: DatasetRepository = {} as DatasetRepository -const versionSummaryInfo: DatasetVersionSummaryInfo[] = DatasetVersionsSummariesMother.create() +const versionSummariesSubset = DatasetVersionsSummariesMother.create() const versionSummaryInfoDraft: DatasetVersionSummaryInfo[] = [ { @@ -39,7 +42,10 @@ const datasetVersionDiff: DatasetVersionDiff = DatasetVersionDiffMother.create() describe('DatasetVersions', () => { it('should render the dataset versions table without view differences button and checkbox', () => { - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaryInfoDraft) + datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves({ + summaries: versionSummaryInfoDraft, + totalCount: versionSummaryInfoDraft.length + }) cy.findByTestId('dataset-versions-table').should('exist') cy.contains('th', 'Dataset Version').should('exist') @@ -64,7 +70,7 @@ describe('DatasetVersions', () => { isInView /> ) - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaryInfo) + datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummariesSubset) datasetsRepository.getVersionDiff = cy.stub().resolves(datasetVersionDiff) }) @@ -81,7 +87,7 @@ describe('DatasetVersions', () => { cy.findByRole('button', { name: 'View Differences' }).should('exist') - versionSummaryInfo.forEach((version) => { + versionSummariesSubset.summaries.forEach((version) => { cy.contains('td', version.versionNumber).should('exist') cy.contains('td', version.contributors).should('exist') if (version.publishedOn) { @@ -102,7 +108,7 @@ describe('DatasetVersions', () => { }) it('should render the dataset versions table without view differences button if less than 2 versions being selected', () => { - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaryInfo) + datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummariesSubset) cy.findByTestId('dataset-versions-table').should('exist') cy.contains('th', 'Dataset Version').should('exist') @@ -121,14 +127,14 @@ describe('DatasetVersions', () => { }) it('should not show view detail buttons if there is only one version', () => { - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaryInfo) + datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummariesSubset) cy.findByTestId('dataset-versions-table').should('exist') cy.get('tr').eq(1).find('td').eq(2).findByText('View Details').should('exist').click() }) it('should open dataset versions detail modal', () => { - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaryInfo) + datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummariesSubset) cy.findByTestId('dataset-versions-table').should('exist') cy.get('tr').eq(1).find('td').eq(2).findByText('View Details').should('exist').click() @@ -136,7 +142,7 @@ describe('DatasetVersions', () => { }) it('should close dataset versions detail modal', () => { - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummaryInfo) + datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(versionSummariesSubset) cy.findByTestId('dataset-versions-table').should('exist') cy.get('tr').eq(1).find('td').eq(2).findByText('View Details').should('exist').click() @@ -159,7 +165,9 @@ describe('DatasetVersions', () => { }) it('should render loading skeleton if the dataset version is loading', () => { - datasetsRepository.getDatasetVersionsSummaries = cy.stub().returns(new Promise(() => {})) + datasetsRepository.getDatasetVersionsSummaries = cy + .stub() + .returns(new Promise(() => {})) cy.customMount( { { id: 2, versionNumber: '2.0', contributors: '' }, { id: 3, versionNumber: '3.0', contributors: '' } ] - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(ascendingVersions) + datasetsRepository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: ascendingVersions, totalCount: ascendingVersions.length }) const diffStub = (datasetsRepository.getVersionDiff = cy .stub() .callsFake((pid: string, oldV: string, newV: string) => @@ -300,7 +310,9 @@ describe('DatasetVersions', () => { { id: 4, versionNumber: '4.0', contributors: '' }, { id: 3, versionNumber: '3.0', contributors: '' } ] - datasetsRepository.getDatasetVersionsSummaries = cy.stub().resolves(descendingVersions) + datasetsRepository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: descendingVersions, totalCount: descendingVersions.length }) const diffStub = (datasetsRepository.getVersionDiff = cy .stub() .callsFake((pid: string, oldV: string, newV: string) => diff --git a/tests/component/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.spec.tsx b/tests/component/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.spec.tsx index 7fc7c7780..7cca720ea 100644 --- a/tests/component/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.spec.tsx +++ b/tests/component/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.spec.tsx @@ -1,18 +1,19 @@ import { act, renderHook } from '@testing-library/react' import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' -import { DatasetVersionSummary } from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { ReadError } from '@iqss/dataverse-client-javascript' import { DatasetVersionsSummariesMother } from '@tests/component/dataset/domain/models/DatasetVersionsSummariesMother' import { useGetDatasetVersionsSummaries } from '@/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries' const datasetRepository: DatasetRepository = {} as DatasetRepository -const datasetVersionsSummariesMock: DatasetVersionSummary[] = - DatasetVersionsSummariesMother.create() as unknown as DatasetVersionSummary[] +const datasetVersionsSummariesSubsetMock = DatasetVersionsSummariesMother.create() +const datasetVersionsSummariesMock = datasetVersionsSummariesSubsetMock.summaries describe('useGetDatasetVersionsSummaries', () => { it('should return dataset version summaries correctly', async () => { - datasetRepository.getDatasetVersionsSummaries = cy.stub().resolves(datasetVersionsSummariesMock) + datasetRepository.getDatasetVersionsSummaries = cy + .stub() + .resolves(datasetVersionsSummariesSubsetMock) const { result } = renderHook(() => useGetDatasetVersionsSummaries({ datasetRepository, @@ -78,7 +79,9 @@ describe('useGetDatasetVersionsSummaries', () => { }) it('should fetch summaries when fetchSummaries is called', () => { - datasetRepository.getDatasetVersionsSummaries = cy.stub().resolves(datasetVersionsSummariesMock) + datasetRepository.getDatasetVersionsSummaries = cy + .stub() + .resolves(datasetVersionsSummariesSubsetMock) const { result } = renderHook(() => useGetDatasetVersionsSummaries({ @@ -108,7 +111,9 @@ describe('useGetDatasetVersionsSummaries', () => { }) it('should not fetch summaries if autoFetch is false', async () => { - datasetRepository.getDatasetVersionsSummaries = cy.stub().resolves(datasetVersionsSummariesMock) + datasetRepository.getDatasetVersionsSummaries = cy + .stub() + .resolves(datasetVersionsSummariesSubsetMock) const { result } = renderHook(() => useGetDatasetVersionsSummaries({ diff --git a/tests/component/sections/edit-dataset-metadata/EditDatasetMetadata.spec.tsx b/tests/component/sections/edit-dataset-metadata/EditDatasetMetadata.spec.tsx index 348aa53a6..eab26285c 100644 --- a/tests/component/sections/edit-dataset-metadata/EditDatasetMetadata.spec.tsx +++ b/tests/component/sections/edit-dataset-metadata/EditDatasetMetadata.spec.tsx @@ -27,7 +27,9 @@ describe('EditDatasetMetadata', () => { .stub() .resolves(metadataBlocksInfoOnCreateMode) datasetRepository.updateMetadata = cy.stub().resolves(undefined) - datasetRepository.getDatasetVersionsSummaries = cy.stub().resolves(undefined) + datasetRepository.getDatasetVersionsSummaries = cy + .stub() + .resolves({ summaries: [], totalCount: 0 }) cy.customMount( diff --git a/tests/component/sections/file/file-version/FileVersions.spec.tsx b/tests/component/sections/file/file-version/FileVersions.spec.tsx index e5a80cd82..3284ced37 100644 --- a/tests/component/sections/file/file-version/FileVersions.spec.tsx +++ b/tests/component/sections/file/file-version/FileVersions.spec.tsx @@ -5,11 +5,15 @@ import { DatasetVersionState } from '@iqss/dataverse-client-javascript' import { QueryParamKey, Route } from '@/sections/Route.enum' const fileVersionSummaries = FileMother.createFileVersionSummary() +const fileVersionSummariesSubset = { + summaries: fileVersionSummaries, + totalCount: fileVersionSummaries.length +} const fileRepository: FileRepository = {} as FileRepository describe('FileVersions', () => { it('renders version rows and metadata correctly', () => { - fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummaries) + fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummariesSubset) cy.customMount( { versionState: DatasetVersionState.DEACCESSIONED } ] - fileRepository.getFileVersionSummaries = cy.stub().resolves(deaccessionedFile) + fileRepository.getFileVersionSummaries = cy + .stub() + .resolves({ summaries: deaccessionedFile, totalCount: deaccessionedFile.length }) cy.customMount( { versionState: DatasetVersionState.DEACCESSIONED } ] - fileRepository.getFileVersionSummaries = cy.stub().resolves(deaccessionedFile) + fileRepository.getFileVersionSummaries = cy + .stub() + .resolves({ summaries: deaccessionedFile, totalCount: deaccessionedFile.length }) cy.customMount( { versionState: DatasetVersionState.DRAFT } ] - fileRepository.getFileVersionSummaries = cy.stub().resolves(draftFile) + fileRepository.getFileVersionSummaries = cy + .stub() + .resolves({ summaries: draftFile, totalCount: draftFile.length }) cy.customMount( { it('the version number should be disable and bold if it is the current version', () => { const currentFile = [{ ...fileVersionSummaries[0], datasetVersion: '2.0' }] - fileRepository.getFileVersionSummaries = cy.stub().resolves(currentFile) + fileRepository.getFileVersionSummaries = cy + .stub() + .resolves({ summaries: currentFile, totalCount: currentFile.length }) cy.customMount( { it('should return file version summaries correctly', async () => { - fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummaries) + fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummariesSubset) const { result } = renderHook(() => useGetFileVersionsSummaries({ fileRepository, @@ -75,7 +79,7 @@ describe('useGetFileVersionsSummaries', () => { }) it('should not fetch data if autoFetch is false', async () => { - fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummaries) + fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummariesSubset) const { result } = renderHook(() => useGetFileVersionsSummaries({ fileRepository, @@ -100,7 +104,7 @@ describe('useGetFileVersionsSummaries', () => { }) it('should fetch data when refetch is called', () => { - fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummaries) + fileRepository.getFileVersionSummaries = cy.stub().resolves(fileVersionSummariesSubset) const { result } = renderHook(() => useGetFileVersionsSummaries({ fileRepository, From 2de30b948b93ad7b053fe5f9da64f96c048ebacd Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 31 Oct 2025 17:24:40 -0400 Subject: [PATCH 2/9] chore: package change to alpha --- CHANGELOG.md | 2 ++ package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b708bdf7..f2e07f411 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Changed +- BREAKING CHANGE: add pagination support to the Dataset and File Version Summaries use cases by introducing optional limit and offset query parameters. #885 + - Use of the new `sourceLastUpdateTime` query parameter from update dataset and file metadata endpoints to support optimistic concurrency control during editing operations. See [Edit Dataset Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#edit-dataset-metadata) and [Updating File Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#updating-file-metadata) guides for more details. - Changed the way we were handling DATE type metadata field validation to better match the backend validation and give users better error messages. For example, for an input like “foo AD”, we now show “Production Date is not a valid date. The AD year must be numeric.“. For an input like “99999 AD”, we now show “Production Date is not a valid date. The AD year cant be higher than 9999.“. For an input like “[-9999?], we now show “Production Date is not a valid date. The year in brackets cannot be negative.“, etc. diff --git a/package-lock.json b/package-lock.json index 36dc68d12..e9852d704 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.1.0-pr395.061ad8e", + "@iqss/dataverse-client-javascript": "2.0.0-alpha.79", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", @@ -1954,9 +1954,9 @@ }, "node_modules/@iqss/dataverse-client-javascript": { "name": "@IQSS/dataverse-client-javascript", - "version": "2.1.0-pr395.061ad8e", - "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.1.0-pr395.061ad8e/7572037bdd5d62b4672421f948ce08dffe2ff2ef", - "integrity": "sha512-wgQT4y5QSrzVIylI5NL9xiak6VjJd8f5haTydsLOy6qZy50tZDMscTi39akdSg36zUOKh/OTQ/BFPYHIysz+dw==", + "version": "2.0.0-alpha.79", + "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-alpha.79/4128665172f9569fa40f60ca1c1d205f7fe8a401", + "integrity": "sha512-NfjzwOz06QJzSYAQ2eZ20tRINO49LrBaWQ9JTQNK0cLPTRdmYzUJgB2zzGzH/c/bi7LfGgfkPqO+6MH9HPFxpg==", "license": "MIT", "dependencies": { "@types/node": "^18.15.11", diff --git a/package.json b/package.json index 7622037c7..d86c6ecc5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.1.0-pr395.061ad8e", + "@iqss/dataverse-client-javascript": "2.0.0-alpha.79", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", From a2cd99d43c2b0c2130030f139b1553ed6f060e03 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 5 Nov 2025 21:00:11 -0500 Subject: [PATCH 3/9] fix: add pagination object to summeries --- .../domain/useCases/getMyDataCollectionItems.ts | 7 +++---- src/dataset/domain/models/DatasetVersionPaginationInfo.ts | 8 ++++++++ src/dataset/domain/repositories/DatasetRepository.ts | 4 ++-- .../domain/useCases/getDatasetVersionsSummaries.ts | 6 +++--- .../repositories/DatasetJSDataverseRepository.ts | 6 +++--- src/files/domain/models/FileVersionPaginationInfo.ts | 7 +++++++ src/files/domain/repositories/FileRepository.ts | 4 ++-- src/files/domain/useCases/getFileVersionSummaries.ts | 6 +++--- src/files/infrastructure/FileJSDataverseRepository.ts | 6 +++--- .../dataset-versions/useGetDatasetVersionsSummaries.ts | 8 ++++---- .../file/file-version/useGetFileVersionsSummaries.ts | 8 ++++---- src/stories/dataset/DatasetLoadingMockRepository.ts | 4 ++-- src/stories/dataset/DatasetMockRepository.ts | 4 ++-- src/stories/file/FileMockRepository.ts | 4 ++-- 14 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 src/dataset/domain/models/DatasetVersionPaginationInfo.ts create mode 100644 src/files/domain/models/FileVersionPaginationInfo.ts diff --git a/src/collection/domain/useCases/getMyDataCollectionItems.ts b/src/collection/domain/useCases/getMyDataCollectionItems.ts index 43ee3f3c2..b6d53fcdc 100644 --- a/src/collection/domain/useCases/getMyDataCollectionItems.ts +++ b/src/collection/domain/useCases/getMyDataCollectionItems.ts @@ -2,14 +2,14 @@ import { CollectionRepository } from '../repositories/CollectionRepository' import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset' import { PublicationStatus } from '../../../shared/core/domain/models/PublicationStatus' import { CollectionItemType } from '@/collection/domain/models/CollectionItemType' +import { MyDataCollectionItemsPaginationInfo } from '../models/MyDataCollectionItemsPaginationInfo' export async function getMyDataCollectionItems( collectionRepository: CollectionRepository, roleIds: number[], collectionItemTypes: CollectionItemType[], publicationStatuses: PublicationStatus[], - limit?: number, - selectedPage?: number, + paginationInfo?: MyDataCollectionItemsPaginationInfo, searchText?: string, otherUserName?: string ): Promise { @@ -18,8 +18,7 @@ export async function getMyDataCollectionItems( roleIds, collectionItemTypes, publicationStatuses, - limit, - selectedPage, + paginationInfo, searchText, otherUserName ) diff --git a/src/dataset/domain/models/DatasetVersionPaginationInfo.ts b/src/dataset/domain/models/DatasetVersionPaginationInfo.ts new file mode 100644 index 000000000..10277dfb8 --- /dev/null +++ b/src/dataset/domain/models/DatasetVersionPaginationInfo.ts @@ -0,0 +1,8 @@ +import { PaginationInfo } from '../../../shared/pagination/domain/models/PaginationInfo' + +export class DatasetVersionPaginationInfo extends PaginationInfo { + constructor(page = 1, pageSize = 10, totalItems = 0, itemName = 'Version') { + super(page, pageSize, totalItems, itemName) + } +} + diff --git a/src/dataset/domain/repositories/DatasetRepository.ts b/src/dataset/domain/repositories/DatasetRepository.ts index 3d7a91cbb..280fa8cce 100644 --- a/src/dataset/domain/repositories/DatasetRepository.ts +++ b/src/dataset/domain/repositories/DatasetRepository.ts @@ -10,6 +10,7 @@ import { DatasetDownloadCount } from '../models/DatasetDownloadCount' import { FormattedCitation, CitationFormat } from '../models/DatasetCitation' import { DatasetTemplate } from '../models/DatasetTemplate' import { CollectionSummary } from '@/collection/domain/models/CollectionSummary' +import { DatasetVersionPaginationInfo } from '../models/DatasetVersionPaginationInfo' export interface DatasetRepository { getByPersistentId: ( @@ -46,8 +47,7 @@ export interface DatasetRepository { publish(persistentId: string, versionUpdateType: VersionUpdateType): Promise getDatasetVersionsSummaries: ( datasetId: number | string, - limit?: number, - offset?: number + paginationInfo?: DatasetVersionPaginationInfo ) => Promise getDownloadCount: ( datasetId: string | number, diff --git a/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts b/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts index 54023c382..ae972d66d 100644 --- a/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts +++ b/src/dataset/domain/useCases/getDatasetVersionsSummaries.ts @@ -1,13 +1,13 @@ import { DatasetRepository } from '../repositories/DatasetRepository' import { DatasetVersionSummarySubset } from '../models/DatasetVersionSummaryInfo' +import { DatasetVersionPaginationInfo } from '../models/DatasetVersionPaginationInfo' export function getDatasetVersionsSummaries( datasetRepository: DatasetRepository, datasetId: number | string, - limit?: number, - offset?: number + paginationInfo?: DatasetVersionPaginationInfo ): Promise { - return datasetRepository.getDatasetVersionsSummaries(datasetId, limit, offset).catch((error) => { + return datasetRepository.getDatasetVersionsSummaries(datasetId, paginationInfo).catch((error) => { throw error }) } diff --git a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts index 246aef64d..0641aa4a1 100644 --- a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts +++ b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts @@ -48,6 +48,7 @@ import { DatasetsWithCount } from '../../domain/models/DatasetsWithCount' import { VersionUpdateType } from '../../domain/models/VersionUpdateType' import { DatasetVersionSummarySubset } from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { DatasetDownloadCount } from '@/dataset/domain/models/DatasetDownloadCount' +import { DatasetVersionPaginationInfo } from '@/dataset/domain/models/DatasetVersionPaginationInfo' import { FormattedCitation, CitationFormat } from '@/dataset/domain/models/DatasetCitation' import { axiosInstance } from '@/axiosInstance' import { DATAVERSE_BACKEND_URL } from '../../../config' @@ -375,11 +376,10 @@ export class DatasetJSDataverseRepository implements DatasetRepository { } getDatasetVersionsSummaries( datasetId: number | string, - limit?: number, - offset?: number + paginationInfo?: DatasetVersionPaginationInfo ): Promise { return getDatasetVersionsSummaries - .execute(datasetId, limit, offset) + .execute(datasetId, paginationInfo?.pageSize, paginationInfo?.offset) .catch((error: ReadError) => { throw error }) diff --git a/src/files/domain/models/FileVersionPaginationInfo.ts b/src/files/domain/models/FileVersionPaginationInfo.ts new file mode 100644 index 000000000..a06cb27ce --- /dev/null +++ b/src/files/domain/models/FileVersionPaginationInfo.ts @@ -0,0 +1,7 @@ +import { PaginationInfo } from '../../../shared/pagination/domain/models/PaginationInfo' + +export class FileVersionPaginationInfo extends PaginationInfo { + constructor(page = 1, pageSize = 10, totalItems = 0, itemName = 'Version') { + super(page, pageSize, totalItems, itemName) + } +} diff --git a/src/files/domain/repositories/FileRepository.ts b/src/files/domain/repositories/FileRepository.ts index 4ad963b35..e5761c21e 100644 --- a/src/files/domain/repositories/FileRepository.ts +++ b/src/files/domain/repositories/FileRepository.ts @@ -12,6 +12,7 @@ import { FixityAlgorithm } from '../models/FixityAlgorithm' import { FileMetadataDTO } from '@/files/domain/useCases/DTOs/FileMetadataDTO' import { RestrictFileDTO } from '../useCases/restrictFileDTO' import { FileVersionSummarySubset } from '../models/FileVersionSummaryInfo' +import { FileVersionPaginationInfo } from '../models/FileVersionPaginationInfo' export interface FileRepository { getAllByDatasetPersistentId: ( @@ -34,8 +35,7 @@ export interface FileRepository { ) => Promise getFileVersionSummaries: ( fileId: number | string, - limit?: number, - offset?: number + paginationInfo?: FileVersionPaginationInfo ) => Promise getById: (id: number, datasetVersionNumber?: string) => Promise getMultipleFileDownloadUrl: (ids: number[], downloadMode: FileDownloadMode) => string diff --git a/src/files/domain/useCases/getFileVersionSummaries.ts b/src/files/domain/useCases/getFileVersionSummaries.ts index ab6fde785..2394190d5 100644 --- a/src/files/domain/useCases/getFileVersionSummaries.ts +++ b/src/files/domain/useCases/getFileVersionSummaries.ts @@ -1,11 +1,11 @@ import { FileRepository } from '../repositories/FileRepository' import { FileVersionSummarySubset } from '../models/FileVersionSummaryInfo' +import { FileVersionPaginationInfo } from '../models/FileVersionPaginationInfo' export function getFileVersionSummaries( fileRepository: FileRepository, fileId: number | string, - limit?: number, - offset?: number + paginationInfo?: FileVersionPaginationInfo ): Promise { - return fileRepository.getFileVersionSummaries(fileId, limit, offset) + return fileRepository.getFileVersionSummaries(fileId, paginationInfo) } diff --git a/src/files/infrastructure/FileJSDataverseRepository.ts b/src/files/infrastructure/FileJSDataverseRepository.ts index ebfb92247..08ec8fb21 100644 --- a/src/files/infrastructure/FileJSDataverseRepository.ts +++ b/src/files/infrastructure/FileJSDataverseRepository.ts @@ -46,6 +46,7 @@ import { RestrictFileDTO } from '../domain/useCases/restrictFileDTO' import { FileMetadataDTO } from '@/files/domain/useCases/DTOs/FileMetadataDTO' import { JSDataverseReadErrorHandler } from '@/shared/helpers/JSDataverseReadErrorHandler' import { FileVersionSummarySubset } from '../domain/models/FileVersionSummaryInfo' +import { FileVersionPaginationInfo } from '../domain/models/FileVersionPaginationInfo' const includeDeaccessioned = true @@ -251,10 +252,9 @@ export class FileJSDataverseRepository implements FileRepository { } getFileVersionSummaries( fileId: number | string, - limit?: number, - offset?: number + paginationInfo?: FileVersionPaginationInfo ): Promise { - return getFileVersionSummaries.execute(fileId, limit, offset) + return getFileVersionSummaries.execute(fileId, paginationInfo?.pageSize, paginationInfo?.offset) } getById(id: number, datasetVersionNumber?: string): Promise { diff --git a/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts b/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts index 49d90c05b..07e284554 100644 --- a/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts +++ b/src/sections/dataset/dataset-versions/useGetDatasetVersionsSummaries.ts @@ -2,12 +2,13 @@ import { useCallback, useEffect, useState } from 'react' import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo' import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' import { getDatasetVersionsSummaries } from '@/dataset/domain/useCases/getDatasetVersionsSummaries' +import { DatasetVersionPaginationInfo } from '@/dataset/domain/models/DatasetVersionPaginationInfo' interface UseGetDatasetVersionsSummaries { datasetVersionSummaries: DatasetVersionSummaryInfo[] | undefined error: string | null isLoading: boolean - fetchSummaries: (limit?: number, offset?: number) => Promise + fetchSummaries: (paginationInfo?: DatasetVersionPaginationInfo) => Promise } interface Props { @@ -26,7 +27,7 @@ export const useGetDatasetVersionsSummaries = ({ const [error, setError] = useState(null) const fetchSummaries = useCallback( - async (limit?: number, offset?: number) => { + async (paginationInfo?: DatasetVersionPaginationInfo) => { setIsLoading(true) setError(null) @@ -34,8 +35,7 @@ export const useGetDatasetVersionsSummaries = ({ const versionSummaries = await getDatasetVersionsSummaries( datasetRepository, persistentId, - limit, - offset + paginationInfo ) setSummaries(versionSummaries.summaries) } catch (err) { diff --git a/src/sections/file/file-version/useGetFileVersionsSummaries.ts b/src/sections/file/file-version/useGetFileVersionsSummaries.ts index f6c38ffd2..edc7679ce 100644 --- a/src/sections/file/file-version/useGetFileVersionsSummaries.ts +++ b/src/sections/file/file-version/useGetFileVersionsSummaries.ts @@ -2,12 +2,13 @@ import { useCallback, useEffect, useState } from 'react' import { FileVersionSummaryInfo } from '@/files/domain/models/FileVersionSummaryInfo' import { FileRepository } from '@/files/domain/repositories/FileRepository' import { getFileVersionSummaries } from '@/files/domain/useCases/getFileVersionSummaries' +import { FileVersionPaginationInfo } from '@/files/domain/models/FileVersionPaginationInfo' interface UseGetFileVersionsSummaries { fileVersionSummaries: FileVersionSummaryInfo[] | undefined error: string | null isLoading: boolean - fetchSummaries: (limit?: number, offset?: number) => Promise + fetchSummaries: (paginationInfo?: FileVersionPaginationInfo) => Promise } interface Props { @@ -26,15 +27,14 @@ export const useGetFileVersionsSummaries = ({ const [error, setError] = useState(null) const fetchSummaries = useCallback( - async (limit?: number, offset?: number) => { + async (paginationInfo?: FileVersionPaginationInfo) => { setIsLoading(true) setError(null) try { const versionSummaries = await getFileVersionSummaries( fileRepository, fileId, - limit, - offset + paginationInfo ) setSummaries(versionSummaries.summaries) } catch (err) { diff --git a/src/stories/dataset/DatasetLoadingMockRepository.ts b/src/stories/dataset/DatasetLoadingMockRepository.ts index ecd99fae7..91c49052f 100644 --- a/src/stories/dataset/DatasetLoadingMockRepository.ts +++ b/src/stories/dataset/DatasetLoadingMockRepository.ts @@ -2,6 +2,7 @@ import { DatasetMockRepository } from './DatasetMockRepository' import { DatasetPaginationInfo } from '../../dataset/domain/models/DatasetPaginationInfo' import { DatasetsWithCount } from '../../dataset/domain/models/DatasetsWithCount' import { DatasetVersionSummarySubset } from '@/dataset/domain/models/DatasetVersionSummaryInfo' +import { DatasetVersionPaginationInfo } from '@/dataset/domain/models/DatasetVersionPaginationInfo' export class DatasetLoadingMockRepository extends DatasetMockRepository { getDatasetsWithCount: ( @@ -16,8 +17,7 @@ export class DatasetLoadingMockRepository extends DatasetMockRepository { getDatasetVersionsSummaries( _datasetId: number | string, - _limit?: number, - _offset?: number + _paginationInfo?: DatasetVersionPaginationInfo ): Promise { return new Promise(() => {}) } diff --git a/src/stories/dataset/DatasetMockRepository.ts b/src/stories/dataset/DatasetMockRepository.ts index d2457bd79..9a2567bf1 100644 --- a/src/stories/dataset/DatasetMockRepository.ts +++ b/src/stories/dataset/DatasetMockRepository.ts @@ -19,6 +19,7 @@ import { DatasetTemplate } from '@/dataset/domain/models/DatasetTemplate' import { DatasetTemplateMother } from '@tests/component/dataset/domain/models/DatasetTemplateMother' import { CollectionSummary } from '@/collection/domain/models/CollectionSummary' import { CollectionSummaryMother } from '@tests/component/collection/domain/models/CollectionSummaryMother' +import { DatasetVersionPaginationInfo } from '@/dataset/domain/models/DatasetVersionPaginationInfo' export class DatasetMockRepository implements DatasetRepository { getAllWithCount: ( @@ -100,8 +101,7 @@ export class DatasetMockRepository implements DatasetRepository { getDatasetVersionsSummaries( _datasetId: number | string, - _limit?: number, - _offset?: number + _paginationInfo?: DatasetVersionPaginationInfo ): Promise { return new Promise((resolve) => { setTimeout(() => { diff --git a/src/stories/file/FileMockRepository.ts b/src/stories/file/FileMockRepository.ts index 208281fa7..e4987b47a 100644 --- a/src/stories/file/FileMockRepository.ts +++ b/src/stories/file/FileMockRepository.ts @@ -18,6 +18,7 @@ import { FixityAlgorithm } from '@/files/domain/models/FixityAlgorithm' import { FileMetadataDTO } from '@/files/domain/useCases/DTOs/FileMetadataDTO' import { RestrictFileDTO } from '@/files/domain/useCases/restrictFileDTO' import { FileVersionSummarySubset } from '@/files/domain/models/FileVersionSummaryInfo' +import { FileVersionPaginationInfo } from '@/files/domain/models/FileVersionPaginationInfo' export class FileMockRepository implements FileRepository { constructor(public readonly fileMock?: File) {} @@ -160,8 +161,7 @@ export class FileMockRepository implements FileRepository { getFileVersionSummaries( _id: number | string, - _limit?: number, - _offset?: number + _paginationInfo?: FileVersionPaginationInfo ): Promise { return new Promise((resolve) => { setTimeout(() => { From 67981f51f1920bfd12e523123fed429470acc886 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 5 Nov 2025 22:10:31 -0500 Subject: [PATCH 4/9] fix: changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2e07f411..d628d17e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Changed -- BREAKING CHANGE: add pagination support to the Dataset and File Version Summaries use cases by introducing optional limit and offset query parameters. #885 +- Add pagination support to the Dataset Version Summaries and File Version Summaries use cases by introducing optional pagination object. #885 - Use of the new `sourceLastUpdateTime` query parameter from update dataset and file metadata endpoints to support optimistic concurrency control during editing operations. See [Edit Dataset Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#edit-dataset-metadata) and [Updating File Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#updating-file-metadata) guides for more details. - Changed the way we were handling DATE type metadata field validation to better match the backend validation and give users better error messages. For example, for an input like “foo AD”, we now show “Production Date is not a valid date. The AD year must be numeric.“. For an input like “99999 AD”, we now show “Production Date is not a valid date. The AD year cant be higher than 9999.“. For an input like “[-9999?], we now show “Production Date is not a valid date. The year in brackets cannot be negative.“, etc. From 3990c4a2f726c38ee4a548d2ad9d9d73257433c9 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 5 Nov 2025 23:03:12 -0500 Subject: [PATCH 5/9] fix: add pagination object to getDataItemsPanel --- .../domain/models/MyDataCollectionItemsPaginationInfo.ts | 7 +++++++ .../domain/repositories/CollectionRepository.ts | 4 ++-- .../repositories/CollectionJSDataverseRepository.ts | 8 ++++---- .../my-data-section/useGetMyDataAccumulatedItems.tsx | 9 +++++++-- src/stories/collection/CollectionMockRepository.ts | 8 +++----- .../component/sections/account/MyDataItemsPanel.spec.tsx | 6 ++---- 6 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts diff --git a/src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts b/src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts new file mode 100644 index 000000000..d78b4311b --- /dev/null +++ b/src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts @@ -0,0 +1,7 @@ +import { PaginationInfo } from '../../../shared/pagination/domain/models/PaginationInfo' + +export class MyDataCollectionItemsPaginationInfo extends PaginationInfo { + constructor(page = 1, pageSize = 10, totalItems = 0, itemName = 'Item') { + super(page, pageSize, totalItems, itemName) + } +} diff --git a/src/collection/domain/repositories/CollectionRepository.ts b/src/collection/domain/repositories/CollectionRepository.ts index 587ce572a..84e44890f 100644 --- a/src/collection/domain/repositories/CollectionRepository.ts +++ b/src/collection/domain/repositories/CollectionRepository.ts @@ -13,6 +13,7 @@ import { PublicationStatus } from '@/shared/core/domain/models/PublicationStatus import { LinkingObjectType } from '../useCases/getCollectionsForLinking' import { CollectionSummary } from '../models/CollectionSummary' import { CollectionLinks } from '../models/CollectionLinks' +import { MyDataCollectionItemsPaginationInfo } from '../models/MyDataCollectionItemsPaginationInfo' export interface CollectionRepository { getById: (id?: string) => Promise @@ -31,8 +32,7 @@ export interface CollectionRepository { roleIds: number[], collectionItemTypes: CollectionItemType[], publicationStatuses: PublicationStatus[], - limit?: number, - selectedPage?: number, + paginationInfo?: MyDataCollectionItemsPaginationInfo, searchText?: string, otherUserName?: string ) => Promise diff --git a/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts b/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts index 36ef781ad..6f6ee68c3 100644 --- a/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts +++ b/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts @@ -34,6 +34,7 @@ import { PublicationStatus } from '@/shared/core/domain/models/PublicationStatus import { CollectionSummary } from '@/collection/domain/models/CollectionSummary' import { LinkingObjectType } from '@/collection/domain/useCases/getCollectionsForLinking' import { CollectionLinks } from '@/collection/domain/models/CollectionLinks' +import { MyDataCollectionItemsPaginationInfo } from '@/collection/domain/models/MyDataCollectionItemsPaginationInfo' export class CollectionJSDataverseRepository implements CollectionRepository { getById(id?: string): Promise { @@ -93,8 +94,7 @@ export class CollectionJSDataverseRepository implements CollectionRepository { roleIds: number[], collectionItemTypes: CollectionItemType[], publicationStatuses: PublicationStatus[], - limit?: number, - selectedPage?: number, + paginationInfo?: MyDataCollectionItemsPaginationInfo, searchText?: string, otherUserName?: string ): Promise { @@ -103,8 +103,8 @@ export class CollectionJSDataverseRepository implements CollectionRepository { roleIds, collectionItemTypes, publicationStatuses, - limit, - selectedPage, + paginationInfo?.pageSize, + paginationInfo?.page, searchText, otherUserName ) diff --git a/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx b/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx index b0f56ff31..f39d881a6 100644 --- a/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx +++ b/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx @@ -8,6 +8,7 @@ import { MyDataCollectionItemSubset, PublicationStatusCount } from '@/collection/domain/models/MyDataCollectionItemSubset' +import { MyDataCollectionItemsPaginationInfo } from '@/collection/domain/models/MyDataCollectionItemsPaginationInfo' export const NO_COLLECTION_ITEMS = 0 @@ -120,13 +121,17 @@ async function loadNextItems( searchCriteria: MyDataSearchCriteria ): Promise { const publicationStatuses = searchCriteria.publicationStatuses ?? [] + const myDataPaginationInfo = new MyDataCollectionItemsPaginationInfo( + paginationInfo.page, + paginationInfo.pageSize, + paginationInfo.totalItems + ) return await getMyDataCollectionItems( collectionRepository, searchCriteria.roleIds, searchCriteria.itemTypes, publicationStatuses, - paginationInfo.pageSize, - paginationInfo.page, + myDataPaginationInfo, searchCriteria.searchText, searchCriteria.otherUserName ) diff --git a/src/stories/collection/CollectionMockRepository.ts b/src/stories/collection/CollectionMockRepository.ts index 237b447af..c22bd9df9 100644 --- a/src/stories/collection/CollectionMockRepository.ts +++ b/src/stories/collection/CollectionMockRepository.ts @@ -19,6 +19,7 @@ import { CollectionSummary } from '@/collection/domain/models/CollectionSummary' import { LinkingObjectType } from '@/collection/domain/useCases/getCollectionsForLinking' import { CollectionSummaryMother } from '@tests/component/collection/domain/models/CollectionSummaryMother' import { CollectionLinks } from '@/collection/domain/models/CollectionLinks' +import { MyDataCollectionItemsPaginationInfo } from '@/collection/domain/models/MyDataCollectionItemsPaginationInfo' export class CollectionMockRepository implements CollectionRepository { getById(_id?: string): Promise { @@ -101,14 +102,11 @@ export class CollectionMockRepository implements CollectionRepository { _roleIds: number[], collectionItemTypes: CollectionItemType[], _publicationStatuses: string[], - limit?: number, - _selectedPage?: number, + paginationInfo?: MyDataCollectionItemsPaginationInfo, _searchText?: string, _otherUserName?: string ): Promise { - if (!limit) { - limit = 10 - } + const limit = paginationInfo?.pageSize ?? 10 const numberOfCollections = Math.floor(limit / 3) const numberOfDatasets = Math.floor(limit / 3) const numberOfFiles = limit - numberOfCollections - numberOfDatasets diff --git a/tests/component/sections/account/MyDataItemsPanel.spec.tsx b/tests/component/sections/account/MyDataItemsPanel.spec.tsx index 1e8285c3f..053eb6aae 100644 --- a/tests/component/sections/account/MyDataItemsPanel.spec.tsx +++ b/tests/component/sections/account/MyDataItemsPanel.spec.tsx @@ -159,8 +159,7 @@ describe('MyDataItemsPanel', () => { Cypress.sinon.match.any, Cypress.sinon.match.any, Cypress.sinon.match.any, - 10, - 1, + Cypress.sinon.match.has('pageSize', 10).and(Cypress.sinon.match.has('page', 1)), undefined, otherUsername ) @@ -185,8 +184,7 @@ describe('MyDataItemsPanel', () => { Cypress.sinon.match.any, Cypress.sinon.match.any, Cypress.sinon.match.any, - 10, - 1, + Cypress.sinon.match.has('pageSize', 10).and(Cypress.sinon.match.has('page', 1)), undefined, 'testUserName' ) From 82283ae247d9395307a92a873805aaaea349e530 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 5 Nov 2025 23:07:05 -0500 Subject: [PATCH 6/9] fix: lint error --- src/stories/dataset/DatasetErrorMockRepository.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stories/dataset/DatasetErrorMockRepository.ts b/src/stories/dataset/DatasetErrorMockRepository.ts index b4fbb7658..d5701eff3 100644 --- a/src/stories/dataset/DatasetErrorMockRepository.ts +++ b/src/stories/dataset/DatasetErrorMockRepository.ts @@ -12,6 +12,7 @@ import { DatasetDownloadCount } from '@/dataset/domain/models/DatasetDownloadCou import { CitationFormat, FormattedCitation } from '@/dataset/domain/models/DatasetCitation' import { DatasetTemplate } from '@/dataset/domain/models/DatasetTemplate' import { CollectionSummary } from '@/collection/domain/models/CollectionSummary' +import { DatasetVersionPaginationInfo } from '@/dataset/domain/models/DatasetVersionPaginationInfo' export class DatasetErrorMockRepository implements DatasetMockRepository { getAllWithCount: ( @@ -89,8 +90,7 @@ export class DatasetErrorMockRepository implements DatasetMockRepository { getDatasetVersionsSummaries( _datasetId: number | string, - _limit?: number, - _offset?: number + _paginationInfo?: DatasetVersionPaginationInfo ): Promise { return new Promise((_resolve, reject) => { setTimeout(() => { From 9e085bc840168e72853fff39d6621a34c2b57e4c Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 5 Nov 2025 23:11:14 -0500 Subject: [PATCH 7/9] fix: lint error --- src/dataset/domain/models/DatasetVersionPaginationInfo.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dataset/domain/models/DatasetVersionPaginationInfo.ts b/src/dataset/domain/models/DatasetVersionPaginationInfo.ts index 10277dfb8..c4cf8423f 100644 --- a/src/dataset/domain/models/DatasetVersionPaginationInfo.ts +++ b/src/dataset/domain/models/DatasetVersionPaginationInfo.ts @@ -5,4 +5,3 @@ export class DatasetVersionPaginationInfo extends PaginationInfo Date: Thu, 6 Nov 2025 02:41:46 -0500 Subject: [PATCH 8/9] fix: getMyDataCollectionItems, and update changelog --- CHANGELOG.md | 2 +- .../domain/models/MyDataCollectionItemsPaginationInfo.ts | 7 ------- .../domain/repositories/CollectionRepository.ts | 3 +-- .../domain/useCases/getMyDataCollectionItems.ts | 4 ++-- .../repositories/CollectionJSDataverseRepository.ts | 3 +-- .../my-data-section/useGetMyDataAccumulatedItems.tsx | 8 +------- src/stories/collection/CollectionMockRepository.ts | 3 +-- 7 files changed, 7 insertions(+), 23 deletions(-) delete mode 100644 src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index d628d17e8..db4e2c3b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Changed - Add pagination support to the Dataset Version Summaries and File Version Summaries use cases by introducing optional pagination object. #885 - +- Refactored pagination to use consistent `CollectionItemsPaginationInfo` object in getMyDataColletionItems, instead of individual limit/selectedPage parameters. - Use of the new `sourceLastUpdateTime` query parameter from update dataset and file metadata endpoints to support optimistic concurrency control during editing operations. See [Edit Dataset Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#edit-dataset-metadata) and [Updating File Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#updating-file-metadata) guides for more details. - Changed the way we were handling DATE type metadata field validation to better match the backend validation and give users better error messages. For example, for an input like “foo AD”, we now show “Production Date is not a valid date. The AD year must be numeric.“. For an input like “99999 AD”, we now show “Production Date is not a valid date. The AD year cant be higher than 9999.“. For an input like “[-9999?], we now show “Production Date is not a valid date. The year in brackets cannot be negative.“, etc. diff --git a/src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts b/src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts deleted file mode 100644 index d78b4311b..000000000 --- a/src/collection/domain/models/MyDataCollectionItemsPaginationInfo.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { PaginationInfo } from '../../../shared/pagination/domain/models/PaginationInfo' - -export class MyDataCollectionItemsPaginationInfo extends PaginationInfo { - constructor(page = 1, pageSize = 10, totalItems = 0, itemName = 'Item') { - super(page, pageSize, totalItems, itemName) - } -} diff --git a/src/collection/domain/repositories/CollectionRepository.ts b/src/collection/domain/repositories/CollectionRepository.ts index 84e44890f..fbd456e8c 100644 --- a/src/collection/domain/repositories/CollectionRepository.ts +++ b/src/collection/domain/repositories/CollectionRepository.ts @@ -13,7 +13,6 @@ import { PublicationStatus } from '@/shared/core/domain/models/PublicationStatus import { LinkingObjectType } from '../useCases/getCollectionsForLinking' import { CollectionSummary } from '../models/CollectionSummary' import { CollectionLinks } from '../models/CollectionLinks' -import { MyDataCollectionItemsPaginationInfo } from '../models/MyDataCollectionItemsPaginationInfo' export interface CollectionRepository { getById: (id?: string) => Promise @@ -32,7 +31,7 @@ export interface CollectionRepository { roleIds: number[], collectionItemTypes: CollectionItemType[], publicationStatuses: PublicationStatus[], - paginationInfo?: MyDataCollectionItemsPaginationInfo, + paginationInfo?: CollectionItemsPaginationInfo, searchText?: string, otherUserName?: string ) => Promise diff --git a/src/collection/domain/useCases/getMyDataCollectionItems.ts b/src/collection/domain/useCases/getMyDataCollectionItems.ts index b6d53fcdc..54eec62a0 100644 --- a/src/collection/domain/useCases/getMyDataCollectionItems.ts +++ b/src/collection/domain/useCases/getMyDataCollectionItems.ts @@ -2,14 +2,14 @@ import { CollectionRepository } from '../repositories/CollectionRepository' import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset' import { PublicationStatus } from '../../../shared/core/domain/models/PublicationStatus' import { CollectionItemType } from '@/collection/domain/models/CollectionItemType' -import { MyDataCollectionItemsPaginationInfo } from '../models/MyDataCollectionItemsPaginationInfo' +import { CollectionItemsPaginationInfo } from '../models/CollectionItemsPaginationInfo' export async function getMyDataCollectionItems( collectionRepository: CollectionRepository, roleIds: number[], collectionItemTypes: CollectionItemType[], publicationStatuses: PublicationStatus[], - paginationInfo?: MyDataCollectionItemsPaginationInfo, + paginationInfo?: CollectionItemsPaginationInfo, searchText?: string, otherUserName?: string ): Promise { diff --git a/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts b/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts index 6f6ee68c3..01b3cc6a5 100644 --- a/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts +++ b/src/collection/infrastructure/repositories/CollectionJSDataverseRepository.ts @@ -34,7 +34,6 @@ import { PublicationStatus } from '@/shared/core/domain/models/PublicationStatus import { CollectionSummary } from '@/collection/domain/models/CollectionSummary' import { LinkingObjectType } from '@/collection/domain/useCases/getCollectionsForLinking' import { CollectionLinks } from '@/collection/domain/models/CollectionLinks' -import { MyDataCollectionItemsPaginationInfo } from '@/collection/domain/models/MyDataCollectionItemsPaginationInfo' export class CollectionJSDataverseRepository implements CollectionRepository { getById(id?: string): Promise { @@ -94,7 +93,7 @@ export class CollectionJSDataverseRepository implements CollectionRepository { roleIds: number[], collectionItemTypes: CollectionItemType[], publicationStatuses: PublicationStatus[], - paginationInfo?: MyDataCollectionItemsPaginationInfo, + paginationInfo?: CollectionItemsPaginationInfo, searchText?: string, otherUserName?: string ): Promise { diff --git a/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx b/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx index f39d881a6..6c6356b0c 100644 --- a/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx +++ b/src/sections/account/my-data-section/useGetMyDataAccumulatedItems.tsx @@ -8,7 +8,6 @@ import { MyDataCollectionItemSubset, PublicationStatusCount } from '@/collection/domain/models/MyDataCollectionItemSubset' -import { MyDataCollectionItemsPaginationInfo } from '@/collection/domain/models/MyDataCollectionItemsPaginationInfo' export const NO_COLLECTION_ITEMS = 0 @@ -121,17 +120,12 @@ async function loadNextItems( searchCriteria: MyDataSearchCriteria ): Promise { const publicationStatuses = searchCriteria.publicationStatuses ?? [] - const myDataPaginationInfo = new MyDataCollectionItemsPaginationInfo( - paginationInfo.page, - paginationInfo.pageSize, - paginationInfo.totalItems - ) return await getMyDataCollectionItems( collectionRepository, searchCriteria.roleIds, searchCriteria.itemTypes, publicationStatuses, - myDataPaginationInfo, + paginationInfo, searchCriteria.searchText, searchCriteria.otherUserName ) diff --git a/src/stories/collection/CollectionMockRepository.ts b/src/stories/collection/CollectionMockRepository.ts index c22bd9df9..5406ff8ed 100644 --- a/src/stories/collection/CollectionMockRepository.ts +++ b/src/stories/collection/CollectionMockRepository.ts @@ -19,7 +19,6 @@ import { CollectionSummary } from '@/collection/domain/models/CollectionSummary' import { LinkingObjectType } from '@/collection/domain/useCases/getCollectionsForLinking' import { CollectionSummaryMother } from '@tests/component/collection/domain/models/CollectionSummaryMother' import { CollectionLinks } from '@/collection/domain/models/CollectionLinks' -import { MyDataCollectionItemsPaginationInfo } from '@/collection/domain/models/MyDataCollectionItemsPaginationInfo' export class CollectionMockRepository implements CollectionRepository { getById(_id?: string): Promise { @@ -102,7 +101,7 @@ export class CollectionMockRepository implements CollectionRepository { _roleIds: number[], collectionItemTypes: CollectionItemType[], _publicationStatuses: string[], - paginationInfo?: MyDataCollectionItemsPaginationInfo, + paginationInfo?: CollectionItemsPaginationInfo, _searchText?: string, _otherUserName?: string ): Promise { From fd6874f3e20d3ec5d2f0b6b588aba03e105b761c Mon Sep 17 00:00:00 2001 From: Cheng Shi <91049239+ChengShi-1@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:43:18 -0500 Subject: [PATCH 9/9] Fix Typo in CHANGELOG.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db4e2c3b7..a05833c16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Changed - Add pagination support to the Dataset Version Summaries and File Version Summaries use cases by introducing optional pagination object. #885 -- Refactored pagination to use consistent `CollectionItemsPaginationInfo` object in getMyDataColletionItems, instead of individual limit/selectedPage parameters. +- Refactored pagination to use consistent `CollectionItemsPaginationInfo` object in getMyDataCollectionItems, instead of individual limit/selectedPage parameters. - Use of the new `sourceLastUpdateTime` query parameter from update dataset and file metadata endpoints to support optimistic concurrency control during editing operations. See [Edit Dataset Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#edit-dataset-metadata) and [Updating File Metadata](https://guides.dataverse.org/en/6.8/api/native-api.html#updating-file-metadata) guides for more details. - Changed the way we were handling DATE type metadata field validation to better match the backend validation and give users better error messages. For example, for an input like “foo AD”, we now show “Production Date is not a valid date. The AD year must be numeric.“. For an input like “99999 AD”, we now show “Production Date is not a valid date. The AD year cant be higher than 9999.“. For an input like “[-9999?], we now show “Production Date is not a valid date. The year in brackets cannot be negative.“, etc.