react-msaview 3.1.7 → 3.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/bundle/index.js +32 -32
  2. package/dist/components/Checkbox2.d.ts +7 -0
  3. package/dist/components/Checkbox2.js +10 -0
  4. package/dist/components/Checkbox2.js.map +1 -0
  5. package/dist/components/Loading.js +12 -4
  6. package/dist/components/Loading.js.map +1 -1
  7. package/dist/components/MSAView.js +5 -8
  8. package/dist/components/MSAView.js.map +1 -1
  9. package/dist/components/SequenceTextArea.d.ts +4 -0
  10. package/dist/components/SequenceTextArea.js +38 -0
  11. package/dist/components/SequenceTextArea.js.map +1 -0
  12. package/dist/components/Track.js +9 -8
  13. package/dist/components/Track.js.map +1 -1
  14. package/dist/components/dialogs/AddTrackDialog.js +0 -1
  15. package/dist/components/dialogs/AddTrackDialog.js.map +1 -1
  16. package/dist/components/{ExportSVGDialog.d.ts → dialogs/ExportSVGDialog.d.ts} +1 -1
  17. package/dist/components/{ExportSVGDialog.js → dialogs/ExportSVGDialog.js} +3 -4
  18. package/dist/components/dialogs/ExportSVGDialog.js.map +1 -0
  19. package/dist/components/dialogs/FeatureDialog.d.ts +7 -0
  20. package/dist/components/dialogs/FeatureDialog.js +52 -0
  21. package/dist/components/dialogs/FeatureDialog.js.map +1 -0
  22. package/dist/components/dialogs/InterProScanDialog.d.ts +7 -0
  23. package/dist/components/dialogs/InterProScanDialog.js +163 -0
  24. package/dist/components/dialogs/InterProScanDialog.js.map +1 -0
  25. package/dist/components/dialogs/MetadataDialog.js +6 -3
  26. package/dist/components/dialogs/MetadataDialog.js.map +1 -1
  27. package/dist/components/dialogs/SettingsDialog.js +6 -11
  28. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  29. package/dist/components/{Header.d.ts → header/Header.d.ts} +1 -1
  30. package/dist/components/header/Header.js +30 -0
  31. package/dist/components/header/Header.js.map +1 -0
  32. package/dist/components/{HeaderInfoArea.d.ts → header/HeaderInfoArea.d.ts} +2 -2
  33. package/dist/components/header/HeaderInfoArea.js +20 -0
  34. package/dist/components/header/HeaderInfoArea.js.map +1 -0
  35. package/dist/components/header/HeaderMenu.d.ts +6 -0
  36. package/dist/components/header/HeaderMenu.js +40 -0
  37. package/dist/components/header/HeaderMenu.js.map +1 -0
  38. package/dist/components/header/HeaderMenuExtra.d.ts +6 -0
  39. package/dist/components/header/HeaderMenuExtra.js +92 -0
  40. package/dist/components/header/HeaderMenuExtra.js.map +1 -0
  41. package/dist/components/header/HeaderStatusArea.d.ts +6 -0
  42. package/dist/components/header/HeaderStatusArea.js +20 -0
  43. package/dist/components/header/HeaderStatusArea.js.map +1 -0
  44. package/dist/components/{MultiAlignmentSelector.d.ts → header/MultiAlignmentSelector.d.ts} +1 -1
  45. package/dist/components/header/MultiAlignmentSelector.js.map +1 -0
  46. package/dist/components/{ZoomControls.d.ts → header/ZoomControls.d.ts} +1 -1
  47. package/dist/components/header/ZoomControls.js +15 -0
  48. package/dist/components/header/ZoomControls.js.map +1 -0
  49. package/dist/components/{ImportForm/index.js → import/ImportForm.js} +1 -1
  50. package/dist/components/import/ImportForm.js.map +1 -0
  51. package/dist/components/{ImportForm → import}/ImportFormExamples.js +6 -2
  52. package/dist/components/import/ImportFormExamples.js.map +1 -0
  53. package/dist/components/import/data/seq2.js.map +1 -0
  54. package/dist/components/import/util.js +10 -0
  55. package/dist/components/import/util.js.map +1 -0
  56. package/dist/components/{Minimap.d.ts → minimap/Minimap.d.ts} +1 -1
  57. package/dist/components/minimap/Minimap.js.map +1 -0
  58. package/dist/components/{MinimapSVG.d.ts → minimap/MinimapSVG.d.ts} +1 -1
  59. package/dist/components/minimap/MinimapSVG.js.map +1 -0
  60. package/dist/components/msa/Loading.js.map +1 -0
  61. package/dist/components/{MSAPanel → msa}/MSACanvas.js +3 -2
  62. package/dist/components/msa/MSACanvas.js.map +1 -0
  63. package/dist/components/{MSAPanel/MSABlock.js → msa/MSACanvasBlock.js} +21 -9
  64. package/dist/components/msa/MSACanvasBlock.js.map +1 -0
  65. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -0
  66. package/dist/components/msa/MSAPanel.d.ts +6 -0
  67. package/dist/components/{MSAPanel/index.js → msa/MSAPanel.js} +6 -3
  68. package/dist/components/msa/MSAPanel.js.map +1 -0
  69. package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +9 -0
  70. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +44 -0
  71. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -0
  72. package/dist/components/{MSAPanel → msa}/renderMSABlock.js +24 -20
  73. package/dist/components/msa/renderMSABlock.js.map +1 -0
  74. package/dist/components/msa/renderMSAMouseover.js.map +1 -0
  75. package/dist/components/tree/TreeBranchMenu.js.map +1 -0
  76. package/dist/components/{TreePanel → tree}/TreeCanvas.js +1 -1
  77. package/dist/components/tree/TreeCanvas.js.map +1 -0
  78. package/dist/components/{TreePanel → tree}/TreeCanvasBlock.js +1 -1
  79. package/dist/components/tree/TreeCanvasBlock.js.map +1 -0
  80. package/dist/components/{TreePanel → tree}/TreeNodeMenu.js +2 -33
  81. package/dist/components/tree/TreeNodeMenu.js.map +1 -0
  82. package/dist/components/{TreePanel/index.js → tree/TreePanel.js} +2 -2
  83. package/dist/components/tree/TreePanel.js.map +1 -0
  84. package/dist/components/tree/TreeRuler.js.map +1 -0
  85. package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.js +6 -2
  86. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -0
  87. package/dist/components/{TreePanel → tree}/renderTreeCanvas.js +23 -37
  88. package/dist/components/tree/renderTreeCanvas.js.map +1 -0
  89. package/dist/fetchUtils.d.ts +5 -0
  90. package/dist/fetchUtils.js +23 -0
  91. package/dist/fetchUtils.js.map +1 -0
  92. package/dist/ggplotPalettes.d.ts +3 -0
  93. package/dist/ggplotPalettes.js +24 -0
  94. package/dist/ggplotPalettes.js.map +1 -0
  95. package/dist/index.d.ts +1 -1
  96. package/dist/index.js +1 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/launchInterProScan.d.ts +32 -0
  99. package/dist/launchInterProScan.js +47 -0
  100. package/dist/launchInterProScan.js.map +1 -0
  101. package/dist/model/DataModel.js.map +1 -0
  102. package/dist/model/DialogQueue.js.map +1 -0
  103. package/dist/model/msaModel.d.ts +14 -0
  104. package/dist/model/msaModel.js +36 -0
  105. package/dist/model/msaModel.js.map +1 -0
  106. package/dist/model/treeModel.d.ts +46 -0
  107. package/dist/model/treeModel.js +105 -0
  108. package/dist/model/treeModel.js.map +1 -0
  109. package/dist/model.d.ts +261 -273
  110. package/dist/model.js +1043 -1029
  111. package/dist/model.js.map +1 -1
  112. package/dist/parseGFF.d.ts +10 -0
  113. package/dist/parseGFF.js +29 -0
  114. package/dist/parseGFF.js.map +1 -0
  115. package/dist/renderToSvg.js +23 -9
  116. package/dist/renderToSvg.js.map +1 -1
  117. package/dist/reparseTree.d.ts +2 -0
  118. package/dist/reparseTree.js +13 -0
  119. package/dist/reparseTree.js.map +1 -0
  120. package/dist/util.d.ts +4 -10
  121. package/dist/util.js +3 -28
  122. package/dist/util.js.map +1 -1
  123. package/dist/version.d.ts +1 -1
  124. package/dist/version.js +1 -1
  125. package/package.json +12 -2
  126. package/src/components/Checkbox2.tsx +34 -0
  127. package/src/components/Loading.tsx +27 -11
  128. package/src/components/MSAView.tsx +6 -10
  129. package/src/components/SequenceTextArea.tsx +63 -0
  130. package/src/components/Track.tsx +8 -13
  131. package/src/components/dialogs/AddTrackDialog.tsx +0 -1
  132. package/src/components/{ExportSVGDialog.tsx → dialogs/ExportSVGDialog.tsx} +9 -16
  133. package/src/components/dialogs/FeatureDialog.tsx +109 -0
  134. package/src/components/dialogs/InterProScanDialog.tsx +230 -0
  135. package/src/components/dialogs/MetadataDialog.tsx +9 -2
  136. package/src/components/dialogs/SettingsDialog.tsx +10 -30
  137. package/src/components/header/Header.tsx +44 -0
  138. package/src/components/header/HeaderInfoArea.tsx +27 -0
  139. package/src/components/header/HeaderMenu.tsx +54 -0
  140. package/src/components/header/HeaderMenuExtra.tsx +108 -0
  141. package/src/components/header/HeaderStatusArea.tsx +31 -0
  142. package/src/components/{MultiAlignmentSelector.tsx → header/MultiAlignmentSelector.tsx} +1 -1
  143. package/src/components/header/ZoomControls.tsx +28 -0
  144. package/src/components/{ImportForm → import}/ImportFormExamples.tsx +12 -1
  145. package/src/components/{ImportForm → import}/util.ts +5 -10
  146. package/src/components/{Minimap.tsx → minimap/Minimap.tsx} +1 -1
  147. package/src/components/{MinimapSVG.tsx → minimap/MinimapSVG.tsx} +1 -1
  148. package/src/components/{MSAPanel → msa}/MSACanvas.tsx +3 -2
  149. package/src/components/{MSAPanel/MSABlock.tsx → msa/MSACanvasBlock.tsx} +25 -12
  150. package/src/components/{MSAPanel/index.tsx → msa/MSAPanel.tsx} +8 -2
  151. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +88 -0
  152. package/src/components/{MSAPanel → msa}/renderMSABlock.ts +26 -20
  153. package/src/components/{TreePanel → tree}/TreeCanvas.tsx +1 -1
  154. package/src/components/{TreePanel → tree}/TreeCanvasBlock.tsx +1 -1
  155. package/src/components/{TreePanel → tree}/TreeNodeMenu.tsx +1 -53
  156. package/src/components/{TreePanel/index.tsx → tree/TreePanel.tsx} +1 -1
  157. package/src/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.tsx +9 -2
  158. package/src/components/{TreePanel → tree}/renderTreeCanvas.ts +25 -41
  159. package/src/fetchUtils.ts +30 -0
  160. package/src/ggplotPalettes.ts +25 -0
  161. package/src/index.ts +1 -1
  162. package/src/launchInterProScan.ts +98 -0
  163. package/src/model/msaModel.ts +39 -0
  164. package/src/model/treeModel.ts +116 -0
  165. package/src/model.ts +1124 -1126
  166. package/src/parseGFF.ts +32 -0
  167. package/src/renderToSvg.tsx +27 -8
  168. package/src/reparseTree.ts +16 -0
  169. package/src/util.ts +4 -33
  170. package/src/version.ts +1 -1
  171. package/dist/DataModel.js.map +0 -1
  172. package/dist/DialogQueue.js.map +0 -1
  173. package/dist/SelectedStructuresMixin.d.ts +0 -46
  174. package/dist/SelectedStructuresMixin.js +0 -52
  175. package/dist/SelectedStructuresMixin.js.map +0 -1
  176. package/dist/StructureModel.d.ts +0 -9
  177. package/dist/StructureModel.js +0 -11
  178. package/dist/StructureModel.js.map +0 -1
  179. package/dist/UniprotTrack.d.ts +0 -27
  180. package/dist/UniprotTrack.js +0 -53
  181. package/dist/UniprotTrack.js.map +0 -1
  182. package/dist/components/BoxTrack.d.ts +0 -7
  183. package/dist/components/BoxTrack.js +0 -15
  184. package/dist/components/BoxTrack.js.map +0 -1
  185. package/dist/components/BoxTrackBlock.d.ts +0 -8
  186. package/dist/components/BoxTrackBlock.js +0 -136
  187. package/dist/components/BoxTrackBlock.js.map +0 -1
  188. package/dist/components/ExportSVGDialog.js.map +0 -1
  189. package/dist/components/Header.js +0 -62
  190. package/dist/components/Header.js.map +0 -1
  191. package/dist/components/HeaderInfoArea.js +0 -12
  192. package/dist/components/HeaderInfoArea.js.map +0 -1
  193. package/dist/components/ImportForm/ImportFormExamples.js.map +0 -1
  194. package/dist/components/ImportForm/data/seq2.js.map +0 -1
  195. package/dist/components/ImportForm/index.js.map +0 -1
  196. package/dist/components/ImportForm/util.js +0 -16
  197. package/dist/components/ImportForm/util.js.map +0 -1
  198. package/dist/components/MSAPanel/Loading.js.map +0 -1
  199. package/dist/components/MSAPanel/MSABlock.js.map +0 -1
  200. package/dist/components/MSAPanel/MSACanvas.js.map +0 -1
  201. package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +0 -1
  202. package/dist/components/MSAPanel/index.d.ts +0 -5
  203. package/dist/components/MSAPanel/index.js.map +0 -1
  204. package/dist/components/MSAPanel/renderMSABlock.js.map +0 -1
  205. package/dist/components/MSAPanel/renderMSAMouseover.js.map +0 -1
  206. package/dist/components/Minimap.js.map +0 -1
  207. package/dist/components/MinimapSVG.js.map +0 -1
  208. package/dist/components/MultiAlignmentSelector.js.map +0 -1
  209. package/dist/components/TreePanel/TreeBranchMenu.js.map +0 -1
  210. package/dist/components/TreePanel/TreeCanvas.js.map +0 -1
  211. package/dist/components/TreePanel/TreeCanvasBlock.js.map +0 -1
  212. package/dist/components/TreePanel/TreeNodeMenu.js.map +0 -1
  213. package/dist/components/TreePanel/TreeRuler.js.map +0 -1
  214. package/dist/components/TreePanel/dialogs/TreeNodeInfoDialog.js.map +0 -1
  215. package/dist/components/TreePanel/index.js.map +0 -1
  216. package/dist/components/TreePanel/renderTreeCanvas.js.map +0 -1
  217. package/dist/components/VerticalGuide.d.ts +0 -7
  218. package/dist/components/VerticalGuide.js +0 -30
  219. package/dist/components/VerticalGuide.js.map +0 -1
  220. package/dist/components/ZoomControls.js +0 -59
  221. package/dist/components/ZoomControls.js.map +0 -1
  222. package/src/SelectedStructuresMixin.ts +0 -59
  223. package/src/StructureModel.ts +0 -11
  224. package/src/UniprotTrack.ts +0 -59
  225. package/src/components/BoxTrack.tsx +0 -33
  226. package/src/components/BoxTrackBlock.tsx +0 -200
  227. package/src/components/Header.tsx +0 -99
  228. package/src/components/HeaderInfoArea.tsx +0 -21
  229. package/src/components/VerticalGuide.tsx +0 -50
  230. package/src/components/ZoomControls.tsx +0 -86
  231. package/dist/components/{MultiAlignmentSelector.js → header/MultiAlignmentSelector.js} +0 -0
  232. package/dist/components/{ImportForm/index.d.ts → import/ImportForm.d.ts} +0 -0
  233. package/dist/components/{ImportForm → import}/ImportFormExamples.d.ts +0 -0
  234. package/dist/components/{ImportForm → import}/data/seq2.d.ts +0 -0
  235. package/dist/components/{ImportForm → import}/data/seq2.js +0 -0
  236. package/dist/components/{ImportForm → import}/util.d.ts +0 -0
  237. package/dist/components/{Minimap.js → minimap/Minimap.js} +0 -0
  238. package/dist/components/{MinimapSVG.js → minimap/MinimapSVG.js} +0 -0
  239. package/dist/components/{MSAPanel → msa}/Loading.d.ts +0 -0
  240. package/dist/components/{MSAPanel → msa}/Loading.js +0 -0
  241. package/dist/components/{MSAPanel → msa}/MSACanvas.d.ts +0 -0
  242. package/dist/components/{MSAPanel/MSABlock.d.ts → msa/MSACanvasBlock.d.ts} +0 -0
  243. package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.d.ts +0 -0
  244. package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.js +0 -0
  245. package/dist/components/{MSAPanel → msa}/renderMSABlock.d.ts +1 -1
  246. /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.d.ts +0 -0
  247. /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.js +0 -0
  248. /package/dist/components/{TreePanel → tree}/TreeBranchMenu.d.ts +0 -0
  249. /package/dist/components/{TreePanel → tree}/TreeBranchMenu.js +0 -0
  250. /package/dist/components/{TreePanel → tree}/TreeCanvas.d.ts +0 -0
  251. /package/dist/components/{TreePanel → tree}/TreeCanvasBlock.d.ts +0 -0
  252. /package/dist/components/{TreePanel → tree}/TreeNodeMenu.d.ts +0 -0
  253. /package/dist/components/{TreePanel/index.d.ts → tree/TreePanel.d.ts} +0 -0
  254. /package/dist/components/{TreePanel → tree}/TreeRuler.d.ts +0 -0
  255. /package/dist/components/{TreePanel → tree}/TreeRuler.js +0 -0
  256. /package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.d.ts +0 -0
  257. /package/dist/components/{TreePanel → tree}/renderTreeCanvas.d.ts +0 -0
  258. /package/dist/{DataModel.d.ts → model/DataModel.d.ts} +0 -0
  259. /package/dist/{DataModel.js → model/DataModel.js} +0 -0
  260. /package/dist/{DialogQueue.d.ts → model/DialogQueue.d.ts} +0 -0
  261. /package/dist/{DialogQueue.js → model/DialogQueue.js} +0 -0
  262. /package/src/components/{ImportForm/index.tsx → import/ImportForm.tsx} +0 -0
  263. /package/src/components/{ImportForm → import}/data/seq2.ts +0 -0
  264. /package/src/components/{MSAPanel → msa}/Loading.tsx +0 -0
  265. /package/src/components/{MSAPanel → msa}/MSAMouseoverCanvas.tsx +0 -0
  266. /package/src/components/{MSAPanel → msa}/renderMSAMouseover.ts +0 -0
  267. /package/src/components/{TreePanel → tree}/TreeBranchMenu.tsx +0 -0
  268. /package/src/components/{TreePanel → tree}/TreeRuler.tsx +0 -0
  269. /package/src/{DataModel.ts → model/DataModel.ts} +0 -0
  270. /package/src/{DialogQueue.ts → model/DialogQueue.ts} +0 -0
