forked from sk1982/actaeon
fix: checking stored filter types in filter sorter
This commit is contained in:
parent
e1ec5f275f
commit
b3a697caed
@ -480,6 +480,34 @@ const FilterSorterComponent = <D, M extends string, N extends string, S extends
|
|||||||
</div>);
|
</div>);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const payloadValid = (payload: any, filterers: Filterers<any, any>) => {
|
||||||
|
for (const p of ['sorter', 'pageSize', 'displayMode']) {
|
||||||
|
if (p in payload && !(payload[p] instanceof Set))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('currentPage' in payload && typeof payload.currentPage !== 'number')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (const filterer of filterers) {
|
||||||
|
if (!(filterer.name in payload)) continue;
|
||||||
|
const data = payload[filterer.name];
|
||||||
|
console.log(filterer.name, data)
|
||||||
|
if (filterer.type === 'select' && !(data instanceof Set))
|
||||||
|
return false;
|
||||||
|
if (filterer.type === 'slider' && !Array.isArray(data))
|
||||||
|
return false;
|
||||||
|
if (filterer.type === 'dateSelect' && data !== undefined && (
|
||||||
|
data.from === undefined ||
|
||||||
|
(data.from !== undefined && !(data.from instanceof Date)) ||
|
||||||
|
(data.to !== undefined && !(data.to instanceof Date))
|
||||||
|
))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
export const FilterSorter = <D, M extends string, N extends string, S extends string>(props: FilterSorterProps<D, M, N, S>) => {
|
export const FilterSorter = <D, M extends string, N extends string, S extends string>(props: FilterSorterProps<D, M, N, S>) => {
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const localStateKey = `filter-sort-${pathname}`;
|
const localStateKey = `filter-sort-${pathname}`;
|
||||||
@ -494,7 +522,24 @@ export const FilterSorter = <D, M extends string, N extends string, S extends st
|
|||||||
let payload: any;
|
let payload: any;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
payload = JSON.parse(stored, (k, v) => typeof v === 'object' && 'type' in v && v.type === 'set' ? new Set(v.value) : v);
|
payload = JSON.parse(stored, (k, v) => {
|
||||||
|
if (typeof v === 'object' && v !== null) {
|
||||||
|
if ('type' in v && v.type === 'set')
|
||||||
|
return new Set(v.value);
|
||||||
|
|
||||||
|
const filterer = props.filterers.find(f => f.name === k);
|
||||||
|
if (filterer?.type === 'dateSelect')
|
||||||
|
return {
|
||||||
|
from: typeof v.from === 'string' ? new Date(v.from) : undefined,
|
||||||
|
to: typeof v.to === 'string' ? new Date(v.to) : undefined
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!payloadValid(payload, props.filterers))
|
||||||
|
payload = {};
|
||||||
|
|
||||||
setDefaultData(payload)
|
setDefaultData(payload)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
Loading…
Reference in New Issue
Block a user