From bba8c75d31bc75267eca5fcf42735ceca61b960d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20=C5=BBegle=C5=84?= Date: Mon, 12 Jul 2021 15:48:01 +0200 Subject: [PATCH] Improve component composition (#1224) * Improve component composition * Delete unused file * Update snapshots --- .../Filter/FilterContent/FilterContent.tsx | 4 +- .../FilterContent/FilterContentBody.tsx | 178 +++--------------- ...BodyNameField.tsx => FilterGroupLabel.tsx} | 8 +- .../Filter/FilterContent/FilterRangeField.tsx | 87 +++++++++ .../Filter/FilterContent/FilterTextField.tsx | 57 ++++++ src/components/Filter/FilterContent/styles.ts | 36 ++++ src/components/Filter/FilterContent/utils.ts | 2 + .../__snapshots__/Stories.test.ts.snap | 80 ++++---- 8 files changed, 249 insertions(+), 203 deletions(-) rename src/components/Filter/FilterContent/{FilterContentBodyNameField.tsx => FilterGroupLabel.tsx} (84%) create mode 100644 src/components/Filter/FilterContent/FilterRangeField.tsx create mode 100644 src/components/Filter/FilterContent/FilterTextField.tsx create mode 100644 src/components/Filter/FilterContent/styles.ts diff --git a/src/components/Filter/FilterContent/FilterContent.tsx b/src/components/Filter/FilterContent/FilterContent.tsx index 7398d4c3f..6d63feff0 100644 --- a/src/components/Filter/FilterContent/FilterContent.tsx +++ b/src/components/Filter/FilterContent/FilterContent.tsx @@ -21,9 +21,9 @@ import { InvalidFilters } from "../types"; import FilterContentBody, { FilterContentBodyProps } from "./FilterContentBody"; -import FilterContentBodyNameField from "./FilterContentBodyNameField"; import FilterContentHeader from "./FilterContentHeader"; import FilterErrorsList from "./FilterErrorsList"; +import FilterGroupLabel from "./FilterGroupLabel"; const useExpanderStyles = makeStyles( () => ({ @@ -219,7 +219,7 @@ const FilterContent: React.FC = ({ classes={summaryClasses} onClick={() => handleFilterOpen(filter)} > - handleFilterPropertyGroupChange(action, filter) diff --git a/src/components/Filter/FilterContent/FilterContentBody.tsx b/src/components/Filter/FilterContent/FilterContentBody.tsx index 7e0bebde8..9ccb2af01 100644 --- a/src/components/Filter/FilterContent/FilterContentBody.tsx +++ b/src/components/Filter/FilterContent/FilterContentBody.tsx @@ -1,12 +1,10 @@ -import { FormControlLabel, Radio, TextField } from "@material-ui/core"; -import { fade } from "@material-ui/core/styles/colorManipulator"; +import { FormControlLabel, Radio } from "@material-ui/core"; import FormSpacer from "@saleor/components/FormSpacer"; import { MultiAutocompleteChoiceType } from "@saleor/components/MultiAutocompleteSelectField"; import SingleSelectField from "@saleor/components/SingleSelectField"; -import { makeStyles } from "@saleor/theme"; import classNames from "classnames"; import React from "react"; -import { FormattedMessage, useIntl } from "react-intl"; +import { useIntl } from "react-intl"; import Arrow from "../Arrow"; import FilterAutocompleteField, { @@ -15,45 +13,14 @@ import FilterAutocompleteField, { import FilterOptionField from "../FilterOptionField"; import { FilterReducerAction } from "../reducer"; import { FieldType, FilterType, IFilterElement } from "../types"; -import { getIsFilterMultipleChoices } from "./utils"; - -const useStyles = makeStyles( - theme => ({ - andLabel: { - margin: theme.spacing(0, 2) - }, - arrow: { - marginRight: theme.spacing(2) - }, - filterSettings: { - background: fade(theme.palette.primary.main, 0.1), - padding: theme.spacing(2, 3) - }, - input: { - padding: "12px 0 9px 12px" - }, - inputRange: { - alignItems: "center", - display: "flex" - }, - - option: { - left: -theme.spacing(0.5), - position: "relative" - }, - optionRadio: { - left: -theme.spacing(0.25) - } - }), - { name: "FilterContentBody" } -); - -const filterTestingContext = "filter-field"; +import FilterRangeField from "./FilterRangeField"; +import FilterTextField from "./FilterTextField"; +import useStyles from "./styles"; +import { filterTestingContext, getIsFilterMultipleChoices } from "./utils"; export interface FilterContentBodyProps { - children?: React.ReactNode; filter: IFilterElement; - currencySymbol?: string; + currencySymbol: string; initialAutocompleteDisplayValues: FilterAutocompleteDisplayValues; onFilterPropertyChange: React.Dispatch>; autocompleteDisplayValues: FilterAutocompleteDisplayValues; @@ -78,28 +45,10 @@ const FilterContentBody: React.FC = ({
{children} {filter.type === FieldType.text && ( - - onFilterPropertyChange({ - payload: { - name: filter.name, - update: { - value: [event.target.value, filter.value[1]] - } - }, - type: "set-property" - }) - } + )} {[FieldType.date, FieldType.price, FieldType.number].includes( @@ -112,7 +61,7 @@ const FilterContentBody: React.FC = ({ value={filter.multiple ? FilterType.MULTIPLE : FilterType.SINGULAR} InputProps={{ classes: { - input: classes.input + input: classes.fieldInput } }} onChange={event => @@ -133,101 +82,16 @@ const FilterContentBody: React.FC = ({
{filter.multiple ? ( - <> - - onFilterPropertyChange({ - payload: { - name: filter.name, - update: { - value: [event.target.value, filter.value[1]] - } - }, - type: "set-property" - }) - } - /> - - - - - onFilterPropertyChange({ - payload: { - name: filter.name, - update: { - value: [filter.value[0], event.target.value] - } - }, - type: "set-property" - }) - } - /> - + ) : ( - - onFilterPropertyChange({ - payload: { - name: filter.name, - update: { - value: [event.target.value, filter.value[1]] - } - }, - type: "set-property" - }) - } + )} diff --git a/src/components/Filter/FilterContent/FilterContentBodyNameField.tsx b/src/components/Filter/FilterContent/FilterGroupLabel.tsx similarity index 84% rename from src/components/Filter/FilterContent/FilterContentBodyNameField.tsx rename to src/components/Filter/FilterContent/FilterGroupLabel.tsx index 47bef0950..e8332947f 100644 --- a/src/components/Filter/FilterContent/FilterContentBodyNameField.tsx +++ b/src/components/Filter/FilterContent/FilterGroupLabel.tsx @@ -14,15 +14,15 @@ const useStyles = makeStyles( padding: theme.spacing(1, 2.5) } }), - { name: "FilterContentBodyNameField" } + { name: "FilterGroupLabel" } ); -export interface FilterContentBodyNameFieldProps { +export interface FilterGroupLabelProps { filter: IFilterElement; onFilterPropertyChange: React.Dispatch>; } -const FilterContentBodyNameField: React.FC = ({ +const FilterGroupLabel: React.FC = ({ filter, onFilterPropertyChange }) => { @@ -60,4 +60,4 @@ const FilterContentBodyNameField: React.FC = ({ ); }; -export default FilterContentBodyNameField; +export default FilterGroupLabel; diff --git a/src/components/Filter/FilterContent/FilterRangeField.tsx b/src/components/Filter/FilterContent/FilterRangeField.tsx new file mode 100644 index 000000000..a70887d03 --- /dev/null +++ b/src/components/Filter/FilterContent/FilterRangeField.tsx @@ -0,0 +1,87 @@ +import { TextField } from "@material-ui/core"; +import React from "react"; +import { FormattedMessage } from "react-intl"; + +import { FilterReducerAction } from "../reducer"; +import { FieldType, IFilterElement } from "../types"; +import useStyles from "./styles"; +import { filterTestingContext } from "./utils"; + +export interface FilterRangeFieldProps { + currencySymbol: string; + filter: IFilterElement; + onFilterPropertyChange: React.Dispatch>; +} + +const FilterRangeField: React.FC = ({ + currencySymbol, + filter, + onFilterPropertyChange +}) => { + const classes = useStyles(); + + return ( + <> + + onFilterPropertyChange({ + payload: { + name: filter.name, + update: { + value: [event.target.value, filter.value[1]] + } + }, + type: "set-property" + }) + } + /> + + + + + onFilterPropertyChange({ + payload: { + name: filter.name, + update: { + value: [filter.value[0], event.target.value] + } + }, + type: "set-property" + }) + } + /> + + ); +}; +FilterRangeField.displayName = "FilterRangeField"; +export default FilterRangeField; diff --git a/src/components/Filter/FilterContent/FilterTextField.tsx b/src/components/Filter/FilterContent/FilterTextField.tsx new file mode 100644 index 000000000..f52959e0e --- /dev/null +++ b/src/components/Filter/FilterContent/FilterTextField.tsx @@ -0,0 +1,57 @@ +import { TextField } from "@material-ui/core"; +import React from "react"; + +import { FilterReducerAction } from "../reducer"; +import { FieldType, IFilterElement } from "../types"; +import useStyles from "./styles"; +import { filterTestingContext } from "./utils"; + +export interface FilterTextFieldProps { + currencySymbol: string | null; + filter: IFilterElement; + onFilterPropertyChange: React.Dispatch>; +} + +const FilterTextField: React.FC = ({ + currencySymbol, + filter, + onFilterPropertyChange +}) => { + const classes = useStyles(); + + return ( + + onFilterPropertyChange({ + payload: { + name: filter.name, + update: { + value: [event.target.value, filter.value[1]] + } + }, + type: "set-property" + }) + } + /> + ); +}; + +FilterTextField.displayName = "FilterTextField"; +export default FilterTextField; diff --git a/src/components/Filter/FilterContent/styles.ts b/src/components/Filter/FilterContent/styles.ts new file mode 100644 index 000000000..d79662d6f --- /dev/null +++ b/src/components/Filter/FilterContent/styles.ts @@ -0,0 +1,36 @@ +import { fade } from "@material-ui/core"; +import { makeStyles } from "@saleor/theme"; + +const useStyles = makeStyles( + theme => ({ + andLabel: { + margin: theme.spacing(0, 2) + }, + arrow: { + marginRight: theme.spacing(2) + }, + filterSettings: { + background: fade(theme.palette.primary.main, 0.1), + padding: theme.spacing(2, 3) + }, + inputRange: { + alignItems: "center", + display: "flex" + }, + + option: { + left: -theme.spacing(0.5), + position: "relative" + }, + optionRadio: { + left: -theme.spacing(0.25) + }, + + fieldInput: { + padding: "12px 0 9px 12px" + } + }), + { name: "Filter" } +); + +export default useStyles; diff --git a/src/components/Filter/FilterContent/utils.ts b/src/components/Filter/FilterContent/utils.ts index 961e30a81..1fc1a741f 100644 --- a/src/components/Filter/FilterContent/utils.ts +++ b/src/components/Filter/FilterContent/utils.ts @@ -3,6 +3,8 @@ import { IntlShape } from "react-intl"; import { FilterType } from "../types"; +export const filterTestingContext = "filter-field"; + export function getIsFilterMultipleChoices( intl: IntlShape ): SingleAutocompleteChoiceType[] { diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap index 8360c4fdd..b5f092dbf 100644 --- a/src/storybook/__snapshots__/Stories.test.ts.snap +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -5808,7 +5808,7 @@ exports[`Storyshots Generics / Filter default 1`] = ` class="MuiExpansionPanelSummary-content-id FilterContentExpanderSummary-content-id" >