@@ -18,7 +18,9 @@ import {
18
18
MoreMenuTrigger ,
19
19
ThreeDotsButton ,
20
20
} from "components/MoreMenu/MoreMenu" ;
21
+ import { PaginationContainer } from "components/PaginationWidget/PaginationContainer" ;
21
22
import { SettingsHeader } from "components/SettingsHeader/SettingsHeader" ;
23
+ import { Loader } from "components/Loader/Loader" ;
22
24
import { Stack } from "components/Stack/Stack" ;
23
25
import {
24
26
Table ,
@@ -28,6 +30,7 @@ import {
28
30
TableRow ,
29
31
} from "components/Table/Table" ;
30
32
import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete" ;
33
+ import type { PaginationResultInfo } from "hooks/usePaginatedQuery" ;
31
34
import { TriangleAlert } from "lucide-react" ;
32
35
import { UserGroupsCell } from "pages/UsersPage/UsersTable/UserGroupsCell" ;
33
36
import { type FC , useState } from "react" ;
@@ -41,8 +44,12 @@ interface OrganizationMembersPageViewProps {
41
44
error : unknown ;
42
45
isAddingMember : boolean ;
43
46
isUpdatingMemberRoles : boolean ;
47
+ isLoading : boolean ;
44
48
me : User ;
45
49
members : Array < OrganizationMemberTableEntry > | undefined ;
50
+ membersQuery : PaginationResultInfo & {
51
+ isPreviousData : boolean ;
52
+ } ;
46
53
addMember : ( user : User ) => Promise < void > ;
47
54
removeMember : ( member : OrganizationMemberWithUserData ) => void ;
48
55
updateMemberRoles : (
@@ -64,8 +71,10 @@ export const OrganizationMembersPageView: FC<
64
71
error,
65
72
isAddingMember,
66
73
isUpdatingMemberRoles,
74
+ isLoading,
67
75
me,
68
76
members,
77
+ membersQuery,
69
78
addMember,
70
79
removeMember,
71
80
updateMemberRoles,
@@ -92,80 +101,89 @@ export const OrganizationMembersPageView: FC<
92
101
</ div >
93
102
) }
94
103
95
- < Table >
96
- < TableHeader >
97
- < TableRow >
98
- < TableCell width = "33%" > User</ TableCell >
99
- < TableCell width = "33%" >
100
- < Stack direction = "row" spacing = { 1 } alignItems = "center" >
101
- < span > Roles</ span >
102
- < TableColumnHelpTooltip variant = "roles" />
103
- </ Stack >
104
- </ TableCell >
105
- < TableCell width = "33%" >
106
- < Stack direction = "row" spacing = { 1 } alignItems = "center" >
107
- < span > Groups</ span >
108
- < TableColumnHelpTooltip variant = "groups" />
109
- </ Stack >
110
- </ TableCell >
111
- < TableCell width = "1%" />
112
- </ TableRow >
113
- </ TableHeader >
114
- < TableBody >
115
- { members ?. map ( ( member ) => (
116
- < TableRow key = { member . user_id } className = "align-baseline" >
117
- < TableCell >
118
- < AvatarData
119
- avatar = {
120
- < Avatar
121
- fallback = { member . username }
122
- src = { member . avatar_url }
104
+ { isLoading ? (
105
+ < Loader />
106
+ ) : (
107
+ < PaginationContainer
108
+ query = { membersQuery }
109
+ paginationUnitLabel = "members"
110
+ >
111
+ < Table >
112
+ < TableHeader >
113
+ < TableRow >
114
+ < TableCell width = "33%" > User</ TableCell >
115
+ < TableCell width = "33%" >
116
+ < Stack direction = "row" spacing = { 1 } alignItems = "center" >
117
+ < span > Roles</ span >
118
+ < TableColumnHelpTooltip variant = "roles" />
119
+ </ Stack >
120
+ </ TableCell >
121
+ < TableCell width = "33%" >
122
+ < Stack direction = "row" spacing = { 1 } alignItems = "center" >
123
+ < span > Groups</ span >
124
+ < TableColumnHelpTooltip variant = "groups" />
125
+ </ Stack >
126
+ </ TableCell >
127
+ < TableCell width = "1%" />
128
+ </ TableRow >
129
+ </ TableHeader >
130
+ < TableBody >
131
+ { members ?. map ( ( member ) => (
132
+ < TableRow key = { member . user_id } className = "align-baseline" >
133
+ < TableCell >
134
+ < AvatarData
135
+ avatar = {
136
+ < Avatar
137
+ fallback = { member . username }
138
+ src = { member . avatar_url }
139
+ />
140
+ }
141
+ title = { member . name || member . username }
142
+ subtitle = { member . email }
123
143
/>
124
- }
125
- title = { member . name || member . username }
126
- subtitle = { member . email }
127
- />
128
- </ TableCell >
129
- < UserRoleCell
130
- inheritedRoles = { member . global_roles }
131
- roles = { member . roles }
132
- allAvailableRoles = { allAvailableRoles }
133
- oidcRoleSyncEnabled = { false }
134
- isLoading = { isUpdatingMemberRoles }
135
- canEditUsers = { canEditMembers }
136
- onEditRoles = { async ( roles ) => {
137
- try {
138
- await updateMemberRoles ( member , roles ) ;
139
- displaySuccess ( "Roles updated successfully." ) ;
140
- } catch ( error ) {
141
- displayError (
142
- getErrorMessage ( error , "Failed to update roles." ) ,
143
- ) ;
144
- }
145
- } }
146
- />
147
- < UserGroupsCell userGroups = { member . groups } />
148
- < TableCell >
149
- { member . user_id !== me . id && canEditMembers && (
150
- < MoreMenu >
151
- < MoreMenuTrigger >
152
- < ThreeDotsButton />
153
- </ MoreMenuTrigger >
154
- < MoreMenuContent >
155
- < MoreMenuItem
156
- danger
157
- onClick = { ( ) => removeMember ( member ) }
158
- >
159
- Remove
160
- </ MoreMenuItem >
161
- </ MoreMenuContent >
162
- </ MoreMenu >
163
- ) }
164
- </ TableCell >
165
- </ TableRow >
166
- ) ) }
167
- </ TableBody >
168
- </ Table >
144
+ </ TableCell >
145
+ < UserRoleCell
146
+ inheritedRoles = { member . global_roles }
147
+ roles = { member . roles }
148
+ allAvailableRoles = { allAvailableRoles }
149
+ oidcRoleSyncEnabled = { false }
150
+ isLoading = { isUpdatingMemberRoles }
151
+ canEditUsers = { canEditMembers }
152
+ onEditRoles = { async ( roles ) => {
153
+ try {
154
+ await updateMemberRoles ( member , roles ) ;
155
+ displaySuccess ( "Roles updated successfully." ) ;
156
+ } catch ( error ) {
157
+ displayError (
158
+ getErrorMessage ( error , "Failed to update roles." ) ,
159
+ ) ;
160
+ }
161
+ } }
162
+ />
163
+ < UserGroupsCell userGroups = { member . groups } />
164
+ < TableCell >
165
+ { member . user_id !== me . id && canEditMembers && (
166
+ < MoreMenu >
167
+ < MoreMenuTrigger >
168
+ < ThreeDotsButton />
169
+ </ MoreMenuTrigger >
170
+ < MoreMenuContent >
171
+ < MoreMenuItem
172
+ danger
173
+ onClick = { ( ) => removeMember ( member ) }
174
+ >
175
+ Remove
176
+ </ MoreMenuItem >
177
+ </ MoreMenuContent >
178
+ </ MoreMenu >
179
+ ) }
180
+ </ TableCell >
181
+ </ TableRow >
182
+ ) ) }
183
+ </ TableBody >
184
+ </ Table >
185
+ </ PaginationContainer >
186
+ ) }
169
187
</ div >
170
188
</ div >
171
189
) ;
0 commit comments