Skip to content

Commit

Permalink
Merge pull request #473 from IQSS/feat/428-publish-version-numbers
Browse files Browse the repository at this point in the history
428 Show New Version Numbers in Publish Dataset Modal
  • Loading branch information
ChengShi-1 authored Sep 6, 2024
2 parents dc857c3 + 342d7ec commit 1603ea2
Show file tree
Hide file tree
Showing 13 changed files with 356 additions and 116 deletions.
6 changes: 3 additions & 3 deletions public/locales/en/dataset.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@
"selectVersion": "Select if this is a minor or major version update.",
"continueButton": "Continue",
"cancelButton": "Cancel",
"minorVersion": "Minor Version",
"majorVersion": "Major Version",
"updateCurrentVersion": "Update Current Version",
"minorVersion": "Minor Release",
"majorVersion": "Major Release",
"updateCurrentVersion": "Update Current Version (will permanently overwrite the latest published version)",
"error": "An error occurred while publishing the dataset."
}
}
14 changes: 11 additions & 3 deletions src/dataset/domain/models/Dataset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,9 @@ export class Dataset {
public readonly thumbnail?: string,
public readonly privateUrl?: PrivateUrl, // will be set if the user requested a version that did not exist
public readonly requestedVersion?: string,
public readonly publicationDate?: string
public readonly publicationDate?: string,
public readonly nextMajorVersion?: string,
public readonly nextMinorVersion?: string
) {}

public checkIsLockedFromPublishing(userPersistentId: string): boolean {
Expand Down Expand Up @@ -468,7 +470,10 @@ export class Dataset {
public readonly hierarchy: UpwardHierarchyNode,
public readonly thumbnail?: string,
public readonly privateUrl?: PrivateUrl, // will be set if the user requested a version that did not exist
public readonly requestedVersion?: string

public readonly requestedVersion?: string,
public readonly nextMajorVersionNumber?: string,
public readonly nextMinorVersionNumber?: string
) {
this.withAlerts()
}
Expand Down Expand Up @@ -532,7 +537,10 @@ export class Dataset {
this.hierarchy,
this.thumbnail,
this.privateUrl,
this.requestedVersion
this.requestedVersion,
undefined,
this.nextMajorVersionNumber,
this.nextMinorVersionNumber
)
}
}
Expand Down
36 changes: 34 additions & 2 deletions src/dataset/infrastructure/mappers/JSDatasetMapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ export class JSDatasetMapper {
jsDatasetFilesTotalOriginalDownloadSize: number,
jsDatasetFilesTotalArchivalDownloadSize: number,
requestedVersion?: string,
privateUrl?: PrivateUrl
privateUrl?: PrivateUrl,
latestPublishedVersionMajorNumber?: number,
latestPublishedVersionMinorNumber?: number
): Dataset {
const version = JSDatasetVersionMapper.toVersion(
jsDataset.versionId,
Expand Down Expand Up @@ -80,10 +82,40 @@ export class JSDatasetMapper {
),
undefined, // TODO: get dataset thumbnail from js-dataverse https://github.com/IQSS/dataverse-frontend/issues/203
privateUrl,
requestedVersion
requestedVersion,
JSDatasetMapper.toNextMajorVersion(latestPublishedVersionMajorNumber),
JSDatasetMapper.toNextMinorVersion(
latestPublishedVersionMajorNumber,
latestPublishedVersionMinorNumber
)
).build()
}

static toNextMajorVersion(
latestPublishedVersionMajorNumber: number | undefined
): string | undefined {
if (latestPublishedVersionMajorNumber === undefined) {
return undefined
}
const nextMajorVersion = (latestPublishedVersionMajorNumber + 1).toString() + '.0'
return nextMajorVersion
}
static toNextMinorVersion(
latestPublishedVersionMajorNumber: number | undefined,
latestPublishedVersionMinorNumber: number | undefined
): string | undefined {
if (
latestPublishedVersionMajorNumber === undefined ||
latestPublishedVersionMinorNumber === undefined
) {
return undefined
}
const nextMinorVersion = `${latestPublishedVersionMajorNumber}.${
latestPublishedVersionMinorNumber + 1
}`
return nextMinorVersion
}

