1
1
import Button from "@material-ui/core/Button"
2
- import Fade from "@material-ui/core/Fade"
3
- import InputAdornment from "@material-ui/core/InputAdornment"
4
2
import Link from "@material-ui/core/Link"
5
- import Menu from "@material-ui/core/Menu"
6
- import MenuItem from "@material-ui/core/MenuItem"
7
3
import { fade , makeStyles , Theme } from "@material-ui/core/styles"
8
4
import Table from "@material-ui/core/Table"
9
5
import TableBody from "@material-ui/core/TableBody"
10
6
import TableCell from "@material-ui/core/TableCell"
11
7
import TableHead from "@material-ui/core/TableHead"
12
8
import TableRow from "@material-ui/core/TableRow"
13
- import TextField from "@material-ui/core/TextField"
14
9
import AddCircleOutline from "@material-ui/icons/AddCircleOutline"
15
10
import KeyboardArrowRight from "@material-ui/icons/KeyboardArrowRight"
16
11
import RefreshIcon from "@material-ui/icons/Refresh"
17
- import SearchIcon from "@material-ui/icons/Search"
18
12
import useTheme from "@material-ui/styles/useTheme"
19
13
import { useActor } from "@xstate/react"
20
14
import dayjs from "dayjs"
21
15
import relativeTime from "dayjs/plugin/relativeTime"
22
- import { FormikErrors , useFormik } from "formik"
23
- import { FC , useState } from "react"
16
+ import { FC } from "react"
24
17
import { Link as RouterLink , useNavigate } from "react-router-dom"
25
18
import { AvatarData } from "../../components/AvatarData/AvatarData"
26
- import { CloseDropdown , OpenDropdown } from "../../components/DropdownArrows/DropdownArrows"
27
19
import { EmptyState } from "../../components/EmptyState/EmptyState"
28
20
import { Margins } from "../../components/Margins/Margins"
29
21
import { PageHeader , PageHeaderSubtitle , PageHeaderTitle } from "../../components/PageHeader/PageHeader"
22
+ import { SearchBarWithFilter } from "../../components/SearchBarWithFilter/SearchBarWithFilter"
30
23
import { Stack } from "../../components/Stack/Stack"
31
24
import { TableCellLink } from "../../components/TableCellLink/TableCellLink"
32
25
import { TableLoader } from "../../components/TableLoader/TableLoader"
@@ -38,7 +31,6 @@ import {
38
31
HelpTooltipText ,
39
32
HelpTooltipTitle ,
40
33
} from "../../components/Tooltips/HelpTooltip/HelpTooltip"
41
- import { getFormHelpers , onChangeTrimmed } from "../../util/formUtils"
42
34
import { getDisplayStatus , workspaceFilterQuery } from "../../util/workspace"
43
35
import { WorkspaceItemMachineRef } from "../../xServices/workspaces/workspacesXService"
44
36
@@ -49,7 +41,6 @@ export const Language = {
49
41
emptyCreateWorkspaceMessage : "Create your first workspace" ,
50
42
emptyCreateWorkspaceDescription : "Start editing your source code and building your software" ,
51
43
emptyResultsMessage : "No results matched your search" ,
52
- filterName : "Filters" ,
53
44
yourWorkspacesButton : "Your workspaces" ,
54
45
allWorkspacesButton : "All workspaces" ,
55
46
workspaceTooltipTitle : "What is a workspace?" ,
@@ -154,12 +145,6 @@ const WorkspaceRow: React.FC<{ workspaceRef: WorkspaceItemMachineRef }> = ({ wor
154
145
)
155
146
}
156
147
157
- interface FilterFormValues {
158
- query : string
159
- }
160
-
161
- export type FilterFormErrors = FormikErrors < FilterFormValues >
162
-
163
148
export interface WorkspacesPageViewProps {
164
149
loading ?: boolean
165
150
workspaceRefs ?: WorkspaceItemMachineRef [ ]
@@ -168,41 +153,10 @@ export interface WorkspacesPageViewProps {
168
153
}
169
154
170
155
export const WorkspacesPageView : FC < WorkspacesPageViewProps > = ( { loading, workspaceRefs, filter, onFilter } ) => {
171
- const styles = useStyles ( )
172
-
173
- const form = useFormik < FilterFormValues > ( {
174
- enableReinitialize : true ,
175
- initialValues : {
176
- query : filter ?? "" ,
177
- } ,
178
- onSubmit : ( { query } ) => {
179
- onFilter ( query )
180
- } ,
181
- } )
182
-
183
- const getFieldHelpers = getFormHelpers < FilterFormValues > ( form )
184
-
185
- const [ anchorEl , setAnchorEl ] = useState < null | HTMLElement > ( null )
186
-
187
- const handleClick = ( event : React . MouseEvent < HTMLButtonElement > ) => {
188
- setAnchorEl ( event . currentTarget )
189
- }
190
-
191
- const handleClose = ( ) => {
192
- setAnchorEl ( null )
193
- }
194
-
195
- const setYourWorkspaces = ( ) => {
196
- void form . setFieldValue ( "query" , "owner:me" )
197
- void form . submitForm ( )
198
- handleClose ( )
199
- }
200
-
201
- const setAllWorkspaces = ( ) => {
202
- void form . setFieldValue ( "query" , "" )
203
- void form . submitForm ( )
204
- handleClose ( )
205
- }
156
+ const presetFilters = [
157
+ { query : workspaceFilterQuery . me , name : Language . yourWorkspacesButton } ,
158
+ { query : workspaceFilterQuery . all , name : Language . allWorkspacesButton } ,
159
+ ]
206
160
207
161
return (
208
162
< Margins >
@@ -223,48 +177,7 @@ export const WorkspacesPageView: FC<WorkspacesPageViewProps> = ({ loading, works
223
177
</ PageHeaderSubtitle >
224
178
</ PageHeader >
225
179
226
- < Stack direction = "row" spacing = { 0 } className = { styles . filterContainer } >
227
- < Button aria-controls = "filter-menu" aria-haspopup = "true" onClick = { handleClick } className = { styles . buttonRoot } >
228
- { Language . filterName } { anchorEl ? < CloseDropdown /> : < OpenDropdown /> }
229
- </ Button >
230
-
231
- < form onSubmit = { form . handleSubmit } className = { styles . filterForm } >
232
- < TextField
233
- { ...getFieldHelpers ( "query" ) }
234
- className = { styles . textFieldRoot }
235
- onChange = { onChangeTrimmed ( form ) }
236
- fullWidth
237
- variant = "outlined"
238
- InputProps = { {
239
- startAdornment : (
240
- < InputAdornment position = "start" >
241
- < SearchIcon fontSize = "small" />
242
- </ InputAdornment >
243
- ) ,
244
- } }
245
- />
246
- </ form >
247
-
248
- < Menu
249
- id = "filter-menu"
250
- anchorEl = { anchorEl }
251
- keepMounted
252
- open = { Boolean ( anchorEl ) }
253
- onClose = { handleClose }
254
- TransitionComponent = { Fade }
255
- anchorOrigin = { {
256
- vertical : "bottom" ,
257
- horizontal : "left" ,
258
- } }
259
- transformOrigin = { {
260
- vertical : "top" ,
261
- horizontal : "left" ,
262
- } }
263
- >
264
- < MenuItem onClick = { setYourWorkspaces } > { Language . yourWorkspacesButton } </ MenuItem >
265
- < MenuItem onClick = { setAllWorkspaces } > { Language . allWorkspacesButton } </ MenuItem >
266
- </ Menu >
267
- </ Stack >
180
+ < SearchBarWithFilter filter = { filter } onFilter = { onFilter } presetFilters = { presetFilters } />
268
181
269
182
< Table >
270
183
< TableHead >
@@ -328,25 +241,6 @@ const useStyles = makeStyles((theme) => ({
328
241
lineHeight : `${ theme . spacing ( 3 ) } px` ,
329
242
} ,
330
243
} ,
331
- filterContainer : {
332
- border : `1px solid ${ theme . palette . divider } ` ,
333
- borderRadius : theme . shape . borderRadius ,
334
- marginBottom : theme . spacing ( 2 ) ,
335
- } ,
336
- filterForm : {
337
- width : "100%" ,
338
- } ,
339
- buttonRoot : {
340
- border : "none" ,
341
- borderRight : `1px solid ${ theme . palette . divider } ` ,
342
- borderRadius : `${ theme . shape . borderRadius } px 0px 0px ${ theme . shape . borderRadius } px` ,
343
- } ,
344
- textFieldRoot : {
345
- margin : "0px" ,
346
- "& fieldset" : {
347
- border : "none" ,
348
- } ,
349
- } ,
350
244
clickableTableRow : {
351
245
"&:hover td" : {
352
246
backgroundColor : fade ( theme . palette . primary . light , 0.1 ) ,
0 commit comments