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(),