Refactor initial index for filtering (#3893)

* Refactor initial index

* Changeset

* Ignore handler

* Fix linter

* Fix linter

* Lift up providers

* Delete FIltersArea.tsx
This commit is contained in:
Patryk Andrzejewski 2023-07-11 09:30:18 +02:00 committed by GitHub
parent 4ad8c15366
commit 4652f56531
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 145 additions and 91 deletions

View file

@ -0,0 +1,5 @@
---
"saleor-dashboard": minor
---
Refactor initial index for filters

View file

@ -1,4 +1,4 @@
import { ConditionalFilters } from "@dashboard/components/ConditionalFilter";
import { ConditionalProductFilters } from "@dashboard/components/ConditionalFilter";
import { Box, Button, Popover } from "@saleor/macaw-ui/next";
import React from "react";
@ -10,7 +10,7 @@ export const ExpressionFilters = () => (
<Popover.Content align="start">
<Box __minWidth="200px" __minHeight="100px" paddingX={4} paddingY={3}>
<Popover.Arrow />
<ConditionalFilters />
<ConditionalProductFilters />
</Box>
</Popover.Content>
</Popover>

View file

@ -0,0 +1,37 @@
import { Box, Text } from "@saleor/macaw-ui/next";
import React from "react";
import { FilterAPIProvider } from "./API/FilterAPIProvider";
import { FilterContainer } from "./FilterElement";
import { FiltersArea } from "./FiltersArea";
import { FilterValueProvider } from "./FilterValueProvider";
import { LeftOperandsProvider } from "./LeftOperandsProvider";
interface ConditionalFiltersProps {
valueProvider: FilterValueProvider
apiProvider: FilterAPIProvider
leftOperandsProvider: LeftOperandsProvider
onConfirm: (value: FilterContainer) => void
}
export const ConditionalFilters = ({ valueProvider, apiProvider, leftOperandsProvider, onConfirm }: ConditionalFiltersProps) => {
const handleConfirm = (value: FilterContainer) => {
valueProvider.persist(value)
onConfirm(value)
}
return (
<Box>
{valueProvider.loading ? (
<Text>Loading...</Text>
) : (
<FiltersArea
apiProvider={apiProvider}
leftOperandsProvider={leftOperandsProvider}
filterValue={valueProvider.value}
onConfirm={handleConfirm}
/>
)}
</Box>
);
};

View file

@ -0,0 +1,87 @@
import {
_ExperimentalFilters,
Box,
FilterEvent,
} from "@saleor/macaw-ui/next";
import React from "react";
import { FilterAPIProvider } from "./API/FilterAPIProvider";
import { FilterContainer } from "./FilterElement";
import { LeftOperandsProvider } from "./LeftOperandsProvider";
import { useFilterContainer } from "./useFilterContainer";
interface FiltersAreaProps {
filterValue: FilterContainer
apiProvider: FilterAPIProvider
leftOperandsProvider: LeftOperandsProvider
onConfirm: (value: FilterContainer) => void
}
export const FiltersArea = ({ filterValue, apiProvider, leftOperandsProvider, onConfirm }: FiltersAreaProps) => {
const {
value,
addEmpty,
removeAt,
updateLeftOperator,
updateRightOperator,
updateCondition,
updateRightOptions,
updateLeftOptions,
} = useFilterContainer(filterValue, apiProvider, leftOperandsProvider);
const handleStateChange = async (event: FilterEvent["detail"]) => {
if (!event) return
if (event.type === "row.add") {
addEmpty();
}
if (event.type === "row.remove") {
removeAt(event.path);
}
if (event.type === "leftOperator.onChange") {
updateLeftOperator(event.path, event.value);
}
if (event.type === "condition.onChange") {
updateCondition(event.path.split(".")[0], event.value);
}
if (event.type === "rightOperator.onChange") {
updateRightOperator(event.path.split(".")[0], event.value);
}
if (event.type === "rightOperator.onFocus") {
updateRightOptions(event.path.split(".")[0], "");
}
if (event.type === "rightOperator.onInputValueChange") {
updateRightOptions(event.path.split(".")[0], event.value);
}
if (event.type === "leftOperator.onInputValueChange") {
updateLeftOptions(event.path.split(".")[0], event.value);
}
};
return (
<Box>
<_ExperimentalFilters
leftOptions={leftOperandsProvider.operands}
// @ts-expect-error
value={value}
onChange={handleStateChange}
>
<_ExperimentalFilters.Footer>
<_ExperimentalFilters.AddRowButton>
Add new row
</_ExperimentalFilters.AddRowButton>
<_ExperimentalFilters.ConfirmButton onClick={() => onConfirm(value)}>
Confirm
</_ExperimentalFilters.ConfirmButton>
</_ExperimentalFilters.Footer>
</_ExperimentalFilters>
</Box>
);
};

View file

@ -1,99 +1,24 @@
// @ts-strict-ignore
import {
_ExperimentalFilters,
Box,
FilterEvent,
Text,
} from "@saleor/macaw-ui/next";
import React from "react";
import { useProductFilterAPIProvider } from "./API/ProductFilterAPIProvider";
import { useFilterContainer } from "./useFilterContainer";
import { ConditionalFilters } from "./ConditionalFilters";
import { FilterContainer } from "./FilterElement";
import { useFilterLeftOperandsProvider } from "./useFilterLeftOperands";
import { useUrlValueProvider } from "./ValueProvider/useUrlValueProvider";
const FiltersArea = ({ provider, onConfirm }) => {
export const ConditionalProductFilters = () => {
const provider = useUrlValueProvider();
const apiProvider = useProductFilterAPIProvider();
const leftOperandsProvider = useFilterLeftOperandsProvider();
const {
value,
addEmpty,
removeAt,
updateLeftOperator,
updateRightOperator,
updateCondition,
updateRightOptions,
updateLeftOptions,
} = useFilterContainer(provider, apiProvider, leftOperandsProvider);
// @ts-expect-error
const handleConfirm = (value: FilterContainer) => {
}
const handleStateChange = async (event: FilterEvent["detail"]) => {
if (event.type === "row.add") {
addEmpty();
}
if (event.type === "row.remove") {
removeAt(event.path);
}
if (event.type === "leftOperator.onChange") {
updateLeftOperator(event.path, event.value);
}
if (event.type === "condition.onChange") {
updateCondition(event.path.split(".")[0], event.value);
}
if (event.type === "rightOperator.onChange") {
updateRightOperator(event.path.split(".")[0], event.value);
}
if (event.type === "rightOperator.onFocus") {
updateRightOptions(event.path.split(".")[0], "");
}
if (event.type === "rightOperator.onInputValueChange") {
updateRightOptions(event.path.split(".")[0], event.value);
}
if (event.type === "leftOperator.onInputValueChange") {
updateLeftOptions(event.path.split(".")[0], event.value);
}
};
const handleConfirm = () => onConfirm(value);
return (
<Box>
<_ExperimentalFilters
leftOptions={leftOperandsProvider.operands}
// @ts-expect-error
value={value}
onChange={handleStateChange}
>
<_ExperimentalFilters.Footer>
<_ExperimentalFilters.AddRowButton>
Add new row
</_ExperimentalFilters.AddRowButton>
<_ExperimentalFilters.ConfirmButton onClick={handleConfirm}>
Confirm
</_ExperimentalFilters.ConfirmButton>
</_ExperimentalFilters.Footer>
</_ExperimentalFilters>
</Box>
);
};
export const ConditionalFilters = () => {
const provider = useUrlValueProvider();
return (
<Box>
{provider.loading ? (
<Text>Loading...</Text>
) : (
<FiltersArea provider={provider.value} onConfirm={provider.persist} />
)}
</Box>
);
};
return <ConditionalFilters
valueProvider={provider}
apiProvider={apiProvider}
leftOperandsProvider={leftOperandsProvider}
onConfirm={handleConfirm}
/>
}