@jbrowse/plugin-data-management 2.0.0 → 2.1.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 (140) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +23 -40
  2. package/dist/AddConnectionWidget/components/AddConnectionWidget.js.map +1 -1
  3. package/dist/AddConnectionWidget/components/ConfigureConnection.js +6 -6
  4. package/dist/AddConnectionWidget/components/ConfigureConnection.js.map +1 -1
  5. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +7 -9
  6. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js.map +1 -1
  7. package/dist/AddConnectionWidget/index.js +1 -1
  8. package/dist/AddConnectionWidget/index.js.map +1 -1
  9. package/dist/AddConnectionWidget/model.js +2 -2
  10. package/dist/AddConnectionWidget/model.js.map +1 -1
  11. package/dist/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
  12. package/dist/AddTrackWidget/components/AddTrackWidget.js +24 -220
  13. package/dist/AddTrackWidget/components/AddTrackWidget.js.map +1 -1
  14. package/dist/AddTrackWidget/components/ConfirmTrack.js +72 -99
  15. package/dist/AddTrackWidget/components/ConfirmTrack.js.map +1 -1
  16. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +7 -0
  17. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +162 -0
  18. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -0
  19. package/dist/AddTrackWidget/components/TrackSourceSelect.js +11 -12
  20. package/dist/AddTrackWidget/components/TrackSourceSelect.js.map +1 -1
  21. package/dist/AddTrackWidget/index.js +1 -1
  22. package/dist/AddTrackWidget/index.js.map +1 -1
  23. package/dist/AddTrackWidget/model.js +34 -30
  24. package/dist/AddTrackWidget/model.js.map +1 -1
  25. package/dist/AssemblyManager/AssemblyAddForm.js +42 -61
  26. package/dist/AssemblyManager/AssemblyAddForm.js.map +1 -1
  27. package/dist/AssemblyManager/AssemblyEditor.js +4 -5
  28. package/dist/AssemblyManager/AssemblyEditor.js.map +1 -1
  29. package/dist/AssemblyManager/AssemblyManager.js +24 -41
  30. package/dist/AssemblyManager/AssemblyManager.js.map +1 -1
  31. package/dist/AssemblyManager/AssemblyTable.js +17 -18
  32. package/dist/AssemblyManager/AssemblyTable.js.map +1 -1
  33. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js +9 -29
  34. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js.map +1 -1
  35. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js +7 -8
  36. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js.map +1 -1
  37. package/dist/HierarchicalTrackSelectorWidget/components/Header.d.ts +10 -0
  38. package/dist/HierarchicalTrackSelectorWidget/components/Header.js +177 -0
  39. package/dist/HierarchicalTrackSelectorWidget/components/Header.js.map +1 -0
  40. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +79 -365
  41. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  42. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +17 -18
  43. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +1 -1
  44. package/dist/HierarchicalTrackSelectorWidget/components/Node.d.ts +29 -0
  45. package/dist/HierarchicalTrackSelectorWidget/components/Node.js +173 -0
  46. package/dist/HierarchicalTrackSelectorWidget/components/Node.js.map +1 -0
  47. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +19 -20
  48. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +1 -1
  49. package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  50. package/dist/HierarchicalTrackSelectorWidget/components/util.js +9 -0
  51. package/dist/HierarchicalTrackSelectorWidget/components/util.js.map +1 -0
  52. package/dist/HierarchicalTrackSelectorWidget/configSchema.d.ts +2 -0
  53. package/dist/HierarchicalTrackSelectorWidget/configSchema.js +6 -0
  54. package/dist/HierarchicalTrackSelectorWidget/configSchema.js.map +1 -0
  55. package/dist/HierarchicalTrackSelectorWidget/index.d.ts +4 -2
  56. package/dist/HierarchicalTrackSelectorWidget/index.js +4 -4
  57. package/dist/HierarchicalTrackSelectorWidget/index.js.map +1 -1
  58. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +10 -2
  59. package/dist/HierarchicalTrackSelectorWidget/model.js +102 -153
  60. package/dist/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  61. package/dist/PluginStoreWidget/components/CustomPluginForm.js +25 -43
  62. package/dist/PluginStoreWidget/components/CustomPluginForm.js.map +1 -1
  63. package/dist/PluginStoreWidget/components/InstalledPlugin.js +29 -47
  64. package/dist/PluginStoreWidget/components/InstalledPlugin.js.map +1 -1
  65. package/dist/PluginStoreWidget/components/InstalledPluginsList.js +12 -15
  66. package/dist/PluginStoreWidget/components/InstalledPluginsList.js.map +1 -1
  67. package/dist/PluginStoreWidget/components/PluginCard.js +23 -40
  68. package/dist/PluginStoreWidget/components/PluginCard.js.map +1 -1
  69. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +49 -117
  70. package/dist/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  71. package/dist/PluginStoreWidget/index.js +1 -1
  72. package/dist/PluginStoreWidget/index.js.map +1 -1
  73. package/dist/PluginStoreWidget/model.js +6 -6
  74. package/dist/PluginStoreWidget/model.js.map +1 -1
  75. package/dist/SetDefaultSession/SetDefaultSession.js +9 -10
  76. package/dist/SetDefaultSession/SetDefaultSession.js.map +1 -1
  77. package/dist/index.d.ts +4 -1
  78. package/dist/index.js +38 -60
  79. package/dist/index.js.map +1 -1
  80. package/dist/ucsc-trackhub/configSchema.js +2 -2
  81. package/dist/ucsc-trackhub/configSchema.js.map +1 -1
  82. package/dist/ucsc-trackhub/model.js +33 -97
  83. package/dist/ucsc-trackhub/model.js.map +1 -1
  84. package/dist/ucsc-trackhub/ucscAssemblies.js +197 -1
  85. package/dist/ucsc-trackhub/ucscAssemblies.js.map +1 -1
  86. package/dist/ucsc-trackhub/ucscTrackHub.js +43 -132
  87. package/dist/ucsc-trackhub/ucscTrackHub.js.map +1 -1
  88. package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
  89. package/esm/AddTrackWidget/components/AddTrackWidget.js +22 -135
  90. package/esm/AddTrackWidget/components/AddTrackWidget.js.map +1 -1
  91. package/esm/AddTrackWidget/components/ConfirmTrack.js +5 -6
  92. package/esm/AddTrackWidget/components/ConfirmTrack.js.map +1 -1
  93. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +7 -0
  94. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +134 -0
  95. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -0
  96. package/esm/HierarchicalTrackSelectorWidget/components/Header.d.ts +10 -0
  97. package/esm/HierarchicalTrackSelectorWidget/components/Header.js +149 -0
  98. package/esm/HierarchicalTrackSelectorWidget/components/Header.js.map +1 -0
  99. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +24 -223
  100. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  101. package/esm/HierarchicalTrackSelectorWidget/components/Node.d.ts +29 -0
  102. package/esm/HierarchicalTrackSelectorWidget/components/Node.js +144 -0
  103. package/esm/HierarchicalTrackSelectorWidget/components/Node.js.map +1 -0
  104. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  105. package/esm/HierarchicalTrackSelectorWidget/components/util.js +5 -0
  106. package/esm/HierarchicalTrackSelectorWidget/components/util.js.map +1 -0
  107. package/esm/HierarchicalTrackSelectorWidget/configSchema.d.ts +2 -0
  108. package/esm/HierarchicalTrackSelectorWidget/configSchema.js +4 -0
  109. package/esm/HierarchicalTrackSelectorWidget/configSchema.js.map +1 -0
  110. package/esm/HierarchicalTrackSelectorWidget/index.d.ts +4 -2
  111. package/esm/HierarchicalTrackSelectorWidget/index.js +3 -3
  112. package/esm/HierarchicalTrackSelectorWidget/index.js.map +1 -1
  113. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +10 -2
  114. package/esm/HierarchicalTrackSelectorWidget/model.js +36 -32
  115. package/esm/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  116. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +1 -2
  117. package/esm/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  118. package/esm/index.d.ts +4 -1
  119. package/esm/index.js +1 -1
  120. package/esm/index.js.map +1 -1
  121. package/package.json +4 -5
  122. package/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.js.snap +7 -7
  123. package/src/AddTrackWidget/components/{AddTrackWidget.test.js → AddTrackWidget.test.tsx} +17 -32
  124. package/src/AddTrackWidget/components/AddTrackWidget.tsx +36 -200
  125. package/src/AddTrackWidget/components/ConfirmTrack.tsx +10 -10
  126. package/src/AddTrackWidget/components/DefaultAddTrackWorkflow.tsx +205 -0
  127. package/src/HierarchicalTrackSelectorWidget/components/Header.tsx +287 -0
  128. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +5 -4
  129. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.tsx +19 -438
  130. package/src/HierarchicalTrackSelectorWidget/components/Node.tsx +282 -0
  131. package/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.js.snap +24 -48
  132. package/src/HierarchicalTrackSelectorWidget/components/util.ts +11 -0
  133. package/src/HierarchicalTrackSelectorWidget/configSchema.ts +3 -0
  134. package/src/HierarchicalTrackSelectorWidget/index.ts +4 -6
  135. package/src/HierarchicalTrackSelectorWidget/model.ts +45 -41
  136. package/src/PluginStoreWidget/components/PluginStoreWidget.test.js +16 -4
  137. package/src/PluginStoreWidget/components/PluginStoreWidget.tsx +1 -2
  138. package/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.js.snap +111 -123
  139. package/src/index.ts +4 -1
  140. package/src/AddTrackWidget/components/__snapshots__/AddTrackWidget.test.js.snap +0 -331
