react-msaview 3.1.10 → 3.1.12

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 (68) hide show
  1. package/bundle/index.js +31 -45
  2. package/dist/components/Loading.js +1 -1
  3. package/dist/components/Loading.js.map +1 -1
  4. package/dist/components/SequenceTextArea.js +5 -0
  5. package/dist/components/SequenceTextArea.js.map +1 -1
  6. package/dist/components/dialogs/DomainDialog.d.ts +6 -0
  7. package/dist/components/dialogs/DomainDialog.js +19 -0
  8. package/dist/components/dialogs/DomainDialog.js.map +1 -0
  9. package/dist/components/dialogs/InterProScanPanel.d.ts +7 -0
  10. package/dist/components/dialogs/{InterProScanDialog.js → InterProScanPanel.js} +36 -8
  11. package/dist/components/dialogs/InterProScanPanel.js.map +1 -0
  12. package/dist/components/dialogs/SettingsDialog.js +3 -3
  13. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  14. package/dist/components/dialogs/TabPanel.d.ts +6 -0
  15. package/dist/components/dialogs/TabPanel.js +6 -0
  16. package/dist/components/dialogs/TabPanel.js.map +1 -0
  17. package/dist/components/dialogs/{InterProScanDialog.d.ts → UserProvidedResultPanel.d.ts} +2 -2
  18. package/dist/components/dialogs/UserProvidedResultPanel.js +56 -0
  19. package/dist/components/dialogs/UserProvidedResultPanel.js.map +1 -0
  20. package/dist/components/header/Header.js +0 -2
  21. package/dist/components/header/Header.js.map +1 -1
  22. package/dist/components/header/HeaderMenuExtra.js +36 -25
  23. package/dist/components/header/HeaderMenuExtra.js.map +1 -1
  24. package/dist/components/header/HeaderStatusArea.d.ts +1 -1
  25. package/dist/components/header/HeaderStatusArea.js +3 -2
  26. package/dist/components/header/HeaderStatusArea.js.map +1 -1
  27. package/dist/components/msa/MSACanvas.js +6 -8
  28. package/dist/components/msa/MSACanvas.js.map +1 -1
  29. package/dist/components/msa/MSACanvasBlock.js +1 -1
  30. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +2 -2
  31. package/dist/components/msa/renderMSABlock.js +4 -4
  32. package/dist/components/tree/TreeCanvas.js +4 -6
  33. package/dist/components/tree/TreeCanvas.js.map +1 -1
  34. package/dist/fetchUtils.d.ts +1 -1
  35. package/dist/fetchUtils.js.map +1 -1
  36. package/dist/launchInterProScan.d.ts +9 -3
  37. package/dist/launchInterProScan.js +58 -21
  38. package/dist/launchInterProScan.js.map +1 -1
  39. package/dist/model.d.ts +18 -38
  40. package/dist/model.js +5 -66
  41. package/dist/model.js.map +1 -1
  42. package/dist/parsers/StockholmMSA.d.ts +2 -2
  43. package/dist/renderToSvg.js +0 -23
  44. package/dist/renderToSvg.js.map +1 -1
  45. package/dist/version.d.ts +1 -1
  46. package/dist/version.js +1 -1
  47. package/package.json +1 -4
  48. package/src/components/Loading.tsx +7 -5
  49. package/src/components/SequenceTextArea.tsx +9 -0
  50. package/src/components/dialogs/DomainDialog.tsx +38 -0
  51. package/src/components/dialogs/{InterProScanDialog.tsx → InterProScanPanel.tsx} +41 -10
  52. package/src/components/dialogs/SettingsDialog.tsx +4 -4
  53. package/src/components/dialogs/TabPanel.tsx +19 -0
  54. package/src/components/dialogs/UserProvidedResultPanel.tsx +119 -0
  55. package/src/components/header/Header.tsx +0 -2
  56. package/src/components/header/HeaderMenuExtra.tsx +41 -28
  57. package/src/components/header/HeaderStatusArea.tsx +7 -2
  58. package/src/components/msa/MSACanvas.tsx +8 -10
  59. package/src/components/msa/MSACanvasBlock.tsx +1 -1
  60. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +2 -2
  61. package/src/components/msa/renderMSABlock.ts +4 -4
  62. package/src/components/tree/TreeCanvas.tsx +4 -6
  63. package/src/fetchUtils.ts +2 -2
  64. package/src/launchInterProScan.ts +70 -23
  65. package/src/model.ts +6 -87
  66. package/src/renderToSvg.tsx +0 -24
  67. package/src/version.ts +1 -1
  68. package/dist/components/dialogs/InterProScanDialog.js.map +0 -1
