Skip to content

Commit 63a31fc

Browse files
committed
wip reviewer entity
1 parent b663068 commit 63a31fc

File tree

25 files changed

+792
-22
lines changed

25 files changed

+792
-22
lines changed

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
invenio-requests-tests

invenio_requests/assets/semantic-ui/js/invenio_requests/api/InvenioRequestApi.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// under the terms of the MIT License; see LICENSE file for more details.
66

77
import _isEmpty from "lodash/isEmpty";
8+
import _toNumber from "lodash/toNumber";
89
import { http } from "react-invenio-forms";
910

1011
export class RequestLinksExtractor {
@@ -73,6 +74,14 @@ export class InvenioRequestsAPI {
7374
});
7475
};
7576

77+
addReviewer = async (reviewers) => {
78+
return await http.put(this.#urls.self, {
79+
reviewer: reviewers.map((r) => {
80+
return !_toNumber(r.id) ? { group: r.id } : { user: r.id };
81+
}),
82+
});
83+
};
84+
7685
performAction = async (action, commentContent = null) => {
7786
let payload = {};
7887
if (!_isEmpty(commentContent)) {

invenio_requests/assets/semantic-ui/js/invenio_requests/components/Buttons.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,46 @@ export const CancelButton = React.forwardRef((props, ref) => {
123123

124124
CancelButton.displayName = "CancelButton";
125125

126+
export const RequestApproveButton = ({
127+
onClick,
128+
loading,
129+
ariaAttributes,
130+
size,
131+
content = i18next.t("Approve"),
132+
className,
133+
}) => {
134+
return (
135+
<Button
136+
icon="checkmark"
137+
labelPosition="left"
138+
content={content}
139+
onClick={onClick}
140+
loading={loading}
141+
disabled={loading}
142+
size={size}
143+
positive
144+
className={className}
145+
{...ariaAttributes}
146+
/>
147+
);
148+
};
149+
150+
RequestApproveButton.propTypes = {
151+
onClick: PropTypes.func.isRequired,
152+
requestType: PropTypes.string.isRequired,
153+
loading: PropTypes.bool,
154+
ariaAttributes: PropTypes.object,
155+
size: PropTypes.string,
156+
className: PropTypes.string,
157+
};
158+
159+
RequestApproveButton.defaultProps = {
160+
loading: false,
161+
ariaAttributes: {},
162+
size: "mini",
163+
className: "",
164+
};
165+
126166
export const RequestCancelButton = ({
127167
onClick,
128168
loading,

invenio_requests/assets/semantic-ui/js/invenio_requests/components/ModalTriggers.js

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
RequestSubmitButton,
1515
RequestCancelButton,
1616
RequestDeclineButton,
17+
RequestApproveButton,
1718
} from "./Buttons";
1819

1920
const { MediaContextProvider, Media } = AppMedia;
@@ -118,7 +119,52 @@ RequestAcceptModalTrigger.propTypes = {
118119
className: PropTypes.string,
119120
};
120121

121-
RequestAcceptModalTrigger.defaultProps = {
122+
export const RequestApproveModalTrigger = ({
123+
onClick,
124+
requestType,
125+
loading,
126+
ariaAttributes,
127+
size,
128+
className,
129+
}) => {
130+
return (
131+
<MediaContextProvider>
132+
<Media greaterThanOrEqual="tablet">
133+
<RequestApproveButton
134+
onClick={onClick}
135+
loading={loading}
136+
disabled={loading}
137+
requestType={requestType}
138+
size={size}
139+
className={className}
140+
{...ariaAttributes}
141+
/>
142+
</Media>
143+
<Media at="mobile">
144+
<Dropdown.Item
145+
icon={{
146+
name: "checkmark",
147+
color: "positive",
148+
className: "mr-5",
149+
}}
150+
onClick={onClick}
151+
content={i18next.t("Approve")}
152+
/>
153+
</Media>
154+
</MediaContextProvider>
155+
);
156+
};
157+
158+
RequestApproveModalTrigger.propTypes = {
159+
onClick: PropTypes.func.isRequired,
160+
requestType: PropTypes.string.isRequired,
161+
loading: PropTypes.bool,
162+
ariaAttributes: PropTypes.object,
163+
size: PropTypes.string,
164+
className: PropTypes.string,
165+
};
166+
167+
RequestApproveModalTrigger.defaultProps = {
122168
loading: false,
123169
ariaAttributes: {},
124170
size: "mini",

invenio_requests/assets/semantic-ui/js/invenio_requests/contrib/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ import {
2323
} from "@js/invenio_requests/contrib";
2424
import {
2525
RequestAcceptButton,
26+
RequestApproveButton,
2627
RequestCancelButton,
2728
RequestDeclineButton,
2829
RequestSubmitButton,
2930
} from "@js/invenio_requests/components/Buttons";
3031
import {
3132
RequestAcceptModalTrigger,
33+
RequestApproveModalTrigger,
3234
RequestDeclineModalTrigger,
3335
RequestCancelModalTrigger,
3436
RequestSubmitModalTrigger,
@@ -61,7 +63,9 @@ export const defaultContribComponents = {
6163
[`RequestActionButton.decline`]: RequestDeclineButton,
6264
[`RequestActionButton.submit`]: RequestSubmitButton,
6365
[`RequestActionButton.accept`]: RequestAcceptButton,
66+
[`RequestActionButton.approve`]: RequestApproveButton,
6467
[`RequestActionModalTrigger.accept`]: RequestAcceptModalTrigger,
68+
[`RequestActionModalTrigger.approve`]: RequestApproveModalTrigger,
6569
[`RequestActionModalTrigger.decline`]: RequestDeclineModalTrigger,
6670
[`RequestActionModalTrigger.cancel`]: RequestCancelModalTrigger,
6771
[`RequestActionModalTrigger.submit`]: RequestSubmitModalTrigger,

invenio_requests/assets/semantic-ui/js/invenio_requests/request/RequestDetails.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class RequestDetails extends Component {
2626
/>
2727
</Grid.Column>
2828
<Grid.Column mobile={16} tablet={4} computer={3}>
29-
<RequestMetadata request={request} />
29+
<RequestMetadata request={request} permissions={permissions} />
3030
</Grid.Column>
3131
</Grid>
3232
</Overridable>

invenio_requests/assets/semantic-ui/js/invenio_requests/request/RequestMetadata.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ import PropTypes from "prop-types";
1111
import React, { Component } from "react";
1212
import { Image } from "react-invenio-forms";
1313
import Overridable from "react-overridable";
14-
import { Divider, Header, Icon, Message } from "semantic-ui-react";
14+
import { Divider, Header, Icon, Message, Button } from "semantic-ui-react";
1515
import { toRelativeTime } from "react-invenio-forms";
1616
import RequestStatus from "./RequestStatus";
1717
import RequestTypeLabel from "./RequestTypeLabel";
18+
import { RequestReviewers } from "./RequestReviewers";
1819

1920
const User = ({ user }) => (
2021
<div className="flex">
@@ -84,10 +85,8 @@ ExternalEmail.propTypes = {
8485

8586
const Group = ({ group }) => (
8687
<div className="flex">
87-
<Icon name="group" className="mr-5" />
88-
<span>
89-
{i18next.t("Group")}: {group?.name}
90-
</span>
88+
<Icon name="group" className="mr-10" />
89+
<span>{group?.name}</span>
9190
</div>
9291
);
9392

@@ -97,7 +96,7 @@ Group.propTypes = {
9796
}).isRequired,
9897
};
9998

100-
const EntityDetails = ({ userData, details }) => {
99+
export const EntityDetails = ({ userData, details }) => {
101100
const isUser = "user" in userData;
102101
const isCommunity = "community" in userData;
103102
const isExternalEmail = "email" in userData;
@@ -139,7 +138,7 @@ EntityDetails.propTypes = {
139138
]).isRequired,
140139
};
141140

142-
const DeletedResource = ({ details }) => (
141+
export const DeletedResource = ({ details }) => (
143142
<Message negative>{details.metadata.title}</Message>
144143
);
145144

@@ -158,9 +157,20 @@ class RequestMetadata extends Component {
158157
const { request } = this.props;
159158
const expandedCreatedBy = request.expanded?.created_by;
160159
const expandedReceiver = request.expanded?.receiver;
160+
const expandedReviewer = request.expanded?.reviewer;
161+
161162
return (
162163
<Overridable id="InvenioRequest.RequestMetadata.Layout" request={request}>
163164
<>
165+
{expandedReviewer !== undefined && (
166+
<>
167+
<RequestReviewers
168+
request={request}
169+
permissions={this.props.permissions}
170+
/>
171+
<Divider />
172+
</>
173+
)}
164174
{expandedCreatedBy !== undefined && (
165175
<>
166176
<Header as="h3" size="tiny">

0 commit comments

Comments
 (0)