@jbrowse/plugin-data-management 2.4.2 → 2.6.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 (177) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.d.ts +3 -4
  2. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +24 -45
  3. package/dist/AddConnectionWidget/components/AddConnectionWidget.js.map +1 -1
  4. package/dist/AddConnectionWidget/components/ConfigureConnection.d.ts +4 -4
  5. package/dist/AddConnectionWidget/components/ConfigureConnection.js +1 -3
  6. package/dist/AddConnectionWidget/components/ConfigureConnection.js.map +1 -1
  7. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +5 -5
  8. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +3 -4
  9. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js.map +1 -1
  10. package/dist/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
  11. package/dist/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
  12. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +2 -2
  13. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +2 -2
  14. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -1
  15. package/dist/AddTrackWidget/components/PasteConfigWorkflow.d.ts +2 -2
  16. package/dist/AddTrackWidget/components/PasteConfigWorkflow.js +1 -0
  17. package/dist/AddTrackWidget/components/PasteConfigWorkflow.js.map +1 -1
  18. package/dist/AddTrackWidget/components/TextIndexingConfig.d.ts +3 -3
  19. package/dist/AddTrackWidget/components/TextIndexingConfig.js +4 -10
  20. package/dist/AddTrackWidget/components/TextIndexingConfig.js.map +1 -1
  21. package/dist/AddTrackWidget/components/TrackAdapterSelector.d.ts +2 -2
  22. package/dist/AddTrackWidget/components/TrackSourceSelect.d.ts +2 -2
  23. package/dist/AddTrackWidget/components/TrackTypeSelector.d.ts +2 -2
  24. package/dist/AssemblyManager/AssemblyAddForm.d.ts +2 -2
  25. package/dist/AssemblyManager/AssemblyEditor.d.ts +2 -2
  26. package/dist/AssemblyManager/AssemblyManager.d.ts +2 -2
  27. package/dist/AssemblyManager/AssemblyTable.d.ts +2 -2
  28. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
  29. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.d.ts +2 -2
  30. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +4 -9
  31. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  32. package/dist/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
  33. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +8 -9
  34. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +6 -10
  35. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js.map +1 -1
  36. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -3
  37. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +2 -2
  38. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +3 -4
  39. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +27 -22
  40. package/dist/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js.map +1 -1
  41. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +2 -2
  42. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +2 -2
  43. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
  44. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +7 -1
  45. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js.map +1 -1
  46. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
  47. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +40 -35
  48. package/dist/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js.map +1 -1
  49. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +3 -4
  50. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +36 -41
  51. package/dist/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js.map +1 -1
  52. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
  53. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +2 -2
  54. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js.map +1 -1
  55. package/dist/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +2 -2
  56. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.d.ts +2 -2
  57. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.d.ts +2 -2
  58. package/dist/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.d.ts +2 -2
  59. package/dist/HierarchicalTrackSelectorWidget/configSchema.d.ts +1 -1
  60. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +69 -5
  61. package/dist/HierarchicalTrackSelectorWidget/model.js +100 -53
  62. package/dist/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  63. package/dist/PluginStoreWidget/components/CustomPluginForm.d.ts +2 -2
  64. package/dist/PluginStoreWidget/components/CustomPluginForm.js +10 -33
  65. package/dist/PluginStoreWidget/components/CustomPluginForm.js.map +1 -1
  66. package/dist/PluginStoreWidget/components/InstalledPlugin.d.ts +2 -2
  67. package/dist/PluginStoreWidget/components/InstalledPluginsList.d.ts +2 -2
  68. package/dist/PluginStoreWidget/components/PluginCard.d.ts +2 -2
  69. package/dist/PluginStoreWidget/components/PluginStoreWidget.d.ts +2 -2
  70. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +5 -8
  71. package/dist/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  72. package/dist/SetDefaultSession/SetDefaultSession.d.ts +2 -2
  73. package/dist/index.d.ts +4 -4
  74. package/dist/ucsc-trackhub/configSchema.d.ts +32 -1
  75. package/dist/ucsc-trackhub/model.d.ts +38 -1
  76. package/dist/ucsc-trackhub/model.js +47 -13
  77. package/dist/ucsc-trackhub/model.js.map +1 -1
  78. package/esm/AddConnectionWidget/components/AddConnectionWidget.d.ts +3 -4
  79. package/esm/AddConnectionWidget/components/AddConnectionWidget.js +24 -45
  80. package/esm/AddConnectionWidget/components/AddConnectionWidget.js.map +1 -1
  81. package/esm/AddConnectionWidget/components/ConfigureConnection.d.ts +4 -4
  82. package/esm/AddConnectionWidget/components/ConfigureConnection.js +1 -3
  83. package/esm/AddConnectionWidget/components/ConfigureConnection.js.map +1 -1
  84. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.d.ts +5 -5
  85. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js +3 -4
  86. package/esm/AddConnectionWidget/components/ConnectionTypeSelect.js.map +1 -1
  87. package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
  88. package/esm/AddTrackWidget/components/ConfirmTrack.d.ts +2 -2
  89. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +2 -2
  90. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +2 -2
  91. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -1
  92. package/esm/AddTrackWidget/components/PasteConfigWorkflow.d.ts +2 -2
  93. package/esm/AddTrackWidget/components/PasteConfigWorkflow.js +1 -0
  94. package/esm/AddTrackWidget/components/PasteConfigWorkflow.js.map +1 -1
  95. package/esm/AddTrackWidget/components/TextIndexingConfig.d.ts +3 -3
  96. package/esm/AddTrackWidget/components/TextIndexingConfig.js +4 -10
  97. package/esm/AddTrackWidget/components/TextIndexingConfig.js.map +1 -1
  98. package/esm/AddTrackWidget/components/TrackAdapterSelector.d.ts +2 -2
  99. package/esm/AddTrackWidget/components/TrackSourceSelect.d.ts +2 -2
  100. package/esm/AddTrackWidget/components/TrackTypeSelector.d.ts +2 -2
  101. package/esm/AssemblyManager/AssemblyAddForm.d.ts +2 -2
  102. package/esm/AssemblyManager/AssemblyEditor.d.ts +2 -2
  103. package/esm/AssemblyManager/AssemblyManager.d.ts +2 -2
  104. package/esm/AssemblyManager/AssemblyTable.d.ts +2 -2
  105. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalFab.d.ts +2 -2
  106. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.d.ts +2 -2
  107. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +4 -9
  108. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  109. package/esm/HierarchicalTrackSelectorWidget/components/ShoppingCart.d.ts +2 -2
  110. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.d.ts +8 -9
  111. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js +7 -11
  112. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.js.map +1 -1
  113. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.d.ts +3 -3
  114. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ManageConnectionsDialog.d.ts +2 -2
  115. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.d.ts +3 -4
  116. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js +27 -22
  117. package/esm/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.js.map +1 -1
  118. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetFilters.d.ts +2 -2
  119. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedDialog.d.ts +2 -2
  120. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.d.ts +5 -3
  121. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js +7 -1
  122. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.js.map +1 -1
  123. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.d.ts +2 -2
  124. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js +41 -36
  125. package/esm/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.js.map +1 -1
  126. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.d.ts +3 -4
  127. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js +37 -42
  128. package/esm/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.js.map +1 -1
  129. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.d.ts +3 -4
  130. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js +2 -2
  131. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.js.map +1 -1
  132. package/esm/HierarchicalTrackSelectorWidget/components/tree/HierarchicalTree.d.ts +2 -2
  133. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackCategory.d.ts +2 -2
  134. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackLabel.d.ts +2 -2
  135. package/esm/HierarchicalTrackSelectorWidget/components/tree/TrackListNode.d.ts +2 -2
  136. package/esm/HierarchicalTrackSelectorWidget/configSchema.d.ts +1 -1
  137. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +69 -5
  138. package/esm/HierarchicalTrackSelectorWidget/model.js +101 -54
  139. package/esm/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  140. package/esm/PluginStoreWidget/components/CustomPluginForm.d.ts +2 -2
  141. package/esm/PluginStoreWidget/components/CustomPluginForm.js +10 -33
  142. package/esm/PluginStoreWidget/components/CustomPluginForm.js.map +1 -1
  143. package/esm/PluginStoreWidget/components/InstalledPlugin.d.ts +2 -2
  144. package/esm/PluginStoreWidget/components/InstalledPluginsList.d.ts +2 -2
  145. package/esm/PluginStoreWidget/components/PluginCard.d.ts +2 -2
  146. package/esm/PluginStoreWidget/components/PluginStoreWidget.d.ts +2 -2
  147. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +5 -8
  148. package/esm/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  149. package/esm/SetDefaultSession/SetDefaultSession.d.ts +2 -2
  150. package/esm/index.d.ts +4 -4
  151. package/esm/ucsc-trackhub/configSchema.d.ts +32 -1
  152. package/esm/ucsc-trackhub/model.d.ts +38 -1
  153. package/esm/ucsc-trackhub/model.js +22 -11
  154. package/esm/ucsc-trackhub/model.js.map +1 -1
  155. package/package.json +3 -3
  156. package/src/AddConnectionWidget/components/AddConnectionWidget.test.tsx +1 -3
  157. package/src/AddConnectionWidget/components/AddConnectionWidget.tsx +46 -85
  158. package/src/AddConnectionWidget/components/ConfigureConnection.tsx +17 -18
  159. package/src/AddConnectionWidget/components/ConnectionTypeSelect.tsx +7 -6
  160. package/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.tsx.snap +1 -0
  161. package/src/AddTrackWidget/components/DefaultAddTrackWorkflow.tsx +2 -2
  162. package/src/AddTrackWidget/components/PasteConfigWorkflow.tsx +1 -0
  163. package/src/AddTrackWidget/components/TextIndexingConfig.tsx +10 -10
  164. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.tsx +11 -21
  165. package/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.tsx.snap +89 -24
  166. package/src/HierarchicalTrackSelectorWidget/components/dialogs/CloseConnectionDialog.tsx +9 -13
  167. package/src/HierarchicalTrackSelectorWidget/components/dialogs/DeleteConnectionDialog.tsx +1 -1
  168. package/src/HierarchicalTrackSelectorWidget/components/dialogs/ToggleConnectionsDialog.tsx +69 -39
  169. package/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedHeader.tsx +10 -0
  170. package/src/HierarchicalTrackSelectorWidget/components/faceted/FacetedSelector.tsx +31 -27
  171. package/src/HierarchicalTrackSelectorWidget/components/tree/HamburgerMenu.tsx +46 -51
  172. package/src/HierarchicalTrackSelectorWidget/components/tree/HierarchicalHeader.tsx +1 -3
  173. package/src/HierarchicalTrackSelectorWidget/model.ts +120 -65
  174. package/src/PluginStoreWidget/components/CustomPluginForm.tsx +11 -36
  175. package/src/PluginStoreWidget/components/PluginStoreWidget.tsx +7 -10
  176. package/src/PluginStoreWidget/model.test.tsx +1 -1
  177. package/src/ucsc-trackhub/model.ts +30 -27
