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
@@ -0,0 +1,32 @@
1
+ export function parseGFF(str?: string) {
2
+ return str
3
+ ?.split('\n')
4
+ .map(f => f.trim())
5
+ .filter(f => !!f && !f.startsWith('#'))
6
+ .map(f => {
7
+ const [seq_id, source, type, start, end, score, strand, phase, col9] =
8
+ f.split('\t')
9
+
10
+ return {
11
+ seq_id,
12
+ source,
13
+ type,
14
+ start: +start,
15
+ end: +end,
16
+ score: +score,
17
+ strand,
18
+ phase,
19
+ ...Object.fromEntries(
20
+ col9
21
+ .split(';')
22
+ .map(f => f.trim())
23
+ .filter(f => !!f)
24
+ .map(f => f.split('='))
25
+ .map(([key, val]) => [
26
+ key.trim(),
27
+ decodeURIComponent(val).trim().split(',').join(' '),
28
+ ]),
29
+ ),
30
+ }
31
+ })
32
+ }
@@ -6,10 +6,12 @@ import { Theme } from '@mui/material'
6
6
 
7
7
  // locals
8
8
  import { MsaViewModel } from './model'
9
- import { renderTreeCanvas } from './components/TreePanel/renderTreeCanvas'
10
- import { renderMSABlock } from './components/MSAPanel/renderMSABlock'
9
+ import { renderTreeCanvas } from './components/tree/renderTreeCanvas'
10
+ import { renderMSABlock } from './components/msa/renderMSABlock'
11
11
  import { colorContrast } from './util'
12
- import MinimapSVG from './components/MinimapSVG'
12
+
13
+ import MinimapSVG from './components/minimap/MinimapSVG'
14
+ import { renderBoxFeatureCanvasBlock } from './components/msa/renderBoxFeatureCanvasBlock'
13
15
 
