Skip to content

Commit 48add09

Browse files
committed
deposit: provide permissions to publish button
* backport of #2733 * originally authored by David E.
1 parent 6f9aa82 commit 48add09

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/PublishButton.js

+39-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// This file is part of Invenio-RDM-Records
22
// Copyright (C) 2020-2023 CERN.
33
// Copyright (C) 2020-2022 Northwestern University.
4+
// Copyright (C) 2020-2022 Graz University of Technology.
45
//
56
// Invenio-RDM-Records is free software; you can redistribute it and/or modify it
67
// under the terms of the MIT License; see LICENSE file for more details.
@@ -12,7 +13,7 @@ import _omit from "lodash/omit";
1213
import PropTypes from "prop-types";
1314
import React, { Component } from "react";
1415
import { connect } from "react-redux";
15-
import { Button, Icon, Message, Modal } from "semantic-ui-react";
16+
import { Button, Icon, Message, Modal, Popup } from "semantic-ui-react";
1617
import {
1718
DepositFormSubmitActions,
1819
DepositFormSubmitContext,
@@ -40,10 +41,14 @@ class PublishButtonComponent extends Component {
4041
this.closeConfirmModal();
4142
};
4243

43-
isDisabled = (values, isSubmitting, numberOfFiles) => {
44+
isDisabled = (values, isSubmitting, numberOfFiles, permissions) => {
4445
const filesEnabled = _get(values, "files.enabled", false);
4546
const filesMissing = filesEnabled && !numberOfFiles;
46-
return isSubmitting || filesMissing;
47+
return isSubmitting || filesMissing || !this.hasPermissions(permissions);
48+
};
49+
50+
hasPermissions = (permissions) => {
51+
return permissions.can_publish;
4752
};
4853

4954
render() {
@@ -54,26 +59,44 @@ class PublishButtonComponent extends Component {
5459
publishWithoutCommunity,
5560
formik,
5661
publishModalExtraContent,
62+
permissions,
5763
...ui
5864
} = this.props;
5965
const { isConfirmModalOpen } = this.state;
6066
const { values, isSubmitting, handleSubmit } = formik;
6167

6268
const uiProps = _omit(ui, ["dispatch"]);
69+
const publishDisabled = this.isDisabled(
70+
values,
71+
isSubmitting,
72+
numberOfFiles,
73+
permissions
74+
);
6375

76+
const popupText = !this.hasPermissions(permissions)
77+
? i18next.t("You don't have permission to publish")
78+
: i18next.t("Required fields are missing.");
6479
return (
6580
<>
66-
<Button
67-
disabled={this.isDisabled(values, isSubmitting, numberOfFiles)}
68-
name="publish"
69-
onClick={this.openConfirmModal}
70-
positive
71-
icon="upload"
72-
loading={isSubmitting && actionState === DRAFT_PUBLISH_STARTED}
73-
labelPosition="left"
74-
content={buttonLabel}
75-
{...uiProps}
76-
type="button" // needed so the formik form doesn't handle it as submit button i.e enable HTML validation on required input fields
81+
<Popup
82+
disabled={!publishDisabled}
83+
content={popupText}
84+
trigger={
85+
<span>
86+
<Button
87+
disabled={publishDisabled}
88+
name="publish"
89+
onClick={this.openConfirmModal}
90+
positive
91+
icon="upload"
92+
loading={isSubmitting && actionState === DRAFT_PUBLISH_STARTED}
93+
labelPosition="left"
94+
content={buttonLabel}
95+
{...uiProps}
96+
type="button" // needed so the formik form doesn't handle it as submit button i.e enable HTML validation on required input fields
97+
/>
98+
</span>
99+
}
77100
/>
78101
{isConfirmModalOpen && (
79102
<Modal
@@ -126,6 +149,7 @@ PublishButtonComponent.propTypes = {
126149
numberOfFiles: PropTypes.number.isRequired,
127150
formik: PropTypes.object.isRequired,
128151
publishModalExtraContent: PropTypes.string,
152+
permissions: PropTypes.object.isRequired,
129153
};
130154

131155
PublishButtonComponent.defaultProps = {
@@ -139,6 +163,7 @@ const mapStateToProps = (state) => ({
139163
actionState: state.deposit.actionState,
140164
numberOfFiles: Object.values(state.files.entries).length,
141165
publishModalExtraContent: state.deposit.config.publish_modal_extra,
166+
permissions: state.deposit.permissions,
142167
});
143168

144169
export const PublishButton = connect(

invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/SubmitReviewOrPublishButton.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class SubmitReviewOrPublishComponent extends Component {
2929
showDirectPublishButton,
3030
showSubmitForReviewButton,
3131
record,
32+
permissions,
3233
...ui
3334
} = this.props;
3435
const { modalOpen } = this.state;
@@ -61,13 +62,14 @@ class SubmitReviewOrPublishComponent extends Component {
6162
/>
6263
<PublishButton
6364
buttonLabel={i18next.t("Publish without community")}
65+
permissions={permissions}
6466
publishWithoutCommunity
6567
{...ui}
6668
/>
6769
</>
6870
);
6971
} else {
70-
result = <PublishButton {...ui} />;
72+
result = <PublishButton permissions={permissions} {...ui} />;
7173
}
7274
return result;
7375
}
@@ -80,6 +82,7 @@ SubmitReviewOrPublishComponent.propTypes = {
8082
showDirectPublishButton: PropTypes.bool.isRequired,
8183
showSubmitForReviewButton: PropTypes.bool.isRequired,
8284
record: PropTypes.object.isRequired,
85+
permissions: PropTypes.object.isRequired,
8386
};
8487

8588
SubmitReviewOrPublishComponent.defaultProps = {

0 commit comments

Comments
 (0)