parent
4433a9463a
commit
05ff533731
6 changed files with 22 additions and 20 deletions
5
.changeset/sour-onions-appear.md
Normal file
5
.changeset/sour-onions-appear.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
"saleor-dashboard": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix null-cheks for filters
|
|
@ -161,7 +161,7 @@ export class FilterElement {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return FilterElement.createEmpty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in a new issue