@@ -19,9 +19,9 @@ export function renderBoxFeatureCanvasBlock({
19
19
  highResScaleFactorOverride?: number
20
20
  blockSizeYOverride?: number
21
21
  }) {
22
- const { hierarchy, blockSize, rowHeight, highResScaleFactor, featureMode } =
22
+ const { hierarchy, blockSize, rowHeight, highResScaleFactor, showDomains } =
23
23
  model
24
- if (featureMode) {
24
+ if (showDomains) {
25
25
  const k = highResScaleFactorOverride || highResScaleFactor
26
26
  const by = blockSizeYOverride || blockSize
27
27
  ctx.resetTransform()
@@ -34,7 +34,7 @@ export function renderMSABlock({
34
34
  rowHeight,
35
35
  fontSize,
36
36
  highResScaleFactor,
37
- featureMode,
37
+ showDomains,
38
38
  } = model
39
39
  const k = highResScaleFactorOverride || highResScaleFactor
40
40
  const bx = blockSizeXOverride || blockSize
@@ -53,7 +53,7 @@ export function renderMSABlock({
53
53
  const xEnd = Math.max(0, Math.ceil((offsetX + bx) / colWidth))
54
54
  const visibleLeaves = leaves.slice(yStart, yEnd)
55
55
 
56
- if (!featureMode) {
56
+ if (!showDomains) {
57
57
  drawTiles({
58
58
  model,
59
59
  ctx,
@@ -152,7 +152,7 @@ function drawText({
152
152
  xStart: number
153
153
  xEnd: number
154
154
  }) {
155
- const { bgColor, featureMode, colorScheme, columns, colWidth, rowHeight } =
155
+ const { bgColor, showDomains, colorScheme, columns, colWidth, rowHeight } =
156
156
  model
157
157
  if (rowHeight >= 5 && colWidth > rowHeight / 2) {
158
158
  for (const node of visibleLeaves) {
@@ -168,7 +168,7 @@ function drawText({
168
168
  const x = i * colWidth + offsetX - (offsetX % colWidth)
169
169
 
170
170
  // note: -rowHeight/4 matches +rowHeight/4 in tree
171
- ctx.fillStyle = featureMode
171
+ ctx.fillStyle = showDomains
172
172
  ? 'black'
173
173
  : bgColor
174
174
  ? contrast
@@ -1,5 +1,4 @@
1
1
  import React, { useEffect, useRef, useState } from 'react'
2
- import normalizeWheel from 'normalize-wheel'
3
2
  import { observer } from 'mobx-react'
4
3
 
5
4
  // locals
@@ -20,9 +19,8 @@ const TreeCanvas = observer(function ({ model }: { model: MsaViewModel }) {
20
19
  if (!curr) {
21
20
  return
22
21
  }
23
- function onWheel(origEvent: WheelEvent) {
24
- const event = normalizeWheel(origEvent)
25
- deltaY.current += event.pixelY
22
+ function onWheel(event: WheelEvent) {
23
+ deltaY.current += event.deltaY
26
24
 
27
25
  if (!scheduled.current) {
28
26
  scheduled.current = true
@@ -32,8 +30,8 @@ const TreeCanvas = observer(function ({ model }: { model: MsaViewModel }) {
32
30
  scheduled.current = false
33
31
  })
34
32
  }
35
- origEvent.preventDefault()
36
- origEvent.stopPropagation()
33
+ event.preventDefault()
34
+ event.stopPropagation()
37
35
  }
38
36
  curr.addEventListener('wheel', onWheel)
39
37
  return () => {
package/src/fetchUtils.ts CHANGED
@@ -15,9 +15,9 @@ export async function textfetch(url: string, args?: RequestInit) {
15
15
  return response.text()
16
16
  }
17
17
 
18
- export async function jsonfetch(url: string, args?: RequestInit) {
18
+ export async function jsonfetch<T>(url: string, args?: RequestInit) {
19
19
  const response = await myfetch(url, args)
20
- return response.json()
20
+ return response.json() as T
21
21
  }
22
22
 
23
23
  export async function arraybufferfetch(url: string) {
@@ -1,4 +1,6 @@
1
+ import { getSession } from '@jbrowse/core/util'
1
2
  import { jsonfetch, textfetch, timeout } from './fetchUtils'
3
+ import { MsaViewModel } from './model'
2
4
 
3
5
  const base = `https://www.ebi.ac.uk/Tools/services/rest`
4
6
 
@@ -24,11 +26,13 @@ async function runInterProScan({
24
26
  onProgress,
25
27
  onJobId,
26
28
  programs,
29
+ model,
27
30
  }: {
28
31
  seq: string
29
32
  programs: string[]
30
33
  onProgress: (arg?: { msg: string; url?: string }) => void
31
- onJobId: (arg: string) => void
34
+ onJobId?: (arg: string) => void
35
+ model: MsaViewModel
32
36
  }) {
33
37
  const jobId = await textfetch(`${base}/iprscan5/run`, {
34
38
  method: 'POST',
@@ -38,18 +42,18 @@ async function runInterProScan({
38
42
  programs: programs.join(','),
39
43
  }),
40
44
  })
41
- onJobId(jobId)
45
+ onJobId?.(jobId)
42
46
  await wait({
43
47
  jobId,
44
48
  onProgress,
45
49
  })
46
- return loadInterProScanResults(jobId)
50
+ return loadInterProScanResultsWithStatus({ jobId, model })
47
51
  }
48
52
 
49
- export async function loadInterProScanResults(jobId: string) {
50
- return (await jsonfetch(
53
+ export function loadInterProScanResults(jobId: string) {
54
+ return jsonfetch<InterProScanResponse>(
51
55
  `${base}/iprscan5/result/${jobId}/json`,
52
- )) as InterProScanResponse
56
+ )
53
57
  }
54
58
 
55
59
  async function wait({
@@ -60,17 +64,20 @@ async function wait({
60
64
  onProgress: (arg?: { msg: string; url?: string }) => void
61
65
  }) {
62
66
  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
67
+ try {
68
+ // eslint-disable-next-line no-constant-condition
69
+ while (true) {
70
+ for (let i = 0; i < 10; i++) {
71
+ await timeout(1000)
72
+ onProgress({ msg: `Checking status ${10 - i}`, url })
73
+ }
74
+ const result = await textfetch(url)
75
+ if (result.includes('FINISHED')) {
76
+ break
77
+ }
73
78
  }
79
+ } finally {
80
+ onProgress()
74
81
  }
75
82
  }
76
83
 
@@ -80,19 +87,59 @@ export async function launchInterProScan({
80
87
  programs,
81
88
  onJobId,
82
89
  onProgress,
90
+ model,
83
91
  }: {
84
92
  algorithm: string
85
93
  seq: string
86
94
  programs: string[]
87
95
  onProgress: (arg?: { msg: string; url?: string }) => void
88
- onJobId: (arg: string) => void
96
+ onJobId?: (arg: string) => void
97
+ model: MsaViewModel
89
98
  }) {
90
- onProgress({ msg: `Launching ${algorithm} MSA...` })
91
- if (algorithm === 'interproscan') {
92
- const result = await runInterProScan({ seq, onJobId, onProgress, programs })
99
+ try {
100
+ onProgress({ msg: `Launching ${algorithm} MSA` })
101
+ if (algorithm === 'interproscan') {
102
+ const result = await runInterProScan({
103
+ seq,
104
+ onJobId,
105
+ onProgress,
106
+ programs,
107
+ model,
108
+ })
109
+ return result
110
+ } else {
111
+ throw new Error('unknown algorithm')
112
+ }
113
+ } finally {
93
114
  onProgress()
94
- return result
95
- } else {
96
- throw new Error('unknown algorithm')
115
+ }
116
+ }
117
+
118
+ export async function loadInterProScanResultsWithStatus({
119
+ jobId,
120
+ model,
121
+ }: {
122
+ jobId: string
123
+ model: MsaViewModel
124
+ }) {
125
+ try {
126
+ model.setStatus({
127
+ msg:
128
+ 'Downloading results of ' +
129
+ jobId +
130
+ ' (for larger sequences this can be slow, click status to download and upload in the manual tab)',
131
+ url: `https://www.ebi.ac.uk/Tools/services/rest/iprscan5/result/${jobId}/json`,
132
+ })
133
+ const ret = await loadInterProScanResults(jobId)
134
+ model.setLoadedInterProAnnotations(
135
+ Object.fromEntries(ret.results.map(r => [r.xref[0].id, r])),
136
+ )
137
+ model.setShowDomains(true)
138
+ getSession(model).notify(`Loaded interproscan ${jobId} results`, 'success')
139
+ } catch (e) {
140
+ console.error(e)
141
+ getSession(model).notifyError(`${e}`, e)
142
+ } finally {
143
+ model.setStatus()
97
144
  }
98
145
  }
package/src/model.ts CHANGED
@@ -52,11 +52,7 @@ import { DataModelF } from './model/DataModel'
52
52
  import { DialogQueueSessionMixin } from './model/DialogQueue'
53
53
  import { TreeF } from './model/treeModel'
54
54
  import { MSAModelF } from './model/msaModel'
55
- import {
56
- InterProScanResults,
57
- launchInterProScan,
58
- loadInterProScanResults,
59
- } from './launchInterProScan'
55
+ import { InterProScanResults } from './launchInterProScan'
60
56
 
61
57
  export interface Accession {
62
58
  accession: string
@@ -105,7 +101,7 @@ function stateModelFactory() {
105
101
  /**
106
102
  * #property
107
103
  */
108
- featureMode: false,
104
+ showDomains: false,
109
105
  /**
110
106
  * #property
111
107
  */
@@ -296,12 +292,6 @@ function stateModelFactory() {
296
292
  loadedInterProAnnotations: undefined as
297
293
  | undefined
298
294
  | Record<string, InterProScanResults>,
299
- /**
300
- * #volatile
301
- */
302
- interProScanJobIds: JSON.parse(
303
- localStorageGetItem('msaview-interproscanqueries') || '[]',
304
- ) as { jobId: string; date: number }[],
305
295
  }))
306
296
  .actions(self => ({
307
297
  /**
@@ -349,8 +339,8 @@ function stateModelFactory() {
349
339
  /**
350
340
  * #action
351
341
  */
352
- setFeatureMode(arg: boolean) {
353
- self.featureMode = arg
342
+ setShowDomains(arg: boolean) {
343
+ self.showDomains = arg
354
344
  },
355
345
 
356
346
  /**
@@ -580,7 +570,7 @@ function stateModelFactory() {
580
570
  */
581
571
  get mouseOverRowName() {
582
572
  const { mouseRow } = self
583
- return mouseRow !== undefined ? this.rowNames[mouseRow] : undefined
573
+ return mouseRow === undefined ? undefined : this.rowNames[mouseRow]
584
574
  },
585
575
 
586
576
  /**
@@ -835,15 +825,6 @@ function stateModelFactory() {
835
825
  self.turnedOffTracks.set(id, true)
836
826
  }
837
827
  },
838
- /**
839
- * #action
840
- */
841
- addInterProScanJobId(arg: string) {
842
- self.interProScanJobIds = [
843
- ...self.interProScanJobIds,
844
- { jobId: arg, date: +Date.now() },
845
- ]
846
- },
847
828
  /**
848
829
  * #action
849
830
  */
@@ -1063,40 +1044,6 @@ function stateModelFactory() {
1063
1044
  },
1064
1045
  }))
1065
1046
  .actions(self => ({
1066
- /**
1067
- * #action
1068
- */
1069
- async loadInterProScanResults(jobId: string) {
1070
- self.setStatus({ msg: 'Loading ' + jobId })
1071
- const ret = await loadInterProScanResults(jobId)
1072
- self.setStatus()
1073
- self.setLoadedInterProAnnotations(
1074
- Object.fromEntries(ret.results.map(r => [r.xref[0].id, r])),
1075
- )
1076
- },
1077
- /**
1078
- * #action
1079
- */
1080
- async queryInterProScan(programs: string[]) {
1081
- const { rows } = self
1082
- if (rows.length > 140) {
1083
- throw new Error('Too many sequences, please run InterProScan offline')
1084
- }
1085
-
1086
- const ret = await launchInterProScan({
1087
- algorithm: 'interproscan',
1088
- programs: programs,
1089
- seq: rows
1090
- .map(row => `>${row[0]}\n${row[1].replaceAll('-', '')}`)
1091
- .join('\n'),
1092
- onProgress: arg => self.setStatus(arg),
1093
- onJobId: jobId => self.addInterProScanJobId(jobId),
1094
- })
1095
-
1096
- self.setLoadedInterProAnnotations(
1097
- Object.fromEntries(ret.results.map(r => [r.xref[0].id, r])),
1098
- )
1099
- },
1100
1047
  /**
1101
1048
  * #action
1102
1049
  */
@@ -1156,25 +1103,7 @@ function stateModelFactory() {
1156
1103
  }
1157
1104
  }),
1158
1105
  )
1159
- addDisposer(
1160
- self,
1161
- autorun(async () => {
1162
- // const res = Object.fromEntries(
1163
- // await Promise.all(
1164
- // self.annotationTracks.map(async f => {
1165
- // const d = await jsonfetch(
1166
- // `https://jbrowse.org/demos/interproscan/json/${encodeURIComponent(f)}`,
1167
- // )
1168
- // return [
1169
- // decodeURIComponent(f).replace('.json', ''),
1170
- // d.result.results[0],
1171
- // ] as const
1172
- // }),
1173
- // ),
1174
- // )
1175
- // self.setLoadedInterProAnnotations(res)
1176
- }),
1177
- )
1106
+
1178
1107
  // autorun opens treeFilehandle
1179
1108
  addDisposer(
1180
1109
  self,
@@ -1257,16 +1186,6 @@ function stateModelFactory() {
1257
1186
  }
1258
1187
  }),
1259
1188
  )
1260
-
1261
- addDisposer(
1262
- self,
1263
- autorun(() => {
1264
- localStorageSetItem(
1265
- 'msaview-interproscanqueries',
1266
- JSON.stringify(self.interProScanJobIds),
1267
- )
1268
- }),
1269
- )
1270
1189
  },
1271
1190
  }))
1272
1191
  .postProcessSnapshot(result => {
@@ -84,30 +84,6 @@ async function render({
84
84
  )
85
85
  }
86
86
 
87
- // function renderMultiline({ model }: { model: MsaViewModel }) {
88
- // const { treeAreaWidth, height } = model
89
- // const clipId = 'tree'
90
- // return (
91
- // <Wrapper model={model}>
92
- // <defs>
93
- // <clipPath id={clipId}>
94
- // <rect x={0} y={0} width={treeAreaWidth} height={height} />
95
- // </clipPath>
96
- // </defs>
97
- // <g
98
- // clipPath={`url(#${clipId})`}
99
- // /* eslint-disable-next-line react/no-danger */
100
- // dangerouslySetInnerHTML={{ __html: ctx1.getSvg().innerHTML }}
101
- // />
102
- // <g
103
- // transform={`translate(${treeAreaWidth} 0)`}
104
- // /* eslint-disable-next-line react/no-danger */
105
- // dangerouslySetInnerHTML={{ __html: ctx2.getSvg().innerHTML }}
106
- // />
107
- // </Wrapper>
108
- // )
109
- // }
110
-
111
87
  function CoreRendering({
112
88
  model,
113
89
  theme,
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '3.1.10'
1
+ export const version = '3.1.12'
@@ -1 +0,0 @@
1
- {"version":3,"file":"InterProScanDialog.js","sourceRoot":"","sources":["../../../src/components/dialogs/InterProScanDialog.tsx"],"names":[],"mappings":"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"}