import React from "react"; import { IResourceComponentsProps, BaseRecord } from "@refinedev/core"; import { useTable, List, EditButton, ShowButton, DateField, TextField, CloneButton, } from "@refinedev/antd"; import { Table, Space, Button } from "antd"; import { NumberFieldUnit } from "../../components/numberField"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { genericSorter, getSortOrderForField, typeSorters, } from "../../utils/sorting"; import { genericFilterer, getFiltersForField, typeFilters, useListFiltersForField, } from "../../utils/filtering"; import { ISpool } from "./model"; import { useInitialTableState, useStoreInitialState, } from "../../utils/saveload"; import { FilterOutlined } from "@ant-design/icons"; dayjs.extend(utc); interface ISpoolCollapsed extends ISpool { filament_name: string; } export const SpoolList: React.FC = () => { // Load initial state const initialState = useInitialTableState("spoolList"); // Fetch data from the API const { tableProps, sorters, setSorters, filters, setFilters, current, pageSize, setCurrent, setPageSize, } = useTable({ syncWithLocation: false, pagination: { mode: "off", // Perform pagination in antd's Table instead. Otherwise client-side sorting/filtering doesn't work. current: initialState.pagination.current, pageSize: initialState.pagination.pageSize, }, sorters: { mode: "off", // Disable server-side sorting initial: initialState.sorters, }, filters: { mode: "off", // Disable server-side filtering initial: initialState.filters, }, }); // Type the sorters and filters const typedSorters = typeSorters(sorters); const typedFilters = typeFilters(filters); // Store state in local storage useStoreInitialState("spoolList", { sorters, filters, pagination: { current, pageSize }, }); // Collapse the dataSource to a mutable list and add a filament_name field const dataSource: ISpoolCollapsed[] = React.useMemo( () => (tableProps.dataSource ?? []).map((element) => { let filament_name: string; if (element.filament.vendor && "name" in element.filament.vendor) { filament_name = `${element.filament.vendor.name} - ${element.filament.name}`; } else { filament_name = element.filament.name ?? element.filament.id.toString(); } return { ...element, filament_name }; }), [tableProps.dataSource] ); // Filter and sort the dataSource const filteredDataSource = React.useMemo(() => { const filtered = dataSource.filter(genericFilterer(typedFilters)); filtered.sort(genericSorter(typedSorters)); return filtered; }, [dataSource, typedFilters, typedSorters]); return ( ( <> {defaultButtons} )} > { setCurrent(page); setPageSize(pageSize); }, }} rowKey="id" > { return ( ); }} /> { if (value === null || value === undefined) { return ; } return ( ); }} /> (
); };