From 6bc56bebb3d9b189f14a76525821d4a88bc85d91 Mon Sep 17 00:00:00 2001 From: Cyrus Goh Date: Thu, 21 Nov 2024 15:24:16 -0800 Subject: [PATCH] Support infinite query when listing org users and invites (#6128) * infinite query org users * infinite query org invites * tweak * fetch next page in org users table * fetch next page for users and invites infinite query * tweak scroll container height * lint * more table height fix * use width precent * fix transient bug * remove table min h, table wrapper totalsize h --- .../organizations/users/OrgUsersTable.svelte | 234 +++++++++++++++++- .../create-infinite-query-org-invites.ts | 64 +++++ .../users/create-infinite-query-org-users.ts | 64 +++++ .../[organization]/-/users/+page.svelte | 54 ++-- 4 files changed, 394 insertions(+), 22 deletions(-) create mode 100644 web-admin/src/features/organizations/users/create-infinite-query-org-invites.ts create mode 100644 web-admin/src/features/organizations/users/create-infinite-query-org-users.ts diff --git a/web-admin/src/features/organizations/users/OrgUsersTable.svelte b/web-admin/src/features/organizations/users/OrgUsersTable.svelte index 4a3c3816d5b..70369dde583 100644 --- a/web-admin/src/features/organizations/users/OrgUsersTable.svelte +++ b/web-admin/src/features/organizations/users/OrgUsersTable.svelte @@ -1,19 +1,50 @@ - + +
+
+ + + {#each $table.getHeaderGroups() as headerGroup} + + {#each headerGroup.headers as header (header.id)} + {@const widthPercent = header.column.columnDef.meta?.widthPercent} + {@const marginLeft = header.column.columnDef.meta?.marginLeft} + + {/each} + + {/each} + + + {#if $table.getRowModel().rows.length === 0} + + + + {:else} + {#each $virtualizer.getVirtualItems() as virtualRow, idx (virtualRow.index)} + + {#each rows[virtualRow.index]?.getVisibleCells() ?? [] as cell (cell.id)} + + {/each} + + {/each} + {/if} + +
+ {#if !header.isPlaceholder} +
+ + {#if header.column.getIsSorted().toString() === "asc"} + + + + {:else if header.column.getIsSorted().toString() === "desc"} + + + + {/if} +
+ {/if} +
+ No users found +
+ +
+
+
+ + diff --git a/web-admin/src/features/organizations/users/create-infinite-query-org-invites.ts b/web-admin/src/features/organizations/users/create-infinite-query-org-invites.ts new file mode 100644 index 00000000000..b52618a34ba --- /dev/null +++ b/web-admin/src/features/organizations/users/create-infinite-query-org-invites.ts @@ -0,0 +1,64 @@ +import { + adminServiceListOrganizationInvites, + getAdminServiceListOrganizationInvitesQueryKey, + type AdminServiceListOrganizationInvitesParams, + type RpcStatus, +} from "@rilldata/web-admin/client"; +import { + createInfiniteQuery, + type CreateInfiniteQueryOptions, + type CreateInfiniteQueryResult, + type QueryFunction, + type QueryKey, +} from "@tanstack/svelte-query"; + +export const createAdminServiceListOrganizationInvitesInfiniteQuery = < + TData = Awaited>, + TError = RpcStatus, +>( + organization: string, + params?: AdminServiceListOrganizationInvitesParams, + options?: { + query?: CreateInfiniteQueryOptions< + Awaited>, + TError, + TData + >; + }, +): CreateInfiniteQueryResult & { queryKey: QueryKey } => { + const { query: queryOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getAdminServiceListOrganizationInvitesQueryKey(organization, params); + + const queryFn: QueryFunction< + Awaited> + > = ({ pageParam, signal }) => + adminServiceListOrganizationInvites( + organization, + { ...params, pageToken: pageParam }, + signal, + ); + + const query = createInfiniteQuery< + Awaited>, + TError, + TData + >({ + queryKey, + queryFn, + getNextPageParam: (lastPage) => { + if (!lastPage.nextPageToken || lastPage.nextPageToken === "") { + return undefined; + } + return lastPage.nextPageToken; + }, + enabled: !!organization, + ...queryOptions, + }) as CreateInfiniteQueryResult & { queryKey: QueryKey }; + + query.queryKey = queryKey; + + return query; +}; diff --git a/web-admin/src/features/organizations/users/create-infinite-query-org-users.ts b/web-admin/src/features/organizations/users/create-infinite-query-org-users.ts new file mode 100644 index 00000000000..beb16419529 --- /dev/null +++ b/web-admin/src/features/organizations/users/create-infinite-query-org-users.ts @@ -0,0 +1,64 @@ +import { + adminServiceListOrganizationMemberUsers, + getAdminServiceListOrganizationMemberUsersQueryKey, + type AdminServiceListOrganizationMemberUsersParams, + type RpcStatus, +} from "@rilldata/web-admin/client"; +import { + createInfiniteQuery, + type CreateInfiniteQueryOptions, + type CreateInfiniteQueryResult, + type QueryFunction, + type QueryKey, +} from "@tanstack/svelte-query"; + +export const createAdminServiceListOrganizationMemberUsersInfiniteQuery = < + TData = Awaited>, + TError = RpcStatus, +>( + organization: string, + params?: AdminServiceListOrganizationMemberUsersParams, + options?: { + query?: CreateInfiniteQueryOptions< + Awaited>, + TError, + TData + >; + }, +): CreateInfiniteQueryResult & { queryKey: QueryKey } => { + const { query: queryOptions } = options ?? {}; + + const queryKey = + queryOptions?.queryKey ?? + getAdminServiceListOrganizationMemberUsersQueryKey(organization, params); + + const queryFn: QueryFunction< + Awaited> + > = ({ pageParam, signal }) => + adminServiceListOrganizationMemberUsers( + organization, + { ...params, pageToken: pageParam }, + signal, + ); + + const query = createInfiniteQuery< + Awaited>, + TError, + TData + >({ + queryKey, + queryFn, + getNextPageParam: (lastPage) => { + if (!lastPage.nextPageToken || lastPage.nextPageToken === "") { + return undefined; + } + return lastPage.nextPageToken; + }, + enabled: !!organization, + ...queryOptions, + }) as CreateInfiniteQueryResult & { queryKey: QueryKey }; + + query.queryKey = queryKey; + + return query; +}; diff --git a/web-admin/src/routes/[organization]/-/users/+page.svelte b/web-admin/src/routes/[organization]/-/users/+page.svelte index c842674ea23..5860197c4b0 100644 --- a/web-admin/src/routes/[organization]/-/users/+page.svelte +++ b/web-admin/src/routes/[organization]/-/users/+page.svelte @@ -1,10 +1,6 @@
- {#if $listOrganizationMemberUsers.isLoading} + {#if $orgMemberUsersInfiniteQuery.isLoading || $orgInvitesInfiniteQuery.isLoading} - {:else if $listOrganizationMemberUsers.isError} + {:else if $orgMemberUsersInfiniteQuery.isError || $orgInvitesInfiniteQuery.isError}
- Error loading organization members: {$listOrganizationMemberUsers.error} + Error loading organization members: {$orgMemberUsersInfiniteQuery.error ?? + $orgInvitesInfiniteQuery.error}
- {:else if $listOrganizationMemberUsers.isSuccess} + {:else if $orgMemberUsersInfiniteQuery.isSuccess && $orgInvitesInfiniteQuery.isSuccess}