Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export default defineConfig({
},
env: {
codeCoverage: {
exclude: ['tests/**/*.*', '**/ErrorPage.tsx']
exclude: ['tests/**/*.*', '**/ErrorPage.tsx','**/FileUploader.tsx']
}
}
})
20 changes: 19 additions & 1 deletion public/locales/en/file.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"options": {
"metadata": "Metadata",
"restrict": "Restrict",
"unrestrict": "Unrestrict",
"replace": "Replace",
"delete": "Delete"
}
Expand All @@ -65,5 +66,22 @@
"delete": "Delete"
},
"fileDeletedSuccess": "The file has been deleted.",
"defaultFileDeleteError": "Something went wrong deleting the file. Try again later."
"defaultFileDeleteError": "Something went wrong deleting the file. Try again later.",
"restriction": {
"fileRestrictdSuccess": "The file has been restricted.",
"fileUnrestrictedSuccess": "The file has been unrestricted.",
"restrictAccess": "Restrict Access",
"restrictionInfoP1": "Restricting limits access to published files. People who want to use the restricted files can request access by default. ",
"restrictionInfoP2": "If you disable request access, you must add information about access to the Terms of Access field.",
"restrictionInfoP3": "Learn about restricting files and dataset access in the ",
"userGuide": "User Guide",
"termsOfAccess": "Terms of Access for Restricted Files",
"enableAccessRequest": "Enable access request",
"saveChanges": "Save Changes",
"cancelChanges": "Cancel Changes",
"messagePublishedDataset": "Files will not be changed from previously published versions of the dataset.",
"message": "The file will be unrestricted.",
"defaultFileRestrictError": "Something went wrong restricting the file. Try again later.",
"defaultFileUnrestrictError": "Something went wrong unrestricting the file. Try again later."
}
}
10 changes: 6 additions & 4 deletions src/dataset/domain/models/Dataset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,12 +246,12 @@ export class DatasetVersion {
public readonly isLatest: boolean,
public readonly isInReview: boolean,
public readonly latestVersionPublishingStatus: DatasetPublishingStatus,
public readonly someDatasetVersionHasBeenReleased: boolean
public readonly someDatasetVersionHasBeenReleased: boolean,
public readonly termsOfAccess?: TermsOfAccess
) {}

