Skip to content

Commit 6499770

Browse files
authored
feat: adding active and hover states to search input (#2741)
* feat: adding active and hover states to search input * adding error state * cleaning up error state * adding input value
1 parent 8ad35c7 commit 6499770

File tree

1 file changed

+38
-31
lines changed

1 file changed

+38
-31
lines changed

site/src/components/SearchBarWithFilter/SearchBarWithFilter.tsx

+38-31
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import Fade from "@material-ui/core/Fade"
33
import InputAdornment from "@material-ui/core/InputAdornment"
44
import Menu from "@material-ui/core/Menu"
55
import MenuItem from "@material-ui/core/MenuItem"
6+
import OutlinedInput from "@material-ui/core/OutlinedInput"
67
import { makeStyles } from "@material-ui/core/styles"
7-
import TextField from "@material-ui/core/TextField"
8+
import { Theme } from "@material-ui/core/styles/createMuiTheme"
89
import SearchIcon from "@material-ui/icons/Search"
910
import { FormikErrors, useFormik } from "formik"
1011
import debounce from "just-debounce-it"
1112
import { useCallback, useEffect, useState } from "react"
1213
import { getValidationErrorMessage } from "../../api/errors"
13-
import { getFormHelpers } from "../../util/formUtils"
1414
import { CloseDropdown, OpenDropdown } from "../DropdownArrows/DropdownArrows"
1515
import { Stack } from "../Stack/Stack"
1616

@@ -42,7 +42,7 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
4242
presetFilters,
4343
error,
4444
}) => {
45-
const styles = useStyles()
45+
const styles = useStyles({ error })
4646

4747
const form = useFormik<FilterFormValues>({
4848
enableReinitialize: true,
@@ -71,8 +71,6 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
7171
return () => debouncedOnFilter.cancel()
7272
}, [debouncedOnFilter, form.values.query])
7373

74-
const getFieldHelpers = getFormHelpers<FilterFormValues>(form)
75-
7674
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)
7775

7876
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
@@ -93,7 +91,7 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
9391

9492
return (
9593
<Stack spacing={1} className={styles.root}>
96-
<Stack direction="row" spacing={0} className={styles.filterContainer}>
94+
<Stack direction="row" spacing={0}>
9795
{presetFilters && presetFilters.length > 0 && (
9896
<Button
9997
aria-controls="filter-menu"
@@ -106,19 +104,18 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
106104
)}
107105

108106
<form onSubmit={form.handleSubmit} className={styles.filterForm}>
109-
<TextField
110-
{...getFieldHelpers("query")}
111-
className={styles.textFieldRoot}
107+
<OutlinedInput
108+
id="query"
109+
name="query"
110+
value={form.values.query}
111+
error={!!error}
112+
className={styles.inputStyles}
112113
onChange={form.handleChange}
113-
fullWidth
114-
variant="outlined"
115-
InputProps={{
116-
startAdornment: (
117-
<InputAdornment position="start">
118-
<SearchIcon fontSize="small" />
119-
</InputAdornment>
120-
),
121-
}}
114+
startAdornment={
115+
<InputAdornment position="start">
116+
<SearchIcon fontSize="small" />
117+
</InputAdornment>
118+
}
122119
/>
123120
</form>
124121

@@ -152,29 +149,39 @@ export const SearchBarWithFilter: React.FC<SearchBarWithFilterProps> = ({
152149
)
153150
}
154151

155-
const useStyles = makeStyles((theme) => ({
152+
interface StyleProps {
153+
error?: unknown
154+
}
155+
156+
const useStyles = makeStyles<Theme, StyleProps>((theme) => ({
156157
root: {
157158
marginBottom: theme.spacing(2),
158159
},
159-
filterContainer: {
160-
border: `1px solid ${theme.palette.divider}`,
161-
borderRadius: theme.shape.borderRadius,
162-
},
160+
// necessary to expand the textField
161+
// the length of the page (within the bordered filterContainer)
163162
filterForm: {
164163
width: "100%",
165164
},
166165
buttonRoot: {
167-
border: "none",
168-
borderRight: `1px solid ${theme.palette.divider}`,
166+
border: `1px solid ${theme.palette.divider}`,
167+
borderRight: "0px",
169168
borderRadius: `${theme.shape.borderRadius}px 0px 0px ${theme.shape.borderRadius}px`,
170169
},
171-
textFieldRoot: {
172-
margin: "0px",
173-
"& fieldset": {
174-
border: "none",
175-
},
176-
},
177170
errorRoot: {
178171
color: theme.palette.error.dark,
179172
},
173+
inputStyles: {
174+
height: "100%",
175+
width: "100%",
176+
borderRadius: `0px ${theme.shape.borderRadius}px ${theme.shape.borderRadius}px 0px`,
177+
color: theme.palette.primary.contrastText,
178+
backgroundColor: theme.palette.background.paper,
179+
180+
"& fieldset": {
181+
borderColor: theme.palette.divider,
182+
"&MuiOutlinedInput-root:hover, &MuiOutlinedInput-notchedOutline": {
183+
borderColor: (props) => props.error && theme.palette.error.contrastText,
184+
},
185+
},
186+
},
180187
}))

0 commit comments

Comments
 (0)