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 && (