react-msaview 3.1.7 → 3.1.8

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 (270) hide show
  1. package/bundle/index.js +32 -32
  2. package/dist/components/Checkbox2.d.ts +7 -0
  3. package/dist/components/Checkbox2.js +10 -0
  4. package/dist/components/Checkbox2.js.map +1 -0
  5. package/dist/components/Loading.js +12 -4
  6. package/dist/components/Loading.js.map +1 -1
  7. package/dist/components/MSAView.js +5 -8
  8. package/dist/components/MSAView.js.map +1 -1
  9. package/dist/components/SequenceTextArea.d.ts +4 -0
  10. package/dist/components/SequenceTextArea.js +38 -0
  11. package/dist/components/SequenceTextArea.js.map +1 -0
  12. package/dist/components/Track.js +9 -8
  13. package/dist/components/Track.js.map +1 -1
  14. package/dist/components/dialogs/AddTrackDialog.js +0 -1
  15. package/dist/components/dialogs/AddTrackDialog.js.map +1 -1
  16. package/dist/components/{ExportSVGDialog.d.ts → dialogs/ExportSVGDialog.d.ts} +1 -1
  17. package/dist/components/{ExportSVGDialog.js → dialogs/ExportSVGDialog.js} +3 -4
  18. package/dist/components/dialogs/ExportSVGDialog.js.map +1 -0
  19. package/dist/components/dialogs/FeatureDialog.d.ts +7 -0
  20. package/dist/components/dialogs/FeatureDialog.js +52 -0
  21. package/dist/components/dialogs/FeatureDialog.js.map +1 -0
  22. package/dist/components/dialogs/InterProScanDialog.d.ts +7 -0
  23. package/dist/components/dialogs/InterProScanDialog.js +163 -0
  24. package/dist/components/dialogs/InterProScanDialog.js.map +1 -0
  25. package/dist/components/dialogs/MetadataDialog.js +6 -3
  26. package/dist/components/dialogs/MetadataDialog.js.map +1 -1
  27. package/dist/components/dialogs/SettingsDialog.js +6 -11
  28. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  29. package/dist/components/{Header.d.ts → header/Header.d.ts} +1 -1
  30. package/dist/components/header/Header.js +30 -0
  31. package/dist/components/header/Header.js.map +1 -0
  32. package/dist/components/{HeaderInfoArea.d.ts → header/HeaderInfoArea.d.ts} +2 -2
  33. package/dist/components/header/HeaderInfoArea.js +20 -0
  34. package/dist/components/header/HeaderInfoArea.js.map +1 -0
  35. package/dist/components/header/HeaderMenu.d.ts +6 -0
  36. package/dist/components/header/HeaderMenu.js +40 -0
  37. package/dist/components/header/HeaderMenu.js.map +1 -0
  38. package/dist/components/header/HeaderMenuExtra.d.ts +6 -0
  39. package/dist/components/header/HeaderMenuExtra.js +92 -0
  40. package/dist/components/header/HeaderMenuExtra.js.map +1 -0
  41. package/dist/components/header/HeaderStatusArea.d.ts +6 -0
  42. package/dist/components/header/HeaderStatusArea.js +20 -0
  43. package/dist/components/header/HeaderStatusArea.js.map +1 -0
  44. package/dist/components/{MultiAlignmentSelector.d.ts → header/MultiAlignmentSelector.d.ts} +1 -1
  45. package/dist/components/header/MultiAlignmentSelector.js.map +1 -0
  46. package/dist/components/{ZoomControls.d.ts → header/ZoomControls.d.ts} +1 -1
  47. package/dist/components/header/ZoomControls.js +15 -0
  48. package/dist/components/header/ZoomControls.js.map +1 -0
  49. package/dist/components/{ImportForm/index.js → import/ImportForm.js} +1 -1
  50. package/dist/components/import/ImportForm.js.map +1 -0
  51. package/dist/components/{ImportForm → import}/ImportFormExamples.js +6 -2
  52. package/dist/components/import/ImportFormExamples.js.map +1 -0
  53. package/dist/components/import/data/seq2.js.map +1 -0
  54. package/dist/components/import/util.js +10 -0
  55. package/dist/components/import/util.js.map +1 -0
  56. package/dist/components/{Minimap.d.ts → minimap/Minimap.d.ts} +1 -1
  57. package/dist/components/minimap/Minimap.js.map +1 -0
  58. package/dist/components/{MinimapSVG.d.ts → minimap/MinimapSVG.d.ts} +1 -1
  59. package/dist/components/minimap/MinimapSVG.js.map +1 -0
  60. package/dist/components/msa/Loading.js.map +1 -0
  61. package/dist/components/{MSAPanel → msa}/MSACanvas.js +3 -2
  62. package/dist/components/msa/MSACanvas.js.map +1 -0
  63. package/dist/components/{MSAPanel/MSABlock.js → msa/MSACanvasBlock.js} +21 -9
  64. package/dist/components/msa/MSACanvasBlock.js.map +1 -0
  65. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -0
  66. package/dist/components/msa/MSAPanel.d.ts +6 -0
  67. package/dist/components/{MSAPanel/index.js → msa/MSAPanel.js} +6 -3
  68. package/dist/components/msa/MSAPanel.js.map +1 -0
  69. package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +9 -0
  70. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +44 -0
  71. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -0
  72. package/dist/components/{MSAPanel → msa}/renderMSABlock.js +24 -20
  73. package/dist/components/msa/renderMSABlock.js.map +1 -0
  74. package/dist/components/msa/renderMSAMouseover.js.map +1 -0
  75. package/dist/components/tree/TreeBranchMenu.js.map +1 -0
  76. package/dist/components/{TreePanel → tree}/TreeCanvas.js +1 -1
  77. package/dist/components/tree/TreeCanvas.js.map +1 -0
  78. package/dist/components/{TreePanel → tree}/TreeCanvasBlock.js +1 -1
  79. package/dist/components/tree/TreeCanvasBlock.js.map +1 -0
  80. package/dist/components/{TreePanel → tree}/TreeNodeMenu.js +2 -33
  81. package/dist/components/tree/TreeNodeMenu.js.map +1 -0
  82. package/dist/components/{TreePanel/index.js → tree/TreePanel.js} +2 -2
  83. package/dist/components/tree/TreePanel.js.map +1 -0
  84. package/dist/components/tree/TreeRuler.js.map +1 -0
  85. package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.js +6 -2
  86. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -0
  87. package/dist/components/{TreePanel → tree}/renderTreeCanvas.js +23 -37
  88. package/dist/components/tree/renderTreeCanvas.js.map +1 -0
  89. package/dist/fetchUtils.d.ts +5 -0
  90. package/dist/fetchUtils.js +23 -0
  91. package/dist/fetchUtils.js.map +1 -0
  92. package/dist/ggplotPalettes.d.ts +3 -0
  93. package/dist/ggplotPalettes.js +24 -0
  94. package/dist/ggplotPalettes.js.map +1 -0
  95. package/dist/index.d.ts +1 -1
  96. package/dist/index.js +1 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/launchInterProScan.d.ts +32 -0
  99. package/dist/launchInterProScan.js +47 -0
  100. package/dist/launchInterProScan.js.map +1 -0
  101. package/dist/model/DataModel.js.map +1 -0
  102. package/dist/model/DialogQueue.js.map +1 -0
  103. package/dist/model/msaModel.d.ts +14 -0
  104. package/dist/model/msaModel.js +36 -0
  105. package/dist/model/msaModel.js.map +1 -0
  106. package/dist/model/treeModel.d.ts +46 -0
  107. package/dist/model/treeModel.js +105 -0
  108. package/dist/model/treeModel.js.map +1 -0
  109. package/dist/model.d.ts +261 -273
  110. package/dist/model.js +1043 -1029
  111. package/dist/model.js.map +1 -1
  112. package/dist/parseGFF.d.ts +10 -0
  113. package/dist/parseGFF.js +29 -0
  114. package/dist/parseGFF.js.map +1 -0
  115. package/dist/renderToSvg.js +23 -9
  116. package/dist/renderToSvg.js.map +1 -1
  117. package/dist/reparseTree.d.ts +2 -0
  118. package/dist/reparseTree.js +13 -0
  119. package/dist/reparseTree.js.map +1 -0
  120. package/dist/util.d.ts +4 -10
  121. package/dist/util.js +3 -28
  122. package/dist/util.js.map +1 -1
  123. package/dist/version.d.ts +1 -1
  124. package/dist/version.js +1 -1
  125. package/package.json +12 -2
  126. package/src/components/Checkbox2.tsx +34 -0
  127. package/src/components/Loading.tsx +27 -11
  128. package/src/components/MSAView.tsx +6 -10
  129. package/src/components/SequenceTextArea.tsx +63 -0
  130. package/src/components/Track.tsx +8 -13
  131. package/src/components/dialogs/AddTrackDialog.tsx +0 -1
  132. package/src/components/{ExportSVGDialog.tsx → dialogs/ExportSVGDialog.tsx} +9 -16
  133. package/src/components/dialogs/FeatureDialog.tsx +109 -0
  134. package/src/components/dialogs/InterProScanDialog.tsx +230 -0
  135. package/src/components/dialogs/MetadataDialog.tsx +9 -2
  136. package/src/components/dialogs/SettingsDialog.tsx +10 -30
  137. package/src/components/header/Header.tsx +44 -0
  138. package/src/components/header/HeaderInfoArea.tsx +27 -0
  139. package/src/components/header/HeaderMenu.tsx +54 -0
  140. package/src/components/header/HeaderMenuExtra.tsx +108 -0
  141. package/src/components/header/HeaderStatusArea.tsx +31 -0
  142. package/src/components/{MultiAlignmentSelector.tsx → header/MultiAlignmentSelector.tsx} +1 -1
  143. package/src/components/header/ZoomControls.tsx +28 -0
  144. package/src/components/{ImportForm → import}/ImportFormExamples.tsx +12 -1
  145. package/src/components/{ImportForm → import}/util.ts +5 -10
  146. package/src/components/{Minimap.tsx → minimap/Minimap.tsx} +1 -1
  147. package/src/components/{MinimapSVG.tsx → minimap/MinimapSVG.tsx} +1 -1
  148. package/src/components/{MSAPanel → msa}/MSACanvas.tsx +3 -2
  149. package/src/components/{MSAPanel/MSABlock.tsx → msa/MSACanvasBlock.tsx} +25 -12
  150. package/src/components/{MSAPanel/index.tsx → msa/MSAPanel.tsx} +8 -2
  151. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +88 -0
  152. package/src/components/{MSAPanel → msa}/renderMSABlock.ts +26 -20
  153. package/src/components/{TreePanel → tree}/TreeCanvas.tsx +1 -1
  154. package/src/components/{TreePanel → tree}/TreeCanvasBlock.tsx +1 -1
  155. package/src/components/{TreePanel → tree}/TreeNodeMenu.tsx +1 -53
  156. package/src/components/{TreePanel/index.tsx → tree/TreePanel.tsx} +1 -1
  157. package/src/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.tsx +9 -2
  158. package/src/components/{TreePanel → tree}/renderTreeCanvas.ts +25 -41
  159. package/src/fetchUtils.ts +30 -0
  160. package/src/ggplotPalettes.ts +25 -0
  161. package/src/index.ts +1 -1
  162. package/src/launchInterProScan.ts +98 -0
  163. package/src/model/msaModel.ts +39 -0
  164. package/src/model/treeModel.ts +116 -0
  165. package/src/model.ts +1124 -1126
  166. package/src/parseGFF.ts +32 -0
  167. package/src/renderToSvg.tsx +27 -8
  168. package/src/reparseTree.ts +16 -0
  169. package/src/util.ts +4 -33
  170. package/src/version.ts +1 -1
  171. package/dist/DataModel.js.map +0 -1
  172. package/dist/DialogQueue.js.map +0 -1
  173. package/dist/SelectedStructuresMixin.d.ts +0 -46
  174. package/dist/SelectedStructuresMixin.js +0 -52
  175. package/dist/SelectedStructuresMixin.js.map +0 -1
  176. package/dist/StructureModel.d.ts +0 -9
  177. package/dist/StructureModel.js +0 -11
  178. package/dist/StructureModel.js.map +0 -1
  179. package/dist/UniprotTrack.d.ts +0 -27
  180. package/dist/UniprotTrack.js +0 -53
  181. package/dist/UniprotTrack.js.map +0 -1
  182. package/dist/components/BoxTrack.d.ts +0 -7
  183. package/dist/components/BoxTrack.js +0 -15
  184. package/dist/components/BoxTrack.js.map +0 -1
  185. package/dist/components/BoxTrackBlock.d.ts +0 -8
  186. package/dist/components/BoxTrackBlock.js +0 -136
  187. package/dist/components/BoxTrackBlock.js.map +0 -1
  188. package/dist/components/ExportSVGDialog.js.map +0 -1
  189. package/dist/components/Header.js +0 -62
  190. package/dist/components/Header.js.map +0 -1
  191. package/dist/components/HeaderInfoArea.js +0 -12
  192. package/dist/components/HeaderInfoArea.js.map +0 -1
  193. package/dist/components/ImportForm/ImportFormExamples.js.map +0 -1
  194. package/dist/components/ImportForm/data/seq2.js.map +0 -1
  195. package/dist/components/ImportForm/index.js.map +0 -1
  196. package/dist/components/ImportForm/util.js +0 -16
  197. package/dist/components/ImportForm/util.js.map +0 -1
  198. package/dist/components/MSAPanel/Loading.js.map +0 -1
  199. package/dist/components/MSAPanel/MSABlock.js.map +0 -1
  200. package/dist/components/MSAPanel/MSACanvas.js.map +0 -1
  201. package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +0 -1
  202. package/dist/components/MSAPanel/index.d.ts +0 -5
  203. package/dist/components/MSAPanel/index.js.map +0 -1
  204. package/dist/components/MSAPanel/renderMSABlock.js.map +0 -1
  205. package/dist/components/MSAPanel/renderMSAMouseover.js.map +0 -1
  206. package/dist/components/Minimap.js.map +0 -1
  207. package/dist/components/MinimapSVG.js.map +0 -1
  208. package/dist/components/MultiAlignmentSelector.js.map +0 -1
  209. package/dist/components/TreePanel/TreeBranchMenu.js.map +0 -1
  210. package/dist/components/TreePanel/TreeCanvas.js.map +0 -1
  211. package/dist/components/TreePanel/TreeCanvasBlock.js.map +0 -1
  212. package/dist/components/TreePanel/TreeNodeMenu.js.map +0 -1
  213. package/dist/components/TreePanel/TreeRuler.js.map +0 -1
  214. package/dist/components/TreePanel/dialogs/TreeNodeInfoDialog.js.map +0 -1
  215. package/dist/components/TreePanel/index.js.map +0 -1
  216. package/dist/components/TreePanel/renderTreeCanvas.js.map +0 -1
  217. package/dist/components/VerticalGuide.d.ts +0 -7
  218. package/dist/components/VerticalGuide.js +0 -30
  219. package/dist/components/VerticalGuide.js.map +0 -1
  220. package/dist/components/ZoomControls.js +0 -59
  221. package/dist/components/ZoomControls.js.map +0 -1
  222. package/src/SelectedStructuresMixin.ts +0 -59
  223. package/src/StructureModel.ts +0 -11
  224. package/src/UniprotTrack.ts +0 -59
  225. package/src/components/BoxTrack.tsx +0 -33
  226. package/src/components/BoxTrackBlock.tsx +0 -200
  227. package/src/components/Header.tsx +0 -99
  228. package/src/components/HeaderInfoArea.tsx +0 -21
  229. package/src/components/VerticalGuide.tsx +0 -50
  230. package/src/components/ZoomControls.tsx +0 -86
  231. package/dist/components/{MultiAlignmentSelector.js → header/MultiAlignmentSelector.js} +0 -0
  232. package/dist/components/{ImportForm/index.d.ts → import/ImportForm.d.ts} +0 -0
  233. package/dist/components/{ImportForm → import}/ImportFormExamples.d.ts +0 -0
  234. package/dist/components/{ImportForm → import}/data/seq2.d.ts +0 -0
  235. package/dist/components/{ImportForm → import}/data/seq2.js +0 -0
  236. package/dist/components/{ImportForm → import}/util.d.ts +0 -0
  237. package/dist/components/{Minimap.js → minimap/Minimap.js} +0 -0
  238. package/dist/components/{MinimapSVG.js → minimap/MinimapSVG.js} +0 -0
  239. package/dist/components/{MSAPanel → msa}/Loading.d.ts +0 -0
  240. package/dist/components/{MSAPanel → msa}/Loading.js +0 -0
  241. package/dist/components/{MSAPanel → msa}/MSACanvas.d.ts +0 -0
  242. package/dist/components/{MSAPanel/MSABlock.d.ts → msa/MSACanvasBlock.d.ts} +0 -0
  243. package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.d.ts +0 -0
  244. package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.js +0 -0
  245. package/dist/components/{MSAPanel → msa}/renderMSABlock.d.ts +1 -1
  246. /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.d.ts +0 -0
  247. /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.js +0 -0
  248. /package/dist/components/{TreePanel → tree}/TreeBranchMenu.d.ts +0 -0
  249. /package/dist/components/{TreePanel → tree}/TreeBranchMenu.js +0 -0
  250. /package/dist/components/{TreePanel → tree}/TreeCanvas.d.ts +0 -0
  251. /package/dist/components/{TreePanel → tree}/TreeCanvasBlock.d.ts +0 -0
  252. /package/dist/components/{TreePanel → tree}/TreeNodeMenu.d.ts +0 -0
  253. /package/dist/components/{TreePanel/index.d.ts → tree/TreePanel.d.ts} +0 -0
  254. /package/dist/components/{TreePanel → tree}/TreeRuler.d.ts +0 -0
  255. /package/dist/components/{TreePanel → tree}/TreeRuler.js +0 -0
  256. /package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.d.ts +0 -0
  257. /package/dist/components/{TreePanel → tree}/renderTreeCanvas.d.ts +0 -0
  258. /package/dist/{DataModel.d.ts → model/DataModel.d.ts} +0 -0
  259. /package/dist/{DataModel.js → model/DataModel.js} +0 -0
  260. /package/dist/{DialogQueue.d.ts → model/DialogQueue.d.ts} +0 -0
  261. /package/dist/{DialogQueue.js → model/DialogQueue.js} +0 -0
  262. /package/src/components/{ImportForm/index.tsx → import/ImportForm.tsx} +0 -0
  263. /package/src/components/{ImportForm → import}/data/seq2.ts +0 -0
  264. /package/src/components/{MSAPanel → msa}/Loading.tsx +0 -0
  265. /package/src/components/{MSAPanel → msa}/MSAMouseoverCanvas.tsx +0 -0
  266. /package/src/components/{MSAPanel → msa}/renderMSAMouseover.ts +0 -0
  267. /package/src/components/{TreePanel → tree}/TreeBranchMenu.tsx +0 -0
  268. /package/src/components/{TreePanel → tree}/TreeRuler.tsx +0 -0
  269. /package/src/{DataModel.ts → model/DataModel.ts} +0 -0
  270. /package/src/{DialogQueue.ts → model/DialogQueue.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useEffect, lazy, Suspense } from 'react'
