fix: table sorter

This commit is contained in:
jialin
2025-12-11 13:33:41 +08:00
parent 3328828da6
commit b38bc8a207
15 changed files with 106 additions and 23 deletions
@@ -4,6 +4,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
height: 50px;
padding-inline: var(--ant-table-cell-padding-inline); padding-inline: var(--ant-table-cell-padding-inline);
&::before { &::before {
+10 -4
View File
@@ -1,6 +1,5 @@
import useSetChunkRequest from '@/hooks/use-chunk-request'; import useSetChunkRequest from '@/hooks/use-chunk-request';
import useTableRowSelection from '@/hooks/use-table-row-selection'; import useTableRowSelection from '@/hooks/use-table-row-selection';
import useTableSort from '@/hooks/use-table-sort';
import useUpdateChunkedList from '@/hooks/use-update-chunk-list'; import useUpdateChunkedList from '@/hooks/use-update-chunk-list';
import { handleBatchRequest } from '@/utils'; import { handleBatchRequest } from '@/utils';
import _ from 'lodash'; import _ from 'lodash';
@@ -52,8 +51,12 @@ export default function useTableFetch<T>(
const chunkRequedtRef = useRef<any>(null); const chunkRequedtRef = useRef<any>(null);
const modalRef = useRef<any>(null); const modalRef = useRef<any>(null);
const rowSelection = useTableRowSelection(); const rowSelection = useTableRowSelection();
const { sortOrder, setSortOrder } = useTableSort({ const [sortOrder, setSortOrder] = useState<{
defaultSortOrder: 'descend' order?: 'ascend' | 'descend' | null;
columnKey?: string;
}>({
order: null,
columnKey: undefined
}); });
// for skeleton loading // for skeleton loading
@@ -235,7 +238,10 @@ export default function useTableFetch<T>(
}; };
const handleTableChange = (pagination: any, filters: any, sorter: any) => { const handleTableChange = (pagination: any, filters: any, sorter: any) => {
setSortOrder(sorter.order); setSortOrder({
order: sorter.order,
columnKey: sorter.columnKey || sorter.field
});
}; };
const handleSearch = () => { const handleSearch = () => {
@@ -3,7 +3,6 @@ import AutoTooltip from '@/components/auto-tooltip';
import DropdownButtons from '@/components/drop-down-buttons'; import DropdownButtons from '@/components/drop-down-buttons';
import icons from '@/components/icon-font/icons'; import icons from '@/components/icon-font/icons';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import type { SortOrder } from 'antd/es/table/interface';
import { ColumnsType } from 'antd/lib/table'; import { ColumnsType } from 'antd/lib/table';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useMemo } from 'react'; import { useMemo } from 'react';
@@ -11,7 +10,10 @@ import { ListItem } from '../config/types';
interface ColumnsHookProps { interface ColumnsHookProps {
handleSelect: (val: string, record: ListItem) => void; handleSelect: (val: string, record: ListItem) => void;
sortOrder: SortOrder; sortOrder: {
order?: 'ascend' | 'descend' | null;
columnKey?: string;
};
} }
const actionList: Global.ActionItem[] = [ const actionList: Global.ActionItem[] = [
@@ -91,7 +93,10 @@ const useModelsColumns = ({
dataIndex: 'created_at', dataIndex: 'created_at',
key: 'created_at', key: 'created_at',
defaultSortOrder: 'descend', defaultSortOrder: 'descend',
sortOrder, sortOrder:
sortOrder.order && sortOrder.columnKey === 'created_at'
? sortOrder.order
: null,
sorter: false, sorter: false,
ellipsis: { ellipsis: {
showTitle: false showTitle: false
+1
View File
@@ -139,6 +139,7 @@ const APIKeys: React.FC = () => {
dataSource={dataSource.dataList} dataSource={dataSource.dataList}
rowSelection={rowSelection} rowSelection={rowSelection}
loading={dataSource.loading} loading={dataSource.loading}
sortDirections={['ascend', 'descend', 'ascend']}
rowKey="id" rowKey="id"
onChange={handleTableChange} onChange={handleTableChange}
pagination={{ pagination={{
@@ -10,7 +10,10 @@ import { ProviderLabelMap, credentialActionList } from '../config';
import { CredentialListItem as ListItem } from '../config/types'; import { CredentialListItem as ListItem } from '../config/types';
const useCredentialColumns = ( const useCredentialColumns = (
sortOrder: SortOrder, sortOrder: {
order?: SortOrder;
columnKey?: string;
},
handleSelect: (val: string, record: ListItem) => void handleSelect: (val: string, record: ListItem) => void
): ColumnsType<ListItem> => { ): ColumnsType<ListItem> => {
const intl = useIntl(); const intl = useIntl();
@@ -36,7 +39,10 @@ const useCredentialColumns = (
dataIndex: 'created_at', dataIndex: 'created_at',
showSorterTooltip: false, showSorterTooltip: false,
defaultSortOrder: 'descend', defaultSortOrder: 'descend',
sortOrder: sortOrder, sortOrder:
sortOrder.order && sortOrder.columnKey === 'created_at'
? sortOrder.order
: null,
sorter: false, sorter: false,
ellipsis: { ellipsis: {
showTitle: false showTitle: false
+10 -4
View File
@@ -12,7 +12,6 @@ import { PageActionType } from '@/config/types';
import useBodyScroll from '@/hooks/use-body-scroll'; import useBodyScroll from '@/hooks/use-body-scroll';
import useExpandedRowKeys from '@/hooks/use-expanded-row-keys'; import useExpandedRowKeys from '@/hooks/use-expanded-row-keys';
import useTableRowSelection from '@/hooks/use-table-row-selection'; import useTableRowSelection from '@/hooks/use-table-row-selection';
import useTableSort from '@/hooks/use-table-sort';
import NoResult from '@/pages/_components/no-result'; import NoResult from '@/pages/_components/no-result';
import PageBox from '@/pages/_components/page-box'; import PageBox from '@/pages/_components/page-box';
import { ListItem as WorkerListItem } from '@/pages/resources/config/types'; import { ListItem as WorkerListItem } from '@/pages/resources/config/types';
@@ -148,8 +147,12 @@ const Models: React.FC<ModelsProps> = ({
removeExpandedRowKey, removeExpandedRowKey,
expandedRowKeys expandedRowKeys
} = useExpandedRowKeys(expandAtom); } = useExpandedRowKeys(expandAtom);
const { sortOrder, setSortOrder } = useTableSort({ const [sortOrder, setSortOrder] = useState<{
defaultSortOrder: 'descend' columnKey: string;
order: 'ascend' | 'descend' | null;
}>({
order: null,
columnKey: ''
}); });
const [apiAccessInfo, setAPIAccessInfo] = useState<any>({ const [apiAccessInfo, setAPIAccessInfo] = useState<any>({
@@ -216,7 +219,10 @@ const Models: React.FC<ModelsProps> = ({
}; };
const handleOnSort = (dataIndex: string, order: any) => { const handleOnSort = (dataIndex: string, order: any) => {
setSortOrder(order); setSortOrder({
columnKey: dataIndex,
order: order
});
}; };
const handleOnCell = useMemoizedFn(async (record: any, extra: any) => { const handleOnCell = useMemoizedFn(async (record: any, extra: any) => {
@@ -34,7 +34,10 @@ const setModelActionList = (record: any) => {
interface ModelsColumnsHookProps { interface ModelsColumnsHookProps {
handleSelect: (val: string, record: ListItem) => void; handleSelect: (val: string, record: ListItem) => void;
sortOrder: SortOrder; sortOrder: {
columnKey: string;
order: SortOrder;
};
clusterList: Global.BaseOption< clusterList: Global.BaseOption<
number, number,
{ provider: string; state: string | number } { provider: string; state: string | number }
@@ -54,6 +57,11 @@ const useModelsColumns = ({
title: intl.formatMessage({ id: 'common.table.name' }), title: intl.formatMessage({ id: 'common.table.name' }),
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
sortOrder:
sortOrder.order && sortOrder.columnKey === 'name'
? sortOrder.order
: null,
sorter: false,
span: 5, span: 5,
render: (text: string, record: ListItem) => ( render: (text: string, record: ListItem) => (
<span className="flex-center" style={{ maxWidth: '100%' }}> <span className="flex-center" style={{ maxWidth: '100%' }}>
@@ -122,7 +130,10 @@ const useModelsColumns = ({
dataIndex: 'created_at', dataIndex: 'created_at',
key: 'created_at', key: 'created_at',
defaultSortOrder: 'descend', defaultSortOrder: 'descend',
sortOrder, sortOrder:
sortOrder.order && sortOrder.columnKey === 'created_at'
? sortOrder.order
: null,
sorter: false, sorter: false,
span: 4, span: 4,
render: (text: number) => ( render: (text: number) => (
+3
View File
@@ -16,6 +16,7 @@ const GPUList: React.FC = () => {
dataSource, dataSource,
queryParams, queryParams,
extraStatus, extraStatus,
sortOrder,
handlePageChange, handlePageChange,
handleTableChange, handleTableChange,
handleQueryChange, handleQueryChange,
@@ -71,6 +72,7 @@ const GPUList: React.FC = () => {
const columns = useGPUColumns({ const columns = useGPUColumns({
clusterList, clusterList,
loadend: dataSource.loadend, loadend: dataSource.loadend,
sortOrder,
firstLoad: extraStatus.firstLoad firstLoad: extraStatus.firstLoad
}); });
@@ -100,6 +102,7 @@ const GPUList: React.FC = () => {
<Table <Table
columns={columns} columns={columns}
style={{ width: '100%' }} style={{ width: '100%' }}
sortDirections={['ascend', 'descend', 'ascend']}
tableLayout={dataSource.loadend ? 'auto' : 'fixed'} tableLayout={dataSource.loadend ? 'auto' : 'fixed'}
dataSource={dataSource.dataList} dataSource={dataSource.dataList}
loading={dataSource.loading} loading={dataSource.loading}
@@ -52,6 +52,7 @@ const ModelFiles = () => {
dataSource, dataSource,
rowSelection, rowSelection,
queryParams, queryParams,
sortOrder,
modalRef, modalRef,
fetchData, fetchData,
handleDelete, handleDelete,
@@ -276,6 +277,7 @@ const ModelFiles = () => {
const columns = useFilesColumns({ const columns = useFilesColumns({
handleSelect, handleSelect,
sortOrder,
workersList workersList
}); });
@@ -36,6 +36,7 @@ const Workers: React.FC = () => {
queryParams, queryParams,
modalRef, modalRef,
extraStatus, extraStatus,
sortOrder,
handleDelete, handleDelete,
handleDeleteBatch, handleDeleteBatch,
fetchData, fetchData,
@@ -238,6 +239,7 @@ const Workers: React.FC = () => {
clusterData, clusterData,
loadend: dataSource.loadend, loadend: dataSource.loadend,
firstLoad: extraStatus.firstLoad, firstLoad: extraStatus.firstLoad,
sortOrder,
handleSelect handleSelect
}); });
@@ -267,6 +269,7 @@ const Workers: React.FC = () => {
<ConfigProvider renderEmpty={renderEmpty}> <ConfigProvider renderEmpty={renderEmpty}>
<Table <Table
columns={columns} columns={columns}
sortDirections={['ascend', 'descend', 'ascend']}
tableLayout={dataSource.loadend ? 'auto' : 'fixed'} tableLayout={dataSource.loadend ? 'auto' : 'fixed'}
style={{ width: '100%' }} style={{ width: '100%' }}
dataSource={dataSource.dataList} dataSource={dataSource.dataList}
@@ -255,8 +255,12 @@ const getWorkerName = (
const useFilesColumns = (props: { const useFilesColumns = (props: {
handleSelect: (action: string, record: ListItem) => void; handleSelect: (action: string, record: ListItem) => void;
workersList: Global.BaseOption<number>[]; workersList: Global.BaseOption<number>[];
sortOrder: {
order?: 'ascend' | 'descend' | null;
columnKey?: string;
};
}): ColumnsType<ListItem> => { }): ColumnsType<ListItem> => {
const { workersList, handleSelect } = props; const { workersList, sortOrder, handleSelect } = props;
const intl = useIntl(); const intl = useIntl();
return useMemo(() => { return useMemo(() => {
@@ -337,6 +341,10 @@ const useFilesColumns = (props: {
ellipsis: { ellipsis: {
showTitle: false showTitle: false
}, },
sortOrder:
sortOrder.order && sortOrder.columnKey === 'created_at'
? sortOrder.order
: null,
render: (text: number) => ( render: (text: number) => (
<AutoTooltip ghost minWidth={20}> <AutoTooltip ghost minWidth={20}>
{dayjs(text).format('YYYY-MM-DD HH:mm:ss')} {dayjs(text).format('YYYY-MM-DD HH:mm:ss')}
@@ -355,7 +363,7 @@ const useFilesColumns = (props: {
) )
} }
]; ];
}, [intl, workersList, handleSelect]); }, [intl, sortOrder, workersList, handleSelect]);
}; };
export default useFilesColumns; export default useFilesColumns;
+11 -2
View File
@@ -39,8 +39,12 @@ const useGPUColumns = (props: {
loadend: boolean; loadend: boolean;
firstLoad: boolean; firstLoad: boolean;
clusterList: Global.BaseOption<number>[]; clusterList: Global.BaseOption<number>[];
sortOrder: {
order?: 'ascend' | 'descend' | null;
columnKey?: string;
};
}): ColumnsType<GPUDeviceItem> => { }): ColumnsType<GPUDeviceItem> => {
const { clusterList, loadend, firstLoad } = props; const { clusterList, loadend, firstLoad, sortOrder } = props;
const intl = useIntl(); const intl = useIntl();
return useMemo(() => { return useMemo(() => {
@@ -49,6 +53,11 @@ const useGPUColumns = (props: {
title: intl.formatMessage({ id: 'common.table.name' }), title: intl.formatMessage({ id: 'common.table.name' }),
dataIndex: 'name', dataIndex: 'name',
width: 240, width: 240,
sorter: false,
sortOrder:
sortOrder.order && sortOrder.columnKey === 'name'
? sortOrder.order
: null,
render: (text: string, record: GPUDeviceItem) => ( render: (text: string, record: GPUDeviceItem) => (
<AutoTooltip ghost maxWidth={240}> <AutoTooltip ghost maxWidth={240}>
{text} {text}
@@ -138,7 +147,7 @@ const useGPUColumns = (props: {
} }
} }
]; ];
}, [intl, clusterList, loadend, firstLoad]); }, [intl, sortOrder, clusterList, loadend, firstLoad]);
}; };
export default useGPUColumns; export default useGPUColumns;
@@ -212,6 +212,7 @@ const useWorkerColumns = ({
clusterData, clusterData,
loadend, loadend,
firstLoad, firstLoad,
sortOrder,
handleSelect handleSelect
}: { }: {
clusterData: { clusterData: {
@@ -220,6 +221,10 @@ const useWorkerColumns = ({
}; };
loadend: boolean; loadend: boolean;
firstLoad: boolean; firstLoad: boolean;
sortOrder: {
order?: 'ascend' | 'descend' | null;
columnKey?: string;
};
handleSelect: (action: string, record: ListItem) => void; handleSelect: (action: string, record: ListItem) => void;
}): ColumnsType<ListItem> => { }): ColumnsType<ListItem> => {
const intl = useIntl(); const intl = useIntl();
@@ -230,6 +235,11 @@ const useWorkerColumns = ({
title: intl.formatMessage({ id: 'common.table.name' }), title: intl.formatMessage({ id: 'common.table.name' }),
dataIndex: 'name', dataIndex: 'name',
width: 100, width: 100,
sorter: false,
sortOrder:
sortOrder.order && sortOrder.columnKey === 'name'
? sortOrder.order
: null,
render: (text: string) => ( render: (text: string) => (
<AutoTooltip ghost maxWidth={240}> <AutoTooltip ghost maxWidth={240}>
{text} {text}
@@ -352,7 +362,7 @@ const useWorkerColumns = ({
) )
} }
], ],
[intl, clusterData, loadend, firstLoad, handleSelect] [intl, sortOrder, clusterData, loadend, firstLoad, handleSelect]
); );
}; };
+14 -3
View File
@@ -6,7 +6,6 @@ import icons from '@/components/icon-font/icons';
import { useIntl, useModel } from '@umijs/max'; import { useIntl, useModel } from '@umijs/max';
import { useMemoizedFn } from 'ahooks'; import { useMemoizedFn } from 'ahooks';
import { Tag } from 'antd'; import { Tag } from 'antd';
import type { SortOrder } from 'antd/es/table/interface';
import { ColumnsType } from 'antd/lib/table'; import { ColumnsType } from 'antd/lib/table';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useMemo } from 'react'; import { useMemo } from 'react';
@@ -14,7 +13,10 @@ import { ListItem } from '../config/types';
interface ColumnsHookProps { interface ColumnsHookProps {
handleSelect: (val: string, record: ListItem) => void; handleSelect: (val: string, record: ListItem) => void;
sortOrder: SortOrder; sortOrder: {
order?: 'ascend' | 'descend' | null;
columnKey?: string;
};
} }
const actionList: Global.ActionItem[] = [ const actionList: Global.ActionItem[] = [
@@ -69,6 +71,12 @@ const useUsersColumns = ({
title: intl.formatMessage({ id: 'common.table.name' }), title: intl.formatMessage({ id: 'common.table.name' }),
dataIndex: 'username', dataIndex: 'username',
key: 'username', key: 'username',
defaultSortOrder: 'descend',
sortOrder:
sortOrder.order && sortOrder.columnKey === 'username'
? sortOrder.order
: null,
sorter: false,
render: (text: string, record: ListItem) => ( render: (text: string, record: ListItem) => (
<AutoTooltip ghost style={{ maxWidth: 400 }}> <AutoTooltip ghost style={{ maxWidth: 400 }}>
{text} {text}
@@ -177,7 +185,10 @@ const useUsersColumns = ({
key: 'created_at', key: 'created_at',
defaultSortOrder: 'descend', defaultSortOrder: 'descend',
showSorterTooltip: false, showSorterTooltip: false,
sortOrder, sortOrder:
sortOrder.order && sortOrder.columnKey === 'created_at'
? sortOrder.order
: null,
sorter: false, sorter: false,
ellipsis: { ellipsis: {
showTitle: false showTitle: false
+1
View File
@@ -188,6 +188,7 @@ const Users: React.FC = () => {
dataSource={dataList} dataSource={dataList}
rowSelection={rowSelection} rowSelection={rowSelection}
loading={dataSource.loading} loading={dataSource.loading}
sortDirections={['ascend', 'descend', 'ascend']}
rowKey="id" rowKey="id"
onChange={handleTableChange} onChange={handleTableChange}
pagination={{ pagination={{