Skip to content

Commit 90b29df

Browse files
feat: add groups column to members page in organizations (#14620)
* feat: add groups column to members page in organizations * fix: run 'make fmt' * fix: stop displaying groups member is in for other organisations * fix: run 'make fmt'
1 parent 85cc695 commit 90b29df

File tree

4 files changed

+44
-5
lines changed

4 files changed

+44
-5
lines changed

site/src/api/queries/groups.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ export function groupsByUserId() {
5353
} satisfies UseQueryOptions<Group[], unknown, GroupsByUserId>;
5454
}
5555

56+
export function groupsByUserIdInOrganization(organization: string) {
57+
return {
58+
...groupsByOrganization(organization),
59+
select: selectGroupsByUserId,
60+
} satisfies UseQueryOptions<Group[], unknown, GroupsByUserId>;
61+
}
62+
5663
export function selectGroupsByUserId(groups: Group[]): GroupsByUserId {
5764
// Sorting here means that nothing has to be sorted for the individual
5865
// user arrays later

site/src/pages/ManagementSettingsPage/OrganizationMembersPage.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import {
2+
groupsByUserId,
3+
groupsByUserIdInOrganization,
4+
} from "api/queries/groups";
15
import {
26
addOrganizationMember,
37
organizationMembers,
@@ -22,9 +26,18 @@ const OrganizationMembersPage: FC = () => {
2226
};
2327
const { user: me } = useAuthenticated();
2428

29+
const groupsByUserIdQuery = useQuery(
30+
groupsByUserIdInOrganization(organizationName),
31+
);
32+
2533
const membersQuery = useQuery(organizationMembers(organizationName));
2634
const organizationRolesQuery = useQuery(organizationRoles(organizationName));
2735

36+
const members = membersQuery.data?.map((member) => {
37+
const groups = groupsByUserIdQuery.data?.get(member.user_id) ?? [];
38+
return { ...member, groups };
39+
});
40+
2841
const addMemberMutation = useMutation(
2942
addOrganizationMember(queryClient, organizationName),
3043
);
@@ -57,7 +70,8 @@ const OrganizationMembersPage: FC = () => {
5770
isAddingMember={addMemberMutation.isLoading}
5871
isUpdatingMemberRoles={updateMemberRolesMutation.isLoading}
5972
me={me}
60-
members={membersQuery.data}
73+
members={members}
74+
groupsByUserId={groupsByUserIdQuery.data}
6175
addMember={async (user: User) => {
6276
await addMemberMutation.mutateAsync(user.id);
6377
void membersQuery.refetch();

site/src/pages/ManagementSettingsPage/OrganizationMembersPageView.stories.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ const meta: Meta<typeof OrganizationMembersPageView> = {
1515
isAddingMember: false,
1616
isUpdatingMemberRoles: false,
1717
me: MockUser,
18-
members: [MockOrganizationMember, MockOrganizationMember2],
18+
members: [
19+
{ ...MockOrganizationMember, groups: [] },
20+
{ ...MockOrganizationMember2, groups: [] },
21+
],
1922
addMember: () => Promise.resolve(),
2023
removeMember: () => Promise.resolve(),
2124
updateMemberRoles: () => Promise.resolve(),

site/src/pages/ManagementSettingsPage/OrganizationMembersPageView.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import TableContainer from "@mui/material/TableContainer";
88
import TableHead from "@mui/material/TableHead";
99
import TableRow from "@mui/material/TableRow";
1010
import { getErrorMessage } from "api/errors";
11+
import type { GroupsByUserId } from "api/queries/groups";
1112
import type {
13+
Group,
1214
OrganizationMemberWithUserData,
1315
SlimRole,
1416
User,
@@ -27,6 +29,7 @@ import { SettingsHeader } from "components/SettingsHeader/SettingsHeader";
2729
import { Stack } from "components/Stack/Stack";
2830
import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete";
2931
import { UserAvatar } from "components/UserAvatar/UserAvatar";
32+
import { UserGroupsCell } from "pages/UsersPage/UsersTable/UserGroupsCell";
3033
import { type FC, useState } from "react";
3134
import { TableColumnHelpTooltip } from "./UserTable/TableColumnHelpTooltip";
3235
import { UserRoleCell } from "./UserTable/UserRoleCell";
@@ -38,7 +41,8 @@ interface OrganizationMembersPageViewProps {
3841
isAddingMember: boolean;
3942
isUpdatingMemberRoles: boolean;
4043
me: User;
41-
members: OrganizationMemberWithUserData[] | undefined;
44+
members: Array<OrganizationMemberTableEntry> | undefined;
45+
groupsByUserId: GroupsByUserId | undefined;
4246
addMember: (user: User) => Promise<void>;
4347
removeMember: (member: OrganizationMemberWithUserData) => Promise<void>;
4448
updateMemberRoles: (
@@ -47,6 +51,10 @@ interface OrganizationMembersPageViewProps {
4751
) => Promise<void>;
4852
}
4953

54+
interface OrganizationMemberTableEntry extends OrganizationMemberWithUserData {
55+
groups: readonly Group[] | undefined;
56+
}
57+
5058
export const OrganizationMembersPageView: FC<
5159
OrganizationMembersPageViewProps
5260
> = (props) => {
@@ -68,13 +76,19 @@ export const OrganizationMembersPageView: FC<
6876
<Table>
6977
<TableHead>
7078
<TableRow>
71-
<TableCell width="50%">User</TableCell>
72-
<TableCell width="49%">
79+
<TableCell width="33%">User</TableCell>
80+
<TableCell width="33%">
7381
<Stack direction="row" spacing={1} alignItems="center">
7482
<span>Roles</span>
7583
<TableColumnHelpTooltip variant="roles" />
7684
</Stack>
7785
</TableCell>
86+
<TableCell width="33%">
87+
<Stack direction="row" spacing={1} alignItems="center">
88+
<span>Groups</span>
89+
<TableColumnHelpTooltip variant="groups" />
90+
</Stack>
91+
</TableCell>
7892
<TableCell width="1%"></TableCell>
7993
</TableRow>
8094
</TableHead>
@@ -111,6 +125,7 @@ export const OrganizationMembersPageView: FC<
111125
}
112126
}}
113127
/>
128+
<UserGroupsCell userGroups={member.groups} />
114129
<TableCell>
115130
{member.user_id !== props.me.id && props.canEditMembers && (
116131
<MoreMenu>

0 commit comments

Comments
 (0)