static toDatasetTitle(jsDatasetMetadataBlocks: JSDatasetMetadataBlocks): string {
return jsDatasetMetadataBlocks[0].fields.title
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
import { DatasetRepository } from '../../domain/repositories/DatasetRepository'
import { Dataset, DatasetLock, DatasetNonNumericVersion } from '../../domain/models/Dataset'
import {
getDataset,
getAllDatasetPreviews,
getDatasetCitation,
getDatasetSummaryFieldNames,
createDataset,
CreatedDatasetIdentifiers as JSDatasetIdentifiers,
Dataset as JSDataset,
DatasetLock as JSDatasetLock,
DatasetPreview as JSDatasetPreview,
DatasetPreviewSubset,
DatasetUserPermissions as JSDatasetPermissions,
VersionUpdateType as JSVersionUpdateType,
DatasetVersionState,
FileDownloadSizeMode,
getAllDatasetPreviews,
getDataset,
getDatasetCitation,
getDatasetFilesTotalDownloadSize,
getDatasetLocks,
getDatasetSummaryFieldNames,
getDatasetUserPermissions,
getPrivateUrlDataset,
getPrivateUrlDatasetCitation,
getDatasetUserPermissions,
ReadError,
getDatasetLocks,
DatasetLock as JSDatasetLock,
getDatasetFilesTotalDownloadSize,
FileDownloadSizeMode,
DatasetPreviewSubset,
createDataset,
CreatedDatasetIdentifiers as JSDatasetIdentifiers,
WriteError,
publishDataset,
updateDataset
ReadError,
updateDataset,
VersionUpdateType as JSVersionUpdateType,
WriteError
} from '@iqss/dataverse-client-javascript'
import { JSDatasetMapper } from '../mappers/JSDatasetMapper'
import { DatasetPaginationInfo } from '../../domain/models/DatasetPaginationInfo'
Expand All @@ -44,6 +45,8 @@ interface IDatasetDetails {
jsDatasetLocks: JSDatasetLock[]
jsDatasetFilesTotalOriginalDownloadSize: number
jsDatasetFilesTotalArchivalDownloadSize: number
latestPublishedVersionMajorNumber?: number
latestPublishedVersionMinorNumber?: number
}

export class DatasetJSDataverseRepository implements DatasetRepository {
Expand All @@ -64,6 +67,21 @@ export class DatasetJSDataverseRepository implements DatasetRepository {
}
})
}
private async getLatestPublishedVersionNumbers(
datasetDetails: IDatasetDetails
): Promise<IDatasetDetails> {
await getDataset
.execute(datasetDetails.jsDataset.persistentId, DatasetNonNumericVersion.LATEST_PUBLISHED)
.then((latestPublishedDataset) => {
datasetDetails.latestPublishedVersionMajorNumber =
latestPublishedDataset.versionInfo.majorNumber
datasetDetails.latestPublishedVersionMinorNumber =
latestPublishedDataset.versionInfo.minorNumber
return datasetDetails
})

return datasetDetails
}

