react-msaview 2.1.5 → 3.0.0

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 (176) hide show
  1. package/bundle/index.js +37 -255
  2. package/dist/DialogQueue.d.ts +25 -0
  3. package/dist/DialogQueue.js +46 -0
  4. package/dist/DialogQueue.js.map +1 -0
  5. package/dist/UniprotTrack.js.map +1 -1
  6. package/dist/colorSchemes.js.map +1 -1
  7. package/dist/components/BoxTrackBlock.js +3 -2
  8. package/dist/components/BoxTrackBlock.js.map +1 -1
  9. package/dist/components/Header.js +10 -13
  10. package/dist/components/Header.js.map +1 -1
  11. package/dist/components/ImportForm/ImportFormExamples.d.ts +6 -0
  12. package/dist/components/ImportForm/ImportFormExamples.js +50 -0
  13. package/dist/components/ImportForm/ImportFormExamples.js.map +1 -0
  14. package/dist/components/ImportForm/data/seq2.js.map +1 -0
  15. package/dist/components/{ImportForm.d.ts → ImportForm/index.d.ts} +1 -1
  16. package/dist/components/ImportForm/index.js +31 -0
  17. package/dist/components/ImportForm/index.js.map +1 -0
  18. package/dist/components/ImportForm/util.d.ts +3 -0
  19. package/dist/components/ImportForm/util.js +15 -0
  20. package/dist/components/ImportForm/util.js.map +1 -0
  21. package/dist/components/{MSABlock.d.ts → MSAPanel/MSABlock.d.ts} +1 -1
  22. package/dist/components/MSAPanel/MSABlock.js +46 -0
  23. package/dist/components/MSAPanel/MSABlock.js.map +1 -0
  24. package/dist/components/{MSACanvas.d.ts → MSAPanel/MSACanvas.d.ts} +1 -1
  25. package/dist/components/{MSACanvas.js → MSAPanel/MSACanvas.js} +10 -3
  26. package/dist/components/MSAPanel/MSACanvas.js.map +1 -0
  27. package/dist/components/{MSAMouseoverCanvas.d.ts → MSAPanel/MSAMouseoverCanvas.d.ts} +1 -1
  28. package/dist/components/MSAPanel/MSAMouseoverCanvas.js +50 -0
  29. package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +1 -0
  30. package/dist/components/MSAPanel/index.d.ts +5 -0
  31. package/dist/components/MSAPanel/index.js +9 -0
  32. package/dist/components/MSAPanel/index.js.map +1 -0
  33. package/dist/components/MSAPanel/renderMSABlock.d.ts +8 -0
  34. package/dist/components/MSAPanel/renderMSABlock.js +81 -0
  35. package/dist/components/MSAPanel/renderMSABlock.js.map +1 -0
  36. package/dist/components/MSAView.d.ts +2 -2
  37. package/dist/components/MSAView.js +26 -31
  38. package/dist/components/MSAView.js.map +1 -1
  39. package/dist/components/Minimap.d.ts +6 -0
  40. package/dist/components/Minimap.js +72 -0
  41. package/dist/components/Minimap.js.map +1 -0
  42. package/dist/components/OverviewRubberband.d.ts +8 -0
  43. package/dist/components/OverviewRubberband.js +185 -0
  44. package/dist/components/OverviewRubberband.js.map +1 -0
  45. package/dist/components/ResizeHandles.js.map +1 -1
  46. package/dist/components/Rubberband.js +13 -1
  47. package/dist/components/Rubberband.js.map +1 -1
  48. package/dist/components/TextTrack.js +3 -2
  49. package/dist/components/TextTrack.js.map +1 -1
  50. package/dist/components/Track.js +5 -5
  51. package/dist/components/Track.js.map +1 -1
  52. package/dist/components/{TreeBranchMenu.d.ts → TreePanel/TreeBranchMenu.d.ts} +1 -1
  53. package/dist/components/TreePanel/TreeBranchMenu.js.map +1 -0
  54. package/dist/components/{TreeCanvas.d.ts → TreePanel/TreeCanvas.d.ts} +1 -1
  55. package/dist/components/{TreeCanvas.js → TreePanel/TreeCanvas.js} +1 -1
  56. package/dist/components/TreePanel/TreeCanvas.js.map +1 -0
  57. package/dist/components/{TreeCanvasBlock.d.ts → TreePanel/TreeCanvasBlock.d.ts} +1 -1
  58. package/dist/components/TreePanel/TreeCanvasBlock.js +117 -0
  59. package/dist/components/TreePanel/TreeCanvasBlock.js.map +1 -0
  60. package/dist/components/{TreeMenu.d.ts → TreePanel/TreeMenu.d.ts} +1 -1
  61. package/dist/components/{TreeMenu.js → TreePanel/TreeMenu.js} +9 -5
  62. package/dist/components/TreePanel/TreeMenu.js.map +1 -0
  63. package/dist/components/{TreeRuler.d.ts → TreePanel/TreeRuler.d.ts} +1 -1
  64. package/dist/components/TreePanel/TreeRuler.js +8 -0
  65. package/dist/components/TreePanel/TreeRuler.js.map +1 -0
  66. package/dist/components/{dialogs → TreePanel/dialogs}/TreeNodeInfoDlg.d.ts +1 -1
  67. package/dist/components/TreePanel/dialogs/TreeNodeInfoDlg.js.map +1 -0
  68. package/dist/components/TreePanel/index.d.ts +6 -0
  69. package/dist/components/TreePanel/index.js +10 -0
  70. package/dist/components/TreePanel/index.js.map +1 -0
  71. package/dist/components/TreePanel/renderTreeCanvas.d.ts +36 -0
  72. package/dist/components/TreePanel/renderTreeCanvas.js +153 -0
  73. package/dist/components/TreePanel/renderTreeCanvas.js.map +1 -0
  74. package/dist/components/dialogs/{AboutDlg.js → AboutDialog.js} +1 -1
  75. package/dist/components/dialogs/AboutDialog.js.map +1 -0
  76. package/dist/components/dialogs/{AddTrackDlg.js → AddTrackDialog.js} +1 -1
  77. package/dist/components/dialogs/AddTrackDialog.js.map +1 -0
  78. package/dist/components/dialogs/{AnnotationDlg.js → AnnotationDialog.js} +1 -1
  79. package/dist/components/dialogs/AnnotationDialog.js.map +1 -0
  80. package/dist/components/dialogs/{MetadataDlg.js → MetadataDialog.js} +1 -1
  81. package/dist/components/dialogs/MetadataDialog.js.map +1 -0
  82. package/dist/components/dialogs/SettingsDialog.js +54 -0
  83. package/dist/components/dialogs/SettingsDialog.js.map +1 -0
  84. package/dist/components/dialogs/{TrackInfoDlg.js → TrackInfoDialog.js} +1 -1
  85. package/dist/components/dialogs/TrackInfoDialog.js.map +1 -0
  86. package/dist/components/dialogs/{TracklistDlg.js → TracklistDialog.js} +1 -1
  87. package/dist/components/dialogs/TracklistDialog.js.map +1 -0
  88. package/dist/components/util.js.map +1 -1
  89. package/dist/layout.js.map +1 -1
  90. package/dist/model.d.ts +80 -47
  91. package/dist/model.js +130 -70
  92. package/dist/model.js.map +1 -1
  93. package/dist/parseNewick.js.map +1 -1
  94. package/dist/parsers/StockholmMSA.js.map +1 -1
  95. package/dist/util.js.map +1 -1
  96. package/dist/version.d.ts +1 -1
  97. package/dist/version.js +1 -1
  98. package/package.json +6 -4
  99. package/src/DialogQueue.ts +47 -0
  100. package/src/components/BoxTrackBlock.tsx +3 -1
  101. package/src/components/Header.tsx +9 -10
  102. package/src/components/ImportForm/ImportFormExamples.tsx +133 -0
  103. package/src/components/ImportForm/index.tsx +63 -0
  104. package/src/components/ImportForm/util.ts +20 -0
  105. package/src/components/MSAPanel/MSABlock.tsx +81 -0
  106. package/src/components/{MSACanvas.tsx → MSAPanel/MSACanvas.tsx} +17 -5
  107. package/src/components/MSAPanel/MSAMouseoverCanvas.tsx +92 -0
  108. package/src/components/MSAPanel/index.tsx +13 -0
  109. package/src/components/MSAPanel/renderMSABlock.ts +160 -0
  110. package/src/components/MSAView.tsx +36 -56
  111. package/src/components/Minimap.tsx +102 -0
  112. package/src/components/OverviewRubberband.tsx +283 -0
  113. package/src/components/Rubberband.tsx +14 -1
  114. package/src/components/TextTrack.tsx +3 -1
  115. package/src/components/Track.tsx +5 -5
  116. package/src/components/{TreeBranchMenu.tsx → TreePanel/TreeBranchMenu.tsx} +1 -1
  117. package/src/components/{TreeCanvas.tsx → TreePanel/TreeCanvas.tsx} +2 -3
  118. package/src/components/TreePanel/TreeCanvasBlock.tsx +190 -0
  119. package/src/components/{TreeMenu.tsx → TreePanel/TreeMenu.tsx} +10 -6
  120. package/src/components/{TreeRuler.tsx → TreePanel/TreeRuler.tsx} +3 -3
  121. package/src/components/{dialogs → TreePanel/dialogs}/TreeNodeInfoDlg.tsx +1 -1
  122. package/src/components/TreePanel/index.tsx +16 -0
  123. package/src/components/TreePanel/renderTreeCanvas.ts +245 -0
  124. package/src/components/dialogs/{SettingsDlg.tsx → SettingsDialog.tsx} +72 -47
  125. package/src/model.ts +157 -79
  126. package/src/version.ts +1 -1
  127. package/dist/components/ImportForm.js +0 -84
  128. package/dist/components/ImportForm.js.map +0 -1
  129. package/dist/components/MSABlock.js +0 -103
  130. package/dist/components/MSABlock.js.map +0 -1
  131. package/dist/components/MSACanvas.js.map +0 -1
  132. package/dist/components/MSAMouseoverCanvas.js +0 -61
  133. package/dist/components/MSAMouseoverCanvas.js.map +0 -1
  134. package/dist/components/Ruler.d.ts +0 -6
  135. package/dist/components/Ruler.js +0 -52
  136. package/dist/components/Ruler.js.map +0 -1
  137. package/dist/components/TreeBranchMenu.js.map +0 -1
  138. package/dist/components/TreeCanvas.js.map +0 -1
  139. package/dist/components/TreeCanvasBlock.js +0 -255
  140. package/dist/components/TreeCanvasBlock.js.map +0 -1
  141. package/dist/components/TreeMenu.js.map +0 -1
  142. package/dist/components/TreeRuler.js +0 -8
  143. package/dist/components/TreeRuler.js.map +0 -1
  144. package/dist/components/data/seq2.js.map +0 -1
  145. package/dist/components/dialogs/AboutDlg.js.map +0 -1
  146. package/dist/components/dialogs/AddTrackDlg.js.map +0 -1
  147. package/dist/components/dialogs/AnnotationDlg.js.map +0 -1
  148. package/dist/components/dialogs/MetadataDlg.js.map +0 -1
  149. package/dist/components/dialogs/SettingsDlg.js +0 -48
  150. package/dist/components/dialogs/SettingsDlg.js.map +0 -1
  151. package/dist/components/dialogs/TrackInfoDlg.js.map +0 -1
  152. package/dist/components/dialogs/TracklistDlg.js.map +0 -1
  153. package/dist/components/dialogs/TreeNodeInfoDlg.js.map +0 -1
  154. package/src/components/ImportForm.tsx +0 -192
  155. package/src/components/MSABlock.tsx +0 -164
  156. package/src/components/MSAMouseoverCanvas.tsx +0 -99
  157. package/src/components/Ruler.tsx +0 -123
  158. package/src/components/TreeCanvasBlock.tsx +0 -363
  159. /package/dist/components/{data → ImportForm/data}/seq2.d.ts +0 -0
  160. /package/dist/components/{data → ImportForm/data}/seq2.js +0 -0
  161. /package/dist/components/{TreeBranchMenu.js → TreePanel/TreeBranchMenu.js} +0 -0
  162. /package/dist/components/{dialogs → TreePanel/dialogs}/TreeNodeInfoDlg.js +0 -0
  163. /package/dist/components/dialogs/{AboutDlg.d.ts → AboutDialog.d.ts} +0 -0
  164. /package/dist/components/dialogs/{AddTrackDlg.d.ts → AddTrackDialog.d.ts} +0 -0
  165. /package/dist/components/dialogs/{AnnotationDlg.d.ts → AnnotationDialog.d.ts} +0 -0
  166. /package/dist/components/dialogs/{MetadataDlg.d.ts → MetadataDialog.d.ts} +0 -0
  167. /package/dist/components/dialogs/{SettingsDlg.d.ts → SettingsDialog.d.ts} +0 -0
  168. /package/dist/components/dialogs/{TrackInfoDlg.d.ts → TrackInfoDialog.d.ts} +0 -0
  169. /package/dist/components/dialogs/{TracklistDlg.d.ts → TracklistDialog.d.ts} +0 -0
  170. /package/src/components/{data → ImportForm/data}/seq2.ts +0 -0
  171. /package/src/components/dialogs/{AboutDlg.tsx → AboutDialog.tsx} +0 -0
  172. /package/src/components/dialogs/{AddTrackDlg.tsx → AddTrackDialog.tsx} +0 -0
  173. /package/src/components/dialogs/{AnnotationDlg.tsx → AnnotationDialog.tsx} +0 -0
  174. /package/src/components/dialogs/{MetadataDlg.tsx → MetadataDialog.tsx} +0 -0
  175. /package/src/components/dialogs/{TrackInfoDlg.tsx → TrackInfoDialog.tsx} +0 -0
  176. /package/src/components/dialogs/{TracklistDlg.tsx → TracklistDialog.tsx} +0 -0
