diff --git a/invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html b/invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html index e18a341cf..994c37953 100644 --- a/invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html +++ b/invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html @@ -41,12 +41,12 @@ value='{{ files | tojson }}'> {%- endif %} - {%- if config %} - - - {%- endif %} + + + {%- if forms_config %}
diff --git a/invenio_app_rdm/records_ui/views/deposits.py b/invenio_app_rdm/records_ui/views/deposits.py index 689601202..9db6d2b0d 100644 --- a/invenio_app_rdm/records_ui/views/deposits.py +++ b/invenio_app_rdm/records_ui/views/deposits.py @@ -400,6 +400,7 @@ def deposit_create(community=None): files_locked=False, permissions=get_record_permissions( [ + "manage", "manage_files", "delete_draft", "manage_record_access", @@ -465,6 +466,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True): files_locked=files_locked, permissions=draft.has_permissions_to( [ + "manage", "new_version", "delete_draft", "manage_files", diff --git a/invenio_app_rdm/records_ui/views/records.py b/invenio_app_rdm/records_ui/views/records.py index 7b573b970..21492fdef 100644 --- a/invenio_app_rdm/records_ui/views/records.py +++ b/invenio_app_rdm/records_ui/views/records.py @@ -419,15 +419,16 @@ def record_permission_denied_error(error): record = getattr(error, "record", None) - is_restricted = record.get("access", {}).get("record", None) == "restricted" - has_doi = "doi" in record.get("pids", {}) - if record and is_restricted and has_doi: - return ( - render_template( - "invenio_app_rdm/records/restricted_tombstone.html", - record=record, - ), - 403, - ) + if record: + is_restricted = record.get("access", {}).get("record", None) == "restricted" + has_doi = "doi" in record.get("pids", {}) + if is_restricted and has_doi: + return ( + render_template( + "invenio_app_rdm/records/restricted_tombstone.html", + record=record, + ), + 403, + ) return render_template(current_app.config["THEME_403_TEMPLATE"]), 403 diff --git a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js index 3db66dfc5..2dd6f2816 100644 --- a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +++ b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js @@ -43,6 +43,7 @@ import { FundingField } from "@js/invenio_vocabularies"; import { Card, Container, Grid, Ref, Sticky } from "semantic-ui-react"; import PropTypes from "prop-types"; import Overridable from "react-overridable"; +import { ShareDraftButton } from "./ShareDraftButton"; export class RDMDepositForm extends Component { constructor(props) { @@ -105,6 +106,7 @@ export class RDMDepositForm extends Component { filesLocked, recordRestrictionGracePeriod, allowRecordRestriction, + groupsEnabled, } = this.props; const customFieldsUI = this.config.custom_fields.ui; return ( @@ -622,6 +624,16 @@ export class RDMDepositForm extends Component { + + + {(record.is_draft === null || permissions.can_manage) && ( + + )} + @@ -663,6 +675,7 @@ export class RDMDepositForm extends Component { } RDMDepositForm.propTypes = { + groupsEnabled: PropTypes.bool.isRequired, config: PropTypes.object.isRequired, recordRestrictionGracePeriod: PropTypes.object.isRequired, allowRecordRestriction: PropTypes.bool.isRequired, diff --git a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/ShareDraftButton.js b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/ShareDraftButton.js new file mode 100644 index 000000000..cb2e7eec1 --- /dev/null +++ b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/ShareDraftButton.js @@ -0,0 +1,65 @@ +// This file is part of InvenioRDM +// Copyright (C) 2024 CERN. +// +// Invenio RDM Records is free software; you can redistribute it and/or modify it +// under the terms of the MIT License; see LICENSE file for more details. + +import React, { Component } from "react"; +import PropTypes from "prop-types"; +import { connect as connectFormik } from "formik"; +import { connect } from "react-redux"; +import _get from "lodash/get"; +import { ShareButton } from "../landing_page/ShareOptions/ShareButton"; + +class ShareDraftButtonComponent extends Component { + isDisabled = (values, isSubmitting, numberOfFiles) => { + const { disabled } = this.props; + if (disabled) return true; + + const filesEnabled = _get(values, "files.enabled", false); + const filesMissing = filesEnabled && !numberOfFiles; + const dataEmpty = Object.keys(values.expanded).length === 0; + + return isSubmitting || filesMissing || dataEmpty; + }; + + render() { + const { numberOfFiles, record, permissions, groupsEnabled, formik } = this.props; + const { values, isSubmitting } = formik; + + record.expanded = values.expanded; + record.links = values.links; + record.parent.access["settings"] = values.parent?.access?.settings; + + return ( + + ); + } +} + +ShareDraftButtonComponent.propTypes = { + disabled: PropTypes.bool, + record: PropTypes.object.isRequired, + permissions: PropTypes.object.isRequired, + groupsEnabled: PropTypes.bool.isRequired, + formik: PropTypes.object.isRequired, + numberOfFiles: PropTypes.number.isRequired, +}; + +ShareDraftButtonComponent.defaultProps = { + disabled: false, +}; + +const mapStateToProps = (state) => ({ + numberOfFiles: Object.values(state.files.entries).length, +}); + +export const ShareDraftButton = connect( + mapStateToProps, + null +)(connectFormik(ShareDraftButtonComponent)); diff --git a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js index 730d9a966..517be1b56 100644 --- a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js +++ b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js @@ -26,6 +26,7 @@ ReactDOM.render( "deposits-record-restriction-grace-period" )} allowRecordRestriction={getInputFromDOM("deposits-allow-record-restriction")} + groupsEnabled={getInputFromDOM("config-groups-enabled")} /> , document.getElementById("deposit-form") diff --git a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js index 0bf0d4eb4..135224bcc 100644 --- a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js +++ b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js @@ -32,7 +32,6 @@ export class RecordManagement extends Component { isDraft, isPreviewSubmissionRequest, currentUserId, - accessLinksSearchConfig, recordOwnerUsername, groupsEnabled, } = this.props; @@ -87,7 +86,6 @@ export class RecordManagement extends Component { @@ -121,5 +119,4 @@ RecordManagement.propTypes = { isPreviewSubmissionRequest: PropTypes.bool.isRequired, currentUserId: PropTypes.string.isRequired, recordOwnerUsername: PropTypes.object.isRequired, - accessLinksSearchConfig: PropTypes.object.isRequired, }; diff --git a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/LinksSearchResultContainer.js b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/LinksSearchResultContainer.js index 80d0c19eb..46b0eb6f9 100644 --- a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/LinksSearchResultContainer.js +++ b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessLinks/LinksSearchResultContainer.js @@ -19,16 +19,16 @@ export const dropdownOptions = [ { key: "view", name: "view", - text: i18next.t("Can view all versions"), - title: i18next.t("Can view all versions"), + text: i18next.t("Can view"), + title: i18next.t("Can view"), value: "view", description: i18next.t("Can view restricted files of all versions of this record."), }, { key: "preview", name: "preview", - text: i18next.t("Can preview all drafts"), - title: i18next.t("Can preview all drafts"), + text: i18next.t("Can preview drafts"), + title: i18next.t("Can preview drafts"), value: "preview", description: i18next.t( "Can view drafts and restricted files of all versions of this record." @@ -37,8 +37,8 @@ export const dropdownOptions = [ { key: "edit", name: "edit", - text: i18next.t("Can edit all versions"), - title: i18next.t("Can edit all versions"), + text: i18next.t("Can edit"), + title: i18next.t("Can edit"), value: "edit", description: i18next.t( "Can edit drafts and view restricted files of all versions of this record." diff --git a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AccessUsersGroups.js b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AccessUsersGroups.js index 480792d2c..129619a44 100644 --- a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AccessUsersGroups.js +++ b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ShareOptions/AccessUsersGroups/AccessUsersGroups.js @@ -110,7 +110,7 @@ export class AccessUsersGroups extends Component { }`} > - {recOwner.profile.full_name || recOwner.username} + {recOwner.profile?.full_name || recOwner.username} {recOwner.is_current_user && (