Client: Fixed up pagination, now also stored
This commit is contained in:
@@ -41,11 +41,22 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
const initialState = useInitialTableState("filamentList");
|
const initialState = useInitialTableState("filamentList");
|
||||||
|
|
||||||
// Fetch data from the API
|
// Fetch data from the API
|
||||||
const { tableProps, sorters, filters, setSorters, setFilters } =
|
const {
|
||||||
useTable<IFilament>({
|
tableProps,
|
||||||
|
sorters,
|
||||||
|
setSorters,
|
||||||
|
filters,
|
||||||
|
setFilters,
|
||||||
|
current,
|
||||||
|
pageSize,
|
||||||
|
setCurrent,
|
||||||
|
setPageSize,
|
||||||
|
} = useTable<IFilament>({
|
||||||
syncWithLocation: false,
|
syncWithLocation: false,
|
||||||
pagination: {
|
pagination: {
|
||||||
mode: "off", // Perform pagination in antd's Table instead. Otherwise client-side sorting/filtering doesn't work.
|
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: {
|
sorters: {
|
||||||
mode: "off", // Disable server-side sorting
|
mode: "off", // Disable server-side sorting
|
||||||
@@ -62,7 +73,11 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
const typedFilters = typeFilters<IFilamentCollapsed>(filters);
|
const typedFilters = typeFilters<IFilamentCollapsed>(filters);
|
||||||
|
|
||||||
// Store state in local storage
|
// Store state in local storage
|
||||||
useStoreInitialState("filamentList", { sorters, filters });
|
useStoreInitialState("filamentList", {
|
||||||
|
sorters,
|
||||||
|
filters,
|
||||||
|
pagination: { current, pageSize },
|
||||||
|
});
|
||||||
|
|
||||||
// Collapse the dataSource to a mutable list and add a filament_name field
|
// Collapse the dataSource to a mutable list and add a filament_name field
|
||||||
const dataSource: IFilamentCollapsed[] = React.useMemo(
|
const dataSource: IFilamentCollapsed[] = React.useMemo(
|
||||||
@@ -96,6 +111,7 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setFilters([], "replace");
|
setFilters([], "replace");
|
||||||
setSorters([{ field: "id", order: "asc" }]);
|
setSorters([{ field: "id", order: "asc" }]);
|
||||||
|
setCurrent(1);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Clear Filters
|
Clear Filters
|
||||||
@@ -107,7 +123,15 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
<Table
|
<Table
|
||||||
{...tableProps}
|
{...tableProps}
|
||||||
dataSource={filteredDataSource}
|
dataSource={filteredDataSource}
|
||||||
pagination={{ showSizeChanger: true, pageSize: 20 }}
|
pagination={{
|
||||||
|
showSizeChanger: true,
|
||||||
|
current: current,
|
||||||
|
pageSize: pageSize,
|
||||||
|
onChange: (page, pageSize) => {
|
||||||
|
setCurrent(page);
|
||||||
|
setPageSize(pageSize);
|
||||||
|
},
|
||||||
|
}}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
>
|
>
|
||||||
<Table.Column
|
<Table.Column
|
||||||
|
|||||||
@@ -42,11 +42,22 @@ export const SpoolList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
const initialState = useInitialTableState("spoolList");
|
const initialState = useInitialTableState("spoolList");
|
||||||
|
|
||||||
// Fetch data from the API
|
// Fetch data from the API
|
||||||
const { tableProps, sorters, filters, setSorters, setFilters } =
|
const {
|
||||||
useTable<ISpool>({
|
tableProps,
|
||||||
|
sorters,
|
||||||
|
setSorters,
|
||||||
|
filters,
|
||||||
|
setFilters,
|
||||||
|
current,
|
||||||
|
pageSize,
|
||||||
|
setCurrent,
|
||||||
|
setPageSize,
|
||||||
|
} = useTable<ISpool>({
|
||||||
syncWithLocation: false,
|
syncWithLocation: false,
|
||||||
pagination: {
|
pagination: {
|
||||||
mode: "off", // Perform pagination in antd's Table instead. Otherwise client-side sorting/filtering doesn't work.
|
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: {
|
sorters: {
|
||||||
mode: "off", // Disable server-side sorting
|
mode: "off", // Disable server-side sorting
|
||||||
@@ -63,7 +74,11 @@ export const SpoolList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
const typedFilters = typeFilters<ISpoolCollapsed>(filters);
|
const typedFilters = typeFilters<ISpoolCollapsed>(filters);
|
||||||
|
|
||||||
// Store state in local storage
|
// Store state in local storage
|
||||||
useStoreInitialState("spoolList", { sorters, filters });
|
useStoreInitialState("spoolList", {
|
||||||
|
sorters,
|
||||||
|
filters,
|
||||||
|
pagination: { current, pageSize },
|
||||||
|
});
|
||||||
|
|
||||||
// Collapse the dataSource to a mutable list and add a filament_name field
|
// Collapse the dataSource to a mutable list and add a filament_name field
|
||||||
const dataSource: ISpoolCollapsed[] = React.useMemo(
|
const dataSource: ISpoolCollapsed[] = React.useMemo(
|
||||||
@@ -98,6 +113,7 @@ export const SpoolList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setFilters([], "replace");
|
setFilters([], "replace");
|
||||||
setSorters([{ field: "id", order: "asc" }]);
|
setSorters([{ field: "id", order: "asc" }]);
|
||||||
|
setCurrent(1);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Clear Filters
|
Clear Filters
|
||||||
@@ -109,7 +125,15 @@ export const SpoolList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
<Table
|
<Table
|
||||||
{...tableProps}
|
{...tableProps}
|
||||||
dataSource={filteredDataSource}
|
dataSource={filteredDataSource}
|
||||||
pagination={{ showSizeChanger: true, pageSize: 20 }}
|
pagination={{
|
||||||
|
showSizeChanger: true,
|
||||||
|
current: current,
|
||||||
|
pageSize: pageSize,
|
||||||
|
onChange: (page, pageSize) => {
|
||||||
|
setCurrent(page);
|
||||||
|
setPageSize(pageSize);
|
||||||
|
},
|
||||||
|
}}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
>
|
>
|
||||||
<Table.Column
|
<Table.Column
|
||||||
|
|||||||
32
client/src/pages/vendors/list.tsx
vendored
32
client/src/pages/vendors/list.tsx
vendored
@@ -31,11 +31,22 @@ export const VendorList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
const initialState = useInitialTableState("vendorList");
|
const initialState = useInitialTableState("vendorList");
|
||||||
|
|
||||||
// Fetch data from the API
|
// Fetch data from the API
|
||||||
const { tableProps, sorters, filters, setSorters, setFilters } =
|
const {
|
||||||
useTable<IVendor>({
|
tableProps,
|
||||||
|
sorters,
|
||||||
|
setSorters,
|
||||||
|
filters,
|
||||||
|
setFilters,
|
||||||
|
current,
|
||||||
|
pageSize,
|
||||||
|
setCurrent,
|
||||||
|
setPageSize,
|
||||||
|
} = useTable<IVendor>({
|
||||||
syncWithLocation: false,
|
syncWithLocation: false,
|
||||||
pagination: {
|
pagination: {
|
||||||
mode: "off", // Perform pagination in antd's Table instead. Otherwise client-side sorting/filtering doesn't work.
|
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: {
|
sorters: {
|
||||||
mode: "off", // Disable server-side sorting
|
mode: "off", // Disable server-side sorting
|
||||||
@@ -52,7 +63,11 @@ export const VendorList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
const typedFilters = typeFilters<IVendor>(filters);
|
const typedFilters = typeFilters<IVendor>(filters);
|
||||||
|
|
||||||
// Store state in local storage
|
// Store state in local storage
|
||||||
useStoreInitialState("vendorList", { sorters, filters });
|
useStoreInitialState("vendorList", {
|
||||||
|
sorters,
|
||||||
|
filters,
|
||||||
|
pagination: { current, pageSize },
|
||||||
|
});
|
||||||
|
|
||||||
// Collapse the dataSource to a mutable list
|
// Collapse the dataSource to a mutable list
|
||||||
const dataSource: IVendor[] = React.useMemo(
|
const dataSource: IVendor[] = React.useMemo(
|
||||||
@@ -77,6 +92,7 @@ export const VendorList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setFilters([], "replace");
|
setFilters([], "replace");
|
||||||
setSorters([{ field: "id", order: "asc" }]);
|
setSorters([{ field: "id", order: "asc" }]);
|
||||||
|
setCurrent(1);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Clear Filters
|
Clear Filters
|
||||||
@@ -88,7 +104,15 @@ export const VendorList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
<Table
|
<Table
|
||||||
{...tableProps}
|
{...tableProps}
|
||||||
dataSource={filteredDataSource}
|
dataSource={filteredDataSource}
|
||||||
pagination={{ showSizeChanger: true, pageSize: 20 }}
|
pagination={{
|
||||||
|
showSizeChanger: true,
|
||||||
|
current: current,
|
||||||
|
pageSize: pageSize,
|
||||||
|
onChange: (page, pageSize) => {
|
||||||
|
setCurrent(page);
|
||||||
|
setPageSize(pageSize);
|
||||||
|
},
|
||||||
|
}}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
>
|
>
|
||||||
<Table.Column
|
<Table.Column
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ export function useListFiltersForField<Obj, Field extends keyof Obj>(
|
|||||||
dataSource: Obj[],
|
dataSource: Obj[],
|
||||||
field: Field): ColumnFilterItem[] {
|
field: Field): ColumnFilterItem[] {
|
||||||
return React.useMemo(() => {
|
return React.useMemo(() => {
|
||||||
console.log("useListFiltersForField");
|
|
||||||
const filters: ColumnFilterItem[] = [];
|
const filters: ColumnFilterItem[] = [];
|
||||||
dataSource.forEach((element) => {
|
dataSource.forEach((element) => {
|
||||||
const value = element[field];
|
const value = element[field];
|
||||||
|
|||||||
@@ -2,18 +2,26 @@ import React from "react";
|
|||||||
import { CrudFilter, CrudSort } from "@refinedev/core";
|
import { CrudFilter, CrudSort } from "@refinedev/core";
|
||||||
import { isLocalStorageAvailable } from "./support";
|
import { isLocalStorageAvailable } from "./support";
|
||||||
|
|
||||||
|
interface Pagination {
|
||||||
|
current: number;
|
||||||
|
pageSize: number;
|
||||||
|
}
|
||||||
|
|
||||||
interface TableState {
|
interface TableState {
|
||||||
sorters: CrudSort[];
|
sorters: CrudSort[];
|
||||||
filters: CrudFilter[];
|
filters: CrudFilter[];
|
||||||
|
pagination: Pagination;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useInitialTableState(tableId: string): TableState {
|
export function useInitialTableState(tableId: string): TableState {
|
||||||
const [initialState] = React.useState(() => {
|
const [initialState] = React.useState(() => {
|
||||||
const savedSorters = isLocalStorageAvailable ? localStorage.getItem(`${tableId}-sorters`) : null;
|
const savedSorters = isLocalStorageAvailable ? localStorage.getItem(`${tableId}-sorters`) : null;
|
||||||
const savedFilters = isLocalStorageAvailable ? localStorage.getItem(`${tableId}-filters`) : null;
|
const savedFilters = isLocalStorageAvailable ? localStorage.getItem(`${tableId}-filters`) : null;
|
||||||
|
const savedPagination = isLocalStorageAvailable ? localStorage.getItem(`${tableId}-pagination`) : null;
|
||||||
const sorters = savedSorters ? JSON.parse(savedSorters) : [{ field: "id", order: "asc" }];
|
const sorters = savedSorters ? JSON.parse(savedSorters) : [{ field: "id", order: "asc" }];
|
||||||
const filters = savedFilters ? JSON.parse(savedFilters) : [];
|
const filters = savedFilters ? JSON.parse(savedFilters) : [];
|
||||||
return { sorters, filters };
|
const pagination = savedPagination ? JSON.parse(savedPagination) : { page: 1, pageSize: 20 };
|
||||||
|
return { sorters, filters, pagination };
|
||||||
});
|
});
|
||||||
return initialState;
|
return initialState;
|
||||||
}
|
}
|
||||||
@@ -30,4 +38,10 @@ export function useStoreInitialState(tableId: string, state: TableState) {
|
|||||||
localStorage.setItem(`${tableId}-filters`, JSON.stringify(state.filters));
|
localStorage.setItem(`${tableId}-filters`, JSON.stringify(state.filters));
|
||||||
}
|
}
|
||||||
}, [tableId, state.filters]);
|
}, [tableId, state.filters]);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (isLocalStorageAvailable) {
|
||||||
|
localStorage.setItem(`${tableId}-pagination`, JSON.stringify(state.pagination));
|
||||||
|
}
|
||||||
|
}, [tableId, state.pagination]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user