@@ -14,7 +14,7 @@ exports[`<AddConnectionWidget /> renders 1`] = `
14
14
  class="MuiStepLabel-root MuiStepLabel-vertical css-14sza3e-MuiStepLabel-root"
15
15
  >
16
16
  <span
17
- class="MuiStepLabel-iconContainer css-vnkopk-MuiStepLabel-iconContainer"
17
+ class="MuiStepLabel-iconContainer Mui-active css-vnkopk-MuiStepLabel-iconContainer"
18
18
  >
19
19
  <svg
20
20
  aria-hidden="true"
@@ -68,7 +68,7 @@ exports[`<AddConnectionWidget /> renders 1`] = `
68
68
  class="MuiFormControl-root MuiFormControl-fullWidth MuiTextField-root css-wb57ya-MuiFormControl-root-MuiTextField-root"
69
69
  >
70
70
  <label
71
- class="MuiInputLabel-root MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-shrink MuiInputLabel-outlined MuiFormLabel-root MuiFormLabel-colorPrimary MuiFormLabel-filled css-1sumxir-MuiFormLabel-root-MuiInputLabel-root"
71
+ class="MuiFormLabel-root MuiInputLabel-root MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-shrink MuiInputLabel-outlined MuiFormLabel-colorPrimary MuiFormLabel-filled css-1sumxir-MuiFormLabel-root-MuiInputLabel-root"
72
72
  data-shrink="true"
