@jbrowse/plugin-data-management 1.7.10 → 2.0.1

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 (233) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +115 -162
  2. package/dist/AddConnectionWidget/components/AddConnectionWidget.js.map +1 -0
  3. package/dist/AddConnectionWidget/components/ConfigureConnection.js +33 -32
  4. package/dist/AddConnectionWidget/components/ConfigureConnection.js.map +1 -0
  5. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +48 -64
  6. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js.map +1 -0
  7. package/dist/AddConnectionWidget/index.js +10 -20
  8. package/dist/AddConnectionWidget/index.js.map +1 -0
  9. package/dist/AddConnectionWidget/model.js +7 -15
  10. package/dist/AddConnectionWidget/model.js.map +1 -0
  11. package/dist/AddTrackWidget/components/AddTrackWidget.js +206 -230
  12. package/dist/AddTrackWidget/components/AddTrackWidget.js.map +1 -0
  13. package/dist/AddTrackWidget/components/ConfirmTrack.js +268 -385
  14. package/dist/AddTrackWidget/components/ConfirmTrack.js.map +1 -0
  15. package/dist/AddTrackWidget/components/TrackSourceSelect.js +28 -55
  16. package/dist/AddTrackWidget/components/TrackSourceSelect.js.map +1 -0
  17. package/dist/AddTrackWidget/index.js +10 -20
  18. package/dist/AddTrackWidget/index.js.map +1 -0
  19. package/dist/AddTrackWidget/model.js +150 -174
  20. package/dist/AddTrackWidget/model.js.map +1 -0
  21. package/dist/AssemblyManager/AssemblyAddForm.js +162 -282
  22. package/dist/AssemblyManager/AssemblyAddForm.js.map +1 -0
  23. package/dist/AssemblyManager/AssemblyEditor.js +12 -23
  24. package/dist/AssemblyManager/AssemblyEditor.js.map +1 -0
  25. package/dist/AssemblyManager/AssemblyManager.js +102 -132
  26. package/dist/AssemblyManager/AssemblyManager.js.map +1 -0
  27. package/dist/AssemblyManager/AssemblyTable.d.ts +1 -1
  28. package/dist/AssemblyManager/AssemblyTable.js +60 -84
  29. package/dist/AssemblyManager/AssemblyTable.js.map +1 -0
  30. package/dist/AssemblyManager/index.js +8 -14
  31. package/dist/AssemblyManager/index.js.map +1 -0
  32. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.d.ts +7 -1
  33. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js +49 -53
  34. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js.map +1 -0
  35. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.d.ts +1 -1
  36. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js +28 -44
  37. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js.map +1 -0
  38. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.d.ts +10 -5
  39. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +423 -630
  40. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -0
  41. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.d.ts +2 -1
  42. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +45 -74
  43. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +1 -0
  44. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.d.ts +2 -1
  45. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +57 -92
  46. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +1 -0
  47. package/dist/HierarchicalTrackSelectorWidget/index.d.ts +2 -2
  48. package/dist/HierarchicalTrackSelectorWidget/index.js +10 -20
  49. package/dist/HierarchicalTrackSelectorWidget/index.js.map +1 -0
  50. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +40 -16
  51. package/dist/HierarchicalTrackSelectorWidget/model.js +247 -293
  52. package/dist/HierarchicalTrackSelectorWidget/model.js.map +1 -0
  53. package/dist/PluginStoreWidget/components/CustomPluginForm.js +140 -202
  54. package/dist/PluginStoreWidget/components/CustomPluginForm.js.map +1 -0
  55. package/dist/PluginStoreWidget/components/InstalledPlugin.js +112 -127
  56. package/dist/PluginStoreWidget/components/InstalledPlugin.js.map +1 -0
  57. package/dist/PluginStoreWidget/components/InstalledPluginsList.js +22 -45
  58. package/dist/PluginStoreWidget/components/InstalledPluginsList.js.map +1 -0
  59. package/dist/PluginStoreWidget/components/PluginCard.js +95 -110
  60. package/dist/PluginStoreWidget/components/PluginCard.js.map +1 -0
  61. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +188 -227
  62. package/dist/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -0
  63. package/dist/PluginStoreWidget/index.d.ts +0 -1
  64. package/dist/PluginStoreWidget/index.js +10 -28
  65. package/dist/PluginStoreWidget/index.js.map +1 -0
  66. package/dist/PluginStoreWidget/model.js +21 -26
  67. package/dist/PluginStoreWidget/model.js.map +1 -0
  68. package/dist/SetDefaultSession/SetDefaultSession.js +34 -58
  69. package/dist/SetDefaultSession/SetDefaultSession.js.map +1 -0
  70. package/dist/SetDefaultSession/index.js +8 -14
  71. package/dist/SetDefaultSession/index.js.map +1 -0
  72. package/dist/index.js +109 -147
  73. package/dist/index.js.map +1 -0
  74. package/dist/ucsc-trackhub/configSchema.js +18 -28
  75. package/dist/ucsc-trackhub/configSchema.js.map +1 -0
  76. package/dist/ucsc-trackhub/index.js +10 -22
  77. package/dist/ucsc-trackhub/index.js.map +1 -0
  78. package/dist/ucsc-trackhub/model.js +150 -128
  79. package/dist/ucsc-trackhub/model.js.map +1 -0
  80. package/dist/ucsc-trackhub/ucscAssemblies.js +3 -9
  81. package/dist/ucsc-trackhub/ucscAssemblies.js.map +1 -0
  82. package/dist/ucsc-trackhub/ucscTrackHub.js +458 -491
  83. package/dist/ucsc-trackhub/ucscTrackHub.js.map +1 -0
  84. package/esm/AddConnectionWidget/components/AddConnectionWidget.d.ts +9 -0
  85. package/esm/AddConnectionWidget/components/AddConnectionWidget.js +86 -0
  86. package/esm/AddConnectionWidget/components/AddConnectionWidget.js.map +1 -0
  87. package/esm/AddConnectionWidget/components/ConfigureConnection.d.ts +2 -0
  88. package/esm/AddConnectionWidget/components/ConfigureConnection.js +11 -0
  89. package/esm/AddConnectionWidget/components/ConfigureConnection.js.map +1 -0
  90. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +8 -0
  91. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +24 -0
  92. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js.map +1 -0
  93. package/esm/AddConnectionWidget/index.d.ts +2 -0
  94. package/esm/AddConnectionWidget/index.js +4 -0
  95. package/esm/AddConnectionWidget/index.js.map +1 -0
  96. package/esm/AddConnectionWidget/model.d.ts +5 -0
  97. package/esm/AddConnectionWidget/model.js +7 -0
  98. package/esm/AddConnectionWidget/model.js.map +1 -0
  99. package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +7 -0
  100. package/esm/AddTrackWidget/components/AddTrackWidget.js +139 -0
  101. package/esm/AddTrackWidget/components/AddTrackWidget.js.map +1 -0
  102. package/esm/AddTrackWidget/components/ConfirmTrack.d.ts +7 -0
  103. package/esm/AddTrackWidget/components/ConfirmTrack.js +247 -0
  104. package/esm/AddTrackWidget/components/ConfirmTrack.js.map +1 -0
  105. package/esm/AddTrackWidget/components/TrackSourceSelect.d.ts +7 -0
  106. package/esm/AddTrackWidget/components/TrackSourceSelect.js +27 -0
  107. package/esm/AddTrackWidget/components/TrackSourceSelect.js.map +1 -0
  108. package/esm/AddTrackWidget/index.d.ts +2 -0
  109. package/esm/AddTrackWidget/index.js +4 -0
  110. package/esm/AddTrackWidget/index.js.map +1 -0
  111. package/esm/AddTrackWidget/model.d.ts +51 -0
  112. package/esm/AddTrackWidget/model.js +154 -0
  113. package/esm/AddTrackWidget/model.js.map +1 -0
  114. package/esm/AssemblyManager/AssemblyAddForm.d.ts +6 -0
  115. package/esm/AssemblyManager/AssemblyAddForm.js +132 -0
  116. package/esm/AssemblyManager/AssemblyAddForm.js.map +1 -0
  117. package/esm/AssemblyManager/AssemblyEditor.d.ts +5 -0
  118. package/esm/AssemblyManager/AssemblyEditor.js +8 -0
  119. package/esm/AssemblyManager/AssemblyEditor.js.map +1 -0
  120. package/esm/AssemblyManager/AssemblyManager.d.ts +6 -0
  121. package/esm/AssemblyManager/AssemblyManager.js +69 -0
  122. package/esm/AssemblyManager/AssemblyManager.js.map +1 -0
  123. package/esm/AssemblyManager/AssemblyTable.d.ts +13 -0
  124. package/esm/AssemblyManager/AssemblyTable.js +62 -0
  125. package/esm/AssemblyManager/AssemblyTable.js.map +1 -0
  126. package/esm/AssemblyManager/index.d.ts +1 -0
  127. package/esm/AssemblyManager/index.js +2 -0
  128. package/esm/AssemblyManager/index.js.map +1 -0
  129. package/esm/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.d.ts +13 -0
  130. package/esm/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js +26 -0
  131. package/esm/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js.map +1 -0
  132. package/esm/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.d.ts +13 -0
  133. package/esm/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js +24 -0
  134. package/esm/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js.map +1 -0
  135. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.d.ts +11 -0
  136. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +326 -0
  137. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -0
  138. package/esm/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.d.ts +10 -0
  139. package/esm/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +45 -0
  140. package/esm/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +1 -0
  141. package/esm/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.d.ts +11 -0
  142. package/esm/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +57 -0
  143. package/esm/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +1 -0
  144. package/esm/HierarchicalTrackSelectorWidget/index.d.ts +2 -0
  145. package/esm/HierarchicalTrackSelectorWidget/index.js +4 -0
  146. package/esm/HierarchicalTrackSelectorWidget/index.js.map +1 -0
  147. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +61 -0
  148. package/esm/HierarchicalTrackSelectorWidget/model.js +200 -0
  149. package/esm/HierarchicalTrackSelectorWidget/model.js.map +1 -0
  150. package/esm/PluginStoreWidget/components/CustomPluginForm.d.ts +9 -0
  151. package/esm/PluginStoreWidget/components/CustomPluginForm.js +109 -0
  152. package/esm/PluginStoreWidget/components/CustomPluginForm.js.map +1 -0
  153. package/esm/PluginStoreWidget/components/InstalledPlugin.d.ts +11 -0
  154. package/esm/PluginStoreWidget/components/InstalledPlugin.js +77 -0
  155. package/esm/PluginStoreWidget/components/InstalledPlugin.js.map +1 -0
  156. package/esm/PluginStoreWidget/components/InstalledPluginsList.d.ts +9 -0
  157. package/esm/PluginStoreWidget/components/InstalledPluginsList.js +16 -0
  158. package/esm/PluginStoreWidget/components/InstalledPluginsList.js.map +1 -0
  159. package/esm/PluginStoreWidget/components/PluginCard.d.ts +10 -0
  160. package/esm/PluginStoreWidget/components/PluginCard.js +61 -0
  161. package/esm/PluginStoreWidget/components/PluginCard.js.map +1 -0
  162. package/esm/PluginStoreWidget/components/PluginStoreWidget.d.ts +7 -0
  163. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +106 -0
  164. package/esm/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -0
  165. package/esm/PluginStoreWidget/index.d.ts +2 -0
  166. package/esm/PluginStoreWidget/index.js +4 -0
  167. package/esm/PluginStoreWidget/index.js.map +1 -0
  168. package/esm/PluginStoreWidget/model.d.ts +13 -0
  169. package/esm/PluginStoreWidget/model.js +20 -0
  170. package/esm/PluginStoreWidget/model.js.map +1 -0
  171. package/esm/SetDefaultSession/SetDefaultSession.d.ts +6 -0
  172. package/esm/SetDefaultSession/SetDefaultSession.js +34 -0
  173. package/esm/SetDefaultSession/SetDefaultSession.js.map +1 -0
  174. package/esm/SetDefaultSession/index.d.ts +1 -0
  175. package/esm/SetDefaultSession/index.js +2 -0
  176. package/esm/SetDefaultSession/index.js.map +1 -0
  177. package/esm/index.d.ts +27 -0
  178. package/esm/index.js +70 -0
  179. package/esm/index.js.map +1 -0
  180. package/esm/ucsc-trackhub/configSchema.d.ts +2 -0
  181. package/esm/ucsc-trackhub/configSchema.js +18 -0
  182. package/esm/ucsc-trackhub/configSchema.js.map +1 -0
  183. package/esm/ucsc-trackhub/index.d.ts +2 -0
  184. package/esm/ucsc-trackhub/index.js +3 -0
  185. package/esm/ucsc-trackhub/index.js.map +1 -0
  186. package/esm/ucsc-trackhub/model.d.ts +15 -0
  187. package/esm/ucsc-trackhub/model.js +82 -0
  188. package/esm/ucsc-trackhub/model.js.map +1 -0
  189. package/esm/ucsc-trackhub/ucscAssemblies.d.ts +2 -0
  190. package/esm/ucsc-trackhub/ucscAssemblies.js +201 -0
  191. package/esm/ucsc-trackhub/ucscAssemblies.js.map +1 -0
  192. package/esm/ucsc-trackhub/ucscTrackHub.d.ts +6 -0
  193. package/esm/ucsc-trackhub/ucscTrackHub.js +348 -0
  194. package/esm/ucsc-trackhub/ucscTrackHub.js.map +1 -0
  195. package/package.json +21 -13
  196. package/src/AddConnectionWidget/components/AddConnectionWidget.js +14 -10
  197. package/src/AddConnectionWidget/components/ConnectionTypeSelect.tsx +2 -4
  198. package/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.js.snap +63 -67
  199. package/src/AddTrackWidget/components/AddTrackWidget.test.js +4 -4
  200. package/src/AddTrackWidget/components/AddTrackWidget.tsx +5 -5
  201. package/src/AddTrackWidget/components/ConfirmTrack.tsx +22 -22
  202. package/src/AddTrackWidget/components/TrackSourceSelect.tsx +9 -5
  203. package/src/AddTrackWidget/components/__snapshots__/AddTrackWidget.test.js.snap +76 -95
  204. package/src/AssemblyManager/AssemblyAddForm.tsx +5 -11
  205. package/src/AssemblyManager/AssemblyManager.tsx +8 -8
  206. package/src/AssemblyManager/AssemblyTable.tsx +10 -10
  207. package/src/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.tsx +8 -12
  208. package/src/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.tsx +2 -2
  209. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +1 -1
  210. package/src/HierarchicalTrackSelectorWidget/components/{HierarchicalTrackSelector.js → HierarchicalTrackSelector.tsx} +262 -148
  211. package/src/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.tsx +11 -8
  212. package/src/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.tsx +31 -33
  213. package/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.js.snap +122 -115
  214. package/src/HierarchicalTrackSelectorWidget/{index.js → index.ts} +0 -0
  215. package/src/HierarchicalTrackSelectorWidget/{model.js → model.ts} +113 -105
  216. package/src/PluginStoreWidget/components/CustomPluginForm.tsx +11 -14
  217. package/src/PluginStoreWidget/components/InstalledPlugin.tsx +9 -8
  218. package/src/PluginStoreWidget/components/InstalledPluginsList.tsx +1 -1
  219. package/src/PluginStoreWidget/components/PluginCard.tsx +10 -11
  220. package/src/PluginStoreWidget/components/PluginStoreWidget.tsx +9 -9
  221. package/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.js.snap +267 -217
  222. package/src/PluginStoreWidget/index.js +0 -1
  223. package/src/SetDefaultSession/SetDefaultSession.tsx +1 -1
  224. package/dist/AddConnectionWidget/components/AddConnectionWidget.test.js +0 -279
  225. package/dist/AddTrackWidget/components/AddTrackWidget.test.js +0 -218
  226. package/dist/AddTrackWidget/index.test.js +0 -292
  227. package/dist/AssemblyManager/AssemblyManager.test.js +0 -113
  228. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +0 -191
  229. package/dist/HierarchicalTrackSelectorWidget/model.test.js +0 -28
  230. package/dist/PluginStoreWidget/components/PluginStoreWidget.test.js +0 -201
  231. package/dist/PluginStoreWidget/model.test.js +0 -17
  232. package/dist/SetDefaultSession/SetDefaultSession.test.js +0 -75
  233. package/dist/index.test.js +0 -56
