diff --git a/package-lock.json b/package-lock.json index 3a5da3082..df9042009 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.0.0-alpha.53", + "@iqss/dataverse-client-javascript": "v2.0.0-pr344.7810d21", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", @@ -3561,9 +3561,9 @@ }, "node_modules/@iqss/dataverse-client-javascript": { "name": "@IQSS/dataverse-client-javascript", - "version": "2.0.0-alpha.53", - "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-alpha.53/0a9acbda27e2bb1d97b7beb3518a278e8d264cc2", - "integrity": "sha512-7aG4YdPu6tFxYOILLRh8u47kXBRmEWJiYAQHDmQl4Y0eY0C+gR8ckDKSM0E9KAwvMUM/OhvDtTXkJOjEaD1aKQ==", + "version": "2.0.0-pr344.7810d21", + "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-pr344.7810d21/78d5c45a70f60d36ff6001ad8b5bc34e090c9f4a", + "integrity": "sha512-oUTS/09YXFztuFqG0CZrSPQi18dnPVkxoErK3f2fwFGg7i6evKTdaFwxYPVg3zhguP+wygSokXsRD+ZVd5NHAg==", "license": "MIT", "dependencies": { "@types/node": "^18.15.11", diff --git a/package.json b/package.json index 8fb033fb1..8c8cb92c6 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.0.0-alpha.53", + "@iqss/dataverse-client-javascript": "v2.0.0-pr344.5fd4982", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", diff --git a/public/locales/en/file.json b/public/locales/en/file.json index 99678032c..5582256f1 100644 --- a/public/locales/en/file.json +++ b/public/locales/en/file.json @@ -137,5 +137,6 @@ "defaultFileUnrestrictError": "Something went wrong unrestricting the file. Try again later.", "requestAccessTooltipText": "If checked, users can request access to the restricted files in this dataset.", "termsOfAccessTooltipTex": "information on how and if users can access restricted files in this dataset." - } + }, + "getCategoriesError": "Something went wrong fetching available categories. Try again later." } diff --git a/src/dataset/domain/repositories/DatasetRepository.ts b/src/dataset/domain/repositories/DatasetRepository.ts index 094911ea3..8aed0fc82 100644 --- a/src/dataset/domain/repositories/DatasetRepository.ts +++ b/src/dataset/domain/repositories/DatasetRepository.ts @@ -47,4 +47,5 @@ export interface DatasetRepository { includeMDC?: boolean ) => Promise deleteDatasetDraft: (datasetId: string | number) => Promise + getAvailableCategories: (datasetId: string | number) => Promise } diff --git a/src/dataset/domain/useCases/getAvailableCategories.ts b/src/dataset/domain/useCases/getAvailableCategories.ts new file mode 100644 index 000000000..1b5e622c7 --- /dev/null +++ b/src/dataset/domain/useCases/getAvailableCategories.ts @@ -0,0 +1,8 @@ +import { DatasetRepository } from '../repositories/DatasetRepository' + +export async function getAvailableCategories( + datasetRepository: DatasetRepository, + datasetId: string | number +): Promise { + return datasetRepository.getAvailableCategories(datasetId) +} diff --git a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts index 24ab731e6..e9d9c63cf 100644 --- a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts +++ b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts @@ -31,7 +31,8 @@ import { DatasetDeaccessionDTO, getDatasetVersionsSummaries, getDatasetDownloadCount, - deleteDatasetDraft + deleteDatasetDraft, + getDatasetAvailableCategories } from '@iqss/dataverse-client-javascript' import { JSDatasetMapper } from '../mappers/JSDatasetMapper' import { DatasetPaginationInfo } from '../../domain/models/DatasetPaginationInfo' @@ -375,6 +376,11 @@ export class DatasetJSDataverseRepository implements DatasetRepository { throw error }) } + + getAvailableCategories(datasetId: string | number): Promise { + return getDatasetAvailableCategories.execute(datasetId) + } + /* TODO: This is a temporary solution as this use case doesn't exist in js-dataverse yet and the API should also return the file store type rather than name only. After https://github.com/IQSS/dataverse/issues/11695 is implemented, create a js-dataverse use case. diff --git a/src/sections/dataset/Dataset.tsx b/src/sections/dataset/Dataset.tsx index 48acf0bd5..a9f786dfd 100644 --- a/src/sections/dataset/Dataset.tsx +++ b/src/sections/dataset/Dataset.tsx @@ -181,12 +181,14 @@ export function Dataset({ datasetVersion={dataset.version} canUpdateDataset={canUpdateDataset} key={dataset.version.publishingStatus} + datasetRepository={datasetRepository} /> ) : ( )} diff --git a/src/sections/dataset/dataset-files/DatasetFiles.tsx b/src/sections/dataset/dataset-files/DatasetFiles.tsx index df6a4820f..4a63331b0 100644 --- a/src/sections/dataset/dataset-files/DatasetFiles.tsx +++ b/src/sections/dataset/dataset-files/DatasetFiles.tsx @@ -7,17 +7,20 @@ import { useFiles } from './useFiles' import { PaginationControls } from '../../shared/pagination/PaginationControls' import { DatasetVersion } from '../../../dataset/domain/models/Dataset' import { FilePaginationInfo } from '../../../files/domain/models/FilePaginationInfo' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface DatasetFilesProps { filesRepository: FileRepository datasetPersistentId: string datasetVersion: DatasetVersion + datasetRepository: DatasetRepository } export function DatasetFiles({ filesRepository, datasetPersistentId, - datasetVersion + datasetVersion, + datasetRepository }: DatasetFilesProps) { const [paginationInfo, setPaginationInfo] = useState(new FilePaginationInfo()) const [criteria, setCriteria] = useState(new FileCriteria()) @@ -44,6 +47,7 @@ export function DatasetFiles({ paginationInfo={paginationInfo} filesTotalDownloadSize={filesTotalDownloadSize} criteria={criteria} + datasetRepository={datasetRepository} /> (null) const criteriaContainerRef = useRef(null) @@ -184,6 +187,7 @@ export function DatasetFilesScrollable({ isEmptyFiles={isEmptyFiles} accumulatedCount={accumulatedCount} fileRepository={filesRepository} + datasetRepository={datasetRepository} /> diff --git a/src/sections/dataset/dataset-files/files-table/FilesTable.tsx b/src/sections/dataset/dataset-files/files-table/FilesTable.tsx index 71fe5d903..b87252693 100644 --- a/src/sections/dataset/dataset-files/files-table/FilesTable.tsx +++ b/src/sections/dataset/dataset-files/files-table/FilesTable.tsx @@ -11,6 +11,7 @@ import { FileSelection } from './row-selection/useFileSelection' import { FileCriteria } from '../../../../files/domain/models/FileCriteria' import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginationInfo' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface FilesTableProps { files: FilePreview[] @@ -19,6 +20,7 @@ interface FilesTableProps { paginationInfo: FilePaginationInfo filesTotalDownloadSize: number criteria: FileCriteria + datasetRepository: DatasetRepository } export function FilesTable({ @@ -27,12 +29,14 @@ export function FilesTable({ paginationInfo, filesTotalDownloadSize, fileRepository, - criteria + criteria, + datasetRepository }: FilesTableProps) { const { table, fileSelection, selectAllFiles, clearFileSelection } = useFilesTable( files, paginationInfo, - fileRepository + fileRepository, + datasetRepository ) const [visitedPagination, setVisitedPagination] = useState(paginationInfo) diff --git a/src/sections/dataset/dataset-files/files-table/FilesTableColumnsDefinition.tsx b/src/sections/dataset/dataset-files/files-table/FilesTableColumnsDefinition.tsx index b88853cb8..373b8b92b 100644 --- a/src/sections/dataset/dataset-files/files-table/FilesTableColumnsDefinition.tsx +++ b/src/sections/dataset/dataset-files/files-table/FilesTableColumnsDefinition.tsx @@ -8,11 +8,13 @@ import { FileSelection } from './row-selection/useFileSelection' import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginationInfo' import { RowSelectionCheckbox } from '@/sections/shared/form/row-selection-checkbox/RowSelectionCheckbox' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' export const createColumnsDefinition = ( paginationInfo: FilePaginationInfo, fileSelection: FileSelection, fileRepository: FileRepository, + datasetRepository: DatasetRepository, accumulatedFilesCount?: number ): ColumnDef[] => [ { @@ -55,9 +57,16 @@ export const createColumnsDefinition = ( files={table.getRowModel().rows.map((row) => row.original)} fileSelection={fileSelection} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ), accessorKey: 'status', - cell: (props) => + cell: (props) => ( + + ) } ] diff --git a/src/sections/dataset/dataset-files/files-table/FilesTableScrollable.tsx b/src/sections/dataset/dataset-files/files-table/FilesTableScrollable.tsx index c46e606c4..816fc6d92 100644 --- a/src/sections/dataset/dataset-files/files-table/FilesTableScrollable.tsx +++ b/src/sections/dataset/dataset-files/files-table/FilesTableScrollable.tsx @@ -12,6 +12,7 @@ import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginati import { type SentryRef } from '../DatasetFilesScrollable' import styles from './FilesTable.module.scss' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface FilesTableScrollableProps { files: FilePreview[] @@ -24,6 +25,7 @@ interface FilesTableScrollableProps { isEmptyFiles: boolean fileRepository: FileRepository accumulatedCount: number + datasetRepository: DatasetRepository } export const FilesTableScrollable = ({ @@ -36,10 +38,17 @@ export const FilesTableScrollable = ({ showSentryRef, isEmptyFiles, fileRepository, - accumulatedCount + accumulatedCount, + datasetRepository }: FilesTableScrollableProps) => { const { table, fileSelection, selectAllPossibleRows, clearRowsSelection } = - useFilesTableScrollable(files, paginationInfo, accumulatedCount, fileRepository) + useFilesTableScrollable( + files, + paginationInfo, + accumulatedCount, + fileRepository, + datasetRepository + ) const [previousCriteria, setPreviousCriteria] = useState(criteria) diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.tsx index e7eac554b..a846cf0f2 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.tsx @@ -5,22 +5,30 @@ import { useTranslation } from 'react-i18next' import { DownloadFilesButton } from './download-files/DownloadFilesButton' import { FileSelection } from '../row-selection/useFileSelection' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface FileActionsHeaderProps { files: FilePreview[] fileSelection: FileSelection fileRepository: FileRepository + datasetRepository: DatasetRepository } export function FileActionsHeader({ files, fileSelection, - fileRepository + fileRepository, + datasetRepository }: FileActionsHeaderProps) { const { t } = useTranslation('files') return (
- +
) diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/DatasetEditFileTagsButton.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/DatasetEditFileTagsButton.tsx index 62ae5c9cc..f43fbc71c 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/DatasetEditFileTagsButton.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/DatasetEditFileTagsButton.tsx @@ -11,6 +11,7 @@ import { useFilesContext } from '@/sections/file/FilesContext' import { QueryParamKey, Route } from '@/sections/Route.enum' import { useNavigate, useSearchParams } from 'react-router-dom' import { DatasetNonNumericVersionSearchParam } from '@/dataset/domain/models/Dataset' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface EditFileTagsButtonProps { fileId: number @@ -18,6 +19,7 @@ interface EditFileTagsButtonProps { existingLabels?: FileLabel[] datasetPersistentId: string isTabularFile: boolean + datasetRepository: DatasetRepository } export const DatasetEditFileTagsButton = ({ @@ -25,7 +27,8 @@ export const DatasetEditFileTagsButton = ({ fileRepository, existingLabels, datasetPersistentId, - isTabularFile + isTabularFile, + datasetRepository }: EditFileTagsButtonProps) => { const [isModalOpen, setIsModalOpen] = useState(false) const { t } = useTranslation('file') @@ -88,6 +91,8 @@ export const DatasetEditFileTagsButton = ({ isUpdatingTabularTags={isUpdatingTabularTags} errorUpdatingTabularTags={errorUpdatingTabularTags} isTabularFile={isTabularFile} + datasetRepository={datasetRepository} + datasetPersistentId={datasetPersistentId} /> ) diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.tsx index df49cb577..bd9f83472 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.tsx @@ -9,14 +9,21 @@ import { FileSelection } from '../../row-selection/useFileSelection' import { useMediaQuery } from '../../../../../../shared/hooks/useMediaQuery' import { FileRepository } from '@/files/domain/repositories/FileRepository' import styles from './EditFilesMenu.module.scss' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface EditFilesMenuProps { files: FilePreview[] fileSelection: FileSelection fileRepository: FileRepository + datasetRepository: DatasetRepository } const MINIMUM_FILES_COUNT_TO_SHOW_EDIT_FILES_BUTTON = 1 -export function EditFilesMenu({ files, fileSelection, fileRepository }: EditFilesMenuProps) { +export function EditFilesMenu({ + files, + fileSelection, + fileRepository, + datasetRepository +}: EditFilesMenuProps) { const { t } = useTranslation('files') const { user } = useSession() const { dataset } = useDataset() @@ -45,6 +52,7 @@ export function EditFilesMenu({ files, fileSelection, fileRepository }: EditFile fileSelection={fileSelection} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.tsx index 62b46755b..1008c5c4e 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.tsx @@ -15,6 +15,7 @@ import { EditFileMetadataReferrer } from '@/sections/edit-file-metadata/EditFile import { useSettings } from '@/sections/settings/SettingsContext' import { SettingName } from '@/settings/domain/models/Setting' import { DatasetEditFileTagsButton } from './DatasetEditFileTagsButton' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' type EditFilesOptionsProps = | { @@ -24,6 +25,7 @@ type EditFilesOptionsProps = fileRepository: FileRepository datasetInfo?: never isHeader: true + datasetRepository: DatasetRepository } | { files?: never @@ -32,6 +34,7 @@ type EditFilesOptionsProps = fileRepository: FileRepository datasetInfo: EditFilesMenuDatasetInfo isHeader: false + datasetRepository: DatasetRepository } export interface EditFilesMenuDatasetInfo { @@ -49,7 +52,8 @@ export function EditFilesOptions({ fileSelection, fileRepository, datasetInfo, - isHeader + isHeader, + datasetRepository }: EditFilesOptionsProps) { const { t } = useTranslation('files') const { t: tFile } = useTranslation('file') @@ -101,6 +105,7 @@ export function EditFilesOptions({ datasetPersistentId={datasetInfo.persistentId} existingLabels={file.metadata.labels} isTabularFile={file.metadata.isTabular} + datasetRepository={datasetRepository} /> - + ) } 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 de1662d30..4f2e66e3e 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 @@ -5,12 +5,18 @@ import { ButtonGroup } from '@iqss/dataverse-design-system' import { useTranslation } from 'react-i18next' import { DatasetPublishingStatus } from '../../../../../../../dataset/domain/models/Dataset' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface FileActionButtonsProps { file: FilePreview fileRepository: FileRepository + datasetRepository: DatasetRepository } -export function FileActionButtons({ file, fileRepository }: FileActionButtonsProps) { +export function FileActionButtons({ + file, + fileRepository, + datasetRepository +}: FileActionButtonsProps) { const { t } = useTranslation('files') return ( @@ -25,7 +31,11 @@ export function FileActionButtons({ file, fileRepository }: FileActionButtonsPro asIcon isDraft={file.datasetPublishingStatus === DatasetPublishingStatus.DRAFT} /> - + ) } diff --git a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/file-options-menu/FileOptionsMenu.tsx b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/file-options-menu/FileOptionsMenu.tsx index 5c2e04068..00a420619 100644 --- a/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/file-options-menu/FileOptionsMenu.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/file-options-menu/FileOptionsMenu.tsx @@ -9,13 +9,15 @@ import { FileAlreadyDeletedModal } from './FileAlreadyDeletedModal' import { useDataset } from '../../../../../../DatasetContext' import { FileRepository } from '@/files/domain/repositories/FileRepository' import { EditFilesMenuDatasetInfo } from '../../../edit-files-menu/EditFilesOptions' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface FileOptionsMenuProps { file: FilePreview fileRepository: FileRepository + datasetRepository: DatasetRepository } -export function FileOptionsMenu({ file, fileRepository }: FileOptionsMenuProps) { +export function FileOptionsMenu({ file, fileRepository, datasetRepository }: FileOptionsMenuProps) { const { t } = useTranslation('files') const { user } = useSession() const { dataset } = useDataset() @@ -75,6 +77,7 @@ export function FileOptionsMenu({ file, fileRepository }: FileOptionsMenuProps) fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> diff --git a/src/sections/dataset/dataset-files/files-table/useFilesTable.tsx b/src/sections/dataset/dataset-files/files-table/useFilesTable.tsx index 1836c14a1..09202cda5 100644 --- a/src/sections/dataset/dataset-files/files-table/useFilesTable.tsx +++ b/src/sections/dataset/dataset-files/files-table/useFilesTable.tsx @@ -5,6 +5,7 @@ import { createColumnsDefinition } from './FilesTableColumnsDefinition' import { useFileSelection } from './row-selection/useFileSelection' import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginationInfo' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' export type RowSelection = { [key: string]: boolean @@ -13,7 +14,8 @@ export type RowSelection = { export function useFilesTable( files: FilePreview[], paginationInfo: FilePaginationInfo, - fileRepository: FileRepository + fileRepository: FileRepository, + datasetRepository: DatasetRepository ) { const [currentPageRowSelection, setCurrentPageRowSelection] = useState({}) const [currentPageSelectedRowModel, setCurrentPageSelectedRowModel] = useState< @@ -26,7 +28,12 @@ export function useFilesTable( ) const table = useReactTable({ data: files, - columns: createColumnsDefinition(paginationInfo, fileSelection, fileRepository), + columns: createColumnsDefinition( + paginationInfo, + fileSelection, + fileRepository, + datasetRepository + ), state: { rowSelection: currentPageRowSelection }, diff --git a/src/sections/dataset/dataset-files/files-table/useFilesTableScrollable.tsx b/src/sections/dataset/dataset-files/files-table/useFilesTableScrollable.tsx index 4b36f4a91..7eefb8dac 100644 --- a/src/sections/dataset/dataset-files/files-table/useFilesTableScrollable.tsx +++ b/src/sections/dataset/dataset-files/files-table/useFilesTableScrollable.tsx @@ -5,6 +5,7 @@ import { getCoreRowModel, Row, useReactTable } from '@tanstack/react-table' import { createColumnsDefinition } from './FilesTableColumnsDefinition' import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginationInfo' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' export type RowSelection = { [key: string]: boolean @@ -18,7 +19,8 @@ export function useFilesTableScrollable( files: FilePreview[], paginationInfo: FilePaginationInfo, accumulatedFilesCount: number, - fileRepository: FileRepository + fileRepository: FileRepository, + datasetRepository: DatasetRepository ) { const [rowSelection, setRowSelection] = useState({}) const [selectedRowsModels, setSelectedRowsModels] = useState>>({}) @@ -44,6 +46,7 @@ export function useFilesTableScrollable( paginationInfo, fileSelection, fileRepository, + datasetRepository, accumulatedFilesCount ), state: { diff --git a/src/sections/file/File.tsx b/src/sections/file/File.tsx index 0d2c8cc75..815f05fef 100644 --- a/src/sections/file/File.tsx +++ b/src/sections/file/File.tsx @@ -18,14 +18,16 @@ import { EditFileMenu } from './file-action-buttons/edit-file-menu/EditFileMenu' import { NotFoundPage } from '../not-found-page/NotFoundPage' import { DraftAlert } from './draft-alert/DraftAlert' import { FileVersions } from './file-version/FileVersions' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface FileProps { repository: FileRepository + datasetRepository: DatasetRepository id: number datasetVersionNumber?: string } -export function File({ repository, id, datasetVersionNumber }: FileProps) { +export function File({ repository, id, datasetVersionNumber, datasetRepository }: FileProps) { const { setIsLoading } = useLoading() const { t } = useTranslation('file') const { file, isLoading } = useFile(repository, id, datasetVersionNumber) @@ -111,6 +113,7 @@ export function File({ repository, id, datasetVersionNumber }: FileProps) { storageIdentifier={file.metadata.storageIdentifier} existingLabels={file.metadata.labels} isTabularFile={file.metadata.isTabular} + datasetRepository={datasetRepository} /> )} diff --git a/src/sections/file/FileFactory.tsx b/src/sections/file/FileFactory.tsx index 7535d1c80..f35aa506e 100644 --- a/src/sections/file/FileFactory.tsx +++ b/src/sections/file/FileFactory.tsx @@ -1,11 +1,13 @@ import { ReactElement } from 'react' import { FileJSDataverseRepository } from '../../files/infrastructure/FileJSDataverseRepository' +import { DatasetJSDataverseRepository } from '@/dataset/infrastructure/repositories/DatasetJSDataverseRepository' import { File } from './File' import { useSearchParams } from 'react-router-dom' import { NotFoundPage } from '../not-found-page/NotFoundPage' import { searchParamVersionToDomainVersion } from '../../router' const repository = new FileJSDataverseRepository() +const datasetRepository = new DatasetJSDataverseRepository() export class FileFactory { static create(): ReactElement { return @@ -23,5 +25,12 @@ function FileWithSearchParams() { return } - return + return ( + + ) } diff --git a/src/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.tsx b/src/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.tsx index 10d9abd9f..d0b824745 100644 --- a/src/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.tsx +++ b/src/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.tsx @@ -9,6 +9,7 @@ import { ReplaceFileReferrer } from '@/sections/replace-file/ReplaceFile' import { EditFileMetadataReferrer } from '@/sections/edit-file-metadata/EditFileMetadata' import { EditFileTagsButton } from './edit-file-tags/EditFileTagsButton' import { FileLabel } from '@/files/domain/models/FileMetadata' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface EditFileMenuProps { fileId: number @@ -17,6 +18,7 @@ interface EditFileMenuProps { datasetInfo: EditFileMenuDatasetInfo storageIdentifier: string | undefined existingLabels?: FileLabel[] + datasetRepository: DatasetRepository isTabularFile: boolean } @@ -35,7 +37,8 @@ export const EditFileMenu = ({ isRestricted, storageIdentifier, existingLabels, - isTabularFile + isTabularFile, + datasetRepository }: EditFileMenuProps) => { const { t } = useTranslation('file') @@ -74,14 +77,15 @@ export const EditFileMenu = ({ {t('actionButtons.editFileMenu.options.replace')} )} - + ) } diff --git a/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/EditFileTagsButton.tsx b/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/EditFileTagsButton.tsx index 18da6bdb4..8cf505eeb 100644 --- a/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/EditFileTagsButton.tsx +++ b/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/EditFileTagsButton.tsx @@ -10,6 +10,7 @@ import { useUpdateFileTabularTags } from './useUpdateFileTabularTags' import { FileRepository } from '@/files/domain/repositories/FileRepository' import { FileLabel } from '@/files/domain/models/FileMetadata' import { DatasetNonNumericVersionSearchParam } from '@/dataset/domain/models/Dataset' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' interface EditFileTagsButtonProps { fileId: number @@ -17,6 +18,7 @@ interface EditFileTagsButtonProps { existingLabels?: FileLabel[] datasetPersistentId: string isTabularFile: boolean + datasetRepository: DatasetRepository } export const EditFileTagsButton = ({ @@ -24,7 +26,8 @@ export const EditFileTagsButton = ({ fileRepository, existingLabels, datasetPersistentId, - isTabularFile + isTabularFile, + datasetRepository }: EditFileTagsButtonProps) => { const [isModalOpen, setIsModalOpen] = useState(false) const { t } = useTranslation('file') @@ -78,6 +81,8 @@ export const EditFileTagsButton = ({ isUpdatingTabularTags={isUpdatingTabularTags} errorUpdatingTabularTags={errorUpdatingTabularTags} isTabularFile={isTabularFile} + datasetRepository={datasetRepository} + datasetPersistentId={datasetPersistentId} /> ) diff --git a/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/EditFileTagsModal.tsx b/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/EditFileTagsModal.tsx index 66eb8ac8e..a7e7bc4a6 100644 --- a/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/EditFileTagsModal.tsx +++ b/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/EditFileTagsModal.tsx @@ -5,8 +5,9 @@ import { FileLabels } from '@/sections/file/file-labels/FileLabels' import { FileLabel, FileLabelType } from '@/files/domain/models/FileMetadata' import { useFilesContext } from '@/sections/file/FilesContext' import { Utils } from '@/shared/helpers/Utils' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' +import { useGetAvailableCategories } from './useGetAvailableCategories' -const FILE_TAG_OPTIONS = ['Documentation', 'Data', 'Code'] const TABULAR_TAG_OPTIONS = [ 'Survey', 'Time Series', @@ -37,6 +38,8 @@ interface EditFileTagsModalProps { ) => Promise isUpdatingTabularTags: boolean errorUpdatingTabularTags: string | null + datasetRepository: DatasetRepository + datasetPersistentId: string } export const EditFileTagsModal = ({ @@ -50,7 +53,9 @@ export const EditFileTagsModal = ({ isUpdatingFileCategories, errorUpdatingFileCategories, isUpdatingTabularTags, - errorUpdatingTabularTags + errorUpdatingTabularTags, + datasetRepository, + datasetPersistentId }: EditFileTagsModalProps) => { const { t: tShared } = useTranslation('shared') const { t } = useTranslation('file') @@ -68,11 +73,27 @@ export const EditFileTagsModal = ({ () => existingLabels?.filter((l) => l.type === FileLabelType.TAG).map((l) => l.value) || [], [existingLabels] ) + + const { + availableCategories, + isLoading: getAvailableCategoriesLoading, + error: getCategoriesError + } = useGetAvailableCategories({ + datasetRepository, + datasetId: datasetPersistentId + }) + const [selectedFileTags, setSelectedFileTags] = useState(initialSelectedFileTags) const [fileTagOptions, setFileTagOptions] = useState([ - ...FILE_TAG_OPTIONS, - ...initialSelectedFileTags.filter((tag) => !FILE_TAG_OPTIONS.includes(tag)) - ]) //TODO: populated the tag options with Dataset's Categories if the api is ready + ...availableCategories, + ...initialSelectedFileTags.filter((tag) => !availableCategories.includes(tag)) + ]) + useMemo(() => { + setFileTagOptions([ + ...availableCategories, + ...initialSelectedFileTags.filter((tag) => !availableCategories.includes(tag)) + ]) + }, [availableCategories, initialSelectedFileTags]) const [selectedTabularTags, setSelectedTabularTags] = useState( initialSelectedTabularTags ) @@ -115,8 +136,8 @@ export const EditFileTagsModal = ({ setSelectedTabularTags(initialSelectedTabularTags) setCustomTag('') setFileTagOptions([ - ...FILE_TAG_OPTIONS, - ...initialSelectedFileTags.filter((tag) => !FILE_TAG_OPTIONS.includes(tag)) + ...availableCategories, + ...initialSelectedFileTags.filter((tag) => !availableCategories.includes(tag)) ]) setHasDuplicateCustomTag(false) handleClose() @@ -138,6 +159,7 @@ export const EditFileTagsModal = ({ {errorUpdatingFileCategories} )} {errorUpdatingTabularTags && {errorUpdatingTabularTags}} + {getCategoriesError && {getCategoriesError}} {t('editFileTagsModal.intro')} @@ -258,7 +280,7 @@ export const EditFileTagsModal = ({ variant="primary" onClick={handleSave} type="button" - disabled={isUpdatingFileCategories}> + disabled={isUpdatingFileCategories || getAvailableCategoriesLoading}> {isUpdatingFileCategories ? tShared('saving') : tShared('saveChanges')} diff --git a/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/useGetAvailableCategories.tsx b/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/useGetAvailableCategories.tsx new file mode 100644 index 000000000..61c1fe7e5 --- /dev/null +++ b/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/useGetAvailableCategories.tsx @@ -0,0 +1,39 @@ +import { useState, useEffect } from 'react' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' +import { getAvailableCategories } from '@/dataset/domain/useCases/getAvailableCategories' + +export interface UseGetAvailableCategories { + datasetRepository: DatasetRepository + datasetId: number | string +} + +export const useGetAvailableCategories = ({ + datasetRepository, + datasetId +}: UseGetAvailableCategories) => { + const [availableCategories, setAvailableCategories] = useState([]) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + const HandleGetAvailableCategories = async (datasetId: number | string) => { + try { + const categories: string[] = await getAvailableCategories(datasetRepository, datasetId) + + setAvailableCategories(categories) + } catch (err) { + const errorMessage = + err instanceof Error && err.message + ? err.message + : 'Something went wrong fetching available categories. Try again later.' + setError(errorMessage) + } finally { + setIsLoading(false) + } + } + + void HandleGetAvailableCategories(datasetId) + }, [datasetRepository, datasetId]) + + return { availableCategories, isLoading, error } +} diff --git a/src/stories/dataset/DatasetErrorMockRepository.ts b/src/stories/dataset/DatasetErrorMockRepository.ts index 130856488..f6a3973bb 100644 --- a/src/stories/dataset/DatasetErrorMockRepository.ts +++ b/src/stories/dataset/DatasetErrorMockRepository.ts @@ -122,4 +122,12 @@ export class DatasetErrorMockRepository implements DatasetMockRepository { }, FakerHelper.loadingTimout()) }) } + + getAvailableCategories(_datasetId: string | number): Promise { + return new Promise((_resolve, reject) => { + setTimeout(() => { + reject('Error thrown from mock') + }, 1000) + }) + } } diff --git a/src/stories/dataset/DatasetMockRepository.ts b/src/stories/dataset/DatasetMockRepository.ts index b474bec63..65681f0b5 100644 --- a/src/stories/dataset/DatasetMockRepository.ts +++ b/src/stories/dataset/DatasetMockRepository.ts @@ -128,6 +128,14 @@ export class DatasetMockRepository implements DatasetRepository { }) } + getAvailableCategories(_datasetId: string | number): Promise { + return new Promise((resolve) => { + setTimeout(() => { + resolve(['Category 1', 'Category 2', 'Category 3']) + }, FakerHelper.loadingTimout()) + }) + } + deleteDatasetDraft(_datasetId: string | number): Promise { return new Promise((resolve) => { setTimeout(() => { diff --git a/src/stories/dataset/dataset-files/DatasetFiles.stories.tsx b/src/stories/dataset/dataset-files/DatasetFiles.stories.tsx index fe727aa71..ebcdf63ca 100644 --- a/src/stories/dataset/dataset-files/DatasetFiles.stories.tsx +++ b/src/stories/dataset/dataset-files/DatasetFiles.stories.tsx @@ -7,6 +7,7 @@ import { FileMockNoDataRepository } from '../../file/FileMockNoDataRepository' import { WithSettings } from '../../WithSettings' import { FileMockNoFiltersRepository } from '../../file/FileMockNoFiltersRepository' import { DatasetMother } from '../../../../tests/component/dataset/domain/models/DatasetMother' +import { DatasetMockRepository } from '../../dataset/DatasetMockRepository' const meta: Meta = { title: 'Sections/Dataset Page/DatasetFiles', @@ -23,6 +24,7 @@ export const Default: Story = { render: () => ( @@ -33,6 +35,7 @@ export const Loading: Story = { render: () => ( @@ -43,6 +46,7 @@ export const NoFiles: Story = { render: () => ( @@ -53,6 +57,7 @@ export const NoFilters: Story = { render: () => ( diff --git a/src/stories/dataset/dataset-files/DatasetFilesScrollable.stories.tsx b/src/stories/dataset/dataset-files/DatasetFilesScrollable.stories.tsx index a03e63283..1b5a02b93 100644 --- a/src/stories/dataset/dataset-files/DatasetFilesScrollable.stories.tsx +++ b/src/stories/dataset/dataset-files/DatasetFilesScrollable.stories.tsx @@ -7,6 +7,7 @@ import { FileMockNoDataRepository } from '../../file/FileMockNoDataRepository' import { WithSettings } from '../../WithSettings' import { FileMockNoFiltersRepository } from '../../file/FileMockNoFiltersRepository' import { DatasetMother } from '../../../../tests/component/dataset/domain/models/DatasetMother' +import { DatasetMockRepository } from '../../dataset/DatasetMockRepository' const meta: Meta = { title: 'Sections/Dataset Page/DatasetFilesScrollable', @@ -27,6 +28,7 @@ export const Default: Story = { render: () => ( @@ -37,6 +39,7 @@ export const Loading: Story = { render: () => ( @@ -47,6 +50,7 @@ export const NoFiles: Story = { render: () => ( @@ -57,6 +61,7 @@ export const NoFilters: Story = { render: () => ( diff --git a/src/stories/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.stories.tsx b/src/stories/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.stories.tsx index 5354ee227..e5131401d 100644 --- a/src/stories/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.stories.tsx +++ b/src/stories/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.stories.tsx @@ -6,6 +6,7 @@ import { WithLoggedInUser } from '../../../../../WithLoggedInUser' import { WithDatasetAllPermissionsGranted } from '../../../../WithDatasetAllPermissionsGranted' import { FilePreviewMother } from '../../../../../../../tests/component/files/domain/models/FilePreviewMother' import { FileMockRepository } from '@/stories/file/FileMockRepository' +import { DatasetMockRepository } from '@/stories/dataset/DatasetMockRepository' const meta: Meta = { title: 'Sections/Dataset Page/DatasetFiles/FilesTable/EditFilesMenu', @@ -22,6 +23,7 @@ export const Default: Story = { files={FilePreviewMother.createMany(2)} fileSelection={{}} fileRepository={new FileMockRepository()} + datasetRepository={new DatasetMockRepository()} /> ) } diff --git a/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/file-options-menu/FileOptionsMenu.stories.tsx b/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/file-options-menu/FileOptionsMenu.stories.tsx index d97352128..76fdc9f8c 100644 --- a/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/file-options-menu/FileOptionsMenu.stories.tsx +++ b/src/stories/dataset/dataset-files/files-table/file-actions/file-action-buttons/file-options-menu/FileOptionsMenu.stories.tsx @@ -7,6 +7,7 @@ import { WithDatasetAllPermissionsGranted } from '../../../../../WithDatasetAllP import { WithDatasetLockedFromEdits } from '../../../../../WithDatasetLockedFromEdits' import { FilePreviewMother } from '../../../../../../../../tests/component/files/domain/models/FilePreviewMother' import { FileMockRepository } from '@/stories/file/FileMockRepository' +import { DatasetMockRepository } from '@/stories/dataset/DatasetMockRepository' const meta: Meta = { title: @@ -24,6 +25,7 @@ export const DefaultWithLoggedInUser: Story = { ) } @@ -34,6 +36,7 @@ export const Restricted: Story = { ) } @@ -44,6 +47,7 @@ export const WithDatasetLocked: Story = { ) } @@ -54,6 +58,7 @@ export const WithFileAlreadyDeleted: Story = { ) } diff --git a/src/stories/file/File.stories.tsx b/src/stories/file/File.stories.tsx index 2a445a2d6..ce6185fb0 100644 --- a/src/stories/file/File.stories.tsx +++ b/src/stories/file/File.stories.tsx @@ -6,6 +6,7 @@ import { WithLayout } from '../WithLayout' import { FileMockLoadingRepository } from './FileMockLoadingRepository' import { FileMockNoDataRepository } from './FileMockNoDataRepository' import { FileMother } from '../../../tests/component/files/domain/models/FileMother' +import { DatasetMockRepository } from '../dataset/DatasetMockRepository' const meta: Meta = { title: 'Pages/File', @@ -21,26 +22,51 @@ export default meta type Story = StoryObj export const Default: Story = { - render: () => + render: () => ( + + ) } export const Restricted: Story = { - render: () => + render: () => ( + + ) } export const RestrictedWithAccessGranted: Story = { render: () => ( ) } export const Loading: Story = { - render: () => + render: () => ( + + ) } export const FileNotFound: Story = { - render: () => + render: () => ( + + ) } diff --git a/src/stories/file/file-action-buttons/edit-file-dropdown/EditFileDropdown.stories.tsx b/src/stories/file/file-action-buttons/edit-file-dropdown/EditFileDropdown.stories.tsx index f3b5adfc5..c8205eb0a 100644 --- a/src/stories/file/file-action-buttons/edit-file-dropdown/EditFileDropdown.stories.tsx +++ b/src/stories/file/file-action-buttons/edit-file-dropdown/EditFileDropdown.stories.tsx @@ -4,6 +4,7 @@ import { WithSettings } from '../../../WithSettings' import { EditFileMenu } from '@/sections/file/file-action-buttons/edit-file-menu/EditFileMenu' import { FileMother } from '@tests/component/files/domain/models/FileMother' import { FileMockRepository } from '../../FileMockRepository' +import { DatasetMockRepository } from '../../../dataset/DatasetMockRepository' const storyFile = FileMother.createRealistic() @@ -21,6 +22,7 @@ export const Default: Story = { = { title: 'Sections/File Page/Action Buttons/EditFileMenu/EditFileTagsModal', @@ -17,6 +18,8 @@ export const WithExistingLabels: Story = { {}} handleUpdateCategories={() => Promise.resolve()} isUpdatingFileCategories={false} @@ -34,6 +37,8 @@ export const WithLoading: Story = { {}} handleUpdateCategories={() => Promise.resolve()} isUpdatingFileCategories={true} @@ -51,6 +56,8 @@ export const WithError: Story = { {}} handleUpdateCategories={() => Promise.resolve()} isUpdatingFileCategories={false} @@ -68,6 +75,8 @@ export const NonTabularFile: Story = { {}} handleUpdateCategories={() => Promise.resolve()} isUpdatingFileCategories={false} diff --git a/tests/component/sections/collection/useGetCollectionFeaturedItems.spec.tsx b/tests/component/sections/collection/useGetCollectionFeaturedItems.spec.tsx index 11b80092a..8f9fa7a49 100644 --- a/tests/component/sections/collection/useGetCollectionFeaturedItems.spec.tsx +++ b/tests/component/sections/collection/useGetCollectionFeaturedItems.spec.tsx @@ -6,7 +6,7 @@ import { FeaturedItemMother } from '@tests/component/collection/domain/models/Fe const collectionRepository: CollectionRepository = {} as CollectionRepository const featuredItemsMock = FeaturedItemMother.createFeaturedItems() -describe('useGetCollectionUserPermissions', () => { +describe('useGetFeaturedItems', () => { it('should return collection featured items correctly', async () => { collectionRepository.getFeaturedItems = cy.stub().resolves(featuredItemsMock) diff --git a/tests/component/sections/dataset/dataset-files/DatasetFiles.spec.tsx b/tests/component/sections/dataset/dataset-files/DatasetFiles.spec.tsx index 8ccdad7d3..c14980054 100644 --- a/tests/component/sections/dataset/dataset-files/DatasetFiles.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/DatasetFiles.spec.tsx @@ -22,11 +22,13 @@ import { FilePaginationInfo } from '../../../../../src/files/domain/models/FileP import { FilePreviewMother } from '../../../files/domain/models/FilePreviewMother' import { FilePreview } from '../../../../../src/files/domain/models/FilePreview' import { DataverseInfoRepository } from '@/info/domain/repositories/DataverseInfoRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' const testFiles: FilePreview[] = FilePreviewMother.createMany(10) const datasetPersistentId = 'test-dataset-persistent-id' const datasetVersion = DatasetMother.create().version const fileRepository: FileRepository = {} as FileRepository +const datasetRepository: DatasetRepository = {} as DatasetRepository const testFilesCountInfo = FilesCountInfoMother.create({ total: 200, perFileType: [ @@ -73,6 +75,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -87,6 +90,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -101,6 +105,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -119,6 +124,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -141,6 +147,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -175,6 +182,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -206,6 +214,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '1 to 10 of 200 Files' }).should('exist') @@ -239,6 +248,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '1 to 10 of 200 Files' }).should('exist') @@ -263,6 +273,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '1 to 10 of 200 Files' }).should('exist') @@ -283,6 +294,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '1 to 10 of 200 Files' }).should('exist') @@ -303,6 +315,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '1 to 10 of 200 Files' }).should('exist') @@ -333,6 +346,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -359,6 +373,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -377,6 +392,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -397,6 +413,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -419,6 +436,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -439,6 +457,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -459,6 +478,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -479,6 +499,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -499,6 +520,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -518,6 +540,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -537,6 +560,7 @@ describe('DatasetFiles', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) diff --git a/tests/component/sections/dataset/dataset-files/DatasetFilesScrollable.spec.tsx b/tests/component/sections/dataset/dataset-files/DatasetFilesScrollable.spec.tsx index 1b0076cc6..36e2cca0e 100644 --- a/tests/component/sections/dataset/dataset-files/DatasetFilesScrollable.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/DatasetFilesScrollable.spec.tsx @@ -23,6 +23,7 @@ import { DatasetFilesScrollable } from '../../../../../src/sections/dataset/data import { FilesWithCount } from '../../../../../src/files/domain/models/FilesWithCount' import { getCellStyle } from '../../../../../src/sections/dataset/dataset-files/files-table/FilesTableScrollable' import { DataverseInfoRepository } from '@/info/domain/repositories/DataverseInfoRepository' +import { DatasetMockRepository } from '../../../../../src/stories/dataset/DatasetMockRepository' const TOTAL_FILES_COUNT = 200 const ONLY_4_FILES_COUNT = 4 @@ -42,6 +43,7 @@ const only4Files: FilesWithCount = { const datasetPersistentId = 'test-dataset-persistent-id' const datasetVersion = DatasetMother.create().version const fileRepository: FileRepository = {} as FileRepository +const datasetRepository = new DatasetMockRepository() const testFilesCountInfo = FilesCountInfoMother.create({ total: 200, perFileType: [ @@ -94,6 +96,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -109,6 +112,7 @@ describe('DatasetFilesScrollable', () => { datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} canUpdateDataset={false} + datasetRepository={datasetRepository} /> ) @@ -139,6 +143,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -160,6 +165,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -175,6 +181,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -193,6 +200,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -214,6 +222,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -238,6 +247,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -264,6 +274,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -297,6 +308,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -333,6 +345,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -398,6 +411,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -416,6 +430,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -438,6 +453,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -477,6 +493,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -521,6 +538,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -542,6 +560,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -569,6 +588,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -600,6 +620,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -616,6 +637,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -632,6 +654,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -647,6 +670,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('columnheader', { name: '10 of 200 Files displayed' }).should('exist') @@ -671,6 +695,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -696,6 +721,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -715,6 +741,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -741,6 +768,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.wrap(fileRepository.getAllByDatasetPersistentIdWithCount).should( @@ -760,6 +788,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('button', { name: /Sort/ }).click() @@ -778,6 +807,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('button', { name: 'File Type: All' }).click() @@ -796,6 +826,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('button', { name: 'Access: All' }).click() @@ -814,6 +845,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByRole('button', { name: 'File Tags: All' }).click() @@ -832,6 +864,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByLabelText('Search').type('test{enter}') @@ -849,6 +882,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -880,6 +914,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) @@ -913,6 +948,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByText('Error').should('exist') @@ -926,6 +962,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByText(/There was an error getting the files total download size/).should('exist') @@ -941,6 +978,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByText('Error').should('exist') @@ -954,6 +992,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByText(/There was an error getting the files total download size/).should('exist') @@ -969,6 +1008,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByText('Error').should('exist') @@ -982,6 +1022,7 @@ describe('DatasetFilesScrollable', () => { filesRepository={fileRepository} datasetPersistentId={datasetPersistentId} datasetVersion={datasetVersion} + datasetRepository={datasetRepository} /> ) cy.findByText(/There was an error getting the files count info/).should('exist') diff --git a/tests/component/sections/dataset/dataset-files/files-table/FilesTable.spec.tsx b/tests/component/sections/dataset/dataset-files/files-table/FilesTable.spec.tsx index f5131f8ea..952f50bc6 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/FilesTable.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/files-table/FilesTable.spec.tsx @@ -13,8 +13,10 @@ import { FilePaginationInfo } from '../../../../../../src/files/domain/models/Fi import { FilePreviewMother } from '../../../../files/domain/models/FilePreviewMother' import { FileRepository } from '@/files/domain/repositories/FileRepository' import { DataverseInfoRepository } from '@/info/domain/repositories/DataverseInfoRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' const fileRepository: FileRepository = {} as FileRepository +const datasetRepository: DatasetRepository = {} as DatasetRepository const testFiles = FilePreviewMother.createMany(10) const paginationInfo = new FilePaginationInfo(1, 10, 200) const testFilesTotalDownloadSize = 19900 @@ -29,6 +31,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -50,6 +53,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -65,6 +69,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -81,6 +86,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -102,6 +108,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -127,6 +134,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -148,6 +156,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -171,6 +180,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) cy.get('table > tbody > tr:nth-child(2) > td:nth-child(1) > input[type=checkbox]').click() @@ -207,6 +217,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) @@ -231,6 +242,7 @@ describe('FilesTable', () => { filesTotalDownloadSize={testFilesTotalDownloadSize} criteria={defaultCriteria} fileRepository={fileRepository} + datasetRepository={datasetRepository} /> ) diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.spec.tsx b/tests/component/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.spec.tsx index a729638b9..e229257c5 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/files-table/file-actions/FileActionsHeader.spec.tsx @@ -6,10 +6,12 @@ import { DatasetPermissionsMother } from '../../../../../dataset/domain/models/DatasetMother' import { FilePreviewMother } from '../../../../../files/domain/models/FilePreviewMother' +import { FileRepository } from '@/files/domain/repositories/FileRepository' describe('FileActionsHeader', () => { it('renders the file actions header', () => { const datasetRepository: DatasetRepository = {} as DatasetRepository + const fileRepository: FileRepository = {} as FileRepository const datasetWithUpdatePermissions = DatasetMother.create({ permissions: DatasetPermissionsMother.createWithAllAllowed(), hasValidTermsOfAccess: true @@ -20,7 +22,12 @@ describe('FileActionsHeader', () => { - + ) diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.spec.tsx b/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.spec.tsx index ace604b82..0ba86c8a2 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesMenu.spec.tsx @@ -35,7 +35,12 @@ describe('EditFilesMenu', () => { it('renders the Edit Files menu', () => { cy.mountAuthenticated( withDataset( - , + , datasetWithUpdatePermissions ) ) @@ -46,7 +51,12 @@ describe('EditFilesMenu', () => { it('does not render the Edit Files menu when the user is not authenticated', () => { cy.customMount( withDataset( - , + , datasetWithUpdatePermissions ) ) @@ -57,7 +67,12 @@ describe('EditFilesMenu', () => { it('does not render the Edit Files menu when there are no files in the dataset', () => { cy.mountAuthenticated( withDataset( - , + , datasetWithUpdatePermissions ) ) @@ -68,7 +83,12 @@ describe('EditFilesMenu', () => { it('renders the Edit Files options', () => { cy.mountAuthenticated( withDataset( - , + , datasetWithUpdatePermissions ) ) @@ -84,7 +104,12 @@ describe('EditFilesMenu', () => { cy.mountAuthenticated( withDataset( - , + , datasetWithNoUpdatePermissions ) ) @@ -100,7 +125,12 @@ describe('EditFilesMenu', () => { cy.mountAuthenticated( withDataset( - , + , datasetWithUpdatePermissions ) ) @@ -116,7 +146,12 @@ describe('EditFilesMenu', () => { cy.mountAuthenticated( withDataset( - , + , datasetWithUpdatePermissions ) ) diff --git a/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.spec.tsx b/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.spec.tsx index 803d193b4..487240bb5 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions.spec.tsx @@ -2,9 +2,11 @@ import { QueryParamKey } from '@/sections/Route.enum' import { EditFilesOptions } from '../../../../../../../../src/sections/dataset/dataset-files/files-table/file-actions/edit-files-menu/EditFilesOptions' import { FilePreviewMother } from '../../../../../../files/domain/models/FilePreviewMother' import { FileRepository } from '@/files/domain/repositories/FileRepository' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' const files = FilePreviewMother.createMany(2) const fileRepository: FileRepository = {} as FileRepository +const datasetRepository: DatasetRepository = {} as DatasetRepository const datasetInfo = { persistentId: `doi:10.5072/FK2/0000}`, @@ -22,6 +24,7 @@ describe('EditFilesOptions', () => { fileSelection={{}} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) @@ -29,6 +32,7 @@ describe('EditFilesOptions', () => { cy.findByRole('button', { name: 'Embargo' }).should('not.exist') cy.findByRole('button', { name: 'Provenance' }).should('not.exist') cy.findByRole('button', { name: 'Delete' }).should('exist') + cy.findByRole('button', { name: 'Restrict' }).should('exist') }) it('renders the restrict option if some file is unrestricted', () => { @@ -39,6 +43,7 @@ describe('EditFilesOptions', () => { fileSelection={{}} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) @@ -55,6 +60,7 @@ describe('EditFilesOptions', () => { fileSelection={{}} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) @@ -70,6 +76,7 @@ describe('EditFilesOptions', () => { fileSelection={{}} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) @@ -85,6 +92,7 @@ describe('EditFilesOptions', () => { fileSelection={{}} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) @@ -100,6 +108,7 @@ describe('EditFilesOptions', () => { fileSelection={{}} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) @@ -119,6 +128,7 @@ describe('EditFilesOptions', () => { fileSelection={{ 'some-file-id': FilePreviewMother.create() }} fileRepository={fileRepository} isHeader={true} + datasetRepository={datasetRepository} /> ) @@ -139,6 +149,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -166,6 +177,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -184,6 +196,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -203,6 +216,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -221,6 +235,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -231,6 +246,27 @@ describe('EditFilesOptions for a single file', () => { cy.findByText(/The file has been deleted./).should('exist') }) + it('should reset the modal if cancel is clicked in delete modal', () => { + const fileUnrestricted = FilePreviewMother.createDefault() + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Delete' }).click() + cy.findByRole('dialog').should('exist') + cy.findByText('Cancel').click() + cy.findByRole('dialog').should('not.exist') + + cy.findByRole('button', { name: 'Delete' }).click() + cy.findByRole('dialog').should('exist') + }) + it('should restrict file if restrict button clicked', () => { fileRepository.restrict = cy.stub().resolves() cy.customMount( @@ -239,6 +275,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -259,6 +296,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -270,6 +308,28 @@ describe('EditFilesOptions for a single file', () => { cy.findByText(/The file has been unrestricted./).should('exist') }) + it('should reset the modal if cancel is clicked in restrict modal', () => { + const fileUnrestricted = FilePreviewMother.createDefault() + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Restrict' }).click() + cy.findByRole('dialog').should('exist') + cy.findByText('Cancel').click() + cy.findByRole('dialog').should('not.exist') + + cy.findByRole('button', { name: 'Unrestrict' }).should('not.exist') + cy.findByRole('button', { name: 'Restrict' }).click() + cy.findByRole('dialog').should('exist') + }) + it('opens and closes the edit file tags modal', () => { const fileUnrestricted = FilePreviewMother.createDefault() cy.customMount( @@ -278,6 +338,7 @@ describe('EditFilesOptions for a single file', () => { fileRepository={fileRepository} datasetInfo={datasetInfo} isHeader={false} + datasetRepository={datasetRepository} /> ) @@ -287,4 +348,115 @@ describe('EditFilesOptions for a single file', () => { cy.findByRole('button', { name: 'Close' }).click() cy.findByRole('dialog').should('not.exist') }) + + it('should reset tags when cancel is clicked in tags modal', () => { + const fileWithTags = FilePreviewMother.createWithLabels() + + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Tags' }).click() + cy.findByRole('dialog').should('exist') + cy.findByTestId('custom-file-tag-input').should('exist') + cy.findByTestId('custom-file-tag-input').type('Custom Tag{enter}') + cy.findByRole('button', { name: 'Cancel' }).click() + cy.findByRole('dialog').should('not.exist') + + cy.findByRole('button', { name: 'Tags' }).click() + cy.findByText('Custom Tag').should('not.exist') + }) + + it('should navigate to dataset and show success toast after restricting file', () => { + fileRepository.restrict = cy.stub().resolves() + const fileUnrestricted = FilePreviewMother.createDefault() + + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Restrict' }).click() + cy.findByRole('dialog').should('exist') + cy.findByRole('button', { name: /Save Changes/i }).click() + + cy.findByText(/The file has been restricted./).should('exist') + }) + + it('should navigate to dataset and show success toast after unrestricting file', () => { + fileRepository.restrict = cy.stub().resolves() + const fileRestricted = FilePreviewMother.createRestricted() + + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Unrestrict' }).click() + cy.findByRole('dialog').should('exist') + cy.findByRole('button', { name: /Save Changes/i }).click() + + cy.findByText(/The file has been unrestricted./).should('exist') + }) + + it('should navigate to dataset and show success toast after deleting file', () => { + fileRepository.delete = cy.stub().resolves() + const fileToDelete = FilePreviewMother.createDefault() + + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Delete' }).click() + cy.findByRole('dialog').should('exist') + cy.findByTestId('deleteButton').click() + + cy.findByText(/The file has been deleted./).should('exist') + }) + + it('should navigate to dataset and show success toast after updating file tags', () => { + const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] + datasetRepository.getAvailableCategories = cy.stub().resolves(categoriesMock) + const fileWithTags = FilePreviewMother.createWithLabels() + fileRepository.updateCategories = cy.stub().resolves() + + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Tags' }).click() + cy.findByRole('dialog').should('exist') + cy.findByTestId('custom-file-tag-input').type('Custom Tag{enter}') + cy.findByRole('button', { name: /Save Changes/i }).click() + + cy.findByText(/The file tags have been updated./).should('exist') + }) }) diff --git a/tests/component/sections/dataset/dataset-versions/DatasetVersionsViewDifferencesModal.spec.tsx b/tests/component/sections/dataset/dataset-versions/DatasetVersionsViewDifferencesModal.spec.tsx index e5141f4b4..28dbbef3c 100644 --- a/tests/component/sections/dataset/dataset-versions/DatasetVersionsViewDifferencesModal.spec.tsx +++ b/tests/component/sections/dataset/dataset-versions/DatasetVersionsViewDifferencesModal.spec.tsx @@ -1,3 +1,4 @@ +import { DatasetVersionState } from '@/dataset/domain/models/Dataset' import { DatasetVersionDiff } from '@/dataset/domain/models/DatasetVersionDiff' import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' import { VersionDetailModal } from '@/sections/dataset/dataset-versions/view-difference/DatasetVersionsDetailModal' @@ -6,11 +7,13 @@ const datasetsRepository: DatasetRepository = {} as DatasetRepository const datasetVersionDiff: DatasetVersionDiff | undefined = { oldVersion: { versionNumber: '2.0', - lastUpdatedDate: '2025-03-11T16:22:00Z' + lastUpdatedDate: '2025-03-11T16:22:00Z', + versionState: DatasetVersionState.RELEASED }, newVersion: { versionNumber: 'DRAFT', - lastUpdatedDate: '2025-03-13T14:09:03Z' + lastUpdatedDate: '2025-03-13T14:09:03Z', + versionState: DatasetVersionState.DRAFT }, metadataChanges: [ diff --git a/tests/component/sections/file/File.spec.tsx b/tests/component/sections/file/File.spec.tsx index 0b2b94b76..c8fb20b9e 100644 --- a/tests/component/sections/file/File.spec.tsx +++ b/tests/component/sections/file/File.spec.tsx @@ -1,6 +1,7 @@ import { FileRepository } from '../../../../src/files/domain/repositories/FileRepository' import { FileMother } from '../../files/domain/models/FileMother' import { File } from '../../../../src/sections/file/File' +import { DatasetMockRepository } from '@/stories/dataset/DatasetMockRepository' const fileRepository: FileRepository = {} as FileRepository @@ -9,7 +10,9 @@ describe('File', () => { const testFile = FileMother.createRealistic() fileRepository.getById = cy.stub().resolves(testFile) - cy.customMount() + cy.customMount( + + ) cy.wrap(fileRepository.getById).should('be.calledWith', 19) @@ -34,7 +37,9 @@ describe('File', () => { const testFile = FileMother.createRealistic() fileRepository.getById = cy.stub().resolves(testFile) - cy.customMount() + cy.customMount( + + ) cy.findByTestId('file-skeleton').should('exist') cy.wrap(fileRepository.getById).should('be.calledWith', 19) @@ -44,7 +49,9 @@ describe('File', () => { it('renders page not found when file is not found', () => { fileRepository.getById = cy.stub().resolves(undefined) - cy.customMount() + cy.customMount( + + ) cy.findByTestId('not-found-page').should('exist') }) @@ -53,7 +60,9 @@ describe('File', () => { const testFile = FileMother.createRestricted() fileRepository.getById = cy.stub().resolves(testFile) - cy.customMount() + cy.customMount( + + ) cy.findByText('Restricted File Icon').should('exist') }) @@ -62,7 +71,14 @@ describe('File', () => { const testFile = FileMother.createRealistic() fileRepository.getById = cy.stub().resolves(testFile) - cy.customMount() + cy.customMount( + + ) cy.findByText('Version 1.0').should('exist') cy.findByRole('tab', { name: 'Metadata' }).should('exist') diff --git a/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx b/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx index 1a12a389f..8273e4206 100644 --- a/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx +++ b/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx @@ -1,8 +1,14 @@ import { EditFileTagsModal } from '@/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/EditFileTagsModal' import { FileLabelType } from '@/files/domain/models/FileMetadata' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' describe('EditFileTagsModal', () => { + let datasetRepository: DatasetRepository beforeEach(() => { + datasetRepository = {} as DatasetRepository + + const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] + datasetRepository.getAvailableCategories = cy.stub().resolves(categoriesMock) cy.customMount( { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) }) + it('should render the available categories as File Tags', () => { + cy.get('#file-tags-select').should('exist') + cy.get('#file-tags-select').click() + cy.findByText('Data').should('exist') + cy.findByText('Code').should('exist') + cy.findByText('Documentation').should('exist') + cy.findByText('Category4').should('exist') + }) + it('renders the modal with correct title and content', () => { cy.findByText('Edit Tags').should('exist') cy.findByText( @@ -118,6 +135,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={false} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -140,6 +159,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={false} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -177,6 +198,8 @@ describe('EditFileTagsModal', () => { errorUpdatingTabularTags={null} isTabularFile={true} existingLabels={existingLabels} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -197,6 +220,8 @@ describe('EditFileTagsModal', () => { errorUpdatingTabularTags={null} isTabularFile={true} existingLabels={existingLabels} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) cy.findByTestId('custom-file-tag-input').type('duplicated tag') @@ -206,6 +231,63 @@ describe('EditFileTagsModal', () => { cy.findByText('This tag already exists.').should('exist') }) + it('should call handleModalClose when clicking cancel button', () => { + const existingLabels = [ + { value: 'Data', type: FileLabelType.CATEGORY }, + { value: 'Survey', type: FileLabelType.TAG } + ] + + const handleCloseSpy = cy.stub().as('handleClose') + + cy.customMount( + + ) + + cy.findByRole('button', { name: 'Cancel' }).click() + cy.get('@handleClose').should('have.been.called') + }) + + it('should call handleModalClose when clicking the X button', () => { + const existingLabels = [{ value: 'Documentation', type: FileLabelType.CATEGORY }] + + const handleCloseSpy = cy.stub().as('handleClose') + + cy.customMount( + + ) + + cy.get('.modal-header .btn-close').click() + cy.get('@handleClose').should('have.been.called') + }) + describe('Error or Loading States', () => { it('should display file categories error message', () => { const errorMessage = 'Failed to update file categories' @@ -221,6 +303,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -241,6 +325,32 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={errorMessage} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} + /> + ) + + cy.findByRole('alert').should('have.class', 'alert-danger') + }) + + it('should display error if getCategoriesError is error', () => { + const errorMessage = 'Failed to load categories' + datasetRepository.getAvailableCategories = cy.stub().rejects(new Error(errorMessage)) + + cy.customMount( + {}} + fileId={1} + handleUpdateCategories={cy.stub().as('handleUpdateCategories')} + isUpdatingFileCategories={false} + errorUpdatingFileCategories={null} + handleUpdateTabularTags={cy.stub().as('handleUpdateTabularTags')} + isUpdatingTabularTags={false} + errorUpdatingTabularTags={null} + isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -260,6 +370,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -279,6 +391,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) diff --git a/tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx b/tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx new file mode 100644 index 000000000..60c6f2050 --- /dev/null +++ b/tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx @@ -0,0 +1,84 @@ +import { act, renderHook } from '@testing-library/react' +import { useGetAvailableCategories } from '@/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/useGetAvailableCategories' +import { ReadError } from '@iqss/dataverse-client-javascript' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' + +describe('useGetAvailableCategories', () => { + let datasetRepository: DatasetRepository + + beforeEach(() => { + datasetRepository = {} as DatasetRepository + }) + + it('should successfully get dataset available categories', async () => { + const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] + datasetRepository.getAvailableCategories = cy.stub().resolves(categoriesMock) + + const { result } = renderHook(() => + useGetAvailableCategories({ + datasetRepository, + datasetId: 123 + }) + ) + await act(() => { + expect(result.current.isLoading).to.deep.equal(true) + return expect(result.current.availableCategories).to.deep.equal([]) + }) + + await act(() => { + expect(result.current.isLoading).to.deep.equal(false) + + return expect(result.current.availableCategories).to.deep.equal(categoriesMock) + }) + expect(datasetRepository.getAvailableCategories).to.have.been.calledWith(123) + }) + + describe('Error handling', () => { + it('should handle WriteError and set formatted error message', async () => { + const mockReadError = new ReadError('Test error') + datasetRepository.getAvailableCategories = cy.stub().rejects(mockReadError) + + const { result } = renderHook(() => + useGetAvailableCategories({ + datasetRepository, + datasetId: 123 + }) + ) + + await act(() => { + expect(result.current.isLoading).to.deep.equal(true) + return expect(result.current.error).to.deep.equal(null) + }) + + await act(() => { + expect(result.current.isLoading).to.deep.equal(false) + return expect(result.current.error).to.deep.equal( + 'There was an error when reading the resource. Reason was: Test error' + ) + }) + }) + + it('should handle unknown errors and set default error message', async () => { + datasetRepository.getAvailableCategories = cy.stub().rejects('Error message') + + const { result } = renderHook(() => + useGetAvailableCategories({ + datasetRepository, + datasetId: 123 + }) + ) + + await act(() => { + expect(result.current.isLoading).to.deep.equal(true) + return expect(result.current.error).to.deep.equal(null) + }) + + await act(() => { + expect(result.current.isLoading).to.deep.equal(false) + return expect(result.current.error).to.deep.equal( + 'Something went wrong fetching available categories. Try again later.' + ) + }) + }) + }) +}) diff --git a/tests/component/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.spec.tsx b/tests/component/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.spec.tsx index 8d78ecec3..b77a01a9e 100644 --- a/tests/component/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.spec.tsx +++ b/tests/component/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.spec.tsx @@ -1,6 +1,7 @@ import { FileLabelType } from '@/files/domain/models/FileMetadata' import { EditFileMenu } from '@/sections/file/file-action-buttons/edit-file-menu/EditFileMenu' import { QueryParamKey } from '@/sections/Route.enum' +import { DatasetMockRepository } from '@/stories/dataset/DatasetMockRepository' import { FileMockRepository } from '@/stories/file/FileMockRepository' import { WriteError } from '@iqss/dataverse-client-javascript' import { FileMother } from '@tests/component/files/domain/models/FileMother' @@ -22,6 +23,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -59,6 +61,7 @@ describe('EditFileMenu', () => { }} isTabularFile={true} storageIdentifier="non-s3://10.5072/FK2/FNJFOR" + datasetRepository={new DatasetMockRepository()} /> ) @@ -80,6 +83,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -106,6 +110,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -132,6 +137,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -167,6 +173,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -196,6 +203,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -224,6 +232,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -253,6 +262,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -282,6 +292,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -308,6 +319,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -336,6 +348,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -370,6 +383,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -399,6 +413,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -425,6 +440,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -457,6 +473,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -483,6 +500,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -507,6 +525,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -540,6 +559,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -568,6 +588,7 @@ describe('EditFileMenu', () => { }} storageIdentifier="s3://10.5072/FK2/FNJFOR" isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -601,6 +622,7 @@ describe('EditFileMenu', () => { { value: 'Panel', type: FileLabelType.TAG } ]} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} storageIdentifier="s3://10.5072/FK2/FNJFOR" /> ) @@ -633,7 +655,11 @@ describe('EditFileMenu', () => { cy.findByRole('dialog').should('exist') cy.findByTestId('custom-file-tag-input').should('exist') cy.findByTestId('custom-file-tag-input').type('Custom Tag') + + cy.wait(1000) cy.findByRole('button', { name: 'Apply' }).click() + + cy.wait(1000) cy.findByRole('button', { name: 'Save Changes' }).click() cy.findByText(/The file tags have been updated./i)