73
73
  for="mui-1"
74
74
  id="mui-1-label"
@@ -76,7 +76,7 @@ exports[`<AddConnectionWidget /> renders 1`] = `
76
76
  connectionType
77
77
  </label>
78
78
  <div
79
- class="MuiOutlinedInput-root MuiInputBase-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
79
+ class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-fullWidth MuiInputBase-formControl css-md26zr-MuiInputBase-root-MuiOutlinedInput-root"
80
80
  variant="outlined"
81
81
  >
82
82
  <div
@@ -84,7 +84,7 @@ exports[`<AddConnectionWidget /> renders 1`] = `
84
84
  aria-expanded="false"
85
85
  aria-haspopup="listbox"
86
86
  aria-labelledby="mui-1-label mui-1"
87
- class="MuiSelect-select MuiSelect-outlined MuiOutlinedInput-input MuiInputBase-input css-11u53oe-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input"
87
+ class="MuiSelect-select MuiSelect-outlined MuiInputBase-input MuiOutlinedInput-input css-11u53oe-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input"
88
88
  id="mui-1"
89
89
  role="button"
90
90
  tabindex="0"
@@ -155,7 +155,7 @@ exports[`<AddConnectionWidget /> renders 1`] = `
155
155
  class="tss-1spe31o-actionsContainer"
156
156
  >
157
157
  <button
158
- class="MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButtonBase-root Mui-disabled tss-11xjtta-button css-1e6y48t-MuiButtonBase-root-MuiButton-root"
158
+ class="MuiButtonBase-root Mui-disabled MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium tss-11xjtta-button css-1e6y48t-MuiButtonBase-root-MuiButton-root"
159
159
  disabled=""
160
160
  tabindex="-1"
161
161
  type="button"
@@ -163,7 +163,7 @@ exports[`<AddConnectionWidget /> renders 1`] = `
163
163
  Back
164
164
  </button>
165
165
  <button
166
- class="MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButtonBase-root tss-11xjtta-button css-sghohy-MuiButtonBase-root-MuiButton-root"
166
+ class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeMedium MuiButton-containedSizeMedium tss-11xjtta-button css-sghohy-MuiButtonBase-root-MuiButton-root"
167
167
  data-testid="addConnectionNext"
168
168
  tabindex="0"
169
169
  type="button"