@@ -1,4 +1,3 @@
1
- /* eslint-disable react/prop-types */
2
1
  import React, {
3
2
  Suspense,
4
3
  lazy,
@@ -19,32 +18,43 @@ import {
19
18
  TextField,
20
19
  Tooltip,
21
20
  Typography,
22
- makeStyles,
23
- } from '@material-ui/core'
24
-
21
+ } from '@mui/material'
22
+ import { makeStyles } from 'tss-react/mui'
25
23
  // icons
26
- import ClearIcon from '@material-ui/icons/Clear'
27
- import AddIcon from '@material-ui/icons/Add'
28
- import ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'
29
- import ArrowRightIcon from '@material-ui/icons/ArrowRight'
30
- import MenuIcon from '@material-ui/icons/Menu'
31
- import MoreIcon from '@material-ui/icons/MoreHoriz'
24
+ import ClearIcon from '@mui/icons-material/Clear'
25
+ import AddIcon from '@mui/icons-material/Add'
26
+ import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'
27
+ import ArrowRightIcon from '@mui/icons-material/ArrowRight'
28
+ import MenuIcon from '@mui/icons-material/Menu'
29
+ import MoreIcon from '@mui/icons-material/MoreHoriz'
32
30
  import { Cable } from '@jbrowse/core/ui/Icons'
