From 549f50c6f5c086a49e08c348358df9652aa5b6a4 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 10:38:11 +0100 Subject: [PATCH 01/11] feat(AccessFileMenu): move to files section --- .../file-action-buttons/FileActionButtons.tsx | 2 +- .../AccessFileMenu.module.scss | 0 .../access-file-menu/AccessFileMenu.tsx | 2 +- .../access-file-menu/AccessStatus.tsx | 4 ++-- .../access-file-menu/FileDownloadOptions.tsx | 4 ++-- .../FileNonTabularDownloadOptions.tsx | 8 +++---- .../FileTabularDownloadOptions.tsx | 6 ++--- .../access-file-menu/RequestAccessModal.tsx | 4 ++-- .../access-file-menu/RequestAccessOption.tsx | 6 ++--- .../RequestAccessModal.stories.tsx | 24 ------------------- .../AccessFileMenu.stories.tsx | 13 +++++----- .../RequestAccessModal.stories.tsx | 23 ++++++++++++++++++ .../access-file-menu/AccessFileMenu.spec.tsx | 10 ++++---- .../access-file-menu/AccessStatus.spec.tsx | 12 +++++----- .../FileDownloadOptions.spec.tsx | 10 ++++---- .../FileNonTabularDownloadOptions.spec.tsx | 17 ++++++------- .../FileTabularDownloadOptions.spec.tsx | 19 +++++++-------- .../RequestAccessModal.spec.tsx | 12 +++++----- .../RequestAccessOption.spec.tsx | 10 ++++---- 19 files changed, 89 insertions(+), 97 deletions(-) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/AccessFileMenu.module.scss (100%) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/AccessFileMenu.tsx (93%) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/AccessStatus.tsx (91%) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/FileDownloadOptions.tsx (83%) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx (72%) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx (85%) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/RequestAccessModal.tsx (95%) rename src/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/RequestAccessOption.tsx (82%) delete mode 100644 src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx rename src/stories/{dataset/dataset-files/files-table/file-actions => file}/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx (70%) create mode 100644 src/stories/file/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx rename tests/component/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx (78%) rename tests/component/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/AccessStatus.spec.tsx (80%) rename tests/component/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx (73%) rename tests/component/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx (77%) rename tests/component/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx (82%) rename tests/component/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/RequestAccessModal.spec.tsx (76%) rename tests/component/sections/{dataset/dataset-files/files-table/file-actions/file-actions-cell => file}/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx (88%) diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx index 9703b36d0..06cfc218f 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx @@ -1,4 +1,4 @@ -import { AccessFileMenu } from './access-file-menu/AccessFileMenu' +import { AccessFileMenu } from '../../../../../../file/file-action-buttons/access-file-menu/AccessFileMenu' import { FilePreview } from '../../../../../../../files/domain/models/FilePreview' import { FileOptionsMenu } from './file-options-menu/FileOptionsMenu' import { ButtonGroup } from '@iqss/dataverse-design-system' diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.module.scss b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.module.scss similarity index 100% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.module.scss rename to src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.module.scss diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.tsx b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx similarity index 93% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.tsx rename to src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx index bc346227c..c869a019a 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx @@ -1,4 +1,4 @@ -import { FilePreview } from '../../../../../../../../files/domain/models/FilePreview' +import { FilePreview } from '../../../../files/domain/models/FilePreview' import { Download, FileEarmark } from 'react-bootstrap-icons' import { AccessStatus } from './AccessStatus' import { RequestAccessOption } from './RequestAccessOption' diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessStatus.tsx b/src/sections/file/file-action-buttons/access-file-menu/AccessStatus.tsx similarity index 91% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessStatus.tsx rename to src/sections/file/file-action-buttons/access-file-menu/AccessStatus.tsx index 8da22dc74..bc227cf50 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessStatus.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/AccessStatus.tsx @@ -1,9 +1,9 @@ -import { FilePreview } from '../../../../../../../../files/domain/models/FilePreview' +import { FilePreview } from '../../../../files/domain/models/FilePreview' import { Globe, LockFill, UnlockFill } from 'react-bootstrap-icons' import { useTranslation } from 'react-i18next' import styles from './AccessFileMenu.module.scss' import { DropdownButtonItem } from '@iqss/dataverse-design-system' -import { useFileDownloadPermission } from '../../../../../../../file/file-permissions/useFileDownloadPermission' +import { useFileDownloadPermission } from '../../file-permissions/useFileDownloadPermission' interface AccessStatusProps { file: FilePreview diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx similarity index 83% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileDownloadOptions.tsx rename to src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx index b00f47f7a..d296b4a9b 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx @@ -1,10 +1,10 @@ import { DropdownHeader } from '@iqss/dataverse-design-system' import { Download } from 'react-bootstrap-icons' -import { FilePreview } from '../../../../../../../../files/domain/models/FilePreview' +import { FilePreview } from '../../../../files/domain/models/FilePreview' import { FileTabularDownloadOptions } from './FileTabularDownloadOptions' import { FileNonTabularDownloadOptions } from './FileNonTabularDownloadOptions' import { useTranslation } from 'react-i18next' -import { useFileDownloadPermission } from '../../../../../../../file/file-permissions/useFileDownloadPermission' +import { useFileDownloadPermission } from '../../file-permissions/useFileDownloadPermission' interface FileDownloadOptionsProps { file: FilePreview diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx similarity index 72% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx rename to src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx index 989689505..9f44bb531 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx @@ -1,9 +1,9 @@ -import { FilePreview } from '../../../../../../../../files/domain/models/FilePreview' -import FileTypeToFriendlyTypeMap from '../../../../../../../../files/domain/models/FileTypeToFriendlyTypeMap' +import { FilePreview } from '../../../../files/domain/models/FilePreview' +import FileTypeToFriendlyTypeMap from '../../../../files/domain/models/FileTypeToFriendlyTypeMap' import { DropdownButtonItem } from '@iqss/dataverse-design-system' -import { useDataset } from '../../../../../../DatasetContext' +import { useDataset } from '../../../dataset/DatasetContext' import { useTranslation } from 'react-i18next' -import { FileIngestStatus } from '../../../../../../../../files/domain/models/FileIngest' +import { FileIngestStatus } from '../../../../files/domain/models/FileIngest' interface FileNonTabularDownloadOptionsProps { file: FilePreview diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx similarity index 85% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx rename to src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx index 58b37cc83..1f09234ea 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx @@ -1,8 +1,8 @@ -import { FilePreview } from '../../../../../../../../files/domain/models/FilePreview' +import { FilePreview } from '../../../../files/domain/models/FilePreview' import { DropdownButtonItem } from '@iqss/dataverse-design-system' -import { useDataset } from '../../../../../../DatasetContext' +import { useDataset } from '../../../dataset/DatasetContext' import { useTranslation } from 'react-i18next' -import { FileIngestStatus } from '../../../../../../../../files/domain/models/FileIngest' +import { FileIngestStatus } from '../../../../files/domain/models/FileIngest' interface FileTabularDownloadOptionsProps { file: FilePreview diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal.tsx b/src/sections/file/file-action-buttons/access-file-menu/RequestAccessModal.tsx similarity index 95% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal.tsx rename to src/sections/file/file-action-buttons/access-file-menu/RequestAccessModal.tsx index eea369e4d..fbcfddbca 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/RequestAccessModal.tsx @@ -1,9 +1,9 @@ import { Button, DropdownButtonItem, Modal } from '@iqss/dataverse-design-system' -import { useSession } from '../../../../../../../session/SessionContext' +import { useSession } from '../../../session/SessionContext' import { FormEvent, useState } from 'react' import { Form } from '@iqss/dataverse-design-system' import { ExclamationTriangle } from 'react-bootstrap-icons' -import { Route } from '../../../../../../../Route.enum' +import { Route } from '../../../Route.enum' import styles from './AccessFileMenu.module.scss' import { useTranslation } from 'react-i18next' diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessOption.tsx b/src/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.tsx similarity index 82% rename from src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessOption.tsx rename to src/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.tsx index d8abd6390..bf100a19b 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessOption.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.tsx @@ -1,10 +1,10 @@ import { DropdownButtonItem } from '@iqss/dataverse-design-system' import styles from './AccessFileMenu.module.scss' import { RequestAccessModal } from './RequestAccessModal' -import { FilePreview } from '../../../../../../../../files/domain/models/FilePreview' +import { FilePreview } from '../../../../files/domain/models/FilePreview' import { useTranslation } from 'react-i18next' -import { useFileDownloadPermission } from '../../../../../../../file/file-permissions/useFileDownloadPermission' -import { FilePublishingStatus } from '../../../../../../../../files/domain/models/FileVersion' +import { useFileDownloadPermission } from '../../file-permissions/useFileDownloadPermission' +import { FilePublishingStatus } from '../../../../files/domain/models/FileVersion' interface RequestAccessButtonProps { file: FilePreview diff --git a/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx b/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx deleted file mode 100644 index ac21b4c43..000000000 --- a/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react' -import { WithI18next } from '../../../../../../WithI18next' -import { WithSettings } from '../../../../../../WithSettings' -import { RequestAccessModal } from '../../../../../../../sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal' -import { WithLoggedInUser } from '../../../../../../WithLoggedInUser' - -const meta: Meta = { - title: - 'Sections/Dataset Page/DatasetFiles/FilesTable/FileActionsCell/FileActionButtons/RequestAccessModal', - component: RequestAccessModal, - decorators: [WithI18next, WithSettings] -} - -export default meta -type Story = StoryObj - -export const LoggedOut: Story = { - render: () => -} - -export const LoggedIn: Story = { - decorators: [WithLoggedInUser], - render: () => -} diff --git a/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx b/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx similarity index 70% rename from src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx rename to src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx index 6cc207e53..cbe3f9c11 100644 --- a/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx +++ b/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx @@ -1,13 +1,12 @@ import { Meta, StoryObj } from '@storybook/react' -import { AccessFileMenu } from '../../../../../../../sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu' -import { WithI18next } from '../../../../../../WithI18next' -import { WithSettings } from '../../../../../../WithSettings' -import { WithFilePermissionsGranted } from '../../../../../../file/file-permission/WithFilePermissionsGranted' -import { FilePreviewMother } from '../../../../../../../../tests/component/files/domain/models/FilePreviewMother' +import { AccessFileMenu } from '../../../../sections/file/file-action-buttons/access-file-menu/AccessFileMenu' +import { WithI18next } from '../../../WithI18next' +import { WithSettings } from '../../../WithSettings' +import { WithFilePermissionsGranted } from '../../file-permission/WithFilePermissionsGranted' +import { FilePreviewMother } from '../../../../../tests/component/files/domain/models/FilePreviewMother' const meta: Meta = { - title: - 'Sections/Dataset Page/DatasetFiles/FilesTable/FileActionsCell/FileActionButtons/AccessFileMenu', + title: 'Sections/File Page/Action Buttons/AccessFileMenu', component: AccessFileMenu, decorators: [WithI18next, WithSettings] } diff --git a/src/stories/file/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx b/src/stories/file/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx new file mode 100644 index 000000000..f5ea38c63 --- /dev/null +++ b/src/stories/file/file-action-buttons/access-file-menu/RequestAccessModal.stories.tsx @@ -0,0 +1,23 @@ +import { Meta, StoryObj } from '@storybook/react' +import { WithI18next } from '../../../WithI18next' +import { WithSettings } from '../../../WithSettings' +import { WithLoggedInUser } from '../../../WithLoggedInUser' +import { RequestAccessModal } from '../../../../sections/file/file-action-buttons/access-file-menu/RequestAccessModal' + +const meta: Meta = { + title: 'Sections/File Page/Action Buttons/RequestAccessModal', + component: RequestAccessModal, + decorators: [WithI18next, WithSettings] +} + +export default meta +type Story = StoryObj + +export const LoggedOut: Story = { + render: () => +} + +export const LoggedIn: Story = { + decorators: [WithLoggedInUser], + render: () => +} diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx similarity index 78% rename from tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx rename to tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx index 3c60bef4c..93f66278b 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx @@ -1,9 +1,9 @@ -import { AccessFileMenu } from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu' +import { AccessFileMenu } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu' import { Suspense } from 'react' -import { FilePermissionsProvider } from '../../../../../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FileRepository } from '../../../../../../../../../../src/files/domain/repositories/FileRepository' -import { FileUserPermissionsMother } from '../../../../../../../../files/domain/models/FileUserPermissionsMother' -import { FilePreviewMother } from '../../../../../../../../files/domain/models/FilePreviewMother' +import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' +import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' +import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' +import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' const file = FilePreviewMother.create() diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessStatus.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessStatus.spec.tsx similarity index 80% rename from tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessStatus.spec.tsx rename to tests/component/sections/file/file-action-buttons/access-file-menu/AccessStatus.spec.tsx index 3ef3f76ac..b0f40e2bc 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessStatus.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessStatus.spec.tsx @@ -1,9 +1,9 @@ -import { AccessStatus } from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessStatus' -import styles from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/AccessFileMenu.module.scss' -import { FileRepository } from '../../../../../../../../../../src/files/domain/repositories/FileRepository' -import { FileUserPermissionsMother } from '../../../../../../../../files/domain/models/FileUserPermissionsMother' -import { FilePermissionsProvider } from '../../../../../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FilePreviewMother } from '../../../../../../../../files/domain/models/FilePreviewMother' +import { AccessStatus } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/AccessStatus' +import styles from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.module.scss' +import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' +import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' +import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' +import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' describe('AccessStatus', () => { it('renders the access status public', () => { diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx similarity index 73% rename from tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx rename to tests/component/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx index 46458bbca..1c7f28ac7 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx @@ -1,8 +1,8 @@ -import { FileDownloadOptions } from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileDownloadOptions' -import { FileUserPermissionsMother } from '../../../../../../../../files/domain/models/FileUserPermissionsMother' -import { FilePermissionsProvider } from '../../../../../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FileRepository } from '../../../../../../../../../../src/files/domain/repositories/FileRepository' -import { FilePreviewMother } from '../../../../../../../../files/domain/models/FilePreviewMother' +import { FileDownloadOptions } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions' +import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' +import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' +import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' +import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' const fileNonTabular = FilePreviewMother.createNonTabular() const fileTabular = FilePreviewMother.createTabular() diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx similarity index 77% rename from tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx rename to tests/component/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx index 1b478b012..f80911b70 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx @@ -1,14 +1,11 @@ -import { FileMetadataMother } from '../../../../../../../../files/domain/models/FileMetadataMother' +import { FileMetadataMother } from '../../../../files/domain/models/FileMetadataMother' -import { FileNonTabularDownloadOptions } from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions' -import { DatasetProvider } from '../../../../../../../../../../src/sections/dataset/DatasetProvider' -import { DatasetRepository } from '../../../../../../../../../../src/dataset/domain/repositories/DatasetRepository' -import { - DatasetLockMother, - DatasetMother -} from '../../../../../../../../dataset/domain/models/DatasetMother' -import { FilePreviewMother } from '../../../../../../../../files/domain/models/FilePreviewMother' -import { FileIngestMother } from '../../../../../../../../files/domain/models/FileIngestMother' +import { FileNonTabularDownloadOptions } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions' +import { DatasetProvider } from '../../../../../../src/sections/dataset/DatasetProvider' +import { DatasetRepository } from '../../../../../../src/dataset/domain/repositories/DatasetRepository' +import { DatasetLockMother, DatasetMother } from '../../../../dataset/domain/models/DatasetMother' +import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' +import { FileIngestMother } from '../../../../files/domain/models/FileIngestMother' const fileNonTabular = FilePreviewMother.create({ metadata: FileMetadataMother.createNonTabular(), diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx similarity index 82% rename from tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx rename to tests/component/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx index 500bb9be5..e39dff35a 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx @@ -1,14 +1,11 @@ -import { FileMetadataMother } from '../../../../../../../../files/domain/models/FileMetadataMother' -import { FileType } from '../../../../../../../../../../src/files/domain/models/FileMetadata' -import { FileTabularDownloadOptions } from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/FileTabularDownloadOptions' -import { DatasetRepository } from '../../../../../../../../../../src/dataset/domain/repositories/DatasetRepository' -import { - DatasetLockMother, - DatasetMother -} from '../../../../../../../../dataset/domain/models/DatasetMother' -import { DatasetProvider } from '../../../../../../../../../../src/sections/dataset/DatasetProvider' -import { FilePreviewMother } from '../../../../../../../../files/domain/models/FilePreviewMother' -import { FileIngestMother } from '../../../../../../../../files/domain/models/FileIngestMother' +import { FileMetadataMother } from '../../../../files/domain/models/FileMetadataMother' +import { FileType } from '../../../../../../src/files/domain/models/FileMetadata' +import { FileTabularDownloadOptions } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions' +import { DatasetRepository } from '../../../../../../src/dataset/domain/repositories/DatasetRepository' +import { DatasetLockMother, DatasetMother } from '../../../../dataset/domain/models/DatasetMother' +import { DatasetProvider } from '../../../../../../src/sections/dataset/DatasetProvider' +import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' +import { FileIngestMother } from '../../../../files/domain/models/FileIngestMother' const fileNonTabular = FilePreviewMother.create({ metadata: FileMetadataMother.createNonTabular(), diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessModal.spec.tsx similarity index 76% rename from tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal.spec.tsx rename to tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessModal.spec.tsx index f261a7500..b0faad15f 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessModal.spec.tsx @@ -1,9 +1,9 @@ -import { RequestAccessModal } from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessModal' -import { UserMother } from '../../../../../../../../users/domain/models/UserMother' -import { UserRepository } from '../../../../../../../../../../src/users/domain/repositories/UserRepository' -import { SessionProvider } from '../../../../../../../../../../src/sections/session/SessionProvider' -import { Route } from '../../../../../../../../../../src/sections/Route.enum' -import { FilePreviewMother } from '../../../../../../../../files/domain/models/FilePreviewMother' +import { RequestAccessModal } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/RequestAccessModal' +import { UserMother } from '../../../../users/domain/models/UserMother' +import { UserRepository } from '../../../../../../src/users/domain/repositories/UserRepository' +import { SessionProvider } from '../../../../../../src/sections/session/SessionProvider' +import { Route } from '../../../../../../src/sections/Route.enum' +import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' describe('RequestAccessModal', () => { it('renders the RequestAccessModal', () => { diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx similarity index 88% rename from tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx rename to tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx index 9f3537947..23a6e98e1 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx @@ -1,8 +1,8 @@ -import { RequestAccessOption } from '../../../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/access-file-menu/RequestAccessOption' -import { FileRepository } from '../../../../../../../../../../src/files/domain/repositories/FileRepository' -import { FileUserPermissionsMother } from '../../../../../../../../files/domain/models/FileUserPermissionsMother' -import { FilePermissionsProvider } from '../../../../../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FilePreviewMother } from '../../../../../../../../files/domain/models/FilePreviewMother' +import { RequestAccessOption } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/RequestAccessOption' +import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' +import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' +import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' +import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' describe('RequestAccessOption', () => { it('renders the embargoed message when the file is embargoed', () => { From 4efb78dbc8758cb5b5ee9826bc2a452af545bc4d Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 11:01:12 +0100 Subject: [PATCH 02/11] refactor: FileNonTabularDownloadOptions --- src/files/domain/models/FileIngest.ts | 9 ++- src/files/domain/models/FileMetadata.ts | 4 ++ .../access-file-menu/FileDownloadOptions.tsx | 6 +- .../FileNonTabularDownloadOptions.tsx | 31 ++++----- .../files/domain/models/FileMetadataMother.ts | 27 ++++---- .../FileNonTabularDownloadOptions.spec.tsx | 68 ++++++++++--------- 6 files changed, 79 insertions(+), 66 deletions(-) diff --git a/src/files/domain/models/FileIngest.ts b/src/files/domain/models/FileIngest.ts index 333e98093..802ae5ec8 100644 --- a/src/files/domain/models/FileIngest.ts +++ b/src/files/domain/models/FileIngest.ts @@ -5,7 +5,10 @@ export enum FileIngestStatus { ERROR = 'error' } -export interface FileIngest { - status: FileIngestStatus - reportMessage?: string +export class FileIngest { + constructor(readonly status: FileIngestStatus, readonly message?: string) {} + + get isInProgress(): boolean { + return this.status === FileIngestStatus.IN_PROGRESS + } } diff --git a/src/files/domain/models/FileMetadata.ts b/src/files/domain/models/FileMetadata.ts index e2650d562..85c5a73e4 100644 --- a/src/files/domain/models/FileMetadata.ts +++ b/src/files/domain/models/FileMetadata.ts @@ -120,6 +120,10 @@ export class FileType { toDisplayFormat(): string { return FileTypeToFriendlyTypeMap[this.value] || FileTypeToFriendlyTypeMap.unknown } + + get displayFormatIsUnknown(): boolean { + return this.toDisplayFormat() === FileTypeToFriendlyTypeMap.unknown + } } export interface FileChecksum { diff --git a/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx index d296b4a9b..17f9a0d29 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx @@ -27,7 +27,11 @@ export function FileDownloadOptions({ file }: FileDownloadOptionsProps) { {file.metadata.tabularData ? ( ) : ( - + )} ) diff --git a/src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx index 9f44bb531..87938e848 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.tsx @@ -1,33 +1,28 @@ -import { FilePreview } from '../../../../files/domain/models/FilePreview' -import FileTypeToFriendlyTypeMap from '../../../../files/domain/models/FileTypeToFriendlyTypeMap' import { DropdownButtonItem } from '@iqss/dataverse-design-system' import { useDataset } from '../../../dataset/DatasetContext' import { useTranslation } from 'react-i18next' -import { FileIngestStatus } from '../../../../files/domain/models/FileIngest' +import { FileType } from '../../../../files/domain/models/FileMetadata' interface FileNonTabularDownloadOptionsProps { - file: FilePreview + type: FileType + downloadUrlOriginal: string + ingestIsInProgress: boolean } -export function FileNonTabularDownloadOptions({ file }: FileNonTabularDownloadOptionsProps) { +export function FileNonTabularDownloadOptions({ + type, + downloadUrlOriginal, + ingestIsInProgress +}: FileNonTabularDownloadOptionsProps) { const { t } = useTranslation('files') const { dataset } = useDataset() - const originalFileFormatIsKnown = - file.metadata.type.toDisplayFormat() !== FileTypeToFriendlyTypeMap.unknown - - if (file.metadata.tabularData) { - return <> - } return ( - {originalFileFormatIsKnown - ? file.metadata.type.toDisplayFormat() + href={downloadUrlOriginal} + disabled={ingestIsInProgress || (dataset && dataset.isLockedFromFileDownload)}> + {type.displayFormatIsUnknown + ? type.toDisplayFormat() : t('actions.accessFileMenu.downloadOptions.options.original')} ) diff --git a/tests/component/files/domain/models/FileMetadataMother.ts b/tests/component/files/domain/models/FileMetadataMother.ts index a0501f0dd..463bec2ea 100644 --- a/tests/component/files/domain/models/FileMetadataMother.ts +++ b/tests/component/files/domain/models/FileMetadataMother.ts @@ -9,7 +9,8 @@ import { FileLabel, FileLabelType, FileTabularData, - FileMetadata + FileMetadata, + FileDownloadUrls } from '../../../../../src/files/domain/models/FileMetadata' import FileTypeToFriendlyTypeMap from '../../../../../src/files/domain/models/FileTypeToFriendlyTypeMap' @@ -123,6 +124,17 @@ export class FileSizeMother { } } +export class FileDownloadUrlsMother { + static create(props?: Partial): FileDownloadUrls { + return { + original: faker.internet.url(), + tabular: faker.internet.url(), + rData: faker.internet.url(), + ...props + } + } +} + export class FileMetadataMother { static create(props?: Partial): FileMetadata { const thumbnail = valueOrUndefined(faker.image.imageUrl(400)) @@ -145,11 +157,7 @@ export class FileMetadataMother { tabularData: tabularFile && !checksum ? FileTabularDataMother.create() : undefined, description: valueOrUndefined(faker.lorem.paragraph()), isDeleted: faker.datatype.boolean(), - downloadUrls: { - original: this.createDownloadUrl(), - tabular: this.createDownloadUrl(), - rData: this.createDownloadUrl() - }, + downloadUrls: FileDownloadUrlsMother.create(), depositDate: faker.date.past(), publicationDate: faker.datatype.boolean() ? faker.date.past() : undefined, persistentId: faker.datatype.uuid(), @@ -176,13 +184,6 @@ export class FileMetadataMother { ) } - static createDownloadUrl(): string { - const blob = new Blob(['Name,Age,Location\nJohn,25,New York\nJane,30,San Francisco'], { - type: 'text/csv' - }) - return URL.createObjectURL(blob) - } - static createDefault(props?: Partial): FileMetadata { const defaultFile = { type: FileTypeMother.createText(), diff --git a/tests/component/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx index f80911b70..dc03dda69 100644 --- a/tests/component/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions.spec.tsx @@ -1,53 +1,55 @@ -import { FileMetadataMother } from '../../../../files/domain/models/FileMetadataMother' +import { + FileDownloadUrlsMother, + FileTypeMother +} from '../../../../files/domain/models/FileMetadataMother' import { FileNonTabularDownloadOptions } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/FileNonTabularDownloadOptions' import { DatasetProvider } from '../../../../../../src/sections/dataset/DatasetProvider' import { DatasetRepository } from '../../../../../../src/dataset/domain/repositories/DatasetRepository' import { DatasetLockMother, DatasetMother } from '../../../../dataset/domain/models/DatasetMother' -import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' -import { FileIngestMother } from '../../../../files/domain/models/FileIngestMother' -const fileNonTabular = FilePreviewMother.create({ - metadata: FileMetadataMother.createNonTabular(), - ingest: FileIngestMother.createIngestNone() -}) +const unknownType = FileTypeMother.createUnknown() +const downloadUrls = FileDownloadUrlsMother.create() +const textType = FileTypeMother.createText() describe('FileNonTabularDownloadOptions', () => { - it('renders the download options for a non-tabular file of unknown type', () => { - const fileNonTabularUnknown = FilePreviewMother.create({ - metadata: FileMetadataMother.createNonTabularUnknown(), - ingest: FileIngestMother.createIngestNone() - }) - cy.customMount() + it('renders the download options for a file of unknown type', () => { + cy.customMount( + + ) cy.findByRole('link', { name: 'Original File Format' }) .should('exist') .should('not.have.class', 'disabled') - .should('have.attr', 'href', fileNonTabularUnknown.metadata.downloadUrls.original) + .should('have.attr', 'href', downloadUrls.original) }) - it('renders the download options for a non-tabular file', () => { - cy.customMount() + it('renders the download options for a file of known type', () => { + cy.customMount( + + ) cy.findByRole('link', { name: 'Plain Text' }) .should('exist') .should('not.have.class', 'disabled') - .should('have.attr', 'href', fileNonTabular.metadata.downloadUrls.original) - }) - - it('does not render the download options for a tabular file', () => { - const fileTabular = FilePreviewMother.createTabular() - cy.customMount() - - cy.findByRole('link', { name: 'Original File Format' }).should('not.exist') - cy.findByRole('link', { name: 'Tab-Delimited' }).should('not.exist') + .should('have.attr', 'href', downloadUrls.original) }) it('renders the options as disabled when the file ingest is in progress', () => { - const fileNonTabularInProgress = FilePreviewMother.create({ - metadata: FileMetadataMother.createNonTabular(), - ingest: FileIngestMother.createInProgress() - }) - cy.customMount() + cy.customMount( + + ) cy.findByRole('link', { name: 'Plain Text' }).should('have.class', 'disabled') }) @@ -63,7 +65,11 @@ describe('FileNonTabularDownloadOptions', () => { - + ) From f4246bff055ead27a0ccd4cb2e134aa8406598a1 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 11:17:30 +0100 Subject: [PATCH 03/11] refactor: FileNonTabularDownloadOptions --- src/files/domain/models/FileMetadata.ts | 4 + .../access-file-menu/FileDownloadOptions.tsx | 6 +- .../FileNonTabularDownloadOptions.tsx | 4 +- .../FileTabularDownloadOptions.tsx | 38 ++++----- .../files/domain/models/FileMetadataMother.ts | 8 ++ .../FileTabularDownloadOptions.spec.tsx | 83 +++++++++---------- 6 files changed, 77 insertions(+), 66 deletions(-) diff --git a/src/files/domain/models/FileMetadata.ts b/src/files/domain/models/FileMetadata.ts index 85c5a73e4..77efedc67 100644 --- a/src/files/domain/models/FileMetadata.ts +++ b/src/files/domain/models/FileMetadata.ts @@ -124,6 +124,10 @@ export class FileType { get displayFormatIsUnknown(): boolean { return this.toDisplayFormat() === FileTypeToFriendlyTypeMap.unknown } + + get originalFormatIsUnknown(): boolean { + return this.original === undefined || this.original === FileTypeToFriendlyTypeMap.unknown + } } export interface FileChecksum { diff --git a/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx index 17f9a0d29..47b3d6293 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx @@ -25,7 +25,11 @@ export function FileDownloadOptions({ file }: FileDownloadOptionsProps) { {file.metadata.tabularData ? ( - + ) : ( {type.displayFormatIsUnknown - ? type.toDisplayFormat() - : t('actions.accessFileMenu.downloadOptions.options.original')} + ? t('actions.accessFileMenu.downloadOptions.options.original') + : type.toDisplayFormat()} ) } diff --git a/src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx index 1f09234ea..cb458dde8 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.tsx @@ -1,38 +1,36 @@ -import { FilePreview } from '../../../../files/domain/models/FilePreview' import { DropdownButtonItem } from '@iqss/dataverse-design-system' import { useDataset } from '../../../dataset/DatasetContext' import { useTranslation } from 'react-i18next' -import { FileIngestStatus } from '../../../../files/domain/models/FileIngest' +import { FileDownloadUrls, FileType } from '../../../../files/domain/models/FileMetadata' +import FileTypeToFriendlyTypeMap from '../../../../files/domain/models/FileTypeToFriendlyTypeMap' interface FileTabularDownloadOptionsProps { - file: FilePreview + type: FileType + ingestInProgress: boolean + downloadUrls: FileDownloadUrls } -export function FileTabularDownloadOptions({ file }: FileTabularDownloadOptionsProps) { +export function FileTabularDownloadOptions({ + type, + ingestInProgress, + downloadUrls +}: FileTabularDownloadOptionsProps) { const { t } = useTranslation('files') const { dataset } = useDataset() - const downloadDisabled = - file.ingest.status === FileIngestStatus.IN_PROGRESS || - (dataset && dataset.isLockedFromFileDownload) - - if (!file.metadata.tabularData) { - return <> - } + const downloadDisabled = ingestInProgress || (dataset && dataset.isLockedFromFileDownload) return ( <> - {file.metadata.type.original && file.metadata.type.original !== 'Unknown' && ( - {`${file.metadata.type.original} (${t( - 'actions.accessFileMenu.downloadOptions.options.original' - )})`} + {!type.originalFormatIsUnknown && ( + {`${ + type.original || '' + } (${t('actions.accessFileMenu.downloadOptions.options.original')})`} )} - + {t('actions.accessFileMenu.downloadOptions.options.tabular')} - {file.metadata.type.original !== 'R Data' && ( - + {type.original !== FileTypeToFriendlyTypeMap['application/x-r-data'] && ( + {t('actions.accessFileMenu.downloadOptions.options.RData')} )} diff --git a/tests/component/files/domain/models/FileMetadataMother.ts b/tests/component/files/domain/models/FileMetadataMother.ts index 463bec2ea..ca6610bbf 100644 --- a/tests/component/files/domain/models/FileMetadataMother.ts +++ b/tests/component/files/domain/models/FileMetadataMother.ts @@ -31,6 +31,10 @@ export class FileTypeMother { return new FileType('text/tab-separated-values', 'Comma Separated Values') } + static createTabularUnknown(): FileType { + return new FileType('text/tab-separated-values', 'Unknown') + } + static createText(): FileType { return new FileType('text/plain') } @@ -46,6 +50,10 @@ export class FileTypeMother { static createUnknown(): FileType { return new FileType('unknown') } + + static createRData(): FileType { + return new FileType('text/tab-separated-values', 'R Data') + } } export class FileTabularDataMother { diff --git a/tests/component/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx index e39dff35a..5316b691b 100644 --- a/tests/component/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions.spec.tsx @@ -1,45 +1,46 @@ -import { FileMetadataMother } from '../../../../files/domain/models/FileMetadataMother' -import { FileType } from '../../../../../../src/files/domain/models/FileMetadata' +import { + FileDownloadUrlsMother, + FileTypeMother +} from '../../../../files/domain/models/FileMetadataMother' import { FileTabularDownloadOptions } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/FileTabularDownloadOptions' import { DatasetRepository } from '../../../../../../src/dataset/domain/repositories/DatasetRepository' import { DatasetLockMother, DatasetMother } from '../../../../dataset/domain/models/DatasetMother' import { DatasetProvider } from '../../../../../../src/sections/dataset/DatasetProvider' -import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' -import { FileIngestMother } from '../../../../files/domain/models/FileIngestMother' -const fileNonTabular = FilePreviewMother.create({ - metadata: FileMetadataMother.createNonTabular(), - ingest: FileIngestMother.createIngestNone() -}) -const fileTabular = FilePreviewMother.create({ - metadata: FileMetadataMother.createTabular(), - ingest: FileIngestMother.createIngestNone() -}) -const fileTabularUnknown = FilePreviewMother.create({ - metadata: FileMetadataMother.createTabular({ - type: new FileType('text/tab-separated-values', 'Unknown') - }), - ingest: FileIngestMother.createIngestNone() -}) +const tabularType = FileTypeMother.createTabular() +const downloadUrls = FileDownloadUrlsMother.create() describe('FileTabularDownloadOptions', () => { it('renders the download options for a tabular file', () => { - cy.customMount() + cy.customMount( + + ) cy.findByRole('link', { name: 'Comma Separated Values (Original File Format)' }) .should('exist') - .should('have.attr', 'href', fileTabular.metadata.downloadUrls.original) + .should('have.attr', 'href', downloadUrls.original) cy.findByRole('link', { name: 'Tab-Delimited' }) .should('exist') - .should('have.attr', 'href', fileTabular.metadata.downloadUrls.tabular) + .should('have.attr', 'href', downloadUrls.tabular) .should('not.have.class', 'disabled') cy.findByRole('link', { name: 'R Data' }) .should('exist') .should('not.have.class', 'disabled') - .should('have.attr', 'href', fileTabular.metadata.downloadUrls.rData) + .should('have.attr', 'href', downloadUrls.rData) }) it('renders the download options for a tabular file of unknown original type', () => { - cy.customMount() + const unknownType = FileTypeMother.createTabularUnknown() + cy.customMount( + + ) cy.findByRole('link', { name: /(Original File Format)/ }).should('not.exist') cy.findByRole('link', { name: 'Tab-Delimited' }) @@ -48,19 +49,10 @@ describe('FileTabularDownloadOptions', () => { cy.findByRole('link', { name: 'R Data' }).should('exist').should('not.have.class', 'disabled') }) - it('does not render the download options for a non-tabular file', () => { - cy.customMount() - - cy.findByRole('link', { name: /(Original File Format)/ }).should('not.exist') - cy.findByRole('link', { name: 'Tab-Delimited' }).should('not.exist') - cy.findByRole('link', { name: 'R Data' }).should('not.exist') - }) - it('renders the options as disabled when the file ingest is in progress', () => { - const fileTabularInProgress = FilePreviewMother.createTabular({ - ingest: FileIngestMother.createInProgress() - }) - cy.customMount() + cy.customMount( + + ) cy.findByRole('link', { name: 'Comma Separated Values (Original File Format)' }) .should('exist') @@ -82,7 +74,11 @@ describe('FileTabularDownloadOptions', () => { - + ) @@ -96,13 +92,14 @@ describe('FileTabularDownloadOptions', () => { }) it('does not render the RData option if the file type is already R Data', () => { - const fileTabularRData = FilePreviewMother.create({ - metadata: FileMetadataMother.createTabular({ - type: new FileType('application/octet-stream', 'R Data') - }), - ingest: FileIngestMother.createIngestNone() - }) - cy.customMount() + const rDataType = FileTypeMother.createRData() + cy.customMount( + + ) cy.findByRole('link', { name: 'R Data (Original File Format)' }) .should('exist') From ab8c020d9594e60238f6d7829738ac45940f328a Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 11:26:59 +0100 Subject: [PATCH 04/11] refactor: FileDownloadOptions --- src/files/domain/models/FileMetadata.ts | 4 ++ .../access-file-menu/AccessFileMenu.tsx | 12 +++- .../access-file-menu/FileDownloadOptions.tsx | 34 ++++++---- .../FileDownloadOptions.spec.tsx | 68 ++++++++++--------- 4 files changed, 71 insertions(+), 47 deletions(-) diff --git a/src/files/domain/models/FileMetadata.ts b/src/files/domain/models/FileMetadata.ts index 77efedc67..dadf7856d 100644 --- a/src/files/domain/models/FileMetadata.ts +++ b/src/files/domain/models/FileMetadata.ts @@ -167,4 +167,8 @@ export class FileMetadata { } return false } + + get isTabular(): boolean { + return this.tabularData !== undefined + } } diff --git a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx index c869a019a..f3504ae45 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx @@ -5,12 +5,16 @@ import { RequestAccessOption } from './RequestAccessOption' import { DropdownButton, DropdownHeader, Tooltip } from '@iqss/dataverse-design-system' import { useTranslation } from 'react-i18next' import { FileDownloadOptions } from './FileDownloadOptions' +import { useFileDownloadPermission } from '../../file-permissions/useFileDownloadPermission' interface FileActionButtonAccessFileProps { file: FilePreview } + export function AccessFileMenu({ file }: FileActionButtonAccessFileProps) { const { t } = useTranslation('files') + const { sessionUserHasFileDownloadPermission } = useFileDownloadPermission(file) + return ( - + ) diff --git a/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx index 47b3d6293..9b605de8e 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.tsx @@ -1,20 +1,28 @@ import { DropdownHeader } from '@iqss/dataverse-design-system' import { Download } from 'react-bootstrap-icons' -import { FilePreview } from '../../../../files/domain/models/FilePreview' import { FileTabularDownloadOptions } from './FileTabularDownloadOptions' import { FileNonTabularDownloadOptions } from './FileNonTabularDownloadOptions' import { useTranslation } from 'react-i18next' -import { useFileDownloadPermission } from '../../file-permissions/useFileDownloadPermission' +import { FileDownloadUrls, FileType } from '../../../../files/domain/models/FileMetadata' interface FileDownloadOptionsProps { - file: FilePreview + type: FileType + isTabular: boolean + ingestInProgress: boolean + downloadUrls: FileDownloadUrls + userHasDownloadPermission: boolean } -export function FileDownloadOptions({ file }: FileDownloadOptionsProps) { +export function FileDownloadOptions({ + type, + isTabular, + ingestInProgress, + downloadUrls, + userHasDownloadPermission +}: FileDownloadOptionsProps) { const { t } = useTranslation('files') - const { sessionUserHasFileDownloadPermission } = useFileDownloadPermission(file) - if (!sessionUserHasFileDownloadPermission) { + if (!userHasDownloadPermission) { return <> } @@ -24,17 +32,17 @@ export function FileDownloadOptions({ file }: FileDownloadOptionsProps) { {t('actions.accessFileMenu.downloadOptions.title')} - {file.metadata.tabularData ? ( + {isTabular ? ( ) : ( )} diff --git a/tests/component/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx index 1c7f28ac7..64f80369b 100644 --- a/tests/component/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions.spec.tsx @@ -1,42 +1,35 @@ import { FileDownloadOptions } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/FileDownloadOptions' -import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' -import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' -import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' +import { + FileDownloadUrlsMother, + FileTypeMother +} from '../../../../files/domain/models/FileMetadataMother' -const fileNonTabular = FilePreviewMother.createNonTabular() -const fileTabular = FilePreviewMother.createTabular() -const fileRepository = {} as FileRepository +const nonTabularType = FileTypeMother.createText() +const downloadUrls = FileDownloadUrlsMother.create() describe('FileDownloadOptions', () => { - beforeEach(() => { - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - canDownloadFile: true - }) - ) - }) - it('renders the download options header', () => { cy.customMount( - - - + ) cy.findByRole('heading', { name: 'Download Options' }).should('exist') }) it('does not render the download options if the user does not have permissions', () => { - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - canDownloadFile: false - }) - ) - cy.customMount( - - - + ) cy.findByRole('heading', { name: 'Download Options' }).should('not.exist') @@ -44,19 +37,28 @@ describe('FileDownloadOptions', () => { it('renders the download options for a non-tabular file', () => { cy.customMount( - - {' '} - + ) cy.findByRole('link', { name: 'Plain Text' }).should('exist') }) it('renders the download options for a tabular file', () => { + const tabularType = FileTypeMother.createTabular() cy.customMount( - - - + ) cy.findByRole('link', { name: 'Comma Separated Values (Original File Format)' }).should('exist') From d9eeee6a63983345bc89a262efe0f34860e22a9c Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 11:48:24 +0100 Subject: [PATCH 05/11] refactor: RequestAccessOptions --- .../access-file-menu/AccessFileMenu.tsx | 9 +- .../access-file-menu/RequestAccessOption.tsx | 35 ++--- .../files/domain/models/FileAccessMother.ts | 11 +- .../files/domain/models/FileMother.ts | 2 +- .../files/domain/models/FilePreviewMother.ts | 4 +- .../RequestAccessOption.spec.tsx | 121 ++++++++++-------- 6 files changed, 108 insertions(+), 74 deletions(-) diff --git a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx index f3504ae45..967a6efc9 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx @@ -6,6 +6,7 @@ import { DropdownButton, DropdownHeader, Tooltip } from '@iqss/dataverse-design- import { useTranslation } from 'react-i18next' import { FileDownloadOptions } from './FileDownloadOptions' import { useFileDownloadPermission } from '../../file-permissions/useFileDownloadPermission' +import { FilePublishingStatus } from '../../../../files/domain/models/FileVersion' interface FileActionButtonAccessFileProps { file: FilePreview @@ -27,7 +28,13 @@ export function AccessFileMenu({ file }: FileActionButtonAccessFileProps) { {t('actions.accessFileMenu.headers.fileAccess')} - + } - if (file.metadata.isActivelyEmbargoed) { - if (file.access.restricted) { + if (isActivelyEmbargoed) { + if (access.restricted) { return ( {t('requestAccess.embargoedThenRestricted')}. @@ -29,15 +34,15 @@ export function RequestAccessOption({ file }: RequestAccessButtonProps) { } return {t('requestAccess.embargoed')}. } - if (!file.access.canBeRequested) { + if (!access.canBeRequested) { return {t('requestAccess.requestNotAllowed')}. } - if (file.access.requested) { + if (access.requested) { return ( {t('requestAccess.accessRequested')} ) } - return + return } diff --git a/tests/component/files/domain/models/FileAccessMother.ts b/tests/component/files/domain/models/FileAccessMother.ts index 79a7101a7..5a7cf2405 100644 --- a/tests/component/files/domain/models/FileAccessMother.ts +++ b/tests/component/files/domain/models/FileAccessMother.ts @@ -12,7 +12,7 @@ export class FileAccessMother { } } - static createNotRestricted(): FileAccess { + static createPublic(): FileAccess { return this.create({ restricted: false, latestVersionRestricted: false, @@ -57,6 +57,15 @@ export class FileAccessMother { }) } + static createWithAccessRequestNotAllowed(): FileAccess { + return this.create({ + restricted: true, + latestVersionRestricted: true, + canBeRequested: false, + requested: false + }) + } + static createWithAccessRequestPending(): FileAccess { return this.create({ restricted: true, diff --git a/tests/component/files/domain/models/FileMother.ts b/tests/component/files/domain/models/FileMother.ts index 74b0dd105..3b125ad89 100644 --- a/tests/component/files/domain/models/FileMother.ts +++ b/tests/component/files/domain/models/FileMother.ts @@ -25,7 +25,7 @@ export class FileMother { name: 'File Title', datasetVersion: DatasetVersionMother.createRealistic(), citation: FileCitationMother.create('File Title'), - access: FileAccessMother.createNotRestricted(), + access: FileAccessMother.createPublic(), permissions: FileUserPermissionsMother.createWithAllPermissionsGranted(), metadata: FileMetadataMother.createDefault(), ...props diff --git a/tests/component/files/domain/models/FilePreviewMother.ts b/tests/component/files/domain/models/FilePreviewMother.ts index 2e4828bae..5fc9f7d27 100644 --- a/tests/component/files/domain/models/FilePreviewMother.ts +++ b/tests/component/files/domain/models/FilePreviewMother.ts @@ -26,7 +26,7 @@ export class FilePreviewMother { return this.create({ name: 'File Title', version: FileVersionMother.createReleased(), - access: FileAccessMother.createNotRestricted(), + access: FileAccessMother.createPublic(), ingest: FileIngestMother.createIngestNone(), metadata: FileMetadataMother.createDefault(), ...props @@ -48,7 +48,7 @@ export class FilePreviewMother { static createWithPublicAccess(): FilePreview { return this.createDefault({ - access: FileAccessMother.createNotRestricted(), + access: FileAccessMother.createPublic(), metadata: FileMetadataMother.createNotEmbargoed() }) } diff --git a/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx index 23a6e98e1..18c39fa31 100644 --- a/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/RequestAccessOption.spec.tsx @@ -1,13 +1,19 @@ import { RequestAccessOption } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/RequestAccessOption' -import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' -import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' -import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' +import { FileAccessMother } from '../../../../files/domain/models/FileAccessMother' +const access = FileAccessMother.create() describe('RequestAccessOption', () => { it('renders the embargoed message when the file is embargoed', () => { - const fileEmbargoed = FilePreviewMother.createWithEmbargo() - cy.customMount() + const accessPublic = FileAccessMother.createPublic() + cy.customMount( + + ) cy.findByRole('button', { name: 'Files are unavailable during the specified embargo.' }) .should('exist') @@ -15,8 +21,16 @@ describe('RequestAccessOption', () => { }) it('renders the embargo then restricted message when the file is embargoed and restricted', () => { - const fileEmbargoedRestricted = FilePreviewMother.createWithEmbargoRestricted() - cy.customMount() + const accessRestricted = FileAccessMother.createRestricted() + cy.customMount( + + ) cy.findByRole('button', { name: 'Files are unavailable during the specified embargo and restricted after that.' @@ -26,8 +40,16 @@ describe('RequestAccessOption', () => { }) it('renders the Users may not request access to files. message when the file is restricted and access request is not allowed', () => { - const fileRestricted = FilePreviewMother.createRestricted() - cy.customMount() + const accessRequestNotAllowed = FileAccessMother.createWithAccessRequestNotAllowed() + cy.customMount( + + ) cy.findByRole('button', { name: 'Users may not request access to files.' }) .should('exist') @@ -35,16 +57,32 @@ describe('RequestAccessOption', () => { }) it('renders the request access button when the file is restricted and can be requested', () => { - const fileRestrictedCanBeRequested = FilePreviewMother.createWithAccessRequestAllowed() - cy.customMount() + const accessRequestAllowed = FileAccessMother.createWithAccessRequestAllowed() + cy.customMount( + + ) cy.findByRole('button', { name: 'Request Access' }).should('exist') }) it('renders the access requested message when hen the file is restricted and the access has already been requested', () => { - const fileAlreadyRequested = FilePreviewMother.createWithAccessRequestPending() + const accessRequestPending = FileAccessMother.createWithAccessRequestPending() - cy.customMount() + cy.customMount( + + ) cy.findByRole('button', { name: 'Access Requested' }) .should('exist') @@ -52,34 +90,14 @@ describe('RequestAccessOption', () => { }) it('does not render the request access button when the file is deaccessioned', () => { - const fileDeaccessioned = FilePreviewMother.createDeaccessioned() - cy.customMount() - - cy.findByRole('button', { name: 'Users may not request access to files.' }).should('not.exist') - cy.findByRole('button', { name: 'Request Access' }).should('not.exist') - cy.findByRole('button', { name: 'Access Requested' }).should('not.exist') - cy.findByRole('button', { name: 'Files are unavailable during the specified embargo.' }).should( - 'not.exist' - ) - cy.findByRole('button', { - name: 'Files are unavailable during the specified embargo and restricted after that.' - }).should('not.exist') - }) - - it('does not render the request access button when the file status is public', () => { - const filePublic = FilePreviewMother.createWithPublicAccess() - const fileRepository: FileRepository = {} as FileRepository - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - fileId: filePublic.id, - canDownloadFile: true - }) - ) - cy.customMount( - - - + ) cy.findByRole('button', { name: 'Users may not request access to files.' }).should('not.exist') @@ -93,20 +111,15 @@ describe('RequestAccessOption', () => { }).should('not.exist') }) - it('does not render the request access button when the file status is restricted with access granted', () => { - const fileRestrictedWithAccess = FilePreviewMother.createRestrictedWithAccessGranted() - const fileRepository: FileRepository = {} as FileRepository - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - fileId: fileRestrictedWithAccess.id, - canDownloadFile: true - }) - ) - + it('does not render the request access button when the user has download permission', () => { cy.customMount( - - - + ) cy.findByRole('button', { name: 'Users may not request access to files.' }).should('not.exist') From c794027dfcbc763fadabb3ae81df21460dc51def Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 12:00:42 +0100 Subject: [PATCH 06/11] refactor: AccessStatus component --- .../access-file-menu/AccessFileMenu.tsx | 6 +- .../access-file-menu/AccessStatus.tsx | 57 ++++++------- .../access-file-menu/AccessStatus.spec.tsx | 82 ++++++++----------- 3 files changed, 68 insertions(+), 77 deletions(-) diff --git a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx index 967a6efc9..e98fec247 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx @@ -27,7 +27,11 @@ export function AccessFileMenu({ file }: FileActionButtonAccessFileProps) { {t('actions.accessFileMenu.headers.fileAccess')} - + {' '} @@ -29,15 +32,15 @@ export function AccessStatus({ file }: AccessStatusProps) { } function AccessStatusIcon({ - sessionUserHasFileDownloadPermission, - restricted + userHasDownloadPermission, + isRestricted }: { - sessionUserHasFileDownloadPermission: boolean - restricted: boolean + userHasDownloadPermission: boolean + isRestricted: boolean }) { const { t } = useTranslation('file') - if (restricted) { - if (sessionUserHasFileDownloadPermission) { + if (isRestricted) { + if (userHasDownloadPermission) { return ( ) @@ -48,20 +51,22 @@ function AccessStatusIcon({ } function AccessStatusText({ - file, - sessionUserHasFileDownloadPermission + isActivelyEmbargoed, + isRestricted, + userHasDownloadPermission }: { - file: FilePreview - sessionUserHasFileDownloadPermission: boolean + isActivelyEmbargoed: boolean + isRestricted: boolean + userHasDownloadPermission: boolean }) { const { t } = useTranslation('file') const getAccessStatus = () => { - if (file.metadata.isActivelyEmbargoed) { + if (isActivelyEmbargoed) { return 'embargoed' } - if (file.access.restricted) { - if (!sessionUserHasFileDownloadPermission) { + if (isRestricted) { + if (!userHasDownloadPermission) { return 'restricted' } @@ -74,11 +79,7 @@ function AccessStatusText({ return ( {t(`fileAccess.${getAccessStatus()}.name`)} diff --git a/tests/component/sections/file/file-action-buttons/access-file-menu/AccessStatus.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessStatus.spec.tsx index b0f40e2bc..93d86bf4f 100644 --- a/tests/component/sections/file/file-action-buttons/access-file-menu/AccessStatus.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessStatus.spec.tsx @@ -1,41 +1,50 @@ import { AccessStatus } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/AccessStatus' import styles from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.module.scss' -import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' -import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' -import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' describe('AccessStatus', () => { + it('renders the access status public when is not restricted and the user does not have permissions', () => { + cy.customMount( + + ) + + cy.findByText('Public').should('exist').should('have.class', styles.success) + cy.findByText('Public File Icon').should('exist') + }) + + it('renders the the public embargoed status then the file is not restricted but its embargoed', () => { + cy.customMount( + + ) + + cy.findByText('Embargoed').should('exist').should('have.class', styles.danger) + cy.findByText('Public File Icon').should('exist') + }) + it('renders the access status public', () => { - const filePublic = FilePreviewMother.createWithPublicAccess() - cy.customMount() + cy.customMount( + + ) cy.findByText('Public').should('exist').should('have.class', styles.success) cy.findByText('Public File Icon').should('exist') }) it('renders the access status restricted', () => { - const fileRestricted = FilePreviewMother.createRestricted() - cy.customMount() + cy.customMount( + + ) cy.findByText('Restricted').should('exist').should('have.class', styles.danger) cy.findByText('Restricted File Icon').should('exist') }) it('renders the access status restricted with access', () => { - const fileRestrictedWithAccess = FilePreviewMother.createRestrictedWithAccessGranted() - const fileRepository: FileRepository = {} as FileRepository - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - fileId: fileRestrictedWithAccess.id, - canDownloadFile: true - }) - ) - cy.customMount( - - - + ) cy.findByText('Restricted with Access Granted') @@ -45,19 +54,8 @@ describe('AccessStatus', () => { }) it('renders the access status embargoed', () => { - const fileRestrictedWithAccess = FilePreviewMother.createRestrictedWithAccessGranted() - const fileRepository: FileRepository = {} as FileRepository - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - fileId: fileRestrictedWithAccess.id, - canDownloadFile: true - }) - ) - const fileEmbargoed = FilePreviewMother.createWithEmbargo() cy.customMount( - - {' '} - + ) cy.findByText('Embargoed').should('exist').should('have.class', styles.success) @@ -65,28 +63,16 @@ describe('AccessStatus', () => { }) it('renders the access status embargoed restricted', () => { - const fileEmbargoedRestricted = FilePreviewMother.createWithEmbargoRestricted() - cy.customMount() + cy.customMount( + + ) cy.findByText('Embargoed').should('exist').should('have.class', styles.danger) cy.findByText('Restricted File Icon').should('exist') }) it('renders the access status embargoed restricted with access', () => { - const fileRestrictedWithAccess = FilePreviewMother.createRestrictedWithAccessGranted() - const fileRepository: FileRepository = {} as FileRepository - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - fileId: fileRestrictedWithAccess.id, - canDownloadFile: true - }) - ) - const fileEmbargoedRestricted = FilePreviewMother.createWithEmbargoRestricted() - cy.customMount( - - {' '} - - ) + cy.customMount() cy.findByText('Embargoed').should('exist').should('have.class', styles.success) cy.findByText('Restricted with access Icon').should('exist') From 55c185f6bbc986624b8c8d550c6b8d7aa63c92d4 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 12:28:25 +0100 Subject: [PATCH 07/11] refactor: AccessFileMenu component --- .../file-action-buttons/FileActionButtons.tsx | 13 +- .../access-file-menu/AccessFileMenu.tsx | 50 +++++--- .../file-thumbnail/FileThumbnail.stories.tsx | 4 +- .../AccessFileMenu.stories.tsx | 116 ++++++++++++++++-- .../files/domain/models/FileAccessMother.ts | 9 -- .../files/domain/models/FilePreviewMother.ts | 14 --- .../file-thumbnail/FileThumbnail.spec.tsx | 4 +- .../access-file-menu/AccessFileMenu.spec.tsx | 84 ++++++++----- 8 files changed, 205 insertions(+), 89 deletions(-) diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx index 06cfc218f..99f611697 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx @@ -3,15 +3,26 @@ import { FilePreview } from '../../../../../../../files/domain/models/FilePrevie import { FileOptionsMenu } from './file-options-menu/FileOptionsMenu' import { ButtonGroup } from '@iqss/dataverse-design-system' import { useTranslation } from 'react-i18next' +import { FilePublishingStatus } from '../../../../../../../files/domain/models/FileVersion' +import { useFileDownloadPermission } from '../../../../../../file/file-permissions/useFileDownloadPermission' interface FileActionButtonsProps { file: FilePreview } export function FileActionButtons({ file }: FileActionButtonsProps) { const { t } = useTranslation('files') + const { sessionUserHasFileDownloadPermission } = useFileDownloadPermission(file) + return ( - + ) diff --git a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx index e98fec247..71a2914d2 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx @@ -1,25 +1,35 @@ -import { FilePreview } from '../../../../files/domain/models/FilePreview' import { Download, FileEarmark } from 'react-bootstrap-icons' import { AccessStatus } from './AccessStatus' import { RequestAccessOption } from './RequestAccessOption' import { DropdownButton, DropdownHeader, Tooltip } from '@iqss/dataverse-design-system' import { useTranslation } from 'react-i18next' import { FileDownloadOptions } from './FileDownloadOptions' -import { useFileDownloadPermission } from '../../file-permissions/useFileDownloadPermission' -import { FilePublishingStatus } from '../../../../files/domain/models/FileVersion' +import { FileAccess } from '../../../../files/domain/models/FileAccess' +import { FileMetadata } from '../../../../files/domain/models/FileMetadata' interface FileActionButtonAccessFileProps { - file: FilePreview + id: number + access: FileAccess + userHasDownloadPermission: boolean + metadata: FileMetadata + ingestInProgress: boolean + isDeaccessioned: boolean } -export function AccessFileMenu({ file }: FileActionButtonAccessFileProps) { +export function AccessFileMenu({ + id, + access, + userHasDownloadPermission, + metadata, + ingestInProgress, + isDeaccessioned +}: FileActionButtonAccessFileProps) { const { t } = useTranslation('files') - const { sessionUserHasFileDownloadPermission } = useFileDownloadPermission(file) return ( diff --git a/src/stories/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.stories.tsx b/src/stories/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.stories.tsx index 8b4701d4e..3737e69c6 100644 --- a/src/stories/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.stories.tsx +++ b/src/stories/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.stories.tsx @@ -39,7 +39,7 @@ export const WithThumbnailRestrictedLockedIcon: Story = { export const WithThumbnailRestrictedUnlockedIcon: Story = { decorators: [WithFilePermissionsGranted], render: () => { - const file = FilePreviewMother.createRestrictedWithAccessGranted() + const file = FilePreviewMother.createRestricted() return } } @@ -47,7 +47,7 @@ export const WithThumbnailRestrictedUnlockedIcon: Story = { export const WithThumbnailPreviewRestrictedUnlockedIcon: Story = { decorators: [WithFilePermissionsGranted], render: () => { - const file = FilePreviewMother.createWithThumbnailRestrictedWithAccessGranted() + const file = FilePreviewMother.createWithThumbnailRestricted() return } } diff --git a/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx b/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx index cbe3f9c11..58724a360 100644 --- a/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx +++ b/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx @@ -3,7 +3,8 @@ import { AccessFileMenu } from '../../../../sections/file/file-action-buttons/ac import { WithI18next } from '../../../WithI18next' import { WithSettings } from '../../../WithSettings' import { WithFilePermissionsGranted } from '../../file-permission/WithFilePermissionsGranted' -import { FilePreviewMother } from '../../../../../tests/component/files/domain/models/FilePreviewMother' +import { FileAccessMother } from '../../../../../tests/component/files/domain/models/FileAccessMother' +import { FileMetadataMother } from '../../../../../tests/component/files/domain/models/FileMetadataMother' const meta: Meta = { title: 'Sections/File Page/Action Buttons/AccessFileMenu', @@ -15,40 +16,133 @@ export default meta type Story = StoryObj export const Default: Story = { - decorators: [WithFilePermissionsGranted], - render: () => + render: () => ( + + ) } export const NonTabularFiles: Story = { - render: () => + render: () => ( + + ) } export const TabularFiles: Story = { - render: () => + render: () => ( + + ) } export const Restricted: Story = { - render: () => + render: () => ( + + ) } export const RestrictedWithAccessRequestAllowed: Story = { - render: () => + render: () => ( + + ) } export const RestrictedWithAccessRequestPending: Story = { - render: () => + render: () => ( + + ) } export const RestrictedWithAccessGranted: Story = { decorators: [WithFilePermissionsGranted], - render: () => + render: () => ( + + ) } export const WithEmbargo: Story = { decorators: [WithFilePermissionsGranted], - render: () => + render: () => ( + + ) } export const WithEmbargoAndRestricted: Story = { - render: () => + render: () => ( + + ) +} + +export const WithEmbargoAndRestrictedWithAccessGranted: Story = { + render: () => ( + + ) } diff --git a/tests/component/files/domain/models/FileAccessMother.ts b/tests/component/files/domain/models/FileAccessMother.ts index 5a7cf2405..10e0315c3 100644 --- a/tests/component/files/domain/models/FileAccessMother.ts +++ b/tests/component/files/domain/models/FileAccessMother.ts @@ -39,15 +39,6 @@ export class FileAccessMother { }) } - static createWithAccessGranted(): FileAccess { - return this.create({ - restricted: true, - latestVersionRestricted: true, - canBeRequested: true, - requested: false - }) - } - static createWithAccessRequestAllowed(): FileAccess { return this.create({ restricted: true, diff --git a/tests/component/files/domain/models/FilePreviewMother.ts b/tests/component/files/domain/models/FilePreviewMother.ts index 5fc9f7d27..07cf0a898 100644 --- a/tests/component/files/domain/models/FilePreviewMother.ts +++ b/tests/component/files/domain/models/FilePreviewMother.ts @@ -67,13 +67,6 @@ export class FilePreviewMother { }) } - static createRestrictedWithAccessGranted(): FilePreview { - return this.createDefault({ - access: FileAccessMother.createWithAccessGranted(), - metadata: FileMetadataMother.createNotEmbargoed() - }) - } - static createWithAccessRequestAllowed(): FilePreview { return this.createDefault({ access: FileAccessMother.createWithAccessRequestAllowed(), @@ -94,13 +87,6 @@ export class FilePreviewMother { }) } - static createWithThumbnailRestrictedWithAccessGranted(): FilePreview { - return this.createDefault({ - access: FileAccessMother.createWithAccessGranted(), - metadata: FileMetadataMother.createWithThumbnail() - }) - } - static createWithThumbnailRestricted(): FilePreview { return this.createDefault({ access: FileAccessMother.createRestricted(), diff --git a/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.spec.tsx b/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.spec.tsx index 85474e633..2428861fa 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/file-thumbnail/FileThumbnail.spec.tsx @@ -41,7 +41,7 @@ describe('FileThumbnail', () => { }) it('renders FilePreviewImage when thumbnail is provided with unlocked icon if restricted with access', () => { - const file = FilePreviewMother.createWithThumbnailRestrictedWithAccessGranted() + const file = FilePreviewMother.createWithThumbnailRestricted() fileRepository.getUserPermissionsById = cy.stub().resolves( FileUserPermissionsMother.create({ fileId: file.id, @@ -104,7 +104,7 @@ describe('FileThumbnail', () => { }) it('renders FileIcon when thumbnail is not provided with unlock icon when restricted with access', () => { - const file = FilePreviewMother.createRestrictedWithAccessGranted() + const file = FilePreviewMother.createRestricted() fileRepository.getUserPermissionsById = cy.stub().resolves( FileUserPermissionsMother.create({ fileId: file.id, diff --git a/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx index 93f66278b..f303609a5 100644 --- a/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx @@ -1,29 +1,35 @@ import { AccessFileMenu } from '../../../../../../src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu' +import { FileAccessMother } from '../../../../files/domain/models/FileAccessMother' +import { FileMetadataMother } from '../../../../files/domain/models/FileMetadataMother' import { Suspense } from 'react' -import { FilePermissionsProvider } from '../../../../../../src/sections/file/file-permissions/FilePermissionsProvider' -import { FileRepository } from '../../../../../../src/files/domain/repositories/FileRepository' -import { FileUserPermissionsMother } from '../../../../files/domain/models/FileUserPermissionsMother' -import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' -const file = FilePreviewMother.create() - -const fileRepository = {} as FileRepository describe('AccessFileMenu', () => { - beforeEach(() => { - fileRepository.getUserPermissionsById = cy.stub().resolves( - FileUserPermissionsMother.create({ - canDownloadFile: true - }) - ) - }) it('renders the access file menu', () => { - cy.customMount() + cy.customMount( + + ) cy.findByRole('button', { name: 'Access File' }).should('exist') }) it('renders the access file menu with tooltip', () => { - cy.customMount() + cy.customMount( + + ) cy.findByRole('button', { name: 'Access File' }).trigger('mouseover') cy.findByRole('tooltip', { name: 'Access File' }).should('exist') @@ -32,7 +38,14 @@ describe('AccessFileMenu', () => { it('renders the menu headers', () => { cy.customMount( - + ) @@ -41,11 +54,15 @@ describe('AccessFileMenu', () => { }) it('renders the access status of the file', () => { - const filePublic = FilePreviewMother.createWithPublicAccess() cy.customMount( - - - + ) cy.findByRole('button', { name: 'Access File' }).click() @@ -53,12 +70,15 @@ describe('AccessFileMenu', () => { }) it('renders the request access button', () => { - const fileRestrictedWithAccessRequestAllowed = - FilePreviewMother.createWithAccessRequestAllowed() cy.customMount( - - - + ) cy.findByRole('button', { name: 'Access File' }).click() @@ -66,11 +86,15 @@ describe('AccessFileMenu', () => { }) it('renders the download options header', () => { - const filePublic = FilePreviewMother.createWithPublicAccess() cy.customMount( - - - + ) cy.findByRole('button', { name: 'Access File' }).click() From bdd121857b7d026fec0b5ab9fb2716556d8fd342 Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 12:36:19 +0100 Subject: [PATCH 08/11] feat: add AccessFile button to File Page --- src/files/domain/models/File.ts | 3 +++ src/sections/file/File.tsx | 14 ++++++++++++++ tests/component/files/domain/models/FileMother.ts | 3 +++ tests/component/sections/file/File.spec.tsx | 1 + 4 files changed, 21 insertions(+) diff --git a/src/files/domain/models/File.ts b/src/files/domain/models/File.ts index c39cb7154..08135ffed 100644 --- a/src/files/domain/models/File.ts +++ b/src/files/domain/models/File.ts @@ -3,8 +3,10 @@ import { FileMetadata } from './FileMetadata' import { FileVersion } from './FileVersion' import { FileAccess } from './FileAccess' import { FileUserPermissions } from './FileUserPermissions' +import { FileIngest } from './FileIngest' export interface File { + id: number version: FileVersion name: string access: FileAccess @@ -12,4 +14,5 @@ export interface File { citation: string permissions: FileUserPermissions metadata: FileMetadata + ingest: FileIngest } diff --git a/src/sections/file/File.tsx b/src/sections/file/File.tsx index 777e37baa..45b57502d 100644 --- a/src/sections/file/File.tsx +++ b/src/sections/file/File.tsx @@ -12,6 +12,8 @@ import { FileCitation } from './file-citation/FileCitation' import { DatasetLabels } from '../dataset/dataset-labels/DatasetLabels' import { FileAccessRestrictedIcon } from './file-access/FileAccessRestrictedIcon' import { FileMetadata } from './file-metadata/FileMetadata' +import { AccessFileMenu } from './file-action-buttons/access-file-menu/AccessFileMenu' +import { FilePublishingStatus } from '../../files/domain/models/FileVersion' interface FileProps { repository: FileRepository @@ -61,6 +63,18 @@ export function File({ repository, id }: FileProps) { {t('datasetCitationTitle')} + + + diff --git a/tests/component/files/domain/models/FileMother.ts b/tests/component/files/domain/models/FileMother.ts index 3b125ad89..85bed0f08 100644 --- a/tests/component/files/domain/models/FileMother.ts +++ b/tests/component/files/domain/models/FileMother.ts @@ -5,10 +5,12 @@ import { FileVersionMother } from './FileVersionMother' import { FileAccessMother } from './FileAccessMother' import { FileUserPermissionsMother } from './FileUserPermissionsMother' import { faker } from '@faker-js/faker' +import { FileIngestMother } from './FileIngestMother' export class FileMother { static create(props?: Partial): File { return { + id: faker.datatype.number(), name: faker.system.fileName(), version: FileVersionMother.create(), datasetVersion: DatasetVersionMother.create(), @@ -16,6 +18,7 @@ export class FileMother { access: FileAccessMother.create(), metadata: FileMetadataMother.create(), permissions: FileUserPermissionsMother.create(), + ingest: FileIngestMother.create(), ...props } } diff --git a/tests/component/sections/file/File.spec.tsx b/tests/component/sections/file/File.spec.tsx index f006dbf1a..88b91db73 100644 --- a/tests/component/sections/file/File.spec.tsx +++ b/tests/component/sections/file/File.spec.tsx @@ -24,6 +24,7 @@ describe('File', () => { cy.findByText('Version 1.0').should('exist') cy.findByRole('tab', { name: 'Metadata' }).should('exist') cy.findByRole('button', { name: 'File Metadata' }).should('exist') + cy.findByRole('button', { name: 'Access File' }).should('exist') }) it('renders skeleton while loading', () => { From 738be87af4b10df9b92a1775a75a0c4fa8351f2a Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 16:28:11 +0100 Subject: [PATCH 09/11] feat(AccesFileMenu): add asIcon prop to rehuse the component --- public/locales/en/file.json | 3 ++ .../file-action-buttons/FileActionButtons.tsx | 1 + src/sections/file/File.module.scss | 6 +++ src/sections/file/File.tsx | 27 ++++++++------ .../access-file-menu/AccessFileMenu.tsx | 25 ++++++++++--- tests/component/sections/file/File.spec.tsx | 2 +- .../access-file-menu/AccessFileMenu.spec.tsx | 37 ++++++++++++++++++- 7 files changed, 82 insertions(+), 19 deletions(-) diff --git a/public/locales/en/file.json b/public/locales/en/file.json index 95a92ccb5..86231a113 100644 --- a/public/locales/en/file.json +++ b/public/locales/en/file.json @@ -45,5 +45,8 @@ "directory": "File Path", "description": "Description" } + }, + "actionButtons": { + "title": "File Action Buttons" } } diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx index 99f611697..1875ba1ae 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/FileActionButtons.tsx @@ -22,6 +22,7 @@ export function FileActionButtons({ file }: FileActionButtonsProps) { metadata={file.metadata} isDeaccessioned={file.version.publishingStatus === FilePublishingStatus.DEACCESSIONED} ingestInProgress={file.ingest.isInProgress} + asIcon /> diff --git a/src/sections/file/File.module.scss b/src/sections/file/File.module.scss index 1d4c600db..69b04f28c 100644 --- a/src/sections/file/File.module.scss +++ b/src/sections/file/File.module.scss @@ -38,4 +38,10 @@ .restricted-icon { margin-right: 6px; +} + +.group { + display: flex; + width: 100%; + margin: 0.5rem 0; } \ No newline at end of file diff --git a/src/sections/file/File.tsx b/src/sections/file/File.tsx index 45b57502d..8ff124f28 100644 --- a/src/sections/file/File.tsx +++ b/src/sections/file/File.tsx @@ -1,7 +1,7 @@ import { useTranslation } from 'react-i18next' import { PageNotFound } from '../page-not-found/PageNotFound' import styles from './File.module.scss' -import { Col, Row, Tabs } from '@iqss/dataverse-design-system' +import { ButtonGroup, Col, Row, Tabs } from '@iqss/dataverse-design-system' import { FileRepository } from '../../files/domain/repositories/FileRepository' import { useFile } from './useFile' import { useEffect } from 'react' @@ -64,16 +64,21 @@ export function File({ repository, id }: FileProps) { - + + + diff --git a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx index 71a2914d2..46871775b 100644 --- a/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx +++ b/src/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.tsx @@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next' import { FileDownloadOptions } from './FileDownloadOptions' import { FileAccess } from '../../../../files/domain/models/FileAccess' import { FileMetadata } from '../../../../files/domain/models/FileMetadata' +import { ReactElement } from 'react' interface FileActionButtonAccessFileProps { id: number @@ -14,6 +15,7 @@ interface FileActionButtonAccessFileProps { metadata: FileMetadata ingestInProgress: boolean isDeaccessioned: boolean + asIcon?: boolean } export function AccessFileMenu({ @@ -22,18 +24,29 @@ export function AccessFileMenu({ userHasDownloadPermission, metadata, ingestInProgress, - isDeaccessioned + isDeaccessioned, + asIcon = false }: FileActionButtonAccessFileProps) { const { t } = useTranslation('files') + function MenuWrapper({ children }: { children: ReactElement }) { + if (asIcon) { + return ( + + {children} + + ) + } + return children + } return ( - + }> + variant={asIcon ? 'secondary' : 'primary'} + icon={asIcon ? : undefined}> {t('actions.accessFileMenu.headers.fileAccess')} @@ -57,6 +70,6 @@ export function AccessFileMenu({ userHasDownloadPermission={userHasDownloadPermission} /> - + ) } diff --git a/tests/component/sections/file/File.spec.tsx b/tests/component/sections/file/File.spec.tsx index 88b91db73..ad3eab491 100644 --- a/tests/component/sections/file/File.spec.tsx +++ b/tests/component/sections/file/File.spec.tsx @@ -24,7 +24,7 @@ describe('File', () => { cy.findByText('Version 1.0').should('exist') cy.findByRole('tab', { name: 'Metadata' }).should('exist') cy.findByRole('button', { name: 'File Metadata' }).should('exist') - cy.findByRole('button', { name: 'Access File' }).should('exist') + cy.findByRole('group', { name: 'File Action Buttons' }).should('exist') }) it('renders skeleton while loading', () => { diff --git a/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx index f303609a5..e3821e522 100644 --- a/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/access-file-menu/AccessFileMenu.spec.tsx @@ -19,7 +19,7 @@ describe('AccessFileMenu', () => { cy.findByRole('button', { name: 'Access File' }).should('exist') }) - it('renders the access file menu with tooltip', () => { + it('renders the access file menu with tooltip when asIcon is true', () => { cy.customMount( { userHasDownloadPermission ingestInProgress={false} isDeaccessioned={false} + asIcon /> ) @@ -35,6 +36,23 @@ describe('AccessFileMenu', () => { cy.findByRole('tooltip', { name: 'Access File' }).should('exist') }) + it('does not render the access file menu with tooltip when asIcon is false', () => { + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Access File' }).trigger('mouseover') + cy.findByRole('tooltip', { name: 'Access File' }).should('not.exist') + }) + it('renders the menu headers', () => { cy.customMount( @@ -100,4 +118,21 @@ describe('AccessFileMenu', () => { cy.findByRole('button', { name: 'Access File' }).click() cy.findByRole('heading', { name: 'Download Options' }).should('exist') }) + + it('renders the button as an icon when asIcon is true', () => { + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Access File' }).should('exist') + cy.get('svg').should('exist') + }) }) From aa029a4cc2a83226355d8c145d49a0a735dd2d3c Mon Sep 17 00:00:00 2001 From: MellyGray Date: Wed, 24 Jan 2024 16:54:09 +0100 Subject: [PATCH 10/11] feat(AccessFileMenu): add asIcon story --- .../access-file-menu/AccessFileMenu.stories.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx b/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx index 58724a360..00632dc73 100644 --- a/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx +++ b/src/stories/file/file-action-buttons/access-file-menu/AccessFileMenu.stories.tsx @@ -28,6 +28,20 @@ export const Default: Story = { ) } +export const AsIcon: Story = { + render: () => ( + + ) +} + export const NonTabularFiles: Story = { render: () => ( Date: Wed, 24 Jan 2024 17:04:37 +0100 Subject: [PATCH 11/11] fix: typescript errors --- .../infrastructure/mappers/JSFileIngestMapper.ts | 4 ++-- .../file-info-messages/IngestInfoMessage.tsx | 4 ++-- .../files/domain/models/FileIngestMother.ts | 13 ++++++------- .../files/domain/models/FileMetadataMother.ts | 7 +++++++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/files/infrastructure/mappers/JSFileIngestMapper.ts b/src/files/infrastructure/mappers/JSFileIngestMapper.ts index 0e4381e59..a18192b79 100644 --- a/src/files/infrastructure/mappers/JSFileIngestMapper.ts +++ b/src/files/infrastructure/mappers/JSFileIngestMapper.ts @@ -1,7 +1,7 @@ -import { FileIngestStatus } from '../../domain/models/FileIngest' +import { FileIngest, FileIngestStatus } from '../../domain/models/FileIngest' export class JSFileIngestMapper { static toFileIngest() { - return { status: FileIngestStatus.NONE } // TODO - Implement this when it is added to js-dataverse + return new FileIngest(FileIngestStatus.NONE) // TODO - Implement this when it is added to js-dataverse } } diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-info-messages/IngestInfoMessage.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-info-messages/IngestInfoMessage.tsx index 7f7a632ca..a9ce3c387 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-info-messages/IngestInfoMessage.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-info-messages/IngestInfoMessage.tsx @@ -31,9 +31,9 @@ export function IngestInfoMessage({ ingest }: IngestInfoMessageProps) { {t('ingest.error.tabularIngest')} {' '} - {ingest.reportMessage + {ingest.message ? t('ingest.error.reportMessage', { - reportMessage: ingest.reportMessage + reportMessage: ingest.message }) : t('ingest.error.reportMessageDefault')}

diff --git a/tests/component/files/domain/models/FileIngestMother.ts b/tests/component/files/domain/models/FileIngestMother.ts index d92163da0..f971a82a0 100644 --- a/tests/component/files/domain/models/FileIngestMother.ts +++ b/tests/component/files/domain/models/FileIngestMother.ts @@ -3,21 +3,20 @@ import { FileIngest, FileIngestStatus } from '../../../../../src/files/domain/mo export class FileIngestMother { static create(props?: Partial): FileIngest { - return { - status: faker.helpers.arrayElement(Object.values(FileIngestStatus)), - reportMessage: faker.datatype.boolean() ? faker.lorem.sentence() : undefined, - ...props - } + return new FileIngest( + props?.status ?? faker.helpers.arrayElement(Object.values(FileIngestStatus)), + props?.message + ) } static createInProgress(): FileIngest { return this.create({ status: FileIngestStatus.IN_PROGRESS }) } - static createIngestProblem(reportMessage?: string): FileIngest { + static createIngestProblem(message?: string): FileIngest { return this.create({ status: FileIngestStatus.ERROR, - reportMessage: reportMessage + message: message }) } diff --git a/tests/component/files/domain/models/FileMetadataMother.ts b/tests/component/files/domain/models/FileMetadataMother.ts index ca6610bbf..978e46ed5 100644 --- a/tests/component/files/domain/models/FileMetadataMother.ts +++ b/tests/component/files/domain/models/FileMetadataMother.ts @@ -192,6 +192,13 @@ export class FileMetadataMother { ) } + static createDownloadUrl(): string { + const blob = new Blob(['Name,Age,Location\nJohn,25,New York\nJane,30,San Francisco'], { + type: 'text/csv' + }) + return URL.createObjectURL(blob) + } + static createDefault(props?: Partial): FileMetadata { const defaultFile = { type: FileTypeMother.createText(),