@@ -5,6 +5,7 @@ import { Theme } from '@mui/material'
5
5
  import { MsaViewModel } from '../../model'
6
6
 
7
7
  export const padding = 600
8
+
8
9
  const extendBounds = 5
9
10
  const radius = 2.5
10
11
  const d = radius * 2
@@ -35,18 +36,20 @@ export function renderTree({
35
36
  const { hierarchy, showBranchLen, blockSize } = model
36
37
  const by = blockSizeYOverride || blockSize
37
38
  ctx.strokeStyle = theme.palette.text.primary
38
- for (const { source, target } of hierarchy.links()) {
39
- const y = showBranchLen ? 'len' : 'y'
39
+ for (const link of hierarchy.links()) {
40
+ const { source, target } = link
41
+ const sy = source.x!
42
+ const ty = target.x!
40
43
  // @ts-expect-error
41
- const { x: sy, [y]: sx } = source
44
+ const tx = showBranchLen ? target.len : target.y
42
45
  // @ts-expect-error
43
- const { x: ty, [y]: tx } = target
46
+ const sx = showBranchLen ? source.len : source.y
44
47
 
45
48
  const y1 = Math.min(sy, ty)
46
49
  const y2 = Math.max(sy, ty)
47
- // 1d line intersection to check if line crosses block at all, this is
48
- // an optimization that allows us to skip drawing most tree links
49
- // outside the block
50
+ // 1d line intersection to check if line crosses block at all, this is an
51
+ // optimization that allows us to skip drawing most tree links outside the
52
+ // block
50
53
  if (offsetY + by >= y1 && y2 >= offsetY) {
51
54
  ctx.beginPath()
52
55
  ctx.moveTo(sx, sy)
@@ -81,13 +84,9 @@ export function renderNodeBubbles({
81
84
  const by = blockSizeYOverride || blockSize
82
85
  for (const node of hierarchy.descendants()) {
83
86
  const val = showBranchLen ? 'len' : 'y'
84
- const {
85
- // @ts-expect-error
86
- x: y,
87
- // @ts-expect-error
88
- [val]: x,
89
- data,
90
- } = node
87
+ // @ts-expect-error
88
+ const { [val]: x, data } = node
89
+ const y = node.x!
91
90
  const { branchset, id = '', name = '' } = data
92
91
  if (
93
92
  !id.endsWith('-leafnode') &&
@@ -131,17 +130,16 @@ export function renderTreeLabels({
131
130
  blockSizeYOverride?: number
132
131
  }) {
133
132
  const {
134
- rowHeight,
133
+ fontSize,
135
134
  showBranchLen,
136
135
  treeMetadata,
137
136
  hierarchy,
138
137
  blockSize,
139
138
  labelsAlignRight,
140
139
  drawTree,
141
- structures,
142
140
  treeAreaWidth,
143
141
  treeAreaWidthMinusMargin,
144
- marginLeft: ml,
142
+ marginLeft,
145
143
  noTree,
146
144
  } = model
147
145
  const by = blockSizeYOverride || blockSize
@@ -153,39 +151,24 @@ export function renderTreeLabels({
153
151
  }
154
152
  for (const node of hierarchy.leaves()) {
155
153
  const {
156
- // @ts-expect-error
157
- x: y,
158
- // @ts-expect-error
159
- y: x,
160
154
  data: { name, id },
161
155
  // @ts-expect-error
162
156
  len,
163
157
  } = node
158
+ const y = node.x!
159
+ const x = node.y!
164
160
 
165
161
  const displayName = treeMetadata[name]?.genome || name
166
-
167
162
  if (y > offsetY - extendBounds && y < offsetY + by + extendBounds) {
168
163
  // note: +rowHeight/4 matches with -rowHeight/4 in msa
169
- const yp = y + rowHeight / 4
170
- const xp = showBranchLen ? len : x
164
+ const yp = y + fontSize / 4
165
+ const xp = (showBranchLen ? len : x) || 0
171
166
 
172
167
  const { width } = ctx.measureText(displayName)
173
168
  const height = ctx.measureText('M').width // use an 'em' for height
174
169
 
175
- const hasStructure = structures[name]
176
- ctx.fillStyle = hasStructure ? 'blue' : theme.palette.text.primary
177
-
178
- if (!drawTree && !labelsAlignRight) {
179
- ctx.fillText(displayName, 0, yp)
180
- clickMap?.insert({
181
- minX: 0 + ml,
182
- maxX: width + ml,
183
- minY: yp - height,
184
- maxY: yp,
185
- name,
186
- id,
187
- })
188
- } else if (labelsAlignRight) {
170
+ ctx.fillStyle = theme.palette.text.primary
171
+ if (labelsAlignRight) {
189
172
  const smallPadding = 2
190
173
  const offset = treeAreaWidthMinusMargin - smallPadding
191
174
  if (drawTree && !noTree) {
@@ -206,8 +189,8 @@ export function renderTreeLabels({
206
189
  } else {
207
190
  ctx.fillText(displayName, xp + d, yp)
208
191
  clickMap?.insert({
209
- minX: xp + d + ml,
210
- maxX: xp + d + width + ml,
192
+ minX: xp + d + marginLeft,
193
+ maxX: xp + d + width + marginLeft,
211
194
  minY: yp - height,
212
195
  maxY: yp,
213
196
  name,
@@ -240,6 +223,7 @@ export function renderTreeCanvas({
240
223
  const {
241
224
  noTree,
242
225
  drawTree,
226
+ drawLabels,
243
227
  drawNodeBubbles,
244
228
  treeWidth,
245
229
  highResScaleFactor,
@@ -288,7 +272,7 @@ export function renderTreeCanvas({
288
272
  }
289
273
  }
290
274
 
291
- if (rowHeight >= 5) {
275
+ if (rowHeight >= 5 && drawLabels) {
292
276
  renderTreeLabels({
293
277
  ctx,
294
278
  offsetY,
@@ -0,0 +1,30 @@
1
+ export async function myfetch(url: string, args?: RequestInit) {
2
+ const response = await fetch(url, args)
3
+
4
+ if (!response.ok) {
5
+ throw new Error(
6
+ `HTTP ${response.status} fetching ${url} ${await response.text()}`,
7
+ )
8
+ }
9
+
10
+ return response
11
+ }
12
+
13
+ export async function textfetch(url: string, args?: RequestInit) {
14
+ const response = await myfetch(url, args)
15
+ return response.text()
16
+ }
17
+
18
+ export async function jsonfetch(url: string, args?: RequestInit) {
19
+ const response = await myfetch(url, args)
20
+ return response.json()
21
+ }
22
+
23
+ export async function arraybufferfetch(url: string) {
24
+ const res = await myfetch(url)
25
+ return res.arrayBuffer()
26
+ }
27
+
28
+ export function timeout(time: number) {
29
+ return new Promise(res => setTimeout(res, time))
30
+ }
@@ -0,0 +1,25 @@
1
+ const palettes = [
2
+ ['#F8766D'],
3
+ ['#F8766D', '#00BFC4'],
4
+ ['#F8766D', '#00BA38', '#619CFF'],
5
+ ['#F8766D', '#7CAE00', '#00BFC4', '#C77CFF'],
6
+ ['#F8766D', '#A3A500', '#00BF7D', '#00B0F6', '#E76BF3'],
7
+ ['#F8766D', '#B79F00', '#00BA38', '#00BFC4', '#619CFF', '#F564E3'],
8
+ ['#F8766D', '#C49A00', '#53B400', '#00C094', '#00B6EB', '#A58AFF', '#FB61D7'],
9
+ [
10
+ '#F8766D',
11
+ '#CD9600',
12
+ '#7CAE00',
13
+ '#00BE67',
14
+ '#00BFC4',
15
+ '#00A9FF',
16
+ '#C77CFF',
17
+ '#FF61CC',
18
+ ],
19
+ ]
20
+
21
+ export function getPalette(l: number) {
22
+ return palettes[Math.min(l, palettes.length - 1)]
23
+ }
24
+
25
+ export default palettes
package/src/index.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { default as MSAView } from './components/Loading'
2
- export { default as MSAModel, type MsaViewModel } from './model'
2
+ export { default as MSAModelF, type MsaViewModel } from './model'
@@ -0,0 +1,98 @@
1
+ import { jsonfetch, textfetch, timeout } from './fetchUtils'
2
+
3
+ const base = `https://www.ebi.ac.uk/Tools/services/rest`
4
+
5
+ export interface InterProScanResults {
6
+ matches: {
7
+ signature: {
8
+ entry?: {
9
+ name: string
10
+ description: string
11
+ accession: string
12
+ }
13
+ }
14
+ locations: { start: number; end: number }[]
15
+ }[]
16
+ xref: { id: string }[]
17
+ }
18
+ export interface InterProScanResponse {
19
+ results: InterProScanResults[]
20
+ }
21
+
22
+ async function runInterProScan({
23
+ seq,
24
+ onProgress,
25
+ onJobId,
26
+ programs,
27
+ }: {
28
+ seq: string
29
+ programs: string[]
30
+ onProgress: (arg?: { msg: string; url?: string }) => void
31
+ onJobId: (arg: string) => void
32
+ }) {
33
+ const jobId = await textfetch(`${base}/iprscan5/run`, {
34
+ method: 'POST',
35
+ body: new URLSearchParams({
36
+ email: 'colin.diesh@gmail.com',
37
+ sequence: `${seq}`,
38
+ programs: programs.join(','),
39
+ }),
40
+ })
41
+ onJobId(jobId)
42
+ await wait({
43
+ jobId,
44
+ onProgress,
45
+ })
46
+ return loadInterProScanResults(jobId)
47
+ }
48
+
49
+ export async function loadInterProScanResults(jobId: string) {
50
+ return (await jsonfetch(
51
+ `${base}/iprscan5/result/${jobId}/json`,
52
+ )) as InterProScanResponse
53
+ }
54
+
55
+ async function wait({
56
+ onProgress,
57
+ jobId,
58
+ }: {
59
+ jobId: string
60
+ onProgress: (arg?: { msg: string; url?: string }) => void
61
+ }) {
62
+ const url = `${base}/iprscan5/status/${jobId}`
63
+ // eslint-disable-next-line no-constant-condition
64
+ while (true) {
65
+ for (let i = 0; i < 10; i++) {
66
+ await timeout(1000)
67
+ onProgress({ msg: `Checking status... ${10 - i}`, url })
68
+ }
69
+ const result = await textfetch(url)
70
+
71
+ if (result === 'FINISHED') {
72
+ break
73
+ }
74
+ }
75
+ }
76
+
77
+ export async function launchInterProScan({
78
+ algorithm,
79
+ seq,
80
+ programs,
81
+ onJobId,
82
+ onProgress,
83
+ }: {
84
+ algorithm: string
85
+ seq: string
86
+ programs: string[]
87
+ onProgress: (arg?: { msg: string; url?: string }) => void
88
+ onJobId: (arg: string) => void
89
+ }) {
90
+ onProgress({ msg: `Launching ${algorithm} MSA...` })
91
+ if (algorithm === 'interproscan') {
92
+ const result = await runInterProScan({ seq, onJobId, onProgress, programs })
93
+ onProgress()
94
+ return result
95
+ } else {
96
+ throw new Error('unknown algorithm')
97
+ }
98
+ }
@@ -0,0 +1,39 @@
1
+ import { types } from 'mobx-state-tree'
2
+
3
+ /**
4
+ * #stateModel MSAModel
5
+ */
6
+ function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
7
+
8
+ export function MSAModelF() {
9
+ return types
10
+ .model({
11
+ /**
12
+ * #property
13
+ * draw MSA tiles with a background color
14
+ */
15
+ bgColor: true,
16
+
17
+ /**
18
+ * #property
19
+ * default color scheme name
20
+ */
21
+ colorSchemeName: 'maeditor',
22
+ })
23
+ .actions(self => ({
24
+ /**
25
+ * #action
26
+ * set color scheme name
27
+ */
28
+ setColorSchemeName(name: string) {
29
+ self.colorSchemeName = name
30
+ },
31
+
32
+ /**
33
+ * #action
34
+ */
35
+ setBgColor(arg: boolean) {
36
+ self.bgColor = arg
37
+ },
38
+ }))
39
+ }
@@ -0,0 +1,116 @@
1
+ import { types } from 'mobx-state-tree'
2
+
3
+ /**
4
+ * #stateModel Tree
5
+ */
6
+ function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
7
+
8
+ export function TreeF() {
9
+ return types
10
+ .model({
11
+ /**
12
+ * #property
13
+ */
14
+ drawLabels: true,
15
+ /**
16
+ * #property
17
+ * right-align the labels
18
+ */
19
+ labelsAlignRight: false,
20
+
21
+ /**
22
+ * #property
23
+ * width of the area the tree is drawn in, px
24
+ */
25
+ treeAreaWidth: types.optional(types.number, 400),
26
+
27
+ /**
28
+ * #property
29
+ * width of the tree within the treeArea, px
30
+ */
31
+ treeWidth: types.optional(types.number, 300),
32
+
33
+ /**
34
+ * #getter
35
+ * synchronization that matches treeWidth to treeAreaWidth
36
+ */
37
+ treeWidthMatchesArea: true,
38
+
39
+ /**
40
+ * #property
41
+ * use "branch length" e.g. evolutionary distance to draw tree branch
42
+ * lengths. if false, the layout is a "cladogram" that does not take into
43
+ * account evolutionary distances
44
+ */
45
+ showBranchLen: true,
46
+
47
+ /**
48
+ * #property
49
+ * draw tree, boolean
50
+ */
51
+ drawTree: true,
52
+
53
+ /**
54
+ * #property
55
+ * draw clickable node bubbles on the tree
56
+ */
57
+ drawNodeBubbles: true,
58
+ })
59
+ .actions(self => ({
60
+ /**
61
+ * #action
62
+ * synchronize the treewidth and treeareawidth
63
+ */
64
+ setTreeWidthMatchesArea(arg: boolean) {
65
+ self.treeWidthMatchesArea = arg
66
+ },
67
+
68
+ /**
69
+ * #action
70
+ * set tree area width (px)
71
+ */
72
+ setTreeAreaWidth(n: number) {
73
+ self.treeAreaWidth = n
74
+ },
75
+ /**
76
+ * #action
77
+ * set tree width (px)
78
+ */
79
+ setTreeWidth(n: number) {
80
+ self.treeWidth = n
81
+ },
82
+
83
+ /**
84
+ * #action
85
+ */
86
+ setLabelsAlignRight(arg: boolean) {
87
+ self.labelsAlignRight = arg
88
+ },
89
+ /**
90
+ * #action
91
+ */
92
+ setDrawTree(arg: boolean) {
93
+ self.drawTree = arg
94
+ },
95
+
96
+ /**
97
+ * #action
98
+ */
99
+ setShowBranchLen(arg: boolean) {
100
+ self.showBranchLen = arg
101
+ },
102
+
103
+ /**
104
+ * #action
105
+ */
106
+ setDrawNodeBubbles(arg: boolean) {
107
+ self.drawNodeBubbles = arg
108
+ },
109
+ /**
110
+ * #action
111
+ */
112
+ setDrawLabels(arg: boolean) {
113
+ self.drawLabels = arg
114
+ },
115
+ }))
116
+ }