jbrowse-plugin-mafviewer 1.4.3 → 1.4.6

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 (204) hide show
  1. package/README.md +1 -1
  2. package/dist/BigMafAdapter/BigMafAdapter.js +4 -5
  3. package/dist/BigMafAdapter/BigMafAdapter.js.map +1 -1
  4. package/dist/BigMafAdapter/configSchema.d.ts +2 -2
  5. package/dist/LinearMafDisplay/components/LinearMafDisplayComponent.js +39 -109
  6. package/dist/LinearMafDisplay/components/LinearMafDisplayComponent.js.map +1 -1
  7. package/dist/LinearMafDisplay/components/MAFTooltip.d.ts +0 -3
  8. package/dist/LinearMafDisplay/components/MAFTooltip.js.map +1 -1
  9. package/dist/LinearMafDisplay/components/MsaHighlightOverlay.d.ts +9 -0
  10. package/dist/LinearMafDisplay/components/MsaHighlightOverlay.js +34 -0
  11. package/dist/LinearMafDisplay/components/MsaHighlightOverlay.js.map +1 -0
  12. package/dist/LinearMafDisplay/components/Sidebar/ColorLegend.js +2 -2
  13. package/dist/LinearMafDisplay/components/Sidebar/ColorLegend.js.map +1 -1
  14. package/dist/LinearMafDisplay/components/Sidebar/RectBg.d.ts +1 -1
  15. package/dist/LinearMafDisplay/components/Sidebar/RectBg.js +2 -3
  16. package/dist/LinearMafDisplay/components/Sidebar/RectBg.js.map +1 -1
  17. package/dist/LinearMafDisplay/components/Sidebar/SvgWrapper.js +81 -11
  18. package/dist/LinearMafDisplay/components/Sidebar/SvgWrapper.js.map +1 -1
  19. package/dist/LinearMafDisplay/components/Sidebar/Tree.js +30 -9
  20. package/dist/LinearMafDisplay/components/Sidebar/Tree.js.map +1 -1
  21. package/dist/LinearMafDisplay/components/Sidebar/YScaleBars.d.ts +0 -1
  22. package/dist/LinearMafDisplay/components/Sidebar/YScaleBars.js.map +1 -1
  23. package/dist/LinearMafDisplay/components/useDragSelection.d.ts +25 -0
  24. package/dist/LinearMafDisplay/components/useDragSelection.js +103 -0
  25. package/dist/LinearMafDisplay/components/useDragSelection.js.map +1 -0
  26. package/dist/LinearMafDisplay/configSchema.d.ts +3 -30
  27. package/dist/LinearMafDisplay/renderSvg.js +1 -1
  28. package/dist/LinearMafDisplay/renderSvg.js.map +1 -1
  29. package/dist/LinearMafDisplay/stateModel.d.ts +1090 -102
  30. package/dist/LinearMafDisplay/stateModel.js +156 -17
  31. package/dist/LinearMafDisplay/stateModel.js.map +1 -1
  32. package/dist/LinearMafDisplay/types.d.ts +2 -2
  33. package/dist/LinearMafDisplay/util.d.ts +6 -0
  34. package/dist/LinearMafDisplay/util.js +28 -6
  35. package/dist/LinearMafDisplay/util.js.map +1 -1
  36. package/dist/LinearMafRenderer/LinearMafRenderer.d.ts +43 -10
  37. package/dist/LinearMafRenderer/LinearMafRenderer.js +1 -1
  38. package/dist/LinearMafRenderer/LinearMafRenderer.js.map +1 -1
  39. package/dist/LinearMafRenderer/components/LinearMafRendering.d.ts +14 -5
  40. package/dist/LinearMafRenderer/components/LinearMafRendering.js +40 -20
  41. package/dist/LinearMafRenderer/components/LinearMafRendering.js.map +1 -1
  42. package/dist/LinearMafRenderer/configSchema.d.ts +1 -6
  43. package/dist/LinearMafRenderer/configSchema.js +1 -6
  44. package/dist/LinearMafRenderer/configSchema.js.map +1 -1
  45. package/dist/LinearMafRenderer/makeImageData.js +6 -7
  46. package/dist/LinearMafRenderer/makeImageData.js.map +1 -1
  47. package/dist/LinearMafRenderer/rendering/features.d.ts +0 -1
  48. package/dist/LinearMafRenderer/rendering/features.js +1 -14
  49. package/dist/LinearMafRenderer/rendering/features.js.map +1 -1
  50. package/dist/LinearMafRenderer/rendering/insertions.d.ts +1 -1
  51. package/dist/LinearMafRenderer/rendering/insertions.js +10 -8
  52. package/dist/LinearMafRenderer/rendering/insertions.js.map +1 -1
  53. package/dist/LinearMafRenderer/rendering/matches.d.ts +1 -1
  54. package/dist/LinearMafRenderer/rendering/matches.js +3 -15
  55. package/dist/LinearMafRenderer/rendering/matches.js.map +1 -1
  56. package/dist/LinearMafRenderer/rendering/mismatches.d.ts +1 -1
  57. package/dist/LinearMafRenderer/rendering/mismatches.js +3 -3
  58. package/dist/LinearMafRenderer/rendering/spatialIndex.js +8 -2
  59. package/dist/LinearMafRenderer/rendering/spatialIndex.js.map +1 -1
  60. package/dist/LinearMafRenderer/rendering/text.js +1 -3
  61. package/dist/LinearMafRenderer/rendering/text.js.map +1 -1
  62. package/dist/LinearMafRenderer/rendering/types.d.ts +6 -5
  63. package/dist/MafAddTrackWorkflow/AddTrackWorkflow.js +1 -1
  64. package/dist/MafAddTrackWorkflow/AddTrackWorkflow.js.map +1 -1
  65. package/dist/MafAddTrackWorkflow/index.js +1 -1
  66. package/dist/MafAddTrackWorkflow/index.js.map +1 -1
  67. package/dist/MafGetSequences/MafGetSequences.d.ts +1 -0
  68. package/dist/MafGetSequences/MafGetSequences.js +2 -1
  69. package/dist/MafGetSequences/MafGetSequences.js.map +1 -1
  70. package/dist/MafSequenceWidget/LabelsCanvas.d.ts +8 -0
  71. package/dist/MafSequenceWidget/LabelsCanvas.js +37 -0
  72. package/dist/MafSequenceWidget/LabelsCanvas.js.map +1 -0
  73. package/dist/MafSequenceWidget/MafSequenceHoverHighlight.d.ts +6 -0
  74. package/dist/MafSequenceWidget/MafSequenceHoverHighlight.js +52 -0
  75. package/dist/MafSequenceWidget/MafSequenceHoverHighlight.js.map +1 -0
  76. package/dist/MafSequenceWidget/MafSequenceHoverHighlightExtension.d.ts +2 -0
  77. package/dist/MafSequenceWidget/MafSequenceHoverHighlightExtension.js +12 -0
  78. package/dist/MafSequenceWidget/MafSequenceHoverHighlightExtension.js.map +1 -0
  79. package/dist/MafSequenceWidget/MafSequenceWidget.d.ts +6 -0
  80. package/dist/MafSequenceWidget/MafSequenceWidget.js +189 -0
  81. package/dist/MafSequenceWidget/MafSequenceWidget.js.map +1 -0
  82. package/dist/MafSequenceWidget/SequenceCanvas.d.ts +12 -0
  83. package/dist/MafSequenceWidget/SequenceCanvas.js +86 -0
  84. package/dist/MafSequenceWidget/SequenceCanvas.js.map +1 -0
  85. package/dist/MafSequenceWidget/SequenceDisplay.d.ts +12 -0
  86. package/dist/MafSequenceWidget/SequenceDisplay.js +117 -0
  87. package/dist/MafSequenceWidget/SequenceDisplay.js.map +1 -0
  88. package/dist/MafSequenceWidget/SequenceTooltip.d.ts +11 -0
  89. package/dist/MafSequenceWidget/SequenceTooltip.js +39 -0
  90. package/dist/MafSequenceWidget/SequenceTooltip.js.map +1 -0
  91. package/dist/MafSequenceWidget/baseColors.d.ts +3 -0
  92. package/dist/MafSequenceWidget/baseColors.js +64 -0
  93. package/dist/MafSequenceWidget/baseColors.js.map +1 -0
  94. package/dist/MafSequenceWidget/colToGenomePos.d.ts +13 -0
  95. package/dist/MafSequenceWidget/colToGenomePos.js +32 -0
  96. package/dist/MafSequenceWidget/colToGenomePos.js.map +1 -0
  97. package/dist/MafSequenceWidget/colToGenomePos.test.d.ts +1 -0
  98. package/dist/MafSequenceWidget/colToGenomePos.test.js +136 -0
  99. package/dist/MafSequenceWidget/colToGenomePos.test.js.map +1 -0
  100. package/dist/MafSequenceWidget/configSchema.d.ts +1 -0
  101. package/dist/MafSequenceWidget/configSchema.js +3 -0
  102. package/dist/MafSequenceWidget/configSchema.js.map +1 -0
  103. package/dist/MafSequenceWidget/constants.d.ts +4 -0
  104. package/dist/MafSequenceWidget/constants.js +5 -0
  105. package/dist/MafSequenceWidget/constants.js.map +1 -0
  106. package/dist/MafSequenceWidget/index.d.ts +2 -0
  107. package/dist/MafSequenceWidget/index.js +16 -0
  108. package/dist/MafSequenceWidget/index.js.map +1 -0
  109. package/dist/MafSequenceWidget/stateModelFactory.d.ts +67 -0
  110. package/dist/MafSequenceWidget/stateModelFactory.js +21 -0
  111. package/dist/MafSequenceWidget/stateModelFactory.js.map +1 -0
  112. package/dist/MafTabixAdapter/MafTabixAdapter.js +4 -35
  113. package/dist/MafTabixAdapter/MafTabixAdapter.js.map +1 -1
  114. package/dist/MafTabixAdapter/configSchema.d.ts +4 -4
  115. package/dist/MafTrack/configSchema.d.ts +16 -11
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/jbrowse-plugin-mafviewer.umd.production.min.js +12 -24
  119. package/dist/jbrowse-plugin-mafviewer.umd.production.min.js.map +4 -4
  120. package/dist/util/clipboard.d.ts +2 -0
  121. package/dist/util/clipboard.js +28 -0
  122. package/dist/util/clipboard.js.map +1 -0
  123. package/dist/util/fastaUtils.d.ts +2 -1
  124. package/dist/util/fastaUtils.js +93 -50
  125. package/dist/util/fastaUtils.js.map +1 -1
  126. package/dist/util/fastaUtils.test.js +190 -0
  127. package/dist/util/fastaUtils.test.js.map +1 -1
  128. package/dist/util/parseAssemblyName.d.ts +32 -0
  129. package/dist/util/parseAssemblyName.js +87 -0
  130. package/dist/util/parseAssemblyName.js.map +1 -0
  131. package/dist/util/parseAssemblyName.test.d.ts +1 -0
  132. package/dist/util/parseAssemblyName.test.js +269 -0
  133. package/dist/util/parseAssemblyName.test.js.map +1 -0
  134. package/package.json +12 -12
  135. package/src/BigMafAdapter/BigMafAdapter.ts +5 -5
  136. package/src/LinearMafDisplay/components/LinearMafDisplayComponent.tsx +63 -145
  137. package/src/LinearMafDisplay/components/MAFTooltip.tsx +0 -3
  138. package/src/LinearMafDisplay/components/MsaHighlightOverlay.tsx +62 -0
  139. package/src/LinearMafDisplay/components/Sidebar/ColorLegend.tsx +2 -6
  140. package/src/LinearMafDisplay/components/Sidebar/RectBg.tsx +8 -3
  141. package/src/LinearMafDisplay/components/Sidebar/SvgWrapper.tsx +117 -15
  142. package/src/LinearMafDisplay/components/Sidebar/Tree.tsx +53 -8
  143. package/src/LinearMafDisplay/components/Sidebar/YScaleBars.tsx +0 -1
  144. package/src/LinearMafDisplay/components/useDragSelection.ts +159 -0
  145. package/src/LinearMafDisplay/renderSvg.tsx +1 -1
  146. package/src/LinearMafDisplay/stateModel.ts +215 -20
  147. package/src/LinearMafDisplay/types.ts +2 -2
  148. package/src/LinearMafDisplay/util.ts +35 -7
  149. package/src/LinearMafRenderer/LinearMafRenderer.ts +3 -5
  150. package/src/LinearMafRenderer/components/LinearMafRendering.tsx +67 -33
  151. package/src/LinearMafRenderer/configSchema.ts +1 -6
  152. package/src/LinearMafRenderer/makeImageData.ts +5 -14
  153. package/src/LinearMafRenderer/rendering/features.ts +2 -36
  154. package/src/LinearMafRenderer/rendering/insertions.ts +13 -8
  155. package/src/LinearMafRenderer/rendering/matches.ts +2 -27
  156. package/src/LinearMafRenderer/rendering/mismatches.ts +3 -3
  157. package/src/LinearMafRenderer/rendering/spatialIndex.ts +9 -2
  158. package/src/LinearMafRenderer/rendering/text.ts +1 -2
  159. package/src/LinearMafRenderer/rendering/types.ts +8 -5
  160. package/src/MafAddTrackWorkflow/AddTrackWorkflow.tsx +1 -1
  161. package/src/MafAddTrackWorkflow/index.ts +1 -1
  162. package/src/MafGetSequences/MafGetSequences.ts +10 -2
  163. package/src/MafSequenceWidget/LabelsCanvas.tsx +58 -0
  164. package/src/MafSequenceWidget/MafSequenceHoverHighlight.tsx +83 -0
  165. package/src/MafSequenceWidget/MafSequenceHoverHighlightExtension.tsx +24 -0
  166. package/src/MafSequenceWidget/MafSequenceWidget.tsx +294 -0
  167. package/src/MafSequenceWidget/SequenceCanvas.tsx +136 -0
  168. package/src/MafSequenceWidget/SequenceDisplay.tsx +188 -0
  169. package/src/MafSequenceWidget/SequenceTooltip.tsx +70 -0
  170. package/src/MafSequenceWidget/baseColors.ts +76 -0
  171. package/src/MafSequenceWidget/colToGenomePos.test.ts +166 -0
  172. package/src/MafSequenceWidget/colToGenomePos.ts +40 -0
  173. package/src/MafSequenceWidget/configSchema.ts +3 -0
  174. package/src/MafSequenceWidget/constants.ts +4 -0
  175. package/src/MafSequenceWidget/index.ts +24 -0
  176. package/src/MafSequenceWidget/stateModelFactory.ts +43 -0
  177. package/src/MafTabixAdapter/MafTabixAdapter.ts +12 -51
  178. package/src/index.ts +2 -0
  179. package/src/util/__snapshots__/fastaUtils.test.ts.snap +35 -0
  180. package/src/util/clipboard.ts +35 -0
  181. package/src/util/fastaUtils.test.ts +199 -0
  182. package/src/util/fastaUtils.ts +118 -51
  183. package/src/util/parseAssemblyName.test.ts +350 -0
  184. package/src/util/parseAssemblyName.ts +106 -0
  185. package/dist/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.d.ts +0 -11
  186. package/dist/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.js +0 -97
  187. package/dist/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.js.map +0 -1
  188. package/dist/LinearMafDisplay/components/util.d.ts +0 -1
  189. package/dist/LinearMafDisplay/components/util.js +0 -8
  190. package/dist/LinearMafDisplay/components/util.js.map +0 -1
  191. package/dist/LinearMafRenderer/components/util.d.ts +0 -1
  192. package/dist/LinearMafRenderer/components/util.js +0 -13
  193. package/dist/LinearMafRenderer/components/util.js.map +0 -1
  194. package/dist/util/fetchSequences.d.ts +0 -18
  195. package/dist/util/fetchSequences.js +0 -39
  196. package/dist/util/fetchSequences.js.map +0 -1
  197. package/dist/util/useSequences.d.ts +0 -21
  198. package/dist/util/useSequences.js +0 -64
  199. package/dist/util/useSequences.js.map +0 -1
  200. package/src/LinearMafDisplay/components/GetSequenceDialog/GetSequenceDialog.tsx +0 -175
  201. package/src/LinearMafDisplay/components/util.ts +0 -7
  202. package/src/LinearMafRenderer/components/util.ts +0 -13
  203. package/src/util/fetchSequences.ts +0 -57
  204. package/src/util/useSequences.ts +0 -90