1
+ import React, { useState, useRef, useEffect, lazy } from 'react'
2
2
  import normalizeWheel from 'normalize-wheel'
3
3
  import { observer } from 'mobx-react'
4
4
  import { IconButton, Menu, MenuItem } from '@mui/material'
@@ -10,6 +10,7 @@ import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'
10
10
  // locals
11
11
  import { MsaViewModel } from '../model'
12
12
 
13
+ // lazies
13
14
  const TrackInfoDialog = lazy(() => import('./dialogs/TrackInfoDialog'))
14
15
 
15
16
  const useStyles = makeStyles()({
@@ -27,8 +28,7 @@ export const TrackLabel = observer(function ({
27
28
  track: any
28
29
  }) {
29
30
  const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>()
30
- const [trackInfoDialogOpen, setTrackInfoDialogOpen] = useState(false)
31
- const { rowHeight, treeAreaWidth: width } = model
31
+ const { drawLabels, rowHeight, treeAreaWidth: width } = model
32
32
  const {
33
33
  height,
34
34
  model: { name },
@@ -46,7 +46,7 @@ export const TrackLabel = observer(function ({
46
46
  fontSize: trackLabelHeight,
47
47
  }}
48
48
  >
49
- {name}{' '}
49
+ {drawLabels ? name : ''}{' '}
50
50
  <IconButton
51
51
  className={classes.button}
52
52
  style={{
@@ -76,7 +76,10 @@ export const TrackLabel = observer(function ({
76
76
  <MenuItem
77
77
  dense
78
78
  onClick={() => {
79
- setTrackInfoDialogOpen(true)
79
+ model.queueDialog(onClose => [
80
+ TrackInfoDialog,
81
+ { onClose, model: track.model },
82
+ ])
80
83
  setAnchorEl(undefined)
81
84
  }}
82
85
  >
@@ -84,14 +87,6 @@ export const TrackLabel = observer(function ({
84
87
  </MenuItem>
85
88
  </Menu>
86
89
  ) : null}
87
- {trackInfoDialogOpen ? (
88
- <Suspense fallback={null}>
89
- <TrackInfoDialog
90
- model={track.model}
91
- onClose={() => setTrackInfoDialogOpen(false)}
92
- />
93
- </Suspense>
94
- ) : null}
95
90
  </div>
96
91
  )
97
92
  })
@@ -51,7 +51,6 @@ export default observer(function ({
51
51
  onClick={() => {
52
52
  model.setError(undefined)
53
53
  if (trackFile) {
54
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
55
54
  model.setMSAFilehandle(trackFile)
56
55
  }
57
56
  }}
@@ -2,7 +2,6 @@ import React, { useState } from 'react'
2
2
  import { Dialog, ErrorMessage } from '@jbrowse/core/ui'
3
3
  import {
4
4
  Button,
5
- Checkbox,
6
5
  DialogContent,
7
6
  DialogActions,
8
7
  FormControlLabel,
@@ -13,7 +12,9 @@ import {
13
12
  Typography,
14
13
  useTheme,
15
14
  } from '@mui/material'
16
- import { MsaViewModel } from '../model'
15
+ // locals
16
+ import { MsaViewModel } from '../../model'
17
+ import Checkbox2 from '../Checkbox2'
17
18
 
18
19
  export default function ExportSVGDialog({
19
20
  model,
@@ -31,20 +32,12 @@ export default function ExportSVGDialog({
31
32
  <DialogContent>
32
33
  {error ? <ErrorMessage error={error} /> : null}
33
34
  <Typography>Settings:</Typography>
34
- <div>
35
- <FormControl>
36
- <FormControlLabel
37
- control={
38
- <Checkbox
39
- checked={includeMinimap}
40
- onChange={event => setIncludeMinimap(event.target.checked)}
41
- />
42
- }
43
- disabled={exportType === 'entire'}
44
- label="Include minimap?"
45
- />
46
- </FormControl>
47
- </div>
35
+ <Checkbox2
36
+ label="Include minimap?"
37
+ disabled={exportType === 'entire'}
38
+ checked={includeMinimap}
39
+ onChange={() => setIncludeMinimap(!includeMinimap)}
40
+ />
48
41
  <div>
49
42
  <FormControl>
50
43
  <FormLabel>Export type</FormLabel>
@@ -0,0 +1,109 @@
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { Dialog } from '@jbrowse/core/ui'
4
+ import { Button, DialogContent } from '@mui/material'
5
+
6
+ // locals
7
+ import { MsaViewModel } from '../../model'
8
+ import { getPalette } from '../../ggplotPalettes'
9
+
10
+ const Toggles = observer(function ({ model }: { model: MsaViewModel }) {
11
+ const { featureFilters } = model
12
+ return (
13
+ <div>
14
+ <Button
15
+ onClick={() => {
16
+ for (const key of featureFilters.keys()) {
17
+ model.setFilter(key, true)
18
+ }
19
+ }}
20
+ >
21
+ Toggle all on
22
+ </Button>
23
+
24
+ <Button
25
+ onClick={() => {
26
+ for (const key of featureFilters.keys()) {
27
+ model.setFilter(key, false)
28
+ }
29
+ }}
30
+ >
31
+ Toggle all off
32
+ </Button>
33
+ </div>
34
+ )
35
+ })
36
+
37
+ const Table = observer(function ({ model }: { model: MsaViewModel }) {
38
+ const { tidyTypes, featureFilters } = model
39
+ const values = [...tidyTypes.values()]
40
+ const palette = getPalette(values.length - 1)
41
+ return (
42
+ <>
43
+ <Toggles model={model} />
44
+ <table>
45
+ <thead>
46
+ <tr>
47
+ <td></td>
48
+ <td>accession</td>
49
+ <td>name</td>
50
+ <td>description</td>
51
+ </tr>
52
+ </thead>
53
+ <tbody>
54
+ {values.map(({ accession, name, description }, idx) => (
55
+ <tr key={accession}>
56
+ <td>
57
+ <input
58
+ type="checkbox"
59
+ checked={featureFilters.get(accession) ?? false}
60
+ onChange={() =>
61
+ model.setFilter(
62
+ accession,
63
+ !model.featureFilters.get(accession),
64
+ )
65
+ }
66
+ />
67
+ </td>
68
+ <td>{accession}</td>
69
+ <td>{name}</td>
70
+ <td>{description}</td>
71
+ <td>
72
+ <div
73
+ style={{
74
+ width: 20,
75
+ height: 20,
76
+ background: palette[idx] || 'black',
77
+ }}
78
+ ></div>
79
+ </td>
80
+ </tr>
81
+ ))}
82
+ </tbody>
83
+ </table>
84
+ </>
85
+ )
86
+ })
87
+
88
+ const FeatureTypeDialog = observer(function ({
89
+ onClose,
90
+ model,
91
+ }: {
92
+ onClose: () => void
93
+ model: MsaViewModel
94
+ }) {
95
+ return (
96
+ <Dialog
97
+ onClose={() => onClose()}
98
+ open
99
+ title="Feature filters"
100
+ maxWidth="xl"
101
+ >
102
+ <DialogContent>
103
+ <Table model={model} />
104
+ </DialogContent>
105
+ </Dialog>
106
+ )
107
+ })
108
+
109
+ export default FeatureTypeDialog
@@ -0,0 +1,230 @@
1
+ import React, { useState } from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { Dialog } from '@jbrowse/core/ui'
4
+ import { Button, DialogActions, DialogContent, Typography } from '@mui/material'
5
+
6
+ // locals
7
+ import { MsaViewModel } from '../../model'
8
+
9
+ const FeatureTypeDialog = observer(function ({
10
+ onClose,
11
+ model,
12
+ }: {
13
+ onClose: () => void
14
+ model: MsaViewModel
15
+ }) {
16
+ const [vals, setVals] = useState([
17
+ {
18
+ name: 'NCBIfam',
19
+ description: 'NCBI RefSeq FAMs including TIGRFAMs',
20
+ category: 'Families, domains, sites & repeats',
21
+ checked: true,
22
+ },
23
+ {
24
+ name: 'SFLD',
25
+ description: 'Structure function linkage database',
26
+ category: 'Families, domains, sites & repeats',
27
+ checked: true,
28
+ },
29
+ {
30
+ name: 'Phobius',
31
+ checked: true,
32
+ description:
33
+ 'A combined transmembrane topology and signal peptide predictor',
34
+ category: 'Other sequence features',
35
+ },
36
+ {
37
+ name: 'SignalP',
38
+ checked: true,
39
+ category: 'Other sequence features',
40
+ },
41
+ {
42
+ name: 'SignalP_EUK',
43
+ category: 'Other category',
44
+ checked: true,
45
+ },
46
+ {
47
+ name: 'SignalP_GRAM_POSITIVE',
48
+ category: 'Other category',
49
+ checked: true,
50
+ },
51
+ {
52
+ name: 'SignalP_GRAM_NEGATIVE',
53
+ checked: true,
54
+ category: 'Other category',
55
+ },
56
+ {
57
+ name: 'SUPERFAMILY',
58
+ category: 'Structural domains',
59
+ checked: true,
60
+ },
61
+ {
62
+ name: 'PANTHER',
63
+ category: 'Families, domains, sites & repeats',
64
+ checked: true,
65
+ },
66
+ {
67
+ name: 'Gene3D',
68
+ category: 'Structural domains',
69
+ checked: true,
70
+ },
71
+ {
72
+ name: 'Hamap',
73
+ category: 'Families, domains, sites & repeats',
74
+ checked: true,
75
+ },
76
+ {
77
+ name: 'ProSiteProfiles',
78
+ category: 'Families, domains, sites & repeats',
79
+ checked: true,
80
+ },
81
+ {
82
+ name: 'ProSitePatterns',
83
+ category: 'Families, domains, sites & repeats',
84
+ checked: true,
85
+ },
86
+ {
87
+ name: 'Coils',
88
+ category: 'Other sequence features',
89
+ checked: true,
90
+ },
91
+ {
92
+ name: 'SMART',
93
+ category: 'Families, domains, sites & repeats',
94
+ checked: true,
95
+ },
96
+ {
97
+ name: 'CDD',
98
+ description: 'Conserved Domains Database',
99
+ category: 'Families, domains, sites & repeats',
100
+ checked: true,
101
+ },
102
+ {
103
+ name: 'PRINTS',
104
+ category: 'Families, domains, sites & repeats',
105
+ checked: true,
106
+ },
107
+ {
108
+ name: 'Pfam',
109
+ category: 'Families, domains, sites & repeats',
110
+ checked: true,
111
+ },
112
+ {
113
+ name: 'MobiDBLite',
114
+ checked: true,
115
+ category: 'Other sequence features',
116
+ },
117
+ {
118
+ name: 'PIRSF',
119
+ checked: true,
120
+ category: 'Other category',
121
+ },
122
+ {
123
+ name: 'TMHMM',
124
+ checked: true,
125
+ category: 'Other sequence features',
126
+ },
127
+
128
+ {
129
+ name: 'AntiFam',
130
+ checked: true,
131
+ category: 'Other category',
132
+ },
133
+ {
134
+ name: 'FunFam',
135
+ checked: true,
136
+ category: 'Other category',
137
+ },
138
+ {
139
+ name: 'PIRSR',
140
+ checked: true,
141
+ category: 'Families, domains, sites & repeats',
142
+ },
143
+ ])
144
+
145
+ const programs = vals.filter(e => e.checked).map(e => e.name)
146
+ const [show, setShow] = useState(false)
147
+
148
+ return (
149
+ <Dialog onClose={() => onClose()} open title="Feature types" maxWidth="xl">
150
+ <DialogContent>
151
+ <Typography>
152
+ This will run InterProScan on all rows of the current MSA
153
+ </Typography>
154
+ <Button onClick={() => setShow(!show)}>
155
+ {show ? 'Hide' : 'Show'} advanced options
156
+ </Button>
157
+ {show ? (
158
+ <div>
159
+ <Typography>Select algorithms for InterProScan to run</Typography>
160
+ <div>
161
+ <Button
162
+ variant="contained"
163
+ color="secondary"
164
+ onClick={() =>
165
+ setVals(vals.map(v => ({ ...v, checked: false })))
166
+ }
167
+ >
168
+ Select none
169
+ </Button>
170
+ <Button
171
+ variant="contained"
172
+ color="primary"
173
+ onClick={() =>
174
+ setVals(vals.map(v => ({ ...v, checked: true })))
175
+ }
176
+ >
177
+ Select all
178
+ </Button>
179
+ </div>
180
+ <table>
181
+ <tbody>
182
+ {vals
183
+ .sort((a, b) => a.category.localeCompare(b.category))
184
+ .map(({ name, checked, category }) => (
185
+ <tr key={name}>
186
+ <td>
187
+ <input
188
+ type="checkbox"
189
+ key={name}
190
+ checked={checked}
191
+ onChange={() =>
192
+ setVals(
193
+ vals.map(e =>
194
+ e.name === name
195
+ ? { ...e, checked: !e.checked }
196
+ : e,
197
+ ),
198
+ )
199
+ }
200
+ />
201
+ </td>
202
+ <td>{name}</td>
203
+ <td>{category}</td>
204
+ </tr>
205
+ ))}
206
+ </tbody>
207
+ </table>
208
+ </div>
209
+ ) : null}
210
+ </DialogContent>
211
+ <DialogActions>
212
+ <Button variant="contained" color="secondary" onClick={() => onClose()}>
213
+ Cancel
214
+ </Button>
215
+ <Button
216
+ variant="contained"
217
+ color="primary"
218
+ onClick={() => {
219
+ model.queryInterProScan(programs).catch(e => model.setError(e))
220
+ onClose()
221
+ }}
222
+ >
223
+ Send sequences to InterProScan
224
+ </Button>
225
+ </DialogActions>
226
+ </Dialog>
227
+ )
228
+ })
229
+
230
+ export default FeatureTypeDialog
@@ -2,10 +2,14 @@ import React from 'react'
2
2
  import { DialogContent } from '@mui/material'
3
3
  import { observer } from 'mobx-react'
4
4
  import { Dialog } from '@jbrowse/core/ui'
5
- import { Attributes } from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail'
5
+ import {
6
+ Attributes,
7
+ BaseCard,
8
+ } from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail'
6
9
 
7
10
  // locals
8
11
  import { MsaViewModel } from '../../model'
12
+ import SequenceTextArea from '../SequenceTextArea'
9
13
 
10
14
  const MetadataDialog = observer(function ({
11
15
  model,
@@ -17,9 +21,12 @@ const MetadataDialog = observer(function ({
17
21
  const { header } = model
18
22
 
19
23
  return (
20
- <Dialog onClose={() => onClose()} open title="Metadata">
24
+ <Dialog onClose={() => onClose()} open title="Metadata" maxWidth="xl">
21
25
  <DialogContent>
22
26
  <Attributes attributes={header} />
27
+ <BaseCard title="sequence">
28
+ <SequenceTextArea str={model.rows} />
29
+ </BaseCard>
23
30
  </DialogContent>
24
31
  </Dialog>
25
32
  )
@@ -4,11 +4,8 @@ import { makeStyles } from 'tss-react/mui'
4
4
  import { Dialog } from '@jbrowse/core/ui'
5
5
  import {
6
6
  Button,
7
- Checkbox,
8
7
  DialogActions,
9
8
  DialogContent,
10
- FormControlLabel,
11
- FormControlLabelProps,
12
9
  MenuItem,
13
10
  Slider,
14
11
  TextField,
@@ -17,6 +14,7 @@ import {
17
14
 
18
15
  import { MsaViewModel } from '../../model'
19
16
  import colorSchemes from '../../colorSchemes'
17
+ import Checkbox2 from '../Checkbox2'
20
18
 
21
19
  const useStyles = makeStyles()(theme => ({
22
20
  field: {
@@ -27,31 +25,6 @@ const useStyles = makeStyles()(theme => ({
27
25
  },
28
26
  }))
29
27
 
30
- function FormControlLabel2(rest: FormControlLabelProps) {
31
- return (
32
- <div>
33
- <FormControlLabel {...rest} />
34
- </div>
35
- )
36
- }
37
-
38
- function Checkbox2({
39
- checked,
40
- label,
41
- onChange,
42
- }: {
43
- checked: boolean
44
- label: string
45
- onChange: () => void
46
- }) {
47
- return (
48
- <FormControlLabel2
49
- control={<Checkbox checked={checked} onChange={onChange} />}
50
- label={label}
51
- />
52
- )
53
- }
54
-
55
28
  const SettingsContent = observer(function ({ model }: { model: MsaViewModel }) {
56
29
  return (
57
30
  <>
@@ -69,6 +42,7 @@ const TreeSettings = observer(function TreeSettings({
69
42
  const { classes } = useStyles()
70
43
  const {
71
44
  drawTree,
45
+ drawLabels,
72
46
  drawNodeBubbles,
73
47
  labelsAlignRight,
74
48
  noTree,
@@ -102,6 +76,12 @@ const TreeSettings = observer(function TreeSettings({
102
76
  onChange={() => model.setLabelsAlignRight(!labelsAlignRight)}
103
77
  label="Tree labels align right?"
104
78
  />
79
+
80
+ <Checkbox2
81
+ checked={drawLabels}
82
+ onChange={() => model.setDrawLabels(!drawLabels)}
83
+ label="Draw labels"
84
+ />
105
85
  {!noTree ? (
106
86
  <div>
107
87
  <Checkbox2
@@ -192,8 +172,8 @@ const SettingsDialog = observer(function ({
192
172
  onClose: () => void
193
173
  }) {
194
174
  return (
195
- <Dialog open onClose={() => onClose()} title="Settings">
196
- <DialogContent>
175
+ <Dialog open onClose={() => onClose()} title="Settings" maxWidth="xl">
176
+ <DialogContent style={{ width: '80em' }}>
197
177
  <SettingsContent model={model} />
198
178
  <DialogActions>
199
179
  <Button onClick={() => onClose()} variant="contained" color="primary">
@@ -0,0 +1,44 @@
1
+ import React, { lazy } from 'react'
2
+ import { IconButton } from '@mui/material'
3
+ import { observer } from 'mobx-react'
4
+
5
+ // locals
6
+ import { MsaViewModel } from '../../model'
7
+
8
+ // icons
9
+ import Help from '@mui/icons-material/Help'
10
+
11
+ // locals
12
+ import ZoomControls from './ZoomControls'
13
+ import MultiAlignmentSelector from './MultiAlignmentSelector'
14
+ import HeaderInfoArea from './HeaderInfoArea'
15
+ import HeaderStatusArea from './HeaderStatusArea'
16
+ import HeaderMenu from './HeaderMenu'
17
+ import HeaderMenuExtra from './HeaderMenuExtra'
18
+
19
+ const AboutDialog = lazy(() => import('../dialogs/AboutDialog'))
20
+
21
+ const Header = observer(function ({ model }: { model: MsaViewModel }) {
22
+ return (
23
+ <div style={{ display: 'flex' }}>
24
+ <HeaderMenu model={model} />
25
+ <ZoomControls model={model} />
26
+ <HeaderMenuExtra model={model} />
27
+ <MultiAlignmentSelector model={model} />
28
+ <HeaderInfoArea model={model} />
29
+ <Spacer />
30
+ <HeaderStatusArea model={model} />
31
+ <IconButton
32
+ onClick={() => model.queueDialog(onClose => [AboutDialog, { onClose }])}
33
+ >
34
+ <Help />
35
+ </IconButton>
36
+ </div>
37
+ )
38
+ })
39
+
40
+ function Spacer() {
41
+ return <div style={{ flex: 1 }} />
42
+ }
43
+
44
+ export default Header
@@ -0,0 +1,27 @@
1
+ import React from 'react'
2
+ import { Typography } from '@mui/material'
3
+ import { observer } from 'mobx-react'
4
+ import { makeStyles } from 'tss-react/mui'
5
+
6
+ // locals
7
+ import { MsaViewModel } from '../../model'
8
+
9
+ const useStyles = makeStyles()({
10
+ margin: {
11
+ margin: 'auto',
12
+ marginLeft: 10,
13
+ },
14
+ })
15
+
16
+ const HeaderInfoArea = observer(({ model }: { model: MsaViewModel }) => {
17
+ const { mouseOverRowName, mouseCol } = model
18
+ const { classes } = useStyles()
19
+ return mouseOverRowName && mouseCol !== undefined ? (
20
+ <Typography className={classes.margin}>
21
+ {mouseOverRowName}:
22
+ {model.globalCoordToRowSpecificSeqCoord(mouseOverRowName, mouseCol)}
23
+ </Typography>
24
+ ) : null
25
+ })
26
+
27
+ export default HeaderInfoArea
@@ -0,0 +1,54 @@
1
+ import React, { lazy } from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'
4
+
5
+ // icons
6
+ import FolderOpen from '@mui/icons-material/FolderOpen'
7
+ import Settings from '@mui/icons-material/Settings'
8
+ import Assignment from '@mui/icons-material/Assignment'
9
+ import List from '@mui/icons-material/List'
10
+ import Menu from '@mui/icons-material/Menu'
11
+
12
+ // locals
13
+ import { MsaViewModel } from '../../model'
14
+
15
+ // lazies
16
+ const SettingsDialog = lazy(() => import('../dialogs/SettingsDialog'))
17
+ const MetadataDialog = lazy(() => import('../dialogs/MetadataDialog'))
18
+ const TracklistDialog = lazy(() => import('../dialogs/TracklistDialog'))
19
+
20
+ const HeaderMenu = observer(function ({ model }: { model: MsaViewModel }) {
21
+ return (
22
+ <CascadingMenuButton
23
+ menuItems={[
24
+ {
25
+ label: 'Return to import form',
26
+ icon: FolderOpen,
27
+ onClick: () => model.reset(),
28
+ },
29
+ {
30
+ label: 'Settings',
31
+ onClick: () =>
32
+ model.queueDialog(onClose => [SettingsDialog, { model, onClose }]),
33
+ icon: Settings,
34
+ },
35
+ {
36
+ label: 'Metadata',
37
+ onClick: () =>
38
+ model.queueDialog(onClose => [MetadataDialog, { model, onClose }]),
39
+ icon: Assignment,
40
+ },
41
+ {
42
+ label: 'Extra tracks',
43
+ onClick: () =>
44
+ model.queueDialog(onClose => [TracklistDialog, { model, onClose }]),
45
+ icon: List,
46
+ },
47
+ ]}
48
+ >
49
+ <Menu />
50
+ </CascadingMenuButton>
51
+ )
52
+ })
53
+
54
+ export default HeaderMenu