From bce5a778b826598a17f19ad1fa4feee32886a784 Mon Sep 17 00:00:00 2001 From: Pavel Makarichev Date: Tue, 2 Sep 2025 21:38:36 +0300 Subject: [PATCH] FE: Add server side sorting to Schemas --- frontend/src/components/Schemas/List/List.tsx | 23 +++++++++++++++---- frontend/src/components/Schemas/Schemas.tsx | 22 ++++++++++-------- frontend/src/lib/hooks/api/schemas.ts | 15 +++++++++++- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/Schemas/List/List.tsx b/frontend/src/components/Schemas/List/List.tsx index 345cb71ad..9fdfe9dab 100644 --- a/frontend/src/components/Schemas/List/List.tsx +++ b/frontend/src/components/Schemas/List/List.tsx @@ -13,7 +13,13 @@ import Search from 'components/common/Search/Search'; import PlusIcon from 'components/common/Icons/PlusIcon'; import Table, { LinkCell } from 'components/common/NewTable'; import { ColumnDef } from '@tanstack/react-table'; -import { Action, SchemaSubject, ResourceType } from 'generated-sources'; +import { + Action, + SchemaSubject, + ResourceType, + SchemaColumnsToSort, + SortOrder, +} from 'generated-sources'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { PER_PAGE } from 'lib/constants'; import { useGetSchemas } from 'lib/hooks/api/schemas'; @@ -27,7 +33,7 @@ const List: React.FC = () => { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const { - isFetching, + isInitialLoading, isError, data = { pageCount: 1, schemas: [] as SchemaSubject[] }, } = useGetSchemas({ @@ -35,6 +41,10 @@ const List: React.FC = () => { page: Number(searchParams.get('page') || 1), perPage: Number(searchParams.get('perPage') || PER_PAGE), search: searchParams.get('q') || '', + orderBy: (searchParams.get('sortBy') as SchemaColumnsToSort) ?? undefined, + sortOrder: + (searchParams.get('sortDirection')?.toUpperCase() as SortOrder) || + undefined, }); const columns = React.useMemo[]>( @@ -53,7 +63,12 @@ const List: React.FC = () => { }, { header: 'Id', accessorKey: 'id', size: 120 }, { header: 'Type', accessorKey: 'schemaType', size: 120 }, - { header: 'Version', accessorKey: 'version', size: 120 }, + { + header: 'Version', + accessorKey: 'version', + size: 120, + enableSorting: false, + }, { header: 'Compatibility', accessorKey: 'compatibilityLevel', @@ -86,7 +101,7 @@ const List: React.FC = () => { - {isFetching || isError ? ( + {isInitialLoading || isError ? ( ) : ( import('./List/List')); const Schemas: React.FC = () => { return ( - - } /> - } /> - } /> - } /> - } /> - + }> + + } /> + } /> + } /> + } /> + } /> + + ); }; diff --git a/frontend/src/lib/hooks/api/schemas.ts b/frontend/src/lib/hooks/api/schemas.ts index aeb1ed9a6..f87bf074f 100644 --- a/frontend/src/lib/hooks/api/schemas.ts +++ b/frontend/src/lib/hooks/api/schemas.ts @@ -45,15 +45,28 @@ export function useGetSchemas({ page, perPage, search, + orderBy, + sortOrder, }: GetSchemasRequest) { return useQuery({ - queryKey: [SCHEMA_QUERY_KEY, clusterName, page, perPage, search], + queryKey: [ + SCHEMA_QUERY_KEY, + clusterName, + page, + perPage, + search, + sortOrder, + orderBy, + ], + keepPreviousData: true, queryFn: () => schemasApiClient.getSchemas({ clusterName, page, perPage, search: search || undefined, + sortOrder, + orderBy, }), }); }