From d8a54827eebf1ab2bc8155833ff695a89e655134 Mon Sep 17 00:00:00 2001
From: Oisin Coveney <oisin@metabase.com>
Date: Tue, 25 Jun 2024 15:26:20 +0300
Subject: [PATCH] Split content from `FilterModal` into `FilterContent`
 (#44534)

---
 .../components/FilterContent/FilterBody.tsx   | 43 ++++++++++++
 .../FilterContent/FilterContent.tsx           |  9 +++
 .../FilterEmptyState.tsx                      |  0
 .../components/FilterContent/FilterFooter.tsx | 36 ++++++++++
 .../components/FilterContent/FilterHeader.tsx | 10 +++
 .../components/FilterContent/index.ts         |  1 +
 .../components/FilterModal/FilterModal.tsx    | 65 +++++++------------
 .../components/FilterModal/utils/index.ts     |  3 +
 8 files changed, 126 insertions(+), 41 deletions(-)
 create mode 100644 frontend/src/metabase/querying/components/FilterContent/FilterBody.tsx
 create mode 100644 frontend/src/metabase/querying/components/FilterContent/FilterContent.tsx
 rename frontend/src/metabase/querying/components/{FilterModal => FilterContent}/FilterEmptyState.tsx (100%)
 create mode 100644 frontend/src/metabase/querying/components/FilterContent/FilterFooter.tsx
 create mode 100644 frontend/src/metabase/querying/components/FilterContent/FilterHeader.tsx
 create mode 100644 frontend/src/metabase/querying/components/FilterModal/utils/index.ts

diff --git a/frontend/src/metabase/querying/components/FilterContent/FilterBody.tsx b/frontend/src/metabase/querying/components/FilterContent/FilterBody.tsx
new file mode 100644
index 00000000000..52262fc3ff3
--- /dev/null
+++ b/frontend/src/metabase/querying/components/FilterContent/FilterBody.tsx
@@ -0,0 +1,43 @@
+import type * as Lib from "metabase-lib";
+
+import { FilterEmptyState } from "./FilterEmptyState";
+import { TabContent } from "./TabContent";
+import type { GroupItem } from "./types";
+
+type FilterBodyProps = {
+  groupItems: GroupItem[];
+  query: Lib.Query;
+  tab: string | null;
+  version: number;
+  searching: boolean;
+  onChange: (newQuery: Lib.Query) => void;
+  onInput: () => void;
+  onTabChange: (
+    value: ((prevState: string | null) => string | null) | string | null,
+  ) => void;
+};
+
+export const FilterBody = ({
+  groupItems,
+  onChange,
+  onInput,
+  onTabChange,
+  query,
+  searching,
+  tab,
+  version,
+}: FilterBodyProps) =>
+  groupItems.length > 0 ? (
+    <TabContent
+      query={query}
+      groupItems={groupItems}
+      tab={tab}
+      version={version}
+      isSearching={searching}
+      onChange={onChange}
+      onInput={onInput}
+      onTabChange={onTabChange}
+    />
+  ) : (
+    <FilterEmptyState />
+  );
diff --git a/frontend/src/metabase/querying/components/FilterContent/FilterContent.tsx b/frontend/src/metabase/querying/components/FilterContent/FilterContent.tsx
new file mode 100644
index 00000000000..6279a26ee21
--- /dev/null
+++ b/frontend/src/metabase/querying/components/FilterContent/FilterContent.tsx
@@ -0,0 +1,9 @@
+import { FilterBody } from "./FilterBody";
+import { FilterFooter } from "./FilterFooter";
+import { FilterHeader } from "./FilterHeader";
+
+export const FilterContent = {
+  Header: FilterHeader,
+  Body: FilterBody,
+  Footer: FilterFooter,
+};
diff --git a/frontend/src/metabase/querying/components/FilterModal/FilterEmptyState.tsx b/frontend/src/metabase/querying/components/FilterContent/FilterEmptyState.tsx
similarity index 100%
rename from frontend/src/metabase/querying/components/FilterModal/FilterEmptyState.tsx
rename to frontend/src/metabase/querying/components/FilterContent/FilterEmptyState.tsx
diff --git a/frontend/src/metabase/querying/components/FilterContent/FilterFooter.tsx b/frontend/src/metabase/querying/components/FilterContent/FilterFooter.tsx
new file mode 100644
index 00000000000..fe9152cb970
--- /dev/null
+++ b/frontend/src/metabase/querying/components/FilterContent/FilterFooter.tsx
@@ -0,0 +1,36 @@
+import { t } from "ttag";
+
+import { Button } from "metabase/ui";
+
+type FilterFooterProps = {
+  canRemoveFilters: boolean;
+  onClearFilters: () => void;
+  isChanged: boolean;
+  onApplyFilters: () => void;
+};
+
+export const FilterFooter = ({
+  canRemoveFilters,
+  isChanged,
+  onApplyFilters,
+  onClearFilters,
+}: FilterFooterProps) => (
+  <>
+    <Button
+      variant="subtle"
+      color="text-medium"
+      disabled={!canRemoveFilters}
+      onClick={onClearFilters}
+    >
+      {t`Clear all filters`}
+    </Button>
+    <Button
+      variant="filled"
+      disabled={!isChanged}
+      data-testid="apply-filters"
+      onClick={onApplyFilters}
+    >
+      {t`Apply filters`}
+    </Button>
+  </>
+);
diff --git a/frontend/src/metabase/querying/components/FilterContent/FilterHeader.tsx b/frontend/src/metabase/querying/components/FilterContent/FilterHeader.tsx
new file mode 100644
index 00000000000..8f4d6d4881a
--- /dev/null
+++ b/frontend/src/metabase/querying/components/FilterContent/FilterHeader.tsx
@@ -0,0 +1,10 @@
+import { FilterSearchInput } from "./FilterSearchInput";
+
+type FilterHeaderProps = {
+  value: string;
+  onChange: (searchText: string) => void;
+};
+
+export const FilterHeader = ({ value, onChange }: FilterHeaderProps) => {
+  return <FilterSearchInput searchText={value} onChange={onChange} />;
+};
diff --git a/frontend/src/metabase/querying/components/FilterContent/index.ts b/frontend/src/metabase/querying/components/FilterContent/index.ts
index 1fb69f349bc..adde954727e 100644
--- a/frontend/src/metabase/querying/components/FilterContent/index.ts
+++ b/frontend/src/metabase/querying/components/FilterContent/index.ts
@@ -1,3 +1,4 @@
 export * from "./TabContent";
 export * from "./FilterSearchInput";
 export * from "./types";
+export * from "./FilterContent";
diff --git a/frontend/src/metabase/querying/components/FilterModal/FilterModal.tsx b/frontend/src/metabase/querying/components/FilterModal/FilterModal.tsx
index 645606fb07c..cbc31ff4247 100644
--- a/frontend/src/metabase/querying/components/FilterModal/FilterModal.tsx
+++ b/frontend/src/metabase/querying/components/FilterModal/FilterModal.tsx
@@ -1,14 +1,9 @@
 import { useMemo, useState } from "react";
-import { t } from "ttag";
 
-import {
-  FilterSearchInput,
-  TabContent,
-} from "metabase/querying/components/FilterContent";
-import { Button, Modal } from "metabase/ui";
+import { FilterContent } from "metabase/querying/components/FilterContent";
+import { Modal } from "metabase/ui";
 import * as Lib from "metabase-lib";
 
-import { FilterEmptyState } from "./FilterEmptyState";
 import { ModalBody, ModalFooter, ModalHeader } from "./FilterModal.styled";
 import { SEARCH_KEY } from "./constants";
 import {
@@ -16,9 +11,11 @@ import {
   getGroupItems,
   hasFilters,
   removeFilters,
-} from "./utils/filters";
-import { getModalTitle, getModalWidth } from "./utils/modal";
-import { isSearchActive, searchGroupItems } from "./utils/search";
+  getModalTitle,
+  getModalWidth,
+  isSearchActive,
+  searchGroupItems,
+} from "./utils";
 
 export interface FilterModalProps {
   query: Lib.Query;
@@ -80,42 +77,28 @@ export function FilterModal({
       <Modal.Content>
         <ModalHeader p="lg">
           <Modal.Title>{getModalTitle(groupItems)}</Modal.Title>
-          <FilterSearchInput searchText={searchText} onChange={handleSearch} />
+          <FilterContent.Header value={searchText} onChange={handleSearch} />
           <Modal.CloseButton />
         </ModalHeader>
         <ModalBody p={0}>
-          {visibleItems.length > 0 ? (
-            <TabContent
-              query={query}
-              groupItems={visibleItems}
-              tab={tab}
-              version={version}
-              isSearching={isSearching}
-              onChange={handleChange}
-              onInput={handleInput}
-              onTabChange={setTab}
-            />
-          ) : (
-            <FilterEmptyState />
-          )}
+          <FilterContent.Body
+            groupItems={visibleItems}
+            query={query}
+            tab={tab}
+            version={version}
+            searching={isSearching}
+            onChange={handleChange}
+            onInput={handleInput}
+            onTabChange={setTab}
+          />
         </ModalBody>
         <ModalFooter p="md" direction="row" justify="space-between">
-          <Button
-            variant="subtle"
-            color="text-medium"
-            disabled={!canRemoveFilters}
-            onClick={handleReset}
-          >
-            {t`Clear all filters`}
-          </Button>
-          <Button
-            variant="filled"
-            disabled={!isChanged}
-            data-testid="apply-filters"
-            onClick={handleSubmit}
-          >
-            {t`Apply filters`}
-          </Button>
+          <FilterContent.Footer
+            canRemoveFilters={canRemoveFilters}
+            onClearFilters={handleReset}
+            isChanged={isChanged}
+            onApplyFilters={handleSubmit}
+          />
         </ModalFooter>
       </Modal.Content>
     </Modal.Root>
diff --git a/frontend/src/metabase/querying/components/FilterModal/utils/index.ts b/frontend/src/metabase/querying/components/FilterModal/utils/index.ts
new file mode 100644
index 00000000000..4f439aa66f5
--- /dev/null
+++ b/frontend/src/metabase/querying/components/FilterModal/utils/index.ts
@@ -0,0 +1,3 @@
+export * from "./filters";
+export * from "./modal";
+export * from "./search";
-- 
GitLab