@@ -5,8 +5,10 @@ import { observer } from 'mobx-react'
5
5
  import JBrowseMenu from '@jbrowse/core/ui/Menu'
6
6
  import {
7
7
  getSession,
8
- isSessionModelWithWidgets,
8
+ isSessionModelWithConnectionEditing,
9
9
  isSessionModelWithConnections,
10
+ isSessionModelWithWidgets,
11
+ isSessionWithAddTracks,
10
12
  } from '@jbrowse/core/util'
11
13
  import {
12
14
  AnyConfigurationModel,
@@ -42,7 +44,7 @@ const useStyles = makeStyles()(theme => ({
42
44
 
43
45
  interface ModalArgs {
44
46
  connectionConf: AnyConfigurationModel
45
- safelyBreakConnection: Function
47
+ safelyBreakConnection: () => void
46
48
  dereferenceTypeCount: { [key: string]: number }
47
49
  name: string
48
50
  }
@@ -54,10 +56,8 @@ interface DialogDetails {
54
56
 
55
57
  export default observer(function HamburgerMenu({
56
58
  model,
57
- setAssemblyIdx,
58
59
  }: {
59
60
  model: HierarchicalTrackSelectorModel
60
- setAssemblyIdx: Function
61
61
  }) {
62
62
  const session = getSession(model)
63
63
  const [menuEl, setMenuEl] = useState<HTMLButtonElement>()
@@ -66,7 +66,6 @@ export default observer(function HamburgerMenu({
66
66
  const [connectionToggleOpen, setConnectionToggleOpen] = useState(false)
67
67
  const [connectionManagerOpen, setConnectionManagerOpen] = useState(false)
68
68
  const { classes } = useStyles()
69
- const { assemblyNames } = model
70
69
 
71
70
  function breakConnection(
72
71
  connectionConf: AnyConfigurationModel,
@@ -92,30 +91,6 @@ export default observer(function HamburgerMenu({
92
91
  }
93
92
  }
94
93
 
95
- const connectionMenuItems = [
96
- {
97
- label: 'Turn on/off connections...',
98
- onClick: () => setConnectionToggleOpen(true),
99
- },
100
- ]
101
-
102
- if (isSessionModelWithConnections(session)) {
103
- connectionMenuItems.unshift({
104
- label: 'Add connection...',
105
- onClick: () => {
106
- if (isSessionModelWithWidgets(session)) {
107
- session.showWidget(
108
- session.addWidget('AddConnectionWidget', 'addConnectionWidget'),
109
- )
110
- }
111
- },
112
- })
113
-
114
- connectionMenuItems.push({
115
- label: 'Delete connections...',
116
- onClick: () => setConnectionManagerOpen(true),
117
- })
118
- }
119
94
  return (
120
95
  <>
121
96
  <IconButton
@@ -134,38 +109,58 @@ export default observer(function HamburgerMenu({
134
109
  }}
135
110
  onClose={() => setMenuEl(undefined)}
136
111
  menuItems={[
137
- {
138
- label: 'Add track...',
139
- onClick: () => {
140
- if (isSessionModelWithWidgets(session)) {
141
- session.showWidget(
142
- session.addWidget('AddTrackWidget', 'addTrackWidget', {
143
- view: model.view.id,
144
- }),
145
- )
146
- }
147
- },
148
- },
149
- ...(session.makeConnection ? connectionMenuItems : []),
150
-
151
- ...(assemblyNames.length > 1
112
+ ...(isSessionWithAddTracks(session)
113
+ ? [
114
+ {
115
+ label: 'Add track...',
116
+ onClick: () => {
117
+ if (isSessionModelWithWidgets(session)) {
118
+ session.showWidget(
119
+ session.addWidget('AddTrackWidget', 'addTrackWidget', {
120
+ view: model.view.id,
121
+ }),
122
+ )
123
+ }
124
+ },
125
+ },
126
+ ]
127
+ : []),
128
+ ...(isSessionModelWithConnections(session)
152
129
  ? [
153
130
  {
154
- label: 'Select assembly...',
155
- subMenu: assemblyNames.map((name, idx) => ({
156
- label: name,
157
- onClick: () => setAssemblyIdx(idx),
158
- })),
131
+ label: 'Turn on/off connections...',
132
+ onClick: () => setConnectionToggleOpen(true),
133
+ },
134
+ ]
135
+ : []),
136
+ ...(isSessionModelWithConnectionEditing(session)
137
+ ? [
138
+ {
139
+ label: 'Add connection...',
140
+ onClick: () => {
141
+ if (isSessionModelWithWidgets(session)) {
142
+ session.showWidget(
143
+ session.addWidget(
144
+ 'AddConnectionWidget',
145
+ 'addConnectionWidget',
146
+ ),
147
+ )
148
+ }
149
+ },
150
+ },
151
+ {
152
+ label: 'Delete connections...',
153
+ onClick: () => setConnectionManagerOpen(true),
159
154
  },
160
155
  ]
161
156
  : []),
162
157
  ]}
163
158
  />
164
- <Suspense fallback={<div />}>
159
+ <Suspense fallback={<React.Fragment />}>
165
160
  {modalInfo ? (
166
161
  <CloseConnectionDlg
167
162
  modalInfo={modalInfo}
168
- setModalInfo={setModalInfo}
163
+ onClose={() => setModalInfo(undefined)}
169
164
  />
170
165
  ) : null}
171
166
  {deleteDlgDetails ? (
@@ -27,11 +27,9 @@ const useStyles = makeStyles()(theme => ({
27
27
  function HierarchicalTrackSelectorHeader({
28
28
  model,
29
29
  setHeaderHeight,
30
- setAssemblyIdx,
31
30
  }: {
32
31
  model: HierarchicalTrackSelectorModel
33
32
  setHeaderHeight: (n: number) => void
34
- setAssemblyIdx: (n: number) => void
35
33
  }) {
36
34
  const { classes } = useStyles()
37
35
  const [facetedOpen, setFacetedOpen] = useState(false)
@@ -43,7 +41,7 @@ function HierarchicalTrackSelectorHeader({
43
41
  data-testid="hierarchical_track_selector"
44
42
  >
45
43
  <div style={{ display: 'flex' }}>
46
- <HamburgerMenu model={model} setAssemblyIdx={setAssemblyIdx} />
44
+ <HamburgerMenu model={model} />
47
45
  <ShoppingCart model={model} />
48
46
 
49
47
  <TextField
@@ -9,6 +9,7 @@ import {
9
9
  dedupe,
10
10
  getSession,
11
11
  getEnv,
12
+ notEmpty,
12
13
  } from '@jbrowse/core/util'
13
14
  import { getTrackName } from '@jbrowse/core/util/tracks'
14
15
  import { ElementId } from '@jbrowse/core/util/types/mst'
@@ -49,22 +50,34 @@ export type TreeNode = {
49
50
 
50
51
  function filterTracks(
51
52
  tracks: AnyConfigurationModel[],
52
- self: { view: { type: string } },
53
- assemblyName: string,
53
+ self: {
54
+ view: { type: string; trackSelectorAnyOverlap?: boolean }
55
+ assemblyNames: string[]
56
+ },
54
57
  ) {
55
58
  const { assemblyManager } = getSession(self)
56
59
  const { pluginManager } = getEnv(self)
57
- const assembly = assemblyManager.get(assemblyName)
60
+ const { view } = self
61
+ const { trackSelectorAnyOverlap } = view
62
+ const trackListAssemblies = self.assemblyNames
63
+ .map(a => assemblyManager.get(a))
64
+ .filter(notEmpty)
58
65
 
59
- if (!assembly) {
60
- return []
61
- }
62
- const { allAliases } = assembly
63
66
  return tracks
64
- .filter(c => hasAnyOverlap(allAliases, readConfObject(c, 'assemblyNames')))
65
67
  .filter(c => {
66
- const { displayTypes } = pluginManager.getViewType(self.view.type)
67
- const compatDisplays = displayTypes.map((d: { name: string }) => d.name)
68
+ const trackAssemblyNames = readConfObject(c, 'assemblyNames') as string[]
69
+ const trackAssemblies = new Set(
70
+ trackAssemblyNames
71
+ ?.map(name => assemblyManager.get(name))
72
+ .filter(notEmpty) || [],
73
+ )
74
+ return trackSelectorAnyOverlap
75
+ ? trackListAssemblies.some(a => trackAssemblies.has(a))
76
+ : trackListAssemblies.every(a => trackAssemblies.has(a))
77
+ })
78
+ .filter(c => {
79
+ const { displayTypes } = pluginManager.getViewType(view.type)
80
+ const compatDisplays = displayTypes.map(d => d.name)
68
81
  const trackDisplays = c.displays.map((d: { type: string }) => d.type)
69
82
  return hasAnyOverlap(compatDisplays, trackDisplays)
70
83
  })
@@ -132,12 +145,27 @@ export function generateHierarchy(
132
145
  return hierarchy.children
133
146
  }
134
147
 
148
+ /**
149
+ * #stateModel HierarchicalTrackSelectorWidget
150
+ */
135
151
  export default function stateTreeFactory(pluginManager: PluginManager) {
136
152
  return types
137
153
  .model('HierarchicalTrackSelectorWidget', {
154
+ /**
155
+ * #property
156
+ */
138
157
  id: ElementId,
158
+ /**
159
+ * #property
160
+ */
139
161
  type: types.literal('HierarchicalTrackSelectorWidget'),
162
+ /**
163
+ * #property
164
+ */
140
165
  collapsed: types.map(types.boolean),
166
+ /**
167
+ * #property
168
+ */
141
169
  view: types.safeReference(
142
170
  pluginManager.pluggableMstType('view', 'stateModel'),
143
171
  ),
@@ -147,33 +175,62 @@ export default function stateTreeFactory(pluginManager: PluginManager) {
147
175
  filterText: '',
148
176
  }))
149
177
  .actions(self => ({
178
+ /**
179
+ * #action
180
+ */
150
181
  setSelection(elt: AnyConfigurationModel[]) {
151
182
  self.selection = elt
152
183
  },
184
+ /**
185
+ * #action
186
+ */
153
187
  addToSelection(elt: AnyConfigurationModel[]) {
154
188
  self.selection = dedupe([...self.selection, ...elt], e => e.trackId)
155
189
  },
190
+ /**
191
+ * #action
192
+ */
156
193
  removeFromSelection(elt: AnyConfigurationModel[]) {
157
194
  self.selection = self.selection.filter(f => !elt.includes(f))
158
195
  },
196
+ /**
197
+ * #action
198
+ */
159
199
  clearSelection() {
160
200
  self.selection = []
161
201
  },
202
+ /**
203
+ * #action
204
+ */
162
205
  setView(view: unknown) {
163
206
  self.view = view
164
207
  },
208
+ /**
209
+ * #action
210
+ */
165
211
  toggleCategory(pathName: string) {
166
212
  self.collapsed.set(pathName, !self.collapsed.get(pathName))
167
213
  },
214
+ /**
215
+ * #action
216
+ */
168
217
  clearFilterText() {
169
218
  self.filterText = ''
170
219
  },
220
+ /**
221
+ * #action
222
+ */
171
223
  setFilterText(newText: string) {
172
224
  self.filterText = newText
173
225
  },
174
226
  }))
175
227
  .views(self => ({
176
- getRefSeqTrackConf(assemblyName: string) {
228
+ /**
229
+ * #method
230
+ */
231
+ getRefSeqTrackConf(
232
+ assemblyName: string,
233
+ ): AnyConfigurationModel | undefined {
177
234
  const { assemblyManager } = getSession(self)
178
235
  const assembly = assemblyManager.get(assemblyName)
179
236
  const trackConf = assembly?.configuration.sequence
@@ -186,71 +243,67 @@ export default function stateTreeFactory(pluginManager: PluginManager) {
186
243
  return trackConf
187
244
  }
188
245
  }
246
+ return undefined
189
247
  },
190
248
  }))
191
249
  .views(self => ({
192
- trackConfigurations(assemblyName: string) {
193
- if (!self.view) {
194
- return []
195
- }
196
- const { tracks, assemblyManager } = getSession(self)
197
- const assembly = assemblyManager.get(assemblyName)
198
- if (!assembly) {
199
- return []
200
- }
201
- const refseq = self.getRefSeqTrackConf(assemblyName)
202
- // filter out tracks that don't match the current assembly (check all
203
- // assembly aliases) and display types
204
- return [
205
- ...(refseq ? [refseq] : []),
206
- ...filterTracks(tracks, self, assemblyName),
207
- ]
208
- },
209
-
250
+ /**
251
+ * #getter
252
+ */
210
253
  get assemblyNames(): string[] {
211
254
  return self.view?.assemblyNames || []
212
255
  },
256
+ }))
257
+ .views(self => ({
258
+ /**
259
+ * #method
260
+ * filter out tracks that don't match the current display types
261
+ */
262
+ connectionTrackConfigurations(connection: {
263
+ tracks: AnyConfigurationModel[]
264
+ }) {
265
+ return !self.view ? [] : filterTracks(connection.tracks, self)
266
+ },
213
267
 
214
- connectionTrackConfigurations(
215
- assemblyName: string,
216
- connection: { tracks: AnyConfigurationModel[] },
217
- ) {
218
- if (!self.view) {
219
- return []
220
- }
221
-
222
- // filter out tracks that don't match the current display types
223
- return filterTracks(connection.tracks, self, assemblyName)
268
+ /**
269
+ * #getter
270
+ * filter out tracks that don't match the current assembly/display types
271
+ */
272
+ get trackConfigurations(): AnyConfigurationModel[] {
273
+ return !self.view
274
+ ? ([] as AnyConfigurationModel[])
275
+ : [
276
+ ...self.assemblyNames.map(a => self.getRefSeqTrackConf(a)),
277
+ ...filterTracks(getSession(self).tracks, self),
278
+ ].filter(notEmpty)
224
279
  },
225
280
  }))
226
281
  .views(self => ({
227
- hierarchy(assemblyName: string) {
282
+ /**
283
+ * #getter
284
+ */
285
+ get hierarchy() {
228
286
  const hier = generateHierarchy(
229
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
230
- self as any,
231
- self.trackConfigurations(assemblyName),
287
+ self as HierarchicalTrackSelectorModel,
288
+ self.trackConfigurations,
232
289
  self.collapsed,
233
290
  )
234
291
 
235
292
  const session = getSession(self)
236
293
  const { connectionInstances } = session
237
294
 
238
- const { assemblyManager } = getSession(self)
239
- const assembly = assemblyManager.get(assemblyName)
240
295
  const conns =
241
- (assembly &&
242
- connectionInstances
243
- ?.map(c => ({
244
- // @ts-expect-error
245
- id: getSnapshot(c).configuration,
246
- name: getConf(c, 'name'),
247
- children: this.connectionHierarchy(assemblyName, c),
248
- state: {
249
- expanded: true,
250
- },
251
- }))
252
- .filter(f => f.children.length)) ||
253
- []
296
+ connectionInstances
297
+ ?.map(c => ({
298
+ // @ts-expect-error
299
+ id: getSnapshot(c).configuration,
300
+ name: getConf(c, 'name'),
301
+ children: this.connectionHierarchy(c),
302
+ state: {
303
+ expanded: true,
304
+ },
305
+ }))
306
+ .filter(f => f.children.length) || []
254
307
 
255
308
  return {
256
309
  name: 'Root',
@@ -262,14 +315,16 @@ export default function stateTreeFactory(pluginManager: PluginManager) {
262
315
  }
263
316
  },
264
317
 
265
- connectionHierarchy(
266
- assemblyName: string,
267
- connection: { name: string; tracks: AnyConfigurationModel[] },
268
- ) {
318
+ /**
319
+ * #method
320
+ */
321
+ connectionHierarchy(connection: {
322
+ name: string
323
+ tracks: AnyConfigurationModel[]
324
+ }) {
269
325
  return generateHierarchy(
270
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
271
- self as any,
272
- self.connectionTrackConfigurations(assemblyName, connection),
326
+ self as HierarchicalTrackSelectorModel,
327
+ self.connectionTrackConfigurations(connection),
273
328
  self.collapsed,
274
329
  connection.name,
275
330
  )
@@ -1,11 +1,10 @@
1
1
  import React, { useState } from 'react'
2
2
  import { observer } from 'mobx-react'
3
3
  import { getRoot } from 'mobx-state-tree'
4
- import { PluginDefinition } from '@jbrowse/core/PluginLoader'
4
+ import { Dialog } from '@jbrowse/core/ui'
5
5
  import {
6
6
  Button,
7
7
  Collapse,
8
- Dialog,
9
8
  DialogActions,
10
9
  DialogContent,
11
10
  DialogContentText,
@@ -53,26 +52,6 @@ function CustomPluginForm({
53
52
  const [cjsPluginUrl, setCJSPluginUrl] = useState('')
54
53
  const [advancedOptionsOpen, setAdvancedOptionsOpen] = useState(false)
55
54
 
56
- function handleChange(event: React.ChangeEvent<HTMLTextAreaElement>) {
57
- const { name, value } = event.target
58
- if (name === 'umdName') {
59
- setUMDPluginName(value)
60
- }
61
- if (name === 'umdUrl') {
62
- setUMDPluginUrl(value)
63
- }
64
- if (name === 'esmUrl') {
65
- setESMPluginUrl(value)
66
- }
67
- if (name === 'cjsUrl') {
68
- setCJSPluginUrl(value)
69
- }
70
- }
71
-
72
- function handleOpenAdvancedOptions() {
73
- setAdvancedOptionsOpen(!advancedOptionsOpen)
74
- }
75
-
76
55
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
56
  const { jbrowse } = getRoot<any>(model)
78
57
 
@@ -81,21 +60,15 @@ function CustomPluginForm({
81
60
  )
82
61
 
83
62
  function handleSubmit() {
84
- if (!ready) {
85
- return
86
- }
87
- const pluginDefinition: PluginDefinition = {}
88
63
  if (umdPluginName && umdPluginUrl) {
89
- pluginDefinition.name = umdPluginName
90
- pluginDefinition.umdUrl = umdPluginUrl
64
+ jbrowse.addPlugin({ name: umdPluginName, umdUrl: umdPluginUrl })
91
65
  }
92
66
  if (esmPluginUrl) {
93
- pluginDefinition.esmUrl = esmPluginUrl
67
+ jbrowse.addPlugin({ esmUrl: esmPluginUrl })
94
68
  }
95
69
  if (cjsPluginUrl) {
96
- pluginDefinition.cjsUrl = cjsPluginUrl
70
+ jbrowse.addPlugin({ cjsUrl: cjsPluginUrl })
97
71
  }
98
- jbrowse.addPlugin(pluginDefinition)
99
72
  }
100
73
 
101
74
  function handleClose() {
@@ -120,7 +93,7 @@ function CustomPluginForm({
120
93
  label="Plugin name"
121
94
  variant="outlined"
122
95
  value={umdPluginName}
123
- onChange={handleChange}
96
+ onChange={event => setUMDPluginName(event.target.value)}
124
97
  />
125
98
  <TextField
126
99
  id="umd-url-input"
@@ -128,9 +101,11 @@ function CustomPluginForm({
128
101
  label="Plugin URL"
129
102
  variant="outlined"
130
103
  value={umdPluginUrl}
131
- onChange={handleChange}
104
+ onChange={event => setUMDPluginUrl(event.target.value)}
132
105
  />
133
- <DialogContentText onClick={handleOpenAdvancedOptions}>
106
+ <DialogContentText
107
+ onClick={() => setAdvancedOptionsOpen(!advancedOptionsOpen)}
108
+ >
134
109
  <IconButton
135
110
  className={cx(classes.expand, {
136
111
  [classes.expandOpen]: advancedOptionsOpen,
@@ -156,7 +131,7 @@ function CustomPluginForm({
156
131
  label="ESM build URL"
157
132
  variant="outlined"
158
133
  value={esmPluginUrl}
159
- onChange={handleChange}
134
+ onChange={event => setESMPluginUrl(event.target.value)}
160
135
  />
161
136
  <TextField
162
137
  id="cjs-url-input"
@@ -164,7 +139,7 @@ function CustomPluginForm({
164
139
  label="CJS build URL"
165
140
  variant="outlined"
166
141
  value={cjsPluginUrl}
167
- onChange={handleChange}
142
+ onChange={event => setCJSPluginUrl(event.target.value)}
168
143
  />
169
144
  </div>
170
145
  </Collapse>
@@ -154,16 +154,13 @@ function PluginStoreWidget({ model }: { model: PluginStoreModel }) {
154
154
  ) : pluginArray ? (
155
155
  pluginArray
156
156
  .filter(plugin => {
157
- // If pugin only has cjsUrl, don't display outside desktop
158
- if (
159
- !isElectron &&
160
- !(plugin.esmUrl || plugin.url || plugin.umdUrl)
161
- ) {
162
- return false
163
- }
164
- return plugin.name
165
- .toLowerCase()
166
- .includes(model.filterText.toLowerCase())
157
+ // If plugin only has cjsUrl, don't display outside desktop
158
+ return (
159
+ !(isElectron && plugin.cjsUrl) &&
160
+ plugin.name
161
+ .toLowerCase()
162
+ .includes(model.filterText.toLowerCase())
163
+ )
167
164
  })
168
165
  .map(plugin => (
169
166
  <PluginCard
@@ -1,4 +1,4 @@
1
- import { createTestSession } from '@jbrowse/web/src/rootModel'
1
+ import { createTestSession } from '@jbrowse/web/src/rootModel/test_util'
2
2
  jest.mock('@jbrowse/web/src/makeWorkerInstance', () => () => {})
3
3
 
4
4
  describe('PluginStoreModel', () => {