react-msaview 3.1.6 → 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 +10 -15
  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 +22 -34
  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
  <>
@@ -61,10 +34,15 @@ const SettingsContent = observer(function ({ model }: { model: MsaViewModel }) {
61
34
  )
62
35
  })
63
36
 
64
- function TreeSettings({ model }: { model: MsaViewModel }) {
37
+ const TreeSettings = observer(function TreeSettings({
38
+ model,
39
+ }: {
40
+ model: MsaViewModel
41
+ }) {
65
42
  const { classes } = useStyles()
66
43
  const {
67
44
  drawTree,
45
+ drawLabels,
68
46
  drawNodeBubbles,
69
47
  labelsAlignRight,
70
48
  noTree,
@@ -98,6 +76,12 @@ function TreeSettings({ model }: { model: MsaViewModel }) {
98
76
  onChange={() => model.setLabelsAlignRight(!labelsAlignRight)}
99
77
  label="Tree labels align right?"
100
78
  />
79
+
80
+ <Checkbox2
81
+ checked={drawLabels}
82
+ onChange={() => model.setDrawLabels(!drawLabels)}
83
+ label="Draw labels"
84
+ />
101
85
  {!noTree ? (
102
86
  <div>
103
87
  <Checkbox2
@@ -123,9 +107,13 @@ function TreeSettings({ model }: { model: MsaViewModel }) {
123
107
  ) : null}
124
108
  </div>
125
109
  )
126
- }
110
+ })
127
111
 
128
- function MSASettings({ model }: { model: MsaViewModel }) {
112
+ const MSASettings = observer(function MSASettings({
113
+ model,
114
+ }: {
115
+ model: MsaViewModel
116
+ }) {
129
117
  const { classes } = useStyles()
130
118
  const { bgColor, colWidth, colorSchemeName, rowHeight } = model
131
119
 
@@ -174,7 +162,7 @@ function MSASettings({ model }: { model: MsaViewModel }) {
174
162
  </TextField>
175
163
  </div>
176
164
  )
177
- }
165
+ })
178
166
 
179
167
  const SettingsDialog = observer(function ({
180
168
  model,
@@ -184,8 +172,8 @@ const SettingsDialog = observer(function ({
184
172
  onClose: () => void
185
173
  }) {
186
174
  return (
187
- <Dialog open onClose={() => onClose()} title="Settings">
188
- <DialogContent>
175
+ <Dialog open onClose={() => onClose()} title="Settings" maxWidth="xl">
176
+ <DialogContent style={{ width: '80em' }}>
189
177
  <SettingsContent model={model} />
190
178
  <DialogActions>
191
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