11// Copyright (C) 2022-2025 Intel Corporation
22// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE
33
4- import { useMemo } from 'react' ;
4+ import { useEffect , useMemo , useState } from 'react' ;
55
66import { useFeatureFlags } from '@geti/core/src/feature-flags/hooks/use-feature-flags.hook' ;
77import { useUsers } from '@geti/core/src/users/hook/use-users.hook' ;
88import { getRoleCreationPayload } from '@geti/core/src/users/services/utils' ;
9- import { RESOURCE_TYPE , User , USER_ROLE } from '@geti/core/src/users/users.interface' ;
9+ import { RESOURCE_TYPE , User , USER_ROLE , UsersQueryParams } from '@geti/core/src/users/users.interface' ;
1010import { ActionButton , Heading , Loading , View } from '@geti/ui' ;
1111import { Add } from '@geti/ui/icons' ;
1212
@@ -18,12 +18,24 @@ import { USERS_TABLE_COLUMNS, UsersTable } from '../users-table/users-table.comp
1818interface AvailableWorkspaceUsersProps {
1919 workspaceId : string ;
2020 activeUser : User ;
21+ searchQuery ?: string ;
2122}
2223
23- export const AvailableWorkspaceUsers = ( { workspaceId, activeUser } : AvailableWorkspaceUsersProps ) => {
24+ export const AvailableWorkspaceUsers = ( { workspaceId, activeUser, searchQuery } : AvailableWorkspaceUsersProps ) => {
2425 const { organizationId } = useOrganizationIdentifier ( ) ;
2526 const { FEATURE_FLAG_MANAGE_USERS_ROLES } = useFeatureFlags ( ) ;
2627
28+ const [ usersQueryParams , setUsersQueryParams ] = useState < UsersQueryParams > ( {
29+ sortBy : undefined ,
30+ sortDirection : undefined ,
31+ } ) ;
32+
33+ useEffect ( ( ) => {
34+ setUsersQueryParams ( ( prev ) => ( {
35+ ...prev ,
36+ name : searchQuery ,
37+ } ) ) ;
38+ } , [ searchQuery ] ) ;
2739 const { useGetUsersQuery, useUpdateUserRoles, useUpdateMemberRole } = useUsers ( ) ;
2840
2941 const {
@@ -33,7 +45,7 @@ export const AvailableWorkspaceUsers = ({ workspaceId, activeUser }: AvailableWo
3345 getNextPage : getNextOrgPage ,
3446 totalCount : orgTotal ,
3547 totalMatchedCount : _orgMatched ,
36- } = useGetUsersQuery ( organizationId ) ;
48+ } = useGetUsersQuery ( organizationId , usersQueryParams ) ;
3749
3850 const {
3951 users : wsUsers ,
@@ -42,20 +54,27 @@ export const AvailableWorkspaceUsers = ({ workspaceId, activeUser }: AvailableWo
4254 getNextPage : getNextWsPage ,
4355 totalCount : _wsTotal ,
4456 totalMatchedCount : _wsMatched ,
45- } = useGetUsersQuery ( organizationId , { resourceType : RESOURCE_TYPE . WORKSPACE , resourceId : workspaceId } ) ;
57+ } = useGetUsersQuery ( organizationId , {
58+ ...usersQueryParams ,
59+ resourceType : RESOURCE_TYPE . WORKSPACE ,
60+ resourceId : workspaceId ,
61+ } ) ;
4662
4763 const availableUsers = useMemo ( ( ) => {
48- if ( isWsLoading || orgUsers === undefined || wsUsers === undefined ) return [ ] as User [ ] ;
64+ if ( orgUsers === undefined || wsUsers === undefined ) {
65+ return [ ] ;
66+ }
4967 const wsSet = new Set ( wsUsers . map ( ( u ) => u . id ) ) ;
5068 return orgUsers . filter (
5169 ( u ) => ! wsSet . has ( u . id ) && u . roles . every ( ( r ) => r . role !== USER_ROLE . ORGANIZATION_ADMIN )
5270 ) ; // filter out org admins and workspace members
53- } , [ orgUsers , wsUsers , isWsLoading ] ) ;
71+ } , [ orgUsers , wsUsers ] ) ;
5472
5573 const updateUserRoleMutation = useUpdateUserRoles ( ) ;
5674 const updateMemberRoleMutation = useUpdateMemberRole ( ) ;
5775
5876 const isLoading = isOrgLoading || isWsLoading ;
77+ const isDataReady = ! isLoading && orgUsers !== undefined && wsUsers !== undefined ;
5978 const isFetchingNextPage = isOrgFetchingMore || isWsFetchingMore ;
6079
6180 const handleAddUserWithRole = ( user : User , role : USER_ROLE ) => {
@@ -95,7 +114,7 @@ export const AvailableWorkspaceUsers = ({ workspaceId, activeUser }: AvailableWo
95114 </ ActionButton >
96115 ) ;
97116
98- if ( availableUsers . length === 0 ) {
117+ if ( ! isDataReady || availableUsers . length === 0 ) {
99118 return < > </ > ;
100119 }
101120
@@ -118,8 +137,8 @@ export const AvailableWorkspaceUsers = ({ workspaceId, activeUser }: AvailableWo
118137 // Load more from both lists to keep difference accurate
119138 await Promise . all ( [ getNextOrgPage ( ) , getNextWsPage ( ) ] ) ;
120139 } }
121- usersQueryParams = { { } }
122- setUsersQueryParams = { ( ) => { } }
140+ usersQueryParams = { usersQueryParams }
141+ setUsersQueryParams = { setUsersQueryParams }
123142 UserActions = { ( { user } ) => < AddContributorAction user = { user } /> }
124143 ignoredColumns = { [
125144 USERS_TABLE_COLUMNS . LAST_LOGIN ,
0 commit comments