@jbrowse/plugin-data-management 2.3.2 → 2.3.4

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 (222) hide show
  1. package/dist/AddConnectionWidget/index.d.ts +3 -2
  2. package/dist/AddConnectionWidget/index.js +38 -4
  3. package/dist/AddConnectionWidget/index.js.map +1 -1
  4. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +1 -4
  5. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -1
  6. package/dist/AddTrackWidget/components/TrackSourceSelect.js +1 -4
  7. package/dist/AddTrackWidget/components/TrackSourceSelect.js.map +1 -1
  8. package/dist/AddTrackWidget/index.d.ts +3 -2
  9. package/dist/AddTrackWidget/index.js +38 -4
  10. package/dist/AddTrackWidget/index.js.map +1 -1
  11. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +6 -0
  12. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +71 -0
  13. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js.map +1 -0
  14. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +10 -104
  15. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  16. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +6 -0
  17. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +70 -0
  18. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.js.map +1 -0
  19. package/dist/HierarchicalTrackSelectorWidget/components/{CloseConnectionDialog.d.ts → dialogs/CloseConnectionDialog.d.ts} +0 -0
  20. package/dist/HierarchicalTrackSelectorWidget/components/{CloseConnectionDialog.js → dialogs/CloseConnectionDialog.js} +0 -0
  21. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js.map +1 -0
  22. package/dist/HierarchicalTrackSelectorWidget/components/{DeleteConnectionDialog.d.ts → dialogs/DeleteConnectionDialog.d.ts} +0 -0
  23. package/dist/HierarchicalTrackSelectorWidget/components/{DeleteConnectionDialog.js → dialogs/DeleteConnectionDialog.js} +0 -0
  24. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js.map +1 -0
  25. package/dist/HierarchicalTrackSelectorWidget/components/{ManageConnectionsDialog.d.ts → dialogs/ManageConnectionsDialog.d.ts} +0 -0
  26. package/dist/HierarchicalTrackSelectorWidget/components/{ManageConnectionsDialog.js → dialogs/ManageConnectionsDialog.js} +0 -0
  27. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js.map +1 -0
  28. package/dist/HierarchicalTrackSelectorWidget/components/{ToggleConnectionsDialog.d.ts → dialogs/ToggleConnectionsDialog.d.ts} +0 -0
  29. package/dist/HierarchicalTrackSelectorWidget/components/{ToggleConnectionsDialog.js → dialogs/ToggleConnectionsDialog.js} +0 -0
  30. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js.map +1 -0
  31. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +13 -0
  32. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +99 -0
  33. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js.map +1 -0
  34. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +8 -0
  35. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +18 -0
  36. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js.map +1 -0
  37. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +11 -0
  38. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +71 -0
  39. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js.map +1 -0
  40. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +12 -0
  41. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +211 -0
  42. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js.map +1 -0
  43. package/dist/HierarchicalTrackSelectorWidget/components/faceted/util.d.ts +1 -0
  44. package/dist/HierarchicalTrackSelectorWidget/components/faceted/util.js +10 -0
  45. package/dist/HierarchicalTrackSelectorWidget/components/faceted/util.js.map +1 -0
  46. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +7 -0
  47. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +136 -0
  48. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js.map +1 -0
  49. package/dist/HierarchicalTrackSelectorWidget/components/{Header.d.ts → tree/HierarchicalHeader.d.ts} +2 -3
  50. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +65 -0
  51. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js.map +1 -0
  52. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +8 -0
  53. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +91 -0
  54. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js.map +1 -0
  55. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.d.ts +7 -0
  56. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +89 -0
  57. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js.map +1 -0
  58. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.d.ts +11 -0
  59. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +86 -0
  60. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js.map +1 -0
  61. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.d.ts +10 -0
  62. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js +54 -0
  63. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js.map +1 -0
  64. package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +17 -1
  65. package/dist/HierarchicalTrackSelectorWidget/components/util.js +16 -1
  66. package/dist/HierarchicalTrackSelectorWidget/components/util.js.map +1 -1
  67. package/dist/HierarchicalTrackSelectorWidget/index.d.ts +3 -0
  68. package/dist/HierarchicalTrackSelectorWidget/index.js +36 -0
  69. package/dist/HierarchicalTrackSelectorWidget/index.js.map +1 -1
  70. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +4 -1
  71. package/dist/HierarchicalTrackSelectorWidget/model.js +12 -8
  72. package/dist/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  73. package/dist/PluginStoreWidget/index.d.ts +3 -2
  74. package/dist/PluginStoreWidget/index.js +38 -4
  75. package/dist/PluginStoreWidget/index.js.map +1 -1
  76. package/dist/index.js +10 -51
  77. package/dist/index.js.map +1 -1
  78. package/dist/ucsc-trackhub/index.d.ts +3 -2
  79. package/dist/ucsc-trackhub/index.js +13 -5
  80. package/dist/ucsc-trackhub/index.js.map +1 -1
  81. package/esm/AddConnectionWidget/index.d.ts +3 -2
  82. package/esm/AddConnectionWidget/index.js +15 -2
  83. package/esm/AddConnectionWidget/index.js.map +1 -1
  84. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +1 -4
  85. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -1
  86. package/esm/AddTrackWidget/components/TrackSourceSelect.js +1 -4
  87. package/esm/AddTrackWidget/components/TrackSourceSelect.js.map +1 -1
  88. package/esm/AddTrackWidget/index.d.ts +3 -2
  89. package/esm/AddTrackWidget/index.js +15 -2
  90. package/esm/AddTrackWidget/index.js.map +1 -1
  91. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +6 -0
  92. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js +43 -0
  93. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.js.map +1 -0
  94. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +9 -103
  95. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  96. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +6 -0
  97. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js +42 -0
  98. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.js.map +1 -0
  99. package/esm/HierarchicalTrackSelectorWidget/components/{CloseConnectionDialog.d.ts → dialogs/CloseConnectionDialog.d.ts} +0 -0
  100. package/esm/HierarchicalTrackSelectorWidget/components/{CloseConnectionDialog.js → dialogs/CloseConnectionDialog.js} +0 -0
  101. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js.map +1 -0
  102. package/esm/HierarchicalTrackSelectorWidget/components/{DeleteConnectionDialog.d.ts → dialogs/DeleteConnectionDialog.d.ts} +0 -0
  103. package/esm/HierarchicalTrackSelectorWidget/components/{DeleteConnectionDialog.js → dialogs/DeleteConnectionDialog.js} +0 -0
  104. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.js.map +1 -0
  105. package/esm/HierarchicalTrackSelectorWidget/components/{ManageConnectionsDialog.d.ts → dialogs/ManageConnectionsDialog.d.ts} +0 -0
  106. package/esm/HierarchicalTrackSelectorWidget/components/{ManageConnectionsDialog.js → dialogs/ManageConnectionsDialog.js} +0 -0
  107. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.js.map +1 -0
  108. package/esm/HierarchicalTrackSelectorWidget/components/{ToggleConnectionsDialog.d.ts → dialogs/ToggleConnectionsDialog.d.ts} +0 -0
  109. package/esm/HierarchicalTrackSelectorWidget/components/{ToggleConnectionsDialog.js → dialogs/ToggleConnectionsDialog.js} +0 -0
  110. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js.map +1 -0
  111. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +13 -0
  112. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js +70 -0
  113. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.js.map +1 -0
  114. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +8 -0
  115. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js +13 -0
  116. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.js.map +1 -0
  117. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +11 -0
  118. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +42 -0
  119. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js.map +1 -0
  120. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +12 -0
  121. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +183 -0
  122. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js.map +1 -0
  123. package/esm/HierarchicalTrackSelectorWidget/components/faceted/util.d.ts +1 -0
  124. package/esm/HierarchicalTrackSelectorWidget/components/faceted/util.js +6 -0
  125. package/esm/HierarchicalTrackSelectorWidget/components/faceted/util.js.map +1 -0
  126. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +7 -0
  127. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +108 -0
  128. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js.map +1 -0
  129. package/esm/HierarchicalTrackSelectorWidget/components/{Header.d.ts → tree/HierarchicalHeader.d.ts} +2 -3
  130. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +37 -0
  131. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js.map +1 -0
  132. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +8 -0
  133. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js +63 -0
  134. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.js.map +1 -0
  135. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.d.ts +7 -0
  136. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js +60 -0
  137. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.js.map +1 -0
  138. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.d.ts +11 -0
  139. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js +57 -0
  140. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.js.map +1 -0
  141. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.d.ts +10 -0
  142. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js +48 -0
  143. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.js.map +1 -0
  144. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +17 -1
  145. package/esm/HierarchicalTrackSelectorWidget/components/util.js +13 -0
  146. package/esm/HierarchicalTrackSelectorWidget/components/util.js.map +1 -1
  147. package/esm/HierarchicalTrackSelectorWidget/index.d.ts +3 -0
  148. package/esm/HierarchicalTrackSelectorWidget/index.js +13 -0
  149. package/esm/HierarchicalTrackSelectorWidget/index.js.map +1 -1
  150. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +4 -1
  151. package/esm/HierarchicalTrackSelectorWidget/model.js +10 -7
  152. package/esm/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  153. package/esm/PluginStoreWidget/index.d.ts +3 -2
  154. package/esm/PluginStoreWidget/index.js +15 -2
  155. package/esm/PluginStoreWidget/index.js.map +1 -1
  156. package/esm/index.js +10 -51
  157. package/esm/index.js.map +1 -1
  158. package/esm/ucsc-trackhub/index.d.ts +3 -2
  159. package/esm/ucsc-trackhub/index.js +13 -2
  160. package/esm/ucsc-trackhub/index.js.map +1 -1
  161. package/package.json +3 -2
  162. package/src/AddConnectionWidget/components/{AddConnectionWidget.test.js → AddConnectionWidget.test.tsx} +17 -8
  163. package/src/AddConnectionWidget/components/__snapshots__/{AddConnectionWidget.test.js.snap → AddConnectionWidget.test.tsx.snap} +0 -0
  164. package/src/AddConnectionWidget/index.ts +17 -2
  165. package/src/AddTrackWidget/components/DefaultAddTrackWorkflow.tsx +1 -4
  166. package/src/AddTrackWidget/components/TrackSourceSelect.tsx +3 -5
  167. package/src/AddTrackWidget/{index.test.jsx → index.test.tsx} +34 -37
  168. package/src/AddTrackWidget/index.ts +17 -2
  169. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalFab.tsx +94 -0
  170. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.tsx +124 -128
  171. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.tsx +47 -228
  172. package/src/HierarchicalTrackSelectorWidget/components/ShoppingCart.tsx +73 -0
  173. package/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap +25 -43
  174. package/src/HierarchicalTrackSelectorWidget/components/{CloseConnectionDialog.tsx → dialogs/CloseConnectionDialog.tsx} +0 -0
  175. package/src/HierarchicalTrackSelectorWidget/components/{DeleteConnectionDialog.tsx → dialogs/DeleteConnectionDialog.tsx} +0 -0
  176. package/src/HierarchicalTrackSelectorWidget/components/{ManageConnectionsDialog.tsx → dialogs/ManageConnectionsDialog.tsx} +0 -0
  177. package/src/HierarchicalTrackSelectorWidget/components/{ToggleConnectionsDialog.tsx → dialogs/ToggleConnectionsDialog.tsx} +0 -0
  178. package/src/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.tsx +138 -0
  179. package/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.tsx +29 -0
  180. package/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.tsx +86 -0
  181. package/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.tsx +339 -0
  182. package/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts +5 -0
  183. package/src/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.tsx +197 -0
  184. package/src/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.tsx +88 -0
  185. package/src/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.tsx +101 -0
  186. package/src/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.tsx +92 -0
  187. package/src/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.tsx +107 -0
  188. package/src/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.tsx +84 -0
  189. package/src/HierarchicalTrackSelectorWidget/components/util.ts +31 -1
  190. package/src/HierarchicalTrackSelectorWidget/index.ts +17 -0
  191. package/src/HierarchicalTrackSelectorWidget/model.ts +12 -9
  192. package/src/PluginStoreWidget/components/PluginStoreWidget.test.tsx +132 -0
  193. package/src/PluginStoreWidget/components/__snapshots__/{PluginStoreWidget.test.js.snap → PluginStoreWidget.test.tsx.snap} +2 -2
  194. package/src/PluginStoreWidget/index.ts +17 -2
  195. package/src/PluginStoreWidget/{model.test.js → model.test.tsx} +0 -0
  196. package/src/__snapshots__/index.test.ts.snap +9 -0
  197. package/src/index.test.ts +54 -0
  198. package/src/index.ts +10 -83
  199. package/src/ucsc-trackhub/index.ts +19 -2
  200. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js.map +0 -1
  201. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js.map +0 -1
  202. package/dist/HierarchicalTrackSelectorWidget/components/Header.js +0 -174
  203. package/dist/HierarchicalTrackSelectorWidget/components/Header.js.map +0 -1
  204. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +0 -1
  205. package/dist/HierarchicalTrackSelectorWidget/components/Node.d.ts +0 -29
  206. package/dist/HierarchicalTrackSelectorWidget/components/Node.js +0 -173
  207. package/dist/HierarchicalTrackSelectorWidget/components/Node.js.map +0 -1
  208. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +0 -1
  209. package/esm/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js.map +0 -1
  210. package/esm/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js.map +0 -1
  211. package/esm/HierarchicalTrackSelectorWidget/components/Header.js +0 -146
  212. package/esm/HierarchicalTrackSelectorWidget/components/Header.js.map +0 -1
  213. package/esm/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +0 -1
  214. package/esm/HierarchicalTrackSelectorWidget/components/Node.d.ts +0 -29
  215. package/esm/HierarchicalTrackSelectorWidget/components/Node.js +0 -144
  216. package/esm/HierarchicalTrackSelectorWidget/components/Node.js.map +0 -1
  217. package/esm/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +0 -1
  218. package/src/HierarchicalTrackSelectorWidget/components/Header.tsx +0 -286
  219. package/src/HierarchicalTrackSelectorWidget/components/Node.tsx +0 -282
  220. package/src/PluginStoreWidget/components/PluginStoreWidget.test.js +0 -123
  221. package/src/__snapshots__/index.test.js.snap +0 -9
  222. package/src/index.test.js +0 -61
