diff options
Diffstat (limited to 'subprojects/frontend/src/table/SymbolSelector.tsx')
-rw-r--r-- | subprojects/frontend/src/table/SymbolSelector.tsx | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/subprojects/frontend/src/table/SymbolSelector.tsx b/subprojects/frontend/src/table/SymbolSelector.tsx new file mode 100644 index 00000000..5272f8ed --- /dev/null +++ b/subprojects/frontend/src/table/SymbolSelector.tsx | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | |||
7 | import Autocomplete from '@mui/material/Autocomplete'; | ||
8 | import Box from '@mui/material/Box'; | ||
9 | import TextField from '@mui/material/TextField'; | ||
10 | import { observer } from 'mobx-react-lite'; | ||
11 | |||
12 | import type GraphStore from '../graph/GraphStore'; | ||
13 | import RelationName from '../graph/RelationName'; | ||
14 | |||
15 | function SymbolSelector({ graph }: { graph: GraphStore }): JSX.Element { | ||
16 | const { | ||
17 | selectedSymbol, | ||
18 | semantics: { relations }, | ||
19 | } = graph; | ||
20 | |||
21 | return ( | ||
22 | <Autocomplete | ||
23 | renderInput={(params) => ( | ||
24 | <TextField | ||
25 | {...{ | ||
26 | ...params, | ||
27 | InputLabelProps: { | ||
28 | ...params.InputLabelProps, | ||
29 | // Workaround for type errors. | ||
30 | className: params.InputLabelProps.className ?? '', | ||
31 | style: params.InputLabelProps.style ?? {}, | ||
32 | }, | ||
33 | }} | ||
34 | variant="standard" | ||
35 | size="medium" | ||
36 | placeholder="Symbol" | ||
37 | /> | ||
38 | )} | ||
39 | options={relations} | ||
40 | getOptionLabel={(option) => option.name} | ||
41 | renderOption={(props, option) => ( | ||
42 | <Box component="li" {...props}> | ||
43 | <RelationName metadata={option} /> | ||
44 | </Box> | ||
45 | )} | ||
46 | value={selectedSymbol ?? null} | ||
47 | isOptionEqualToValue={(option, value) => option.name === value.name} | ||
48 | onChange={(_event, value) => graph.setSelectedSymbol(value ?? undefined)} | ||
49 | sx={(theme) => ({ | ||
50 | flexBasis: 200, | ||
51 | maxWidth: 600, | ||
52 | flexGrow: 1, | ||
53 | flexShrink: 1, | ||
54 | '.MuiInput-underline::before': { | ||
55 | borderColor: | ||
56 | theme.palette.mode === 'dark' | ||
57 | ? theme.palette.divider | ||
58 | : theme.palette.outer.border, | ||
59 | }, | ||
60 | })} | ||
61 | /> | ||
62 | ); | ||
63 | } | ||
64 | |||
65 | export default observer(SymbolSelector); | ||