@@ -193,7 +193,7 @@ exports[`<AddConnectionWidget /> renders 1`] = `
193
193
  class="MuiStepLabel-root MuiStepLabel-vertical Mui-disabled css-14sza3e-MuiStepLabel-root"
194
194
  >
195
195
  <span
196
- class="MuiStepLabel-iconContainer css-vnkopk-MuiStepLabel-iconContainer"
196
+ class="MuiStepLabel-iconContainer Mui-disabled css-vnkopk-MuiStepLabel-iconContainer"
197
197
  >
198
198
  <svg
199
199
  aria-hidden="true"
@@ -1,15 +1,19 @@
1
1
  import React from 'react'
2
- import { render, cleanup, fireEvent } from '@testing-library/react'
2
+ import { render, fireEvent } from '@testing-library/react'
3
3
  import { createTestSession } from '@jbrowse/web/src/rootModel'
4
4
  import AddTrackWidget from './AddTrackWidget'
5
+ import { AddTrackModel } from '../model'
6
+ import { AbstractSessionModel } from '@jbrowse/core/util'
5
7
  jest.mock('@jbrowse/web/src/makeWorkerInstance', () => () => {})
6
8
 
7
9
  describe('<AddTrackWidget />', () => {
8
- let session
9
- let model
10
+ let session: AbstractSessionModel
11
+ let model: AddTrackModel
10
12
 
11
13
  beforeAll(() => {
14
+ // @ts-ignore
12
15
  session = createTestSession()
16
+ // @ts-ignore
13
17
  session.addAssemblyConf({
14
18
  name: 'volMyt1',
15
19
  sequence: {
@@ -29,6 +33,7 @@ describe('<AddTrackWidget />', () => {
29
33
  },
30
34
  },
31
35
  })
36
+ // @ts-ignore
32
37
  session.addTrackConf({
33
38
  trackId: 'i3jUPmrgMOS',
34
39
  type: 'FeatureTrack',
@@ -77,6 +82,8 @@ describe('<AddTrackWidget />', () => {
77
82
  },
78
83
  filterAttributes: ['type', 'start', 'end'],
79
84
  })
85
+
86
+ // @ts-ignore
80
87
  const view = session.addView('LinearGenomeView', {
81
88
  displayedRegions: [
82
89
  {
@@ -87,22 +94,18 @@ describe('<AddTrackWidget />', () => {
87
94
  },
88
95
  ],
89
96
  })
97
+
98
+ // @ts-ignore
90
99
  model = session.addWidget('AddTrackWidget', 'addTrackWidget', {
91
100
  view: view.id,
92
101
  })
93
102
  })
94
103
 
95
- afterEach(cleanup)
96
-
97
- it('renders', () => {
98
- const { container } = render(<AddTrackWidget model={model} />)
99
- expect(container.firstChild).toMatchSnapshot()
100
- })
101
-
102
104
  it('adds a track', async () => {
103
105
  const { getByTestId, getAllByTestId, findByText, findAllByText } = render(
104
106
  <AddTrackWidget model={model} />,
105
107
  )
108
+ // @ts-ignore
106
109
  expect(session.sessionTracks.length).toBe(1)
107
110
  fireEvent.change(getAllByTestId('urlInput')[0], {
108
111
  target: { value: 'test.txt' },
@@ -114,31 +117,13 @@ describe('<AddTrackWidget />', () => {
114
117
  fireEvent.change(getByTestId('trackNameInput'), {
115
118
  target: { value: 'Test track name' },
116
119
  })
117
- const trackTypeSelect = getByTestId('trackTypeSelect')
118
- fireEvent.mouseDown(trackTypeSelect)
119
- const featureTrack = await findByText('FeatureTrack')
120
- fireEvent.click(featureTrack)
121
- const assemblyNameSelect = getByTestId('assemblyNameSelect')
122
- fireEvent.mouseDown(assemblyNameSelect)
120
+ fireEvent.mouseDown(getByTestId('trackTypeSelect'))
121
+ fireEvent.click(await findByText('FeatureTrack'))
122
+ fireEvent.mouseDown(getByTestId('assemblyNameSelect'))
123
123
  const volMyt1 = await findAllByText('volMyt1')
124
124
  fireEvent.click(volMyt1[1])
125
125
  fireEvent.click(getAllByTestId('addTrackNextButton')[0])
126
- expect(session.sessionTracks.length).toBe(2)
127
- })
128
-
129
- xit('fails to add a track', async () => {
130
- const { getByTestId, getAllByTestId, findByText } = render(
131
- <AddTrackWidget model={model} />,
132
- )
133
- expect(session.sessionTracks.length).toBe(2)
134
- fireEvent.change(getAllByTestId('urlInput')[0], {
135
- target: { value: 'test.txt' },
136
- })
137
- fireEvent.click(getAllByTestId('addTrackNextButton')[0])
138
- fireEvent.mouseDown(getByTestId('adapterTypeSelect'))
139
- const chrom = await findByText('ChromSizesAdapter')
140
- fireEvent.click(chrom)
141
- fireEvent.click(getAllByTestId('addTrackNextButton')[0])
126
+ // @ts-ignore
142
127
  expect(session.sessionTracks.length).toBe(2)
143
128
  })
144
129
  })
@@ -1,209 +1,45 @@
1
- import React, { useState } from 'react'
2
- import {
3
- Alert,
4
- Button,
5
- Step,
6
- StepContent,
7
- StepLabel,
8
- Stepper,
9
- Typography,
10
- } from '@mui/material'
11
- import { makeStyles } from 'tss-react/mui'
12
- import {
13
- getSession,
14
- isElectron,
15
- supportedIndexingAdapters,
16
- } from '@jbrowse/core/util'
17
- import { getConf } from '@jbrowse/core/configuration'
1
+ import React from 'react'
18
2
  import { observer } from 'mobx-react'
3
+ import { FormControl, FormHelperText, Select, MenuItem } from '@mui/material'
4
+ import { AddTrackWorkflowType } from '@jbrowse/core/pluggableElementTypes'
5
+ import { useLocalStorage } from '@jbrowse/core/util'
19
6
  import { getEnv } from 'mobx-state-tree'
20
7
 
21
8
  // locals
22
- import ConfirmTrack from './ConfirmTrack'
23
- import TrackSourceSelect from './TrackSourceSelect'
24
9
  import { AddTrackModel } from '../model'
25
-
26
- const useStyles = makeStyles()(theme => ({
27
- root: {
28
- marginTop: theme.spacing(1),
29
- },
30
- stepper: {
31
- backgroundColor: theme.palette.background.default,
32
- },
33
- button: {
34
- marginTop: theme.spacing(1),
35
- marginRight: theme.spacing(1),
36
- },
37
- actionsContainer: {
38
- marginBottom: theme.spacing(2),
39
- },
40
- stepContent: {
41
- margin: theme.spacing(1),
42
- },
43
- alertContainer: {
44
- padding: `${theme.spacing(2)}px 0px ${theme.spacing(2)}px 0px`,
45
- },
46
- }))
47
-
48
- const steps = ['Enter track data', 'Confirm track type']
49
-
50
- function AddTrackWidget({ model }: { model: AddTrackModel }) {
51
- const [activeStep, setActiveStep] = useState(0)
52
- const { classes } = useStyles()
53
- const session = getSession(model)
54
- const { pluginManager } = getEnv(session)
55
- const { rootModel } = pluginManager
56
- const { jobsManager } = rootModel
57
- const {
58
- assembly,
59
- trackAdapter,
60
- trackData,
61
- trackName,
62
- trackType,
63
- textIndexTrack,
64
- textIndexingConf,
65
- } = model
66
- const [trackErrorMessage, setTrackErrorMessage] = useState<string>()
67
-
68
- function getStepContent(step: number) {
69
- switch (step) {
70
- case 0:
71
- return <TrackSourceSelect model={model} />
72
- case 1:
73
- return <ConfirmTrack model={model} />
74
- default:
75
- return <Typography>Unknown step</Typography>
76
- }
77
- }
78
-
79
- async function handleNext() {
80
- if (activeStep !== steps.length - 1) {
81
- setActiveStep(activeStep + 1)
82
- return
83
- }
84
-
85
- const trackId = `${trackName
86
- .toLowerCase()
87
- .replace(/ /g, '_')}-${Date.now()}${
88
- session.adminMode ? '' : '-sessionTrack'
89
- }`
90
-
91
- const assemblyInstance = session.assemblyManager.get(assembly)
92
-
93
- if (trackAdapter && trackAdapter.type !== 'UNKNOWN') {
94
- // @ts-ignore
95
- session.addTrackConf({
96
- trackId,
97
- type: trackType,
98
- name: trackName,
99
- assemblyNames: [assembly],
100
- adapter: {
101
- ...trackAdapter,
102
- sequenceAdapter: getConf(assemblyInstance, ['sequence', 'adapter']),
103
- },
104
- })
105
- const textSearchingDefault = {
106
- attributes: ['Name', 'ID'],
107
- exclude: ['CDS', 'exon'],
108
- }
109
- if (model.view) {
110
- model.view.showTrack(trackId)
111
- if (isElectron) {
112
- if (textIndexTrack && supportedIndexingAdapters(trackAdapter.type)) {
113
- const attr = textIndexingConf || textSearchingDefault
114
- const indexName = trackName + '-index'
115
- const indexingParams = {
116
- ...attr,
117
- assemblies: [assembly],
118
- tracks: [trackId],
119
- indexType: 'perTrack',
120
- name: indexName,
121
- timestamp: new Date().toISOString(),
122
- }
123
- const newEntry = {
124
- indexingParams: indexingParams,
125
- name: indexName,
126
- cancelCallback: () => {
127
- jobsManager.abortJob()
128
- },
129
- }
130
- jobsManager.queueJob(newEntry)
131
- }
132
- }
133
- } else {
134
- session.notify(
135
- 'Open a new view, or use the track selector in an existing view, to view this track',
136
- 'info',
137
- )
138
- }
139
- model.clearData()
140
- // @ts-ignore
141
- session.hideWidget(model)
142
- } else {
143
- setTrackErrorMessage(
144
- 'Failed to add track.\nThe configuration of this file is not currently supported.',
145
- )
146
- }
147
- }
148
-
149
- function handleBack() {
150
- setTrackErrorMessage(undefined)
151
- setActiveStep(activeStep - 1)
152
- }
153
-
154
- function isNextDisabled() {
155
- switch (activeStep) {
156
- case 0:
157
- return !trackData
158
- case 1:
159
- return !(trackName && trackType && trackAdapter?.type && assembly)
160
- default:
161
- return true
162
- }
163
- }
164
-
10
+ import DefaultAddTrackWorkflow from './DefaultAddTrackWorkflow'
11
+
12
+ function AddTrackSelector({ model }: { model: AddTrackModel }) {
13
+ const [val, setVal] = useLocalStorage('trackSelector-choice', 'Default')
14
+ const { pluginManager } = getEnv(model)
15
+ const widgets = pluginManager.getElementTypesInGroup(
16
+ 'add track workflow',
17
+ ) as AddTrackWorkflowType[]
18
+ const ComponentMap = {
19
+ Default: DefaultAddTrackWorkflow,
20
+ ...Object.fromEntries(widgets.map(w => [w.name, w.ReactComponent])),
21
+ } as { [key: string]: React.FC<{ model: AddTrackModel }> }
22
+
23
+ // make sure the selected value is in the list
24
+ const val2 = ComponentMap[val] ? val : 'Default'
25
+ const Component = ComponentMap[val2]
165
26
  return (
166
- <div className={classes.root}>
167
- <Stepper
168
- className={classes.stepper}
169
- activeStep={activeStep}
170
- orientation="vertical"
171
- >
172
- {steps.map((label, idx) => (
173
- <Step key={label}>
174
- <StepLabel>{label}</StepLabel>
175
- <StepContent>
176
- {getStepContent(idx)}
177
- <div className={classes.actionsContainer}>
178
- <Button
179
- disabled={activeStep === 0}
180
- onClick={handleBack}
181
- className={classes.button}
182
- >
183
- Back
184
- </Button>
185
- <Button
186
- disabled={isNextDisabled()}
187
- variant="contained"
188
- color="primary"
189
- onClick={handleNext}
190
- className={classes.button}
191
- data-testid="addTrackNextButton"
192
- >
193
- {activeStep === steps.length - 1 ? 'Add' : 'Next'}
194
- </Button>
195
- </div>
196
- {trackErrorMessage ? (
197
- <div className={classes.alertContainer}>
198
- <Alert severity="error">{trackErrorMessage}</Alert>
199
- </div>
200
- ) : null}
201
- </StepContent>
202
- </Step>
203
- ))}
204
- </Stepper>
205
- </div>
27
+ <>
28
+ <FormControl>
29
+ <Select value={val2} onChange={event => setVal(event.target.value)}>
30
+ {Object.keys(ComponentMap).map(e => (
31
+ <MenuItem key={e} value={e}>
32
+ {e}
33
+ </MenuItem>
34
+ ))}
35
+ </Select>
36
+ <FormHelperText>Type of add track workflow</FormHelperText>
37
+ </FormControl>
38
+
39
+ <br />
40
+ <Component model={model} />
41
+ </>
206
42
  )
207
43
  }
208
44
 
209
- export default observer(AddTrackWidget)
45
+ export default observer(AddTrackSelector)
@@ -230,10 +230,9 @@ const TextIndexingConfig = observer(({ model }: { model: AddTrackModel }) => {
230
230
 
231
231
  const TrackAdapterSelector = observer(({ model }: { model: AddTrackModel }) => {
232
232
  const { classes } = useStyles()
233
- const session = getSession(model)
234
233
  const { trackAdapter } = model
235
- // prettier-ignore
236
- const adapters = getAdapterTypes(getEnv(session).pluginManager)
234
+ const { pluginManager } = getEnv(model)
235
+ const adapters = getAdapterTypes(pluginManager)
237
236
  return (
238
237
  <TextField
239
238
  className={classes.spacing}
@@ -242,9 +241,7 @@ const TrackAdapterSelector = observer(({ model }: { model: AddTrackModel }) => {
242
241
  helperText="Select an adapter type"
243
242
  select
244
243
  fullWidth
245
- onChange={event => {
246
- model.setAdapterHint(event.target.value)
247
- }}
244
+ onChange={event => model.setAdapterHint(event.target.value)}
248
245
  SelectProps={{
249
246
  // @ts-ignore
250
247
  SelectDisplayProps: { 'data-testid': 'adapterTypeSelect' },
@@ -264,10 +261,13 @@ const TrackAdapterSelector = observer(({ model }: { model: AddTrackModel }) => {
264
261
  : elt.name}
265
262
  </MenuItem>
266
263
  ))}
267
- {/* adapters with the 'adapterMetadata.category' property are categorized by the value of the property here */}
268
- {categorizeAdapters(
269
- adapters.filter(elt => !elt.adapterMetadata?.hiddenFromGUI),
270
- )}
264
+ {
265
+ // adapters with the 'adapterMetadata.category' property are categorized
266
+ // by the value of the property here
267
+ categorizeAdapters(
268
+ adapters.filter(elt => !elt.adapterMetadata?.hiddenFromGUI),
269
+ )
270
+ }
271
271
  </TextField>
272
272
  )
273
273
  })
@@ -0,0 +1,205 @@
1
+ import React, { useState } from 'react'
2
+ import {
3
+ Alert,
4
+ Button,
5
+ Step,
6
+ StepContent,
7
+ StepLabel,
8
+ Stepper,
9
+ Typography,
10
+ } from '@mui/material'
11
+ import { makeStyles } from 'tss-react/mui'
12
+
13
+ import {
14
+ getSession,
15
+ isElectron,
16
+ supportedIndexingAdapters,
17
+ } from '@jbrowse/core/util'
18
+ import { getConf } from '@jbrowse/core/configuration'
19
+ import { observer } from 'mobx-react'
20
+ import { getEnv } from 'mobx-state-tree'
21
+
22
+ // locals
23
+ import ConfirmTrack from './ConfirmTrack'
24
+ import TrackSourceSelect from './TrackSourceSelect'
25
+
26
+ import { AddTrackModel } from '../model'
27
+
28
+ const useStyles = makeStyles()(theme => ({
29
+ root: {
30
+ marginTop: theme.spacing(1),
31
+ },
32
+ stepper: {
33
+ backgroundColor: theme.palette.background.default,
34
+ },
35
+ button: {
36
+ marginTop: theme.spacing(1),
37
+ marginRight: theme.spacing(1),
38
+ },
39
+ actionsContainer: {
40
+ marginBottom: theme.spacing(2),
41
+ },
42
+ stepContent: {
43
+ margin: theme.spacing(1),
44
+ },
45
+ alertContainer: {
46
+ padding: `${theme.spacing(2)}px 0px ${theme.spacing(2)}px 0px`,
47
+ },
48
+ }))
49
+
50
+ const steps = ['Enter track data', 'Confirm track type']
51
+
52
+ function AddTrackWorkflow({ model }: { model: AddTrackModel }) {
53
+ const [activeStep, setActiveStep] = useState(0)
54
+ const { classes } = useStyles()
55
+ const { pluginManager } = getEnv(model)
56
+ const { rootModel } = pluginManager
57
+ const { jobsManager } = rootModel
58
+ const session = getSession(model)
59
+ const {
60
+ assembly,
61
+ trackAdapter,
62
+ trackData,
63
+ trackName,
64
+ trackType,
65
+ textIndexTrack,
66
+ textIndexingConf,
67
+ } = model
68
+ const [trackErrorMessage, setTrackErrorMessage] = useState<string>()
69
+
70
+ function getStepContent(step: number) {
71
+ switch (step) {
72
+ case 0:
73
+ return <TrackSourceSelect model={model} />
74
+ case 1:
75
+ return <ConfirmTrack model={model} />
76
+ default:
77
+ return <Typography>Unknown step</Typography>
78
+ }
79
+ }
80
+
81
+ async function handleNext() {
82
+ if (activeStep !== steps.length - 1) {
83
+ setActiveStep(activeStep + 1)
84
+ return
85
+ }
86
+
87
+ const trackId = [
88
+ `${trackName.toLowerCase().replace(/ /g, '_')}-${Date.now()}`,
89
+ `${session.adminMode ? '' : '-sessionTrack'}`,
90
+ ].join('')
91
+
92
+ const assemblyInstance = session.assemblyManager.get(assembly)
93
+
94
+ if (trackAdapter && trackAdapter.type !== 'UNKNOWN') {
95
+ session.addTrackConf({
96
+ trackId,
97
+ type: trackType,
98
+ name: trackName,
99
+ assemblyNames: [assembly],
100
+ adapter: {
101
+ ...trackAdapter,
102
+ sequenceAdapter: getConf(assemblyInstance, ['sequence', 'adapter']),
103
+ },
104
+ })
105
+ if (model.view) {
106
+ model.view.showTrack(trackId)
107
+ if (
108
+ isElectron &&
109
+ textIndexTrack &&
110
+ supportedIndexingAdapters(trackAdapter.type)
111
+ ) {
112
+ const attr = textIndexingConf || {
113
+ attributes: ['Name', 'ID'],
114
+ exclude: ['CDS', 'exon'],
115
+ }
116
+ const indexName = trackName + '-index'
117
+ const newEntry = {
118
+ indexingParams: {
119
+ ...attr,
120
+ assemblies: [assembly],
121
+ tracks: [trackId],
122
+ indexType: 'perTrack',
123
+ name: indexName,
124
+ timestamp: new Date().toISOString(),
125
+ },
126
+ name: indexName,
127
+ cancelCallback: () => jobsManager.abortJob(),
128
+ }
129
+ jobsManager.queueJob(newEntry)
130
+ }
131
+ } else {
132
+ session.notify(
133
+ 'Open a new view, or use the track selector in an existing view, to view this track',
134
+ 'info',
135
+ )
136
+ }
137
+ model.clearData()
138
+ session.hideWidget(model)
139
+ } else {
140
+ setTrackErrorMessage(
141
+ 'Failed to add track.\nThe configuration of this file is not currently supported.',
142
+ )
143
+ }
144
+ }
145
+
146
+ function handleBack() {
147
+ setTrackErrorMessage(undefined)
148
+ setActiveStep(activeStep - 1)
149
+ }
150
+
151
+ function isNextDisabled() {
152
+ switch (activeStep) {
153
+ case 0:
154
+ return !trackData
155
+ case 1:
156
+ return !(trackName && trackType && trackAdapter?.type && assembly)
157
+ default:
158
+ return true
159
+ }
160
+ }
161
+
162
+ return (
163
+ <div className={classes.root}>
164
+ <Stepper
165
+ className={classes.stepper}
166
+ activeStep={activeStep}
167
+ orientation="vertical"
168
+ >
169
+ {steps.map((label, idx) => (
170
+ <Step key={label}>
171
+ <StepLabel>{label}</StepLabel>
172
+ <StepContent>
173
+ {getStepContent(idx)}
174
+ <div className={classes.actionsContainer}>
175
+ <Button
176
+ disabled={activeStep === 0}
177
+ onClick={handleBack}
178
+ className={classes.button}
179
+ >
180
+ Back
181
+ </Button>
182
+ <Button
183
+ disabled={isNextDisabled()}
184
+ variant="contained"
185
+ color="primary"
186
+ onClick={handleNext}
187
+ className={classes.button}
188
+ data-testid="addTrackNextButton"
189
+ >
190
+ {activeStep === steps.length - 1 ? 'Add' : 'Next'}
191
+ </Button>
192
+ </div>
193
+ {trackErrorMessage ? (
194
+ <div className={classes.alertContainer}>
195
+ <Alert severity="error">{trackErrorMessage}</Alert>
196
+ </div>
197
+ ) : null}
198
+ </StepContent>
199
+ </Step>
200
+ ))}
201
+ </Stepper>
202
+ </div>
203
+ )
204
+ }
205
+ export default observer(AddTrackWorkflow)