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 src/dataset/domain/models/DatasetVersionSummaryInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export type DatasetVersionSummary = {

export interface Deaccessioned {
reason: string
url: string
url?: string
}

export interface SummaryUpdates {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useState } from 'react'
import { toast } from 'react-toastify'
import { useContext } from 'react'
import { useForm, SubmitHandler } from 'react-hook-form'
import { DatasetContext } from '@/sections/dataset/DatasetContext'
import { Dataset } from '../../../../dataset/domain/models/Dataset'
import { DropdownButtonItem, DropdownSeparator } from '@iqss/dataverse-design-system'
Expand All @@ -10,7 +11,7 @@ import { DatasetRepository } from '@/dataset/domain/repositories/DatasetReposito
import { DeaccessionFormData } from '@/sections/dataset/deaccession-dataset/DeaccessionFormData'
import { useDeaccessionDataset } from '@/sections/dataset/deaccession-dataset/useDeaccessionDataset'
import { ConfirmationModal } from '@/sections/dataset/deaccession-dataset/ConfirmationModal'
import { useForm, SubmitHandler } from 'react-hook-form'
import { Deaccessioned } from '@/dataset/domain/models/DatasetVersionSummaryInfo'

interface DeaccessionDatasetButtonProps {
dataset: Dataset
Expand All @@ -31,9 +32,10 @@ export function DeaccessionDatasetButton({
onDeaccessionSucceed
)
const publishedVersions =
dataset.versionsSummaries?.filter(
(version) => version.publishedOn && version.summary !== 'versionDeaccessioned'
) || []
dataset.versionsSummaries?.filter((version) => {
const summary = version.summary as { deaccessioned: Deaccessioned }
return version.publishedOn && !summary.deaccessioned
}) || []
const defaultVersions = publishedVersions.length === 1 ? [publishedVersions[0].versionNumber] : []
function onDeaccessionSucceed() {
setShowConfirmationModal(false)
Expand Down
14 changes: 10 additions & 4 deletions src/sections/dataset/deaccession-dataset/ConfirmationModal.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Modal, Button, Alert } from '@iqss/dataverse-design-system'
import { Modal, Button, Alert, Spinner, Stack } from '@iqss/dataverse-design-system'
import { useTranslation } from 'react-i18next'
import { SubmissionStatus } from '@/sections/shared/form/DatasetMetadataForm/useSubmitDataset'

Expand All @@ -18,6 +18,7 @@ export function ConfirmationModal({
onCancel
}: ConfirmationModalProps) {
const { t } = useTranslation(['dataset', 'shared'])
const isDeaccessioning = submissionStatus === SubmissionStatus.IsSubmitting

return (
<Modal size={'lg'} show={show} onHide={onCancel}>
Expand All @@ -35,10 +36,15 @@ export function ConfirmationModal({
)}
</Modal.Body>
<Modal.Footer>
<Button variant="primary" onClick={onConfirm}>
{t('yes', { ns: 'shared' })}
<Button variant="primary" onClick={onConfirm} disabled={isDeaccessioning}>
<Stack direction="horizontal" gap={1}>
{t('yes', { ns: 'shared' })}
{isDeaccessioning && (
<Spinner variant="light" animation="border" size="sm" data-testid="loading-spinner" />
)}
</Stack>
</Button>
<Button variant="secondary" onClick={onCancel}>
<Button variant="secondary" onClick={onCancel} disabled={isDeaccessioning}>
{t('no', { ns: 'shared' })}
</Button>
</Modal.Footer>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Trans, useTranslation } from 'react-i18next'
import { Alert, Button, Form, Modal, Stack } from '@iqss/dataverse-design-system'
import { Alert, Button, Col, Form, Modal, Stack } from '@iqss/dataverse-design-system'
import { DatasetVersionSummaryInfo } from '@/dataset/domain/models/DatasetVersionSummaryInfo'
import { isValidURL } from '@/metadata-block-info/domain/models/fieldValidations'
import { DeaccessionFormData } from './DeaccessionFormData'
Expand Down Expand Up @@ -58,7 +58,7 @@ export function DeaccessionDatasetModal({
</Alert>
<form noValidate={true} onSubmit={handleSubmitForm}>
{publishedVersions.length > 1 && (
<Form.Group>
<Form.Group as={Col}>
<Form.Group.Label>{t('deaccession.version.label')}</Form.Group.Label>
<div>
<Controller
Expand All @@ -85,7 +85,6 @@ export function DeaccessionDatasetModal({
const newValue = e.target.checked
? [...field.value, e.target.value]
: field.value.filter((val) => val !== e.target.value)

field.onChange(newValue)
}}
/>
Expand All @@ -97,7 +96,7 @@ export function DeaccessionDatasetModal({
</div>
</Form.Group>
)}
<Form.Group controlId={'deccessionReason'}>
<Form.Group as={Col} controlId={'deccessionReason'}>
<Form.Group.Label required>{t('deaccession.reason.label')}</Form.Group.Label>
<Controller
name="deaccessionReason"
Expand Down Expand Up @@ -136,7 +135,7 @@ export function DeaccessionDatasetModal({
</>
)}></Controller>
</Form.Group>
<Form.Group>
<Form.Group as={Col}>
<Form.Group.Label>{t('deaccession.reasonOther.label')}</Form.Group.Label>
<Controller
name="deaccessionReasonOther"
Expand All @@ -156,7 +155,7 @@ export function DeaccessionDatasetModal({
)}
/>
</Form.Group>
<Form.Group>
<Form.Group as={Col}>
<Form.Group.Label>{t('deaccession.forwardUrl.label')}</Form.Group.Label>
<Controller
name="deaccessionForwardUrl"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,37 @@ export default meta

type Story = StoryObj<typeof ConfirmationModal>
export const Default: Story = {
render: () => (
<ConfirmationModal
show={true}
submissionStatus={SubmissionStatus.NotSubmitted}
deaccessionError={null}
onConfirm={() => {}}
onCancel={() => {}}
/>
)
}

export const WithLoading: Story = {
render: () => (
<ConfirmationModal
show={true}
submissionStatus={SubmissionStatus.IsSubmitting}
deaccessionError={null}
onConfirm={() => {}}
onCancel={() => {}}></ConfirmationModal>
onCancel={() => {}}
/>
)
}

export const WithError: Story = {
render: () => (
<ConfirmationModal
show={true}
submissionStatus={SubmissionStatus.Errored}
deaccessionError={'Error message'}
onConfirm={() => {}}
onCancel={() => {}}></ConfirmationModal>
onCancel={() => {}}
/>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,20 @@ export const Default: Story = {
control={control}
errors={{}}
publishedVersions={[
{ id: 1, contributors: 'contributors', versionNumber: '1.0', publishedOn: '2023-01-01' },
{ id: 2, contributors: 'contributors', versionNumber: '1.1', publishedOn: '2023-02-01' }
{
id: 1,
contributors: 'contributors',
versionNumber: '1.0',
publishedOn: '2023-01-01',
summary: {}
},
{
id: 2,
contributors: 'contributors',
versionNumber: '1.1',
publishedOn: '2023-02-01',
summary: {}
}
]}
/>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,19 +115,22 @@ describe('DeaccessionDatasetButton', () => {
id: 1,
versionNumber: '1.0',
publishedOn: '2021-01-01',
contributors: 'Contributors'
contributors: 'Contributors',
summary: {}
},
{
id: 2,
versionNumber: '2.0',
publishedOn: '2021-01-02',
contributors: 'Contributors'
contributors: 'Contributors',
summary: {}
},
{
id: 3,
versionNumber: 'draft',
publishedOn: undefined,
contributors: 'Contributors'
contributors: 'Contributors',
summary: {}
}
]
const dataset = DatasetMother.create({
Expand Down Expand Up @@ -232,7 +235,90 @@ describe('DeaccessionDatasetButton', () => {
cy.findByTestId('deaccession-forward-url').type('https://example.com')
cy.get('button[type="submit"]').click()
cy.get('button').contains('Yes').should('exist').click()
cy.wrap(repository.deaccession).should('be.calledTwice')
cy.wrap(repository.deaccession).should('have.been.called')
})

it('does not show deaccessioned versions in the version list', () => {
const versionsSummaries: DatasetVersionSummaryInfo[] = [
{
id: 1,
versionNumber: '1.0',
publishedOn: '2021-01-01',
contributors: 'Contributors',
summary: {
deaccessioned: {
reason: 'IRB request.',
url: 'https://example.com'
}
}
},
{
id: 2,
versionNumber: '2.0',
publishedOn: '2021-01-02',
contributors: 'Contributors',
summary: {}
},
{
id: 3,
versionNumber: '3.0',
publishedOn: '2021-01-22',
contributors: 'Contributors',
summary: {}
}
]

const dataset = DatasetMother.create({
permissions: DatasetPermissionsMother.createWithPublishingDatasetAllowed(),
version: DatasetVersionMother.createReleased(),
versionsSummaries: versionsSummaries
})

cy.customMount(<DeaccessionDatasetButton dataset={dataset} datasetRepository={repository} />)

cy.findByRole('button', { name: 'Deaccession Dataset' }).click()
cy.get('form').should('exist')
cy.findByText('1.0 - 2021-01-01').should('not.exist')
cy.findByText('2.0 - 2021-01-02').should('exist')
cy.findByText('3.0 - 2021-01-22').should('exist')
cy.get('input[type="checkbox"]').should('have.length', 2)
})

it('does not show versions list in the version list if there is only one deaccessioned version available', () => {
const versionsSummaries: DatasetVersionSummaryInfo[] = [
{
id: 1,
versionNumber: '1.0',
publishedOn: '2021-01-01',
contributors: 'Contributors',
summary: {
deaccessioned: {
reason: 'IRB request.',
url: 'https://example.com'
}
}
},
{
id: 2,
versionNumber: '2.0',
publishedOn: '2021-01-02',
contributors: 'Contributors',
summary: {}
}
]

const dataset = DatasetMother.create({
permissions: DatasetPermissionsMother.createWithPublishingDatasetAllowed(),
version: DatasetVersionMother.createReleased(),
versionsSummaries: versionsSummaries
})

cy.customMount(<DeaccessionDatasetButton dataset={dataset} datasetRepository={repository} />)

cy.findByRole('button', { name: 'Deaccession Dataset' }).click()
cy.get('form').should('exist')
cy.findByText('1.0 - 2021-01-01').should('not.exist')
cy.findByText('2.0 - 2021-01-02').should('not.exist')
})
})
})
Loading