Skip to content

Commit

Permalink
feat: update restrict feature in dataset page
Browse files Browse the repository at this point in the history
  • Loading branch information
ChengShi-1 committed Mar 7, 2025
1 parent 7bee8eb commit c034a57
Show file tree
Hide file tree
Showing 14 changed files with 124 additions and 35 deletions.
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
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ export function DatasetFilesScrollable({
showSentryRef={showSentryRef}
isEmptyFiles={isEmptyFiles}
accumulatedCount={accumulatedCount}
fileRepository={filesRepository}
/>
</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
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@ import { useTranslation } from 'react-i18next'
import { useDataset } from '../../../../DatasetContext'
import { FileSelection } from '../../row-selection/useFileSelection'
import { useMediaQuery } from '../../../../../../shared/hooks/useMediaQuery'
import { FileRepository } from '@/files/domain/repositories/FileRepository'
import { EditFilesMenuDatasetInfo } from './EditFilesOptions'

interface EditFilesMenuProps {
files: FilePreview[]
fileSelection: FileSelection
fileRepository: FileRepository
}
const MINIMUM_FILES_COUNT_TO_SHOW_EDIT_FILES_BUTTON = 1
export function EditFilesMenu({ files, fileSelection }: EditFilesMenuProps) {
export function EditFilesMenu({ files, fileSelection, fileRepository }: EditFilesMenuProps) {
const { t } = useTranslation('files')
const { user } = useSession()
const { dataset } = useDataset()
Expand All @@ -27,6 +30,14 @@ export function EditFilesMenu({ files, fileSelection }: EditFilesMenuProps) {
) {
return <></>
}

const datasetInfo: EditFilesMenuDatasetInfo = {
persistentId: dataset.persistentId,
releasedVersionExists: dataset.version.someDatasetVersionHasBeenReleased || false,
termsOfAccessForRestrictedFiles:
dataset.termsOfUse?.termsOfAccess?.termsOfAccessForRestrictedFiles || ''
}

return (
<DropdownButton
id="edit-files-menu"
Expand All @@ -37,7 +48,12 @@ export function EditFilesMenu({ files, fileSelection }: EditFilesMenuProps) {
disabled={
dataset.checkIsLockedFromEdits(user.persistentId) || !dataset.hasValidTermsOfAccess
}>
<EditFilesOptions files={files} fileSelection={fileSelection} />
<EditFilesOptions
files={files}
fileSelection={fileSelection}
fileRepository={fileRepository}
datasetInfo={datasetInfo}
/>
</DropdownButton>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,31 @@ import { useState } from 'react'
import { FileSelection } from '../../row-selection/useFileSelection'
import { NoSelectedFilesModal } from '../no-selected-files-modal/NoSelectedFilesModal'
import { useNotImplementedModal } from '../../../../../not-implemented/NotImplementedModalContext'
import { FileRepository } from '@/files/domain/repositories/FileRepository'
import { RestrictFileButton } from '@/sections/file/file-action-buttons/edit-file-menu/restrict-file-button/RestrictFileButton'
import { DeleteFileButton } from '@/sections/file/file-action-buttons/edit-file-menu/delete-file-button/DeleteFileButton'

interface EditFileOptionsProps {
files: FilePreview[]
fileSelection: FileSelection
fileRepository: FileRepository
datasetInfo: EditFilesMenuDatasetInfo
}

export interface EditFilesMenuDatasetInfo {
persistentId: string
releasedVersionExists: boolean
termsOfAccessForRestrictedFiles?: string
}

const SELECTED_FILES_EMPTY = 0

export function EditFilesOptions({ files, fileSelection }: EditFileOptionsProps) {
export function EditFilesOptions({
files,
fileSelection,
fileRepository,
datasetInfo
}: EditFileOptionsProps) {
const { t } = useTranslation('files')
const [showNoFilesSelectedModal, setShowNoFilesSelectedModal] = useState(false)
const settingsEmbargoAllowed = false // TODO - Ask Guillermo if this is included in the settings endpoint
Expand All @@ -33,16 +49,15 @@ export function EditFilesOptions({ files, fileSelection }: EditFileOptionsProps)
<DropdownButtonItem onClick={onClick}>
{t('actions.editFilesMenu.options.metadata')}
</DropdownButtonItem>
{files.some((file) => file.access.restricted) && (
<DropdownButtonItem onClick={onClick}>
{t('actions.editFilesMenu.options.unrestrict')}
</DropdownButtonItem>
)}
{files.some((file) => !file.access.restricted) && (
<DropdownButtonItem onClick={onClick}>
{t('actions.editFilesMenu.options.restrict')}
</DropdownButtonItem>
)}
{files.map((file) => (
<RestrictFileButton
key={file.id}
fileId={file.id}
isRestricted={file.access.restricted}
fileRepository={fileRepository}
datasetInfo={datasetInfo}
/>
))}
<DropdownButtonItem onClick={onClick}>
{t('actions.editFilesMenu.options.replace')}
</DropdownButtonItem>
Expand All @@ -56,9 +71,14 @@ export function EditFilesOptions({ files, fileSelection }: EditFileOptionsProps)
{t('actions.editFilesMenu.options.provenance')}
</DropdownButtonItem>
)}
<DropdownButtonItem onClick={onClick}>
{t('actions.editFilesMenu.options.delete')}
</DropdownButtonItem>
{files.map((file) => (
<DeleteFileButton
key={file.id}
fileId={file.id}
fileRepository={fileRepository}
datasetInfo={datasetInfo}
/>
))}
<NoSelectedFilesModal
show={showNoFilesSelectedModal}
handleClose={() => setShowNoFilesSelectedModal(false)}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import { FileRepository } from '@/files/domain/repositories/FileRepository'
import { FilePreview } from '../../../../../../files/domain/models/FilePreview'
import { FileActionButtons } from './file-action-buttons/FileActionButtons'
import { FileInfoMessages } from './file-info-messages/FileInfoMessages'
import styles from './FileActionsCell.module.scss'

interface FileActionsCellProps {
file: FilePreview
fileRepository: FileRepository
}
export function FileActionsCell({ file }: FileActionsCellProps) {
export function FileActionsCell({ file, fileRepository }: FileActionsCellProps) {
return (
<div className={styles.container}>
<FileInfoMessages file={file} />
<FileActionButtons file={file} />
<FileActionButtons file={file} fileRepository={fileRepository} />
</div>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import { FileOptionsMenu } from './file-options-menu/FileOptionsMenu'
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'

interface FileActionButtonsProps {
file: FilePreview
fileRepository: FileRepository
}
export function FileActionButtons({ file }: FileActionButtonsProps) {
export function FileActionButtons({ file, fileRepository }: FileActionButtonsProps) {
const { t } = useTranslation('files')

return (
Expand All @@ -22,7 +24,7 @@ export function FileActionButtons({ file }: FileActionButtonsProps) {
ingestInProgress={file.ingest.isInProgress}
asIcon
/>
<FileOptionsMenu file={file} />
<FileOptionsMenu file={file} fileRepository={fileRepository} />
</ButtonGroup>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,15 @@ import { useTranslation } from 'react-i18next'
import { useState } from 'react'
import { FileAlreadyDeletedModal } from './FileAlreadyDeletedModal'
import { useDataset } from '../../../../../../DatasetContext'
import { FileRepository } from '@/files/domain/repositories/FileRepository'
import { EditFilesMenuDatasetInfo } from '../../../edit-files-menu/EditFilesOptions'

export function FileOptionsMenu({ file }: { file: FilePreview }) {
interface FileOptionsMenuProps {
file: FilePreview
fileRepository: FileRepository
}

export function FileOptionsMenu({ file, fileRepository }: FileOptionsMenuProps) {
const { t } = useTranslation('files')
const { user } = useSession()
const { dataset } = useDataset()
Expand All @@ -18,6 +25,13 @@ export function FileOptionsMenu({ file }: { file: FilePreview }) {
return <></>
}

const datasetInfo: EditFilesMenuDatasetInfo = {
persistentId: dataset.persistentId,
releasedVersionExists: dataset.version.someDatasetVersionHasBeenReleased || false,
termsOfAccessForRestrictedFiles:
dataset.termsOfUse?.termsOfAccess?.termsOfAccessForRestrictedFiles || ''
}

if (file.metadata.isDeleted) {
return (
<>
Expand Down Expand Up @@ -54,7 +68,12 @@ export function FileOptionsMenu({ file }: { file: FilePreview }) {
<DropdownHeader>
<PencilFill /> {t('actions.optionsMenu.headers.editOptions')}
</DropdownHeader>
<EditFilesOptions files={[file]} fileSelection={{ [file.id]: file }} />
<EditFilesOptions
files={[file]}
fileSelection={{ [file.id]: file }}
fileRepository={fileRepository}
datasetInfo={datasetInfo}
/>
</DropdownButton>
</Tooltip>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@ import { getCoreRowModel, Row, useReactTable } from '@tanstack/react-table'
import { createColumnsDefinition } from './FilesTableColumnsDefinition'
import { useFileSelection } from './row-selection/useFileSelection'
import { FilePaginationInfo } from '../../../../files/domain/models/FilePaginationInfo'
import { FileRepository } from '@/files/domain/repositories/FileRepository'

export type RowSelection = {
[key: string]: boolean
}

export function useFilesTable(files: FilePreview[], paginationInfo: FilePaginationInfo) {
export function useFilesTable(
files: FilePreview[],
paginationInfo: FilePaginationInfo,
fileRepository: FileRepository
) {
const [currentPageRowSelection, setCurrentPageRowSelection] = useState<RowSelection>({})
const [currentPageSelectedRowModel, setCurrentPageSelectedRowModel] = useState<
Record<string, Row<FilePreview>>
Expand All @@ -21,7 +26,7 @@ export function useFilesTable(files: FilePreview[], paginationInfo: FilePaginati
)
const table = useReactTable({
data: files,
columns: createColumnsDefinition(paginationInfo, fileSelection),
columns: createColumnsDefinition(paginationInfo, fileSelection, fileRepository),
state: {
rowSelection: currentPageRowSelection
},
Expand Down
Loading

0 comments on commit c034a57

Please sign in to comment.