react-msaview 3.1.12 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/bundle/index.js +32 -31
  2. package/dist/colorSchemes.d.ts +2 -2
  3. package/dist/colorSchemes.js +5 -6
  4. package/dist/colorSchemes.js.map +1 -1
  5. package/dist/components/Loading.d.ts +1 -1
  6. package/dist/components/Loading.js +7 -5
  7. package/dist/components/Loading.js.map +1 -1
  8. package/dist/components/MSAView.d.ts +1 -1
  9. package/dist/components/MSAView.js +13 -9
  10. package/dist/components/MSAView.js.map +1 -1
  11. package/dist/components/ResizeHandles.d.ts +1 -1
  12. package/dist/components/ResizeHandles.js +8 -4
  13. package/dist/components/ResizeHandles.js.map +1 -1
  14. package/dist/components/SequenceTextArea.js +9 -3
  15. package/dist/components/SequenceTextArea.js.map +1 -1
  16. package/dist/components/TextTrack.d.ts +1 -1
  17. package/dist/components/TextTrack.js +1 -1
  18. package/dist/components/TextTrack.js.map +1 -1
  19. package/dist/components/Track.d.ts +1 -1
  20. package/dist/components/Track.js +6 -2
  21. package/dist/components/Track.js.map +1 -1
  22. package/dist/components/VerticalScrollbar.d.ts +6 -0
  23. package/dist/components/VerticalScrollbar.js +69 -0
  24. package/dist/components/VerticalScrollbar.js.map +1 -0
  25. package/dist/components/dialogs/AboutDialog.js +3 -1
  26. package/dist/components/dialogs/AboutDialog.js.map +1 -1
  27. package/dist/components/dialogs/AddTrackDialog.d.ts +3 -3
  28. package/dist/components/dialogs/AddTrackDialog.js +8 -3
  29. package/dist/components/dialogs/AddTrackDialog.js.map +1 -1
  30. package/dist/components/dialogs/DomainDialog.d.ts +1 -1
  31. package/dist/components/dialogs/DomainDialog.js +8 -4
  32. package/dist/components/dialogs/DomainDialog.js.map +1 -1
  33. package/dist/components/dialogs/ExportSVGDialog.d.ts +1 -1
  34. package/dist/components/dialogs/ExportSVGDialog.js +29 -17
  35. package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
  36. package/dist/components/dialogs/FeatureDialog.d.ts +1 -1
  37. package/dist/components/dialogs/FeatureDialog.js +8 -4
  38. package/dist/components/dialogs/FeatureDialog.js.map +1 -1
  39. package/dist/components/dialogs/{InterProScanPanel.d.ts → InterProScanDialog.d.ts} +1 -1
  40. package/dist/components/dialogs/{InterProScanPanel.js → InterProScanDialog.js} +26 -11
  41. package/dist/components/dialogs/InterProScanDialog.js.map +1 -0
  42. package/dist/components/dialogs/MetadataDialog.d.ts +1 -1
  43. package/dist/components/dialogs/MetadataDialog.js +3 -1
  44. package/dist/components/dialogs/MetadataDialog.js.map +1 -1
  45. package/dist/components/dialogs/SettingsDialog.d.ts +1 -1
  46. package/dist/components/dialogs/SettingsDialog.js +62 -15
  47. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  48. package/dist/components/dialogs/TracklistDialog.d.ts +3 -3
  49. package/dist/components/dialogs/TracklistDialog.js +8 -3
  50. package/dist/components/dialogs/TracklistDialog.js.map +1 -1
  51. package/dist/components/dialogs/UserProvidedDomainsDialog.d.ts +7 -0
  52. package/dist/components/dialogs/UserProvidedDomainsDialog.js +64 -0
  53. package/dist/components/dialogs/UserProvidedDomainsDialog.js.map +1 -0
  54. package/dist/components/header/Header.d.ts +1 -1
  55. package/dist/components/header/Header.js +11 -4
  56. package/dist/components/header/Header.js.map +1 -1
  57. package/dist/components/header/HeaderInfoArea.d.ts +1 -1
  58. package/dist/components/header/HeaderInfoArea.js +5 -2
  59. package/dist/components/header/HeaderInfoArea.js.map +1 -1
  60. package/dist/components/header/HeaderMenu.d.ts +1 -1
  61. package/dist/components/header/HeaderMenu.js +12 -4
  62. package/dist/components/header/HeaderMenu.js.map +1 -1
  63. package/dist/components/header/HeaderMenuExtra.d.ts +1 -1
  64. package/dist/components/header/HeaderMenuExtra.js +55 -35
  65. package/dist/components/header/HeaderMenuExtra.js.map +1 -1
  66. package/dist/components/header/HeaderStatusArea.d.ts +2 -2
  67. package/dist/components/header/HeaderStatusArea.js +1 -1
  68. package/dist/components/header/HeaderStatusArea.js.map +1 -1
  69. package/dist/components/header/MultiAlignmentSelector.d.ts +1 -1
  70. package/dist/components/header/ZoomControls.js +45 -3
  71. package/dist/components/header/ZoomControls.js.map +1 -1
  72. package/dist/components/import/ImportForm.d.ts +3 -3
  73. package/dist/components/import/ImportForm.js +15 -2
  74. package/dist/components/import/ImportForm.js.map +1 -1
  75. package/dist/components/import/ImportFormExamples.d.ts +1 -1
  76. package/dist/components/import/ImportFormExamples.js +53 -38
  77. package/dist/components/import/ImportFormExamples.js.map +1 -1
  78. package/dist/components/import/util.d.ts +2 -2
  79. package/dist/components/minimap/Minimap.d.ts +1 -1
  80. package/dist/components/minimap/Minimap.js +24 -17
  81. package/dist/components/minimap/Minimap.js.map +1 -1
  82. package/dist/components/minimap/MinimapSVG.d.ts +1 -1
  83. package/dist/components/minimap/MinimapSVG.js +1 -1
  84. package/dist/components/minimap/MinimapSVG.js.map +1 -1
  85. package/dist/components/msa/MSACanvas.d.ts +1 -1
  86. package/dist/components/msa/MSACanvas.js +3 -3
  87. package/dist/components/msa/MSACanvas.js.map +1 -1
  88. package/dist/components/msa/MSACanvasBlock.d.ts +3 -3
  89. package/dist/components/msa/MSACanvasBlock.js +9 -6
  90. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  91. package/dist/components/msa/MSAMouseoverCanvas.d.ts +1 -1
  92. package/dist/components/msa/MSAPanel.d.ts +1 -1
  93. package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +1 -1
  94. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +3 -4
  95. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  96. package/dist/components/msa/renderMSABlock.d.ts +2 -2
  97. package/dist/components/msa/renderMSABlock.js +16 -16
  98. package/dist/components/msa/renderMSABlock.js.map +1 -1
  99. package/dist/components/msa/renderMSAMouseover.d.ts +1 -1
  100. package/dist/components/msa/renderMSAMouseover.js +3 -3
  101. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  102. package/dist/components/tree/TreeBranchMenu.d.ts +1 -1
  103. package/dist/components/tree/TreeBranchMenu.js +6 -3
  104. package/dist/components/tree/TreeBranchMenu.js.map +1 -1
  105. package/dist/components/tree/TreeCanvas.d.ts +1 -1
  106. package/dist/components/tree/TreeCanvas.js +13 -12
  107. package/dist/components/tree/TreeCanvas.js.map +1 -1
  108. package/dist/components/tree/TreeCanvasBlock.d.ts +1 -1
  109. package/dist/components/tree/TreeCanvasBlock.js +13 -5
  110. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  111. package/dist/components/tree/TreeNodeMenu.d.ts +1 -1
  112. package/dist/components/tree/TreeNodeMenu.js +3 -3
  113. package/dist/components/tree/TreeNodeMenu.js.map +1 -1
  114. package/dist/components/tree/TreePanel.d.ts +1 -1
  115. package/dist/components/tree/TreeRuler.d.ts +1 -1
  116. package/dist/components/tree/dialogs/TreeNodeInfoDialog.d.ts +3 -3
  117. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js +5 -2
  118. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -1
  119. package/dist/components/tree/renderTreeCanvas.d.ts +3 -3
  120. package/dist/components/tree/renderTreeCanvas.js +25 -9
  121. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  122. package/dist/components/util.js +1 -4
  123. package/dist/components/util.js.map +1 -1
  124. package/dist/ggplotPalettes.js.map +1 -1
  125. package/dist/launchInterProScan.d.ts +1 -1
  126. package/dist/launchInterProScan.js +11 -13
  127. package/dist/launchInterProScan.js.map +1 -1
  128. package/dist/model/DataModel.d.ts +5 -1
  129. package/dist/model/DataModel.js +10 -1
  130. package/dist/model/DataModel.js.map +1 -1
  131. package/dist/model/DialogQueue.d.ts +1 -1
  132. package/dist/model/DialogQueue.js +0 -1
  133. package/dist/model/DialogQueue.js.map +1 -1
  134. package/dist/model.d.ts +187 -35
  135. package/dist/model.js +317 -94
  136. package/dist/model.js.map +1 -1
  137. package/dist/parseGFF.js +8 -6
  138. package/dist/parseGFF.js.map +1 -1
  139. package/dist/parseNewick.js +1 -2
  140. package/dist/parseNewick.js.map +1 -1
  141. package/dist/parsers/ClustalMSA.d.ts +2 -2
  142. package/dist/parsers/ClustalMSA.js.map +1 -1
  143. package/dist/parsers/FastaMSA.d.ts +1 -1
  144. package/dist/parsers/FastaMSA.js +3 -3
  145. package/dist/parsers/FastaMSA.js.map +1 -1
  146. package/dist/parsers/StockholmMSA.d.ts +7 -7
  147. package/dist/parsers/StockholmMSA.js +4 -4
  148. package/dist/parsers/StockholmMSA.js.map +1 -1
  149. package/dist/renderToSvg.d.ts +2 -2
  150. package/dist/renderToSvg.js +6 -11
  151. package/dist/renderToSvg.js.map +1 -1
  152. package/dist/reparseTree.d.ts +1 -1
  153. package/dist/rowCoordinateCalculations.d.ts +2 -0
  154. package/dist/rowCoordinateCalculations.js +26 -0
  155. package/dist/rowCoordinateCalculations.js.map +1 -0
  156. package/dist/rowCoordinateCalculations.test.d.ts +1 -0
  157. package/dist/rowCoordinateCalculations.test.js +18 -0
  158. package/dist/rowCoordinateCalculations.test.js.map +1 -0
  159. package/dist/util.d.ts +2 -2
  160. package/dist/util.js +0 -2
  161. package/dist/util.js.map +1 -1
  162. package/dist/version.d.ts +1 -1
  163. package/dist/version.js +1 -1
  164. package/dist/version.js.map +1 -1
  165. package/package.json +10 -3
  166. package/src/colorSchemes.ts +7 -6
  167. package/src/components/Checkbox2.tsx +1 -1
  168. package/src/components/Loading.tsx +18 -6
  169. package/src/components/MSAView.tsx +27 -18
  170. package/src/components/ResizeHandles.tsx +9 -5
  171. package/src/components/SequenceTextArea.tsx +10 -4
  172. package/src/components/TextTrack.tsx +3 -3
  173. package/src/components/Track.tsx +9 -5
  174. package/src/components/VerticalScrollbar.tsx +89 -0
  175. package/src/components/dialogs/AboutDialog.tsx +7 -1
  176. package/src/components/dialogs/AddTrackDialog.tsx +15 -5
  177. package/src/components/dialogs/DomainDialog.tsx +12 -5
  178. package/src/components/dialogs/ExportSVGDialog.tsx +37 -18
  179. package/src/components/dialogs/FeatureDialog.tsx +10 -8
  180. package/src/components/dialogs/{InterProScanPanel.tsx → InterProScanDialog.tsx} +30 -13
  181. package/src/components/dialogs/MetadataDialog.tsx +9 -2
  182. package/src/components/dialogs/SettingsDialog.tsx +98 -19
  183. package/src/components/dialogs/TracklistDialog.tsx +18 -4
  184. package/src/components/dialogs/UserProvidedDomainsDialog.tsx +139 -0
  185. package/src/components/header/Header.tsx +12 -5
  186. package/src/components/header/HeaderInfoArea.tsx +4 -3
  187. package/src/components/header/HeaderMenu.tsx +13 -8
  188. package/src/components/header/HeaderMenuExtra.tsx +59 -43
  189. package/src/components/header/HeaderStatusArea.tsx +2 -6
  190. package/src/components/header/MultiAlignmentSelector.tsx +1 -1
  191. package/src/components/header/ZoomControls.tsx +52 -2
  192. package/src/components/import/ImportForm.tsx +16 -4
  193. package/src/components/import/ImportFormExamples.tsx +77 -64
  194. package/src/components/import/util.ts +2 -2
  195. package/src/components/minimap/Minimap.tsx +34 -29
  196. package/src/components/minimap/MinimapSVG.tsx +2 -2
  197. package/src/components/msa/MSACanvas.tsx +11 -4
  198. package/src/components/msa/MSACanvasBlock.tsx +10 -7
  199. package/src/components/msa/MSAMouseoverCanvas.tsx +1 -1
  200. package/src/components/msa/MSAPanel.tsx +1 -1
  201. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +8 -9
  202. package/src/components/msa/renderMSABlock.ts +44 -24
  203. package/src/components/msa/renderMSAMouseover.ts +4 -4
  204. package/src/components/tree/TreeBranchMenu.tsx +6 -4
  205. package/src/components/tree/TreeCanvas.tsx +15 -16
  206. package/src/components/tree/TreeCanvasBlock.tsx +14 -6
  207. package/src/components/tree/TreeNodeMenu.tsx +4 -4
  208. package/src/components/tree/TreePanel.tsx +1 -1
  209. package/src/components/tree/TreeRuler.tsx +1 -1
  210. package/src/components/tree/dialogs/TreeNodeInfoDialog.tsx +12 -3
  211. package/src/components/tree/renderTreeCanvas.ts +32 -12
  212. package/src/components/util.ts +2 -5
  213. package/src/ggplotPalettes.ts +1 -1
  214. package/src/launchInterProScan.ts +13 -15
  215. package/src/model/DataModel.ts +10 -0
  216. package/src/model/DialogQueue.ts +1 -2
  217. package/src/model.ts +355 -112
  218. package/src/parseGFF.ts +13 -11
  219. package/src/parseNewick.ts +4 -4
  220. package/src/parsers/ClustalMSA.ts +3 -3
  221. package/src/parsers/FastaMSA.ts +5 -5
  222. package/src/parsers/StockholmMSA.ts +11 -11
  223. package/src/renderToSvg.tsx +7 -8
  224. package/src/reparseTree.ts +1 -1
  225. package/src/rowCoordinateCalculations.test.ts +19 -0
  226. package/src/rowCoordinateCalculations.ts +26 -0
  227. package/src/util.ts +2 -4
  228. package/src/version.ts +1 -1
  229. package/dist/components/dialogs/InterProScanPanel.js.map +0 -1
  230. package/dist/components/dialogs/UserProvidedResultPanel.d.ts +0 -7
  231. package/dist/components/dialogs/UserProvidedResultPanel.js +0 -56
  232. package/dist/components/dialogs/UserProvidedResultPanel.js.map +0 -1
  233. package/src/components/dialogs/UserProvidedResultPanel.tsx +0 -119
