@jbrowse/plugin-data-management 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/AssemblyManager/AssemblyAddForm.js +14 -41
  2. package/dist/AssemblyManager/AssemblyAddForm.js.map +1 -1
  3. package/dist/AssemblyManager/AssemblyEditor.js +2 -1
  4. package/dist/AssemblyManager/AssemblyEditor.js.map +1 -1
  5. package/dist/AssemblyManager/AssemblyManager.js +14 -54
  6. package/dist/AssemblyManager/AssemblyManager.js.map +1 -1
  7. package/dist/AssemblyManager/AssemblyTable.js +24 -47
  8. package/dist/AssemblyManager/AssemblyTable.js.map +1 -1
  9. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +4 -12
  10. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +1 -1
  11. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +2 -12
  12. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +1 -1
  13. package/dist/HierarchicalTrackSelectorWidget/model.js +1 -1
  14. package/dist/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  15. package/dist/PluginStoreWidget/components/CustomPluginForm.js +1 -11
  16. package/dist/PluginStoreWidget/components/CustomPluginForm.js.map +1 -1
  17. package/dist/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  18. package/esm/AssemblyManager/AssemblyAddForm.js +9 -36
  19. package/esm/AssemblyManager/AssemblyAddForm.js.map +1 -1
  20. package/esm/AssemblyManager/AssemblyEditor.js +2 -1
  21. package/esm/AssemblyManager/AssemblyEditor.js.map +1 -1
  22. package/esm/AssemblyManager/AssemblyManager.js +15 -55
  23. package/esm/AssemblyManager/AssemblyManager.js.map +1 -1
  24. package/esm/AssemblyManager/AssemblyTable.js +25 -48
  25. package/esm/AssemblyManager/AssemblyTable.js.map +1 -1
  26. package/esm/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +5 -13
  27. package/esm/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +1 -1
  28. package/esm/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +3 -13
  29. package/esm/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +1 -1
  30. package/esm/HierarchicalTrackSelectorWidget/model.js +2 -2
  31. package/esm/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  32. package/esm/PluginStoreWidget/components/CustomPluginForm.js +2 -12
  33. package/esm/PluginStoreWidget/components/CustomPluginForm.js.map +1 -1
  34. package/esm/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  35. package/package.json +3 -3
  36. package/src/AssemblyManager/AssemblyAddForm.tsx +147 -182
  37. package/src/AssemblyManager/AssemblyEditor.tsx +5 -1
  38. package/src/AssemblyManager/AssemblyManager.test.tsx +1 -1
  39. package/src/AssemblyManager/AssemblyManager.tsx +70 -137
  40. package/src/AssemblyManager/AssemblyTable.tsx +65 -97
  41. package/src/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.tsx +5 -20
  42. package/src/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.tsx +7 -21
  43. package/src/HierarchicalTrackSelectorWidget/model.ts +7 -2
  44. package/src/PluginStoreWidget/components/CustomPluginForm.tsx +1 -18
  45. package/src/PluginStoreWidget/components/PluginStoreWidget.tsx +1 -0
@@ -1,63 +1,38 @@
1
1
  import React, { useState } from 'react'
2
2
  import { observer } from 'mobx-react'
3
- import FileSelector from '@jbrowse/core/ui/FileSelector'
4
- import { FileLocation } from '@jbrowse/core/util/types'
5
3
  import { Button, Grid, MenuItem, Paper, TextField } from '@mui/material'
6
- import { makeStyles } from 'tss-react/mui'
7
- import AddIcon from '@mui/icons-material/Add'
4
+ import { FileSelector } from '@jbrowse/core/ui'
5
+ import { FileLocation } from '@jbrowse/core/util/types'
8
6
 
