diff --git a/public/locales/en/createDataset.json b/public/locales/en/createDataset.json index c3a97929f..e36a9bff8 100644 --- a/public/locales/en/createDataset.json +++ b/public/locales/en/createDataset.json @@ -4,6 +4,12 @@ "title": "Metadata Tip", "content": "After adding the dataset, click the Edit Dataset button to add more metadata." }, + "hostCollection": { + "label": "Host Collection", + "description": "The collection which contains this data.", + "helpText": "Changing the host collection will clear any fields you may have entered data into.", + "buttonLabel": "Edit Host Collection" + }, "requiredFields": "Asterisks indicate required fields", "validationAlert": { "title": "Validation Error", diff --git a/src/dataset/domain/repositories/DatasetRepository.ts b/src/dataset/domain/repositories/DatasetRepository.ts index 92c16eb8d..f86b954a4 100644 --- a/src/dataset/domain/repositories/DatasetRepository.ts +++ b/src/dataset/domain/repositories/DatasetRepository.ts @@ -6,7 +6,7 @@ import { DatasetsWithCount } from '../models/DatasetsWithCount' export interface DatasetRepository { getByPersistentId: (persistentId: string, version?: string) => Promise getByPrivateUrlToken: (privateUrlToken: string) => Promise - create: (dataset: DatasetDTO) => Promise<{ persistentId: string }> + create: (dataset: DatasetDTO, collectionId?: string) => Promise<{ persistentId: string }> getAllWithCount: ( collectionId: string, paginationInfo: DatasetPaginationInfo diff --git a/src/dataset/domain/useCases/createDataset.ts b/src/dataset/domain/useCases/createDataset.ts index 0a94c9744..abe0a943f 100644 --- a/src/dataset/domain/useCases/createDataset.ts +++ b/src/dataset/domain/useCases/createDataset.ts @@ -3,9 +3,10 @@ import { DatasetDTO } from './DTOs/DatasetDTO' export function createDataset( datasetRepository: DatasetRepository, - dataset: DatasetDTO + dataset: DatasetDTO, + collectionId: string ): Promise<{ persistentId: string }> { - return datasetRepository.create(dataset).catch((error: Error) => { + return datasetRepository.create(dataset, collectionId).catch((error: Error) => { throw new Error(error.message) }) } diff --git a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts index 7196403a5..b158842c2 100644 --- a/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts +++ b/src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts @@ -27,7 +27,7 @@ import { JSDatasetPreviewMapper } from '../mappers/JSDatasetPreviewMapper' import { DatasetDTO } from '../../domain/useCases/DTOs/DatasetDTO' import { DatasetDTOMapper } from '../mappers/DatasetDTOMapper' import { DatasetsWithCount } from '../../domain/models/DatasetsWithCount' - +const defaultCollectionId = 'root' const includeDeaccessioned = true type DatasetDetails = [JSDataset, string[], string, JSDatasetPermissions, JSDatasetLock[]] @@ -180,9 +180,12 @@ export class DatasetJSDataverseRepository implements DatasetRepository { }) } - create(dataset: DatasetDTO): Promise<{ persistentId: string }> { + create( + dataset: DatasetDTO, + collectionId = defaultCollectionId + ): Promise<{ persistentId: string }> { return createDataset - .execute(DatasetDTOMapper.toJSDatasetDTO(dataset)) + .execute(DatasetDTOMapper.toJSDatasetDTO(dataset), collectionId) .then((jsDatasetIdentifiers: JSDatasetIdentifiers) => ({ persistentId: jsDatasetIdentifiers.persistentId })) diff --git a/src/sections/create-dataset/CreateDataset.tsx b/src/sections/create-dataset/CreateDataset.tsx index 0de00abe7..f6e2ccd97 100644 --- a/src/sections/create-dataset/CreateDataset.tsx +++ b/src/sections/create-dataset/CreateDataset.tsx @@ -8,6 +8,9 @@ import { type MetadataBlockInfoRepository } from '../../metadata-block-info/doma import { SeparationLine } from '../shared/layout/SeparationLine/SeparationLine' import { DatasetForm } from './DatasetForm' import { DatasetFormSkeleton } from './DatasetFormSkeleton' +import { HostCollectionForm } from './HostCollectionForm/HostCollectionForm' +import { NotImplementedModal } from '../not-implemented/NotImplementedModal' +import { useNotImplementedModal } from '../not-implemented/NotImplementedModalContext' interface CreateDatasetProps { repository: DatasetRepository @@ -22,7 +25,7 @@ export function CreateDataset({ }: CreateDatasetProps) { const { t } = useTranslation('createDataset') const { isLoading, setIsLoading } = useLoading() - + const { isModalOpen, hideModal } = useNotImplementedModal() const { metadataBlocks, isLoading: isLoadingMetadataBlocksConfiguration, @@ -41,21 +44,27 @@ export function CreateDataset({ }, [isLoading, isLoadingMetadataBlocksConfiguration]) return ( -
-
-

{t('pageTitle')}

-
- - {isLoadingMetadataBlocksConfiguration ? ( - - ) : ( - - )} -
+ <> + +
+
+

{t('pageTitle')}

+
+ + + + {isLoadingMetadataBlocksConfiguration ? ( + + ) : ( + + )} +
+ ) } diff --git a/src/sections/create-dataset/CreateDatasetFactory.tsx b/src/sections/create-dataset/CreateDatasetFactory.tsx index 77eb751ec..1d8675683 100644 --- a/src/sections/create-dataset/CreateDatasetFactory.tsx +++ b/src/sections/create-dataset/CreateDatasetFactory.tsx @@ -3,13 +3,18 @@ import { useSearchParams } from 'react-router-dom' import { CreateDataset } from './CreateDataset' import { DatasetJSDataverseRepository } from '../../dataset/infrastructure/repositories/DatasetJSDataverseRepository' import { MetadataBlockInfoJSDataverseRepository } from '../../metadata-block-info/infrastructure/repositories/MetadataBlockInfoJSDataverseRepository' +import { NotImplementedModalProvider } from '../not-implemented/NotImplementedModalProvider' const repository = new DatasetJSDataverseRepository() const metadataBlockInfoRepository = new MetadataBlockInfoJSDataverseRepository() export class CreateDatasetFactory { static create(): ReactElement { - return + return ( + + + + ) } } diff --git a/src/sections/create-dataset/DatasetForm.tsx b/src/sections/create-dataset/DatasetForm.tsx index 51a6c5db7..67a10742f 100644 --- a/src/sections/create-dataset/DatasetForm.tsx +++ b/src/sections/create-dataset/DatasetForm.tsx @@ -14,6 +14,7 @@ import { Route } from '../Route.enum' interface DatasetFormProps { repository: DatasetRepository + collectionId?: string metadataBlocks: MetadataBlockInfo[] errorLoadingMetadataBlocks: string | null formDefaultValues: CreateDatasetFormValues @@ -21,6 +22,7 @@ interface DatasetFormProps { export const DatasetForm = ({ repository, + collectionId = 'root', metadataBlocks, errorLoadingMetadataBlocks, formDefaultValues @@ -29,7 +31,7 @@ export const DatasetForm = ({ const { t } = useTranslation('createDataset') const accordionRef = useRef(null) - const { submissionStatus, submitForm } = useCreateDatasetForm(repository) + const { submissionStatus, submitForm } = useCreateDatasetForm(repository, collectionId) const isErrorLoadingMetadataBlocks = Boolean(errorLoadingMetadataBlocks) diff --git a/src/sections/create-dataset/HostCollectionForm/HostCollectionForm.module.scss b/src/sections/create-dataset/HostCollectionForm/HostCollectionForm.module.scss new file mode 100644 index 000000000..6bb5ebf06 --- /dev/null +++ b/src/sections/create-dataset/HostCollectionForm/HostCollectionForm.module.scss @@ -0,0 +1,25 @@ +.input-button-wrapper { + display: flex; + flex-direction: column; + gap: 1rem; + + @media (min-width: 768px) { + flex-direction: row; + gap: 0; + + button { + width: 100%; + } + } +} + +.edit-button-wrapper { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-end; + + @media (min-width: 768px) { + padding-left: 1rem; + } +} \ No newline at end of file diff --git a/src/sections/create-dataset/HostCollectionForm/HostCollectionForm.tsx b/src/sections/create-dataset/HostCollectionForm/HostCollectionForm.tsx new file mode 100644 index 000000000..ffb8f37ed --- /dev/null +++ b/src/sections/create-dataset/HostCollectionForm/HostCollectionForm.tsx @@ -0,0 +1,35 @@ +import { Button, Col } from '@iqss/dataverse-design-system' +import { Form } from '@iqss/dataverse-design-system' +import { useTranslation } from 'react-i18next' +import { useNotImplementedModal } from '../../not-implemented/NotImplementedModalContext' +import styles from './HostCollectionForm.module.scss' + +interface HostCollectionFormProps { + collectionId: string +} + +export function HostCollectionForm({ collectionId }: HostCollectionFormProps) { + const { t } = useTranslation('createDataset') + const { showModal } = useNotImplementedModal() + + return ( + <> + + + {t('hostCollection.label')} + + + + {t('hostCollection.helpText')} + + + + + + + + + ) +} diff --git a/src/sections/create-dataset/useCreateDatasetForm.tsx b/src/sections/create-dataset/useCreateDatasetForm.tsx index 4a4cad59a..801d2a391 100644 --- a/src/sections/create-dataset/useCreateDatasetForm.tsx +++ b/src/sections/create-dataset/useCreateDatasetForm.tsx @@ -12,7 +12,10 @@ export enum SubmissionStatus { Errored = 'Errored' } -export function useCreateDatasetForm(repository: DatasetRepository): { +export function useCreateDatasetForm( + repository: DatasetRepository, + collectionId: string +): { submissionStatus: SubmissionStatus submitForm: (formData: CreateDatasetFormValues) => void } { @@ -30,7 +33,7 @@ export function useCreateDatasetForm(repository: DatasetRepository): { formDataBackToOriginalKeys ) - createDataset(repository, formattedFormValues) + createDataset(repository, formattedFormValues, collectionId) .then(({ persistentId }) => { setSubmissionStatus(SubmissionStatus.SubmitComplete) navigate(`${Route.DATASETS}?persistentId=${persistentId}`, { diff --git a/src/stories/create-dataset/DatasetCreate.stories.tsx b/src/stories/create-dataset/DatasetCreate.stories.tsx index 4d1688a78..0bdd2dfe0 100644 --- a/src/stories/create-dataset/DatasetCreate.stories.tsx +++ b/src/stories/create-dataset/DatasetCreate.stories.tsx @@ -6,6 +6,7 @@ import { DatasetMockRepository } from '../dataset/DatasetMockRepository' import { MetadataBlockInfoMockRepository } from './MetadataBlockInfoMockRepository' import { MetadataBlockInfoMockLoadingRepository } from './MetadataBlockInfoMockLoadingRepository' import { MetadataBlockInfoMockErrorRepository } from './MetadataBlockInfoMockErrorRepository' +import { NotImplementedModalProvider } from '../../sections/not-implemented/NotImplementedModalProvider' const meta: Meta = { title: 'Pages/Create Dataset', @@ -17,10 +18,12 @@ type Story = StoryObj export const Default: Story = { render: () => ( - + + + ) } diff --git a/tests/component/sections/create-dataset/CreateDataset.spec.tsx b/tests/component/sections/create-dataset/CreateDataset.spec.tsx index 512df50ff..fc61209f1 100644 --- a/tests/component/sections/create-dataset/CreateDataset.spec.tsx +++ b/tests/component/sections/create-dataset/CreateDataset.spec.tsx @@ -3,6 +3,7 @@ import { DatasetRepository } from '../../../../src/dataset/domain/repositories/D import { MetadataBlockInfoRepository } from '../../../../src/metadata-block-info/domain/repositories/MetadataBlockInfoRepository' import { MetadataBlockInfoMother } from '../../metadata-block-info/domain/models/MetadataBlockInfoMother' import { TypeMetadataFieldOptions } from '../../../../src/metadata-block-info/domain/models/MetadataBlockInfo' +import { NotImplementedModalProvider } from '../../../../src/sections/not-implemented/NotImplementedModalProvider' const datasetRepository: DatasetRepository = {} as DatasetRepository const metadataBlockInfoRepository: MetadataBlockInfoRepository = {} as MetadataBlockInfoRepository @@ -63,7 +64,25 @@ describe('Create Dataset', () => { .stub() .resolves(collectionMetadataBlocksInfo) }) - + it('renders the Host Collection Form', () => { + cy.customMount( + + + + ) + cy.findByText(/^Host Collection/i).should('exist') + cy.findByDisplayValue('test-collectionId').should('exist') + cy.findByText(/^Edit Host Collection/i) + .should('exist') + .click() + .then(() => { + cy.findByText('Not Implemented').should('exist') + }) + }) it('renders the Create Dataset page and its metadata blocks sections', () => { cy.customMount( { /> ) cy.findByText(/Create Dataset/i).should('exist') - cy.findByText(/Citation Metadata/i).should('exist') cy.findByText(/Astronomy and Astrophysics Metadata/i).should('exist') })