static Builder = class {
public readonly labels: DatasetLabel[] = []

constructor(
public readonly id: number,
public readonly title: string,
Expand All @@ -261,7 +261,8 @@ export class DatasetVersion {
public readonly isLatest: boolean,
public readonly isInReview: boolean,
public readonly latestVersionPublishingStatus: DatasetPublishingStatus,
public readonly someDatasetVersionHasBeenReleased: boolean
public readonly someDatasetVersionHasBeenReleased: boolean,
public readonly termsOfAccess?: TermsOfAccess
) {
this.createLabels()
}
Expand Down Expand Up @@ -327,7 +328,8 @@ export class DatasetVersion {
this.isLatest,
this.isInReview,
this.latestVersionPublishingStatus,
this.someDatasetVersionHasBeenReleased
this.someDatasetVersionHasBeenReleased,
this.termsOfAccess
)
}
}
Expand Down
10 changes: 7 additions & 3 deletions src/dataset/infrastructure/mappers/JSDatasetVersionMapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,18 @@ import {
import {
DatasetPublishingStatus,
DatasetVersion,
DatasetVersionNumber
DatasetVersionNumber,
TermsOfAccess
} from '../../domain/models/Dataset'

export class JSDatasetVersionMapper {
static toVersion(
jDatasetVersionId: number,
jsDatasetVersionInfo: JSDatasetVersionInfo,
jsDatasetTitle: string,
jsDatasetCitation: string,
jsDatasetPublicationDate?: string
jsDatasetPublicationDate?: string,
jsDatasettermsOfAccess?: TermsOfAccess
): DatasetVersion {
return new DatasetVersion.Builder(
jDatasetVersionId,
Expand All @@ -24,7 +27,8 @@ export class JSDatasetVersionMapper {
true, // TODO Connect with dataset version isLatest
false, // TODO Connect with dataset version isInReview
this.toStatus(jsDatasetVersionInfo.state),
this.toSomeDatasetVersionHasBeenReleased(jsDatasetVersionInfo, jsDatasetPublicationDate)
this.toSomeDatasetVersionHasBeenReleased(jsDatasetVersionInfo, jsDatasetPublicationDate),
jsDatasettermsOfAccess
)
}

Expand Down
1 change: 1 addition & 0 deletions src/files/domain/repositories/FileRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,5 @@ export interface FileRepository {
) => Promise<void>
addUploadedFiles: (datasetId: number | string, files: UploadedFileDTO[]) => Promise<void>
delete: (fileId: number | string) => Promise<void>
restrict: (fileId: number | string, restrict: boolean) => Promise<void>
}
9 changes: 9 additions & 0 deletions src/files/domain/useCases/restrictFile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { FileRepository } from '../repositories/FileRepository'

export function restrictFile(
fileRepository: FileRepository,
fileId: number | string,
restrict: boolean
): Promise<void> {
return fileRepository.restrict(fileId, restrict)
}
7 changes: 6 additions & 1 deletion src/files/infrastructure/FileJSDataverseRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import {
addUploadedFilesToDataset,
UploadedFileDTO,
ReadError,
deleteFile
deleteFile,
restrictFile
} from '@iqss/dataverse-client-javascript'
import { FileCriteria } from '../domain/models/FileCriteria'
import { DomainFileMapper } from './mappers/DomainFileMapper'
Expand Down Expand Up @@ -308,4 +309,8 @@ export class FileJSDataverseRepository implements FileRepository {
delete(fileId: number | string): Promise<void> {
return deleteFile.execute(fileId)
}

restrict(fileId: number | string, restrict: boolean): Promise<void> {
return restrictFile.execute(fileId, restrict)
}
}
4 changes: 3 additions & 1 deletion src/files/infrastructure/mappers/JSFileMapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ export class JSFileMapper {
jsDataset.versionId,
jsDataset.versionInfo,
JSDatasetMapper.toDatasetTitle(jsDataset.metadataBlocks),
datasetCitation
datasetCitation,
jsDataset.publicationDate,
jsDataset.termsOfUse?.termsOfAccess
)
return {
id: this.toFileId(jsFile.id),
Expand Down
1 change: 1 addition & 0 deletions src/sections/dataset/dataset-files/DatasetFiles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export function DatasetFiles({
/>
<FilesTable
files={files}
fileRepository={filesRepository}
isLoading={isLoading}
paginationInfo={paginationInfo}
filesTotalDownloadSize={filesTotalDownloadSize}
Expand Down
35 changes: 20 additions & 15 deletions src/sections/dataset/dataset-files/DatasetFilesScrollable.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import cn from 'classnames'
import { useMemo, useRef, useState } from 'react'
import useInfiniteScroll, { UseInfiniteScrollHookRefCallback } from 'react-infinite-scroll-hook'
import { Alert } from '@iqss/dataverse-design-system'
import { FileRepository } from '../../../files/domain/repositories/FileRepository'
import { FileCriteria } from '../../../files/domain/models/FileCriteria'
import { DatasetVersion } from '../../../dataset/domain/models/Dataset'
Expand All @@ -10,9 +12,8 @@ import { useGetFilesTotalDownloadSize } from './useGetFilesTotalDownloadSize'
import { useObserveElementSize } from '../../../shared/hooks/useObserveElementSize'
import { FilesTableScrollable } from './files-table/FilesTableScrollable'
import { FileCriteriaForm } from './file-criteria-form/FileCriteriaForm'
import cn from 'classnames'
import { FilesContext } from '@/sections/file/FilesContext'
import styles from './DatasetFilesScrollable.module.scss'
import { Alert } from '@iqss/dataverse-design-system'

interface DatasetFilesScrollableProps {
filesRepository: FileRepository
Expand Down Expand Up @@ -67,7 +68,8 @@ export function DatasetFilesScrollable({
areFilesAvailable,
totalAvailable,
hasNextPage,
isEmptyFiles
isEmptyFiles,
refreshFiles
} = useGetAccumulatedFiles({
filesRepository,
datasetPersistentId,
Expand Down Expand Up @@ -140,7 +142,6 @@ export function DatasetFilesScrollable({
</>
)
}

return (
<section ref={rootRef}>
<div
Expand All @@ -161,17 +162,21 @@ export function DatasetFilesScrollable({
/>
</header>

<FilesTableScrollable
files={accumulatedFiles}
paginationInfo={paginationInfo}
filesTotalDownloadSize={filesTotalDownloadSize}
criteria={criteria}
criteriaContainerHeight={criteriaContainerSize.height}
sentryRef={sentryRef}
showSentryRef={showSentryRef}
isEmptyFiles={isEmptyFiles}
accumulatedCount={accumulatedCount}
/>
<FilesContext.Provider
value={{ files: accumulatedFiles, isLoading, refreshFiles: refreshFiles }}>
<FilesTableScrollable
files={accumulatedFiles}
paginationInfo={paginationInfo}
filesTotalDownloadSize={filesTotalDownloadSize}
criteria={criteria}
criteriaContainerHeight={criteriaContainerSize.height}
sentryRef={sentryRef}
showSentryRef={showSentryRef}
isEmptyFiles={isEmptyFiles}
accumulatedCount={accumulatedCount}
fileRepository={filesRepository}
/>
</FilesContext.Provider>
</div>
</section>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import { useEffect, useState } from 'react'
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'

interface FilesTableProps {
files: FilePreview[]
fileRepository: FileRepository
isLoading: boolean
paginationInfo: FilePaginationInfo
filesTotalDownloadSize: number
Expand All @@ -24,11 +26,13 @@ export function FilesTable({
isLoading,
paginationInfo,
filesTotalDownloadSize,
fileRepository,
criteria
}: FilesTableProps) {
const { table, fileSelection, selectAllFiles, clearFileSelection } = useFilesTable(
files,
paginationInfo
paginationInfo,
fileRepository
)

const [visitedPagination, setVisitedPagination] = useState<FilePaginationInfo>(paginationInfo)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import { FileActionsHeader } from './file-actions/FileActionsHeader'
import { FileActionsCell } from './file-actions/file-actions-cell/FileActionsCell'
import { FileSelection } from './row-selection/useFileSelection'
import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginationInfo'
import { FileRepository } from '@/files/domain/repositories/FileRepository'

export const createColumnsDefinition = (
paginationInfo: FilePaginationInfo,
fileSelection: FileSelection,
fileRepository: FileRepository,
accumulatedFilesCount?: number
): ColumnDef<FilePreview>[] => [
{
Expand Down Expand Up @@ -51,9 +53,10 @@ export const createColumnsDefinition = (
<FileActionsHeader
files={table.getRowModel().rows.map((row) => row.original)}
fileSelection={fileSelection}
fileRepository={fileRepository}
/>
),
accessorKey: 'status',
cell: (props) => <FileActionsCell file={props.row.original} />
cell: (props) => <FileActionsCell file={props.row.original} fileRepository={fileRepository} />
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { ZipDownloadLimitMessage } from './zip-download-limit-message/ZipDownloa
import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginationInfo'
import { type SentryRef } from '../DatasetFilesScrollable'
import styles from './FilesTable.module.scss'
import { FileRepository } from '@/files/domain/repositories/FileRepository'

interface FilesTableScrollableProps {
files: FilePreview[]
Expand All @@ -21,6 +22,7 @@ interface FilesTableScrollableProps {
sentryRef: SentryRef
showSentryRef: boolean
isEmptyFiles: boolean
fileRepository: FileRepository
accumulatedCount: number
}

Expand All @@ -33,10 +35,11 @@ export const FilesTableScrollable = ({
sentryRef,
showSentryRef,
isEmptyFiles,
fileRepository,
accumulatedCount
}: FilesTableScrollableProps) => {
const { table, fileSelection, selectAllPossibleRows, clearRowsSelection } =
useFilesTableScrollable(files, paginationInfo, accumulatedCount)
useFilesTableScrollable(files, paginationInfo, accumulatedCount, fileRepository)

const [previousCriteria, setPreviousCriteria] = useState<FileCriteria>(criteria)

Expand All @@ -51,7 +54,6 @@ export const FilesTableScrollable = ({
}
setPreviousCriteria(criteria)
}, [criteria, previousCriteria, clearRowsSelection])

return (
<>
<div
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@ import styles from './FileActionsHeader.module.scss'
import { useTranslation } from 'react-i18next'
import { DownloadFilesButton } from './download-files/DownloadFilesButton'
import { FileSelection } from '../row-selection/useFileSelection'
import { FileRepository } from '@/files/domain/repositories/FileRepository'

interface FileActionsHeaderProps {
files: FilePreview[]
fileSelection: FileSelection
fileRepository: FileRepository
}
export function FileActionsHeader({ files, fileSelection }: FileActionsHeaderProps) {

export function FileActionsHeader({
files,
fileSelection,
fileRepository
}: FileActionsHeaderProps) {
const { t } = useTranslation('files')
return (
<div aria-label={t('actions.title')} role="region" className={styles.container}>
<EditFilesMenu files={files} fileSelection={fileSelection} />
<EditFilesMenu files={files} fileSelection={fileSelection} fileRepository={fileRepository} />
<DownloadFilesButton files={files} fileSelection={fileSelection} />
</div>
)
Expand Down
Loading