@@ -1,21 +0,0 @@
1
- import type { LinearMafDisplayModel } from '../LinearMafDisplay/stateModel';
2
- interface SelectionCoords {
3
- dragStartX: number;
4
- dragEndX: number;
5
- }
6
- interface UseSequencesOptions {
7
- model: LinearMafDisplayModel;
8
- selectionCoords?: SelectionCoords;
9
- showAllLetters: boolean;
10
- }
11
- /**
12
- * React hook to fetch sequences for the given selection coordinates
13
- * @param options - The options for fetching sequences
14
- * @returns An object containing the sequence, loading state, and error
15
- */
16
- export declare function useSequences({ model, selectionCoords, showAllLetters, }: UseSequencesOptions): {
17
- sequence: string;
18
- loading: boolean;
19
- error: unknown;
20
- };
21
- export {};
@@ -1,64 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
- import { getContainingView, getSession } from '@jbrowse/core/util';
3
- import { getRpcSessionId } from '@jbrowse/core/util/tracks';
4
- /**
5
- * React hook to fetch sequences for the given selection coordinates
6
- * @param options - The options for fetching sequences
7
- * @returns An object containing the sequence, loading state, and error
8
- */
9
- export function useSequences({ model, selectionCoords, showAllLetters, }) {
10
- const [sequence, setSequence] = useState('');
11
- const [loading, setLoading] = useState(true);
12
- const [error, setError] = useState();
13
- useEffect(() => {
14
- // If no selection coordinates, no need to fetch
15
- if (!selectionCoords) {
16
- return;
17
- }
18
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
19
- ;
20
- (async () => {
21
- try {
22
- setLoading(true);
23
- setError(undefined);
24
- const { samples, adapterConfig } = model;
25
- const { rpcManager } = getSession(model);
26
- const sessionId = getRpcSessionId(model);
27
- const view = getContainingView(model);
28
- const { refName, assemblyName } = view.displayedRegions[0];
29
- const { dragStartX, dragEndX } = selectionCoords;
30
- const [s, e] = [
31
- Math.min(dragStartX, dragEndX),
32
- Math.max(dragStartX, dragEndX),
33
- ];
34
- const fastaSequence = (await rpcManager.call(sessionId, 'MafGetSequences', {
35
- sessionId,
36
- adapterConfig,
37
- samples,
38
- showAllLetters,
39
- regions: [
40
- {
41
- refName,
42
- start: view.pxToBp(s).coord - 1,
43
- end: view.pxToBp(e).coord,
44
- assemblyName,
45
- },
46
- ],
47
- }));
48
- const formattedSequence = fastaSequence
49
- .map((r, idx) => `>${samples[idx].label}\n${r}`)
50
- .join('\n');
51
- setSequence(formattedSequence);
52
- }
53
- catch (e) {
54
- console.error(e);
55
- setError(e);
56
- }
57
- finally {
58
- setLoading(false);
59
- }
60
- })();
61
- }, [model, selectionCoords, showAllLetters]);
62
- return { sequence, loading, error };
63
- }
64
- //# sourceMappingURL=useSequences.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSequences.js","sourceRoot":"","sources":["../../src/util/useSequences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAgB3D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,eAAe,EACf,cAAc,GACM;IACpB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAA;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAW,CAAA;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,gDAAgD;QAChD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QACD,mEAAmE;QACnE,CAAC;QAAA,CAAC,KAAK,IAAI,EAAE;YACX,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,CAAA;gBAChB,QAAQ,CAAC,SAAS,CAAC,CAAA;gBAEnB,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;gBACxC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;gBACxC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;gBACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAA0B,CAAA;gBAC9D,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAA;gBAC3D,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAA;gBAChD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;oBACb,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC;oBAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC;iBAC/B,CAAA;gBAED,MAAM,aAAa,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,CAC1C,SAAS,EACT,iBAAiB,EACjB;oBACE,SAAS;oBACT,aAAa;oBACb,OAAO;oBACP,cAAc;oBACd,OAAO,EAAE;wBACP;4BACE,OAAO;4BACP,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;4BAC/B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;4BACzB,YAAY;yBACb;qBACF;iBACF,CACF,CAAa,CAAA;gBAEd,MAAM,iBAAiB,GAAG,aAAa;qBACpC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,OAAQ,CAAC,GAAG,CAAE,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;qBACjD,IAAI,CAAC,IAAI,CAAC,CAAA;gBAEb,WAAW,CAAC,iBAAiB,CAAC,CAAA;YAChC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAChB,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACH,CAAC,CAAC,EAAE,CAAA;IACN,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,CAAA;IAE5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AACrC,CAAC"}
@@ -1,175 +0,0 @@
1
- import React, { useState } from 'react'
2
-
3
- import { Dialog, ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui'
4
- import { getSession } from '@jbrowse/core/util'
5
- import {
6
- Button,
7
- DialogActions,
8
- DialogContent,
9
- TextField,
10
- ToggleButton,
11
- ToggleButtonGroup,
12
- } from '@mui/material'
13
- import { observer } from 'mobx-react'
14
- import { makeStyles } from 'tss-react/mui'
15
-
16
- import { useSequences } from '../../../util/useSequences'
17
-
18
- import type { LinearMafDisplayModel } from '../../stateModel'
19
-
20
- const useStyles = makeStyles()({
21
- dialogContent: {
22
- width: '80em',
23
- },
24
- textAreaInput: {
25
- fontFamily: 'monospace',
26
- whiteSpace: 'pre',
27
- overflowX: 'auto',
28
- },
29
- ml: {
30
- marginLeft: 10,
31
- },
32
- })
33
-
34
- const GetSequenceDialog = observer(function ({
35
- onClose,
36
- model,
37
- selectionCoords,
38
- }: {
39
- onClose: () => void
40
- model: LinearMafDisplayModel
41
- selectionCoords?: {
42
- dragStartX: number
43
- dragEndX: number
44
- }
45
- }) {
46
- const [showAllLetters, setShowAllLetters] = useState(true)
47
- const { classes } = useStyles()
48
- const { sequence, loading, error } = useSequences({
49
- model,
50
- selectionCoords,
51
- showAllLetters,
52
- })
53
- const sequenceTooLarge = sequence ? sequence.length > 1_000_000 : false
54
-
55
- return (
56
- <Dialog open onClose={onClose} title="Subsequence Data" maxWidth="xl">
57
- <DialogContent>
58
- <div
59
- style={{
60
- display: 'flex',
61
- alignItems: 'center',
62
- marginBottom: '16px',
63
- }}
64
- >
65
- <ToggleButtonGroup
66
- value={showAllLetters}
67
- exclusive
68
- size="small"
69
- onChange={(_event, newDisplayMode) => {
70
- if (newDisplayMode !== null) {
71
- setShowAllLetters(newDisplayMode)
72
- }
73
- }}
74
- >
75
- <ToggleButton value={true}>Show All Letters</ToggleButton>
76
- <ToggleButton value={false}>Show Only Differences</ToggleButton>
77
- </ToggleButtonGroup>
78
- <div style={{ flexGrow: 1 }} />
79
- <Button
80
- variant="contained"
81
- color="primary"
82
- disabled={loading || !sequence}
83
- onClick={() => {
84
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
85
- ;(async () => {
86
- try {
87
- await navigator.clipboard.writeText(sequence)
88
- getSession(model).notify(
89
- 'Sequence copied to clipboard',
90
- 'info',
91
- )
92
- } catch (e) {
93
- console.error(e)
94
- getSession(model).notifyError(`${e}`, e)
95
- }
96
- })()
97
- }}
98
- >
99
- Copy to Clipboard
100
- </Button>
101
- <Button
102
- variant="contained"
103
- color="secondary"
104
- disabled={loading || !sequence}
105
- onClick={() => {
106
- try {
107
- const url = URL.createObjectURL(
108
- new Blob([sequence], { type: 'text/plain' }),
109
- )
110
-
111
- // Create a temporary anchor element
112
- const a = document.createElement('a')
113
- a.href = url
114
- a.download = 'sequence.fasta'
115
-
116
- // Trigger the download
117
- document.body.append(a)
118
- a.click()
119
-
120
- // Clean up
121
- a.remove()
122
- URL.revokeObjectURL(url)
123
- getSession(model).notify('Sequence downloaded', 'info')
124
- } catch (e) {
125
- console.error(e)
126
- getSession(model).notifyError(`${e}`, e)
127
- }
128
- }}
129
- >
130
- Download
131
- </Button>
132
- </div>
133
-
134
- {error ? (
135
- <ErrorMessage error={error} />
136
- ) : (
137
- <>
138
- {loading ? <LoadingEllipses /> : null}
139
- <TextField
140
- variant="outlined"
141
- multiline
142
- minRows={5}
143
- maxRows={10}
144
- disabled={sequenceTooLarge}
145
- className={classes.dialogContent}
146
- fullWidth
147
- value={
148
- loading
149
- ? 'Loading...'
150
- : sequenceTooLarge
151
- ? 'Reference sequence too large to display, use the download FASTA button'
152
- : sequence
153
- }
154
- slotProps={{
155
- input: {
156
- readOnly: true,
157
- classes: {
158
- input: classes.textAreaInput,
159
- },
160
- },
161
- }}
162
- />
163
- </>
164
- )}
165
- </DialogContent>
166
- <DialogActions>
167
- <Button color="primary" variant="outlined" onClick={onClose}>
168
- Close
169
- </Button>
170
- </DialogActions>
171
- </Dialog>
172
- )
173
- })
174
-
175
- export default GetSequenceDialog
@@ -1,7 +0,0 @@
1
- export function max(arr: number[], init = Number.NEGATIVE_INFINITY) {
2
- let max = init
3
- for (const entry of arr) {
4
- max = Math.max(entry, max)
5
- }
6
- return max
7
- }
@@ -1,13 +0,0 @@
1
- export function minElt<T>(arr: Iterable<T>, cb: (arg: T) => number) {
2
- let min = Infinity
3
- let minElement: T | undefined
4
- for (const entry of arr) {
5
- const val = cb(entry)
6
-
7
- if (val < min) {
8
- min = val
9
- minElement = entry
10
- }
11
- }
12
- return minElement
13
- }
@@ -1,57 +0,0 @@
1
- import { getContainingView, getSession } from '@jbrowse/core/util'
2
- import { getRpcSessionId } from '@jbrowse/core/util/tracks'
3
-
4
- import type { LinearMafDisplayModel } from '../LinearMafDisplay/stateModel'
5
- import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
6
-
7
- interface SelectionCoords {
8
- dragStartX: number
9
- dragEndX: number
10
- }
11
-
12
- /**
13
- * Fetch sequences for the given selection coordinates
14
- * @param model - The LinearMafDisplayModel
15
- * @param selectionCoords - The selection coordinates (dragStartX and dragEndX)
16
- * @param showAllLetters - Whether to show all letters or just the differences
17
- * @returns Promise that resolves to the FASTA sequence
18
- */
19
- export async function fetchSequences({
20
- model,
21
- selectionCoords,
22
- showAllLetters,
23
- }: {
24
- model: LinearMafDisplayModel
25
- selectionCoords: SelectionCoords
26
- showAllLetters: boolean
27
- }) {
28
- const { samples, adapterConfig } = model
29
- const { rpcManager } = getSession(model)
30
- const sessionId = getRpcSessionId(model)
31
- const view = getContainingView(model) as LinearGenomeViewModel
32
- const { refName, assemblyName } = view.displayedRegions[0]!
33
- const { dragStartX, dragEndX } = selectionCoords
34
- const [s, e] = [
35
- Math.min(dragStartX, dragEndX),
36
- Math.max(dragStartX, dragEndX),
37
- ]
38
-
39
- const fastaSequence = (await rpcManager.call(sessionId, 'MafGetSequences', {
40
- sessionId,
41
- adapterConfig,
42
- samples,
43
- showAllLetters,
44
- regions: [
45
- {
46
- refName,
47
- start: view.pxToBp(s).coord - 1,
48
- end: view.pxToBp(e).coord,
49
- assemblyName,
50
- },
51
- ],
52
- })) as string[]
53
-
54
- return fastaSequence
55
- .map((r, idx) => `>${samples![idx]!.label}\n${r}`)
56
- .join('\n')
57
- }
@@ -1,90 +0,0 @@
1
- import { useEffect, useState } from 'react'
2
-
3
- import { getContainingView, getSession } from '@jbrowse/core/util'
4
- import { getRpcSessionId } from '@jbrowse/core/util/tracks'
5
-
6
- import type { LinearMafDisplayModel } from '../LinearMafDisplay/stateModel'
7
- import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
8
-
9
- interface SelectionCoords {
10
- dragStartX: number
11
- dragEndX: number
12
- }
13
-
14
- interface UseSequencesOptions {
15
- model: LinearMafDisplayModel
16
- selectionCoords?: SelectionCoords
17
- showAllLetters: boolean
18
- }
19
-
20
- /**
21
- * React hook to fetch sequences for the given selection coordinates
22
- * @param options - The options for fetching sequences
23
- * @returns An object containing the sequence, loading state, and error
24
- */
25
- export function useSequences({
26
- model,
27
- selectionCoords,
28
- showAllLetters,
29
- }: UseSequencesOptions) {
30
- const [sequence, setSequence] = useState<string>('')
31
- const [loading, setLoading] = useState(true)
32
- const [error, setError] = useState<unknown>()
33
-
34
- useEffect(() => {
35
- // If no selection coordinates, no need to fetch
36
- if (!selectionCoords) {
37
- return
38
- }
39
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
40
- ;(async () => {
41
- try {
42
- setLoading(true)
43
- setError(undefined)
44
-
45
- const { samples, adapterConfig } = model
46
- const { rpcManager } = getSession(model)
47
- const sessionId = getRpcSessionId(model)
48
- const view = getContainingView(model) as LinearGenomeViewModel
49
- const { refName, assemblyName } = view.displayedRegions[0]!
50
- const { dragStartX, dragEndX } = selectionCoords
51
- const [s, e] = [
52
- Math.min(dragStartX, dragEndX),
53
- Math.max(dragStartX, dragEndX),
54
- ]
55
-
56
- const fastaSequence = (await rpcManager.call(
57
- sessionId,
58
- 'MafGetSequences',
59
- {
60
- sessionId,
61
- adapterConfig,
62
- samples,
63
- showAllLetters,
64
- regions: [
65
- {
66
- refName,
67
- start: view.pxToBp(s).coord - 1,
68
- end: view.pxToBp(e).coord,
69
- assemblyName,
70
- },
71
- ],
72
- },
73
- )) as string[]
74
-
75
- const formattedSequence = fastaSequence
76
- .map((r, idx) => `>${samples![idx]!.label}\n${r}`)
77
- .join('\n')
78
-
79
- setSequence(formattedSequence)
80
- } catch (e) {
81
- console.error(e)
82
- setError(e)
83
- } finally {
84
- setLoading(false)
85
- }
86
- })()
87
- }, [model, selectionCoords, showAllLetters])
88
-
89
- return { sequence, loading, error }
90
- }