Skip to content

Commit 2fcfced

Browse files
ActiveChooNCopilot
andauthored
Search and sorting for AvailableWorkspaceUsers (#1419)
Co-authored-by: Copilot <[email protected]>
1 parent b3097fa commit 2fcfced

File tree

4 files changed

+44
-13
lines changed

4 files changed

+44
-13
lines changed

web_ui/src/pages/user-management/users/users-table/users-table.component.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ export const UsersTable = ({
158158
return (
159159
<Flex flex={1} width={'100%'} justifyContent={'center'} alignItems={'start'}>
160160
{shouldShowNotFound ? (
161-
<NotFound />
161+
<View paddingY={'size-200'}>
162+
<NotFound />
163+
</View>
162164
) : (
163165
<View minHeight={0} width={'100%'} data-testid={tableId ?? 'users-table-id'}>
164166
<TableView

web_ui/src/pages/user-management/users/users.component.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,11 @@ export const Users = ({
117117
usersTableType={usersTableType}
118118
/>
119119
{resourceType === RESOURCE_TYPE.WORKSPACE && resourceId !== undefined && (
120-
<AvailableWorkspaceUsers workspaceId={resourceId} activeUser={activeUser} />
120+
<AvailableWorkspaceUsers
121+
workspaceId={resourceId}
122+
activeUser={activeUser}
123+
searchQuery={usersQueryParams.name}
124+
/>
121125
)}
122126
</Flex>
123127
</motion.div>

web_ui/src/pages/user-management/users/workspace-users/available-workspace-users.component.tsx

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
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

66
import { useFeatureFlags } from '@geti/core/src/feature-flags/hooks/use-feature-flags.hook';
77
import { useUsers } from '@geti/core/src/users/hook/use-users.hook';
88
import { 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';
1010
import { ActionButton, Heading, Loading, View } from '@geti/ui';
1111
import { Add } from '@geti/ui/icons';
1212

@@ -18,12 +18,24 @@ import { USERS_TABLE_COLUMNS, UsersTable } from '../users-table/users-table.comp
1818
interface 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,

web_ui/src/shared/components/header/jobs-management/jobs-actions/jobs-filtering.component.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { JobType } from '../../../../../core/jobs/jobs.const';
1212
import { useProjectActions } from '../../../../../core/projects/hooks/use-project-actions.hook';
1313
import { ProjectProps } from '../../../../../core/projects/project.interface';
1414
import { ProjectSortingOptions } from '../../../../../core/projects/services/project-service.interface';
15+
import { SortDirection } from '../../../../../core/shared/query-parameters';
1516
import { useWorkspaceIdentifier } from '../../../../../providers/workspaces-provider/use-workspace-identifier.hook';
1617
import { isNonEmptyArray } from '../../../../utils';
1718
import { JobsFilterField } from '../jobs-filter-field.component';
@@ -54,8 +55,13 @@ export const JobsFiltering = ({ values, onChange }: JobsFilteringProps) => {
5455
? {
5556
resourceId: projectId,
5657
resourceType: RESOURCE_TYPE.PROJECT,
58+
sortBy: 'email',
59+
sortDirection: SortDirection.ASC,
60+
}
61+
: {
62+
sortBy: 'email',
63+
sortDirection: SortDirection.ASC,
5764
}
58-
: undefined
5965
);
6066

6167
const projects: ProjectProps[] = useMemo((): ProjectProps[] => {

0 commit comments

Comments
 (0)