33
31
 
34
32
  // other
35
33
  import AutoSizer from 'react-virtualized-auto-sizer'
36
34
  import JBrowseMenu from '@jbrowse/core/ui/Menu'
37
- import { getSession } from '@jbrowse/core/util'
38
- import { readConfObject } from '@jbrowse/core/configuration'
35
+ import {
36
+ getSession,
37
+ isSessionModelWithWidgets,
38
+ isSessionModelWithConnections,
39
+ isSessionWithAddTracks,
40
+ } from '@jbrowse/core/util'
41
+ import {
42
+ AnyConfigurationModel,
43
+ readConfObject,
44
+ } from '@jbrowse/core/configuration'
39
45
  import { observer } from 'mobx-react'
40
46
  import { VariableSizeTree } from 'react-vtree'
41
47
 
48
+ // locals
49
+ import { TreeNode, HierarchicalTrackSelectorModel } from '../model'
50
+
51
+ // lazy components
42
52
  const CloseConnectionDialog = lazy(() => import('./CloseConnectionDialog'))
43
53
  const DeleteConnectionDialog = lazy(() => import('./DeleteConnectionDialog'))
44
54
  const ManageConnectionsDialog = lazy(() => import('./ManageConnectionsDialog'))
45
55
  const ToggleConnectionsDialog = lazy(() => import('./ToggleConnectionsDialog'))
