@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.
- package/dist/AddConnectionWidget/components/AddConnectionWidget.js +23 -40
- package/dist/AddConnectionWidget/components/AddConnectionWidget.js.map +1 -1
- package/dist/AddConnectionWidget/components/ConfigureConnection.js +6 -6
- package/dist/AddConnectionWidget/components/ConfigureConnection.js.map +1 -1
- package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +7 -9
- package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js.map +1 -1
- package/dist/AddConnectionWidget/index.js +1 -1
- package/dist/AddConnectionWidget/index.js.map +1 -1
- package/dist/AddConnectionWidget/model.js +2 -2
- package/dist/AddConnectionWidget/model.js.map +1 -1
- package/dist/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
- package/dist/AddTrackWidget/components/AddTrackWidget.js +24 -220
- package/dist/AddTrackWidget/components/AddTrackWidget.js.map +1 -1
- package/dist/AddTrackWidget/components/ConfirmTrack.js +72 -99
- package/dist/AddTrackWidget/components/ConfirmTrack.js.map +1 -1
- package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +7 -0
- package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +162 -0
- package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -0
- package/dist/AddTrackWidget/components/TrackSourceSelect.js +11 -12
- package/dist/AddTrackWidget/components/TrackSourceSelect.js.map +1 -1
- package/dist/AddTrackWidget/index.js +1 -1
- package/dist/AddTrackWidget/index.js.map +1 -1
- package/dist/AddTrackWidget/model.js +34 -30
- package/dist/AddTrackWidget/model.js.map +1 -1
- package/dist/AssemblyManager/AssemblyAddForm.js +42 -61
- package/dist/AssemblyManager/AssemblyAddForm.js.map +1 -1
- package/dist/AssemblyManager/AssemblyEditor.js +4 -5
- package/dist/AssemblyManager/AssemblyEditor.js.map +1 -1
- package/dist/AssemblyManager/AssemblyManager.js +24 -41
- package/dist/AssemblyManager/AssemblyManager.js.map +1 -1
- package/dist/AssemblyManager/AssemblyTable.js +17 -18
- package/dist/AssemblyManager/AssemblyTable.js.map +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js +9 -29
- package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js.map +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js +7 -8
- package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js.map +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/Header.d.ts +10 -0
- package/dist/HierarchicalTrackSelectorWidget/components/Header.js +177 -0
- package/dist/HierarchicalTrackSelectorWidget/components/Header.js.map +1 -0
- package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +79 -365
- package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +17 -18
- package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/Node.d.ts +29 -0
- package/dist/HierarchicalTrackSelectorWidget/components/Node.js +173 -0
- package/dist/HierarchicalTrackSelectorWidget/components/Node.js.map +1 -0
- package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +19 -20
- package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +1 -1
- package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
- package/dist/HierarchicalTrackSelectorWidget/components/util.js +9 -0
- package/dist/HierarchicalTrackSelectorWidget/components/util.js.map +1 -0
- package/dist/HierarchicalTrackSelectorWidget/configSchema.d.ts +2 -0
- package/dist/HierarchicalTrackSelectorWidget/configSchema.js +6 -0
- package/dist/HierarchicalTrackSelectorWidget/configSchema.js.map +1 -0
- package/dist/HierarchicalTrackSelectorWidget/index.d.ts +4 -2
- package/dist/HierarchicalTrackSelectorWidget/index.js +4 -4
- package/dist/HierarchicalTrackSelectorWidget/index.js.map +1 -1
- package/dist/HierarchicalTrackSelectorWidget/model.d.ts +10 -2
- package/dist/HierarchicalTrackSelectorWidget/model.js +102 -153
- package/dist/HierarchicalTrackSelectorWidget/model.js.map +1 -1
- package/dist/PluginStoreWidget/components/CustomPluginForm.js +25 -43
- package/dist/PluginStoreWidget/components/CustomPluginForm.js.map +1 -1
- package/dist/PluginStoreWidget/components/InstalledPlugin.js +29 -47
- package/dist/PluginStoreWidget/components/InstalledPlugin.js.map +1 -1
- package/dist/PluginStoreWidget/components/InstalledPluginsList.js +12 -15
- package/dist/PluginStoreWidget/components/InstalledPluginsList.js.map +1 -1
- package/dist/PluginStoreWidget/components/PluginCard.js +23 -40
- package/dist/PluginStoreWidget/components/PluginCard.js.map +1 -1
- package/dist/PluginStoreWidget/components/PluginStoreWidget.js +49 -117
- package/dist/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
- package/dist/PluginStoreWidget/index.js +1 -1
- package/dist/PluginStoreWidget/index.js.map +1 -1
- package/dist/PluginStoreWidget/model.js +6 -6
- package/dist/PluginStoreWidget/model.js.map +1 -1
- package/dist/SetDefaultSession/SetDefaultSession.js +9 -10
- package/dist/SetDefaultSession/SetDefaultSession.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +38 -60
- package/dist/index.js.map +1 -1
- package/dist/ucsc-trackhub/configSchema.js +2 -2
- package/dist/ucsc-trackhub/configSchema.js.map +1 -1
- package/dist/ucsc-trackhub/model.js +33 -97
- package/dist/ucsc-trackhub/model.js.map +1 -1
- package/dist/ucsc-trackhub/ucscAssemblies.js +197 -1
- package/dist/ucsc-trackhub/ucscAssemblies.js.map +1 -1
- package/dist/ucsc-trackhub/ucscTrackHub.js +43 -132
- package/dist/ucsc-trackhub/ucscTrackHub.js.map +1 -1
- package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
- package/esm/AddTrackWidget/components/AddTrackWidget.js +22 -135
- package/esm/AddTrackWidget/components/AddTrackWidget.js.map +1 -1
- package/esm/AddTrackWidget/components/ConfirmTrack.js +5 -6
- package/esm/AddTrackWidget/components/ConfirmTrack.js.map +1 -1
- package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +7 -0
- package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +134 -0
- package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -0
- package/esm/HierarchicalTrackSelectorWidget/components/Header.d.ts +10 -0
- package/esm/HierarchicalTrackSelectorWidget/components/Header.js +149 -0
- package/esm/HierarchicalTrackSelectorWidget/components/Header.js.map +1 -0
- package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +24 -223
- package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
- package/esm/HierarchicalTrackSelectorWidget/components/Node.d.ts +29 -0
- package/esm/HierarchicalTrackSelectorWidget/components/Node.js +144 -0
- package/esm/HierarchicalTrackSelectorWidget/components/Node.js.map +1 -0
- package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
- package/esm/HierarchicalTrackSelectorWidget/components/util.js +5 -0
- package/esm/HierarchicalTrackSelectorWidget/components/util.js.map +1 -0
- package/esm/HierarchicalTrackSelectorWidget/configSchema.d.ts +2 -0
- package/esm/HierarchicalTrackSelectorWidget/configSchema.js +4 -0
- package/esm/HierarchicalTrackSelectorWidget/configSchema.js.map +1 -0
- package/esm/HierarchicalTrackSelectorWidget/index.d.ts +4 -2
- package/esm/HierarchicalTrackSelectorWidget/index.js +3 -3
- package/esm/HierarchicalTrackSelectorWidget/index.js.map +1 -1
- package/esm/HierarchicalTrackSelectorWidget/model.d.ts +10 -2
- package/esm/HierarchicalTrackSelectorWidget/model.js +36 -32
- package/esm/HierarchicalTrackSelectorWidget/model.js.map +1 -1
- package/esm/PluginStoreWidget/components/PluginStoreWidget.js +1 -2
- package/esm/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
- package/esm/index.d.ts +4 -1
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/package.json +4 -5
- package/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.js.snap +7 -7
- package/src/AddTrackWidget/components/{AddTrackWidget.test.js → AddTrackWidget.test.tsx} +17 -32
- package/src/AddTrackWidget/components/AddTrackWidget.tsx +36 -200
- package/src/AddTrackWidget/components/ConfirmTrack.tsx +10 -10
- package/src/AddTrackWidget/components/DefaultAddTrackWorkflow.tsx +205 -0
- package/src/HierarchicalTrackSelectorWidget/components/Header.tsx +287 -0
- package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +5 -4
- package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.tsx +19 -438
- package/src/HierarchicalTrackSelectorWidget/components/Node.tsx +282 -0
- package/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.js.snap +24 -48
- package/src/HierarchicalTrackSelectorWidget/components/util.ts +11 -0
- package/src/HierarchicalTrackSelectorWidget/configSchema.ts +3 -0
- package/src/HierarchicalTrackSelectorWidget/index.ts +4 -6
- package/src/HierarchicalTrackSelectorWidget/model.ts +45 -41
- package/src/PluginStoreWidget/components/PluginStoreWidget.test.js +16 -4
- package/src/PluginStoreWidget/components/PluginStoreWidget.tsx +1 -2
- package/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.js.snap +111 -123
- package/src/index.ts +4 -1
- 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-
|
|
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="
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
118
|
-
fireEvent.
|
|
119
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
167
|
-
<
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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(
|
|
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
|
-
|
|
236
|
-
const adapters = getAdapterTypes(
|
|
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
|
-
{
|
|
268
|
-
|
|
269
|
-
|
|
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)
|