package/src/model.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import React from 'react'
2
+ import { autorun } from 'mobx'
2
3
  import { Instance, cast, types, addDisposer, SnapshotIn } from 'mobx-state-tree'
3
4
  import { hierarchy, cluster, HierarchyNode } from 'd3-hierarchy'
4
5
  import { ascending } from 'd3-array'
5
6
  import { FileLocation, ElementId } from '@jbrowse/core/util/types/mst'
6
7
  import { FileLocation as FileLocationType } from '@jbrowse/core/util/types'
7
8
  import { openLocation } from '@jbrowse/core/util/io'
8
- import { autorun } from 'mobx'
9
+ import { measureText, sum } from '@jbrowse/core/util'
9
10
  import BaseViewModel from '@jbrowse/core/pluggableElementTypes/models/BaseViewModel'
10
11
  import Stockholm from 'stockholm-js'
11
12
 
@@ -35,6 +36,7 @@ import parseNewick from './parseNewick'
35
36
  import colorSchemes from './colorSchemes'
36
37
  import { UniprotTrack } from './UniprotTrack'
37
38
  import { StructureModel } from './StructureModel'
39
+ import { DialogQueueSessionMixin } from './DialogQueue'
38
40
 
39
41
  interface BasicTrackModel {
40
42
  id: string
@@ -74,9 +76,16 @@ type StructureSnap = SnapshotIn<typeof StructureModel>
74
76
  */
75
77
  function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
76
78
 
79
+ export type DialogComponentType =
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ | React.LazyExoticComponent<React.FC<any>>
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ | React.FC<any>
84
+
77
85
  const model = types
78
86
  .compose(
79
87
  BaseViewModel,
88
+ DialogQueueSessionMixin(),
80
89
  types.model('MsaView', {
81
90
  /**
82
91
  * #property
@@ -98,6 +107,10 @@ const model = types
98
107
  * #property
99
108
  */
100
109
  treeWidth: types.optional(types.number, 300),
110
+ /**
111
+ * #getter
112
+ */
113
+ treeWidthMatchesArea: true,
101
114
  /**
102
115
  * #property
103
116
  */
@@ -230,29 +243,33 @@ const model = types
230
243
  }),
231
244
  )
232
245
  .volatile(() => ({
233
- rulerHeight: 20,
246
+ /**
247
+ * #volatile
248
+ * a dummy variable that is incremented when ref changes so autorun for
249
+ * drawing canvas commands will run
250
+ */
251
+ nref: 0,
252
+ /**
253
+ * #volatile
254
+ */
255
+ minimapHeight: 56,
256
+ /**
257
+ * #volatile
258
+ */
234
259
  error: undefined as unknown,
260
+ /**
261
+ * #volatile
262
+ */
235
263
  margin: {
236
264
  left: 20,
237
265
  top: 20,
238
266
  },
239
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
240
- DialogComponent: undefined as undefined | React.FC<any>,
241
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
242
- DialogProps: undefined as any,
243
-
244
- // annotations
267
+ /**
268
+ * #volatile
269
+ */
245
270
  annotPos: undefined as { left: number; right: number } | undefined,
246
271
  }))
247
272
  .actions(self => ({
248
- /**
249
- * #action
250
- */
251
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
252
- setDialogComponent(dlg?: React.FC<any>, props?: any) {
253
- self.DialogComponent = dlg
254
- self.DialogProps = props
255
- },
256
273
  /**
257
274
  * #action
258
275
  */
@@ -328,15 +345,16 @@ const model = types
328
345
  /**
329
346
  * #action
330
347
  */
331
- setScrollY(n: number) {
332
- self.scrollY = n
348
+ setTreeWidthMatchesArea(arg: boolean) {
349
+ self.treeWidthMatchesArea = arg
333
350
  },
334
351
  /**
335
352
  * #action
336
353
  */
337
- setScrollX(n: number) {
338
- self.scrollX = n
354
+ setScrollY(n: number) {
355
+ self.scrollY = n
339
356
  },
357
+
340
358
  /**
341
359
  * #action
342
360
  */
@@ -358,14 +376,14 @@ const model = types
358
376
  /**
359
377
  * #action
360
378
  */
361
- toggleLabelsAlignRight() {
362
- self.labelsAlignRight = !self.labelsAlignRight
379
+ setLabelsAlignRight(arg: boolean) {
380
+ self.labelsAlignRight = arg
363
381
  },
364
382
  /**
365
383
  * #action
366
384
  */
367
- toggleDrawTree() {
368
- self.drawTree = !self.drawTree
385
+ setDrawTree(arg: boolean) {
386
+ self.drawTree = arg
369
387
  },
370
388
  /**
371
389
  * #action
@@ -386,20 +404,20 @@ const model = types
386
404
  /**
387
405
  * #action
388
406
  */
389
- toggleBranchLen() {
390
- self.showBranchLen = !self.showBranchLen
407
+ setShowBranchLen(arg: boolean) {
408
+ self.showBranchLen = arg
391
409
  },
392
410
  /**
393
411
  * #action
394
412
  */
395
- toggleBgColor() {
396
- self.bgColor = !self.bgColor
413
+ setBgColor(arg: boolean) {
414
+ self.bgColor = arg
397
415
  },
398
416
  /**
399
417
  * #action
400
418
  */
401
- toggleNodeBubbles() {
402
- self.drawNodeBubbles = !self.drawNodeBubbles
419
+ setDrawNodeBubbles(arg: boolean) {
420
+ self.drawNodeBubbles = arg
403
421
  },
404
422
  /**
405
423
  * #action
@@ -442,54 +460,8 @@ const model = types
442
460
  setTreeMetadata(result: string) {
443
461
  self.data.setTreeMetadata(result)
444
462
  },
445
-
446
- afterCreate() {
447
- addDisposer(
448
- self,
449
- autorun(async () => {
450
- const { treeFilehandle } = self
451
- if (treeFilehandle) {
452
- try {
453
- this.setTree(await openLocation(treeFilehandle).readFile('utf8'))
454
- } catch (e) {
455
- console.error(e)
456
- this.setError(e)
457
- }
458
- }
459
- }),
460
- )
461
- addDisposer(
462
- self,
463
- autorun(async () => {
464
- const { treeMetadataFilehandle } = self
465
- if (treeMetadataFilehandle) {
466
- try {
467
- this.setTreeMetadata(
468
- await openLocation(treeMetadataFilehandle).readFile('utf8'),
469
- )
470
- } catch (e) {
471
- console.error(e)
472
- this.setError(e)
473
- }
474
- }
475
- }),
476
- )
477
- addDisposer(
478
- self,
479
- autorun(async () => {
480
- const { msaFilehandle } = self
481
- if (msaFilehandle) {
482
- try {
483
- this.setMSA(await openLocation(msaFilehandle).readFile('utf8'))
484
- } catch (e) {
485
- console.error(e)
486
- this.setError(e)
487
- }
488
- }
489
- }),
490
- )
491
- },
492
463
  }))
464
+
493
465
  .views(self => {
494
466
  let oldBlocksX: number[] = []
495
467
  let oldBlocksY: number[] = []
@@ -573,6 +545,7 @@ const model = types
573
545
  get colorScheme() {
574
546
  return colorSchemes[self.colorSchemeName]
575
547
  },
548
+
576
549
  /**
577
550
  * #getter
578
551
  */
@@ -639,7 +612,7 @@ const model = types
639
612
  * #getter
640
613
  */
641
614
  get numColumns() {
642
- return ((this.MSA?.getWidth() || 0) - this.blanks.length) * self.colWidth
615
+ return (this.MSA?.getWidth() || 0) - this.blanks.length
643
616
  },
644
617
  /**
645
618
  * #getter
@@ -772,6 +745,12 @@ const model = types
772
745
  get columns2d() {
773
746
  return this.rows.map(r => r[1]).map(str => skipBlanks(this.blanks, str))
774
747
  },
748
+ /**
749
+ * #getter
750
+ */
751
+ get fontSize() {
752
+ return Math.max(8, self.rowHeight - 8)
753
+ },
775
754
  /**
776
755
  * #getter
777
756
  */
@@ -842,11 +821,21 @@ const model = types
842
821
  */
843
822
  doScrollX(deltaX: number) {
844
823
  self.scrollX = clamp(
845
- -self.numColumns + (self.msaAreaWidth - 100),
824
+ -(self.numColumns * self.colWidth) + (self.msaAreaWidth - 100),
846
825
  self.scrollX + deltaX,
847
826
  0,
848
827
  )
849
828
  },
829
+ /**
830
+ * #action
831
+ */
832
+ setScrollX(n: number) {
833
+ self.scrollX = clamp(
834
+ -(self.numColumns * self.colWidth) + (self.msaAreaWidth - 100),
835
+ n,
836
+ 0,
837
+ )
838
+ },
850
839
  /**
851
840
  * #action
852
841
  */
@@ -879,6 +868,23 @@ const model = types
879
868
  },
880
869
  }))
881
870
  .views(self => ({
871
+ /**
872
+ * #getter
873
+ */
874
+ get labelsWidth() {
875
+ let x = 0
876
+ const { rowHeight, hierarchy, treeMetadata, fontSize } = self
877
+ if (rowHeight > 5) {
878
+ for (const node of hierarchy.leaves()) {
879
+ const {
880
+ data: { name },
881
+ } = node
882
+ const displayName = treeMetadata[name]?.genome || name
883
+ x = Math.max(measureText(displayName, fontSize), x)
884
+ }
885
+ }
886
+ return x
887
+ },
882
888
  /**
883
889
  * #getter
884
890
  */
@@ -1093,6 +1099,78 @@ const model = types
1093
1099
  clearAnnotationClickBoundaries() {
1094
1100
  self.annotPos = undefined
1095
1101
  },
1102
+ /**
1103
+ * #action
1104
+ */
1105
+ incrementRef() {
1106
+ self.nref++
1107
+ },
1108
+ }))
1109
+ .views(self => ({
1110
+ /**
1111
+ * #getter
1112
+ */
1113
+ get totalTrackAreaHeight() {
1114
+ return sum(self.turnedOnTracks.map(r => r.model.height))
1115
+ },
1116
+ }))
1117
+ .actions(self => ({
1118
+ afterCreate() {
1119
+ addDisposer(
1120
+ self,
1121
+ autorun(async () => {
1122
+ const { treeFilehandle } = self
1123
+ if (treeFilehandle) {
1124
+ try {
1125
+ self.setTree(await openLocation(treeFilehandle).readFile('utf8'))
1126
+ } catch (e) {
1127
+ console.error(e)
1128
+ self.setError(e)
1129
+ }
1130
+ }
1131
+ }),
1132
+ )
1133
+ addDisposer(
1134
+ self,
1135
+ autorun(async () => {
1136
+ const { treeMetadataFilehandle } = self
1137
+ if (treeMetadataFilehandle) {
1138
+ try {
1139
+ self.setTreeMetadata(
1140
+ await openLocation(treeMetadataFilehandle).readFile('utf8'),
1141
+ )
1142
+ } catch (e) {
1143
+ console.error(e)
1144
+ self.setError(e)
1145
+ }
1146
+ }
1147
+ }),
1148
+ )
1149
+ addDisposer(
1150
+ self,
1151
+ autorun(async () => {
1152
+ const { msaFilehandle } = self
1153
+ if (msaFilehandle) {
1154
+ try {
1155
+ self.setMSA(await openLocation(msaFilehandle).readFile('utf8'))
1156
+ } catch (e) {
1157
+ console.error(e)
1158
+ self.setError(e)
1159
+ }
1160
+ }
1161
+ }),
1162
+ )
1163
+ addDisposer(
1164
+ self,
1165
+ autorun(async () => {
1166
+ if (self.treeWidthMatchesArea) {
1167
+ self.setTreeWidth(
1168
+ Math.max(50, self.treeAreaWidth - self.labelsWidth - 20),
1169
+ )
1170
+ }
1171
+ }),
1172
+ )
1173
+ },
1096
1174
  }))
1097
1175
  .postProcessSnapshot(result => {
1098
1176
  const snap = result as Omit<typeof result, symbol>
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '2.1.5'
1
+ export const version = '3.0.0'
@@ -1,84 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { Button, Container, Grid, Typography, Link } from '@mui/material';
3
- import { observer } from 'mobx-react';
4
- import { FileSelector } from '@jbrowse/core/ui';
5
- import { smallTree, smallMSA, smallMSAOnly } from './data/seq2';
6
- async function load(model, msaFile, treeFile) {
7
- model.setError(undefined);
8
- try {
9
- if (msaFile) {
10
- await model.setMSAFilehandle(msaFile);
11
- }
12
- if (treeFile) {
13
- await model.setTreeFilehandle(treeFile);
14
- }
15
- }
16
- catch (e) {
17
- model.setError(e);
18
- }
19
- }
20
- const ListItem = ({ onClick, model, children, }) => (React.createElement("li", null,
21
- React.createElement(Link, { onClick: event => {
22
- model.setError(undefined);
23
- event.preventDefault();
24
- onClick();
25
- }, href: "#" },
26
- React.createElement(Typography, { display: "inline" }, children))));
27
- export default observer(({ model }) => {
28
- const [msaFile, setMsaFile] = useState();
29
- const [treeFile, setTreeFile] = useState();
30
- const { error } = model;
31
- return (React.createElement(Container, null,
32
- React.createElement("div", { style: { width: '50%' } },
33
- error ? (React.createElement("div", { style: { padding: 20 } },
34
- React.createElement(Typography, { color: "error" },
35
- "Error: ",
36
- `${error}`))) : null,
37
- React.createElement(Typography, null, "Open an MSA file (stockholm or clustal format) and/or a tree file (newick format)."),
38
- React.createElement(Typography, { color: "error" }, "Note: you can open up just an MSA or just a tree, both are not required. Some MSA files e.g. stockholm format have an embedded tree also and this is fine, and opening a separate tree file is not required.")),
39
- React.createElement(Grid, { container: true, spacing: 10, justifyContent: "center", alignItems: "center" },
40
- React.createElement(Grid, { item: true },
41
- React.createElement(Typography, null, "MSA file or URL"),
42
- React.createElement(FileSelector, { location: msaFile, setLocation: setMsaFile }),
43
- React.createElement(Typography, null, "Tree file or URL"),
44
- React.createElement(FileSelector, { location: treeFile, setLocation: setTreeFile })),
45
- React.createElement(Grid, { item: true },
46
- React.createElement(Button, { onClick: () => load(model, msaFile, treeFile), variant: "contained", color: "primary", disabled: !msaFile && !treeFile }, "Open")),
47
- React.createElement(Grid, { item: true },
48
- React.createElement(Typography, null, "Examples"),
49
- React.createElement("ul", null,
50
- React.createElement(ListItem, { model: model, onClick: () => load(model, undefined, {
51
- uri: 'https://jbrowse.org/genomes/newick_trees/sarscov2phylo.pub.ft.nh',
52
- locationType: 'UriLocation',
53
- }) }, "230k COVID-19 samples (tree only)"),
54
- React.createElement(ListItem, { model: model, onClick: () => {
55
- model.setData({ msa: smallMSA, tree: smallTree });
56
- } }, "Small protein MSA+tree"),
57
- React.createElement(ListItem, { model: model, onClick: () => {
58
- model.setData({ msa: smallMSAOnly });
59
- } }, "Small MSA only"),
60
- React.createElement(ListItem, { model: model, onClick: () => load(model, {
61
- uri: 'https://ihh.github.io/abrowse/build/pfam-cov2.stock',
62
- locationType: 'UriLocation',
63
- }) }, "PFAM SARS-CoV2 multi-stockholm"),
64
- React.createElement(ListItem, { model: model, onClick: () => load(model, {
65
- uri: 'https://jbrowse.org/genomes/multiple_sequence_alignments/Lysine.stock',
66
- locationType: 'UriLocation',
67
- }) }, "Lysine stockholm file"),
68
- React.createElement(ListItem, { model: model, onClick: () => load(model, {
69
- uri: 'https://jbrowse.org/genomes/multiple_sequence_alignments/PF01601_full.txt',
70
- locationType: 'UriLocation',
71
- }) }, "PF01601 stockholm file (SARS-CoV2 spike protein)"),
72
- React.createElement(ListItem, { model: model, onClick: () => load(model, {
73
- uri: 'https://jbrowse.org/genomes/multiple_sequence_alignments/europe_covid.fa',
74
- locationType: 'UriLocation',
75
- }) }, "Europe COVID full genomes (LR883044.1 and 199 other sequences)"),
76
- React.createElement(ListItem, { model: model, onClick: () => load(model, {
77
- uri: 'https://jbrowse.org/genomes/multiple_sequence_alignments/rhv_test-only.aligned_with_mafft_auto.fa',
78
- locationType: 'UriLocation',
79
- }, {
80
- uri: 'https://jbrowse.org/genomes/multiple_sequence_alignments/rhv_test-only.aligned_with_mafft_auto.nh',
81
- locationType: 'UriLocation',
82
- }) }, "MAFFT+VeryFastTree(17.9k samples)"))))));
83
- });
84
- //# sourceMappingURL=ImportForm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImportForm.js","sourceRoot":"","sources":["../../src/components/ImportForm.tsx"],"names":[],"mappings":"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"}
@@ -1,103 +0,0 @@
1
- import React, { useEffect, useRef, useMemo } from 'react';
2
- import { useTheme } from '@mui/material';
3
- import { observer } from 'mobx-react';
4
- import { colorContrast } from '../util';
5
- import { getClustalXColor, getPercentIdentityColor } from '../colorSchemes';
6
- const MSABlock = observer(function ({ model, offsetX, offsetY, }) {
7
- const { MSA, colWidth, bgColor, columns, rowHeight, scrollY, scrollX, hierarchy, colorScheme, colorSchemeName, blockSize, highResScaleFactor, colStats, } = model;
8
- const theme = useTheme();
9
- const contrastScheme = useMemo(() => colorContrast(colorScheme, theme), [colorScheme, theme]);
10
- const ref = useRef(null);
11
- useEffect(() => {
12
- var _a, _b;
13
- if (!ref.current) {
14
- return;
15
- }
16
- const ctx = ref.current.getContext('2d');
17
- if (!ctx) {
18
- return;
19
- }
20
- ctx.resetTransform();
21
- ctx.scale(highResScaleFactor, highResScaleFactor);
22
- ctx.clearRect(0, 0, blockSize, blockSize);
23
- ctx.translate(-offsetX, rowHeight / 2 - offsetY);
24
- ctx.textAlign = 'center';
25
- ctx.font = ctx.font.replace(/\d+px/, `${Math.max(8, rowHeight - 8)}px`);
26
- const leaves = hierarchy.leaves();
27
- const b = blockSize;
28
- // slice vertical rows, e.g. tree leaves, avoid negative slice
29
- const yStart = Math.max(0, Math.floor((offsetY - rowHeight) / rowHeight));
30
- const yEnd = Math.max(0, Math.ceil((offsetY + b + rowHeight) / rowHeight));
31
- // slice horizontal visible letters, avoid negative slice
32
- const xStart = Math.max(0, Math.floor(offsetX / colWidth));
33
- const xEnd = Math.max(0, Math.ceil((offsetX + b) / colWidth));
34
- const visibleLeaves = leaves.slice(yStart, yEnd);
35
- for (const node of visibleLeaves) {
36
- const {
37
- // @ts-expect-error
38
- x: y, data: { name }, } = node;
39
- const str = (_a = columns[name]) === null || _a === void 0 ? void 0 : _a.slice(xStart, xEnd);
40
- for (let i = 0; i < (str === null || str === void 0 ? void 0 : str.length); i++) {
41
- const letter = str[i];
42
- const color = colorSchemeName === 'clustalx_protein_dynamic'
43
- ? getClustalXColor(colStats[xStart + i], model, name, xStart + i)
44
- : colorSchemeName === 'percent_identity_dynamic'
45
- ? getPercentIdentityColor(colStats[xStart + i], model, name, xStart + i)
46
- : colorScheme[letter.toUpperCase()];
47
- if (bgColor) {
48
- const x = i * colWidth + offsetX - (offsetX % colWidth);
49
- ctx.fillStyle = color || 'white';
50
- ctx.fillRect(x, y - rowHeight, colWidth, rowHeight);
51
- }
52
- }
53
- }
54
- if (rowHeight >= 5 && colWidth > rowHeight / 2) {
55
- for (const node of visibleLeaves) {
56
- const {
57
- // @ts-expect-error
58
- x: y, data: { name }, } = node;
59
- const str = (_b = columns[name]) === null || _b === void 0 ? void 0 : _b.slice(xStart, xEnd);
60
- for (let i = 0; i < (str === null || str === void 0 ? void 0 : str.length); i++) {
61
- const letter = str[i];
62
- const color = colorScheme[letter.toUpperCase()];
63
- const contrast = contrastScheme[letter.toUpperCase()] || 'black';
64
- const x = i * colWidth + offsetX - (offsetX % colWidth);
65
- // note: -rowHeight/4 matches +rowHeight/4 in tree
66
- ctx.fillStyle = bgColor ? contrast : color || 'black';
67
- ctx.fillText(letter, x + colWidth / 2, y - rowHeight / 4);
68
- }
69
- }
70
- }
71
- // eslint-disable-next-line react-hooks/exhaustive-deps
72
- }, [
73
- MSA,
74
- highResScaleFactor,
75
- columns,
76
- colorScheme,
77
- contrastScheme,
78
- bgColor,
79
- rowHeight,
80
- colWidth,
81
- hierarchy,
82
- offsetX,
83
- offsetY,
84
- blockSize,
85
- ]);
86
- return (React.createElement("canvas", { ref: ref, onMouseMove: event => {
87
- if (!ref.current) {
88
- return;
89
- }
90
- const { left, top } = ref.current.getBoundingClientRect();
91
- const mouseX = event.clientX - left + offsetX;
92
- const mouseY = event.clientY - top + offsetY;
93
- model.setMousePos(Math.floor(mouseX / colWidth) + 1, Math.floor(mouseY / rowHeight));
94
- }, onMouseLeave: () => model.setMousePos(), width: blockSize * highResScaleFactor, height: blockSize * highResScaleFactor, style: {
95
- position: 'absolute',
96
- top: scrollY + offsetY,
97
- left: scrollX + offsetX,
98
- width: blockSize,
99
- height: blockSize,
100
- } }));
101
- });
102
- export default MSABlock;
103
- //# sourceMappingURL=MSABlock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MSABlock.js","sourceRoot":"","sources":["../../src/components/MSABlock.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MSACanvas.js","sourceRoot":"","sources":["../../src/components/MSACanvas.tsx"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- import React, { useEffect, useRef } from 'react';
2
- import { observer } from 'mobx-react';
3
- import { sum } from '@jbrowse/core/util';
4
- const MSAMouseoverCanvas = observer(function ({ model, }) {
5
- const ref = useRef(null);
6
- const { height, width, treeAreaWidth, resizeHandleWidth, rulerHeight, turnedOnTracks, scrollX, scrollY, mouseCol,
7
- // @ts-expect-error
8
- mouseCol2, mouseRow, rowHeight, colWidth, } = model;
9
- const totalTrackAreaHeight = sum(turnedOnTracks.map(r => r.model.height));
10
- useEffect(() => {
11
- if (!ref.current) {
12
- return;
13
- }
14
- const ctx = ref.current.getContext('2d');
15
- if (!ctx) {
16
- return;
17
- }
18
- ctx.resetTransform();
19
- ctx.clearRect(0, 0, width, height);
20
- if (mouseCol !== undefined) {
21
- ctx.fillStyle = 'rgba(0,0,0,0.15)';
22
- const x = (mouseCol - 1) * colWidth + scrollX + treeAreaWidth + resizeHandleWidth;
23
- ctx.fillRect(x, 0, colWidth, height);
24
- }
25
- if (mouseRow !== undefined) {
26
- ctx.fillStyle = 'rgba(0,0,0,0.15)';
27
- const y = mouseRow * rowHeight + scrollY + rulerHeight + totalTrackAreaHeight;
28
- ctx.fillRect(treeAreaWidth + resizeHandleWidth, y, width, rowHeight);
29
- }
30
- if (mouseCol2 !== undefined) {
31
- ctx.fillStyle = 'rgba(255,255,0,0.2)';
32
- const x = (mouseCol2 - 1) * colWidth + scrollX + treeAreaWidth + resizeHandleWidth;
33
- ctx.fillRect(x, 0, colWidth, height);
34
- }
35
- }, [
36
- mouseCol,
37
- mouseCol2,
38
- colWidth,
39
- scrollY,
40
- totalTrackAreaHeight,
41
- mouseRow,
42
- rowHeight,
43
- rulerHeight,
44
- scrollX,
45
- height,
46
- resizeHandleWidth,
47
- treeAreaWidth,
48
- width,
49
- ]);
50
- return (React.createElement("canvas", { ref: ref, width: width, height: height, style: {
51
- position: 'absolute',
52
- top: 0,
53
- left: 0,
54
- width,
55
- height,
56
- zIndex: 1000,
57
- pointerEvents: 'none',
58
- } }));
59
- });
60
- export default MSAMouseoverCanvas;
61
- //# sourceMappingURL=MSAMouseoverCanvas.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MSAMouseoverCanvas.js","sourceRoot":"","sources":["../../src/components/MSAMouseoverCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAExC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAC5C,KAAK,GAGN;IACC,MAAM,GAAG,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAC3C,MAAM,EACJ,MAAM,EACN,KAAK,EACL,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,OAAO,EACP,OAAO,EACP,QAAQ;IACR,mBAAmB;IACnB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,GAAG,KAAK,CAAA;IACT,MAAM,oBAAoB,GAAG,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IACzE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAChB,OAAM;SACP;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,EAAE;YACR,OAAM;SACP;QAED,GAAG,CAAC,cAAc,EAAE,CAAA;QACpB,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAElC,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAA;YAClC,MAAM,CAAC,GACL,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,GAAG,iBAAiB,CAAA;YAEzE,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;SACrC;QAED,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAA;YAClC,MAAM,CAAC,GACL,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,oBAAoB,CAAA;YACrE,GAAG,CAAC,QAAQ,CAAC,aAAa,GAAG,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;SACrE;QACD,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,GAAG,CAAC,SAAS,GAAG,qBAAqB,CAAA;YACrC,MAAM,CAAC,GACL,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,GAAG,iBAAiB,CAAA;YAE1E,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;SACrC;IACH,CAAC,EAAE;QACD,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,OAAO;QACP,oBAAoB;QACpB,QAAQ;QACR,SAAS;QACT,WAAW;QACX,OAAO;QACP,MAAM;QACN,iBAAiB;QACjB,aAAa;QACb,KAAK;KACN,CAAC,CAAA;IAEF,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK;YACL,MAAM;YACN,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,MAAM;SACtB,GACD,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,kBAAkB,CAAA"}
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- import { MsaViewModel } from '../model';
3
- declare const Ruler: ({ model }: {
4
- model: MsaViewModel;
5
- }) => React.JSX.Element | null;
6
- export default Ruler;