Skip to content

Commit 285c1bc

Browse files
eatondustin1joelfriedRandy Coulman
authored
feat: disallow removal of last user from account (#3663)
Co-authored-by: joelfried <jfried@influxdata.com> Co-authored-by: Randy Coulman <rcoulman@influxdata.com>
1 parent 8c8a163 commit 285c1bc

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

src/users/components/UserList.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
// Libraries
22
import React, {FC, useContext, useState} from 'react'
3+
import {useSelector} from 'react-redux'
34

45
// Components
56
import {Columns, Grid, IndexList} from '@influxdata/clockface'
67
import {UsersContext} from 'src/users/context/users'
78
import UserListItem from 'src/users/components/UserListItem'
89
import InviteListItem from 'src/users/components/InviteListItem'
910

11+
// Selectors
12+
import {getMe} from 'src/me/selectors'
13+
1014
// Utils
15+
import SearchWidget from 'src/shared/components/search_widget/SearchWidget'
16+
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
1117
import {filter} from 'src/users/utils/filter'
12-
import SearchWidget from '../../shared/components/search_widget/SearchWidget'
1318

1419
const UserList: FC = () => {
1520
const {users, invites} = useContext(UsersContext)
1621

22+
const currentUserId = useSelector(getMe)?.id
23+
const selfRemovalFromAccount = isFlagEnabled('selfRemovalFromAccount')
24+
1725
const [searchTerm, setSearchTerm] = useState('')
1826

1927
const filteredUsers = filter(
@@ -24,6 +32,9 @@ const UserList: FC = () => {
2432

2533
const filteredInvites = filter(invites, ['email', 'role'], searchTerm)
2634

35+
const isDeletable = user =>
36+
selfRemovalFromAccount ? users.length > 1 : user.id !== currentUserId
37+
2738
return (
2839
<Grid>
2940
<Grid.Row>
@@ -49,7 +60,11 @@ const UserList: FC = () => {
4960
<InviteListItem key={`invite-${invite.id}`} invite={invite} />
5061
))}
5162
{filteredUsers.map(user => (
52-
<UserListItem key={`user-${user.id}`} user={user} />
63+
<UserListItem
64+
key={`user-${user.id}`}
65+
user={user}
66+
isDeletable={isDeletable(user)}
67+
/>
5368
))}
5469
</IndexList.Body>
5570
</IndexList>

src/users/components/UserListItem.tsx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// Libraries
22
import React, {FC, useContext, useState} from 'react'
3-
import {useSelector} from 'react-redux'
43
import {capitalize} from 'lodash'
54

65
// Components
@@ -16,17 +15,12 @@ import {
1615
} from '@influxdata/clockface'
1716
import {UsersContext} from 'src/users/context/users'
1817

19-
// Selectors
20-
import {getMe} from 'src/me/selectors'
21-
2218
// Types
2319
import {CloudUser} from 'src/types'
2420

25-
// Utils
26-
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
27-
2821
interface Props {
2922
user: CloudUser
23+
isDeletable: boolean
3024
}
3125

3226
// TODO: add back in once https://github.com/influxdata/quartz/issues/2389 back-filling of names is complete
@@ -47,14 +41,11 @@ interface Props {
4741
// return ''
4842
// }
4943

50-
const UserListItem: FC<Props> = ({user}) => {
51-
const {id, email, role} = user
52-
const currentUserId = useSelector(getMe)?.id
44+
const UserListItem: FC<Props> = ({user, isDeletable}) => {
45+
const {email, role} = user
5346
const {handleRemoveUser, removeUserStatus} = useContext(UsersContext)
5447

55-
const isCurrentUser = id === currentUserId
5648
const [revealOnHover, toggleRevealOnHover] = useState(true)
57-
const selfRemovalFromAccount = isFlagEnabled('selfRemovalFromAccount')
5849

5950
const handleShow = () => {
6051
toggleRevealOnHover(false)
@@ -93,7 +84,7 @@ const UserListItem: FC<Props> = ({user}) => {
9384
</IndexList.Cell>
9485
<IndexList.Cell className="user-list-cell-status">Active</IndexList.Cell>
9586
<IndexList.Cell revealOnHover={revealOnHover} alignment={Alignment.Right}>
96-
{(!isCurrentUser || selfRemovalFromAccount) && (
87+
{isDeletable && (
9788
<ConfirmationButton
9889
icon={IconFont.Trash_New}
9990
onShow={handleShow}

0 commit comments

Comments
 (0)