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