That way, Refine is in charge of the sorters/filters state, instead of Refine and AntD each having their own state for it.
130 lines
3.3 KiB
TypeScript
130 lines
3.3 KiB
TypeScript
import React from "react";
|
|
import {
|
|
IResourceComponentsProps,
|
|
BaseRecord,
|
|
CrudSort,
|
|
} from "@refinedev/core";
|
|
import {
|
|
useTable,
|
|
List,
|
|
EditButton,
|
|
ShowButton,
|
|
DateField,
|
|
CloneButton,
|
|
} from "@refinedev/antd";
|
|
import { Table, Space } from "antd";
|
|
import dayjs from "dayjs";
|
|
import utc from "dayjs/plugin/utc";
|
|
import { genericSorter, getSortOrderForField } from "../../utils/sorting";
|
|
import { IVendor } from "./model";
|
|
|
|
dayjs.extend(utc);
|
|
|
|
export const VendorList: React.FC<IResourceComponentsProps> = () => {
|
|
// Load sorter state from local storage
|
|
const [sorters_initial] = React.useState<CrudSort[]>(() => {
|
|
const storedSorters = localStorage.getItem("vendorListSorters");
|
|
if (storedSorters) {
|
|
return JSON.parse(storedSorters);
|
|
}
|
|
return [
|
|
{
|
|
field: "id",
|
|
order: "asc",
|
|
},
|
|
];
|
|
});
|
|
|
|
// Fetch data from the API
|
|
const { tableProps, sorters } = useTable<IVendor>({
|
|
syncWithLocation: false,
|
|
pagination: {
|
|
mode: "off", // Perform pagination in antd's Table instead. Otherwise client-side sorting/filtering doesn't work.
|
|
},
|
|
sorters: {
|
|
mode: "off", // Disable server-side sorting
|
|
initial: sorters_initial,
|
|
},
|
|
});
|
|
|
|
// Store sorter state in local storage
|
|
React.useEffect(() => {
|
|
localStorage.setItem("vendorListSorters", JSON.stringify(sorters));
|
|
}, [sorters]);
|
|
|
|
// Copy dataSource to avoid mutating the original
|
|
const dataSource = [...(tableProps.dataSource || [])];
|
|
|
|
// Sort dataSource by the sorters
|
|
dataSource.sort(genericSorter(sorters));
|
|
|
|
return (
|
|
<List>
|
|
<Table
|
|
{...tableProps}
|
|
dataSource={dataSource}
|
|
pagination={{ showSizeChanger: true, pageSize: 20 }}
|
|
rowKey="id"
|
|
>
|
|
<Table.Column
|
|
dataIndex="id"
|
|
title="Id"
|
|
sorter={true}
|
|
sortOrder={getSortOrderForField(sorters, "id")}
|
|
/>
|
|
<Table.Column
|
|
dataIndex="name"
|
|
title="Name"
|
|
sorter={true}
|
|
sortOrder={getSortOrderForField(sorters, "name")}
|
|
/>
|
|
<Table.Column
|
|
dataIndex={["registered"]}
|
|
title="Registered"
|
|
sorter={true}
|
|
sortOrder={getSortOrderForField(sorters, "registered")}
|
|
render={(value) => (
|
|
<DateField
|
|
value={dayjs.utc(value).local()}
|
|
title={dayjs.utc(value).local().format()}
|
|
format="YYYY-MM-DD HH:mm:ss"
|
|
/>
|
|
)}
|
|
/>
|
|
<Table.Column
|
|
dataIndex={["comment"]}
|
|
title="Comment"
|
|
sorter={true}
|
|
sortOrder={getSortOrderForField(sorters, "comment")}
|
|
/>
|
|
<Table.Column
|
|
title="Actions"
|
|
dataIndex="actions"
|
|
render={(_, record: BaseRecord) => (
|
|
<Space>
|
|
<EditButton
|
|
hideText
|
|
title="Edit"
|
|
size="small"
|
|
recordItemId={record.id}
|
|
/>
|
|
<ShowButton
|
|
hideText
|
|
title="Show"
|
|
size="small"
|
|
recordItemId={record.id}
|
|
/>
|
|
<CloneButton
|
|
hideText
|
|
title="Clone"
|
|
size="small"
|
|
recordItemId={record.id}
|
|
/>
|
|
</Space>
|
|
)}
|
|
/>
|
|
</Table>
|
|
</List>
|
|
);
|
|
};
|