From 8f002b87212936996b7dc1cd04f16e06a7b0c967 Mon Sep 17 00:00:00 2001 From: Alexander Polyankin <alexander.polyankin@metabase.com> Date: Wed, 11 Sep 2024 13:59:52 -0400 Subject: [PATCH] Unify FilterPickerForm --- .../BooleanFilterPicker.tsx | 10 ++++---- .../CoordinateFilterPicker.tsx | 19 +++++++-------- .../DefaultFilterPicker.tsx | 10 ++++---- .../FilterPickerForm/FilterPickerForm.tsx | 24 +++++++++++++++++++ .../FilterPicker/FilterPickerForm/index.ts | 1 + .../NumberFilterPicker/NumberFilterPicker.tsx | 19 +++++++-------- .../StringFilterPicker/StringFilterPicker.tsx | 19 +++++++-------- .../TimeFilterPicker/TimeFilterPicker.tsx | 12 +++------- 8 files changed, 60 insertions(+), 54 deletions(-) create mode 100644 frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/FilterPickerForm.tsx create mode 100644 frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/index.ts diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/BooleanFilterPicker/BooleanFilterPicker.tsx b/frontend/src/metabase/querying/filters/components/FilterPicker/BooleanFilterPicker/BooleanFilterPicker.tsx index 8cd44f8e9c9..366d6e314fb 100644 --- a/frontend/src/metabase/querying/filters/components/FilterPicker/BooleanFilterPicker/BooleanFilterPicker.tsx +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/BooleanFilterPicker/BooleanFilterPicker.tsx @@ -3,12 +3,12 @@ import { useMemo } from "react"; import { t } from "ttag"; import { useBooleanOptionFilter } from "metabase/querying/filters/hooks/use-boolean-option-filter"; -import { Box, Button, Icon, Radio, Stack } from "metabase/ui"; +import { Button, Icon, Radio, Stack } from "metabase/ui"; import * as Lib from "metabase-lib"; import { FilterPickerFooter } from "../FilterPickerFooter"; +import { FilterPickerForm } from "../FilterPickerForm"; import { FilterPickerHeader } from "../FilterPickerHeader"; -import { MIN_WIDTH } from "../constants"; import type { FilterPickerWidgetProps } from "../types"; export function BooleanFilterPicker({ @@ -52,9 +52,7 @@ export function BooleanFilterPicker({ }; return ( - <Box - component="form" - miw={MIN_WIDTH} + <FilterPickerForm data-testid="boolean-filter-picker" onSubmit={handleSubmit} > @@ -89,6 +87,6 @@ export function BooleanFilterPicker({ )} <FilterPickerFooter isNew={isNew} canSubmit /> </div> - </Box> + </FilterPickerForm> ); } diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/CoordinateFilterPicker/CoordinateFilterPicker.tsx b/frontend/src/metabase/querying/filters/components/FilterPicker/CoordinateFilterPicker/CoordinateFilterPicker.tsx index ce44f49fcc1..fd0d7b1a300 100644 --- a/frontend/src/metabase/querying/filters/components/FilterPicker/CoordinateFilterPicker/CoordinateFilterPicker.tsx +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/CoordinateFilterPicker/CoordinateFilterPicker.tsx @@ -13,8 +13,8 @@ import * as Lib from "metabase-lib"; import { NumberFilterValuePicker } from "../../FilterValuePicker"; import { FilterOperatorPicker } from "../FilterOperatorPicker"; import { FilterPickerFooter } from "../FilterPickerFooter"; +import { FilterPickerForm } from "../FilterPickerForm"; import { FilterPickerHeader } from "../FilterPickerHeader"; -import { MAX_WIDTH, MIN_WIDTH } from "../constants"; import type { FilterPickerWidgetProps } from "../types"; import { CoordinateColumnPicker } from "./CoordinateColumnPicker"; @@ -72,10 +72,7 @@ export function CoordinateFilterPicker({ }; return ( - <Box - component="form" - miw={MIN_WIDTH} - maw={MAX_WIDTH} + <FilterPickerForm data-testid="coordinate-filter-picker" onSubmit={handleSubmit} > @@ -89,7 +86,7 @@ export function CoordinateFilterPicker({ onChange={handleOperatorChange} /> </FilterPickerHeader> - <Box> + <Flex direction="column" mih={0}> {canPickColumns && ( <CoordinateColumnPicker query={query} @@ -110,8 +107,8 @@ export function CoordinateFilterPicker({ onChange={setValues} /> <FilterPickerFooter isNew={isNew} canSubmit={isValid} /> - </Box> - </Box> + </Flex> + </FilterPickerForm> ); } @@ -136,7 +133,7 @@ function CoordinateValueInput({ }: CoordinateValueInputProps) { if (hasMultipleValues) { return ( - <Box p="md" mah="25vh" style={{ overflow: "auto" }}> + <Box p="md" style={{ overflow: "auto" }}> <NumberFilterValuePicker query={query} stageIndex={stageIndex} @@ -151,7 +148,7 @@ function CoordinateValueInput({ if (valueCount === 1) { return ( - <Flex p="md"> + <Box p="md"> <NumberInput value={values[0]} placeholder={t`Enter a number`} @@ -160,7 +157,7 @@ function CoordinateValueInput({ aria-label={t`Filter value`} onChange={(newValue: number) => onChange([newValue])} /> - </Flex> + </Box> ); } diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/DefaultFilterPicker/DefaultFilterPicker.tsx b/frontend/src/metabase/querying/filters/components/FilterPicker/DefaultFilterPicker/DefaultFilterPicker.tsx index cf156ef668f..a256e16c318 100644 --- a/frontend/src/metabase/querying/filters/components/FilterPicker/DefaultFilterPicker/DefaultFilterPicker.tsx +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/DefaultFilterPicker/DefaultFilterPicker.tsx @@ -2,12 +2,12 @@ import type { FormEvent } from "react"; import { useMemo } from "react"; import { useDefaultFilter } from "metabase/querying/filters/hooks/use-default-filter"; -import { Box, Radio, Stack } from "metabase/ui"; +import { Radio, Stack } from "metabase/ui"; import * as Lib from "metabase-lib"; import { FilterPickerFooter } from "../FilterPickerFooter"; +import { FilterPickerForm } from "../FilterPickerForm"; import { FilterPickerHeader } from "../FilterPickerHeader"; -import { MIN_WIDTH } from "../constants"; import type { FilterPickerWidgetProps } from "../types"; export function DefaultFilterPicker({ @@ -52,9 +52,7 @@ export function DefaultFilterPicker({ }; return ( - <Box - component="form" - miw={MIN_WIDTH} + <FilterPickerForm data-testid="default-filter-picker" onSubmit={handleSubmit} > @@ -78,6 +76,6 @@ export function DefaultFilterPicker({ </Radio.Group> <FilterPickerFooter isNew={isNew} canSubmit /> </div> - </Box> + </FilterPickerForm> ); } diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/FilterPickerForm.tsx b/frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/FilterPickerForm.tsx new file mode 100644 index 00000000000..3df2064ba99 --- /dev/null +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/FilterPickerForm.tsx @@ -0,0 +1,24 @@ +import { type HTMLAttributes, type Ref, forwardRef } from "react"; + +import { Box } from "metabase/ui"; + +import { MAX_WIDTH, MIN_WIDTH } from "../constants"; + +export const FilterPickerForm = forwardRef(function FilterPickerForm( + props: HTMLAttributes<HTMLFormElement>, + ref: Ref<HTMLFormElement>, +) { + return ( + <Box + ref={ref} + {...props} + component="form" + display="flex" + miw={MIN_WIDTH} + maw={MAX_WIDTH} + mih={0} + mah="inherit" + style={{ flexDirection: "column" }} + /> + ); +}); diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/index.ts b/frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/index.ts new file mode 100644 index 00000000000..f564b2f7b4c --- /dev/null +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/FilterPickerForm/index.ts @@ -0,0 +1 @@ +export * from "./FilterPickerForm"; diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/NumberFilterPicker/NumberFilterPicker.tsx b/frontend/src/metabase/querying/filters/components/FilterPicker/NumberFilterPicker/NumberFilterPicker.tsx index 56d0b2ba3a6..5363dfacd8f 100644 --- a/frontend/src/metabase/querying/filters/components/FilterPicker/NumberFilterPicker/NumberFilterPicker.tsx +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/NumberFilterPicker/NumberFilterPicker.tsx @@ -13,8 +13,8 @@ import * as Lib from "metabase-lib"; import { NumberFilterValuePicker } from "../../FilterValuePicker"; import { FilterOperatorPicker } from "../FilterOperatorPicker"; import { FilterPickerFooter } from "../FilterPickerFooter"; +import { FilterPickerForm } from "../FilterPickerForm"; import { FilterPickerHeader } from "../FilterPickerHeader"; -import { MAX_WIDTH, MIN_WIDTH } from "../constants"; import type { FilterPickerWidgetProps } from "../types"; export function NumberFilterPicker({ @@ -64,10 +64,7 @@ export function NumberFilterPicker({ }; return ( - <Box - component="form" - miw={MIN_WIDTH} - maw={MAX_WIDTH} + <FilterPickerForm data-testid="number-filter-picker" onSubmit={handleSubmit} > @@ -81,7 +78,7 @@ export function NumberFilterPicker({ onChange={handleOperatorChange} /> </FilterPickerHeader> - <div> + <Flex direction="column" mih={0}> <NumberValueInput query={query} stageIndex={stageIndex} @@ -92,8 +89,8 @@ export function NumberFilterPicker({ onChange={setValues} /> <FilterPickerFooter isNew={isNew} canSubmit={isValid} /> - </div> - </Box> + </Flex> + </FilterPickerForm> ); } @@ -118,7 +115,7 @@ function NumberValueInput({ }: NumberValueInputProps) { if (hasMultipleValues) { return ( - <Box p="md" mah="25vh" style={{ overflow: "auto" }}> + <Box p="md" style={{ overflow: "auto" }}> <NumberFilterValuePicker query={query} stageIndex={stageIndex} @@ -133,7 +130,7 @@ function NumberValueInput({ if (valueCount === 1) { return ( - <Flex p="md"> + <Box p="md"> <NumberInput value={values[0]} placeholder={t`Enter a number`} @@ -142,7 +139,7 @@ function NumberValueInput({ aria-label={t`Filter value`} onChange={newValue => onChange([newValue])} /> - </Flex> + </Box> ); } diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/StringFilterPicker/StringFilterPicker.tsx b/frontend/src/metabase/querying/filters/components/FilterPicker/StringFilterPicker/StringFilterPicker.tsx index 72f1278df52..1ce42fd6924 100644 --- a/frontend/src/metabase/querying/filters/components/FilterPicker/StringFilterPicker/StringFilterPicker.tsx +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/StringFilterPicker/StringFilterPicker.tsx @@ -12,8 +12,8 @@ import * as Lib from "metabase-lib"; import { StringFilterValuePicker } from "../../FilterValuePicker"; import { FilterOperatorPicker } from "../FilterOperatorPicker"; import { FilterPickerFooter } from "../FilterPickerFooter"; +import { FilterPickerForm } from "../FilterPickerForm"; import { FilterPickerHeader } from "../FilterPickerHeader"; -import { MAX_WIDTH, MIN_WIDTH } from "../constants"; import type { FilterPickerWidgetProps } from "../types"; export function StringFilterPicker({ @@ -64,10 +64,7 @@ export function StringFilterPicker({ }; return ( - <Box - component="form" - miw={MIN_WIDTH} - maw={MAX_WIDTH} + <FilterPickerForm data-testid="string-filter-picker" onSubmit={handleSubmit} > @@ -81,7 +78,7 @@ export function StringFilterPicker({ onChange={handleOperatorChange} /> </FilterPickerHeader> - <div> + <Flex direction="column" mih={0}> <StringValueInput query={query} stageIndex={stageIndex} @@ -98,8 +95,8 @@ export function StringFilterPicker({ /> )} </FilterPickerFooter> - </div> - </Box> + </Flex> + </FilterPickerForm> ); } @@ -122,7 +119,7 @@ function StringValueInput({ }: StringValueInputProps) { if (type === "exact") { return ( - <Box p="md" mah="25vh" style={{ overflow: "auto" }}> + <Box p="md" style={{ overflow: "auto" }}> <StringFilterValuePicker query={query} stageIndex={stageIndex} @@ -137,7 +134,7 @@ function StringValueInput({ if (type === "partial") { return ( - <Flex p="md"> + <Box p="md"> <MultiAutocomplete value={values} data={[]} @@ -147,7 +144,7 @@ function StringValueInput({ aria-label={t`Filter value`} onChange={onChange} /> - </Flex> + </Box> ); } diff --git a/frontend/src/metabase/querying/filters/components/FilterPicker/TimeFilterPicker/TimeFilterPicker.tsx b/frontend/src/metabase/querying/filters/components/FilterPicker/TimeFilterPicker/TimeFilterPicker.tsx index 4aabd3e30a2..2a4450a978c 100644 --- a/frontend/src/metabase/querying/filters/components/FilterPicker/TimeFilterPicker/TimeFilterPicker.tsx +++ b/frontend/src/metabase/querying/filters/components/FilterPicker/TimeFilterPicker/TimeFilterPicker.tsx @@ -11,8 +11,8 @@ import * as Lib from "metabase-lib"; import { FilterOperatorPicker } from "../FilterOperatorPicker"; import { FilterPickerFooter } from "../FilterPickerFooter"; +import { FilterPickerForm } from "../FilterPickerForm"; import { FilterPickerHeader } from "../FilterPickerHeader"; -import { MAX_WIDTH, MIN_WIDTH } from "../constants"; import type { FilterPickerWidgetProps } from "../types"; export function TimeFilterPicker({ @@ -60,13 +60,7 @@ export function TimeFilterPicker({ }; return ( - <Box - component="form" - miw={MIN_WIDTH} - maw={MAX_WIDTH} - data-testid="time-filter-picker" - onSubmit={handleSubmit} - > + <FilterPickerForm data-testid="time-filter-picker" onSubmit={handleSubmit}> <FilterPickerHeader columnName={columnInfo.longDisplayName} onBack={onBack} @@ -89,7 +83,7 @@ export function TimeFilterPicker({ )} <FilterPickerFooter isNew={isNew} canSubmit /> </Box> - </Box> + </FilterPickerForm> ); } -- GitLab