Client: Filter state is now saved in local storage
This commit is contained in:
@@ -3,6 +3,7 @@ import {
|
|||||||
IResourceComponentsProps,
|
IResourceComponentsProps,
|
||||||
BaseRecord,
|
BaseRecord,
|
||||||
CrudSort,
|
CrudSort,
|
||||||
|
CrudFilter,
|
||||||
} from "@refinedev/core";
|
} from "@refinedev/core";
|
||||||
import {
|
import {
|
||||||
useTable,
|
useTable,
|
||||||
@@ -21,6 +22,7 @@ import {
|
|||||||
filterPopulator,
|
filterPopulator,
|
||||||
genericFilterer,
|
genericFilterer,
|
||||||
genericSorter,
|
genericSorter,
|
||||||
|
getFiltersForField,
|
||||||
getSortOrderForField,
|
getSortOrderForField,
|
||||||
} from "../../utils/sorting";
|
} from "../../utils/sorting";
|
||||||
|
|
||||||
@@ -41,6 +43,15 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Load filter state from local storage
|
||||||
|
const [filters_initial] = React.useState<CrudFilter[]>(() => {
|
||||||
|
const storedFilters = localStorage.getItem("filamentListFilters");
|
||||||
|
if (storedFilters) {
|
||||||
|
return JSON.parse(storedFilters);
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
});
|
||||||
|
|
||||||
// Fetch data from the API
|
// Fetch data from the API
|
||||||
const { tableProps, sorters, filters } = useTable<IFilament>({
|
const { tableProps, sorters, filters } = useTable<IFilament>({
|
||||||
syncWithLocation: false,
|
syncWithLocation: false,
|
||||||
@@ -53,6 +64,7 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
},
|
},
|
||||||
filters: {
|
filters: {
|
||||||
mode: "off", // Disable server-side filtering
|
mode: "off", // Disable server-side filtering
|
||||||
|
initial: filters_initial,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -61,6 +73,11 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
localStorage.setItem("filamentListSorters", JSON.stringify(sorters));
|
localStorage.setItem("filamentListSorters", JSON.stringify(sorters));
|
||||||
}, [sorters]);
|
}, [sorters]);
|
||||||
|
|
||||||
|
// Store filter state in local storage
|
||||||
|
React.useEffect(() => {
|
||||||
|
localStorage.setItem("filamentListFilters", JSON.stringify(filters));
|
||||||
|
}, [filters]);
|
||||||
|
|
||||||
// Copy dataSource to avoid mutating the original
|
// Copy dataSource to avoid mutating the original
|
||||||
const dataSource = [...(tableProps.dataSource || [])];
|
const dataSource = [...(tableProps.dataSource || [])];
|
||||||
|
|
||||||
@@ -102,6 +119,10 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
"vendor_name"
|
"vendor_name"
|
||||||
)}
|
)}
|
||||||
filters={filterPopulator(dataSource, "vendor_name")}
|
filters={filterPopulator(dataSource, "vendor_name")}
|
||||||
|
defaultFilteredValue={getFiltersForField(
|
||||||
|
filters_initial,
|
||||||
|
"vendor_name"
|
||||||
|
)}
|
||||||
/>
|
/>
|
||||||
<Table.Column
|
<Table.Column
|
||||||
dataIndex="name"
|
dataIndex="name"
|
||||||
@@ -109,6 +130,7 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
sorter={true}
|
sorter={true}
|
||||||
defaultSortOrder={getSortOrderForField(sorters_initial, "name")}
|
defaultSortOrder={getSortOrderForField(sorters_initial, "name")}
|
||||||
filters={filterPopulator(dataSource, "name")}
|
filters={filterPopulator(dataSource, "name")}
|
||||||
|
defaultFilteredValue={getFiltersForField(filters_initial, "name")}
|
||||||
/>
|
/>
|
||||||
<Table.Column
|
<Table.Column
|
||||||
dataIndex="material"
|
dataIndex="material"
|
||||||
@@ -116,6 +138,7 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
sorter={true}
|
sorter={true}
|
||||||
defaultSortOrder={getSortOrderForField(sorters_initial, "material")}
|
defaultSortOrder={getSortOrderForField(sorters_initial, "material")}
|
||||||
filters={filterPopulator(dataSource, "material")}
|
filters={filterPopulator(dataSource, "material")}
|
||||||
|
defaultFilteredValue={getFiltersForField(filters_initial, "material")}
|
||||||
/>
|
/>
|
||||||
<Table.Column
|
<Table.Column
|
||||||
dataIndex="price"
|
dataIndex="price"
|
||||||
@@ -205,6 +228,10 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
|
|||||||
"article_number"
|
"article_number"
|
||||||
)}
|
)}
|
||||||
filters={filterPopulator(dataSource, "article_number")}
|
filters={filterPopulator(dataSource, "article_number")}
|
||||||
|
defaultFilteredValue={getFiltersForField(
|
||||||
|
filters_initial,
|
||||||
|
"article_number"
|
||||||
|
)}
|
||||||
/>
|
/>
|
||||||
<Table.Column
|
<Table.Column
|
||||||
dataIndex={["registered"]}
|
dataIndex={["registered"]}
|
||||||
|
|||||||
@@ -91,6 +91,9 @@ export function genericFilterer(filters: CrudFilter[]) {
|
|||||||
console.error("Filter value must be an array of strings.");
|
console.error("Filter value must be an array of strings.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!filter.value.length) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let value = record[filter.field];
|
let value = record[filter.field];
|
||||||
if (value === undefined || value === null) {
|
if (value === undefined || value === null) {
|
||||||
value = "";
|
value = "";
|
||||||
@@ -148,3 +151,19 @@ export function filterPopulator(dataSource: IObj[], field: string): ColumnFilter
|
|||||||
});
|
});
|
||||||
return filters;
|
return filters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of filter values for a given field based on the provided filters.
|
||||||
|
* @param filters An array of `CrudFilter` objects that define the filtering criteria.
|
||||||
|
* @param field The field to get the filter values for.
|
||||||
|
* @returns An array of filter values for the given field.
|
||||||
|
*/
|
||||||
|
export function getFiltersForField(filters: CrudFilter[], field: string): string[] {
|
||||||
|
const filterValues: string[] = [];
|
||||||
|
filters.forEach((filter) => {
|
||||||
|
if ("field" in filter && filter.field === field) {
|
||||||
|
filterValues.push(...filter.value as string[]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return filterValues;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user