Skip to content

Commit df5e284

Browse files
committed
Update from js dataverse type
1 parent 74a8a1f commit df5e284

9 files changed

Lines changed: 111 additions & 25 deletions

File tree

src/dataset/domain/repositories/DatasetRepository.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { DatasetLicenseUpdateRequest } from '../models/DatasetLicenseUpdateReque
1212
import { CollectionSummary } from '@/collection/domain/models/CollectionSummary'
1313
import { DatasetVersionPaginationInfo } from '../models/DatasetVersionPaginationInfo'
1414
import { DatasetUploadLimits } from '../models/DatasetUploadLimits'
15+
import { DatasetType } from '../models/DatasetType'
1516

1617
export interface DatasetRepository {
1718
getByPersistentId: (
@@ -29,7 +30,11 @@ export interface DatasetRepository {
2930
includeDeaccessioned: boolean
3031
) => Promise<DatasetVersionDiff>
3132

32-
create: (dataset: DatasetDTO, collectionId: string) => Promise<{ persistentId: string }>
33+
create: (
34+
dataset: DatasetDTO,
35+
collectionId: string,
36+
datasetType?: DatasetType
37+
) => Promise<{ persistentId: string }>
3338
updateMetadata: (
3439
datasetId: string | number,
3540
datasetDTO: DatasetDTO,
@@ -70,4 +75,5 @@ export interface DatasetRepository {
7075
unlink(datasetId: string | number, collectionIdOrAlias: string | number): Promise<void>
7176
getDatasetLinkedCollections: (datasetId: string | number) => Promise<CollectionSummary[]>
7277
getDatasetUploadLimits: (datasetId: string | number) => Promise<DatasetUploadLimits>
78+
getAvailableDatasetTypes: () => Promise<DatasetType[]>
7379
}

src/dataset/domain/useCases/createDataset.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import { DatasetDTO } from './DTOs/DatasetDTO'
44
export function createDataset(
55
datasetRepository: DatasetRepository,
66
dataset: DatasetDTO,
7-
collectionId: string
7+
collectionId: string,
8+
datasetType?: string
89
): Promise<{ persistentId: string }> {
9-
return datasetRepository.create(dataset, collectionId).catch((error: Error) => {
10+
return datasetRepository.create(dataset, collectionId, datasetType).catch((error: Error) => {
1011
throw new Error(error.message)
1112
})
1213
}

src/dataset/infrastructure/mappers/JSDatasetMapper.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ export class JSDatasetMapper {
4949
latestPublishedVersionMajorNumber?: number,
5050
latestPublishedVersionMinorNumber?: number,
5151
datasetVersionDiff?: JSDatasetVersionDiff,
52-
fileStore?: string
52+
fileStore?: string,
53+
datasetType?: string
5354
): Dataset {
5455
const version = JSDatasetVersionMapper.toVersion(
5556
jsDataset.versionId,
@@ -100,7 +101,8 @@ export class JSDatasetMapper {
100101
latestPublishedVersionMinorNumber
101102
),
102103
JSDatasetMapper.toRequiresMajorVersionUpdate(datasetVersionDiff),
103-
fileStore
104+
fileStore,
105+
datasetType
104106
).build()
105107
}
106108

src/dataset/infrastructure/repositories/DatasetJSDataverseRepository.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ import {
4444
getDatasetLinkedCollections,
4545
updateTermsOfAccess,
4646
updateDatasetLicense,
47-
getDatasetUploadLimits
47+
getDatasetUploadLimits,
48+
DatasetType,
49+
getDatasetAvailableDatasetTypes
4850
} from '@iqss/dataverse-client-javascript'
4951
import { JSDatasetMapper } from '../mappers/JSDatasetMapper'
5052
import { DatasetPaginationInfo } from '../../domain/models/DatasetPaginationInfo'
@@ -64,6 +66,7 @@ import { AxiosResponse } from 'axios'
6466
import { JSDataverseReadErrorHandler } from '@/shared/helpers/JSDataverseReadErrorHandler'
6567
import { CollectionSummary } from '@/collection/domain/models/CollectionSummary'
6668
import { DatasetUploadLimits } from '@/dataset/domain/models/DatasetUploadLimits'
69+
import { DatasetType } from '@/dataset/domain/models/DatasetType'
6770

6871
const includeDeaccessioned = true
6972

@@ -269,7 +272,8 @@ export class DatasetJSDataverseRepository implements DatasetRepository {
269272
datasetDetails.latestPublishedVersionMajorNumber,
270273
datasetDetails.latestPublishedVersionMinorNumber,
271274
datasetDetails.datasetVersionDiff,
272-
datasetDetails.fileStore
275+
datasetDetails.fileStore,
276+
datasetDetails.datasetType
273277
)
274278
})
275279
.catch((error: ReadError) => {
@@ -327,9 +331,13 @@ export class DatasetJSDataverseRepository implements DatasetRepository {
327331
})
328332
}
329333

330-
create(dataset: DatasetDTO, collectionId: string): Promise<{ persistentId: string }> {
334+
create(
335+
dataset: DatasetDTO,
336+
collectionId: string,
337+
datasetType?: string
338+
): Promise<{ persistentId: string }> {
331339
return createDataset
332-
.execute(DatasetDTOMapper.toJSDatasetDTO(dataset), collectionId)
340+
.execute(DatasetDTOMapper.toJSDatasetDTO(dataset), collectionId, datasetType)
333341
.then((jsDatasetIdentifiers: JSDatasetIdentifiers) => ({
334342
persistentId: jsDatasetIdentifiers.persistentId
335343
}))
@@ -431,6 +439,10 @@ export class DatasetJSDataverseRepository implements DatasetRepository {
431439
return getDatasetLinkedCollections.execute(datasetId)
432440
}
433441

442+
getAvailableDatasetTypes: () => Promise<DatasetType[]> = () => {
443+
return getDatasetAvailableDatasetTypes.execute()
444+
}
445+
434446
/*
435447
TODO: This is a temporary solution as this use case doesn't exist in js-dataverse yet and the API should also return the file store type rather than name only.
436448
After https://github.com/IQSS/dataverse/issues/11695 is implemented, create a js-dataverse use case.

src/metadata-block-info/domain/repositories/MetadataBlockInfoRepository.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ export interface MetadataBlockInfoRepository {
88
getByName: (name: string) => Promise<MetadataBlockInfoDisplayFormat | undefined>
99
getAll: () => Promise<MetadataBlockInfo[]>
1010
getDisplayedOnCreateByCollectionId: (
11-
collectionId: number | string
11+
collectionId: number | string,
12+
datasetType?: string
13+
) => Promise<MetadataBlockInfo[]>
14+
getByCollectionId: (
15+
collectionId: number | string,
16+
datasetType?: string
1217
) => Promise<MetadataBlockInfo[]>
13-
getByCollectionId: (collectionId: number | string) => Promise<MetadataBlockInfo[]>
1418
getAllFacetableMetadataFields: () => Promise<MetadataField[]>
1519
}

src/metadata-block-info/domain/useCases/getDisplayedOnCreateMetadataBlockInfoByCollectionId.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import { MetadataBlockInfoRepository } from '../repositories/MetadataBlockInfoRe
33

44
export async function getDisplayedOnCreateMetadataBlockInfoByCollectionId(
55
metadataBlockInfoRepository: MetadataBlockInfoRepository,
6-
collectionId: number | string
6+
collectionId: number | string,
7+
datasetType?: string
78
): Promise<MetadataBlockInfo[]> {
89
return metadataBlockInfoRepository
9-
.getDisplayedOnCreateByCollectionId(collectionId)
10+
.getDisplayedOnCreateByCollectionId(collectionId, datasetType)
1011
.catch((error: Error) => {
1112
throw new Error(error.message)
1213
})

src/metadata-block-info/domain/useCases/getMetadataBlockInfoByCollectionId.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ import { MetadataBlockInfoRepository } from '../repositories/MetadataBlockInfoRe
33

44
export async function getMetadataBlockInfoByCollectionId(
55
metadataBlockInfoRepository: MetadataBlockInfoRepository,
6-
collectionId: number | string
6+
collectionId: number | string,
7+
onlyDisplayedOnCreate?: boolean,
8+
datasetType?: string
79
): Promise<MetadataBlockInfo[]> {
8-
return metadataBlockInfoRepository.getByCollectionId(collectionId).catch((error: Error) => {
9-
throw new Error(error.message)
10-
})
11-
}
10+
return metadataBlockInfoRepository
11+
.getByCollectionId(collectionId, onlyDisplayedOnCreate, datasetType)
12+
.catch((error: Error) => {
13+
throw new Error(error.message)
14+
})
15+
}

src/metadata-block-info/infrastructure/repositories/MetadataBlockInfoJSDataverseRepository.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,13 @@ export class MetadataBlockInfoJSDataverseRepository implements MetadataBlockInfo
3737
})
3838
}
3939

40-
getByCollectionId(collectionIdOrAlias: number | string): Promise<MetadataBlockInfo[]> {
40+
getByCollectionId(
41+
collectionIdOrAlias: number | string,
42+
onlyDisplayedOnCreate?: boolean,
43+
datasetType?: string
44+
): Promise<MetadataBlockInfo[]> {
4145
return getCollectionMetadataBlocks
42-
.execute(collectionIdOrAlias)
46+
.execute(collectionIdOrAlias, onlyDisplayedOnCreate, datasetType)
4347
.then((metadataBlocks: MetadataBlockInfo[]) => {
4448
return metadataBlocks
4549
})
@@ -49,12 +53,23 @@ export class MetadataBlockInfoJSDataverseRepository implements MetadataBlockInfo
4953
}
5054

5155
getDisplayedOnCreateByCollectionId(
52-
collectionIdOrAlias: number | string
56+
collectionIdOrAlias: number | string,
57+
datasetType?: string
5358
): Promise<MetadataBlockInfo[]> {
5459
return getCollectionMetadataBlocks
55-
.execute(collectionIdOrAlias, true)
60+
.execute(collectionIdOrAlias, true, datasetType)
5661
.then((metadataBlocks: MetadataBlockInfo[]) => {
57-
return metadataBlocks
62+
const metadataBlocksWithFields: MetadataBlockInfo[] = []
63+
metadataBlocks.forEach((block) => {
64+
const numFields = Object.keys(block.metadataFields).length
65+
// numFields can be zero if you pass a datasetType that's linked to
66+
// a metadata block that doesn't have any fields set to displayOnCreate.
67+
// See https://github.com/IQSS/dataverse/blob/v6.7.1/src/test/java/edu/harvard/iq/dataverse/api/DatasetTypesIT.java#L512
68+
if (numFields > 0) {
69+
metadataBlocksWithFields.push(block)
70+
}
71+
})
72+
return metadataBlocksWithFields
5873
})
5974
.catch((error: ReadError) => {
6075
throw new Error(error.message)

src/sections/create-dataset/CreateDataset.tsx

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import { type Template } from '@/templates/domain/models/Template'
1919
import { DatasetTemplateSelect } from './dataset-template-select/DatasetTemplateSelect'
2020
import { TemplateRepository } from '@/templates/domain/repositories/TemplateRepository'
2121
import { useCollectionRepositories } from '@/shared/contexts/repositories/RepositoriesProvider'
22+
import { useGetAvailableDatasetTypes } from '@/dataset/domain/hooks/useGetAvailableDatasetTypes'
23+
import { DatasetType } from '@/dataset/domain/models/DatasetType'
24+
import { DatasetTypeSelect } from './dataset-type-select/DatasetTypeSelect'
2225

2326
interface CreateDatasetProps {
2427
datasetRepository: DatasetRepository
@@ -38,12 +41,15 @@ export function CreateDataset({
3841
const { isModalOpen, hideModal } = useNotImplementedModal()
3942
const { setIsLoading } = useLoading()
4043
const [selectedTemplate, setSelectedTemplate] = useState<Template | null>(null)
44+
const [selectedDatasetType, setSelectedDatasetType] = useState<DatasetType | null>(null)
4145

4246
const { collection, isLoading: isLoadingCollection } = useCollection(
4347
collectionRepository,
4448
collectionId
4549
)
4650

51+
const { datasetTypes, isLoading: isLoadingDatasetTypes } = useGetAvailableDatasetTypes({ datasetRepository })
52+
4753
const { collectionUserPermissions, isLoading: isLoadingCollectionUserPermissions } =
4854
useGetCollectionUserPermissions({
4955
collectionIdOrAlias: collectionId,
@@ -63,13 +69,33 @@ export function CreateDataset({
6369
setSelectedTemplate(template)
6470
}
6571

72+
const handleDatasetTypeChange = (selectedTypeId: string) => {
73+
const type: DatasetType | null =
74+
datasetTypes.find((type) => type.id === Number(selectedTypeId)) || null
75+
76+
setSelectedType(type)
77+
}
78+
6679
const isLoadingData =
67-
isLoadingCollectionUserPermissions || isLoadingCollection || isLoadingDatasetTemplates
80+
isLoadingCollectionUserPermissions ||
81+
isLoadingCollection ||
82+
isLoadingDatasetTemplates ||
83+
isLoadingDatasetTypes
6884

6985
useEffect(() => {
7086
setIsLoading(isLoadingData)
7187
}, [isLoadingData, setIsLoading])
7288

89+
// When dataset types are loaded we set the default one to DATASET if available, it should always be there
90+
useEffect(() => {
91+
if (datasetTypes.length > 0) {
92+
const defaultType: DatasetType | null =
93+
datasetTypes.find((type) => type.name === 'dataset') || null
94+
95+
setSelectedType(defaultType)
96+
}
97+
}, [datasetTypes])
98+
7399
// When dataset templates are loaded we set the default one if any
74100
useEffect(() => {
75101
if (datasetTemplates.length > 0) {
@@ -88,6 +114,11 @@ export function CreateDataset({
88114
return <CreateDatasetSkeleton />
89115
}
90116

117+
// We use the template id and dataset type id as key to force remounting the form when the template or type changes
118+
const formKey = `${selectedType ? selectedType.id : 'no-type'}--${
119+
selectedTemplate ? selectedTemplate.id : 'no-template'
120+
}`
121+
91122
if (collectionUserPermissions && !canUserAddDataset) {
92123
return (
93124
<div className="pt-4" data-testid="not-allowed-to-create-dataset-alert">
@@ -120,13 +151,23 @@ export function CreateDataset({
120151
/>
121152
)}
122153

154+
{/* Show the dataset type selector only if there's more than one dataset type (besides 'dataset') */}
155+
{datasetTypes.length > 1 && selectedType && (
156+
<DatasetTypeSelect
157+
datasetTypes={datasetTypes}
158+
onChange={handleDatasetTypeChange}
159+
selectedType={selectedType}
160+
/>
161+
)}
162+
123163
<DatasetMetadataForm
124164
mode="create"
125165
collectionId={collectionId}
126166
datasetRepository={datasetRepository}
127167
metadataBlockInfoRepository={metadataBlockInfoRepository}
128168
datasetTemplate={selectedTemplate ?? undefined}
129-
key={selectedTemplate ? selectedTemplate.id : 'no-template-selected'} // We use the template id as key to force remounting the form when the template changes
169+
datasetTypeName={selectedType ? selectedType.name : undefined}
170+
key={formKey}
130171
/>
131172
</section>
132173
</>

0 commit comments

Comments
 (0)