diff --git a/package-lock.json b/package-lock.json index eba90981a..3a5da3082 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.52", + "@iqss/dataverse-client-javascript": "2.0.0-alpha.53", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", @@ -3561,9 +3561,9 @@ }, "node_modules/@iqss/dataverse-client-javascript": { "name": "@IQSS/dataverse-client-javascript", - "version": "2.0.0-alpha.52", - "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-alpha.52/dd100e0dbd0ad597d7b86d9420a58f7dacd8fc3d", - "integrity": "sha512-2lwhqCOfZTjcHEjjwXdxM9vqX9dO5TOvv2d2knf1OH32ED0GXmjA3JoK+KCdRFXVdoqvIKGgLYql8obEN51eew==", + "version": "2.0.0-alpha.53", + "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-alpha.53/0a9acbda27e2bb1d97b7beb3518a278e8d264cc2", + "integrity": "sha512-7aG4YdPu6tFxYOILLRh8u47kXBRmEWJiYAQHDmQl4Y0eY0C+gR8ckDKSM0E9KAwvMUM/OhvDtTXkJOjEaD1aKQ==", "license": "MIT", "dependencies": { "@types/node": "^18.15.11", diff --git a/package.json b/package.json index 7ac3bc805..8fb033fb1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,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.52", + "@iqss/dataverse-client-javascript": "2.0.0-alpha.53", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", diff --git a/src/files/infrastructure/FileJSDataverseRepository.ts b/src/files/infrastructure/FileJSDataverseRepository.ts index 3a0a6f8bd..c05e0fb61 100644 --- a/src/files/infrastructure/FileJSDataverseRepository.ts +++ b/src/files/infrastructure/FileJSDataverseRepository.ts @@ -252,20 +252,29 @@ export class FileJSDataverseRepository implements FileRepository { } getById(id: number, datasetVersionNumber?: string): Promise { - return getFileAndDataset - .execute(id, datasetVersionNumber) - .then(([jsFile, jsDataset]) => - Promise.all([ - jsFile, - jsDataset, - getDatasetCitation.execute(jsDataset.id, datasetVersionNumber, includeDeaccessioned), - FileJSDataverseRepository.getCitationById(jsFile.id, datasetVersionNumber), - FileJSDataverseRepository.getDownloadCountById(jsFile.id, jsFile.publicationDate), - FileJSDataverseRepository.getPermissionsById(jsFile.id), - FileJSDataverseRepository.getThumbnailById(jsFile.id), - FileJSDataverseRepository.getTabularDataById(jsFile.id, jsFile.tabularData) - ]) - ) + return FileJSDataverseRepository.getPermissionsById(id) + .then((permissions) => { + const includeDeaccessioned = permissions?.canEditOwnerDataset + + return getFileAndDataset + .execute(id, datasetVersionNumber, includeDeaccessioned) + .then(([jsFile, jsDataset]) => { + return Promise.all([ + jsFile, + jsDataset, + getDatasetCitation.execute(jsDataset.id, datasetVersionNumber, includeDeaccessioned), + FileJSDataverseRepository.getCitationById( + jsFile.id, + datasetVersionNumber, + includeDeaccessioned + ), + FileJSDataverseRepository.getDownloadCountById(jsFile.id, jsFile.publicationDate), + Promise.resolve(permissions), + FileJSDataverseRepository.getThumbnailById(jsFile.id), + FileJSDataverseRepository.getTabularDataById(jsFile.id, jsFile.tabularData) + ]) + }) + }) .then( ([ jsFile, @@ -293,7 +302,11 @@ export class FileJSDataverseRepository implements FileRepository { }) } - private static getCitationById(id: number, datasetVersionNumber?: string): Promise { + private static getCitationById( + id: number, + datasetVersionNumber?: string, + includeDeaccessioned?: boolean + ): Promise { return getFileCitation .execute(id, datasetVersionNumber, includeDeaccessioned) .catch((error: ReadError) => { diff --git a/src/sections/file/file-version/FileVersions.tsx b/src/sections/file/file-version/FileVersions.tsx index 733cb4671..88c5b2233 100644 --- a/src/sections/file/file-version/FileVersions.tsx +++ b/src/sections/file/file-version/FileVersions.tsx @@ -77,7 +77,8 @@ export function FileVersions({ const isCurrentVersion = fileVersion.datasetVersion === displayVersion const isLinkable = fileVersion.versionState === DatasetVersionState.RELEASED || - fileVersion.versionState === DatasetVersionState.DEACCESSIONED || + (fileVersion.versionState === DatasetVersionState.DEACCESSIONED && + canEditOwnerDataset) || (fileVersion.versionState === DatasetVersionState.DRAFT && canEditOwnerDataset) return ( diff --git a/tests/component/sections/file/file-version/FileVersions.spec.tsx b/tests/component/sections/file/file-version/FileVersions.spec.tsx index 942a87606..e5a80cd82 100644 --- a/tests/component/sections/file/file-version/FileVersions.spec.tsx +++ b/tests/component/sections/file/file-version/FileVersions.spec.tsx @@ -67,6 +67,29 @@ describe('FileVersions', () => { ) }) + it('disables the link button for deaccessioned versions without permission', () => { + const deaccessionedFile = [ + { + ...fileVersionSummaries[0], + datasetVersion: '1.2', + versionState: DatasetVersionState.DEACCESSIONED + } + ] + fileRepository.getFileVersionSummaries = cy.stub().resolves(deaccessionedFile) + cy.customMount( + + ) + + cy.get('span').contains('1.2').should('exist') + cy.findByTestId('file-version-link-1.2').should('not.exist') + }) + it('disables the link button for draft version without permission', () => { const draftFile = [ {