Skip to content

Commit f4967e5

Browse files
committed
[WIP] decision flow: update role
1 parent 828ff70 commit f4967e5

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

Diff for: invenio_communities/assets/semantic-ui/js/invenio_communities/api/membershipRequests/api.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
// Invenio-communities is free software; you can redistribute it and/or modify it
66
// under the terms of the MIT License; see LICENSE file for more details.
77

8-
import { CommunityLinksExtractor } from "../CommunityLinksExtractor";
98
import { http } from "react-invenio-forms";
109

10+
import { CommunityLinksExtractor } from "../CommunityLinksExtractor";
11+
import { bulkMembersSerializer } from "../serializers";
12+
1113
/**
1214
* API Client for community membership requests.
1315
*
@@ -21,6 +23,14 @@ export class CommunityMembershipRequestsApi {
2123
}
2224

2325
requestMembership = async (payload) => {
26+
// assigned rather than defiend for ease of passing as callback
2427
return await http.post(this.linksExtractor.url("membership_requests"), payload);
2528
};
29+
30+
updateRole = async (membershipRequest, role) => {
31+
// assigned rather than defiend for ease of passing as callback
32+
const memberSerialized = bulkMembersSerializer([membershipRequest]);
33+
const payload = { members: memberSerialized, role: role };
34+
return await http.put(this.linksExtractor.url("membership_requests"), payload);
35+
};
2636
}

Diff for: invenio_communities/assets/semantic-ui/js/invenio_communities/members/membership_requests/MembershipRequestsResultItem.js

+23-11
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import React, { Component } from "react";
1515
import { Image } from "react-invenio-forms";
1616
import { Grid, Item, Table } from "semantic-ui-react";
1717

18+
import { MembershipRequestsContext } from "../../api/membershipRequests/MembershipRequestsContextProvider";
1819
import { RoleDropdown } from "../components/dropdowns";
19-
import { formattedTime } from "../utils";
20+
import { buildRequest, formattedTime } from "../utils";
2021

2122
export class MembershipRequestsResultItem extends Component {
2223
constructor(props) {
@@ -25,6 +26,8 @@ export class MembershipRequestsResultItem extends Component {
2526
this.state = { membershipRequest: result };
2627
}
2728

29+
static contextType = MembershipRequestsContext;
30+
2831
update = (data, value) => {
2932
const { membershipRequest } = this.state;
3033
this.setState({ membershipRequest: { ...membershipRequest, ...{ role: value } } });
@@ -39,13 +42,23 @@ export class MembershipRequestsResultItem extends Component {
3942
} = this.props;
4043

4144
const {
42-
membershipRequest: { member, request },
45+
membershipRequest: { member },
4346
membershipRequest,
4447
} = this.state;
45-
// TODO: Decision flow
46-
// const { api: membershipRequestsApi } = this.context;
47-
const rolesCanAssignByType = rolesCanAssign[member.type];
48-
const membershipRequestExpiration = formattedTime(request.expires_at);
48+
console.log("********************");
49+
console.log("membershipRequest");
50+
console.dir(membershipRequest);
51+
console.log("********************");
52+
53+
const request = buildRequest(membershipRequest, ["accept", "decline"]);
54+
console.log("********************");
55+
console.log("request");
56+
console.dir(request);
57+
console.log("********************");
58+
59+
const { api: membershipRequestsApi } = this.context;
60+
const roles = rolesCanAssign[member.type];
61+
const expiration = formattedTime(request.expires_at);
4962
return (
5063
<Table.Row className="community-member-item">
5164
<Table.Cell>
@@ -73,17 +86,16 @@ export class MembershipRequestsResultItem extends Component {
7386
<RequestStatus status={request.status} />
7487
</Table.Cell>
7588
<Table.Cell
76-
aria-label={i18next.t("Expires") + " " + membershipRequestExpiration}
89+
aria-label={i18next.t("Expires") + " " + expiration}
7790
data-label={i18next.t("Expires")}
7891
>
79-
{membershipRequestExpiration}
92+
{expiration}
8093
</Table.Cell>
8194
<Table.Cell data-label={i18next.t("Role")}>
8295
<RoleDropdown
83-
roles={rolesCanAssignByType}
96+
roles={roles}
97+
action={membershipRequestsApi.updateRole}
8498
successCallback={this.update}
85-
// TODO: Decision flow
86-
// action={membershipRequestsApi.updateRole}
8799
disabled={!membershipRequest.permissions.can_update_role}
88100
currentValue={membershipRequest.role}
89101
resource={membershipRequest}

Diff for: invenio_communities/members/resources/resource.py

+12
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def create_url_rules(self):
3939
route(
4040
"GET", routes["membership_requests"], self.search_membership_requests
4141
),
42+
route("PUT", routes["membership_requests"], self.update_membership_requests),
4243
]
4344

4445
@request_view_args
@@ -160,3 +161,14 @@ def search_membership_requests(self):
160161
search_preference=search_preference(),
161162
)
162163
return hits.to_dict(), 200
164+
165+
@request_view_args
166+
@request_extra_args
167+
@request_data
168+
def update_membership_requests(self):
169+
"""Update membership request.
170+
171+
From the outside, a membership request is its own resource.
172+
From the inside, it's just a member when it comes to update.
173+
"""
174+
return self.update()

0 commit comments

Comments
 (0)