14
16
  export async function renderToSvg(
15
17
  model: MsaViewModel,
@@ -126,11 +128,21 @@ function CoreRendering({
126
128
  height: number,
127
129
  ) => CanvasRenderingContext2D & { getSvg: () => { innerHTML: string } }
128
130
  }) {
129
- const clipId = 'tree'
131
+ const clipId1 = 'tree'
132
+ const clipId2 = 'msa'
130
133
  const { treeAreaWidth, colorScheme } = model
131
134
  const contrastScheme = colorContrast(colorScheme, theme)
132
135
  const ctx1 = Context(width, height)
133
136
  const ctx2 = Context(width, height)
137
+ renderBoxFeatureCanvasBlock({
138
+ ctx: ctx2,
139
+ offsetX,
140
+ offsetY,
141
+ model,
142
+ blockSizeYOverride: height,
143
+ highResScaleFactorOverride: 1,
144
+ })
145
+ const msaAreaWidth = width - treeAreaWidth
134
146
  renderTreeCanvas({
135
147
  model,
136
148
  offsetY,
@@ -146,23 +158,30 @@ function CoreRendering({
146
158
  offsetX,
147
159
  contrastScheme,
148
160
  ctx: ctx2,
149
- blockSizeXOverride: width - treeAreaWidth,
161
+ blockSizeXOverride: msaAreaWidth,
150
162
  blockSizeYOverride: height,
151
163
  highResScaleFactorOverride: 1,
152
164
  })
153
165
  return (
154
166
  <>
155
167
  <defs>
156
- <clipPath id={clipId}>
168
+ <clipPath id={clipId1}>
157
169
  <rect x={0} y={0} width={treeAreaWidth} height={height} />
158
170
  </clipPath>
159
171
  </defs>
172
+ <defs>
173
+ <clipPath id={clipId2}>
174
+ <rect x={0} y={0} width={msaAreaWidth} height={height} />
175
+ </clipPath>
176
+ </defs>
177
+
160
178
  <g
161
- clipPath={`url(#${clipId})`}
179
+ clipPath={`url(#${clipId1})`}
162
180
  /* eslint-disable-next-line react/no-danger */
163
181
  dangerouslySetInnerHTML={{ __html: ctx1.getSvg().innerHTML }}
164
182
  />
165
183
  <g
184
+ clipPath={`url(#${clipId2})`}
166
185
  transform={`translate(${treeAreaWidth} 0)`}
167
186
  /* eslint-disable-next-line react/no-danger */
168
187
  dangerouslySetInnerHTML={{ __html: ctx2.getSvg().innerHTML }}
@@ -214,5 +233,5 @@ function SvgWrapper({
214
233
  }
215
234
 
216
235
  function NullWrapper({ children }: { children: React.ReactNode }) {
217
- return <>{children}</>
236
+ return children
218
237
  }
@@ -0,0 +1,16 @@
1
+ import { NodeWithIds } from './util'
2
+
3
+ export function reparseTree(tree: NodeWithIds): NodeWithIds {
4
+ return {
5
+ ...tree,
6
+ branchset: tree.branchset.map(r =>
7
+ r.branchset.length
8
+ ? reparseTree(r)
9
+ : {
10
+ branchset: [r],
11
+ id: `${r.id}-leafnode`,
12
+ name: `${r.name}-hidden`,
13
+ },
14
+ ),
15
+ }
16
+ }
package/src/util.ts CHANGED
@@ -63,39 +63,6 @@ export function colorContrast(
63
63
  ])
64
64
  }
65
65
 
66
- export function parseGFF(str?: string) {
67
- return str
68
- ?.split('\n')
69
- .map(f => f.trim())
70
- .filter(f => !!f && !f.startsWith('#'))
71
- .map(f => {
72
- const [seq_id, source, type, start, end, score, strand, phase, col9] =
73
- f.split('\t')
74
-
75
- return {
76
- seq_id,
77
- source,
78
- type,
79
- start: +start,
80
- end: +end,
81
- score: +score,
82
- strand,
83
- phase,
84
- ...Object.fromEntries(
85
- col9
86
- .split(';')
87
- .map(f => f.trim())
88
- .filter(f => !!f)
89
- .map(f => f.split('='))
90
- .map(([key, val]) => [
91
- key.trim(),
92
- decodeURIComponent(val).trim().split(',').join(' '),
93
- ]),
94
- ),
95
- }
96
- })
97
- }
98
-
99
66
  export function skipBlanks(blanks: number[], arg: string | string[]) {
100
67
  let s = ''
101
68
  let b = 0
@@ -148,3 +115,7 @@ export function collapse(d: HierarchyNode<NodeWithIds>) {
148
115
  export function clamp(min: number, num: number, max: number) {
149
116
  return Math.min(Math.max(num, min), max)
150
117
  }
118
+
119
+ export function len(a: { end: number; start: number }) {
120
+ return a.end - a.start
121
+ }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '3.1.7'
1
+ export const version = '3.1.8'
@@ -1 +0,0 @@
1
- {"version":3,"file":"DataModel.js","sourceRoot":"","sources":["../src/DataModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK;SACT,KAAK,CAAC;QACL;;WAEG;QACH,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/B;;WAEG;QACH,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9B;;WAEG;QACH,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;KACxC,CAAC;SACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB;;WAEG;QACH,OAAO,CAAC,IAAa;YACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAClB,CAAC;QACD;;WAEG;QACH,MAAM,CAAC,GAAY;YACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QAChB,CAAC;QACD;;WAEG;QACH,eAAe,CAAC,YAAqB;YACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAClC,CAAC;KACF,CAAC,CAAC,CAAA;AACP,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DialogQueue.js","sourceRoot":"","sources":["../src/DialogQueue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK;SACT,KAAK,CAAC,yBAAyB,EAAE,EAAE,CAAC;SACpC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACf,8DAA8D;QAC9D,cAAc,EAAE,EAAkC;KACnD,CAAC,CAAC;SACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd;;WAEG;QACH,IAAI,eAAe;YACjB,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACpC,CAAC;QACD;;WAEG;QACH,IAAI,WAAW;YACb,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACpC,CAAC;KACF,CAAC,CAAC;SACF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB;;WAEG;QACH,kBAAkB;YAChB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACpD,CAAC;QACD;;WAEG;QACH,WAAW,CACT,EAAgE;YAEhE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;gBACjC,IAAI,CAAC,kBAAkB,EAAE,CAAA;YAC3B,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;QACpE,CAAC;KACF,CAAC,CAAC,CAAA;AACP,CAAC"}
@@ -1,46 +0,0 @@
1
- import { SnapshotIn } from 'mobx-state-tree';
2
- import { StructureModel } from './StructureModel';
3
- export type StructureSnap = SnapshotIn<typeof StructureModel>;
4
- export declare function SelectedStructuresMixin(): import("mobx-state-tree").IModelType<{
5
- /**
6
- * #property
7
- * currently "selected" structures, generally PDB 3-D protein structures
8
- */
9
- selectedStructures: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
10
- id: import("mobx-state-tree").ISimpleType<string>;
11
- structure: import("mobx-state-tree").IModelType<{
12
- pdb: import("mobx-state-tree").ISimpleType<string>;
13
- startPos: import("mobx-state-tree").ISimpleType<number>;
14
- endPos: import("mobx-state-tree").ISimpleType<number>;
15
- }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
16
- range: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
17
- }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
18
- }, {
19
- /**
20
- * #action
21
- * add to the selected structures
22
- */
23
- addStructureToSelection(elt: StructureSnap): void;
24
- /**
25
- * #action
26
- * remove from the selected structures
27
- */
28
- removeStructureFromSelection(elt: StructureSnap): void;
29
- /**
30
- * #action
31
- * toggle a structure from the selected structures list
32
- */
33
- toggleStructureSelection(elt: {
34
- id: string;
35
- structure: {
36
- startPos: number;
37
- endPos: number;
38
- pdb: string;
39
- };
40
- }): void;
41
- /**
42
- * #action
43
- * clear all selected structures
44
- */
45
- clearSelectedStructures(): void;
46
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
@@ -1,52 +0,0 @@
1
- import { cast, types } from 'mobx-state-tree';
2
- import { StructureModel } from './StructureModel';
3
- export function SelectedStructuresMixin() {
4
- return types
5
- .model({
6
- /**
7
- * #property
8
- * currently "selected" structures, generally PDB 3-D protein structures
9
- */
10
- selectedStructures: types.array(StructureModel),
11
- })
12
- .actions(self => ({
13
- /**
14
- * #action
15
- * add to the selected structures
16
- */
17
- addStructureToSelection(elt) {
18
- self.selectedStructures.push(elt);
19
- },
20
- /**
21
- * #action
22
- * remove from the selected structures
23
- */
24
- removeStructureFromSelection(elt) {
25
- const r = self.selectedStructures.find(node => node.id === elt.id);
26
- if (r) {
27
- self.selectedStructures.remove(r);
28
- }
29
- },
30
- /**
31
- * #action
32
- * toggle a structure from the selected structures list
33
- */
34
- toggleStructureSelection(elt) {
35
- const r = self.selectedStructures.find(node => node.id === elt.id);
36
- if (r) {
37
- self.selectedStructures.remove(r);
38
- }
39
- else {
40
- self.selectedStructures.push(elt);
41
- }
42
- },
43
- /**
44
- * #action
45
- * clear all selected structures
46
- */
47
- clearSelectedStructures() {
48
- self.selectedStructures = cast([]);
49
- },
50
- }));
51
- }
52
- //# sourceMappingURL=SelectedStructuresMixin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SelectedStructuresMixin.js","sourceRoot":"","sources":["../src/SelectedStructuresMixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,IAAI,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAIjD,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK;SACT,KAAK,CAAC;QACL;;;WAGG;QACH,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;KAChD,CAAC;SACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB;;;WAGG;QACH,uBAAuB,CAAC,GAAkB;YACxC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACnC,CAAC;QAED;;;WAGG;QACH,4BAA4B,CAAC,GAAkB;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAED;;;WAGG;QACH,wBAAwB,CAAC,GAGxB;YACC,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAED;;;WAGG;QACH,uBAAuB;YACrB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;QACpC,CAAC;KACF,CAAC,CAAC,CAAA;AACP,CAAC"}
@@ -1,9 +0,0 @@
1
- export declare const StructureModel: import("mobx-state-tree").IModelType<{
2
- id: import("mobx-state-tree").ISimpleType<string>;
3
- structure: import("mobx-state-tree").IModelType<{
4
- pdb: import("mobx-state-tree").ISimpleType<string>;
5
- startPos: import("mobx-state-tree").ISimpleType<number>;
6
- endPos: import("mobx-state-tree").ISimpleType<number>;
7
- }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
8
- range: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
9
- }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
@@ -1,11 +0,0 @@
1
- import { types } from 'mobx-state-tree';
2
- export const StructureModel = types.model({
3
- id: types.identifier,
4
- structure: types.model({
5
- pdb: types.string,
6
- startPos: types.number,
7
- endPos: types.number,
8
- }),
9
- range: types.maybe(types.string),
10
- });
11
- //# sourceMappingURL=StructureModel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StructureModel.js","sourceRoot":"","sources":["../src/StructureModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;IACxC,EAAE,EAAE,KAAK,CAAC,UAAU;IACpB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC;QACrB,GAAG,EAAE,KAAK,CAAC,MAAM;QACjB,QAAQ,EAAE,KAAK,CAAC,MAAM;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;IACF,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;CACjC,CAAC,CAAA"}
@@ -1,27 +0,0 @@
1
- export declare const UniprotTrack: import("mobx-state-tree").IModelType<{
2
- id: import("mobx-state-tree").ISimpleType<string>;
3
- accession: import("mobx-state-tree").ISimpleType<string>;
4
- name: import("mobx-state-tree").ISimpleType<string>;
5
- associatedRowName: import("mobx-state-tree").ISimpleType<string>;
6
- height: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<number>, [undefined]>;
7
- }, {
8
- error: unknown;
9
- data: string | undefined;
10
- } & {
11
- setError(error: unknown): void;
12
- setData(data: string): void;
13
- } & {
14
- afterCreate(): void;
15
- } & {
16
- readonly loading: boolean;
17
- readonly features: {
18
- seq_id: string;
19
- source: string;
20
- type: string;
21
- start: number;
22
- end: number;
23
- score: number;
24
- strand: string;
25
- phase: string;
26
- }[] | undefined;
27
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
@@ -1,53 +0,0 @@
1
- import { types, addDisposer } from 'mobx-state-tree';
2
- import { autorun } from 'mobx';
3
- // locals
4
- import { parseGFF } from './util';
5
- export const UniprotTrack = types
6
- .model({
7
- id: types.string,
8
- accession: types.string,
9
- name: types.string,
10
- associatedRowName: types.string,
11
- height: types.optional(types.number, 100),
12
- })
13
- .volatile(() => ({
14
- error: undefined,
15
- data: undefined,
16
- }))
17
- .actions(self => ({
18
- setError(error) {
19
- self.error = error;
20
- },
21
- setData(data) {
22
- self.data = data;
23
- },
24
- }))
25
- .actions(self => ({
26
- afterCreate() {
27
- addDisposer(self, autorun(async () => {
28
- try {
29
- const { accession } = self;
30
- const accessionSansVersion = accession?.replace(/\.[^/.]+$/, '');
31
- const url = `https://rest.uniprot.org/uniprotkb/${accessionSansVersion}.gff`;
32
- const res = await fetch(url);
33
- if (!res.ok) {
34
- throw new Error(`HTTP ${res.status} fetching ${url}: ${await res.text()}`);
35
- }
36
- self.setData(await res.text());
37
- }
38
- catch (e) {
39
- console.error(e);
40
- self.setError(e);
41
- }
42
- }));
43
- },
44
- }))
45
- .views(self => ({
46
- get loading() {
47
- return !self.data;
48
- },
49
- get features() {
50
- return parseGFF(self.data);
51
- },
52
- }));
53
- //# sourceMappingURL=UniprotTrack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UniprotTrack.js","sourceRoot":"","sources":["../src/UniprotTrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK;KAC9B,KAAK,CAAC;IACL,EAAE,EAAE,KAAK,CAAC,MAAM;IAChB,SAAS,EAAE,KAAK,CAAC,MAAM;IACvB,IAAI,EAAE,KAAK,CAAC,MAAM;IAClB,iBAAiB,EAAE,KAAK,CAAC,MAAM;IAC/B,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;CAC1C,CAAC;KACD,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IACf,KAAK,EAAE,SAAoB;IAC3B,IAAI,EAAE,SAA+B;CACtC,CAAC,CAAC;KACF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,QAAQ,CAAC,KAAc;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IACD,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF,CAAC,CAAC;KACF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,WAAW;QACT,WAAW,CACT,IAAI,EACJ,OAAO,CAAC,KAAK,IAAI,EAAE;YACjB,IAAI,CAAC;gBACH,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;gBAC1B,MAAM,oBAAoB,GAAG,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;gBAChE,MAAM,GAAG,GAAG,sCAAsC,oBAAoB,MAAM,CAAA;gBAC5E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CACb,QAAQ,GAAG,CAAC,MAAM,aAAa,GAAG,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAC1D,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YAChC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAChB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CACH,CAAA;IACH,CAAC;CACF,CAAC,CAAC;KACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,IAAI,OAAO;QACT,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;IACnB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;CACF,CAAC,CAAC,CAAA"}
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import { IBoxTrack, MsaViewModel } from '../model';
3
- declare const BoxTrack: ({ model, track, }: {
4
- model: MsaViewModel;
5
- track: IBoxTrack;
6
- }) => React.JSX.Element;
7
- export default BoxTrack;
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- import { observer } from 'mobx-react';
3
- import BoxTrackBlock from './BoxTrackBlock';
4
- const BoxTrack = observer(function ({ model, track, }) {
5
- const { blocksX, msaAreaWidth } = model;
6
- const { height } = track.model;
7
- return (React.createElement("div", { style: {
8
- position: 'relative',
9
- height,
10
- width: msaAreaWidth,
11
- overflow: 'hidden',
12
- } }, blocksX.map(bx => (React.createElement(BoxTrackBlock, { track: track, key: bx, model: model, offsetX: bx })))));
13
- });
14
- export default BoxTrack;
15
- //# sourceMappingURL=BoxTrack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BoxTrack.js","sourceRoot":"","sources":["../../src/components/BoxTrack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,OAAO,aAAa,MAAM,iBAAiB,CAAA;AAE3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAClC,KAAK,EACL,KAAK,GAIN;IACC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,CAAA;IACvC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAA;IAC9B,OAAO,CACL,6BACE,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM;YACN,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,QAAQ;SACnB,IAEA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CACjB,oBAAC,aAAa,IAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAI,CACpE,CAAC,CACE,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import { IBoxTrack, MsaViewModel } from '../model';
3
- declare const BoxTrackBlock: ({ track, model, offsetX, }: {
4
- track: IBoxTrack;
5
- model: MsaViewModel;
6
- offsetX: number;
7
- }) => React.JSX.Element | null;
8
- export default BoxTrackBlock;
@@ -1,136 +0,0 @@
1
- import React, { useRef, useMemo, useEffect } from 'react';
2
- import { observer } from 'mobx-react';
3
- import { getSnapshot, isStateTreeNode } from 'mobx-state-tree';
4
- import Layout from '../layout';
5
- const BoxTrackBlock = observer(function ({ track, model, offsetX, }) {
6
- const { blockSize, colWidth, blanks, rowHeight, highResScaleFactor, fontSize, scrollX, } = model;
7
- const { height, features, associatedRowName } = track.model;
8
- const feats = isStateTreeNode(features)
9
- ? // @ts-expect-error
10
- getSnapshot(features)
11
- : features;
12
- const layout = useMemo(() => {
13
- const temp = new Layout();
14
- feats?.forEach((feature, index) => {
15
- const { start, end } = feature;
16
- if (associatedRowName) {
17
- const s = model.rowSpecificBpToPx(associatedRowName, start - 1);
18
- const e = model.rowSpecificBpToPx(associatedRowName, end);
19
- temp.addRect(`${index}`, s, e, rowHeight, feature);
20
- }
21
- else {
22
- const s = model.globalBpToPx(start - 1);
23
- const e = model.globalBpToPx(end);
24
- temp.addRect(`${index}`, s, e, rowHeight, feature);
25
- }
26
- });
27
- return temp;
28
- // might convert to autorun based drawing
29
- // eslint-disable-next-line react-hooks/exhaustive-deps
30
- }, [rowHeight, feats, associatedRowName, model, blanks]);
31
- const ref = useRef(null);
32
- const labelRef = useRef(null);
33
- const mouseoverRef = useRef(null);
34
- useEffect(() => {
35
- if (!ref.current) {
36
- return;
37
- }
38
- const ctx = ref.current.getContext('2d');
39
- if (!ctx) {
40
- return;
41
- }
42
- ctx.resetTransform();
43
- ctx.scale(highResScaleFactor, highResScaleFactor);
44
- ctx.clearRect(0, 0, blockSize, height);
45
- ctx.translate(-offsetX, 0);
46
- ctx.textAlign = 'center';
47
- ctx.font = ctx.font.replace(/\d+px/, `${fontSize}px`);
48
- const xStart = Math.max(0, Math.floor(offsetX / colWidth));
49
- ctx.fillStyle = 'goldenrod';
50
- layout.rectangles.forEach(value => {
51
- const { minX, maxX, minY, maxY } = value;
52
- const x1 = (minX - xStart) * colWidth + offsetX - (offsetX % colWidth);
53
- const x2 = (maxX - xStart) * colWidth + offsetX - (offsetX % colWidth);
54
- if (x2 - x1 > 0) {
55
- ctx.fillRect(x1, minY, x2 - x1, (maxY - minY) / 2);
56
- }
57
- });
58
- }, [
59
- associatedRowName,
60
- fontSize,
61
- blockSize,
62
- colWidth,
63
- layout.rectangles,
64
- model,
65
- rowHeight,
66
- height,
67
- offsetX,
68
- highResScaleFactor,
69
- features,
70
- blanks,
71
- ]);
72
- useEffect(() => {
73
- if (!labelRef.current) {
74
- return;
75
- }
76
- const ctx = labelRef.current.getContext('2d');
77
- if (!ctx) {
78
- return;
79
- }
80
- // this logic is very similar to MSACanvas
81
- ctx.resetTransform();
82
- ctx.scale(highResScaleFactor, highResScaleFactor);
83
- ctx.clearRect(0, 0, blockSize, height);
84
- ctx.translate(-offsetX, 0);
85
- ctx.textAlign = 'center';
86
- ctx.font = ctx.font.replace(/\d+px/, `${Math.max(8, rowHeight - 8)}px`);
87
- ctx.fillStyle = 'black';
88
- ctx.textAlign = 'left';
89
- for (const value of layout.rectangles.values()) {
90
- const { minX, maxX, maxY, minY, data } = value;
91
- const x1 = minX * colWidth;
92
- const x2 = maxX * colWidth;
93
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
- const feature = data;
95
- if (x2 - x1 > 0) {
96
- const note = feature.attributes?.Note?.[0];
97
- const name = feature.attributes?.Name?.[0];
98
- const type = feature.type;
99
- ctx.fillText([type, name, note].filter(f => !!f).join(' - '), Math.max(Math.min(-scrollX, x2), x1), minY + (maxY - minY));
100
- }
101
- }
102
- }, [
103
- blockSize,
104
- colWidth,
105
- scrollX,
106
- highResScaleFactor,
107
- height,
108
- layout.rectangles,
109
- offsetX,
110
- features,
111
- model,
112
- rowHeight,
113
- blanks,
114
- ]);
115
- return !features ? null : (React.createElement(React.Fragment, null,
116
- React.createElement("canvas", { ref: ref, height: height * highResScaleFactor, width: blockSize * highResScaleFactor, style: {
117
- position: 'absolute',
118
- left: scrollX + offsetX,
119
- width: blockSize,
120
- height,
121
- } }),
122
- React.createElement("canvas", { ref: labelRef, height: height * highResScaleFactor, width: blockSize * highResScaleFactor, style: {
123
- position: 'absolute',
124
- left: scrollX + offsetX,
125
- width: blockSize,
126
- height,
127
- } }),
128
- React.createElement("canvas", { ref: mouseoverRef, height: height * highResScaleFactor, width: blockSize * highResScaleFactor, style: {
129
- position: 'absolute',
130
- left: scrollX + offsetX,
131
- width: blockSize,
132
- height,
133
- } })));
134
- });
135
- export default BoxTrackBlock;
136
- //# sourceMappingURL=BoxTrackBlock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BoxTrackBlock.js","sourceRoot":"","sources":["../../src/components/BoxTrackBlock.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExportSVGDialog.js","sourceRoot":"","sources":["../../src/components/ExportSVGDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EACL,MAAM,EACN,QAAQ,EACR,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,UAAU,EACV,KAAK,EACL,UAAU,EACV,QAAQ,GACT,MAAM,eAAe,CAAA;AAGtB,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,KAAK,EACL,OAAO,GAIR;IACC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAW,CAAA;IAC7C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,OAAO,CACL,oBAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,QAAC,KAAK,EAAC,YAAY;QACvD,oBAAC,aAAa;YACX,KAAK,CAAC,CAAC,CAAC,oBAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI;YAC9C,oBAAC,UAAU,oBAAuB;YAClC;gBACE,oBAAC,WAAW;oBACV,oBAAC,gBAAgB,IACf,OAAO,EACL,oBAAC,QAAQ,IACP,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAC1D,EAEJ,QAAQ,EAAE,UAAU,KAAK,QAAQ,EACjC,KAAK,EAAC,kBAAkB,GACxB,CACU,CACV;YACN;gBACE,oBAAC,WAAW;oBACV,oBAAC,SAAS,sBAAwB;oBAClC,oBAAC,UAAU,IACT,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;wBAEpD,oBAAC,gBAAgB,IACf,KAAK,EAAC,QAAQ,EACd,OAAO,EAAE,oBAAC,KAAK,OAAG,EAClB,KAAK,EAAC,YAAY,GAClB;wBACF,oBAAC,gBAAgB,IACf,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,oBAAC,KAAK,OAAG,EAClB,KAAK,EAAC,uBAAuB,GAC7B,CACS,CACD,CACV,CACQ;QAChB,oBAAC,aAAa;YACZ,oBAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,SAAS,EACf,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI,CAAC;wBACH,MAAM,KAAK,CAAC,SAAS,CAAC;4BACpB,KAAK;4BACL,cAAc,EACZ,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc;4BAClD,UAAU;yBACX,CAAC,CAAA;oBACJ,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;wBAChB,QAAQ,CAAC,CAAC,CAAC,CAAA;oBACb,CAAC;oBACD,OAAO,EAAE,CAAA;gBACX,CAAC,aAGM;YACT,oBAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,WAAW,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,aAE7D,CACK,CACT,CACV,CAAA;AACH,CAAC"}