@@ -14,7 +14,7 @@ import { Link, Redirect } from "react-router-dom";
14
14
import { UserContext } from "../user-context" ;
15
15
import { getGitpodService } from "../service/service" ;
16
16
import { PageWithSubMenu } from "../components/PageWithSubMenu" ;
17
- import { AdminGetListResult , Team } from "@gitpod/gitpod-protocol" ;
17
+ import { AdminGetListResult , Team , TeamMemberInfo } from "@gitpod/gitpod-protocol" ;
18
18
import Label from "./Label" ;
19
19
20
20
export default function TeamsSearchPage ( ) {
@@ -32,6 +32,7 @@ export function TeamsSearch() {
32
32
const [ searchTerm , setSearchTerm ] = useState ( '' ) ;
33
33
const [ currentTeam , setCurrentTeam ] = useState < Team | undefined > ( undefined ) ;
34
34
const [ searchResult , setSearchResult ] = useState < AdminGetListResult < Team > > ( { total : 0 , rows : [ ] } ) ;
35
+ const [ teamMembers , setTeamMembers ] = useState < Record < string , TeamMemberInfo [ ] > > ( { } ) ;
35
36
36
37
useEffect ( ( ) => {
37
38
const teamId = location . pathname . split ( '/' ) [ 3 ] ;
@@ -49,12 +50,29 @@ export function TeamsSearch() {
49
50
}
50
51
} , [ location ] ) ;
51
52
53
+ useEffect ( ( ) => {
54
+ if ( ! searchResult ) {
55
+ return ;
56
+ }
57
+ ( async ( ) => {
58
+ const members : Record < string , TeamMemberInfo [ ] > = { } ;
59
+ await Promise . all ( searchResult . rows . map ( async ( team ) => {
60
+ try {
61
+ members [ team . id ] = await getGitpodService ( ) . server . adminGetTeamMembers ( team . id ) ;
62
+ } catch ( error ) {
63
+ console . error ( 'Could not retrieve team members' , team , error ) ;
64
+ }
65
+ } ) ) ;
66
+ setTeamMembers ( members ) ;
67
+ } ) ( ) ;
68
+ } , [ searchResult ] ) ;
69
+
52
70
if ( ! user || ! user ?. rolesOrPermissions ?. includes ( 'admin' ) ) {
53
71
return < Redirect to = "/" />
54
72
}
55
73
56
74
if ( currentTeam ) {
57
- return < TeamDetail team = { currentTeam } /> ;
75
+ return < TeamDetail team = { currentTeam } members = { teamMembers [ currentTeam . id ] } /> ;
58
76
}
59
77
60
78
const search = async ( ) => {
@@ -95,21 +113,23 @@ export function TeamsSearch() {
95
113
96
114
97
115
</ div >
98
- { searchResult . rows . map ( team => < TeamResultItem team = { team } /> ) }
116
+ { searchResult . rows . map ( team => < TeamResultItem team = { team } members = { teamMembers [ team . id ] } /> ) }
99
117
</ div >
100
118
</ >
101
119
102
- function TeamResultItem ( props : { team : Team } ) {
120
+ function TeamResultItem ( props : { team : Team , members : TeamMemberInfo [ ] } ) {
121
+ const { team, members } = props ;
103
122
return (
104
- < Link key = { 'pr-' + props . team . name } to = { '/admin/teams/' + props . team . id } data-analytics = '{"button_type":"sidebar_menu"}' >
123
+ < Link key = { 'pr-' + team . name } to = { '/admin/teams/' + team . id } data-analytics = '{"button_type":"sidebar_menu"}' >
105
124
< div className = "rounded-xl whitespace-nowrap flex py-6 px-6 w-full justify-between hover:bg-gray-100 dark:hover:bg-gray-800 focus:bg-gitpod-kumquat-light group" >
106
125
< div className = "flex flex-col w-7/12 truncate" >
107
- < div className = "font-medium text-gray-800 dark:text-gray-100 truncate" > { props . team . name }
108
- { props . team . markedDeleted && < Label text = 'Deleted' color = "red" /> }
126
+ < div className = "font-medium text-gray-800 dark:text-gray-100 truncate" > { team . name }
127
+ { team . markedDeleted && < Label text = 'Deleted' color = "red" /> }
128
+ { members ?. length > 0 && < p > { `${ members ?. length } ${ members ?. length > 1 ? `members` : `member` } ` } </ p > }
109
129
</ div >
110
130
</ div >
111
131
< div className = "flex w-5/12 self-center" >
112
- < div className = "text-sm w-full text-gray-400 truncate" > { moment ( props . team . creationTime ) . format ( 'MMM D, YYYY' ) } </ div >
132
+ < div className = "text-sm w-full text-gray-400 truncate" > { moment ( team . creationTime ) . format ( 'MMM D, YYYY' ) } </ div >
113
133
</ div >
114
134
</ div >
115
135
</ Link >
0 commit comments