9
- const useStyles = makeStyles()(theme => ({
10
- root: {
11
- flexGrow: 1,
12
- overflow: 'hidden',
13
- padding: theme.spacing(0, 3),
14
- },
15
- paper: {
16
- margin: `${theme.spacing(1)}px auto`,
17
- padding: theme.spacing(2),
18
- },
19
- createButton: {
20
- marginTop: '1em',
21
- justifyContent: 'center',
22
- },
23
- paperContent: {
24
- flex: 'auto',
25
- margin: `${theme.spacing(1)}px auto`,
26
- padding: theme.spacing(1),
27
- overflow: 'auto',
28
- },
29
- }))
7
+ // icons
8
+ import AddIcon from '@mui/icons-material/Add'
30
9
 
31
- const AdapterSelector = observer(
32
- ({
33
- adapterSelection,
34
- setAdapterSelection,
35
- adapterTypes,
36
- }: {
37
- adapterSelection: string
38
- setAdapterSelection: Function
39
- adapterTypes: string[]
40
- }) => {
41
- return (
42
- <TextField
43
- value={adapterSelection}
44
- label="Type"
45
- select
46
- helperText="Type of adapter to use"
47
- fullWidth
48
- onChange={event => {
49
- setAdapterSelection(event.target.value)
50
- }}
51
- >
52
- {adapterTypes.map(str => (
53
- <MenuItem key={str} value={str}>
54
- {str}
55
- </MenuItem>
56
- ))}
57
- </TextField>
58
- )
59
- },
60
- )
10
+ const AdapterSelector = observer(function ({
11
+ adapterSelection,
12
+ setAdapterSelection,
13
+ adapterTypes,
14
+ }: {
15
+ adapterSelection: string
16
+ setAdapterSelection: Function
17
+ adapterTypes: string[]
18
+ }) {
19
+ return (
20
+ <TextField
21
+ value={adapterSelection}
22
+ label="Type"
23
+ select
24
+ helperText="Type of adapter to use"
25
+ fullWidth
26
+ onChange={event => setAdapterSelection(event.target.value)}
27
+ >
28
+ {adapterTypes.map(str => (
29
+ <MenuItem key={str} value={str}>
30
+ {str}
31
+ </MenuItem>
32
+ ))}
33
+ </TextField>
34
+ )
35
+ })
61
36
 
