Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

428 Show New Version Numbers in Publish Dataset Modal #473

Merged
merged 14 commits into from
Sep 6, 2024
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
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
}
})
ekraffmiller marked this conversation as resolved.
Show resolved Hide resolved
.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
g-saracca marked this conversation as resolved.
Show resolved Hide resolved
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
Loading