@@ -1,7 +1,7 @@
1
1
  import React from 'react'
2
2
  import { createJBrowseTheme } from '@jbrowse/core/ui'
3
3
  import { createTestSession } from '@jbrowse/web/src/rootModel'
4
- import { cleanup, render } from '@testing-library/react'
4
+ import { render } from '@testing-library/react'
5
5
  import { ThemeProvider } from '@mui/material/styles'
6
6
 
7
7
  // locals
@@ -13,140 +13,136 @@ jest.mock('@jbrowse/web/src/makeWorkerInstance', () => () => {})
13
13
  window.requestIdleCallback = cb => cb()
14
14
  window.cancelIdleCallback = () => {}
15
15
 
16
- describe('HierarchicalTrackSelector widget', () => {
17
- afterEach(cleanup)
16
+ test('renders nothing with no assembly', () => {
17
+ const session = createTestSession()
18
+ const firstView = session.addView('LinearGenomeView')
19
+ const model = firstView.activateTrackSelector()
18
20
 
19
- it('renders nothing with no assembly', () => {
20
- const session = createTestSession()
21
- const firstView = session.addView('LinearGenomeView')
22
- const model = firstView.activateTrackSelector()
21
+ const { container } = render(
22
+ <ThemeProvider theme={createJBrowseTheme()}>
23
+ {/* @ts-ignore*/}
24
+ <HierarchicalTrackSelector model={model} />
25
+ </ThemeProvider>,
26
+ )
27
+ expect(container.firstChild).toMatchSnapshot()
28
+ })
23
29
 
24
- const { container } = render(
25
- <ThemeProvider theme={createJBrowseTheme()}>
26
- {/* @ts-ignore*/}
27
- <HierarchicalTrackSelector model={model} />
28
- </ThemeProvider>,
29
- )
30
- expect(container.firstChild).toMatchSnapshot()
30
+ test('renders with a couple of uncategorized tracks', async () => {
31
+ const session = createTestSession()
32
+ session.addAssemblyConf({
33
+ name: 'volMyt1',
34
+ sequence: {
35
+ trackId: 'sequenceConfigId',
36
+ type: 'ReferenceSequenceTrack',
37
+ adapter: {
38
+ type: 'FromConfigSequenceAdapter',
39
+ features: [
40
+ {
41
+ refName: 'ctgA',
42
+ uniqueId: 'firstId',
43
+ start: 0,
44
+ end: 10,
45
+ seq: 'cattgttgcg',
46
+ },
47
+ ],
48
+ },
49
+ },
31
50
  })
32
-
33
- it('renders with a couple of uncategorized tracks', async () => {
34
- const session = createTestSession()
35
- session.addAssemblyConf({
36
- name: 'volMyt1',
37
- sequence: {
38
- trackId: 'sequenceConfigId',
39
- type: 'ReferenceSequenceTrack',
40
- adapter: {
41
- type: 'FromConfigSequenceAdapter',
42
- features: [
43
- {
44
- refName: 'ctgA',
45
- uniqueId: 'firstId',
46
- start: 0,
47
- end: 10,
48
- seq: 'cattgttgcg',
49
- },
50
- ],
51
- },
51
+ session.addTrackConf({
52
+ trackId: 'fooC',
53
+ assemblyNames: ['volMyt1'],
54
+ type: 'FeatureTrack',
55
+ adapter: { type: 'FromConfigAdapter', features: [] },
56
+ })
57
+ session.addTrackConf({
58
+ trackId: 'barC',
59
+ assemblyNames: ['volMyt1'],
60
+ type: 'FeatureTrack',
61
+ adapter: { type: 'FromConfigAdapter', features: [] },
62
+ })
63
+ const firstView = session.addView('LinearGenomeView', {
64
+ displayedRegions: [
65
+ {
66
+ assemblyName: 'volMyt1',
67
+ refName: 'ctgA',
68
+ start: 0,
69
+ end: 1000,
52
70
  },
53
- })
54
- session.addTrackConf({
55
- trackId: 'fooC',
56
- assemblyNames: ['volMyt1'],
57
- type: 'FeatureTrack',
58
- adapter: { type: 'FromConfigAdapter', features: [] },
59
- })
60
- session.addTrackConf({
61
- trackId: 'barC',
62
- assemblyNames: ['volMyt1'],
63
- type: 'FeatureTrack',
64
- adapter: { type: 'FromConfigAdapter', features: [] },
65
- })
66
- const firstView = session.addView('LinearGenomeView', {
67
- displayedRegions: [
68
- {
69
- assemblyName: 'volMyt1',
70
- refName: 'ctgA',
71
- start: 0,
72
- end: 1000,
73
- },
74
- ],
75
- })
76
- firstView.showTrack(session.sessionTracks[0].trackId)
77
- firstView.showTrack(session.sessionTracks[1].trackId)
78
- const model = firstView.activateTrackSelector()
79
-
80
- const { container, findByTestId } = render(
81
- <ThemeProvider theme={createJBrowseTheme()}>
82
- {/* @ts-ignore*/}
83
- <HierarchicalTrackSelector model={model} />
84
- </ThemeProvider>,
85
- )
86
- await findByTestId('hierarchical_track_selector')
87
- expect(container.firstChild).toMatchSnapshot()
71
+ ],
88
72
  })
73
+ firstView.showTrack(session.sessionTracks[0].trackId)
74
+ firstView.showTrack(session.sessionTracks[1].trackId)
75
+ const model = firstView.activateTrackSelector()
89
76
 
90
- it('renders with a couple of categorized tracks', async () => {
91
- const session = createTestSession()
92
- session.addAssemblyConf({
93
- name: 'volMyt1',
94
- sequence: {
95
- trackId: 'sequenceConfigId',
96
- type: 'ReferenceSequenceTrack',
97
- adapter: {
98
- type: 'FromConfigSequenceAdapter',
99
- features: [
100
- {
101
- refName: 'ctgA',
102
- uniqueId: 'firstId',
103
- start: 0,
104
- end: 10,
105
- seq: 'cattgttgcg',
106
- },
107
- ],
108
- },
109
- },
110
- })
77
+ const { container, findByTestId } = render(
78
+ <ThemeProvider theme={createJBrowseTheme()}>
79
+ {/* @ts-ignore*/}
80
+ <HierarchicalTrackSelector model={model} />
81
+ </ThemeProvider>,
82
+ )
83
+ await findByTestId('hierarchical_track_selector')
84
+ expect(container.firstChild).toMatchSnapshot()
85
+ })
111
86
 
112
- session.addTrackConf({
113
- trackId: 'fooC',
114
- assemblyNames: ['volMyt1'],
115
- type: 'FeatureTrack',
116
- adapter: { type: 'FromConfigAdapter', features: [] },
117
- })
118
- session.addTrackConf({
119
- trackId: 'barC',
120
- assemblyNames: ['volMyt1'],
121
- type: 'FeatureTrack',
122
- adapter: { type: 'FromConfigAdapter', features: [] },
123
- })
124
- const firstView = session.addView('LinearGenomeView', {
125
- displayedRegions: [
126
- {
127
- assemblyName: 'volMyt1',
128
- refName: 'ctgA',
129
- start: 0,
130
- end: 1000,
131
- },
132
- ],
133
- })
134
- firstView.showTrack(session.sessionTracks[0].trackId)
135
- firstView.showTrack(session.sessionTracks[1].trackId)
136
- firstView.tracks[0].configuration.category.set(['Foo Category'])
137
- firstView.tracks[1].configuration.category.set([
138
- 'Foo Category',
139
- 'Bar Category',
140
- ])
141
- const model = firstView.activateTrackSelector()
87
+ test('renders with a couple of categorized tracks', async () => {
88
+ const session = createTestSession()
89
+ session.addAssemblyConf({
90
+ name: 'volMyt1',
91
+ sequence: {
92
+ trackId: 'sequenceConfigId',
93
+ type: 'ReferenceSequenceTrack',
94
+ adapter: {
95
+ type: 'FromConfigSequenceAdapter',
96
+ features: [
97
+ {
98
+ refName: 'ctgA',
99
+ uniqueId: 'firstId',
100
+ start: 0,
101
+ end: 10,
102
+ seq: 'cattgttgcg',
103
+ },
104
+ ],
105
+ },
106
+ },
107
+ })
142
108
 
143
- const { container, findByTestId } = render(
144
- <ThemeProvider theme={createJBrowseTheme()}>
145
- {/* @ts-ignore*/}
146
- <HierarchicalTrackSelector model={model} />
147
- </ThemeProvider>,
148
- )
149
- await findByTestId('hierarchical_track_selector')
150
- expect(container.firstChild).toMatchSnapshot()
109
+ session.addTrackConf({
110
+ trackId: 'fooC',
111
+ assemblyNames: ['volMyt1'],
112
+ type: 'FeatureTrack',
113
+ adapter: { type: 'FromConfigAdapter', features: [] },
114
+ })
115
+ session.addTrackConf({
116
+ trackId: 'barC',
117
+ assemblyNames: ['volMyt1'],
118
+ type: 'FeatureTrack',
119
+ adapter: { type: 'FromConfigAdapter', features: [] },
151
120
  })
121
+ const firstView = session.addView('LinearGenomeView', {
122
+ displayedRegions: [
123
+ {
124
+ assemblyName: 'volMyt1',
125
+ refName: 'ctgA',
126
+ start: 0,
127
+ end: 1000,
128
+ },
129
+ ],
130
+ })
131
+ firstView.showTrack(session.sessionTracks[0].trackId)
132
+ firstView.showTrack(session.sessionTracks[1].trackId)
133
+ firstView.tracks[0].configuration.category.set(['Foo Category'])
134
+ firstView.tracks[1].configuration.category.set([
135
+ 'Foo Category',
136
+ 'Bar Category',
137
+ ])
138
+ const model = firstView.activateTrackSelector()
139
+
140
+ const { container, findByTestId } = render(
141
+ <ThemeProvider theme={createJBrowseTheme()}>
142
+ {/* @ts-ignore*/}
143
+ <HierarchicalTrackSelector model={model} />
144
+ </ThemeProvider>,
145
+ )
146
+ await findByTestId('hierarchical_track_selector')
147
+ expect(container.firstChild).toMatchSnapshot()
152
148
  })
@@ -1,127 +1,12 @@
1
- import React, { useCallback, useMemo, useState, useRef, useEffect } from 'react'
2
- import { Fab, Menu, MenuItem } from '@mui/material'
3
- import { makeStyles } from 'tss-react/mui'
4
- import {
5
- getSession,
6
- isSessionModelWithWidgets,
7
- isSessionModelWithConnections,
8
- isSessionWithAddTracks,
9
- } from '@jbrowse/core/util'
1
+ import React, { useState } from 'react'
10
2
  import { observer } from 'mobx-react'
11
- import { VariableSizeTree } from 'react-vtree'
12
3
  import AutoSizer from 'react-virtualized-auto-sizer'
13
4
 
14
- // icons
15
- import AddIcon from '@mui/icons-material/Add'
16
-
17
5
  // locals
18
6
  import { TreeNode, HierarchicalTrackSelectorModel } from '../model'
19
- import Header from './Header'
20
- import Node from './Node'
21
-
22
- const useStyles = makeStyles()(theme => ({
23
- fab: {
24
- position: 'absolute',
25
- bottom: theme.spacing(6),
26
- right: theme.spacing(6),
27
- },
28
- }))
29
-
30
- function getNodeData(
31
- node: TreeNode,
32
- nestingLevel: number,
33
- extra: Record<string, unknown>,
34
- selection: Record<string, unknown>,
35
- ) {
36
- const isLeaf = !!node.conf
37
- const selected = !!selection[node.id]
38
- return {
39
- data: {
40
- defaultHeight: isLeaf ? 22 : 40,
41
- isLeaf,
42
- isOpenByDefault: true,
43
- nestingLevel,
44
- selected,
45
- ...node,
46
- ...extra,
47
- },
48
- nestingLevel,
49
- node,
50
- }
51
- }
52
-
53
- type NodeData = ReturnType<typeof getNodeData>
54
-
55
- // this is the main tree component for the hierarchical track selector in note:
56
- // in jbrowse-web the toolbar is position="sticky" which means the autosizer
57
- // includes the height of the toolbar, so we subtract the given offsets
58
- const HierarchicalTree = observer(
59
- ({
60
- height,
61
- tree,
62
- model,
63
- }: {
64
- height: number
65
- tree: TreeNode
66
- model: HierarchicalTrackSelectorModel
67
- }) => {
68
- const { filterText, selection, view } = model
69
- const treeRef = useRef<NodeData>(null)
70
- const session = getSession(model)
71
- const { drawerPosition } = session
72
- const obj = useMemo(
73
- () => Object.fromEntries(selection.map(s => [s.trackId, s])),
74
- [selection],
75
- )
76
-
77
- const extra = useMemo(
78
- () => ({
79
- onChange: (trackId: string) => view.toggleTrack(trackId),
80
- toggleCollapse: (pathName: string) => model.toggleCategory(pathName),
81
- tree,
82
- model,
83
- drawerPosition,
84
- }),
85
- [view, model, drawerPosition, tree],
86
- )
87
- const treeWalker = useCallback(
88
- function* treeWalker() {
89
- for (let i = 0; i < tree.children.length; i++) {
90
- const r = tree.children[i]
91
- yield getNodeData(r, 0, extra, obj)
92
- }
93
-
94
- while (true) {
95
- // @ts-ignore
96
- const parentMeta = yield
97
-
98
- for (let i = 0; i < parentMeta.node.children.length; i++) {
99
- const curr = parentMeta.node.children[i]
100
- yield getNodeData(curr, parentMeta.nestingLevel + 1, extra, obj)
101
- }
102
- }
103
- },
104
- [tree, extra, obj],
105
- )
106
-
107
- useEffect(() => {
108
- // @ts-ignore
109
- treeRef.current.recomputeTree({
110
- refreshNodes: true,
111
- useDefaultHeight: true,
112
- })
113
- }, [tree, filterText])
114
- return (
115
- <>
116
- {/* @ts-ignore */}
117
- <VariableSizeTree ref={treeRef} treeWalker={treeWalker} height={height}>
118
- {/* @ts-ignore */}
119
- {Node}
120
- </VariableSizeTree>
121
- </>
122
- )
123
- },
124
- )
7
+ import HierarchicalFab from './HierarchicalFab'
8
+ import HierarchicalTree from './tree/HierarchicalTree'
9
+ import HierarchicalHeader from './tree/HierarchicalHeader'
125
10
 
126
11
  // Don't use autosizer in jest and instead hardcode a height, otherwise fails
127
12
  // jest tests
@@ -164,115 +49,49 @@ const Wrapper = ({
164
49
  <>{children}</>
165
50
  )
166
51
  }
167
- const HierarchicalTrackSelectorContainer = observer(
168
- ({
169
- model,
170
- toolbarHeight,
171
- overrideDimensions,
172
- }: {
173
- model: HierarchicalTrackSelectorModel
174
- toolbarHeight: number
175
- overrideDimensions?: { width: number; height: number }
176
- }) => {
177
- const { classes } = useStyles()
178
- const session = getSession(model)
179
- const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null)
180
-
181
- function handleFabClose() {
182
- setAnchorEl(null)
183
- }
184
- const hasConnections = isSessionModelWithConnections(session)
185
- const hasAddTrack = isSessionWithAddTracks(session)
186
- return (
187
- <Wrapper overrideDimensions={overrideDimensions}>
188
- <HierarchicalTrackSelector
189
- model={model}
190
- toolbarHeight={toolbarHeight}
191
- />
192
- {hasAddTrack || hasConnections ? (
193
- <>
194
- <Fab
195
- color="secondary"
196
- className={classes.fab}
197
- onClick={event => setAnchorEl(event.currentTarget)}
198
- >
199
- <AddIcon />
200
- </Fab>
201
- <Menu
202
- anchorEl={anchorEl}
203
- open={Boolean(anchorEl)}
204
- onClose={() => setAnchorEl(null)}
205
- >
206
- {hasConnections ? (
207
- <MenuItem
208
- onClick={() => {
209
- handleFabClose()
210
- if (isSessionModelWithWidgets(session)) {
211
- session.showWidget(
212
- session.addWidget(
213
- 'AddConnectionWidget',
214
- 'addConnectionWidget',
215
- ),
216
- )
217
- }
218
- }}
219
- >
220
- Add connection
221
- </MenuItem>
222
- ) : null}
223
- {hasAddTrack ? (
224
- <MenuItem
225
- onClick={() => {
226
- handleFabClose()
227
- if (isSessionModelWithWidgets(session)) {
228
- session.showWidget(
229
- session.addWidget('AddTrackWidget', 'addTrackWidget', {
230
- view: model.view.id,
231
- }),
232
- )
233
- }
234
- }}
235
- >
236
- Add track
237
- </MenuItem>
238
- ) : null}
239
- </Menu>
240
- </>
241
- ) : null}
242
- </Wrapper>
243
- )
244
- },
245
- )
246
-
247
- const HierarchicalTrackSelector = observer(
248
- ({
249
- model,
250
- toolbarHeight = 0,
251
- }: {
252
- model: HierarchicalTrackSelectorModel
253
- toolbarHeight?: number
254
- }) => {
255
- const [assemblyIdx, setAssemblyIdx] = useState(0)
256
- const [headerHeight, setHeaderHeight] = useState(0)
52
+ const HierarchicalTrackSelectorContainer = observer(function ({
53
+ model,
54
+ toolbarHeight,
55
+ overrideDimensions,
56
+ }: {
57
+ model: HierarchicalTrackSelectorModel
58
+ toolbarHeight: number
59
+ overrideDimensions?: { width: number; height: number }
60
+ }) {
61
+ return (
62
+ <Wrapper overrideDimensions={overrideDimensions}>
63
+ <HierarchicalTrackSelector model={model} toolbarHeight={toolbarHeight} />
64
+ <HierarchicalFab model={model} />
65
+ </Wrapper>
66
+ )
67
+ })
257
68
 
258
- const { assemblyNames } = model
259
- const assemblyName = assemblyNames.length ? assemblyNames[assemblyIdx] : ''
260
- return assemblyName ? (
261
- <>
262
- <Header
263
- model={model}
264
- setHeaderHeight={setHeaderHeight}
265
- setAssemblyIdx={setAssemblyIdx}
266
- assemblyIdx={assemblyIdx}
267
- />
268
- <AutoSizedHierarchicalTree
269
- tree={model.hierarchy(assemblyName)}
270
- model={model}
271
- offset={toolbarHeight + headerHeight}
272
- />
273
- </>
274
- ) : null
275
- },
276
- )
69
+ const HierarchicalTrackSelector = observer(function ({
70
+ model,
71
+ toolbarHeight = 0,
72
+ }: {
73
+ model: HierarchicalTrackSelectorModel
74
+ toolbarHeight?: number
75
+ }) {
76
+ const [assemblyIdx, setAssemblyIdx] = useState(0)
77
+ const [headerHeight, setHeaderHeight] = useState(0)
78
+
79
+ const { assemblyNames } = model
80
+ const assemblyName = assemblyNames[assemblyIdx]
81
+ return assemblyName ? (
82
+ <>
83
+ <HierarchicalHeader
84
+ model={model}
85
+ setHeaderHeight={setHeaderHeight}
86
+ setAssemblyIdx={setAssemblyIdx}
87
+ />
88
+ <AutoSizedHierarchicalTree
89
+ tree={model.hierarchy(assemblyName)}
90
+ model={model}
91
+ offset={toolbarHeight + headerHeight}
92
+ />
93
+ </>
94
+ ) : null
95
+ })
277
96
 
278
97
  export default HierarchicalTrackSelectorContainer
@@ -0,0 +1,73 @@
1
+ import React, { useState } from 'react'
2
+ import { Badge, IconButton } from '@mui/material'
3
+ import { makeStyles } from 'tss-react/mui'
4
+ import { observer } from 'mobx-react'
5
+ import JBrowseMenu, { MenuItem } from '@jbrowse/core/ui/Menu'
6
+ import { getSession, getEnv } from '@jbrowse/core/util'
7
+
8
+ // icons
9
+ import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'
10
+
11
+ // locals
12
+ import { HierarchicalTrackSelectorModel } from '../model'
13
+
14
+ const useStyles = makeStyles()(theme => ({
15
+ searchBox: {
16
+ margin: theme.spacing(2),
17
+ },
18
+ menuIcon: {
19
+ marginRight: theme.spacing(1),
20
+ marginBottom: 0,
21
+ },
22
+ }))
23
+
24
+ export default observer(function ShoppingCart({
25
+ model,
26
+ }: {
27
+ model: HierarchicalTrackSelectorModel
28
+ }) {
29
+ const { classes } = useStyles()
30
+ const { selection } = model
31
+ const { pluginManager } = getEnv(model)
32
+ const session = getSession(model)
33
+ const [selectionEl, setSelectionEl] = useState<HTMLButtonElement>()
34
+ const items = pluginManager.evaluateExtensionPoint(
35
+ 'TrackSelector-multiTrackMenuItems',
36
+ [],
37
+ { session },
38
+ ) as MenuItem[]
39
+
40
+ return (
41
+ <>
42
+ {selection.length ? (
43
+ <IconButton
44
+ className={classes.menuIcon}
45
+ onClick={event => setSelectionEl(event.currentTarget)}
46
+ >
47
+ <Badge badgeContent={selection.length} color="primary">
48
+ <ShoppingCartIcon />
49
+ </Badge>
50
+ </IconButton>
51
+ ) : null}
52
+
53
+ <JBrowseMenu
54
+ anchorEl={selectionEl}
55
+ open={Boolean(selectionEl)}
56
+ onMenuItemClick={(_, callback) => {
57
+ callback()
58
+ setSelectionEl(undefined)
59
+ }}
60
+ onClose={() => setSelectionEl(undefined)}
61
+ menuItems={[
62
+ { label: 'Clear', onClick: () => model.clearSelection() },
63
+ ...items.map(item => ({
64
+ ...item,
65
+ ...('onClick' in item
66
+ ? { onClick: () => item.onClick(model) }
67
+ : {}),
68
+ })),
69
+ ]}
70
+ />
71
+ </>
72
+ )
73
+ })