@@ -8,6 +8,7 @@ import TextField from "@material-ui/core/TextField"
8
8
import SearchIcon from "@material-ui/icons/Search"
9
9
import { FormikErrors , useFormik } from "formik"
10
10
import { useState } from "react"
11
+ import { getValidationErrorMessage } from "../../api/errors"
11
12
import { getFormHelpers , onChangeTrimmed } from "../../util/formUtils"
12
13
import { CloseDropdown , OpenDropdown } from "../DropdownArrows/DropdownArrows"
13
14
import { Stack } from "../Stack/Stack"
@@ -20,6 +21,7 @@ export interface SearchBarWithFilterProps {
20
21
filter ?: string
21
22
onFilter : ( query : string ) => void
22
23
presetFilters ?: PresetFilter [ ]
24
+ error ?: unknown
23
25
}
24
26
25
27
export interface PresetFilter {
@@ -37,6 +39,7 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
37
39
filter,
38
40
onFilter,
39
41
presetFilters,
42
+ error,
40
43
} ) => {
41
44
const styles = useStyles ( )
42
45
@@ -68,69 +71,76 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
68
71
handleClose ( )
69
72
}
70
73
74
+ const errorMessage = getValidationErrorMessage ( error )
75
+
71
76
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 > }
125
133
</ Stack >
126
134
)
127
135
}
128
136
129
137
const useStyles = makeStyles ( ( theme ) => ( {
138
+ root : {
139
+ marginBottom : theme . spacing ( 2 ) ,
140
+ } ,
130
141
filterContainer : {
131
142
border : `1px solid ${ theme . palette . divider } ` ,
132
143
borderRadius : theme . shape . borderRadius ,
133
- marginBottom : theme . spacing ( 2 ) ,
134
144
} ,
135
145
filterForm : {
136
146
width : "100%" ,
@@ -146,4 +156,7 @@ const useStyles = makeStyles((theme) => ({
146
156
border : "none" ,
147
157
} ,
148
158
} ,
159
+ errorRoot : {
160
+ color : theme . palette . error . dark ,
161
+ } ,
149
162
} ) )
0 commit comments