46
56
 
47
- const useStyles = makeStyles(theme => ({
57
+ const useStyles = makeStyles()(theme => ({
48
58
  searchBox: {
49
59
  margin: theme.spacing(2),
50
60
  },
@@ -88,7 +98,9 @@ const useStyles = makeStyles(theme => ({
88
98
  // accordionColor set's display:flex so that the child accordionText use
89
99
  // vertically centered text
90
100
  accordionColor: {
101
+ // @ts-ignore
91
102
  background: theme.palette.tertiary?.main,
103
+ // @ts-ignore
92
104
  color: theme.palette.tertiary?.contrastText,
93
105
  width: '100%',
94
106
  display: 'flex',
@@ -101,9 +113,31 @@ const useStyles = makeStyles(theme => ({
101
113
  },
102
114
  }))
103
115
 
116
+ interface MoreInfoArgs {
117
+ target: HTMLElement
118
+ id: string
119
+ conf: AnyConfigurationModel
120
+ }
121
+
104
122
  // An individual node in the track selector. Note: manually sets cursor:
105
123
  // pointer improves usability for what can be clicked
106
- const Node = props => {
124
+ function Node(props: {
125
+ data: {
126
+ isLeaf: boolean
127
+ nestingLevel: number
128
+ checked: boolean
129
+ id: string
130
+ name: string
131
+ onChange: Function
132
+ toggleCollapse: (arg: string) => void
133
+ conf: AnyConfigurationModel
134
+ onMoreInfo: (arg: MoreInfoArgs) => void
135
+ drawerPosition: unknown
136
+ }
137
+ isOpen: boolean
138
+ style?: { height: number }
139
+ setOpen: (arg: boolean) => void
140
+ }) {
107
141
  const { data, isOpen, style, setOpen } = props
108
142
  const {
109
143
  isLeaf,
@@ -118,11 +152,11 @@ const Node = props => {
118
152
  drawerPosition,
119
153
  } = data
120
154
 
121
- const classes = useStyles()
155
+ const { classes } = useStyles()
122
156
  const width = 10
123
157
  const marginLeft = nestingLevel * width + (isLeaf ? width : 0)
124
158
  const unsupported =
125
- name && (name.endsWith('(Unsupported)') || name.endsWith('(Unknown)'))
159
+ name?.endsWith('(Unsupported)') || name?.endsWith('(Unknown)')
126
160
  const description = (conf && readConfObject(conf, ['description'])) || ''
127
161
 
128
162
  return (
@@ -130,7 +164,7 @@ const Node = props => {
130
164
  {new Array(nestingLevel).fill(0).map((_, idx) => (
131
165
  <div
132
166
  key={`mark-${idx}`}
133
- style={{ left: idx * width + 4, height: style.height }}
167
+ style={{ left: idx * width + 4, height: style?.height }}
134
168
  className={classes.nestingLevelMarker}
135
169
  />
136
170
  ))}
@@ -170,6 +204,7 @@ const Node = props => {
170
204
  color="primary"
171
205
  disabled={unsupported}
172
206
  inputProps={{
207
+ // @ts-ignore
173
208
  'data-testid': `htsTrackEntry-${id}`,
174
209
  }}
175
210
  />
@@ -179,6 +214,7 @@ const Node = props => {
179
214
  </Tooltip>
180
215
  <IconButton
181
216
  onClick={e => onMoreInfo({ target: e.currentTarget, id, conf })}
217
+ style={{ padding: 0 }}
182
218
  color="secondary"
183
219
  data-testid={`htsTrackEntryMenu-${id}`}
184
220
  >
@@ -192,7 +228,11 @@ const Node = props => {
192
228
  )
193
229
  }
194
230
 
195
- const getNodeData = (node, nestingLevel, extra) => {
231
+ function getNodeData(
232
+ node: TreeNode,
233
+ nestingLevel: number,
234
+ extra: Record<string, unknown>,
235
+ ) {
196
236
  const isLeaf = !!node.conf
197
237
  return {
198
238
  data: {
@@ -208,74 +248,99 @@ const getNodeData = (node, nestingLevel, extra) => {
208
248
  }
209
249
  }
210
250
 
251
+ type NodeData = ReturnType<typeof getNodeData>
252
+
211
253
  // this is the main tree component for the hierarchical track selector in note:
212
254
  // in jbrowse-web the toolbar is position="sticky" which means the autosizer
213
255
  // includes the height of the toolbar, so we subtract the given offsets
214
- const HierarchicalTree = observer(({ height, tree, model }) => {
215
- const { filterText, view } = model
216
- const treeRef = useRef(null)
217
- const [info, setMoreInfo] = useState()
218
- const session = getSession(model)
219
- const { drawerPosition } = session
220
-
221
- const extra = useMemo(
222
- () => ({
223
- onChange: trackId => view.toggleTrack(trackId),
224
- toggleCollapse: pathName => model.toggleCategory(pathName),
225
- onMoreInfo: setMoreInfo,
226
- drawerPosition,
227
- }),
228
- [view, model, drawerPosition],
229
- )
230
- const treeWalker = useCallback(
231
- function* treeWalker() {
232
- for (let i = 0; i < tree.children.length; i++) {
233
- yield getNodeData(tree.children[i], 0, extra)
234
- }
256
+ const HierarchicalTree = observer(
257
+ ({
258
+ height,
259
+ tree,
260
+ model,
261
+ }: {
262
+ height: number
263
+ tree: TreeNode
264
+ model: HierarchicalTrackSelectorModel
265
+ }) => {
266
+ const { filterText, view } = model
267
+ const treeRef = useRef<NodeData>(null)
268
+ const [info, setMoreInfo] = useState<MoreInfoArgs>()
269
+ const session = getSession(model)
270
+ const { drawerPosition } = session
271
+
272
+ const extra = useMemo(
273
+ () => ({
274
+ onChange: (trackId: string) => view.toggleTrack(trackId),
275
+ toggleCollapse: (pathName: string) => model.toggleCategory(pathName),
276
+ onMoreInfo: setMoreInfo,
277
+ drawerPosition,
278
+ }),
279
+ [view, model, drawerPosition],
280
+ )
281
+ const treeWalker = useCallback(
282
+ function* treeWalker() {
283
+ for (let i = 0; i < tree.children.length; i++) {
284
+ const r = tree.children[i]
285
+ yield getNodeData(r, 0, extra)
286
+ }
235
287
 
236
- while (true) {
237
- const parentMeta = yield
288
+ while (true) {
289
+ // @ts-ignore
290
+ const parentMeta = yield
238
291
 
239
- for (let i = 0; i < parentMeta.node.children.length; i++) {
240
- const curr = parentMeta.node.children[i]
241
- yield getNodeData(curr, parentMeta.nestingLevel + 1, extra)
292
+ for (let i = 0; i < parentMeta.node.children.length; i++) {
293
+ const curr = parentMeta.node.children[i]
294
+ yield getNodeData(curr, parentMeta.nestingLevel + 1, extra)
295
+ }
242
296
  }
243
- }
244
- },
245
- [tree, extra],
246
- )
297
+ },
298
+ [tree, extra],
299
+ )
247
300
 
248
- const conf = info?.conf
249
- const menuItems = (conf && session.getTrackActionMenuItems?.(conf)) || []
301
+ const conf = info?.conf
302
+ const menuItems = (conf && session.getTrackActionMenuItems?.(conf)) || []
250
303
 
251
- useEffect(() => {
252
- treeRef.current.recomputeTree({
253
- refreshNodes: true,
254
- useDefaultHeight: true,
255
- })
256
- }, [tree, filterText])
257
- return (
258
- <>
259
- <VariableSizeTree ref={treeRef} treeWalker={treeWalker} height={height}>
260
- {Node}
261
- </VariableSizeTree>
262
- <JBrowseMenu
263
- anchorEl={info?.target}
264
- menuItems={menuItems}
265
- onMenuItemClick={(_event, callback) => {
266
- callback()
267
- setMoreInfo(undefined)
268
- }}
269
- open={Boolean(info)}
270
- onClose={() => setMoreInfo(undefined)}
271
- />
272
- </>
273
- )
274
- })
304
+ useEffect(() => {
305
+ // @ts-ignore
306
+ treeRef.current.recomputeTree({
307
+ refreshNodes: true,
308
+ useDefaultHeight: true,
309
+ })
310
+ }, [tree, filterText])
311
+ return (
312
+ <>
313
+ {/* @ts-ignore */}
314
+ <VariableSizeTree ref={treeRef} treeWalker={treeWalker} height={height}>
315
+ {/* @ts-ignore */}
316
+ {Node}
317
+ </VariableSizeTree>
318
+ <JBrowseMenu
319
+ anchorEl={info?.target}
320
+ menuItems={menuItems}
321
+ onMenuItemClick={(_event, callback) => {
322
+ callback()
323
+ setMoreInfo(undefined)
324
+ }}
325
+ open={Boolean(info)}
326
+ onClose={() => setMoreInfo(undefined)}
327
+ />
328
+ </>
329
+ )
330
+ },
331
+ )
275
332
 
276
333
  // Don't use autosizer in jest and instead hardcode a height, otherwise fails
277
334
  // jest tests
278
- const AutoSizedHierarchicalTree = ({ tree, model, offset }) => {
335
+ const AutoSizedHierarchicalTree = ({
336
+ tree,
337
+ model,
338
+ offset,
339
+ }: {
340
+ tree: TreeNode
341
+ model: HierarchicalTrackSelectorModel
342
+ offset: number
343
+ }) => {
279
344
  return typeof jest === 'undefined' ? (
280
345
  <AutoSizer disableWidth>
281
346
  {({ height }) => {
@@ -293,7 +358,13 @@ const AutoSizedHierarchicalTree = ({ tree, model, offset }) => {
293
358
  )
294
359
  }
295
360
 
296
- const Wrapper = ({ overrideDimensions, children }) => {
361
+ const Wrapper = ({
362
+ overrideDimensions,
363
+ children,
364
+ }: {
365
+ overrideDimensions?: { width: number; height: number }
366
+ children: React.ReactNode
367
+ }) => {
297
368
  return overrideDimensions ? (
298
369
  <div style={{ ...overrideDimensions }}>{children}</div>
299
370
  ) : (
@@ -301,29 +372,36 @@ const Wrapper = ({ overrideDimensions, children }) => {
301
372
  )
302
373
  }
303
374
  const HierarchicalTrackSelectorContainer = observer(
304
- ({ model, toolbarHeight, overrideDimensions }) => {
305
- const classes = useStyles()
375
+ ({
376
+ model,
377
+ toolbarHeight,
378
+ overrideDimensions,
379
+ }: {
380
+ model: HierarchicalTrackSelectorModel
381
+ toolbarHeight: number
382
+ overrideDimensions?: { width: number; height: number }
383
+ }) => {
384
+ const { classes } = useStyles()
306
385
  const session = getSession(model)
307
- const [anchorEl, setAnchorEl] = useState(null)
386
+ const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null)
308
387
 
309
388
  function handleFabClose() {
310
389
  setAnchorEl(null)
311
390
  }
391
+ const hasConnections = isSessionModelWithConnections(session)
392
+ const hasAddTrack = isSessionWithAddTracks(session)
312
393
  return (
313
394
  <Wrapper overrideDimensions={overrideDimensions}>
314
395
  <HierarchicalTrackSelector
315
396
  model={model}
316
397
  toolbarHeight={toolbarHeight}
317
- overrideDimensions={overrideDimensions}
318
398
  />
319
- {session.addConnectionConf || session.addTrackConf ? (
399
+ {hasAddTrack || hasConnections ? (
320
400
  <>
321
401
  <Fab
322
402
  color="secondary"
323
403
  className={classes.fab}
324
- onClick={event => {
325
- setAnchorEl(event.currentTarget)
326
- }}
404
+ onClick={event => setAnchorEl(event.currentTarget)}
327
405
  >
328
406
  <AddIcon />
329
407
  </Fab>
@@ -332,32 +410,34 @@ const HierarchicalTrackSelectorContainer = observer(
332
410
  open={Boolean(anchorEl)}
333
411
  onClose={() => setAnchorEl(null)}
334
412
  >
335
- {session.addConnectionConf ? (
413
+ {hasConnections ? (
336
414
  <MenuItem
337
415
  onClick={() => {
338
416
  handleFabClose()
339
- const widget = session.addWidget(
340
- 'AddConnectionWidget',
341
- 'addConnectionWidget',
342
- )
343
- session.showWidget(widget)
417
+ if (isSessionModelWithWidgets(session)) {
418
+ session.showWidget(
419
+ session.addWidget(
420
+ 'AddConnectionWidget',
421
+ 'addConnectionWidget',
422
+ ),
423
+ )
424
+ }
344
425
  }}
345
426
  >
346
427
  Add connection
347
428
  </MenuItem>
348
429
  ) : null}
349
- {session.addTrackConf ? (
430
+ {hasAddTrack ? (
350
431
  <MenuItem
351
432
  onClick={() => {
352
433
  handleFabClose()
353
- const widget = session.addWidget(
354
- 'AddTrackWidget',
355
- 'addTrackWidget',
356
- {
357
- view: model.view.id,
358
- },
359
- )
360
- session.showWidget(widget)
434
+ if (isSessionModelWithWidgets(session)) {
435
+ session.showWidget(
436
+ session.addWidget('AddTrackWidget', 'addTrackWidget', {
437
+ view: model.view.id,
438
+ }),
439
+ )
440
+ }
361
441
  }}
362
442
  >
363
443
  Add track
@@ -372,20 +452,44 @@ const HierarchicalTrackSelectorContainer = observer(
372
452
  )
373
453
 
374
454
  const HierarchicalTrackSelectorHeader = observer(
375
- ({ model, setHeaderHeight, setAssemblyIdx, assemblyIdx }) => {
376
- const classes = useStyles()
455
+ ({
456
+ model,
457
+ setHeaderHeight,
458
+ setAssemblyIdx,
459
+ assemblyIdx,
460
+ }: {
461
+ model: HierarchicalTrackSelectorModel
462
+ setHeaderHeight: (n: number) => void
463
+ setAssemblyIdx: (n: number) => void
464
+ assemblyIdx: number
465
+ }) => {
466
+ const { classes } = useStyles()
377
467
  const session = getSession(model)
378
- const [connectionAnchorEl, setConnectionAnchorEl] = useState()
379
- const [menuAnchorEl, setMenuAnchorEl] = useState()
380
- const [modalInfo, setModalInfo] = useState()
381
- const [deleteDialogDetails, setDeleteDialogDetails] = useState()
468
+ const [connectionAnchorEl, setConnectionAnchorEl] =
469
+ useState<HTMLButtonElement>()
470
+ const [menuAnchorEl, setMenuAnchorEl] = useState<HTMLButtonElement>()
471
+ const [modalInfo, setModalInfo] = useState<{
472
+ connectionConf: AnyConfigurationModel
473
+ safelyBreakConnection: Function
474
+ dereferenceTypeCount: { [key: string]: number }
475
+ name: string
476
+ }>()
477
+ const [deleteDialogDetails, setDeleteDialogDetails] = useState<{
478
+ name: string
479
+ connectionConf: AnyConfigurationModel
480
+ }>()
382
481
  const [connectionManagerOpen, setConnectionManagerOpen] = useState(false)
383
482
  const [connectionToggleOpen, setConnectionToggleOpen] = useState(false)
384
483
  const { assemblyNames } = model
385
484
  const assemblyName = assemblyNames[assemblyIdx]
386
485
 
387
- function breakConnection(connectionConf, deletingConnection) {
486
+ function breakConnection(
487
+ connectionConf: AnyConfigurationModel,
488
+ deletingConnection?: boolean,
489
+ ) {
388
490
  const name = readConfObject(connectionConf, 'name')
491
+
492
+ // @ts-ignore
389
493
  const result = session.prepareToBreakConnection(connectionConf)
390
494
  if (result) {
391
495
  const [safelyBreakConnection, dereferenceTypeCount] = result
@@ -412,13 +516,17 @@ const HierarchicalTrackSelectorHeader = observer(
412
516
  },
413
517
  ]
414
518
 
415
- if (session.addConnectionConf) {
519
+ if (isSessionModelWithConnections(session)) {
416
520
  connectionMenuItems.unshift({
417
521
  label: 'Add connection',
418
522
  onClick: () => {
419
- session.showWidget(
420
- session.addWidget('AddConnectionWidget', 'addConnectionWidget'),
421
- )
523
+ if (isSessionModelWithWidgets(session)) {
524
+ const widget = session.addWidget(
525
+ 'AddConnectionWidget',
526
+ 'addConnectionWidget',
527
+ )
528
+ session.showWidget(widget)
529
+ }
422
530
  },
423
531
  })
424
532
 
@@ -435,9 +543,7 @@ const HierarchicalTrackSelectorHeader = observer(
435
543
  label: 'Select assembly...',
436
544
  subMenu: assemblyNames.map((name, idx) => ({
437
545
  label: name,
438
- onClick: () => {
439
- setAssemblyIdx(idx)
440
- },
546
+ onClick: () => setAssemblyIdx(idx),
441
547
  })),
442
548
  },
443
549
  ]
@@ -447,11 +553,16 @@ const HierarchicalTrackSelectorHeader = observer(
447
553
  {
448
554
  label: 'Add track...',
449
555
  onClick: () => {
450
- session.showWidget(
451
- session.addWidget('AddTrackWidget', 'addTrackWidget', {
452
- view: model.view.id,
453
- }),
454
- )
556
+ if (isSessionModelWithWidgets(session)) {
557
+ const widget = session.addWidget(
558
+ 'AddTrackWidget',
559
+ 'addTrackWidget',
560
+ {
561
+ view: model.view.id,
562
+ },
563
+ )
564
+ session.showWidget(widget)
565
+ }
455
566
  },
456
567
  },
457
568
 
@@ -464,12 +575,10 @@ const HierarchicalTrackSelectorHeader = observer(
464
575
  data-testid="hierarchical_track_selector"
465
576
  >
466
577
  <div style={{ display: 'flex' }}>
467
- {session.addTrackConf && (
578
+ {isSessionWithAddTracks(session) && (
468
579
  <IconButton
469
580
  className={classes.menuIcon}
470
- onClick={event => {
471
- setMenuAnchorEl(event.currentTarget)
472
- }}
581
+ onClick={event => setMenuAnchorEl(event.currentTarget)}
473
582
  >
474
583
  <MenuIcon />
475
584
  </IconButton>
@@ -478,9 +587,7 @@ const HierarchicalTrackSelectorHeader = observer(
478
587
  {session.makeConnection && (
479
588
  <IconButton
480
589
  className={classes.menuIcon}
481
- onClick={event => {
482
- setConnectionAnchorEl(event.currentTarget)
483
- }}
590
+ onClick={event => setConnectionAnchorEl(event.currentTarget)}
484
591
  >
485
592
  <Cable />
486
593
  </IconButton>
@@ -528,7 +635,6 @@ const HierarchicalTrackSelectorHeader = observer(
528
635
  <CloseConnectionDialog
529
636
  modalInfo={modalInfo}
530
637
  setModalInfo={setModalInfo}
531
- session={session}
532
638
  />
533
639
  ) : deleteDialogDetails ? (
534
640
  <DeleteConnectionDialog
@@ -557,27 +663,35 @@ const HierarchicalTrackSelectorHeader = observer(
557
663
  )
558
664
  },
559
665
  )
560
- const HierarchicalTrackSelector = observer(({ model, toolbarHeight = 0 }) => {
561
- const [assemblyIdx, setAssemblyIdx] = useState(0)
562
- const [headerHeight, setHeaderHeight] = useState(0)
563
-
564
- const { assemblyNames } = model
565
- const assemblyName = assemblyNames[assemblyIdx]
566
- return assemblyName ? (
567
- <>
568
- <HierarchicalTrackSelectorHeader
569
- model={model}
570
- setHeaderHeight={setHeaderHeight}
571
- setAssemblyIdx={setAssemblyIdx}
572
- assemblyIdx={assemblyIdx}
573
- />
574
- <AutoSizedHierarchicalTree
575
- tree={model.hierarchy(assemblyName)}
576
- model={model}
577
- offset={toolbarHeight + headerHeight}
578
- />
579
- </>
580
- ) : null
581
- })
666
+ const HierarchicalTrackSelector = observer(
667
+ ({
668
+ model,
669
+ toolbarHeight = 0,
670
+ }: {
671
+ model: HierarchicalTrackSelectorModel
672
+ toolbarHeight?: number
673
+ }) => {
674
+ const [assemblyIdx, setAssemblyIdx] = useState(0)
675
+ const [headerHeight, setHeaderHeight] = useState(0)
676
+
677
+ const { assemblyNames } = model
678
+ const assemblyName = assemblyNames[assemblyIdx]
679
+ return assemblyName ? (
680
+ <>
681
+ <HierarchicalTrackSelectorHeader
682
+ model={model}
683
+ setHeaderHeight={setHeaderHeight}
684
+ setAssemblyIdx={setAssemblyIdx}
685
+ assemblyIdx={assemblyIdx}
686
+ />
687
+ <AutoSizedHierarchicalTree
688
+ tree={model.hierarchy(assemblyName)}
689
+ model={model}
690
+ offset={toolbarHeight + headerHeight}
691
+ />
692
+ </>
693
+ ) : null
694
+ },
695
+ )
582
696
 
583
697
  export default HierarchicalTrackSelectorContainer
@@ -1,21 +1,24 @@
1
1
  import React from 'react'
2
2
  import {
3
+ Button,
3
4
  Dialog,
4
5
  DialogTitle,
5
6
  DialogContent,
6
7
  DialogActions,
7
- Button,
8
8
  IconButton,
9
9
  Tooltip,
10
10
  Typography,
11
- makeStyles,
12
- } from '@material-ui/core'
13
- import CloseIcon from '@material-ui/icons/Close'
11
+ } from '@mui/material'
12
+ import { makeStyles } from 'tss-react/mui'
13
+ import CloseIcon from '@mui/icons-material/Close'
14
14
  import { observer } from 'mobx-react'
15
- import { readConfObject } from '@jbrowse/core/configuration'
15
+ import {
16
+ AnyConfigurationModel,
17
+ readConfObject,
18
+ } from '@jbrowse/core/configuration'
16
19
  import { AbstractSessionModel } from '@jbrowse/core/util'
17
20
 
18
- const useStyles = makeStyles(theme => ({
21
+ const useStyles = makeStyles()(theme => ({
19
22
  closeButton: {
20
23
  position: 'absolute',
21
24
  right: theme.spacing(1),
@@ -36,9 +39,9 @@ function ManageConnectionsDlg({
36
39
  }: {
37
40
  handleClose: () => void
38
41
  session: AbstractSessionModel
39
- breakConnection: Function
42
+ breakConnection: (conf: AnyConfigurationModel, arg: boolean) => void
40
43
  }) {
41
- const classes = useStyles()
44
+ const { classes } = useStyles()
42
45
  const { adminMode, connections, sessionConnections } = session
43
46
  return (
44
47
  <Dialog open onClose={handleClose} maxWidth="lg">