@@ -9,6 +9,7 @@ import * as TypesGen from "../../api/typesGenerated"
9
9
import { EmptyState } from "../EmptyState/EmptyState"
10
10
import { RoleSelect } from "../RoleSelect/RoleSelect"
11
11
import { TableHeaderRow } from "../TableHeaders/TableHeaders"
12
+ import { TableLoader } from "../TableLoader/TableLoader"
12
13
import { TableRowMenu } from "../TableRowMenu/TableRowMenu"
13
14
import { TableTitle } from "../TableTitle/TableTitle"
14
15
import { UserCell } from "../UserCell/UserCell"
@@ -24,12 +25,12 @@ export const Language = {
24
25
}
25
26
26
27
export interface UsersTableProps {
27
- users : TypesGen . User [ ]
28
+ users ?: TypesGen . User [ ]
29
+ roles ?: TypesGen . Role [ ]
30
+ isUpdatingUserRoles ?: boolean
28
31
onSuspendUser : ( user : TypesGen . User ) => void
29
32
onResetUserPassword : ( user : TypesGen . User ) => void
30
33
onUpdateUserRoles : ( user : TypesGen . User , roles : TypesGen . Role [ "name" ] [ ] ) => void
31
- roles : TypesGen . Role [ ]
32
- isUpdatingUserRoles ?: boolean
33
34
}
34
35
35
36
export const UsersTable : React . FC < UsersTableProps > = ( {
@@ -40,6 +41,8 @@ export const UsersTable: React.FC<UsersTableProps> = ({
40
41
onUpdateUserRoles,
41
42
isUpdatingUserRoles,
42
43
} ) => {
44
+ const isLoading = ! users || ! roles
45
+
43
46
return (
44
47
< Table >
45
48
< TableHead >
@@ -52,38 +55,41 @@ export const UsersTable: React.FC<UsersTableProps> = ({
52
55
</ TableHeaderRow >
53
56
</ TableHead >
54
57
< TableBody >
55
- { users . map ( ( u ) => (
56
- < TableRow key = { u . id } >
57
- < TableCell >
58
- < UserCell Avatar = { { username : u . username } } primaryText = { u . username } caption = { u . email } /> { " " }
59
- </ TableCell >
60
- < TableCell >
61
- < RoleSelect
62
- roles = { roles }
63
- selectedRoles = { u . roles }
64
- loading = { isUpdatingUserRoles }
65
- onChange = { ( roles ) => onUpdateUserRoles ( u , roles ) }
66
- />
67
- </ TableCell >
68
- < TableCell >
69
- < TableRowMenu
70
- data = { u }
71
- menuItems = { [
72
- {
73
- label : Language . suspendMenuItem ,
74
- onClick : onSuspendUser ,
75
- } ,
76
- {
77
- label : Language . resetPasswordMenuItem ,
78
- onClick : onResetUserPassword ,
79
- } ,
80
- ] }
81
- />
82
- </ TableCell >
83
- </ TableRow >
84
- ) ) }
58
+ { isLoading && < TableLoader /> }
59
+ { users &&
60
+ roles &&
61
+ users . map ( ( u ) => (
62
+ < TableRow key = { u . id } >
63
+ < TableCell >
64
+ < UserCell Avatar = { { username : u . username } } primaryText = { u . username } caption = { u . email } /> { " " }
65
+ </ TableCell >
66
+ < TableCell >
67
+ < RoleSelect
68
+ roles = { roles }
69
+ selectedRoles = { u . roles }
70
+ loading = { isUpdatingUserRoles }
71
+ onChange = { ( roles ) => onUpdateUserRoles ( u , roles ) }
72
+ />
73
+ </ TableCell >
74
+ < TableCell >
75
+ < TableRowMenu
76
+ data = { u }
77
+ menuItems = { [
78
+ {
79
+ label : Language . suspendMenuItem ,
80
+ onClick : onSuspendUser ,
81
+ } ,
82
+ {
83
+ label : Language . resetPasswordMenuItem ,
84
+ onClick : onResetUserPassword ,
85
+ } ,
86
+ ] }
87
+ />
88
+ </ TableCell >
89
+ </ TableRow >
90
+ ) ) }
85
91
86
- { users . length === 0 && (
92
+ { users && users . length === 0 && (
87
93
< TableRow >
88
94
< TableCell colSpan = { 999 } >
89
95
< Box p = { 4 } >
0 commit comments