private async fetchDatasetDetails(
jsDataset: JSDataset,
Expand Down Expand Up @@ -138,6 +156,18 @@ export class DatasetJSDataverseRepository implements DatasetRepository {
return datasetDetails
})
})
.then((datasetDetails) => {
if (
datasetDetails.jsDataset.versionInfo.state === DatasetVersionState.DRAFT &&
datasetDetails.jsDataset.publicationDate !== undefined
) {
// If the dataset is a draft, but has a publication date, then we need the version
// numbers of the latest published version to show in the "Publish" button
return this.getLatestPublishedVersionNumbers(datasetDetails)
} else {
return datasetDetails
}
})
.then((datasetDetails) => {
return JSDatasetMapper.toDataset(
datasetDetails.jsDataset,
Expand All @@ -147,7 +177,10 @@ export class DatasetJSDataverseRepository implements DatasetRepository {
datasetDetails.jsDatasetLocks,
datasetDetails.jsDatasetFilesTotalOriginalDownloadSize,
datasetDetails.jsDatasetFilesTotalArchivalDownloadSize,
requestedVersion
requestedVersion,
undefined,
datasetDetails.latestPublishedVersionMajorNumber,
datasetDetails.latestPublishedVersionMinorNumber
)
})
.catch((error: ReadError) => {
Expand Down Expand Up @@ -217,8 +250,8 @@ export class DatasetJSDataverseRepository implements DatasetRepository {
jsVersionUpdateType = JSVersionUpdateType.MAJOR
break
case VersionUpdateType.UPDATE_CURRENT:
// TODO: remove this logic when VersionUpdateType.UPDATE_CURRENT is available in js-dataverse
throw new Error('update current version type not supported yet')
jsVersionUpdateType = JSVersionUpdateType.UPDATE_CURRENT
break
default:
throw new Error('Invalid version update type')
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ export function PublishDatasetMenu({ dataset, datasetRepository }: PublishDatase
repository={datasetRepository}
persistentId={dataset.persistentId}
releasedVersionExists={dataset.version.someDatasetVersionHasBeenReleased}
nextMajorVersion={dataset.nextMajorVersion}
nextMinorVersion={dataset.nextMinorVersion}
handleClose={() => setShowModal(false)}
/>

Expand Down
4 changes: 3 additions & 1 deletion src/sections/dataset/dataset-summary/License.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ export function License({ license }: LicenseProps) {
style={{ marginRight: '0.5rem' }}
/>
)}
<a href={license.uri}>{license.name}</a>
<a target="_blank" rel="noreferrer" href={license.uri}>
{license.name}
</a>
</Col>
</Row>
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
@import "node_modules/@iqss/dataverse-design-system/src/lib/assets/styles/design-tokens/colors.module";

.container {
margin: 10px;
padding: 10px;
background-color: $dv-info-box-color;
border: 1px solid black;
}

.warningText {
margin-bottom: 0;
color: $dv-warning-color;
}
88 changes: 46 additions & 42 deletions src/sections/dataset/publish-dataset/PublishDatasetModal.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Button, Modal } from '@iqss/dataverse-design-system'
import { Button, Modal, Stack } from '@iqss/dataverse-design-system'
import { Form } from '@iqss/dataverse-design-system'
import type { DatasetRepository } from '../../../dataset/domain/repositories/DatasetRepository'
import { VersionUpdateType } from '../../../dataset/domain/models/VersionUpdateType'
Expand All @@ -23,19 +23,22 @@ interface PublishDatasetModalProps {
persistentId: string
releasedVersionExists: boolean
handleClose: () => void
nextMajorVersion?: string
nextMinorVersion?: string
}

export function PublishDatasetModal({
show,
repository,
persistentId,
releasedVersionExists,
handleClose
handleClose,
nextMajorVersion,
nextMinorVersion
}: PublishDatasetModalProps) {
const { t } = useTranslation('dataset')
const { user } = useSession()
const navigate = useNavigate()

const { submissionStatus, submitPublish, publishError } = usePublishDataset(
repository,
persistentId,
Expand All @@ -48,7 +51,8 @@ export function PublishDatasetModal({
const target = event.target as HTMLInputElement
setSelectedVersionUpdateType(target.value as VersionUpdateType)
}

const nextMajorVersionString = nextMajorVersion ? nextMajorVersion : ''
const nextMinorVersionString = nextMinorVersion ? nextMinorVersion : ''
function onPublishSucceed() {
navigate(
`${Route.DATASETS}?${QueryParamKey.PERSISTENT_ID}=${persistentId}&${QueryParamKey.VERSION}=${DatasetNonNumericVersionSearchParam.DRAFT}`,
Expand All @@ -61,52 +65,52 @@ export function PublishDatasetModal({
}

return (
<Modal show={show} onHide={handleClose} size="lg">
<Modal show={show} onHide={handleClose} size="xl">
<Modal.Header>
<Modal.Title>Publish Dataset</Modal.Title>
</Modal.Header>
<Modal.Body>
<PublishDatasetHelpText releasedVersionExists={releasedVersionExists} />
<License
license={{
name: defaultLicense.name,
uri: defaultLicense.uri,
iconUri: defaultLicense.iconUri
}}
/>
{releasedVersionExists && (
<>
<p>{t('publish.selectVersion')}</p>
<Form.RadioGroup title={'Update Version'}>
<Form.Group.Radio
defaultChecked
onClick={handleVersionUpdateTypeChange}
name="update-type"
label={t('publish.minorVersion')}
id="update-type-minor"
value={VersionUpdateType.MINOR}
/>
<Form.Group.Radio
onClick={handleVersionUpdateTypeChange}
name="update-type"
label={t('publish.majorVersion')}
id="update-type-major"
value={VersionUpdateType.MAJOR}
/>
{user?.superuser && (
<Stack direction="vertical">
<PublishDatasetHelpText releasedVersionExists={releasedVersionExists} />
<License
license={{
name: defaultLicense.name,
uri: defaultLicense.uri,
iconUri: defaultLicense.iconUri
}}
/>
{releasedVersionExists && (
<>
<Form.Group.Text>{t('publish.selectVersion')}</Form.Group.Text>
<Form.RadioGroup title={'Update Version'}>
<Form.Group.Radio
defaultChecked
onClick={handleVersionUpdateTypeChange}
name="update-type"
label={t('publish.minorVersion') + ` (${nextMinorVersionString})`}
id="update-type-minor"
value={VersionUpdateType.MINOR}
/>
<Form.Group.Radio
onClick={handleVersionUpdateTypeChange}
name="update-type"
label={t('publish.updateCurrentVersion')}
id="update-type-current"
// TODO: Remove disabled when JSVersionUpdateType.UPDATE_CURRENT is available in js-dataverse
disabled={true}
value={VersionUpdateType.UPDATE_CURRENT}
label={`${t('publish.majorVersion')} (${nextMajorVersionString})`}
id="update-type-major"
value={VersionUpdateType.MAJOR}
/>
)}
</Form.RadioGroup>
</>
)}
{user?.superuser && (
<Form.Group.Radio
onClick={handleVersionUpdateTypeChange}
name="update-type"
label={t('publish.updateCurrentVersion')}
id="update-type-current"
value={VersionUpdateType.UPDATE_CURRENT}
/>
)}
</Form.RadioGroup>
</>
)}
</Stack>
<span className={styles.errorText}>
{submissionStatus === SubmissionStatus.Errored &&
`${t('publish.error')} ${publishError ? publishError : ''}`}
Expand Down
Loading

0 comments on commit 1603ea2

Please sign in to comment.