@@ -8,6 +8,7 @@ import TextField from "@material-ui/core/TextField"
88import SearchIcon from "@material-ui/icons/Search"
99import { FormikErrors , useFormik } from "formik"
1010import { useState } from "react"
11+ import { getValidationErrorMessage } from "../../api/errors"
1112import { getFormHelpers , onChangeTrimmed } from "../../util/formUtils"
1213import { CloseDropdown , OpenDropdown } from "../DropdownArrows/DropdownArrows"
1314import { Stack } from "../Stack/Stack"
@@ -20,6 +21,7 @@ export interface SearchBarWithFilterProps {
2021 filter ?: string
2122 onFilter : ( query : string ) => void
2223 presetFilters ?: PresetFilter [ ]
24+ error ?: unknown
2325}
2426
2527export interface PresetFilter {
@@ -37,6 +39,7 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
3739 filter,
3840 onFilter,
3941 presetFilters,
42+ error,
4043} ) => {
4144 const styles = useStyles ( )
4245
@@ -68,69 +71,76 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
6871 handleClose ( )
6972 }
7073
74+ const errorMessage = getValidationErrorMessage ( error )
75+
7176 return (
72- < Stack direction = "row" spacing = { 0 } className = { styles . filterContainer } >
73- { presetFilters && presetFilters . length > 0 && (
74- < Button
75- aria-controls = "filter-menu"
76- aria-haspopup = "true"
77- onClick = { handleClick }
78- className = { styles . buttonRoot }
79- >
80- { Language . filterName } { anchorEl ? < CloseDropdown /> : < OpenDropdown /> }
81- </ Button >
82- ) }
83-
84- < form onSubmit = { form . handleSubmit } className = { styles . filterForm } >
85- < TextField
86- { ...getFieldHelpers ( "query" ) }
87- className = { styles . textFieldRoot }
88- onChange = { onChangeTrimmed ( form ) }
89- fullWidth
90- variant = "outlined"
91- InputProps = { {
92- startAdornment : (
93- < InputAdornment position = "start" >
94- < SearchIcon fontSize = "small" />
95- </ InputAdornment >
96- ) ,
97- } }
98- />
99- </ form >
100-
101- { presetFilters && presetFilters . length > 0 && (
102- < Menu
103- id = "filter-menu"
104- anchorEl = { anchorEl }
105- keepMounted
106- open = { Boolean ( anchorEl ) }
107- onClose = { handleClose }
108- TransitionComponent = { Fade }
109- anchorOrigin = { {
110- vertical : "bottom" ,
111- horizontal : "left" ,
112- } }
113- transformOrigin = { {
114- vertical : "top" ,
115- horizontal : "left" ,
116- } }
117- >
118- { presetFilters . map ( ( presetFilter ) => (
119- < MenuItem key = { presetFilter . name } onClick = { setPresetFilter ( presetFilter . query ) } >
120- { presetFilter . name }
121- </ MenuItem >
122- ) ) }
123- </ Menu >
124- ) }
77+ < Stack spacing = { 1 } className = { styles . root } >
78+ < Stack direction = "row" spacing = { 0 } className = { styles . filterContainer } >
79+ { presetFilters && presetFilters . length > 0 && (
80+ < Button
81+ aria-controls = "filter-menu"
82+ aria-haspopup = "true"
83+ onClick = { handleClick }
84+ className = { styles . buttonRoot }
85+ >
86+ { Language . filterName } { anchorEl ? < CloseDropdown /> : < OpenDropdown /> }
87+ </ Button >
88+ ) }
89+
90+ < form onSubmit = { form . handleSubmit } className = { styles . filterForm } >
91+ < TextField
92+ { ...getFieldHelpers ( "query" ) }
93+ className = { styles . textFieldRoot }
94+ onChange = { onChangeTrimmed ( form ) }
95+ fullWidth
96+ variant = "outlined"
97+ InputProps = { {
98+ startAdornment : (
99+ < InputAdornment position = "start" >
100+ < SearchIcon fontSize = "small" />
101+ </ InputAdornment >
102+ ) ,
103+ } }
104+ />
105+ </ form >
106+
107+ { presetFilters && presetFilters . length > 0 && (
108+ < Menu
109+ id = "filter-menu"
110+ anchorEl = { anchorEl }
111+ keepMounted
112+ open = { Boolean ( anchorEl ) }
113+ onClose = { handleClose }
114+ TransitionComponent = { Fade }
115+ anchorOrigin = { {
116+ vertical : "bottom" ,
117+ horizontal : "left" ,
118+ } }
119+ transformOrigin = { {
120+ vertical : "top" ,
121+ horizontal : "left" ,
122+ } }
123+ >
124+ { presetFilters . map ( ( presetFilter ) => (
125+ < MenuItem key = { presetFilter . name } onClick = { setPresetFilter ( presetFilter . query ) } >
126+ { presetFilter . name }
127+ </ MenuItem >
128+ ) ) }
129+ </ Menu >
130+ ) }
131+ </ Stack >
132+ { errorMessage && < Stack className = { styles . errorRoot } > { errorMessage } </ Stack > }
125133 </ Stack >
126134 )
127135}
128136
129137const useStyles = makeStyles ( ( theme ) => ( {
138+ root : {
139+ marginBottom : theme . spacing ( 2 ) ,
140+ } ,
130141 filterContainer : {
131142 border : `1px solid ${ theme . palette . divider } ` ,
132143 borderRadius : theme . shape . borderRadius ,
133- marginBottom : theme . spacing ( 2 ) ,
134144 } ,
135145 filterForm : {
136146 width : "100%" ,
@@ -146,4 +156,7 @@ const useStyles = makeStyles((theme) => ({
146156 border : "none" ,
147157 } ,
148158 } ,
159+ errorRoot : {
160+ color : theme . palette . error . dark ,
161+ } ,
149162} ) )
0 commit comments