diff --git a/.changeset/two-seas-shake.md b/.changeset/two-seas-shake.md new file mode 100644 index 000000000..5498022aa --- /dev/null +++ b/.changeset/two-seas-shake.md @@ -0,0 +1,5 @@ +--- +"saleor-dashboard": minor +--- + +Refactor initial index for filters diff --git a/src/components/AppLayout/ListFilters/components/ExpressionFilters.tsx b/src/components/AppLayout/ListFilters/components/ExpressionFilters.tsx index 0ae82fd2d..13d1f6a6c 100644 --- a/src/components/AppLayout/ListFilters/components/ExpressionFilters.tsx +++ b/src/components/AppLayout/ListFilters/components/ExpressionFilters.tsx @@ -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 = () => ( - + diff --git a/src/components/ConditionalFilter/ConditionalFilters.tsx b/src/components/ConditionalFilter/ConditionalFilters.tsx new file mode 100644 index 000000000..968b3caa6 --- /dev/null +++ b/src/components/ConditionalFilter/ConditionalFilters.tsx @@ -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 ( + + {valueProvider.loading ? ( + Loading... + ) : ( + + )} + + ); +}; \ No newline at end of file diff --git a/src/components/ConditionalFilter/FiltersArea.tsx b/src/components/ConditionalFilter/FiltersArea.tsx new file mode 100644 index 000000000..2caf7253a --- /dev/null +++ b/src/components/ConditionalFilter/FiltersArea.tsx @@ -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 ( + + <_ExperimentalFilters + leftOptions={leftOperandsProvider.operands} + // @ts-expect-error + value={value} + onChange={handleStateChange} + > + <_ExperimentalFilters.Footer> + <_ExperimentalFilters.AddRowButton> + Add new row + + <_ExperimentalFilters.ConfirmButton onClick={() => onConfirm(value)}> + Confirm + + + + + ); +}; diff --git a/src/components/ConditionalFilter/index.tsx b/src/components/ConditionalFilter/index.tsx index 93806fd30..1eab0b5f6 100644 --- a/src/components/ConditionalFilter/index.tsx +++ b/src/components/ConditionalFilter/index.tsx @@ -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 ( - - <_ExperimentalFilters - leftOptions={leftOperandsProvider.operands} - // @ts-expect-error - value={value} - onChange={handleStateChange} - > - <_ExperimentalFilters.Footer> - <_ExperimentalFilters.AddRowButton> - Add new row - - <_ExperimentalFilters.ConfirmButton onClick={handleConfirm}> - Confirm - - - - - ); -}; - -export const ConditionalFilters = () => { - const provider = useUrlValueProvider(); - - return ( - - {provider.loading ? ( - Loading... - ) : ( - - )} - - ); -}; + return +} \ No newline at end of file