@@ -5,6 +5,7 @@ import { transform } from './util'
5
5
  extend([namesPlugin])
6
6
 
7
7
  const colorSchemes = {
8
+ none: {},
8
9
  clustal: {
9
10
  G: 'orange',
10
11
  P: 'orange',
@@ -351,12 +352,12 @@ export default transform(colorSchemes, ([key, val]) => [
351
352
  // should be WLVIMAFCHPY, colprot.xml says e.g. %#ACFHILMVWYPp" which has Y
352
353
  export function getClustalXColor(
353
354
  stats: Record<string, number>,
355
+ total: number,
354
356
  model: { columns: Record<string, string> },
355
357
  row: string,
356
358
  col: number,
357
359
  ) {
358
- const total = Object.values(stats).reduce((a, b) => a + b, 0)
359
- const l = model.columns[row][col]
360
+ const l = model.columns[row]![col]!
360
361
  const {
361
362
  W = 0,
362
363
  L = 0,
@@ -494,16 +495,16 @@ export function getClustalXColor(
494
495
  // info http://www.jalview.org/help/html/colourSchemes/clustal.html
495
496
  // modifications:
496
497
  // reference to clustalX source code scheme modifies what the jalview.org
497
- // scheme says there the jalview.org colorscheme says WLVIMAFCHP but it
498
- // should be WLVIMAFCHPY, colprot.xml says e.g. %#ACFHILMVWYPp" which has Y
498
+ // scheme says there the jalview.org colorscheme says WLVIMAFCHP but it should
499
+ // be WLVIMAFCHPY, colprot.xml says e.g. %#ACFHILMVWYPp" which has Y
499
500
  export function getPercentIdentityColor(
500
501
  stats: Record<string, number>,
502
+ total: number,
501
503
  model: { columns: Record<string, string> },
502
504
  row: string,
503
505
  col: number,
504
506
  ) {
505
- const total = Object.values(stats).reduce((a, b) => a + b, 0)
506
- const l = model.columns[row][col]
507
+ const l = model.columns[row]![col]!
507
508
  const entries = Object.entries(stats)
508
509
  let ent = 0
509
510
  let letter = ''
@@ -2,7 +2,7 @@ import React from 'react'
2
2
  import {
3
3
  Checkbox,
4
4
  FormControlLabel,
5
- FormControlLabelProps,
5
+ type FormControlLabelProps,
6
6
  } from '@mui/material'
7
7
 
8
8
  function FormControlLabel2(rest: FormControlLabelProps) {
@@ -7,28 +7,40 @@ import { ErrorMessage } from '@jbrowse/core/ui'
7
7
  // locals
8
8
  import ImportForm from './import/ImportForm'
9
9
  import MSAView from './MSAView'
10
- import { MsaViewModel } from '../model'
10
+ import type { MsaViewModel } from '../model'
11
11
 
12
- function Reset({ model, error }: { model: MsaViewModel; error: unknown }) {
12
+ const Reset = observer(function ({
13
+ model,
14
+ error,
15
+ }: {
16
+ model: MsaViewModel
17
+ error: unknown
18
+ }) {
13
19
  return (
14
20
  <div>
15
21
  <ErrorMessage error={error} />
16
- <Button variant="contained" color="primary" onClick={() => model.reset()}>
22
+ <Button
23
+ variant="contained"
24
+ color="primary"
25
+ onClick={() => {
26
+ model.reset()
27
+ }}
28
+ >
17
29
  Return to import form
18
30
  </Button>
19
31
  </div>
20
32
  )
21
- }
33
+ })
22
34
 
23
35
  const Loading = observer(function ({ model }: { model: MsaViewModel }) {
24
- const { isLoading, initialized } = model
36
+ const { isLoading, dataInitialized } = model
25
37
 
26
38
  return (
27
39
  <div>
28
40
  <ErrorBoundary
29
41
  fallbackRender={props => <Reset model={model} error={props.error} />}
30
42
  >
31
- {initialized ? (
43
+ {dataInitialized ? (
32
44
  isLoading ? (
33
45
  <Typography variant="h4">Loading...</Typography>
34
46
  ) : (
@@ -3,55 +3,64 @@ import { observer } from 'mobx-react'
3
3
 
4
4
  // locals
5
5
  import { HorizontalResizeHandle, VerticalResizeHandle } from './ResizeHandles'
6
- import { MsaViewModel } from '../model'
6
+ import type { MsaViewModel } from '../model'
7
7
  import TreeRuler from './tree/TreeRuler'
8
8
  import Header from './header/Header'
9
9
  import MSAPanel from './msa/MSAPanel'
10
10
  import TreePanel from './tree/TreePanel'
11
11
  import Minimap from './minimap/Minimap'
12
+ import VerticalScrollbar from './VerticalScrollbar'
12
13
 
13
- function TopArea({ model }: { model: MsaViewModel }) {
14
+ const TopArea = observer(function ({ model }: { model: MsaViewModel }) {
15
+ const { showHorizontalScrollbar } = model
14
16
  return (
15
17
  <div style={{ display: 'flex' }}>
16
18
  <TreeRuler model={model} />
17
- <Minimap model={model} />
19
+ {showHorizontalScrollbar ? <Minimap model={model} /> : null}
18
20
  </div>
19
21
  )
20
- }
21
- function MainArea({ model }: { model: MsaViewModel }) {
22
+ })
23
+
24
+ const MainArea = observer(function ({ model }: { model: MsaViewModel }) {
25
+ const { showVerticalScrollbar } = model
26
+
22
27
  return (
23
28
  <div style={{ display: 'flex' }}>
24
29
  <TreePanel model={model} />
25
30
  <VerticalResizeHandle model={model} />
26
31
  <MSAPanel model={model} />
32
+ {showVerticalScrollbar ? <VerticalScrollbar model={model} /> : null}
27
33
  </div>
28
34
  )
29
- }
35
+ })
30
36
 
31
37
  const View = observer(function ({ model }: { model: MsaViewModel }) {
32
38
  return (
33
39
  <div style={{ position: 'relative' }}>
34
40
  <TopArea model={model} />
35
-
36
41
  <MainArea model={model} />
37
42
  </div>
38
43
  )
39
44
  })
40
45
 
41
46
  const MSAView = observer(function ({ model }: { model: MsaViewModel }) {
42
- const { height, DialogComponent, DialogProps } = model
47
+ const { height, viewInitialized, DialogComponent, DialogProps } = model
43
48
  return (
44
49
  <div>
45
- <div style={{ height, overflow: 'hidden' }}>
46
- <Header model={model} />
47
- <View model={model} />
48
- </div>
49
- <HorizontalResizeHandle model={model} />
50
-
51
- {DialogComponent ? (
52
- <Suspense fallback={null}>
53
- <DialogComponent {...DialogProps} />
54
- </Suspense>
50
+ {viewInitialized ? (
51
+ <>
52
+ <div style={{ height, overflow: 'hidden' }}>
53
+ <Header model={model} />
54
+ <View model={model} />
55
+ </div>
56
+ <HorizontalResizeHandle model={model} />
57
+
58
+ {DialogComponent ? (
59
+ <Suspense fallback={null}>
60
+ <DialogComponent {...DialogProps} />
61
+ </Suspense>
62
+ ) : null}
63
+ </>
55
64
  ) : null}
56
65
  </div>
57
66
  )
@@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react'
2
2
  import { observer } from 'mobx-react'
3
3
 
4
4
  // locals
5
- import { MsaViewModel } from '../model'
5
+ import type { MsaViewModel } from '../model'
6
6
 
7
7
  export const VerticalResizeHandle = observer(function ({
8
8
  model,
@@ -57,12 +57,14 @@ export const VerticalResizeHandle = observer(function ({
57
57
  return (
58
58
  <div>
59
59
  <div
60
- onMouseDown={() => setMouseDragging(true)}
60
+ onMouseDown={() => {
61
+ setMouseDragging(true)
62
+ }}
61
63
  style={{
62
64
  cursor: 'ew-resize',
63
65
  height: '100%',
64
66
  width: resizeHandleWidth,
65
- background: `rgba(200,200,200)`,
67
+ background: 'rgba(200,200,200)',
66
68
  position: 'relative',
67
69
  }}
68
70
  />
@@ -123,12 +125,14 @@ export const HorizontalResizeHandle = observer(function ({
123
125
  return (
124
126
  <div>
125
127
  <div
126
- onMouseDown={() => setMouseDragging(true)}
128
+ onMouseDown={() => {
129
+ setMouseDragging(true)
130
+ }}
127
131
  style={{
128
132
  cursor: 'ns-resize',
129
133
  width: '100%',
130
134
  height: resizeHandleWidth,
131
- background: `rgba(200,200,200)`,
135
+ background: 'rgba(200,200,200)',
132
136
  position: 'relative',
133
137
  }}
134
138
  />
@@ -25,7 +25,7 @@ export default function SequenceTextArea({ str }: { str: [string, string][] }) {
25
25
  const [showEmpty, setShowEmpty] = useState(false)
26
26
 
27
27
  const disp = str
28
- .map(([s1, s2]) => [s1, showGaps ? s2 : s2.replaceAll('-', '')])
28
+ .map(([s1, s2]) => [s1, showGaps ? s2 : s2.replaceAll('-', '')] as const)
29
29
  .filter(f => (showEmpty ? true : !!f[1]))
30
30
  .map(([s1, s2]) => `>${s1}\n${showGaps ? s2 : s2.replaceAll('-', '')}`)
31
31
  .join('\n')
@@ -37,7 +37,9 @@ export default function SequenceTextArea({ str }: { str: [string, string][] }) {
37
37
  onClick={() => {
38
38
  copy(disp)
39
39
  setCopied(true)
40
- setTimeout(() => setCopied(false), 500)
40
+ setTimeout(() => {
41
+ setCopied(false)
42
+ }, 500)
41
43
  }}
42
44
  >
43
45
  {copied ? 'Copied!' : 'Copy to clipboard'}
@@ -45,12 +47,16 @@ export default function SequenceTextArea({ str }: { str: [string, string][] }) {
45
47
  <Checkbox2
46
48
  label="Show gaps"
47
49
  checked={showGaps}
48
- onChange={() => setShowGaps(!showGaps)}
50
+ onChange={() => {
51
+ setShowGaps(!showGaps)
52
+ }}
49
53
  />
50
54
  <Checkbox2
51
55
  label="Show empty"
52
56
  checked={showEmpty}
53
- onChange={() => setShowEmpty(!showEmpty)}
57
+ onChange={() => {
58
+ setShowEmpty(!showEmpty)
59
+ }}
54
60
  />
55
61
  <TextField
56
62
  variant="outlined"
@@ -2,7 +2,7 @@ import React, { useRef, useMemo, useEffect } from 'react'
2
2
  import { useTheme } from '@mui/material'
3
3
  import { observer } from 'mobx-react'
4
4
  // locals
5
- import { MsaViewModel, ITextTrack } from '../model'
5
+ import type { MsaViewModel, ITextTrack } from '../model'
6
6
  import { colorContrast } from '../util'
7
7
 
8
8
  const AnnotationBlock = observer(function ({
@@ -55,9 +55,9 @@ const AnnotationBlock = observer(function ({
55
55
 
56
56
  const xStart = Math.max(0, Math.floor(offsetX / colWidth))
57
57
  const xEnd = Math.max(0, Math.ceil((offsetX + blockSize) / colWidth))
58
- const str = data?.slice(xStart, xEnd)
58
+ const str = data.slice(xStart, xEnd)
59
59
  for (let i = 0; str && i < str.length; i++) {
60
- const letter = str[i]
60
+ const letter = str[i]!
61
61
  const color = colorScheme[letter.toUpperCase()]
62
62
  if (bgColor) {
63
63
  const x = i * colWidth + offsetX - (offsetX % colWidth)
@@ -8,7 +8,7 @@ import { makeStyles } from 'tss-react/mui'
8
8
  import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'
9
9
 
10
10
  // locals
11
- import { MsaViewModel } from '../model'
11
+ import type { MsaViewModel } from '../model'
12
12
 
13
13
  // lazies
14
14
  const TrackInfoDialog = lazy(() => import('./dialogs/TrackInfoDialog'))
@@ -24,7 +24,7 @@ export const TrackLabel = observer(function ({
24
24
  track,
25
25
  }: {
26
26
  model: MsaViewModel
27
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+
28
28
  track: any
29
29
  }) {
30
30
  const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>()
@@ -53,7 +53,9 @@ export const TrackLabel = observer(function ({
53
53
  width: trackLabelHeight,
54
54
  height: trackLabelHeight,
55
55
  }}
56
- onClick={event => setAnchorEl(event.currentTarget)}
56
+ onClick={event => {
57
+ setAnchorEl(event.currentTarget)
58
+ }}
57
59
  >
58
60
  <ArrowDropDownIcon />
59
61
  </IconButton>
@@ -62,7 +64,9 @@ export const TrackLabel = observer(function ({
62
64
  anchorEl={anchorEl}
63
65
  transitionDuration={0}
64
66
  open
65
- onClose={() => setAnchorEl(undefined)}
67
+ onClose={() => {
68
+ setAnchorEl(undefined)
69
+ }}
66
70
  >
67
71
  <MenuItem
68
72
  dense
@@ -96,7 +100,7 @@ const Track = observer(function ({
96
100
  track,
97
101
  }: {
98
102
  model: MsaViewModel
99
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+
100
104
  track: any
101
105
  }) {
102
106
  const { resizeHandleWidth } = model
@@ -0,0 +1,89 @@
1
+ import { observer } from 'mobx-react'
2
+ import React, { useEffect, useRef, useState } from 'react'
3
+ import type { MsaViewModel } from '../model'
4
+ import { clamp } from '../util'
5
+
6
+ const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
7
+ const { msaAreaHeight, scrollY, totalHeight } = model
8
+ const [hovered, setHovered] = useState(false)
9
+ const scheduled = useRef(false)
10
+ const [mouseDown, setMouseDown] = useState<{
11
+ clientY: number
12
+ scrollY: number
13
+ }>()
14
+ const fill = 'rgba(66, 119, 127, 0.3)'
15
+ const unit = msaAreaHeight / totalHeight
16
+ const top = -scrollY
17
+ const bottom = top + msaAreaHeight
18
+ const t = top * unit
19
+ const b = bottom * unit
20
+ useEffect(() => {
21
+ function fn(event: MouseEvent) {
22
+ if (mouseDown !== undefined) {
23
+ if (!scheduled.current) {
24
+ scheduled.current = true
25
+ window.requestAnimationFrame(() => {
26
+ model.setScrollY(
27
+ clamp(
28
+ -totalHeight,
29
+ mouseDown.scrollY - (event.clientY - mouseDown.clientY) / unit,
30
+ 0,
31
+ ),
32
+ )
33
+ scheduled.current = false
34
+ })
35
+ }
36
+ }
37
+ }
38
+ function fn2() {
39
+ setMouseDown(undefined)
40
+ }
41
+ if (mouseDown !== undefined) {
42
+ document.addEventListener('mousemove', fn)
43
+ document.addEventListener('mouseup', fn2)
44
+ return () => {
45
+ document.removeEventListener('mousemove', fn)
46
+ document.removeEventListener('mousemove', fn2)
47
+ }
48
+ }
49
+ }, [model, unit, totalHeight, mouseDown])
50
+ return (
51
+ <div
52
+ style={{
53
+ position: 'relative',
54
+ width: 20,
55
+ height: msaAreaHeight,
56
+ borderLeft: '1px solid #555',
57
+ borderTop: '1px solid #555',
58
+ boxSizing: 'border-box',
59
+ }}
60
+ >
61
+ <div
62
+ style={{
63
+ position: 'absolute',
64
+ top: Math.max(0, t),
65
+ left: 0,
66
+ background: hovered ? 'rgba(66,119,127,0.6)' : fill,
67
+ cursor: 'pointer',
68
+ boxSizing: 'border-box',
69
+ width: 20,
70
+ height: Math.max(b - t, 20),
71
+ zIndex: 100,
72
+ }}
73
+ onMouseOver={() => {
74
+ setHovered(true)
75
+ }}
76
+ onMouseOut={() => {
77
+ setHovered(false)
78
+ }}
79
+ onMouseDown={event => {
80
+ setMouseDown({
81
+ clientY: event.clientY,
82
+ scrollY: model.scrollY,
83
+ })
84
+ }}
85
+ />
86
+ </div>
87
+ )
88
+ })
89
+ export default VerticalScrollbar
@@ -5,7 +5,13 @@ import { version } from '../../version'
5
5
 
6
6
  export default function AboutDialog({ onClose }: { onClose: () => void }) {
7
7
  return (
8
- <Dialog onClose={() => onClose()} open title="About this plugin">
8
+ <Dialog
9
+ onClose={() => {
10
+ onClose()
11
+ }}
12
+ open
13
+ title="About this plugin"
14
+ >
9
15
  <DialogContent>
10
16
  <Typography>
11
17
  MSAView {version} (
@@ -8,11 +8,11 @@ import {
8
8
  Typography,
9
9
  } from '@mui/material'
10
10
  import { Dialog, FileSelector } from '@jbrowse/core/ui'
11
- import { FileLocation } from '@jbrowse/core/util/types'
11
+ import type { FileLocation } from '@jbrowse/core/util/types'
12
12
  import { observer } from 'mobx-react'
13
- import { MsaViewModel } from '../../model'
13
+ import type { MsaViewModel } from '../../model'
14
14
 
15
- export default observer(function ({
15
+ const AddTrackDialog = observer(function ({
16
16
  model,
17
17
  onClose,
18
18
  open,
@@ -26,7 +26,13 @@ export default observer(function ({
26
26
  const [currentOption, setCurrentOption] = useState('')
27
27
 
28
28
  return (
29
- <Dialog onClose={() => onClose()} open={open} title="Add track">
29
+ <Dialog
30
+ onClose={() => {
31
+ onClose()
32
+ }}
33
+ open={open}
34
+ title="Add track"
35
+ >
30
36
  <DialogContent>
31
37
  <Typography>
32
38
  Open relevant per-alignment tracks e.g. protein domains
@@ -62,7 +68,9 @@ export default observer(function ({
62
68
  <Button
63
69
  color="secondary"
64
70
  variant="contained"
65
- onClick={() => onClose()}
71
+ onClick={() => {
72
+ onClose()
73
+ }}
66
74
  >
67
75
  Cancel
68
76
  </Button>
@@ -71,3 +79,5 @@ export default observer(function ({
71
79
  </Dialog>
72
80
  )
73
81
  })
82
+
83
+ export default AddTrackDialog
@@ -3,10 +3,10 @@ import { Dialog } from '@jbrowse/core/ui'
3
3
  import { Tab, Tabs } from '@mui/material'
4
4
 
5
5
  // locals
6
- import InterProScanPanel from './InterProScanPanel'
7
- import UserProvidedResultPanel from './UserProvidedResultPanel'
6
+ import InterProScanPanel from './InterProScanDialog'
7
+ import UserProvidedResultPanel from './UserProvidedDomainsDialog'
8
8
  import TabPanel from './TabPanel'
9
- import { MsaViewModel } from '../../model'
9
+ import type { MsaViewModel } from '../../model'
10
10
 
11
11
  export default function LaunchDomainViewDialog({
12
12
  handleClose,
@@ -20,10 +20,17 @@ export default function LaunchDomainViewDialog({
20
20
  <Dialog
21
21
  maxWidth="xl"
22
22
  title="Launch protein view"
23
- onClose={() => handleClose()}
23
+ onClose={() => {
24
+ handleClose()
25
+ }}
24
26
  open
25
27
  >
26
- <Tabs value={choice} onChange={(_, val) => setChoice(val)}>
28
+ <Tabs
29
+ value={choice}
30
+ onChange={(_, val) => {
31
+ setChoice(val)
32
+ }}
33
+ >
27
34
  <Tab value={0} label="Automatic lookup" />
28
35
  <Tab value={1} label="Manual" />
29
36
  </Tabs>
@@ -13,7 +13,7 @@ import {
13
13
  useTheme,
14
14
  } from '@mui/material'
15
15
  // locals
16
- import { MsaViewModel } from '../../model'
16
+ import type { MsaViewModel } from '../../model'
17
17
  import Checkbox2 from '../Checkbox2'
18
18
 
19
19
  export default function ExportSVGDialog({
@@ -28,7 +28,13 @@ export default function ExportSVGDialog({
28
28
  const [error, setError] = useState<unknown>()
29
29
  const theme = useTheme()
30
30
  return (
31
- <Dialog onClose={() => onClose()} open title="Export SVG">
31
+ <Dialog
32
+ onClose={() => {
33
+ onClose()
34
+ }}
35
+ open
36
+ title="Export SVG"
37
+ >
32
38
  <DialogContent>
33
39
  {error ? <ErrorMessage error={error} /> : null}
34
40
  <Typography>Settings:</Typography>
@@ -36,14 +42,18 @@ export default function ExportSVGDialog({
36
42
  label="Include minimap?"
37
43
  disabled={exportType === 'entire'}
38
44
  checked={includeMinimap}
39
- onChange={() => setIncludeMinimap(!includeMinimap)}
45
+ onChange={() => {
46
+ setIncludeMinimap(!includeMinimap)
47
+ }}
40
48
  />
41
49
  <div>
42
50
  <FormControl>
43
51
  <FormLabel>Export type</FormLabel>
44
52
  <RadioGroup
45
53
  value={exportType}
46
- onChange={event => setExportType(event.target.value)}
54
+ onChange={event => {
55
+ setExportType(event.target.value)
56
+ }}
47
57
  >
48
58
  <FormControlLabel
49
59
  value="entire"
@@ -63,24 +73,33 @@ export default function ExportSVGDialog({
63
73
  <Button
64
74
  variant="contained"
65
75
  color="primary"
66
- onClick={async () => {
67
- try {
68
- await model.exportSVG({
69
- theme,
70
- includeMinimap:
71
- exportType === 'entire' ? false : includeMinimap,
72
- exportType,
73
- })
74
- } catch (e) {
75
- console.error(e)
76
- setError(e)
77
- }
78
- onClose()
76
+ onClick={() => {
77
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
78
+ ;(async () => {
79
+ try {
80
+ await model.exportSVG({
81
+ theme,
82
+ includeMinimap:
83
+ exportType === 'entire' ? false : includeMinimap,
84
+ exportType,
85
+ })
86
+ } catch (e) {
87
+ console.error(e)
88
+ setError(e)
89
+ }
90
+ onClose()
91
+ })()
79
92
  }}
80
93
  >
81
94
  Submit
82
95
  </Button>
83
- <Button variant="contained" color="secondary" onClick={() => onClose()}>
96
+ <Button
97
+ variant="contained"
98
+ color="secondary"
99
+ onClick={() => {
100
+ onClose()
101
+ }}
102
+ >
84
103
  Cancel
85
104
  </Button>
86
105
  </DialogActions>
@@ -4,7 +4,7 @@ import { Dialog } from '@jbrowse/core/ui'
4
4
  import { Button, DialogContent } from '@mui/material'
5
5
 
6
6
  // locals
7
- import { MsaViewModel } from '../../model'
7
+ import type { MsaViewModel } from '../../model'
8
8
  import { getPalette } from '../../ggplotPalettes'
9
9
 
10
10
  const Toggles = observer(function ({ model }: { model: MsaViewModel }) {
@@ -35,8 +35,8 @@ const Toggles = observer(function ({ model }: { model: MsaViewModel }) {
35
35
  })
36
36
 
37
37
  const Table = observer(function ({ model }: { model: MsaViewModel }) {
38
- const { tidyTypes, featureFilters } = model
39
- const values = [...tidyTypes.values()]
38
+ const { tidyInterProAnnotationTypes, featureFilters } = model
39
+ const values = [...tidyInterProAnnotationTypes.values()]
40
40
  const palette = getPalette(values.length - 1)
41
41
  return (
42
42
  <>
@@ -44,7 +44,7 @@ const Table = observer(function ({ model }: { model: MsaViewModel }) {
44
44
  <table>
45
45
  <thead>
46
46
  <tr>
47
- <td></td>
47
+ <td />
48
48
  <td>accession</td>
49
49
  <td>name</td>
50
50
  <td>description</td>
@@ -57,12 +57,12 @@ const Table = observer(function ({ model }: { model: MsaViewModel }) {
57
57
  <input
58
58
  type="checkbox"
59
59
  checked={featureFilters.get(accession) ?? false}
60
- onChange={() =>
60
+ onChange={() => {
61
61
  model.setFilter(
62
62
  accession,
63
63
  !model.featureFilters.get(accession),
64
64
  )
65
- }
65
+ }}
66
66
  />
67
67
  </td>
68
68
  <td>{accession}</td>
@@ -75,7 +75,7 @@ const Table = observer(function ({ model }: { model: MsaViewModel }) {
75
75
  height: 20,
76
76
  background: palette[idx] || 'black',
77
77
  }}
78
- ></div>
78
+ />
79
79
  </td>
80
80
  </tr>
81
81
  ))}
@@ -94,7 +94,9 @@ const FeatureTypeDialog = observer(function ({
94
94
  }) {
95
95
  return (
96
96
  <Dialog
97
- onClose={() => onClose()}
97
+ onClose={() => {
98
+ onClose()
99
+ }}
98
100
  open
99
101
  title="Feature filters"
100
102
  maxWidth="xl"