Skip to content

Commit 41e4dc2

Browse files
Merge pull request #6948 from hotosm/fix/6909-unable-to-remove-last-member-of-team
Fix/Enable removing last member of team with confirmation dialog
2 parents 38f437b + dd12735 commit 41e4dc2

3 files changed

Lines changed: 64 additions & 3 deletions

File tree

frontend/src/components/teamsAndOrgs/members.js

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useState, useEffect, useCallback, useRef } from 'react';
22
import { Link, useParams } from 'react-router-dom';
33
import axios from 'axios';
44
import { useSelector } from 'react-redux';
5+
import Popup from 'reactjs-popup';
56
import { useIntl, FormattedMessage } from 'react-intl';
67
import AsyncSelect from 'react-select/async';
78
import toast from 'react-hot-toast';
@@ -29,10 +30,12 @@ export function Members({
2930
setMemberJoinTeamError,
3031
managerJoinTeamError,
3132
setManagerJoinTeamError,
33+
totalMembersOnTeam,
3234
}: Object) {
3335
const token = useSelector((state) => state.auth.token);
3436
const [editMode, setEditMode] = useState(false);
3537
const [membersBackup, setMembersBackup] = useState(null);
38+
const [lastRemovingUsername, setLastRemovingUsername] = useState(null);
3639
const selectPlaceHolder = <FormattedMessage {...messages.searchUsers} />;
3740
let title = <FormattedMessage {...messages.managers} />;
3841
if (type === 'members') {
@@ -82,6 +85,17 @@ export function Members({
8285
</div>
8386
);
8487

88+
const enableMemberEditMode = useCallback(() => {
89+
if (type === 'members' && editMode && totalMembersOnTeam > 1) return true;
90+
if (!type && members.length > 1 && editMode) return true;
91+
return false;
92+
}, [members, type, editMode, totalMembersOnTeam]);
93+
94+
const removeTeamMember = (username) => {
95+
if (members.length > 1) return removeMembers(username);
96+
setLastRemovingUsername(username);
97+
};
98+
8599
return (
86100
<>
87101
<div className={`bg-white b--grey-light pa4 ${editMode ? 'bt bl br' : 'ba'}`}>
@@ -119,8 +133,8 @@ export function Members({
119133
picture={user.pictureUrl}
120134
size="large"
121135
colorClasses="white bg-blue-grey mv1"
122-
removeFn={members.length > 1 && removeMembers}
123-
editMode={members.length > 1 && editMode}
136+
removeFn={removeTeamMember}
137+
editMode={enableMemberEditMode()}
124138
/>
125139
))}
126140
{members.length === 0 && (
@@ -159,6 +173,44 @@ export function Members({
159173
</div>
160174
</div>
161175
)}
176+
<Popup
177+
modal
178+
open={!!lastRemovingUsername}
179+
closeOnEscape
180+
closeOnDocumentClick
181+
onClose={() => {
182+
setLastRemovingUsername(null);
183+
}}
184+
>
185+
<div className="ph3 pv3">
186+
<h2 className="f4 mb3">
187+
<FormattedMessage {...messages.memberRemoveConfirmationHeader} />
188+
</h2>
189+
<p className="dark-gray mb4">
190+
{' '}
191+
<FormattedMessage {...messages.memberRemoveConfirmationDescription} />
192+
</p>
193+
<div className="flex justify-end">
194+
<Button
195+
className="pv2 ph3 ba b--red white bg-black-40 mv1 mr2"
196+
onClick={() => {
197+
setLastRemovingUsername(null);
198+
}}
199+
>
200+
<FormattedMessage {...messages.cancel} />
201+
</Button>
202+
<Button
203+
className="pv2 ph3 ba b--red white bg-red mv1"
204+
onClick={() => {
205+
removeMembers(lastRemovingUsername);
206+
setLastRemovingUsername(null);
207+
}}
208+
>
209+
<FormattedMessage {...messages.remove} />
210+
</Button>
211+
</div>
212+
</div>
213+
</Popup>
162214
</>
163215
);
164216
}

frontend/src/components/teamsAndOrgs/messages.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default defineMessages({
3535
id: 'management.partners.menu',
3636
defaultMessage: 'Partners',
3737
},
38-
resourcesButton:{
38+
resourcesButton: {
3939
id: 'management.edit.resourcesButton',
4040
defaultMessage: 'Resources link',
4141
},
@@ -592,4 +592,12 @@ export default defineMessages({
592592
id: 'management.stats.features',
593593
defaultMessage: 'Total features',
594594
},
595+
memberRemoveConfirmationHeader: {
596+
id: 'management.members.remove_confirmation_header',
597+
defaultMessage: 'Are you sure you want to remove?',
598+
},
599+
memberRemoveConfirmationDescription: {
600+
id: 'management.members.remove_confirmation_description',
601+
defaultMessage: 'This team will have only managers and no members.',
602+
},
595603
});

frontend/src/views/teams.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ export function EditTeam(props) {
399399
type="members"
400400
memberJoinTeamError={memberJoinTeamError}
401401
setMemberJoinTeamError={setMemberJoinTeamError}
402+
totalMembersOnTeam={[...members, ...managers].length}
402403
/>
403404
<div className="h1"></div>
404405
<JoinRequests

0 commit comments

Comments
 (0)