From 6fb69f1e4c2c90cec478823fd499b44a769a2e87 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 25 Jul 2025 17:35:30 -0400 Subject: [PATCH 01/14] feat: add avaialble Categories to the EditFileTagsModal --- package-lock.json | 8 +-- package.json | 2 +- .../domain/repositories/DatasetRepository.ts | 1 + .../useCases/getDatasetAvailableCategories.ts | 8 +++ .../DatasetJSDataverseRepository.ts | 6 ++- src/sections/file/File.tsx | 5 +- src/sections/file/FileFactory.tsx | 2 + .../edit-file-menu/EditFileMenu.tsx | 6 ++- .../edit-file-tags/EditFileTagsButton.tsx | 7 ++- .../EditFileTagsModal.tsx | 3 ++ .../useGetAvailableCategories.tsx | 53 +++++++++++++++++++ 11 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 src/dataset/domain/useCases/getDatasetAvailableCategories.ts create mode 100644 src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/useGetAvailableCategories.tsx 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..17a181869 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.7810d21", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", diff --git a/src/dataset/domain/repositories/DatasetRepository.ts b/src/dataset/domain/repositories/DatasetRepository.ts index 094911ea3..e88b14a2d 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 + getDatasetAvailableCategories: (datasetId: string | number) => Promise } diff --git a/src/dataset/domain/useCases/getDatasetAvailableCategories.ts b/src/dataset/domain/useCases/getDatasetAvailableCategories.ts new file mode 100644 index 000000000..2733ae35a --- /dev/null +++ b/src/dataset/domain/useCases/getDatasetAvailableCategories.ts @@ -0,0 +1,8 @@ +import { DatasetRepository } from '../repositories/DatasetRepository' + +export async function getDatasetAvailableCategories( + datasetRepository: DatasetRepository, + datasetId: string | number +): Promise { + return datasetRepository.getDatasetAvailableCategories(datasetId) +} diff --git a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts index 568be62cb..21786ebe1 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' @@ -365,4 +366,7 @@ export class DatasetJSDataverseRepository implements DatasetRepository { throw error }) } + getDatasetAvailableCategories(datasetId: string | number): Promise { + return getDatasetAvailableCategories.execute(datasetId) + } } diff --git a/src/sections/file/File.tsx b/src/sections/file/File.tsx index 4c5b46f0e..d119d8b36 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) @@ -109,6 +111,7 @@ export function File({ repository, id, datasetVersionNumber }: FileProps) { }} 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..f11b82140 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 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 05deac7b4..e4da86b00 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 @@ -16,6 +17,7 @@ interface EditFileMenuProps { isRestricted: boolean datasetInfo: EditFileMenuDatasetInfo existingLabels?: FileLabel[] + datasetRepository: DatasetRepository isTabularFile: boolean } @@ -33,7 +35,8 @@ export const EditFileMenu = ({ datasetInfo, existingLabels, isRestricted, - isTabularFile + isTabularFile, + datasetRepository }: EditFileMenuProps) => { const { t } = useTranslation('file') @@ -76,6 +79,7 @@ export const EditFileMenu = ({ existingLabels={existingLabels} datasetPersistentId={datasetInfo.persistentId} isTabularFile={isTabularFile} + datasetRepository={datasetRepository} /> ) 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..480721f2b 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,6 +5,7 @@ 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' const FILE_TAG_OPTIONS = ['Documentation', 'Data', 'Code'] const TABULAR_TAG_OPTIONS = [ @@ -37,6 +38,8 @@ interface EditFileTagsModalProps { ) => Promise isUpdatingTabularTags: boolean errorUpdatingTabularTags: string | null + datasetRepository: DatasetRepository + datasetPersistentId: string } export const EditFileTagsModal = ({ 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..90abfbcfb --- /dev/null +++ b/src/sections/file/file-action-buttons/edit-file-menu/edit-file-tags/edit-file-tags-modal/useGetAvailableCategories.tsx @@ -0,0 +1,53 @@ +import { ReadError } from '@iqss/dataverse-client-javascript' +import { useState, useCallback, useEffect } from 'react' +import { useTranslation } from 'react-i18next' +import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' +import { JSDataverseReadErrorHandler } from '@/shared/helpers/JSDataverseReadErrorHandler' + +export interface UseGetAvailableCategories { + datasetRepository: DatasetRepository + datasetId: number | string +} + +interface UseGetAvailableCategoriesReturn { + availableCategories: string[] + isLoading: boolean + error: string | null +} + +export const useGetAvailableCategories = ({ + datasetRepository, + datasetId +}: UseGetAvailableCategories): UseGetAvailableCategoriesReturn => { + const { t } = useTranslation('file') + const [availableCategories, setAvailableCategories] = useState([]) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + + const getAvailableCategories = useCallback( + async (datasetId: number | string) => { + try { + setIsLoading(true) + const categories = await datasetRepository.getDatasetAvailableCategories(datasetId) + console.log('Available categories in useCallback:', categories) + setAvailableCategories(categories) + setError(null) + } catch (err: ReadError | unknown) { + if (err instanceof ReadError) { + const formattedError = new JSDataverseReadErrorHandler(err).getErrorMessage() + setError(formattedError) + } else { + setError(t('defaultFileUpdateError')) + } + } finally { + setIsLoading(false) + } + }, + [datasetRepository, t] + ) + + useEffect(() => { + void getAvailableCategories(datasetId) + }, [datasetId, getAvailableCategories]) + return { availableCategories, isLoading, error } +} From f070e2b6b8841fe984d4cf3f086f1a05c608da70 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 1 Aug 2025 10:20:29 -0400 Subject: [PATCH 02/14] feat: add datasetRepository to file page --- package.json | 2 +- public/locales/en/file.json | 3 +- .../useCases/getDatasetAvailableCategories.ts | 5 ++- src/sections/dataset/Dataset.tsx | 2 + .../dataset/dataset-files/DatasetFiles.tsx | 6 ++- .../dataset-files/DatasetFilesScrollable.tsx | 6 ++- .../dataset-files/files-table/FilesTable.tsx | 8 +++- .../FilesTableColumnsDefinition.tsx | 11 ++++- .../files-table/FilesTableScrollable.tsx | 13 +++++- .../file-actions/FileActionsHeader.tsx | 12 +++++- .../DatasetEditFileTagsButton.tsx | 7 +++- .../edit-files-menu/EditFilesMenu.tsx | 10 ++++- .../edit-files-menu/EditFilesOptions.tsx | 7 +++- .../file-actions-cell/FileActionsCell.tsx | 10 ++++- .../file-action-buttons/FileActionButtons.tsx | 14 ++++++- .../file-options-menu/FileOptionsMenu.tsx | 5 ++- .../files-table/useFilesTable.tsx | 11 ++++- .../files-table/useFilesTableScrollable.tsx | 5 ++- src/sections/file/FileFactory.tsx | 9 +++- .../EditFileTagsModal.tsx | 35 ++++++++++++---- .../useGetAvailableCategories.tsx | 34 ++++++--------- .../dataset/DatasetErrorMockRepository.ts | 8 ++++ src/stories/dataset/DatasetMockRepository.ts | 8 ++++ .../dataset-files/DatasetFiles.stories.tsx | 5 +++ .../DatasetFilesScrollable.stories.tsx | 5 +++ .../edit-files-menu/EditFilesMenu.stories.tsx | 2 + .../FileOptionsMenu.stories.tsx | 5 +++ src/stories/file/File.stories.tsx | 34 +++++++++++++-- .../EditFileDropdown.stories.tsx | 2 + .../EditFileTagsModal.stories.tsx | 9 ++++ .../dataset-files/DatasetFiles.spec.tsx | 24 +++++++++++ .../DatasetFilesScrollable.spec.tsx | 41 +++++++++++++++++++ .../files-table/FilesTable.spec.tsx | 12 ++++++ .../file-actions/FileActionsHeader.spec.tsx | 9 +++- .../dataset-summary/DatasetSummary.spec.tsx | 2 + ...tasetVersionsViewDifferencesModal.spec.tsx | 7 +++- tests/component/sections/file/File.spec.tsx | 26 +++++++++--- .../edit-file-menu/EditFileMenu.spec.tsx | 21 ++++++++++ 38 files changed, 370 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 17a181869..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": "v2.0.0-pr344.7810d21", + "@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/useCases/getDatasetAvailableCategories.ts b/src/dataset/domain/useCases/getDatasetAvailableCategories.ts index 2733ae35a..2f9b8348e 100644 --- a/src/dataset/domain/useCases/getDatasetAvailableCategories.ts +++ b/src/dataset/domain/useCases/getDatasetAvailableCategories.ts @@ -1,8 +1,11 @@ +import { ReadError } from '@iqss/dataverse-client-javascript' import { DatasetRepository } from '../repositories/DatasetRepository' export async function getDatasetAvailableCategories( datasetRepository: DatasetRepository, datasetId: string | number ): Promise { - return datasetRepository.getDatasetAvailableCategories(datasetId) + return datasetRepository.getDatasetAvailableCategories(datasetId).catch((error: ReadError) => { + throw new Error(error.message) + }) } 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 6ee52b56a..82f4d52aa 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') @@ -98,6 +102,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 8e6273c1c..6088c5644 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 ( @@ -24,7 +30,11 @@ export function FileActionButtons({ file, fileRepository }: FileActionButtonsPro ingestInProgress={file.ingest.isInProgress} asIcon /> - + ) } 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/FileFactory.tsx b/src/sections/file/FileFactory.tsx index f11b82140..f35aa506e 100644 --- a/src/sections/file/FileFactory.tsx +++ b/src/sections/file/FileFactory.tsx @@ -25,5 +25,12 @@ function FileWithSearchParams() { return } - return + return ( + + ) } 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 480721f2b..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 @@ -6,8 +6,8 @@ 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', @@ -53,7 +53,9 @@ export const EditFileTagsModal = ({ isUpdatingFileCategories, errorUpdatingFileCategories, isUpdatingTabularTags, - errorUpdatingTabularTags + errorUpdatingTabularTags, + datasetRepository, + datasetPersistentId }: EditFileTagsModalProps) => { const { t: tShared } = useTranslation('shared') const { t } = useTranslation('file') @@ -71,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 ) @@ -118,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() @@ -141,6 +159,7 @@ export const EditFileTagsModal = ({ {errorUpdatingFileCategories} )} {errorUpdatingTabularTags && {errorUpdatingTabularTags}} + {getCategoriesError && {getCategoriesError}} {t('editFileTagsModal.intro')} @@ -261,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 index 90abfbcfb..7e61ce479 100644 --- 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 @@ -1,7 +1,8 @@ import { ReadError } from '@iqss/dataverse-client-javascript' -import { useState, useCallback, useEffect } from 'react' +import { useState, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' +import { getDatasetAvailableCategories } from '@/dataset/domain/useCases/getDatasetAvailableCategories' import { JSDataverseReadErrorHandler } from '@/shared/helpers/JSDataverseReadErrorHandler' export interface UseGetAvailableCategories { @@ -9,27 +10,19 @@ export interface UseGetAvailableCategories { datasetId: number | string } -interface UseGetAvailableCategoriesReturn { - availableCategories: string[] - isLoading: boolean - error: string | null -} - export const useGetAvailableCategories = ({ datasetRepository, datasetId -}: UseGetAvailableCategories): UseGetAvailableCategoriesReturn => { +}: UseGetAvailableCategories) => { const { t } = useTranslation('file') const [availableCategories, setAvailableCategories] = useState([]) - const [isLoading, setIsLoading] = useState(false) + const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) - const getAvailableCategories = useCallback( - async (datasetId: number | string) => { + useEffect(() => { + const getAvailableCategories = async (datasetId: number | string) => { try { - setIsLoading(true) - const categories = await datasetRepository.getDatasetAvailableCategories(datasetId) - console.log('Available categories in useCallback:', categories) + const categories = await getDatasetAvailableCategories(datasetRepository, datasetId) setAvailableCategories(categories) setError(null) } catch (err: ReadError | unknown) { @@ -37,17 +30,16 @@ export const useGetAvailableCategories = ({ const formattedError = new JSDataverseReadErrorHandler(err).getErrorMessage() setError(formattedError) } else { - setError(t('defaultFileUpdateError')) + setError(t('getCategoriesError')) } } finally { setIsLoading(false) + setError(null) } - }, - [datasetRepository, t] - ) - - useEffect(() => { + } + void getAvailableCategories(datasetId) - }, [datasetId, getAvailableCategories]) + }, [datasetRepository, datasetId, t]) + return { availableCategories, isLoading, error } } diff --git a/src/stories/dataset/DatasetErrorMockRepository.ts b/src/stories/dataset/DatasetErrorMockRepository.ts index 130856488..4005c530c 100644 --- a/src/stories/dataset/DatasetErrorMockRepository.ts +++ b/src/stories/dataset/DatasetErrorMockRepository.ts @@ -122,4 +122,12 @@ export class DatasetErrorMockRepository implements DatasetMockRepository { }, FakerHelper.loadingTimout()) }) } + + getDatasetAvailableCategories(_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..201f624d1 100644 --- a/src/stories/dataset/DatasetMockRepository.ts +++ b/src/stories/dataset/DatasetMockRepository.ts @@ -128,6 +128,14 @@ export class DatasetMockRepository implements DatasetRepository { }) } + getDatasetAvailableCategories(_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 da965d35e..f17ecf53d 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/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-summary/DatasetSummary.spec.tsx b/tests/component/sections/dataset/dataset-summary/DatasetSummary.spec.tsx index 93ddec699..20d9d7300 100644 --- a/tests/component/sections/dataset/dataset-summary/DatasetSummary.spec.tsx +++ b/tests/component/sections/dataset/dataset-summary/DatasetSummary.spec.tsx @@ -21,6 +21,7 @@ describe('DatasetSummary', () => { metadataBlockInfoRepository={metadataBlockInfoRepository} summaryFields={summaryFieldsMock} license={licenseMock} + onCustomTermsClick={() => {}} /> ) @@ -48,6 +49,7 @@ describe('DatasetSummary', () => { metadataBlockInfoRepository={metadataBlockInfoRepository} summaryFields={summaryFieldsMock} license={licenseMock} + onCustomTermsClick={() => {}} /> ) 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/file-action-buttons/edit-file-menu/EditFileMenu.spec.tsx b/tests/component/sections/file/file-action-buttons/edit-file-menu/EditFileMenu.spec.tsx index 26f792b69..261f2a408 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' @@ -21,6 +22,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -58,6 +60,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -83,6 +86,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -108,6 +112,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -142,6 +147,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -170,6 +176,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -197,6 +204,7 @@ describe('EditFileMenu', () => { requestAccess: true }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -225,6 +233,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -253,6 +262,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -278,6 +288,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -305,6 +316,7 @@ describe('EditFileMenu', () => { requestAccess: true }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -338,6 +350,7 @@ describe('EditFileMenu', () => { requestAccess: true }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -366,6 +379,7 @@ describe('EditFileMenu', () => { requestAccess: true }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -391,6 +405,7 @@ describe('EditFileMenu', () => { requestAccess: false }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -422,6 +437,7 @@ describe('EditFileMenu', () => { versionNumber: testFile.datasetVersion.number.toSearchParam() }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -447,6 +463,7 @@ describe('EditFileMenu', () => { versionNumber: testFile.datasetVersion.number.toSearchParam() }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -470,6 +487,7 @@ describe('EditFileMenu', () => { versionNumber: testFile.datasetVersion.number.toSearchParam() }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -502,6 +520,7 @@ describe('EditFileMenu', () => { versionNumber: testFile.datasetVersion.number.toSearchParam() }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -529,6 +548,7 @@ describe('EditFileMenu', () => { versionNumber: testFile.datasetVersion.number.toSearchParam() }} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) @@ -562,6 +582,7 @@ describe('EditFileMenu', () => { { value: 'Panel', type: FileLabelType.TAG } ]} isTabularFile={true} + datasetRepository={new DatasetMockRepository()} /> ) }) From 5c27dc950258df0e14224eda01ca627977793ab4 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 1 Aug 2025 14:15:56 -0400 Subject: [PATCH 03/14] fix: add DatasetRepository to tests --- .../edit-file-tags/EditFileTagsModal.spec.tsx | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) 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..9169f7689 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,12 @@ 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 + cy.customMount( { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) }) @@ -118,6 +124,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={false} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -140,6 +148,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={false} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -177,6 +187,8 @@ describe('EditFileTagsModal', () => { errorUpdatingTabularTags={null} isTabularFile={true} existingLabels={existingLabels} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -197,6 +209,8 @@ describe('EditFileTagsModal', () => { errorUpdatingTabularTags={null} isTabularFile={true} existingLabels={existingLabels} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) cy.findByTestId('custom-file-tag-input').type('duplicated tag') @@ -221,6 +235,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -241,6 +257,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={errorMessage} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -260,6 +278,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) @@ -279,6 +299,8 @@ describe('EditFileTagsModal', () => { isUpdatingTabularTags={false} errorUpdatingTabularTags={null} isTabularFile={true} + datasetRepository={datasetRepository} + datasetPersistentId={'1'} /> ) From be6ce5f54566d25adb67abd3958ecb81d9782c16 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 1 Aug 2025 14:19:10 -0400 Subject: [PATCH 04/14] fix: update image URLs to use picsum.photos --- .../RichTextEditor.stories.tsx | 14 ++-- .../rich-text-editor/RichTextEditor.spec.tsx | 70 ++++++++++--------- .../dataset/domain/models/DatasetMother.ts | 3 +- .../files/domain/models/FileMetadataMother.ts | 2 +- .../FeaturedItemsForm.spec.tsx | 4 +- tests/component/shared/FakerHelper.ts | 4 +- .../shared/files/FileHelper.ts | 2 +- 7 files changed, 51 insertions(+), 48 deletions(-) diff --git a/packages/design-system/src/lib/stories/rich-text-editor/RichTextEditor.stories.tsx b/packages/design-system/src/lib/stories/rich-text-editor/RichTextEditor.stories.tsx index 19068c247..d4297bfb4 100644 --- a/packages/design-system/src/lib/stories/rich-text-editor/RichTextEditor.stories.tsx +++ b/packages/design-system/src/lib/stories/rich-text-editor/RichTextEditor.stories.tsx @@ -53,7 +53,7 @@ export const WithAllFormats: Story = { render: () => ( Heading 1

Heading 2

Heading 3

Hello Dataverse new rick rich text editor! This is a link.

  • Item

  • Item

  1. Item 1

  2. Item 2

onUpdate: ({ editor }) => onChange && onChange(editor.getHTML())

This is a blockquoute

A random image from loremflickr' + '

Heading 1

Heading 2

Heading 3

Hello Dataverse new rick rich text editor! This is a link.

  • Item

  • Item

  1. Item 1

  2. Item 2

onUpdate: ({ editor }) => onChange && onChange(editor.getHTML())

This is a blockquoute

A random image from picsum' } onChange={handleChange} /> @@ -62,9 +62,9 @@ export const WithAllFormats: Story = { export const WithImagesAlignedToTheLeftCenterAndRight: Story = { render: () => { - const imageLeft = `Foo` - const imageCenter = `Foo` - const imageRight = `Foo` + const imageLeft = `Foo` + const imageCenter = `Foo` + const imageRight = `Foo` return ( @@ -75,11 +75,11 @@ export const WithImagesAlignedToTheLeftCenterAndRight: Story = { export const WithImagesResizedDifferently: Story = { render: () => { const imageLeft = - 'Foo' + 'Foo' const imageCenter = - 'Foo' + 'Foo' const imageRight = - 'Foo' + 'Foo' return ( diff --git a/packages/design-system/tests/component/rich-text-editor/RichTextEditor.spec.tsx b/packages/design-system/tests/component/rich-text-editor/RichTextEditor.spec.tsx index a05951d2a..e0403932e 100644 --- a/packages/design-system/tests/component/rich-text-editor/RichTextEditor.spec.tsx +++ b/packages/design-system/tests/component/rich-text-editor/RichTextEditor.spec.tsx @@ -7,6 +7,8 @@ const editorContentId = 'test-editor-content-id' const textToType = 'Hello Dataverse!' +const testImageUrl = 'https://picsum.photos/id/237/640/480' + describe('RichTextEditor', () => { it('should render the component', () => { cy.mount() @@ -364,15 +366,15 @@ describe('RichTextEditor', () => { cy.findByLabelText('Add image').click() - cy.findByLabelText('Image URL').type('https://loremflickr.com/640/480') - cy.findByLabelText('Alternative text').type('A random image from loremflickr') + cy.findByLabelText('Image URL').type(testImageUrl) + cy.findByLabelText('Alternative text').type('A random image') cy.findByRole('button', { name: 'OK' }).click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) }) @@ -382,42 +384,42 @@ describe('RichTextEditor', () => { cy.findByLabelText('Add image').click() - cy.findByLabelText('Image URL').type('https://loremflickr.com/640/480') - cy.findByLabelText('Alternative text').type('A random image from loremflickr') + cy.findByLabelText('Image URL').type(testImageUrl) + cy.findByLabelText('Alternative text').type('A random image') cy.findByRole('button', { name: 'OK' }).click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.findByLabelText('Align left').click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.findByLabelText('Align center').click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.findByLabelText('Align right').click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) }) @@ -428,19 +430,19 @@ describe('RichTextEditor', () => { cy.findByLabelText('Add image').click() - cy.findByLabelText('Image URL').type('https://loremflickr.com/640/480') - cy.findByLabelText('Alternative text').type('A random image from loremflickr') + cy.findByLabelText('Image URL').type(testImageUrl) + cy.findByLabelText('Alternative text').type('A random image') cy.findByRole('button', { name: 'OK' }).click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.get('.resize-dot') .eq(1) .trigger('pointerdown', { which: 1, force: true }) @@ -450,7 +452,7 @@ describe('RichTextEditor', () => { cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) }) @@ -460,19 +462,19 @@ describe('RichTextEditor', () => { cy.findByLabelText('Add image').click() - cy.findByLabelText('Image URL').type('https://loremflickr.com/640/480') - cy.findByLabelText('Alternative text').type('A random image from loremflickr') + cy.findByLabelText('Image URL').type(testImageUrl) + cy.findByLabelText('Alternative text').type('A random image') cy.findByRole('button', { name: 'OK' }).click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.get('.resize-dot') .eq(1) .trigger('pointerdown', { which: 1, force: true }) @@ -482,7 +484,7 @@ describe('RichTextEditor', () => { cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) }) @@ -492,19 +494,19 @@ describe('RichTextEditor', () => { cy.findByLabelText('Add image').click() - cy.findByLabelText('Image URL').type('https://loremflickr.com/640/480') - cy.findByLabelText('Alternative text').type('A random image from loremflickr') + cy.findByLabelText('Image URL').type(testImageUrl) + cy.findByLabelText('Alternative text').type('A random image') cy.findByRole('button', { name: 'OK' }).click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.get('.resize-dot') .eq(2) .trigger('pointerdown', { which: 1, force: true }) @@ -514,7 +516,7 @@ describe('RichTextEditor', () => { cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) }) @@ -524,19 +526,19 @@ describe('RichTextEditor', () => { cy.findByLabelText('Add image').click() - cy.findByLabelText('Image URL').type('https://loremflickr.com/640/480') - cy.findByLabelText('Alternative text').type('A random image from loremflickr') + cy.findByLabelText('Image URL').type(testImageUrl) + cy.findByLabelText('Alternative text').type('A random image') cy.findByRole('button', { name: 'OK' }).click() cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.get('.resize-dot') .eq(1) .trigger('pointerdown', { which: 1, force: true }) @@ -546,11 +548,11 @@ describe('RichTextEditor', () => { cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) - cy.findByAltText('A random image from loremflickr').click() + cy.findByAltText('A random image').click() cy.get('.resize-dot') .eq(1) .trigger('pointerdown', { which: 1, force: true }) @@ -560,7 +562,7 @@ describe('RichTextEditor', () => { cy.get(`#${editorContentId}`).then((el) => { const html = el[0].innerHTML expect(html).to.include( - `A random image from loremflickr` + `A random image` ) }) }) diff --git a/tests/component/dataset/domain/models/DatasetMother.ts b/tests/component/dataset/domain/models/DatasetMother.ts index b590fc7b9..376e8720b 100644 --- a/tests/component/dataset/domain/models/DatasetMother.ts +++ b/tests/component/dataset/domain/models/DatasetMother.ts @@ -27,6 +27,7 @@ import { } from '../../../metadata-block-info/domain/models/MetadataBlockInfoMother' import { TermsOfUseMother } from '@tests/component/dataset/domain/models/TermsOfUseMother' import { DatasetVersionSummaryInfoMother } from '@tests/component/dataset/domain/models/DatasetVersionSummaryInfoMother' +import { FakerHelper } from '@tests/component/shared/FakerHelper' export class DatasetVersionMother { static create(props?: Partial): DatasetVersion { @@ -394,7 +395,7 @@ export class DatasetMother { { producerName: faker.lorem.sentence(), producerURL: faker.internet.url(), - producerLogoURL: faker.image.imageUrl() + producerLogoURL: FakerHelper.getImageUrl() } ] } diff --git a/tests/component/files/domain/models/FileMetadataMother.ts b/tests/component/files/domain/models/FileMetadataMother.ts index f4f73757a..d377f6730 100644 --- a/tests/component/files/domain/models/FileMetadataMother.ts +++ b/tests/component/files/domain/models/FileMetadataMother.ts @@ -134,7 +134,7 @@ export class FileDownloadUrlsMother { export class FileMetadataMother { static create(props?: Partial): FileMetadata { - const thumbnail = valueOrUndefined(faker.image.imageUrl(400)) + const thumbnail = valueOrUndefined(FakerHelper.getImageUrl(400)) const tabularFile = faker.datatype.boolean() const checksum = valueOrUndefined(faker.datatype.uuid()) const fileMockedData = { diff --git a/tests/component/sections/edit-featured-items/FeaturedItemsForm.spec.tsx b/tests/component/sections/edit-featured-items/FeaturedItemsForm.spec.tsx index b7c77b022..0d4dab5e2 100644 --- a/tests/component/sections/edit-featured-items/FeaturedItemsForm.spec.tsx +++ b/tests/component/sections/edit-featured-items/FeaturedItemsForm.spec.tsx @@ -18,7 +18,7 @@ const testCollection = CollectionMother.create({ name: 'Collection Name' }) const featuredItemOne = FeaturedItemMother.createCustomFeaturedItem('css', { id: 1, - imageFileUrl: 'https://loremflickr.com/320/240', + imageFileUrl: 'https://picsum.photos/id/237/200/300', displayOrder: 1, content: '

Featured Item One

' }) @@ -1053,7 +1053,7 @@ describe('FeaturedItemsForm', () => { it('should show an error message when the content is larger than max length accepted', () => { const featuredItemOne = FeaturedItemMother.createCustomFeaturedItem('css', { id: 1, - imageFileUrl: 'https://loremflickr.com/320/240', + imageFileUrl: 'https://picsum.photos/id/237/200/300', displayOrder: 1, content: `

${'a'.repeat( FEATURED_ITEM_CONTENT_MAX_LENGTH_ACCEPTED diff --git a/tests/component/shared/FakerHelper.ts b/tests/component/shared/FakerHelper.ts index c184ab586..d2a3049af 100644 --- a/tests/component/shared/FakerHelper.ts +++ b/tests/component/shared/FakerHelper.ts @@ -113,9 +113,9 @@ export class FakerHelper { } static getImageUrl(width?: number, height?: number) { if (this.chromaticBuild()) { - return 'https://picsum.photos/id/237/200' + return 'https://picsum.photos/id/237/200/300' } else { - return faker.image.imageUrl(width, height) + return `http://picsum.photos/id/237/${width ?? 200}/${height ?? 300}` } } diff --git a/tests/e2e-integration/shared/files/FileHelper.ts b/tests/e2e-integration/shared/files/FileHelper.ts index a36958217..44b75abf9 100644 --- a/tests/e2e-integration/shared/files/FileHelper.ts +++ b/tests/e2e-integration/shared/files/FileHelper.ts @@ -95,7 +95,7 @@ export class FileHelper extends DataverseApiHelper { } static async generateImgData(): Promise { - return await fetch(faker.image.imageUrl()) + return await fetch('https://picsum.photos/id/237/200') .then((response) => { if (!response.ok) { throw new Error('Network response was not ok') From 23d41c228d05a2b4a6315bfea7c7874d8377cbd6 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 1 Aug 2025 15:26:06 -0400 Subject: [PATCH 05/14] fix: testcase failed --- .../edit-file-tags-modal/useGetAvailableCategories.tsx | 6 +++++- .../edit-file-menu/EditFileMenu.spec.tsx | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) 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 index 7e61ce479..16fb53968 100644 --- 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 @@ -15,7 +15,11 @@ export const useGetAvailableCategories = ({ datasetId }: UseGetAvailableCategories) => { const { t } = useTranslation('file') - const [availableCategories, setAvailableCategories] = useState([]) + const [availableCategories, setAvailableCategories] = useState([ + 'Documentation', + 'Code', + 'Data' + ]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) 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 261f2a408..b4c5256b0 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 @@ -608,13 +608,17 @@ describe('EditFileMenu', () => { }) }) - it('shows toast success message when file tags are updated successfully', () => { + it.only('shows toast success message when file tags are updated successfully', () => { cy.findByRole('button', { name: 'Edit File' }).click() 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') + + 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) From 3618407146143aba3d7c5f9f3c05d7372af6bd10 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Sat, 2 Aug 2025 18:59:09 -0400 Subject: [PATCH 06/14] feat: add more testcase --- .../useGetAvailableCategories.tsx | 31 +++---- .../useGetCollectionFeaturedItems.spec.tsx | 2 +- .../edit-file-tags/EditFileTagsModal.spec.tsx | 92 +++++++++++++++++++ .../useGetAvailableCategories.spec.tsx | 85 +++++++++++++++++ 4 files changed, 192 insertions(+), 18 deletions(-) create mode 100644 tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx 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 index 16fb53968..17068cf5d 100644 --- 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 @@ -1,9 +1,6 @@ -import { ReadError } from '@iqss/dataverse-client-javascript' import { useState, useEffect } from 'react' -import { useTranslation } from 'react-i18next' import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' import { getDatasetAvailableCategories } from '@/dataset/domain/useCases/getDatasetAvailableCategories' -import { JSDataverseReadErrorHandler } from '@/shared/helpers/JSDataverseReadErrorHandler' export interface UseGetAvailableCategories { datasetRepository: DatasetRepository @@ -14,7 +11,6 @@ export const useGetAvailableCategories = ({ datasetRepository, datasetId }: UseGetAvailableCategories) => { - const { t } = useTranslation('file') const [availableCategories, setAvailableCategories] = useState([ 'Documentation', 'Code', @@ -24,26 +20,27 @@ export const useGetAvailableCategories = ({ const [error, setError] = useState(null) useEffect(() => { - const getAvailableCategories = async (datasetId: number | string) => { + const HandleGetAvailableCategories = async (datasetId: number | string) => { try { - const categories = await getDatasetAvailableCategories(datasetRepository, datasetId) + const categories: string[] = await getDatasetAvailableCategories( + datasetRepository, + datasetId + ) + setAvailableCategories(categories) - setError(null) - } catch (err: ReadError | unknown) { - if (err instanceof ReadError) { - const formattedError = new JSDataverseReadErrorHandler(err).getErrorMessage() - setError(formattedError) - } else { - setError(t('getCategoriesError')) - } + } 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) - setError(null) } } - void getAvailableCategories(datasetId) - }, [datasetRepository, datasetId, t]) + void HandleGetAvailableCategories(datasetId) + }, [datasetRepository, datasetId]) return { availableCategories, isLoading, error } } 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/file/edit-file-tags/EditFileTagsModal.spec.tsx b/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx index 9169f7689..dc548a45b 100644 --- a/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx +++ b/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx @@ -7,6 +7,8 @@ describe('EditFileTagsModal', () => { beforeEach(() => { datasetRepository = {} as DatasetRepository + const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'].toSorted() + datasetRepository.getDatasetAvailableCategories = cy.stub().resolves(categoriesMock) cy.customMount( { ) }) + 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( @@ -220,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' @@ -265,6 +333,30 @@ describe('EditFileTagsModal', () => { cy.findByRole('alert').should('have.class', 'alert-danger') }) + it('should display error if getCategoriesError is error', () => { + const errorMessage = 'Failed to load categories' + datasetRepository.getDatasetAvailableCategories = 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'} + /> + ) + + cy.findByRole('alert').should('have.class', 'alert-danger') + }) + it('should not display error messages when errors are null', () => { cy.customMount( { + let datasetRepository: DatasetRepository + + beforeEach(() => { + datasetRepository = {} as DatasetRepository + }) + + it('should successfully get dataset available categories', async () => { + const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'].toSorted() + const defaultCategories = ['Documentation', 'Code', 'Data'].toSorted() + datasetRepository.getDatasetAvailableCategories = 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.toSorted()).to.deep.equal(defaultCategories) + }) + + await act(() => { + expect(result.current.isLoading).to.deep.equal(false) + + return expect(result.current.availableCategories).to.deep.equal(categoriesMock) + }) + expect(datasetRepository.getDatasetAvailableCategories).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.getDatasetAvailableCategories = 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.getDatasetAvailableCategories = 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.' + ) + }) + }) + }) +}) From ef7e9ef7e2b867d99db03ecef072557bbe180528 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Sat, 2 Aug 2025 19:55:00 -0400 Subject: [PATCH 07/14] fix: undo sort string array --- .../sections/file/edit-file-tags/EditFileTagsModal.spec.tsx | 2 +- .../file/edit-file-tags/useGetAvailableCategories.spec.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 dc548a45b..a3e0f0f70 100644 --- a/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx +++ b/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx @@ -7,7 +7,7 @@ describe('EditFileTagsModal', () => { beforeEach(() => { datasetRepository = {} as DatasetRepository - const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'].toSorted() + const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] datasetRepository.getDatasetAvailableCategories = cy.stub().resolves(categoriesMock) cy.customMount( { }) it('should successfully get dataset available categories', async () => { - const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'].toSorted() - const defaultCategories = ['Documentation', 'Code', 'Data'].toSorted() + const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] + const defaultCategories = ['Documentation', 'Code', 'Data'] datasetRepository.getDatasetAvailableCategories = cy.stub().resolves(categoriesMock) const { result } = renderHook(() => @@ -23,7 +23,7 @@ describe('useGetAvailableCategories', () => { ) await act(() => { expect(result.current.isLoading).to.deep.equal(true) - return expect(result.current.availableCategories.toSorted()).to.deep.equal(defaultCategories) + return expect(result.current.availableCategories).to.deep.equal(defaultCategories) }) await act(() => { From 44f06671e2ef67e2b0829d68b8e28c5ce2d18cb5 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Mon, 4 Aug 2025 13:06:28 -0400 Subject: [PATCH 08/14] feat: add more tests improve the coverage rate --- .../edit-file-menu/EditFileMenu.tsx | 2 +- .../edit-files-menu/EditFilesMenu.spec.tsx | 49 ++++- .../edit-files-menu/EditFilesOptions.spec.tsx | 172 ++++++++++++++++++ .../edit-file-menu/EditFileMenu.spec.tsx | 2 +- 4 files changed, 216 insertions(+), 9 deletions(-) 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 e4da86b00..509ded5a5 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 @@ -72,7 +72,6 @@ export const EditFileMenu = ({ )}> {t('actionButtons.editFileMenu.options.replace')} - + ) } 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..14270aa27 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.getDatasetAvailableCategories = 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/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 b4c5256b0..dc25b9cd0 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 @@ -608,7 +608,7 @@ describe('EditFileMenu', () => { }) }) - it.only('shows toast success message when file tags are updated successfully', () => { + it('shows toast success message when file tags are updated successfully', () => { cy.findByRole('button', { name: 'Edit File' }).click() cy.findByRole('button', { name: 'Tags' }).click() cy.findByRole('dialog').should('exist') From 350da017e5354cbd69df4885a43ea4cce4613b09 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 6 Aug 2025 16:36:50 -0400 Subject: [PATCH 09/14] fix: naming change and set initial category to [] --- .../domain/repositories/DatasetRepository.ts | 2 +- ...lableCategories.ts => getAvailableCategories.ts} | 4 ++-- .../repositories/DatasetJSDataverseRepository.ts | 6 +++--- .../useGetAvailableCategories.tsx | 13 +++---------- src/stories/dataset/DatasetErrorMockRepository.ts | 2 +- src/stories/dataset/DatasetMockRepository.ts | 2 +- .../edit-files-menu/EditFilesOptions.spec.tsx | 2 +- .../file/edit-file-tags/EditFileTagsModal.spec.tsx | 4 ++-- .../useGetAvailableCategories.spec.tsx | 8 ++++---- 9 files changed, 18 insertions(+), 25 deletions(-) rename src/dataset/domain/useCases/{getDatasetAvailableCategories.ts => getAvailableCategories.ts} (63%) diff --git a/src/dataset/domain/repositories/DatasetRepository.ts b/src/dataset/domain/repositories/DatasetRepository.ts index e88b14a2d..8aed0fc82 100644 --- a/src/dataset/domain/repositories/DatasetRepository.ts +++ b/src/dataset/domain/repositories/DatasetRepository.ts @@ -47,5 +47,5 @@ export interface DatasetRepository { includeMDC?: boolean ) => Promise deleteDatasetDraft: (datasetId: string | number) => Promise - getDatasetAvailableCategories: (datasetId: string | number) => Promise + getAvailableCategories: (datasetId: string | number) => Promise } diff --git a/src/dataset/domain/useCases/getDatasetAvailableCategories.ts b/src/dataset/domain/useCases/getAvailableCategories.ts similarity index 63% rename from src/dataset/domain/useCases/getDatasetAvailableCategories.ts rename to src/dataset/domain/useCases/getAvailableCategories.ts index 2f9b8348e..1bccc56f6 100644 --- a/src/dataset/domain/useCases/getDatasetAvailableCategories.ts +++ b/src/dataset/domain/useCases/getAvailableCategories.ts @@ -1,11 +1,11 @@ import { ReadError } from '@iqss/dataverse-client-javascript' import { DatasetRepository } from '../repositories/DatasetRepository' -export async function getDatasetAvailableCategories( +export async function getAvailableCategories( datasetRepository: DatasetRepository, datasetId: string | number ): Promise { - return datasetRepository.getDatasetAvailableCategories(datasetId).catch((error: ReadError) => { + return datasetRepository.getAvailableCategories(datasetId).catch((error: ReadError) => { throw new Error(error.message) }) } diff --git a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts index 21786ebe1..42334ae23 100644 --- a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts +++ b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts @@ -32,7 +32,7 @@ import { getDatasetVersionsSummaries, getDatasetDownloadCount, deleteDatasetDraft, - getDatasetAvailableCategories + getAvailableCategories } from '@iqss/dataverse-client-javascript' import { JSDatasetMapper } from '../mappers/JSDatasetMapper' import { DatasetPaginationInfo } from '../../domain/models/DatasetPaginationInfo' @@ -366,7 +366,7 @@ export class DatasetJSDataverseRepository implements DatasetRepository { throw error }) } - getDatasetAvailableCategories(datasetId: string | number): Promise { - return getDatasetAvailableCategories.execute(datasetId) + getAvailableCategories(datasetId: string | number): Promise { + return getAvailableCategories.execute(datasetId) } } 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 index 17068cf5d..61c1fe7e5 100644 --- 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 @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react' import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository' -import { getDatasetAvailableCategories } from '@/dataset/domain/useCases/getDatasetAvailableCategories' +import { getAvailableCategories } from '@/dataset/domain/useCases/getAvailableCategories' export interface UseGetAvailableCategories { datasetRepository: DatasetRepository @@ -11,21 +11,14 @@ export const useGetAvailableCategories = ({ datasetRepository, datasetId }: UseGetAvailableCategories) => { - const [availableCategories, setAvailableCategories] = useState([ - 'Documentation', - 'Code', - 'Data' - ]) + 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 getDatasetAvailableCategories( - datasetRepository, - datasetId - ) + const categories: string[] = await getAvailableCategories(datasetRepository, datasetId) setAvailableCategories(categories) } catch (err) { diff --git a/src/stories/dataset/DatasetErrorMockRepository.ts b/src/stories/dataset/DatasetErrorMockRepository.ts index 4005c530c..f6a3973bb 100644 --- a/src/stories/dataset/DatasetErrorMockRepository.ts +++ b/src/stories/dataset/DatasetErrorMockRepository.ts @@ -123,7 +123,7 @@ export class DatasetErrorMockRepository implements DatasetMockRepository { }) } - getDatasetAvailableCategories(_datasetId: string | number): Promise { + getAvailableCategories(_datasetId: string | number): Promise { return new Promise((_resolve, reject) => { setTimeout(() => { reject('Error thrown from mock') diff --git a/src/stories/dataset/DatasetMockRepository.ts b/src/stories/dataset/DatasetMockRepository.ts index 201f624d1..65681f0b5 100644 --- a/src/stories/dataset/DatasetMockRepository.ts +++ b/src/stories/dataset/DatasetMockRepository.ts @@ -128,7 +128,7 @@ export class DatasetMockRepository implements DatasetRepository { }) } - getDatasetAvailableCategories(_datasetId: string | number): Promise { + getAvailableCategories(_datasetId: string | number): Promise { return new Promise((resolve) => { setTimeout(() => { resolve(['Category 1', 'Category 2', 'Category 3']) 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 14270aa27..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 @@ -438,7 +438,7 @@ describe('EditFilesOptions for a single file', () => { it('should navigate to dataset and show success toast after updating file tags', () => { const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] - datasetRepository.getDatasetAvailableCategories = cy.stub().resolves(categoriesMock) + datasetRepository.getAvailableCategories = cy.stub().resolves(categoriesMock) const fileWithTags = FilePreviewMother.createWithLabels() fileRepository.updateCategories = cy.stub().resolves() 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 a3e0f0f70..8273e4206 100644 --- a/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx +++ b/tests/component/sections/file/edit-file-tags/EditFileTagsModal.spec.tsx @@ -8,7 +8,7 @@ describe('EditFileTagsModal', () => { datasetRepository = {} as DatasetRepository const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] - datasetRepository.getDatasetAvailableCategories = cy.stub().resolves(categoriesMock) + datasetRepository.getAvailableCategories = cy.stub().resolves(categoriesMock) cy.customMount( { it('should display error if getCategoriesError is error', () => { const errorMessage = 'Failed to load categories' - datasetRepository.getDatasetAvailableCategories = cy.stub().rejects(new Error(errorMessage)) + datasetRepository.getAvailableCategories = cy.stub().rejects(new Error(errorMessage)) cy.customMount( { it('should successfully get dataset available categories', async () => { const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] const defaultCategories = ['Documentation', 'Code', 'Data'] - datasetRepository.getDatasetAvailableCategories = cy.stub().resolves(categoriesMock) + datasetRepository.getAvailableCategories = cy.stub().resolves(categoriesMock) const { result } = renderHook(() => useGetAvailableCategories({ @@ -31,13 +31,13 @@ describe('useGetAvailableCategories', () => { return expect(result.current.availableCategories).to.deep.equal(categoriesMock) }) - expect(datasetRepository.getDatasetAvailableCategories).to.have.been.calledWith(123) + 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.getDatasetAvailableCategories = cy.stub().rejects(mockReadError) + datasetRepository.getAvailableCategories = cy.stub().rejects(mockReadError) const { result } = renderHook(() => useGetAvailableCategories({ @@ -60,7 +60,7 @@ describe('useGetAvailableCategories', () => { }) it('should handle unknown errors and set default error message', async () => { - datasetRepository.getDatasetAvailableCategories = cy.stub().rejects('Error message') + datasetRepository.getAvailableCategories = cy.stub().rejects('Error message') const { result } = renderHook(() => useGetAvailableCategories({ From 81daac3884a96acf8a060a2486fa1c2c32c34d4b Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 6 Aug 2025 16:49:27 -0400 Subject: [PATCH 10/14] fix: lint --- .../repositories/DatasetJSDataverseRepository.ts | 4 ++-- .../edit-file-tags-modal/useGetAvailableCategories.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts index 42334ae23..b6ffd897a 100644 --- a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts +++ b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts @@ -32,7 +32,7 @@ import { getDatasetVersionsSummaries, getDatasetDownloadCount, deleteDatasetDraft, - getAvailableCategories + getDatasetAvailableCategories } from '@iqss/dataverse-client-javascript' import { JSDatasetMapper } from '../mappers/JSDatasetMapper' import { DatasetPaginationInfo } from '../../domain/models/DatasetPaginationInfo' @@ -367,6 +367,6 @@ export class DatasetJSDataverseRepository implements DatasetRepository { }) } getAvailableCategories(datasetId: string | number): Promise { - return getAvailableCategories.execute(datasetId) + return getDatasetAvailableCategories.execute(datasetId) } } 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 index 61c1fe7e5..b167333a5 100644 --- 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 @@ -11,7 +11,7 @@ export const useGetAvailableCategories = ({ datasetRepository, datasetId }: UseGetAvailableCategories) => { - const [availableCategories, setAvailableCategories] = useState([]) + const [availableCategories, setAvailableCategories] = useState(["dataverse", "dataverse-community"]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) From ec6be2193b1beb91632f384209e56dfb23e0d778 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 6 Aug 2025 17:49:51 -0400 Subject: [PATCH 11/14] fix: lint and test --- .../edit-file-tags-modal/useGetAvailableCategories.tsx | 2 +- .../file/edit-file-tags/useGetAvailableCategories.spec.tsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) 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 index b167333a5..61c1fe7e5 100644 --- 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 @@ -11,7 +11,7 @@ export const useGetAvailableCategories = ({ datasetRepository, datasetId }: UseGetAvailableCategories) => { - const [availableCategories, setAvailableCategories] = useState(["dataverse", "dataverse-community"]) + const [availableCategories, setAvailableCategories] = useState([]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) diff --git a/tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx b/tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx index a3e48d1ac..60c6f2050 100644 --- a/tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx +++ b/tests/component/sections/file/edit-file-tags/useGetAvailableCategories.spec.tsx @@ -12,7 +12,6 @@ describe('useGetAvailableCategories', () => { it('should successfully get dataset available categories', async () => { const categoriesMock = ['Documentation', 'Code', 'Data', 'Category4'] - const defaultCategories = ['Documentation', 'Code', 'Data'] datasetRepository.getAvailableCategories = cy.stub().resolves(categoriesMock) const { result } = renderHook(() => @@ -23,7 +22,7 @@ describe('useGetAvailableCategories', () => { ) await act(() => { expect(result.current.isLoading).to.deep.equal(true) - return expect(result.current.availableCategories).to.deep.equal(defaultCategories) + return expect(result.current.availableCategories).to.deep.equal([]) }) await act(() => { From 18435b1fd1f252736d14d41ac18966f28f19be14 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 7 Aug 2025 09:33:18 -0400 Subject: [PATCH 12/14] fix: prevent creating new error --- src/dataset/domain/useCases/getAvailableCategories.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/dataset/domain/useCases/getAvailableCategories.ts b/src/dataset/domain/useCases/getAvailableCategories.ts index 1bccc56f6..1b5e622c7 100644 --- a/src/dataset/domain/useCases/getAvailableCategories.ts +++ b/src/dataset/domain/useCases/getAvailableCategories.ts @@ -1,11 +1,8 @@ -import { ReadError } from '@iqss/dataverse-client-javascript' import { DatasetRepository } from '../repositories/DatasetRepository' export async function getAvailableCategories( datasetRepository: DatasetRepository, datasetId: string | number ): Promise { - return datasetRepository.getAvailableCategories(datasetId).catch((error: ReadError) => { - throw new Error(error.message) - }) + return datasetRepository.getAvailableCategories(datasetId) } From d6941aef8c648eb621eec06f37cb5b77303dc422 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 15 Aug 2025 09:58:32 -0400 Subject: [PATCH 13/14] fix: missing a parameter --- .../file/file-action-buttons/edit-file-menu/EditFileMenu.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 95e640625..bf6c0bca6 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 @@ -37,7 +37,8 @@ export const EditFileMenu = ({ isRestricted, storageIdentifier, existingLabels, - isTabularFile + isTabularFile, + datasetRepository }: EditFileMenuProps) => { const { t } = useTranslation('file') From 66bba019e2c8303356ef3e3b63257cf615850517 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Fri, 15 Aug 2025 10:29:58 -0400 Subject: [PATCH 14/14] fix: merge conflicts error --- .../edit-file-menu/EditFileMenu.tsx | 11 ----------- .../edit-file-menu/EditFileMenu.spec.tsx | 1 + 2 files changed, 1 insertion(+), 11 deletions(-) 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 bf6c0bca6..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 @@ -64,16 +64,6 @@ export const EditFileMenu = ({ fileRepository={fileRepository} datasetInfo={datasetInfo} /> - - {t('actionButtons.editFileMenu.options.replace')} - {/* TODO: remove this when we can handle non-S3 files */} {storageIdentifier?.startsWith('s3') && ( )} - { }} isTabularFile={true} storageIdentifier="non-s3://10.5072/FK2/FNJFOR" + datasetRepository={new DatasetMockRepository()} /> )