Skip to content

Commit aeb27a9

Browse files
committed
frontend: add direct link to request if user has access
1 parent 519a63a commit aeb27a9

File tree

5 files changed

+103
-43
lines changed

5 files changed

+103
-43
lines changed

invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/communities.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
data-pending-communities-search-config='{{ search_app_rdm_record_requests_config(app_id="InvenioAppRdm.RecordRequests", endpoint=record_ui["links"]["requests"]) | tojson }}'
1010
data-permissions='{{ permissions | tojson }}'
1111
data-record='{{ record_ui | tojson }}'
12+
data-record-requests='{{ record_requests | default({}) | tojson }}'
1213
class='sidebar-container'
1314
>
1415

invenio_app_rdm/records_ui/views/records.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
AccessSettings,
3030
)
3131
from invenio_rdm_records.resources.serializers import UIJSONSerializer
32+
from invenio_requests.proxies import current_requests_service
33+
from invenio_search.api import dsl
3234
from invenio_stats.proxies import current_stats
3335
from invenio_users_resources.proxies import current_user_resources
3436
from marshmallow import ValidationError
@@ -99,6 +101,28 @@ def get_record_community(record):
99101
return None, None
100102

101103

104+
def get_record_requests(record, identity):
105+
"""Return all requests that concern this record.
106+
107+
Output: {<Community-UUID>: <Request-UUID>}
108+
"""
109+
can_review = current_rdm_records.records_service.check_permission(
110+
identity, "review", record=record._record
111+
)
112+
if not can_review:
113+
return {}
114+
115+
record_requests = current_requests_service.search(
116+
identity,
117+
extra_filter=dsl.Q(
118+
"bool",
119+
must=[dsl.Q("term", **{"topic.record": record["id"]})],
120+
),
121+
)
122+
123+
return {r["receiver"]["community"]: r["id"] for r in record_requests}
124+
125+
102126
class PreviewFile:
103127
"""Preview file implementation for InvenioRDM.
104128
@@ -238,6 +262,8 @@ def record_detail(
238262
)
239263
theme = resolved_community_ui.get("theme", {}) if resolved_community else None
240264

265+
record_requests = get_record_requests(record, g.identity)
266+
241267
return render_community_theme_template(
242268
current_app.config.get("APP_RDM_RECORD_LANDING_PAGE_TEMPLATE"),
243269
theme=theme,
@@ -267,6 +293,7 @@ def record_detail(
267293
is_draft=is_draft,
268294
community=resolved_community,
269295
community_ui=resolved_community_ui,
296+
record_requests=record_requests,
270297
external_resources=get_external_resources(record),
271298
user_avatar=avatar,
272299
record_deletion=record_deletion,

invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagement.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export class CommunitiesManagement extends Component {
9393
recordUserCommunitySearchConfig,
9494
searchConfig,
9595
record,
96+
recordRequests,
9697
} = this.props;
9798
const { communities, loading, error, manageCommunitiesModalOpen } = this.state;
9899
return (
@@ -126,6 +127,7 @@ export class CommunitiesManagement extends Component {
126127
loading={loading}
127128
maxDisplayedCommunities={MAX_COMMUNITIES}
128129
branded={record.parent?.communities?.default}
130+
recordRequests={recordRequests}
129131
/>
130132
<RecordCommunitiesListModal
131133
id="record-communities-list-modal"
@@ -168,4 +170,9 @@ CommunitiesManagement.propTypes = {
168170
userCommunitiesMemberships: PropTypes.object.isRequired,
169171
searchConfig: PropTypes.object.isRequired,
170172
record: PropTypes.object.isRequired,
173+
recordRequests: PropTypes.object,
174+
};
175+
176+
CommunitiesManagement.defaultProps = {
177+
recordRequests: {},
171178
};

invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesList.js

Lines changed: 65 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import PropTypes from "prop-types";
1111
import React, { Component } from "react";
1212
import { Image } from "react-invenio-forms";
1313
import {
14+
Button,
1415
Grid,
1516
Item,
1617
Message,
@@ -23,7 +24,8 @@ import {
2324

2425
export class RecordCommunitiesList extends Component {
2526
render() {
26-
const { communities, loading, error, maxDisplayedCommunities } = this.props;
27+
const { communities, loading, error, maxDisplayedCommunities, recordRequests } =
28+
this.props;
2729
let Element = null;
2830

2931
if (loading) {
@@ -56,49 +58,67 @@ export class RecordCommunitiesList extends Component {
5658
} else if (communities?.length > 0) {
5759
const communityItems = communities
5860
?.slice(0, maxDisplayedCommunities)
59-
.map((community) => (
60-
<Grid key={community.id}>
61-
<Grid.Row verticalAlign="middle">
62-
<Grid.Column width={2}>
63-
<Image wrapped size="mini" src={community.links.logo} alt="" />
64-
</Grid.Column>
65-
<Grid.Column width={14}>
66-
<Item.Content>
67-
<Item.Header className="ui">
68-
<Header as="a" href={community.links.self_html} size="small">
69-
{community.metadata.title}
70-
{/* Show the icon for communities allowing children, and for subcommunities */}
71-
{(community.children?.allow ||
72-
community.parent !== undefined) && (
73-
<p className="ml-5 display-inline-block">
74-
<Popup
75-
content="Verified community"
76-
trigger={
77-
<Icon
78-
size="small"
79-
color="green"
80-
name="check circle outline"
81-
/>
82-
}
83-
position="top center"
84-
/>
85-
</p>
61+
.map((community) => {
62+
const viewRequest = community.id in recordRequests;
63+
return (
64+
<Grid key={community.id}>
65+
<Grid.Row verticalAlign="middle">
66+
<Grid.Column width={2}>
67+
<Image wrapped size="mini" src={community.links.logo} alt="" />
68+
</Grid.Column>
69+
<Grid.Column width={viewRequest ? 8 : 14}>
70+
<Item.Content>
71+
<Item.Header className="ui">
72+
<Header as="a" href={community.links.self_html} size="small">
73+
{community.metadata.title}
74+
{/* Show the icon for communities allowing children, and for subcommunities */}
75+
{(community.children?.allow ||
76+
community.parent !== undefined) && (
77+
<p className="ml-5 display-inline-block">
78+
<Popup
79+
content="Verified community"
80+
trigger={
81+
<Icon
82+
size="small"
83+
color="green"
84+
name="check circle outline"
85+
/>
86+
}
87+
position="top center"
88+
/>
89+
</p>
90+
)}
91+
</Header>
92+
{community.parent && (
93+
<HeaderSubheader>
94+
{i18next.t("Part of")}{" "}
95+
<a href={`/communities/${community.parent.slug}`}>
96+
{i18next.t(community.parent.metadata.title)}
97+
</a>
98+
</HeaderSubheader>
8699
)}
87-
</Header>
88-
{community.parent && (
89-
<HeaderSubheader>
90-
{i18next.t("Part of")}{" "}
91-
<a href={`/communities/${community.parent.slug}`}>
92-
{i18next.t(community.parent.metadata.title)}
93-
</a>
94-
</HeaderSubheader>
95-
)}
96-
</Item.Header>
97-
</Item.Content>
98-
</Grid.Column>
99-
</Grid.Row>
100-
</Grid>
101-
));
100+
</Item.Header>
101+
</Item.Content>
102+
</Grid.Column>
103+
{viewRequest && (
104+
<Grid.Column width={6}>
105+
<Button
106+
basic
107+
compact
108+
size="mini"
109+
floated="right"
110+
icon="eye"
111+
content={i18next.t("Request")}
112+
href={`${community.links.self_html}/requests/${
113+
recordRequests[community.id]
114+
}`}
115+
/>
116+
</Grid.Column>
117+
)}
118+
</Grid.Row>
119+
</Grid>
120+
);
121+
});
102122

103123
Element = (
104124
<>
@@ -116,10 +136,12 @@ RecordCommunitiesList.propTypes = {
116136
communities: PropTypes.array,
117137
loading: PropTypes.bool,
118138
error: PropTypes.string,
139+
recordRequests: PropTypes.object,
119140
};
120141

121142
RecordCommunitiesList.defaultProps = {
122143
communities: undefined,
123144
loading: false,
124145
error: "",
146+
recordRequests: {},
125147
};

invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ if (sidebarCommunitiesManageDiv) {
101101
);
102102
const permissions = JSON.parse(sidebarCommunitiesManageDiv.dataset.permissions);
103103
const record = JSON.parse(sidebarCommunitiesManageDiv.dataset.record);
104+
const recordRequests = JSON.parse(sidebarCommunitiesManageDiv.dataset.recordRequests);
104105
ReactDOM.render(
105106
<OverridableContext.Provider value={overriddenComponents}>
106107
<Overridable
@@ -112,6 +113,7 @@ if (sidebarCommunitiesManageDiv) {
112113
permissions={permissions}
113114
searchConfig={pendingCommunitiesSearchConfig}
114115
record={record}
116+
recordRequests={recordRequests}
115117
>
116118
<CommunitiesManagement
117119
userCommunitiesMemberships={userCommunitiesMemberships}
@@ -121,6 +123,7 @@ if (sidebarCommunitiesManageDiv) {
121123
permissions={permissions}
122124
searchConfig={pendingCommunitiesSearchConfig}
123125
record={record}
126+
recordRequests={recordRequests}
124127
/>
125128
</Overridable>
126129
</OverridableContext.Provider>,

0 commit comments

Comments
 (0)