Fix null-checks for filters (#3868)

* Fix null checks

* Changeset

* Cr
This commit is contained in:
Patryk Andrzejewski 2023-07-06 10:44:22 +02:00 committed by GitHub
parent 4433a9463a
commit 05ff533731
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 22 additions and 20 deletions

View file

@ -0,0 +1,5 @@
---
"saleor-dashboard": patch
---
Fix null-cheks for filters

View file

@ -161,7 +161,7 @@ export class FilterElement {
); );
} }
return null; return FilterElement.createEmpty();
} }
} }

View file

@ -1,14 +1,15 @@
// @ts-strict-ignore
import { UrlToken } from "../UrlToken"; import { UrlToken } from "../UrlToken";
export interface FetchingParams { export interface FetchingParams {
category: string[]; category: string[];
collection: string[]; collection: string[];
channel: string[]; channel: string[];
producttype: []; producttype: string[];
attribute: Record<string, string[]>; attribute: Record<string, string[]>;
} }
type FetchingParamsKeys = keyof Omit<FetchingParams, "attribute">
export const emptyFetchingParams: FetchingParams = { export const emptyFetchingParams: FetchingParams = {
category: [], category: [],
collection: [], collection: [],
@ -20,8 +21,10 @@ export const emptyFetchingParams: FetchingParams = {
const unique = <T>(array: Iterable<T>) => Array.from(new Set(array)); const unique = <T>(array: Iterable<T>) => Array.from(new Set(array));
export const toFetchingParams = (p: FetchingParams, c: UrlToken) => { export const toFetchingParams = (p: FetchingParams, c: UrlToken) => {
if (!c.isAttribute() && !p[c.name]) { const key = c.name as FetchingParamsKeys
p[c.name] = [];
if (!c.isAttribute() && !p[key]) {
p[key] = []
} }
if (c.isAttribute() && !p.attribute[c.name]) { if (c.isAttribute() && !p.attribute[c.name]) {
@ -34,7 +37,7 @@ export const toFetchingParams = (p: FetchingParams, c: UrlToken) => {
return p; return p;
} }
p[c.name] = unique(p[c.name].concat(c.value)); p[key] = unique(p[key].concat(c.value));
return p; return p;
}; };

View file

@ -1,5 +1,3 @@
// @ts-strict-ignore
import { parse, ParsedQs } from "qs"; import { parse, ParsedQs } from "qs";
import { useRef } from "react"; import { useRef } from "react";
@ -51,7 +49,7 @@ const tokenizeUrl = (urlParams: string) => {
const mapUrlTokensToFilterValues = ( const mapUrlTokensToFilterValues = (
urlTokens: TokenArray, urlTokens: TokenArray,
response: InitialStateResponse, response: InitialStateResponse,
) => ): FilterContainer =>
urlTokens.map(el => { urlTokens.map(el => {
if (typeof el === "string") { if (typeof el === "string") {
return el; return el;
@ -97,7 +95,7 @@ export class TokenArray extends Array<string | UrlToken | TokenArray> {
} }
export const useTokenArray = (url: string) => { export const useTokenArray = (url: string) => {
const instance = useRef<TokenArray>(null); const instance = useRef<TokenArray | null>(null);
if (!instance.current) { if (!instance.current) {
instance.current = new TokenArray(url); instance.current = new TokenArray(url);

View file

@ -1,5 +1,3 @@
// @ts-strict-ignore
import { stringify } from "qs"; import { stringify } from "qs";
import useRouter from "use-react-router"; import useRouter from "use-react-router";
@ -7,8 +5,11 @@ import { useInitialAPIState } from "../API/initialState/useInitalAPIState";
import { FilterContainer } from "../FilterElement"; import { FilterContainer } from "../FilterElement";
import { FilterValueProvider } from "../FilterValueProvider"; import { FilterValueProvider } from "../FilterValueProvider";
import { useTokenArray } from "./TokenArray"; import { useTokenArray } from "./TokenArray";
import { UrlEntry } from "./UrlToken";
const prepareStructure = filterValue => type Structure = Array<string | UrlEntry | Structure>
const prepareStructure = (filterValue: FilterContainer): Structure =>
filterValue.map(f => { filterValue.map(f => {
if (typeof f === "string") { if (typeof f === "string") {
return f; return f;
@ -21,9 +22,6 @@ const prepareStructure = filterValue =>
return f.asUrlEntry(); return f.asUrlEntry();
}); });
/*
exampple url: http://localhost:9000/dashboard/products/?0%5Bs2.category%5D%5B0%5D=accessories&0%5Bs2.category%5D%5B1%5D=groceries&1=o&2%5Ba2.abv%5D%5B0%5D=QXR0cmlidXRlVmFsdWU6Njg%3D&3=a&4%5Bs2.collection%5D%5B0%5D=featured-products&5=a&6%5Bs2.producttype%5D%5B0%5D=beer&7=a&8%5B0%5D%5Bs2.category%5D%5B0%5D=apparel&8%5B1%5D=o&8%5B2%5D%5Ba2.bottle-size%5D%5B0%5D=QXR0cmlidXRlVmFsdWU6NDY%3D&8%5B2%5D%5Ba2.bottle-size%5D%5B1%5D=QXR0cmlidXRlVmFsdWU6NDc%3D&asc=true&sort=name
*/
export const useUrlValueProvider = (): FilterValueProvider => { export const useUrlValueProvider = (): FilterValueProvider => {
const router = useRouter(); const router = useRouter();
const params = new URLSearchParams(router.location.search); const params = new URLSearchParams(router.location.search);

View file

@ -1,15 +1,13 @@
// @ts-strict-ignore
import { ConditionValue } from "./FilterElement/ConditionValue"; import { ConditionValue } from "./FilterElement/ConditionValue";
export const CONTROL_DEFAULTS = { export const CONTROL_DEFAULTS = {
text: "", text: "",
number: "", number: "",
"number.range": [] as unknown as [string, string], "number.range": [] as unknown as [string, string],
multiselect: [] as ConditionValue[], multiselect: [] as ConditionValue,
select: "", select: "",
combobox: "", combobox: "",
}; };
export const getDefaultByControlName = (name: string): ConditionValue => export const getDefaultByControlName = (name: string): ConditionValue =>
CONTROL_DEFAULTS[name]; CONTROL_DEFAULTS[name as keyof typeof CONTROL_DEFAULTS];