62
37
  const AdapterInput = observer(
63
38
  ({
@@ -145,141 +120,131 @@ const AdapterInput = observer(
145
120
 
146
121
  const blank = { uri: '' } as FileLocation
147
122
 
148
- const AssemblyAddForm = observer(
149
- ({
150
- rootModel,
151
- setFormOpen,
152
- }: {
153
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
154
- rootModel: any
155
- setFormOpen: Function
156
- }) => {
157
- const { classes } = useStyles()
158
-
159
- const adapterTypes = [
160
- 'IndexedFastaAdapter',
161
- 'BgzipFastaAdapter',
162
- 'TwoBitAdapter',
163
- ]
123
+ const AssemblyAddForm = observer(function ({
124
+ rootModel,
125
+ setFormOpen,
126
+ }: {
127
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
+ rootModel: any
129
+ setFormOpen: Function
130
+ }) {
131
+ const adapterTypes = [
132
+ 'IndexedFastaAdapter',
133
+ 'BgzipFastaAdapter',
134
+ 'TwoBitAdapter',
135
+ ]
164
136
 
165
- const [assemblyName, setAssemblyName] = useState('')
166
- const [assemblyDisplayName, setAssemblyDisplayName] = useState('')
167
- const [adapterSelection, setAdapterSelection] = useState(adapterTypes[0])
168
- const [fastaLocation, setFastaLocation] = useState(blank)
169
- const [faiLocation, setFaiLocation] = useState(blank)
170
- const [gziLocation, setGziLocation] = useState(blank)
171
- const [twoBitLocation, setTwoBitLocation] = useState(blank)
172
- const [chromSizesLocation, setChromSizesLocation] = useState(blank)
137
+ const [assemblyName, setAssemblyName] = useState('')
138
+ const [assemblyDisplayName, setAssemblyDisplayName] = useState('')
139
+ const [adapterSelection, setAdapterSelection] = useState(adapterTypes[0])
140
+ const [fastaLocation, setFastaLocation] = useState(blank)
141
+ const [faiLocation, setFaiLocation] = useState(blank)
142
+ const [gziLocation, setGziLocation] = useState(blank)
143
+ const [twoBitLocation, setTwoBitLocation] = useState(blank)
144
+ const [chromSizesLocation, setChromSizesLocation] = useState(blank)
173
145
 
174
- function createAssembly() {
175
- if (assemblyName === '') {
176
- rootModel.session.notify("Can't create an assembly without a name")
177
- } else {
178
- setFormOpen(false)
179
- let newAssembly
180
- if (adapterSelection === 'IndexedFastaAdapter') {
181
- newAssembly = {
182
- name: assemblyName,
183
- displayName: assemblyDisplayName,
184
- sequence: {
185
- adapter: {
186
- type: 'IndexedFastaAdapter',
187
- fastaLocation,
188
- faiLocation,
189
- },
146
+ function createAssembly() {
147
+ if (assemblyName === '') {
148
+ rootModel.session.notify("Can't create an assembly without a name")
149
+ } else {
150
+ setFormOpen(false)
151
+ let newAssembly
152
+ if (adapterSelection === 'IndexedFastaAdapter') {
153
+ newAssembly = {
154
+ name: assemblyName,
155
+ displayName: assemblyDisplayName,
156
+ sequence: {
157
+ adapter: {
158
+ type: 'IndexedFastaAdapter',
159
+ fastaLocation,
160
+ faiLocation,
190
161
  },
191
- }
192
- } else if (adapterSelection === 'BgzipFastaAdapter') {
193
- newAssembly = {
194
- name: assemblyName,
195
- displayName: assemblyDisplayName,
196
- sequence: {
197
- adapter: {
198
- type: 'BgzipFastaAdapter',
199
- fastaLocation,
200
- faiLocation,
201
- gziLocation,
202
- },
162
+ },
163
+ }
164
+ } else if (adapterSelection === 'BgzipFastaAdapter') {
165
+ newAssembly = {
166
+ name: assemblyName,
167
+ displayName: assemblyDisplayName,
168
+ sequence: {
169
+ adapter: {
170
+ type: 'BgzipFastaAdapter',
171
+ fastaLocation,
172
+ faiLocation,
173
+ gziLocation,
203
174
  },
204
- }
205
- } else if (adapterSelection === 'TwoBitAdapter') {
206
- newAssembly = {
207
- name: assemblyName,
208
- displayName: assemblyDisplayName,
209
- sequence: {
210
- adapter: {
211
- type: 'TwoBitAdapter',
212
- twoBitLocation,
213
- chromSizesLocation,
214
- },
175
+ },
176
+ }
177
+ } else if (adapterSelection === 'TwoBitAdapter') {
178
+ newAssembly = {
179
+ name: assemblyName,
180
+ displayName: assemblyDisplayName,
181
+ sequence: {
182
+ adapter: {
183
+ type: 'TwoBitAdapter',
184
+ twoBitLocation,
185
+ chromSizesLocation,
215
186
  },
216
- }
187
+ },
217
188
  }
218
- rootModel.jbrowse.addAssemblyConf(newAssembly)
219
- rootModel.session.notify(
220
- `Successfully added ${assemblyName} assembly to JBrowse 2`,
221
- 'success',
222
- )
223
189
  }
190
+ rootModel.jbrowse.addAssemblyConf(newAssembly)
191
+ rootModel.session.notify(
192
+ `Successfully added ${assemblyName} assembly to JBrowse 2`,
193
+ 'success',
194
+ )
224
195
  }
196
+ }
225
197
 
226
- return (
227
- <div className={classes.root}>
228
- <Paper className={classes.paper}>
229
- <TextField
230
- id="assembly-name"
231
- inputProps={{ 'data-testid': 'assembly-name' }}
232
- label="Assembly name"
233
- helperText="The assembly name e.g. hg38"
234
- variant="outlined"
235
- value={assemblyName}
236
- onChange={event => setAssemblyName(event.target.value)}
237
- />
238
- <TextField
239
- id="assembly-name"
240
- inputProps={{ 'data-testid': 'assembly-display-name' }}
241
- label="Assembly display name"
242
- helperText='A human readable display name for the assembly e.g. "Homo sapiens (hg38)"'
243
- variant="outlined"
244
- value={assemblyDisplayName}
245
- onChange={event => setAssemblyDisplayName(event.target.value)}
246
- />
247
- <AdapterSelector
248
- adapterSelection={adapterSelection}
249
- setAdapterSelection={setAdapterSelection}
250
- adapterTypes={adapterTypes}
251
- />
252
- <div className={classes.paperContent}>
253
- <AdapterInput
254
- adapterSelection={adapterSelection}
255
- fastaLocation={fastaLocation}
256
- setFastaLocation={setFastaLocation}
257
- faiLocation={faiLocation}
258
- setFaiLocation={setFaiLocation}
259
- gziLocation={gziLocation}
260
- setGziLocation={setGziLocation}
261
- twoBitLocation={twoBitLocation}
262
- setTwoBitLocation={setTwoBitLocation}
263
- chromSizesLocation={chromSizesLocation}
264
- setChromSizesLocation={setChromSizesLocation}
265
- />
266
- </div>
267
- </Paper>
268
- <Grid container className={classes.createButton}>
269
- <Grid item>
270
- <Button
271
- variant="contained"
272
- color="secondary"
273
- startIcon={<AddIcon />}
274
- onClick={createAssembly}
275
- >
276
- Create new assembly
277
- </Button>
278
- </Grid>
279
- </Grid>
280
- </div>
281
- )
282
- },
283
- )
198
+ return (
199
+ <div>
200
+ <Paper>
201
+ <TextField
202
+ id="assembly-name"
203
+ inputProps={{ 'data-testid': 'assembly-name' }}
204
+ label="Assembly name"
205
+ helperText="The assembly name e.g. hg38"
206
+ variant="outlined"
207
+ value={assemblyName}
208
+ onChange={event => setAssemblyName(event.target.value)}
209
+ />
210
+ <TextField
211
+ id="assembly-name"
212
+ inputProps={{ 'data-testid': 'assembly-display-name' }}
213
+ label="Assembly display name"
214
+ helperText='A human readable display name for the assembly e.g. "Homo sapiens (hg38)"'
215
+ variant="outlined"
216
+ value={assemblyDisplayName}
217
+ onChange={event => setAssemblyDisplayName(event.target.value)}
218
+ />
219
+ <AdapterSelector
220
+ adapterSelection={adapterSelection}
221
+ setAdapterSelection={setAdapterSelection}
222
+ adapterTypes={adapterTypes}
223
+ />
224
+ <AdapterInput
225
+ adapterSelection={adapterSelection}
226
+ fastaLocation={fastaLocation}
227
+ setFastaLocation={setFastaLocation}
228
+ faiLocation={faiLocation}
229
+ setFaiLocation={setFaiLocation}
230
+ gziLocation={gziLocation}
231
+ setGziLocation={setGziLocation}
232
+ twoBitLocation={twoBitLocation}
233
+ setTwoBitLocation={setTwoBitLocation}
234
+ chromSizesLocation={chromSizesLocation}
235
+ setChromSizesLocation={setChromSizesLocation}
236
+ />
237
+ </Paper>
238
+ <Button
239
+ variant="contained"
240
+ color="secondary"
241
+ startIcon={<AddIcon />}
242
+ onClick={createAssembly}
243
+ >
244
+ Create new assembly
245
+ </Button>
246
+ </div>
247
+ )
248
+ })
284
249
 
285
250
  export default AssemblyAddForm
@@ -9,7 +9,11 @@ const AssemblyEditor = observer(
9
9
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
10
  assembly: any
11
11
  }) => {
12
- return <ConfigurationEditor model={{ target: assembly }} />
12
+ return (
13
+ <div style={{ maxHeight: 600, overflow: 'auto' }}>
14
+ <ConfigurationEditor model={{ target: assembly }} />
15
+ </div>
16
+ )
13
17
  },
14
18
  )
15
19
 
@@ -29,7 +29,7 @@ const mockRootModel = {
29
29
  }
30
30
 
31
31
  describe('AssemblyManager GUI', () => {
32
- it('renders succesfully', () => {
32
+ it('renders successfully', () => {
33
33
  const { getByText } = render(
34
34
  <AssemblyManager rootModel={mockRootModel} onClose={() => {}} />,
35
35
  )
@@ -1,151 +1,84 @@
1
1
  import React, { useState } from 'react'
2
2
  import { observer } from 'mobx-react'
3
- import { makeStyles } from 'tss-react/mui'
4
3
  import { AnyConfigurationModel } from '@jbrowse/core/configuration'
5
- import {
6
- Button,
7
- Dialog,
8
- DialogActions,
9
- DialogContent,
10
- DialogTitle,
11
- IconButton,
12
- } from '@mui/material'
13
- import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'
14
- import CloseIcon from '@mui/icons-material/Close'
4
+ import { Button, DialogActions, DialogContent } from '@mui/material'
5
+ import { Dialog } from '@jbrowse/core/ui'
6
+
7
+ // icons
15
8
  import AddIcon from '@mui/icons-material/Add'
16
9
 
10
+ // locals
17
11
  import AssemblyTable from './AssemblyTable'
18
12
  import AssemblyAddForm from './AssemblyAddForm'
19
13
  import AssemblyEditor from './AssemblyEditor'
20
14
 
21
- const useStyles = makeStyles()(theme => ({
22
- titleBox: {
23
- color: '#fff',
24
- backgroundColor: theme.palette.primary.main,
25
- textAlign: 'center',
26
- },
27
- dialogContent: {
28
- width: '100%',
29
- },
30
- backButton: {
31
- color: '#fff',
32
- position: 'absolute',
33
- left: theme.spacing(4),
34
- top: theme.spacing(4),
35
- },
36
- closeButton: {
37
- position: 'absolute',
38
- right: theme.spacing(1),
39
- top: theme.spacing(1),
40
- color: theme.palette.grey[500],
41
- },
42
- }))
43
-
44
- const AssemblyManager = observer(
45
- ({
46
- rootModel,
47
- onClose,
48
- }: {
49
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
- rootModel: any
51
- onClose: (arg: boolean) => void
52
- }) => {
53
- const { classes } = useStyles()
54
- const [isFormOpen, setFormOpen] = useState(false)
55
- const [isAssemblyBeingEdited, setIsAssemblyBeingEdited] = useState(false)
56
- const [assemblyBeingEdited, setAssemblyBeingEdited] =
57
- useState<AnyConfigurationModel>()
15
+ const AssemblyManager = observer(function ({
16
+ rootModel,
17
+ onClose,
18
+ }: {
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ rootModel: any
21
+ onClose: (arg: boolean) => void
22
+ }) {
23
+ const [isFormOpen, setFormOpen] = useState(false)
24
+ const [isAssemblyBeingEdited, setIsAssemblyBeingEdited] = useState(false)
25
+ const [assemblyBeingEdited, setAssemblyBeingEdited] =
26
+ useState<AnyConfigurationModel>()
58
27
 
59
- const showAssemblyTable = !isFormOpen && !isAssemblyBeingEdited
28
+ const showAssemblyTable = !isFormOpen && !isAssemblyBeingEdited
60
29
 
61
- return (
62
- <Dialog open onClose={() => onClose(false)}>
63
- <DialogTitle className={classes.titleBox}>
64
- {showAssemblyTable ? 'Assembly manager' : null}
65
- {isFormOpen ? (
66
- <>
67
- <IconButton
68
- aria-label="back"
69
- className={classes.backButton}
70
- onClick={() => setFormOpen(false)}
71
- >
72
- <ArrowBackIosIcon />
73
- </IconButton>
74
- Add new assembly
75
- </>
76
- ) : null}
77
- {isAssemblyBeingEdited ? (
78
- <>
79
- <IconButton
80
- aria-label="back"
81
- className={classes.backButton}
82
- onClick={() => setIsAssemblyBeingEdited(false)}
83
- >
84
- <ArrowBackIosIcon />
85
- </IconButton>
86
- {returnAssemblyName(assemblyBeingEdited)}
87
- </>
88
- ) : null}
89
- <IconButton
90
- aria-label="close"
91
- className={classes.closeButton}
92
- onClick={() => onClose(false)}
30
+ return (
31
+ <Dialog open onClose={() => onClose(false)} title="Assembly manager">
32
+ <DialogContent>
33
+ {showAssemblyTable ? (
34
+ <AssemblyTable
35
+ rootModel={rootModel}
36
+ setIsAssemblyBeingEdited={setIsAssemblyBeingEdited}
37
+ setAssemblyBeingEdited={setAssemblyBeingEdited}
38
+ />
39
+ ) : null}
40
+ {isAssemblyBeingEdited ? (
41
+ <AssemblyEditor assembly={assemblyBeingEdited} />
42
+ ) : null}
43
+ {isFormOpen ? (
44
+ <AssemblyAddForm rootModel={rootModel} setFormOpen={setFormOpen} />
45
+ ) : null}
46
+ </DialogContent>
47
+ <DialogActions>
48
+ {isFormOpen ? (
49
+ <Button variant="contained" onClick={() => setFormOpen(false)}>
50
+ Back
51
+ </Button>
52
+ ) : null}
53
+ {isAssemblyBeingEdited ? (
54
+ <Button
55
+ variant="contained"
56
+ onClick={() => setIsAssemblyBeingEdited(false)}
93
57
  >
94
- <CloseIcon />
95
- </IconButton>
96
- </DialogTitle>
97
- <DialogContent>
98
- <div className={classes.dialogContent}>
99
- {showAssemblyTable ? (
100
- <AssemblyTable
101
- rootModel={rootModel}
102
- setIsAssemblyBeingEdited={setIsAssemblyBeingEdited}
103
- setAssemblyBeingEdited={setAssemblyBeingEdited}
104
- />
105
- ) : null}
106
- {isAssemblyBeingEdited ? (
107
- <AssemblyEditor assembly={assemblyBeingEdited} />
108
- ) : null}
109
- {isFormOpen ? (
110
- <AssemblyAddForm
111
- rootModel={rootModel}
112
- setFormOpen={setFormOpen}
113
- />
114
- ) : null}
115
- </div>
116
- </DialogContent>
117
- <DialogActions>
118
- {showAssemblyTable ? (
119
- <>
120
- <Button
121
- color="secondary"
122
- variant="contained"
123
- onClick={() => onClose(false)}
124
- >
125
- Close
126
- </Button>
127
- <Button
128
- variant="contained"
129
- color="secondary"
130
- startIcon={<AddIcon />}
131
- onClick={() => setFormOpen(true)}
132
- >
133
- Add new assembly
134
- </Button>
135
- </>
136
- ) : null}
137
- </DialogActions>
138
- </Dialog>
139
- )
140
- },
141
- )
142
-
143
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
144
- function returnAssemblyName(assembly: any) {
145
- if (assembly !== undefined) {
146
- return assembly.name
147
- }
148
- return null
149
- }
58
+ Back
59
+ </Button>
60
+ ) : null}
61
+ {showAssemblyTable ? (
62
+ <>
63
+ <Button
64
+ color="secondary"
65
+ variant="contained"
66
+ onClick={() => onClose(false)}
67
+ >
68
+ Close
69
+ </Button>
70
+ <Button
71
+ variant="contained"
72
+ startIcon={<AddIcon />}
73
+ onClick={() => setFormOpen(true)}
74
+ >
75
+ Add new assembly
76
+ </Button>
77
+ </>
78
+ ) : null}
79
+ </DialogActions>
80
+ </Dialog>
81
+ )
82
+ })
150
83
 
151
84
  export default AssemblyManager