Skip to content
Open
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
3 changes: 2 additions & 1 deletion public/locales/en/file.json
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@
"getCategoriesError": "Something went wrong fetching available categories. Try again later.",
"previewTab": {
"openInNewWindow": "Open in New Window",
"defaultLoadingToolError": "Something went wrong loading the external tool. Try again later."
"defaultLoadingToolError": "Something went wrong loading the external tool. Try again later.",
"termsRequired": "Accept the dataset terms or guestbooks before previewing this file."
}
}
3 changes: 2 additions & 1 deletion public/locales/es/file.json
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@
"getCategoriesError": "Algo salió mal al obtener las categorías disponibles. Intenta nuevamente más tarde.",
"previewTab": {
"openInNewWindow": "Abrir en una nueva ventana",
"defaultLoadingToolError": "Algo salió mal al cargar la herramienta externa. Intenta nuevamente más tarde."
"defaultLoadingToolError": "Algo salió mal al cargar la herramienta externa. Intenta nuevamente más tarde.",
"termsRequired": "Acepta los términos del dataset antes de previsualizar este fichero."
Comment thread
ChengShi-1 marked this conversation as resolved.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ interface DownloadWithTermsAndGuestbookModalProps {
datasetCustomTerms?: CustomTermsModel
show: boolean
handleClose: () => void
onAccept?: () => void
}

type GuestbookFormValues = Record<string, string>
Expand All @@ -44,7 +45,8 @@ export function DownloadWithTermsAndGuestbookModal({
datasetLicense,
datasetCustomTerms,
show,
handleClose
handleClose,
onAccept
}: DownloadWithTermsAndGuestbookModalProps) {
const { t: tFiles } = useTranslation('files')
const { t: tDataset } = useTranslation('dataset')
Expand Down Expand Up @@ -226,7 +228,8 @@ export function DownloadWithTermsAndGuestbookModal({
format,
handleClose,
accessRepository,
downloadFromSignedUrl
downloadFromSignedUrl,
onSubmitSuccess: onAccept
})

useEffect(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ interface UseGuestbookCollectSubmissionProps {
handleClose: () => void
accessRepository: AccessRepository
downloadFromSignedUrl: (signedUrl: string) => Promise<void>
onSubmitSuccess?: () => void
}

interface HandleSubmitProps {
Expand All @@ -34,7 +35,8 @@ export const useGuestbookCollectSubmission = ({
format,
handleClose,
accessRepository,
downloadFromSignedUrl
downloadFromSignedUrl,
onSubmitSuccess
}: UseGuestbookCollectSubmissionProps) => {
const { t: tFiles } = useTranslation('files')
const [hasAttemptedAccept, setHasAttemptedAccept] = useState(false)
Expand Down Expand Up @@ -108,6 +110,12 @@ export const useGuestbookCollectSubmission = ({
setIsSubmittingGuestbook(false)
}

if (signedUrl && onSubmitSuccess) {
handleModalClose()
onSubmitSuccess()
return
}

if (signedUrl) {
void downloadFromSignedUrl(signedUrl)
.then(() => {
Expand All @@ -132,6 +140,7 @@ export const useGuestbookCollectSubmission = ({
fileIds,
format,
handleModalClose,
onSubmitSuccess,
tFiles
]
)
Expand Down
27 changes: 27 additions & 0 deletions src/sections/edit-dataset-terms/datasetTermsNavigation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import {
Dataset,
DatasetNonNumericVersionSearchParam,
DatasetPublishingStatus
} from '@/dataset/domain/models/Dataset'
import { QueryParamKey, Route } from '@/sections/Route.enum'

export const buildDatasetTermsReturnUrl = (dataset: Dataset): string => {
const searchParams = new URLSearchParams()
searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId)

if (dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) {
searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT)
} else {
searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString())
}

return `${Route.DATASETS}?${searchParams.toString()}`
}

export const buildDatasetDraftReturnUrl = (dataset: Dataset): string => {
const searchParams = new URLSearchParams()
searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId)
searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT)

return `${Route.DATASETS}?${searchParams.toString()}`
}
23 changes: 8 additions & 15 deletions src/sections/edit-dataset-terms/edit-guestbook/EditGuestbook.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,12 @@ import { useNavigate } from 'react-router-dom'
import { toast } from 'react-toastify'
import { Guestbook } from '@/guestbooks/domain/models/Guestbook'
import { GuestbookRepository } from '@/guestbooks/domain/repositories/GuestbookRepository'
import {
DatasetNonNumericVersionSearchParam,
DatasetPublishingStatus
} from '@/dataset/domain/models/Dataset'
import { useGetGuestbooksByCollectionId } from '@/sections/guestbooks/useGetGuestbooksByCollectionId'
import { QueryParamKey, Route } from '@/sections/Route.enum'
import { useAssignDatasetGuestbook } from './useAssignDatasetGuestbook'
import { useRemoveDatasetGuestbook } from './useRemoveDatasetGuestbook'
import { useDataset } from '../../dataset/DatasetContext'
import { PreviewGuestbookModal } from '@/sections/guestbooks/preview-modal/PreviewGuestbookModal'
import { buildDatasetDraftReturnUrl, buildDatasetTermsReturnUrl } from '../datasetTermsNavigation'
import styles from './EditGuestbook.module.scss'

interface EditGuestbookProps {
Expand All @@ -40,16 +36,13 @@ export function EditGuestbook({
const navigateToDatasetView = useCallback(() => {
if (!dataset) return

const searchParams = new URLSearchParams()
searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId)
navigate(buildDatasetTermsReturnUrl(dataset))
}, [dataset, navigate])

if (dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) {
searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT)
} else {
searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString())
}
const navigateToDatasetDraftView = useCallback(() => {
if (!dataset) return

navigate(`${Route.DATASETS}?${searchParams.toString()}`)
navigate(buildDatasetDraftReturnUrl(dataset))
}, [dataset, navigate])

const handleCancel = () => {
Expand All @@ -70,7 +63,7 @@ export function EditGuestbook({
onSuccessfulAssignDatasetGuestbook: () => {
toast.success(t('alerts.termsUpdated.alertText'))
refreshDataset()
navigateToDatasetView()
navigateToDatasetDraftView()
}
})
const {
Expand All @@ -82,7 +75,7 @@ export function EditGuestbook({
onSuccessfulRemoveDatasetGuestbook: () => {
toast.success(t('alerts.termsUpdated.alertText'))
refreshDataset()
navigateToDatasetView()
navigateToDatasetDraftView()
}
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,7 @@ import { useGetLicenses } from './useGetLicenses'
import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository'
import { useDataset } from '../../dataset/DatasetContext'
import { useUpdateDatasetLicense } from './useUpdateDatasetLicense'
import { Route, QueryParamKey } from '../../Route.enum'
import {
DatasetNonNumericVersionSearchParam,
DatasetPublishingStatus
} from '../../../dataset/domain/models/Dataset'
import { buildDatasetDraftReturnUrl, buildDatasetTermsReturnUrl } from '../datasetTermsNavigation'
import styles from './EditLicenseAndTerms.module.scss'

const CUSTOM_LICENSE_VALUE = 'CUSTOM' as const
Expand Down Expand Up @@ -50,24 +46,21 @@ export function EditLicenseAndTerms({
const navigateToDatasetView = useCallback(() => {
if (!dataset) return

const searchParams = new URLSearchParams()
searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId)
navigate(buildDatasetTermsReturnUrl(dataset))
}, [dataset, navigate])

if (dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) {
searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT)
} else {
searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString())
}
const navigateToDatasetDraftView = useCallback(() => {
if (!dataset) return

navigate(`${Route.DATASETS}?${searchParams.toString()}`)
navigate(buildDatasetDraftReturnUrl(dataset))
}, [dataset, navigate])

const { handleUpdateLicense, isLoading, error } = useUpdateDatasetLicense({
datasetRepository,
onSuccessfulUpdateLicense: () => {
toast.success(t('alerts.licenseUpdated.alertText'))
refreshDataset()
navigateToDatasetView()
navigateToDatasetDraftView()
}
})

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
import { useEffect, useMemo, useRef } from 'react'
import { useCallback, useEffect, useMemo, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import { useForm, Controller, FormProvider, useWatch } from 'react-hook-form'
import { toast } from 'react-toastify'
import { Form, Row, Col, Button, Alert } from '@iqss/dataverse-design-system'
import styles from '../edit-license-and-terms/EditLicenseAndTerms.module.scss'
import {
DatasetNonNumericVersionSearchParam,
DatasetPublishingStatus,
TermsOfAccess
} from '@/dataset/domain/models/Dataset'
import { TermsOfAccess } from '@/dataset/domain/models/Dataset'
import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository'
import { useDataset } from '../../dataset/DatasetContext'
import { useUpdateTermsOfAccess } from './useUpdateTermsOfAccess'
import { QueryParamKey, Route } from '@/sections/Route.enum'
import { useNavigate } from 'react-router-dom'
import { buildDatasetDraftReturnUrl, buildDatasetTermsReturnUrl } from '../datasetTermsNavigation'

interface EditTermsOfAccessProps {
datasetRepository: DatasetRepository
Expand Down Expand Up @@ -43,12 +39,18 @@ export function EditTermsOfAccess({
const initialTermsOfAccess =
(dataset?.termsOfUse.termsOfAccess as TermsOfAccess) ?? defaultTermsOfAccess
const formContainerRef = useRef<HTMLDivElement>(null)
const navigateToDatasetDraftView = useCallback(() => {
if (!dataset) return

navigate(buildDatasetDraftReturnUrl(dataset))
}, [dataset, navigate])

const { handleUpdateTermsOfAccess, isLoading, error } = useUpdateTermsOfAccess({
datasetRepository,
onSuccessfulUpdateTermsOfAccess: () => {
toast.success(t('alerts.termsUpdated.alertText'))
refreshDataset()
navigateToDatasetDraftView()
}
})

Expand Down Expand Up @@ -122,16 +124,7 @@ export function EditTermsOfAccess({
const handleCancel = () => {
if (!dataset) return

const searchParams = new URLSearchParams()
searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId)

if (dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) {
searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT)
} else {
searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString())
}

navigate(`${Route.DATASETS}?${searchParams.toString()}`)
navigate(buildDatasetTermsReturnUrl(dataset))
}

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const FileToolOptions = ({ fileId, fileType, kind }: FileToolOptionsProps) => {
<Icon />
</DropdownHeader>

{tools.map((tool) => (
{applicableTools.map((tool) => (
<ToolOption
key={tool.id}
toolId={tool.id}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import { JSDataverseWriteErrorHandler } from '@/shared/helpers/JSDataverseWriteE
import { File } from '@/files/domain/models/File'
import { FilePageHelper } from '../FilePageHelper'
import styles from './FileEmbeddedExternalTool.module.scss'
import { DatasetPublishingStatus, defaultLicense } from '@/dataset/domain/models/Dataset'
import { DownloadWithTermsAndGuestbookModal } from '@/sections/dataset/dataset-files/files-table/file-actions/file-actions-cell/file-action-buttons/file-options-menu/DownloadWithTermsAndGuestbookModal'

interface FileEmbeddedExternalToolProps {
file: File
Expand All @@ -36,8 +38,20 @@ export const FileEmbeddedExternalTool = ({
const [errorLoadingTool, setErrorLoadingTool] = useState<string | null>(null)
const [fileExternalToolResolved, setFileExternalToolResolved] =
useState<FileExternalToolResolved | null>(null)
const [showTermsAndGuestbookModal, setShowTermsAndGuestbookModal] = useState<boolean>(false)
const [termsAndGuestbookAccepted, setTermsAndGuestbookAccepted] = useState<boolean>(false)

const moreThanOneTool = applicableTools.length > 1
const bypassTermsGuard =
file.datasetVersion.publishingStatus === DatasetPublishingStatus.DRAFT ||
file.permissions.canEditOwnerDataset
const hasGuestbook = file.guestbookId !== undefined
const hasCustomTerms = file.datasetCustomTerms !== undefined
const hasNonDefaultLicense =
file.datasetLicense !== undefined && file.datasetLicense.name !== defaultLicense.name
const requiresTermsAndGuestbook =
!bypassTermsGuard && (hasGuestbook || hasCustomTerms || hasNonDefaultLicense)
const isWaitingForTermsAndGuestbook = requiresTermsAndGuestbook && !termsAndGuestbookAccepted
Comment on lines +41 to +54

const handleToolSelect = (eventKey: string | null) => setToolIdSelected(Number(eventKey))

Expand All @@ -50,6 +64,10 @@ export const FileEmbeddedExternalTool = ({
// Loads the tool every time the tab is in view or the tool selection changes.
useEffect(() => {
if (!isInView) return
if (isWaitingForTermsAndGuestbook) {
setShowTermsAndGuestbookModal(true)
return
}
Comment on lines 64 to +70

const fetchFileExternalToolResolved = async () => {
setIframeLoaded(false)
Expand Down Expand Up @@ -78,10 +96,30 @@ export const FileEmbeddedExternalTool = ({
}

void fetchFileExternalToolResolved()
}, [isInView, toolIdSelected, externalToolsRepository, file.id, t, i18n.languages])
}, [
isInView,
isWaitingForTermsAndGuestbook,
toolIdSelected,
externalToolsRepository,
file.id,
t,
i18n.languages
])

return (
<section>
{requiresTermsAndGuestbook && showTermsAndGuestbookModal && (
<DownloadWithTermsAndGuestbookModal
fileId={file.id}
guestbookId={file.guestbookId}
datasetPersistentId={file.datasetPersistentId}
datasetLicense={file.datasetLicense}
datasetCustomTerms={file.datasetCustomTerms}
show={showTermsAndGuestbookModal}
handleClose={() => setShowTermsAndGuestbookModal(false)}
onAccept={() => setTermsAndGuestbookAccepted(true)}
/>
)}
<header className={styles.header}>
{moreThanOneTool && (
<DropdownButton
Expand Down Expand Up @@ -133,9 +171,16 @@ export const FileEmbeddedExternalTool = ({
data-testid="external-tool-iframe"></iframe>
)}
{/* Keep overlay on top of the iframe while it loads to mask flickering */}
<div aria-hidden={true} className={styles.overlay} data-testid="loading-overlay">
<Spinner />
</div>
{!isWaitingForTermsAndGuestbook && (
<div aria-hidden={true} className={styles.overlay} data-testid="loading-overlay">
<Spinner />
</div>
)}
{isWaitingForTermsAndGuestbook && !showTermsAndGuestbookModal && (
<Alert variant="info" dismissible={false}>
{t('termsRequired')}
</Alert>
)}
{/* Show error message if fetching the tool URL fails or the iframe somehow fails. */}
{errorLoadingTool && (
<Alert variant="danger" dismissible={false}>
Expand Down
Loading
Loading