From 7cdcedd0a94aaab92000661b168c9662e6496d02 Mon Sep 17 00:00:00 2001 From: zzacharo Date: Wed, 22 Jan 2025 10:52:26 +0100 Subject: [PATCH] optional-doi: fix new upload disabled states --- .../PIDField/components/OptionalDOIoptions.js | 65 ++++++++++++------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField/components/OptionalDOIoptions.js b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField/components/OptionalDOIoptions.js index 19da2feb7..d0b1ff97d 100644 --- a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField/components/OptionalDOIoptions.js +++ b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField/components/OptionalDOIoptions.js @@ -8,13 +8,13 @@ import { i18next } from "@translations/invenio_rdm_records/i18next"; import PropTypes from "prop-types"; import React, { Component } from "react"; +import { connect } from "react-redux"; import { Form, Radio, Popup } from "semantic-ui-react"; -import _isEmpty from "lodash/isEmpty"; /** * Manage radio buttons choices between managed (i.e. datacite), unmanaged (i.e. external) and no need for a PID. */ -export class OptionalDOIoptions extends Component { +class OptionalDOIoptionsCmp extends Component { handleChange = (e, { value }) => { const { onManagedUnmanagedChange } = this.props; const isManagedSelected = value === "managed"; @@ -23,24 +23,36 @@ export class OptionalDOIoptions extends Component { }; _render = (cmp, shouldWrapPopup, message) => - shouldWrapPopup ? : cmp; + shouldWrapPopup && message ? : cmp; render() { - const { isManagedSelected, isNoNeedSelected, pidLabel, optionalDOItransitions } = - this.props; - - const allDOIoptionsAllowed = _isEmpty(optionalDOItransitions); - const isUnManagedDisabled = - isManagedSelected || - (!allDOIoptionsAllowed && - !optionalDOItransitions.allowed_providers.includes("external")); - const isNoNeedDisabled = - isManagedSelected || - (!allDOIoptionsAllowed && - !optionalDOItransitions.allowed_providers.includes("not_needed")); + const { + isManagedSelected, + isNoNeedSelected, + pidLabel, + optionalDOItransitions, + record, + } = this.props; + + const doi = record?.pids?.doi?.identifier || ""; + const isNewUpload = record.status === "draft"; + + const hasDoi = doi !== ""; + const isUnManagedDisabled = !isNewUpload + ? !optionalDOItransitions.allowed_providers.includes("external") + : hasDoi && isManagedSelected; + + const isNoNeedDisabled = !isNewUpload + ? !optionalDOItransitions.allowed_providers.includes("not_needed") + : hasDoi && isManagedSelected; + + const isManagedTransition = optionalDOItransitions?.allowed_providers?.some( + (val) => !["external", "not_needed"].includes(val) + ); // The locally managed DOI is disabled either if the external provider is allowed or if the no need option is allowed - const isManagedDisabled = - !allDOIoptionsAllowed && (!isUnManagedDisabled || !isNoNeedDisabled); + const isManagedDisabled = !isNewUpload + ? !isManagedTransition + : hasDoi && isManagedSelected; const yesIHaveOne = ( @@ -93,28 +105,31 @@ export class OptionalDOIoptions extends Component { {this._render( yesIHaveOne, - isUnManagedDisabled && !isManagedSelected, + isUnManagedDisabled, optionalDOItransitions?.message )} {this._render(noINeedOne, isManagedDisabled, optionalDOItransitions?.message)} - {this._render( - noNeed, - isNoNeedDisabled && !isManagedSelected, - optionalDOItransitions?.message - )} + {this._render(noNeed, isNoNeedDisabled, optionalDOItransitions?.message)} ); } } -OptionalDOIoptions.propTypes = { +OptionalDOIoptionsCmp.propTypes = { isManagedSelected: PropTypes.bool.isRequired, isNoNeedSelected: PropTypes.bool.isRequired, onManagedUnmanagedChange: PropTypes.func.isRequired, pidLabel: PropTypes.string, optionalDOItransitions: PropTypes.array.isRequired, + record: PropTypes.object.isRequired, }; -OptionalDOIoptions.defaultProps = { +OptionalDOIoptionsCmp.defaultProps = { pidLabel: undefined, }; + +const mapStateToProps = (state) => ({ + record: state.deposit.record, +}); + +export const OptionalDOIoptions = connect(mapStateToProps, null)(OptionalDOIoptionsCmp);