react-msaview 5.3.0 → 5.4.1

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 (57) hide show
  1. package/bundle/index.js +22 -22
  2. package/bundle/index.js.LICENSE.txt +1 -1
  3. package/bundle/index.js.map +1 -1
  4. package/dist/components/Checkbox2.js +3 -1
  5. package/dist/components/Checkbox2.js.map +1 -1
  6. package/dist/components/Loading.js +6 -4
  7. package/dist/components/Loading.js.map +1 -1
  8. package/dist/components/MSAViewer.d.ts +3 -1
  9. package/dist/components/MSAViewer.js +3 -4
  10. package/dist/components/MSAViewer.js.map +1 -1
  11. package/dist/components/dialogs/InterProScanDialog.js +2 -1
  12. package/dist/components/dialogs/InterProScanDialog.js.map +1 -1
  13. package/dist/components/msa/renderMSABlock.js +4 -6
  14. package/dist/components/msa/renderMSABlock.js.map +1 -1
  15. package/dist/components/renderCtx.d.ts +1 -1
  16. package/dist/components/tracks/renderTracksSvg.js +1 -1
  17. package/dist/components/tracks/renderTracksSvg.js.map +1 -1
  18. package/dist/components/tree/TreeNodeMenu.js +1 -1
  19. package/dist/components/tree/TreeNodeMenu.js.map +1 -1
  20. package/dist/components/tree/renderTreeCanvas.d.ts +10 -0
  21. package/dist/components/tree/renderTreeCanvas.js +84 -12
  22. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  23. package/dist/fetchUtils.d.ts +19 -0
  24. package/dist/fetchUtils.js +28 -0
  25. package/dist/fetchUtils.js.map +1 -1
  26. package/dist/hierarchy.d.ts +9 -1
  27. package/dist/hierarchy.js +37 -0
  28. package/dist/hierarchy.js.map +1 -1
  29. package/dist/model/msaModel.d.ts +7 -0
  30. package/dist/model/msaModel.js +14 -0
  31. package/dist/model/msaModel.js.map +1 -1
  32. package/dist/model.d.ts +9 -4
  33. package/dist/model.js +95 -32
  34. package/dist/model.js.map +1 -1
  35. package/dist/neighborJoining.js +44 -30
  36. package/dist/neighborJoining.js.map +1 -1
  37. package/dist/version.d.ts +1 -1
  38. package/dist/version.js +1 -1
  39. package/package.json +5 -5
  40. package/src/components/Checkbox2.tsx +7 -1
  41. package/src/components/Loading.tsx +15 -5
  42. package/src/components/MSAViewer.tsx +5 -3
  43. package/src/components/dialogs/InterProScanDialog.tsx +2 -1
  44. package/src/components/msa/renderMSABlock.ts +2 -8
  45. package/src/components/renderCtx.ts +1 -0
  46. package/src/components/tracks/renderTracksSvg.ts +1 -1
  47. package/src/components/tree/TreeNodeMenu.tsx +1 -1
  48. package/src/components/tree/renderTreeCanvas.ts +117 -11
  49. package/src/fetchUtils.test.ts +66 -0
  50. package/src/fetchUtils.ts +48 -0
  51. package/src/hierarchy.test.ts +56 -0
  52. package/src/hierarchy.ts +44 -1
  53. package/src/impgRender.test.tsx +125 -0
  54. package/src/model/msaModel.ts +21 -0
  55. package/src/model.ts +99 -55
  56. package/src/neighborJoining.ts +44 -31
  57. package/src/version.ts +1 -1
package/dist/hierarchy.js CHANGED
@@ -179,10 +179,47 @@ export function clusterLayout(root, sizeX, sizeY) {
179
179
  }
180
180
  export function collapse(node) {
181
181
  if (node.children) {
182
+ // memoize the real subtree depth onto the node before detaching its
183
+ // children, so cladogram positioning keeps the node (now the apex of a
184
+ // collapsed-clade triangle) at its true branch point rather than snapping
185
+ // it to the tip-alignment line. This also keeps the rest of the tree's
186
+ // horizontal layout stable when a clade is collapsed.
187
+ calcDepthToLeaf(node);
182
188
  node._children = node.children;
183
189
  node.children = null;
184
190
  }
185
191
  }
192
+ // Min/max cumulative raw branch length from a collapsed node down to the tips of
193
+ // its detached subtree (excludes the node's own branch). Used to size the
194
+ // collapsed-clade triangle in phylogram mode.
195
+ export function collapsedSubtreeLengthExtent(node) {
196
+ const roots = node._children ?? node.children;
197
+ let min = Infinity;
198
+ let max = 0;
199
+ if (roots) {
200
+ const stack = roots.map(child => ({
201
+ node: child,
202
+ acc: Math.max(child.data.length ?? 0, 0),
203
+ }));
204
+ while (stack.length > 0) {
205
+ const { node: n, acc } = stack.pop();
206
+ const kids = n.children ?? n._children;
207
+ if (kids?.length) {
208
+ for (const child of kids) {
209
+ stack.push({
210
+ node: child,
211
+ acc: acc + Math.max(child.data.length ?? 0, 0),
212
+ });
213
+ }
214
+ }
215
+ else {
216
+ min = Math.min(min, acc);
217
+ max = Math.max(max, acc);
218
+ }
219
+ }
220
+ }
221
+ return { min: min === Infinity ? 0 : min, max };
222
+ }
186
223
  // Cladogram positioning based on ape's plot.phylo: uses topological depth (max
187
224
  // steps to a tip) instead of branch length so all leaves align at the rightmost
188
225
  // x. Memoizes onto node.depthToLeaf since the layout walks the tree repeatedly.
@@ -1 +1 @@
1
- {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../src/hierarchy.ts"],"names":[],"mappings":"AAqBA,iFAAiF;AACjF,kFAAkF;AAClF,4EAA4E;AAE5E,gFAAgF;AAChF,kFAAkF;AAClF,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAI,IAAsB;IACnD,MAAM,MAAM,GAAuB,EAAE,CAAA;IACrC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;IACpB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACtB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACd,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,aAAa,CAAI,IAAsB;IAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACnB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,IAAO,EACP,gBAA2C;IAE3C,MAAM,IAAI,GAAqB;QAC7B,IAAI;QACJ,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;KACV,CAAA;IACD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;IACpB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;gBACrB,MAAM,EAAE,CAAC;aACV,CAAC,CAAC,CAAA;YACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,aAAa,CAAC,IAAI,CAAC,CAAA;IACnB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,GAAG,CACjB,IAAsB,EACtB,OAAyB;IAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACnB,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC/B,CAAC,IAAI,KAAK,CAAC,KAAM,CAAA;YACnB,CAAC;QACH,CAAC;QACD,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAsB,EACtB,SAA+D;IAE/D,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;IACpB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACtB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC1B,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAsB,EACtB,SAA2C;IAE3C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;IACpB,IAAI,KAAmC,CAAA;IACvC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACtB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;aAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,MAAM,CAAI,IAAsB;IAC9C,MAAM,MAAM,GAAuB,EAAE,CAAA;IACrC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;IACpB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACtB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,KAAK,CAAI,IAAsB;IAC7C,MAAM,MAAM,GAAuB,EAAE,CAAA;IACrC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,IAAsB,EACtB,EAAgE;IAEhE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;IACpB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACtB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAA;gBAC5B,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;gBACZ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAsB,EACtB,EAAiC;IAEjC,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,CAAC,CAAC,CAAA;IACP,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAsB,EACtB,KAAa,EACb,KAAa;IAEb,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAA;IAC1B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAA;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAA;IACpC,CAAC;IAED,uEAAuE;IACvE,uCAAuC;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACtB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,GAAG,CAAC,CAAA;YACX,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,GAAG,IAAI,KAAK,CAAC,CAAE,CAAA;YACjB,CAAC;YACD,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;QACrC,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAA;IAC9B,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IACxC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACpC,IAAI,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,KAAK,CAAA;QAChE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,IAAsB;IAChD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IACtB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,gFAAgF;AAChF,gFAAgF;AAChF,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,IAAmB;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACnB,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,QAAQ,GAAG,CAAC,CAAA;YAChB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC/B,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,WAAY,CAAC,CAAA;gBACvD,CAAC;YACH,CAAC;YACD,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAA;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,WAAY,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,CAAgB;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAA;IAChD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACnB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC/B,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAE,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAgB,EAAE,EAAU,EAAE,CAAS;IACjE,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC/B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACtC,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACrD,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAA;QACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../src/hierarchy.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
+ import type { MSAFormat } from 'msa-parsers';
1
2
  /**
2
3
  * #stateModel MSAModel
3
4
  */
4
5
  export declare function MSAModelF(): import("@jbrowse/mobx-state-tree").IModelType<{
5
6
  bgColor: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
6
7
  colorSchemeName: import("@jbrowse/mobx-state-tree").IType<string | undefined, string, string>;
8
+ msaFormat: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<MSAFormat>>;
7
9
  }, {
8
10
  /**
9
11
  * #action
@@ -14,4 +16,9 @@ export declare function MSAModelF(): import("@jbrowse/mobx-state-tree").IModelTy
14
16
  * #action
15
17
  */
16
18
  setBgColor(arg: boolean): void;
19
+ /**
20
+ * #action
21
+ * force a specific MSA parser, or pass undefined to auto-detect
22
+ */
23
+ setMSAFormat(arg?: MSAFormat): void;
17
24
  }, import("@jbrowse/mobx-state-tree")._NotCustomized, import("@jbrowse/mobx-state-tree")._NotCustomized>;
@@ -1,5 +1,6 @@
1
1
  import { types } from '@jbrowse/mobx-state-tree';
2
2
  import { defaultBgColor, defaultColorSchemeName } from "../constants.js";
3
+ const msaFormats = ['stockholm', 'a3m', 'fasta', 'emf', 'clustal'];
3
4
  /**
4
5
  * #stateModel MSAModel
5
6
  */
@@ -16,6 +17,12 @@ export function MSAModelF() {
16
17
  * default color scheme name
17
18
  */
18
19
  colorSchemeName: defaultColorSchemeName,
20
+ /**
21
+ * #property
22
+ * force the MSA data to be parsed as a specific format instead of relying
23
+ * on auto-detection (which is ambiguous between e.g. fasta and a3m)
24
+ */
25
+ msaFormat: types.maybe(types.enumeration('MSAFormat', msaFormats)),
19
26
  })
20
27
  .actions(self => ({
21
28
  /**
@@ -31,6 +38,13 @@ export function MSAModelF() {
31
38
  setBgColor(arg) {
32
39
  self.bgColor = arg;
33
40
  },
41
+ /**
42
+ * #action
43
+ * force a specific MSA parser, or pass undefined to auto-detect
44
+ */
45
+ setMSAFormat(arg) {
46
+ self.msaFormat = arg;
47
+ },
34
48
  }));
35
49
  }
36
50
  //# sourceMappingURL=msaModel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"msaModel.js","sourceRoot":"","sources":["../../src/model/msaModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAEhD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAExE;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,KAAK;SACT,KAAK,CAAC;QACL;;;WAGG;QACH,OAAO,EAAE,cAAc;QAEvB;;;WAGG;QACH,eAAe,EAAE,sBAAsB;KACxC,CAAC;SACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB;;;WAGG;QACH,kBAAkB,CAAC,IAAY;YAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC7B,CAAC;QAED;;WAEG;QACH,UAAU,CAAC,GAAY;YACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAA;QACpB,CAAC;KACF,CAAC,CAAC,CAAA;AACP,CAAC"}
1
+ {"version":3,"file":"msaModel.js","sourceRoot":"","sources":["../../src/model/msaModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAEhD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAIxE,MAAM,UAAU,GAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;AAE/E;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,KAAK;SACT,KAAK,CAAC;QACL;;;WAGG;QACH,OAAO,EAAE,cAAc;QAEvB;;;WAGG;QACH,eAAe,EAAE,sBAAsB;QAEvC;;;;WAIG;QACH,SAAS,EAAE,KAAK,CAAC,KAAK,CACpB,KAAK,CAAC,WAAW,CAAY,WAAW,EAAE,UAAU,CAAC,CACtD;KACF,CAAC;SACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB;;;WAGG;QACH,kBAAkB,CAAC,IAAY;YAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC7B,CAAC;QAED;;WAEG;QACH,UAAU,CAAC,GAAY;YACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAA;QACpB,CAAC;QAED;;;WAGG;QACH,YAAY,CAAC,GAAe;YAC1B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;QACtB,CAAC;KACF,CAAC,CAAC,CAAA;AACP,CAAC"}
package/dist/model.d.ts CHANGED
@@ -24,10 +24,11 @@ declare function stateModelFactory(): import("@jbrowse/mobx-state-tree").IModelT
24
24
  showBranchLen: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
25
25
  drawTree: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
26
26
  drawNodeBubbles: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
27
- }, "bgColor" | "colorSchemeName"> & {
27
+ }, "bgColor" | "colorSchemeName" | "msaFormat"> & {
28
28
  bgColor: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
29
29
  colorSchemeName: import("@jbrowse/mobx-state-tree").IType<string | undefined, string, string>;
30
- }, "type" | "id" | "data" | "showDomains" | "hideGaps" | "allowedGappyness" | "subFeatureRows" | "drawMsaLetters" | "scrollZoom" | "rowHeight" | "scrollY" | "scrollX" | "colWidth" | "currentAlignment" | "height" | "treeFilehandle" | "msaFilehandle" | "treeMetadataFilehandle" | "gffFilehandle" | "collapsed" | "showOnly" | "turnedOffTracks" | "featureFilters" | "relativeTo"> & {
30
+ msaFormat: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<import("msa-parsers").MSAFormat>>;
31
+ }, "type" | "id" | "data" | "showDomains" | "hideGaps" | "allowedGappyness" | "subFeatureRows" | "drawMsaLetters" | "scrollZoom" | "rowHeight" | "scrollY" | "scrollX" | "colWidth" | "currentAlignment" | "height" | "treeFilehandle" | "msaFilehandle" | "treeMetadataFilehandle" | "gffFilehandle" | "collapsed" | "showOnly" | "turnedOffTracks" | "featureFilters" | "relativeTo" | "highlightColumns"> & {
31
32
  id: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").ISimpleType<string>, [undefined]>;
32
33
  showDomains: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
33
34
  hideGaps: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
@@ -143,6 +144,7 @@ declare function stateModelFactory(): import("@jbrowse/mobx-state-tree").IModelT
143
144
  }>, [undefined]>;
144
145
  featureFilters: import("@jbrowse/mobx-state-tree").IMapType<import("@jbrowse/mobx-state-tree").ISimpleType<boolean>>;
145
146
  relativeTo: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<string>>;
147
+ highlightColumns: import("@jbrowse/mobx-state-tree").IType<number[] | undefined, number[] | undefined, number[] | undefined>;
146
148
  }, {
147
149
  queueOfDialogs: [import("@jbrowse/core/util").DialogComponentType, any][];
148
150
  } & {
@@ -162,6 +164,7 @@ declare function stateModelFactory(): import("@jbrowse/mobx-state-tree").IModelT
162
164
  } & {
163
165
  setColorSchemeName(name: string): void;
164
166
  setBgColor(arg: boolean): void;
167
+ setMSAFormat(arg?: import("msa-parsers").MSAFormat): void;
165
168
  } & {
166
169
  /**
167
170
  * #volatile
@@ -949,10 +952,11 @@ declare function stateModelFactory(): import("@jbrowse/mobx-state-tree").IModelT
949
952
  showBranchLen: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
950
953
  drawTree: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
951
954
  drawNodeBubbles: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
952
- }, "bgColor" | "colorSchemeName"> & {
955
+ }, "bgColor" | "colorSchemeName" | "msaFormat"> & {
953
956
  bgColor: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
954
957
  colorSchemeName: import("@jbrowse/mobx-state-tree").IType<string | undefined, string, string>;
955
- }, "type" | "id" | "data" | "showDomains" | "hideGaps" | "allowedGappyness" | "subFeatureRows" | "drawMsaLetters" | "scrollZoom" | "rowHeight" | "scrollY" | "scrollX" | "colWidth" | "currentAlignment" | "height" | "treeFilehandle" | "msaFilehandle" | "treeMetadataFilehandle" | "gffFilehandle" | "collapsed" | "showOnly" | "turnedOffTracks" | "featureFilters" | "relativeTo"> & {
958
+ msaFormat: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<import("msa-parsers").MSAFormat>>;
959
+ }, "type" | "id" | "data" | "showDomains" | "hideGaps" | "allowedGappyness" | "subFeatureRows" | "drawMsaLetters" | "scrollZoom" | "rowHeight" | "scrollY" | "scrollX" | "colWidth" | "currentAlignment" | "height" | "treeFilehandle" | "msaFilehandle" | "treeMetadataFilehandle" | "gffFilehandle" | "collapsed" | "showOnly" | "turnedOffTracks" | "featureFilters" | "relativeTo" | "highlightColumns"> & {
956
960
  id: import("@jbrowse/mobx-state-tree").IOptionalIType<import("@jbrowse/mobx-state-tree").ISimpleType<string>, [undefined]>;
957
961
  showDomains: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
958
962
  hideGaps: import("@jbrowse/mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
@@ -1068,6 +1072,7 @@ declare function stateModelFactory(): import("@jbrowse/mobx-state-tree").IModelT
1068
1072
  }>, [undefined]>;
1069
1073
  featureFilters: import("@jbrowse/mobx-state-tree").IMapType<import("@jbrowse/mobx-state-tree").ISimpleType<boolean>>;
1070
1074
  relativeTo: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").ISimpleType<string>>;
1075
+ highlightColumns: import("@jbrowse/mobx-state-tree").IType<number[] | undefined, number[] | undefined, number[] | undefined>;
1071
1076
  }>, symbol>>;
1072
1077
  export default stateModelFactory;
1073
1078
  export type MsaViewStateModel = ReturnType<typeof stateModelFactory>;
package/dist/model.js CHANGED
@@ -1,4 +1,4 @@
1
- import { clamp, fetchAndMaybeUnzipText, groupBy, notEmpty, sum, } from '@jbrowse/core/util';
1
+ import { clamp, groupBy, notEmpty, sum } from '@jbrowse/core/util';
2
2
  import { openLocation } from '@jbrowse/core/util/io';
3
3
  import { ElementId, FileLocation } from '@jbrowse/core/util/types/mst';
4
4
  import { addDisposer, cast, types } from '@jbrowse/mobx-state-tree';
@@ -12,8 +12,9 @@ import ConservationTrack from "./components/ConservationTrack.js";
12
12
  import TextTrack from "./components/TextTrack.js";
13
13
  import { defaultAllowedGappyness, defaultBgColor, defaultColWidth, defaultColorSchemeName, defaultCurrentAlignment, defaultDrawLabels, defaultDrawMsaLetters, defaultDrawNodeBubbles, defaultDrawTree, defaultHeight, defaultHideGaps, defaultLabelsAlignRight, defaultRowHeight, defaultScrollX, defaultScrollY, defaultScrollZoom, defaultShowBranchLen, defaultShowDomains, defaultSubFeatureRows, defaultTreeAreaWidth, defaultTreeWidth, maxCellSize, minColWidth, minRowHeight, } from "./constants.js";
14
14
  import { createPaletteMap } from "./createPaletteMap.js";
15
+ import { fetchTextWithProgress, isAbortError } from "./fetchUtils.js";
15
16
  import { flatToTree } from "./flatToTree.js";
16
- import { calcDepthToLeaf, clusterLayout, collapse, find, findMaxBranchLen, hierarchy, leaves, links, maxLength, setBrLength, sort, sum as hierarchySum, } from "./hierarchy.js";
17
+ import { calcDepthToLeaf, clusterLayout, collapse, collapsedSubtreeLengthExtent, find, findMaxBranchLen, forEachDescendant, hierarchy, leaves, links, maxLength, setBrLength, sort, sum as hierarchySum, } from "./hierarchy.js";
17
18
  import { measureTextCanvas } from "./measureTextCanvas.js";
18
19
  import { DataModelF } from "./model/DataModel.js";
19
20
  import { DialogQueueSessionMixin } from "./model/DialogQueue.js";
@@ -165,6 +166,15 @@ function stateModelFactory() {
165
166
  * #property
166
167
  */
167
168
  relativeTo: types.maybe(types.string),
169
+ /**
170
+ * #property
171
+ * declarative seed for the highlighted-columns overlay (visible column
172
+ * indices). Unlike the volatile `highlightedColumns` (driven by
173
+ * transient genome-hover sync), this persists in the snapshot/URL so a
174
+ * shared link can open with specific columns highlighted. Applied once
175
+ * in afterCreate.
176
+ */
177
+ highlightColumns: types.frozen(),
168
178
  }))
169
179
  .volatile(() => ({
170
180
  /**
@@ -534,7 +544,9 @@ function stateModelFactory() {
534
544
  const text = self.data.msa;
535
545
  // uses parseMSA so the named MSAParserType return type is portable
536
546
  // to downstream consumers (avoids TS2883 with default exports)
537
- return text ? parseMSA(text, self.currentAlignment) : null;
547
+ return text
548
+ ? parseMSA(text, self.currentAlignment, self.msaFormat)
549
+ : null;
538
550
  },
539
551
  /**
540
552
  * #getter
@@ -791,6 +803,9 @@ function stateModelFactory() {
791
803
  const { colStats, colStatsSums } = this;
792
804
  return colStats.map((stats, i) => {
793
805
  const total = colStatsSums[i];
806
+ if (!total) {
807
+ return { letter: '', color: undefined };
808
+ }
794
809
  let maxCount = 0;
795
810
  let letter = '';
796
811
  for (const [key, val] of Object.entries(stats)) {
@@ -859,7 +874,18 @@ function stateModelFactory() {
859
874
  clusterLayout(r, this.totalHeight, self.treeWidth);
860
875
  r.data.length = 0;
861
876
  const max = maxLength(r);
862
- setBrLength(r, 0, max ? self.treeWidth / max : 0);
877
+ const k = max ? self.treeWidth / max : 0;
878
+ setBrLength(r, 0, k);
879
+ // for each collapsed clade, record the pixel x-positions of its
880
+ // nearest/farthest tips so the renderer can draw a triangle that spans
881
+ // the branch-length extent of the hidden subtree
882
+ forEachDescendant(r, node => {
883
+ if (node._children) {
884
+ const { min, max: mx } = collapsedSubtreeLengthExtent(node);
885
+ node.collapsedTipXNear = (node.len ?? 0) + min * k;
886
+ node.collapsedTipXFar = (node.len ?? 0) + mx * k;
887
+ }
888
+ });
863
889
  return r;
864
890
  },
865
891
  /**
@@ -1066,9 +1092,8 @@ function stateModelFactory() {
1066
1092
  */
1067
1093
  zoomIn() {
1068
1094
  transaction(() => {
1069
- self.colWidth = Math.min(maxCellSize, Math.ceil(self.colWidth * 1.5));
1070
- self.rowHeight = Math.min(maxCellSize, Math.ceil(self.rowHeight * 1.5));
1071
- self.scrollX = clamp(self.scrollX, self.maxScrollX, 0);
1095
+ this.zoomInHorizontal();
1096
+ this.zoomInVertical();
1072
1097
  });
1073
1098
  },
1074
1099
  /**
@@ -1076,9 +1101,8 @@ function stateModelFactory() {
1076
1101
  */
1077
1102
  zoomOut() {
1078
1103
  transaction(() => {
1079
- self.colWidth = Math.max(minColWidth, Math.floor(self.colWidth * 0.75));
1080
- self.rowHeight = Math.max(minRowHeight, Math.floor(self.rowHeight * 0.75));
1081
- self.scrollX = clamp(self.scrollX, self.maxScrollX, 0);
1104
+ this.zoomOutHorizontal();
1105
+ this.zoomOutVertical();
1082
1106
  });
1083
1107
  },
1084
1108
  /**
@@ -1099,8 +1123,12 @@ function stateModelFactory() {
1099
1123
  self.rowHeight = clamp(self.rowHeight * scaleFactor, minRowHeight, maxCellSize);
1100
1124
  self.scrollX = clamp(offsetX - colInView * self.colWidth, self.maxScrollX, 0);
1101
1125
  const anchoredScrollY = offsetY - rowInView * self.rowHeight;
1102
- const overflow = Math.max(0, self.totalHeight - self.height);
1103
- const topBias = self.height > 0 ? clamp(1 - overflow / self.height, 0, 1) : 0;
1126
+ // maxScrollY is -(totalHeight - visibleMsaHeight) when the alignment
1127
+ // overflows, so -maxScrollY is exactly that overflow past the
1128
+ // scrollable MSA viewport (0 when it fits)
1129
+ const overflow = Math.max(0, -self.maxScrollY);
1130
+ const visibleHeight = self.totalHeight - overflow;
1131
+ const topBias = visibleHeight > 0 ? clamp(1 - overflow / visibleHeight, 0, 1) : 1;
1104
1132
  self.scrollY = clamp(anchoredScrollY * (1 - topBias), self.maxScrollY, 0);
1105
1133
  });
1106
1134
  },
@@ -1448,14 +1476,8 @@ function stateModelFactory() {
1448
1476
  * #action
1449
1477
  */
1450
1478
  fit() {
1451
- if (self.numRows > 0) {
1452
- self.rowHeight = clamp(self.msaAreaHeight / self.numRows, minRowHeight, maxCellSize);
1453
- }
1454
- if (self.numColumns > 0) {
1455
- self.colWidth = clamp(self.msaAreaWidth / self.numColumns, minColWidth, maxCellSize);
1456
- }
1457
- self.scrollX = 0;
1458
- self.scrollY = 0;
1479
+ this.fitVertically();
1480
+ this.fitHorizontally();
1459
1481
  },
1460
1482
  /**
1461
1483
  * #action
@@ -1476,6 +1498,12 @@ function stateModelFactory() {
1476
1498
  self.scrollX = 0;
1477
1499
  },
1478
1500
  afterCreate() {
1501
+ // seed the highlighted-columns overlay from the declarative property so
1502
+ // a shared snapshot/URL opens with those columns highlighted (the
1503
+ // volatile highlightedColumns can later be driven by genome-hover sync)
1504
+ if (self.highlightColumns?.length) {
1505
+ self.setHighlightedColumns(self.highlightColumns);
1506
+ }
1479
1507
  addDisposer(self, autorun(() => {
1480
1508
  for (const key of self.tidyInterProAnnotationTypes.keys()) {
1481
1509
  this.initFilter(key);
@@ -1491,7 +1519,11 @@ function stateModelFactory() {
1491
1519
  const generation = ++treeGeneration;
1492
1520
  try {
1493
1521
  self.setLoadingTree(true);
1494
- const text = await fetchAndMaybeUnzipText(openLocation(treeFilehandle));
1522
+ const text = await fetchTextWithProgress(openLocation(treeFilehandle), status => {
1523
+ if (generation === treeGeneration) {
1524
+ self.setStatus(status);
1525
+ }
1526
+ });
1495
1527
  if (generation === treeGeneration) {
1496
1528
  transaction(() => {
1497
1529
  self.setTree(text);
@@ -1504,8 +1536,15 @@ function stateModelFactory() {
1504
1536
  }
1505
1537
  catch (e) {
1506
1538
  if (generation === treeGeneration) {
1507
- console.error(e);
1508
- self.setError(e);
1539
+ if (isAbortError(e)) {
1540
+ // cancelled by the user: drop the filehandle so the view
1541
+ // returns to the import form instead of a stuck spinner
1542
+ self.setTreeFilehandle(undefined);
1543
+ }
1544
+ else {
1545
+ console.error(e);
1546
+ self.setError(e);
1547
+ }
1509
1548
  }
1510
1549
  }
1511
1550
  finally {
@@ -1520,11 +1559,16 @@ function stateModelFactory() {
1520
1559
  const { treeMetadataFilehandle } = self;
1521
1560
  if (treeMetadataFilehandle) {
1522
1561
  try {
1523
- self.setTreeMetadata(await fetchAndMaybeUnzipText(openLocation(treeMetadataFilehandle)));
1562
+ self.setTreeMetadata(await fetchTextWithProgress(openLocation(treeMetadataFilehandle), status => {
1563
+ self.setStatus(status);
1564
+ }));
1524
1565
  }
1525
1566
  catch (e) {
1526
- console.error(e);
1527
- self.setError(e);
1567
+ // ignore user cancel (isAbortError); treeMetadata is optional
1568
+ if (!isAbortError(e)) {
1569
+ console.error(e);
1570
+ self.setError(e);
1571
+ }
1528
1572
  }
1529
1573
  }
1530
1574
  }));
@@ -1546,15 +1590,23 @@ function stateModelFactory() {
1546
1590
  const { gffFilehandle } = self;
1547
1591
  if (gffFilehandle) {
1548
1592
  try {
1549
- const gffText = await fetchAndMaybeUnzipText(openLocation(gffFilehandle));
1593
+ const gffText = await fetchTextWithProgress(openLocation(gffFilehandle), status => {
1594
+ self.setStatus(status);
1595
+ });
1550
1596
  self.applyGFFText(gffText);
1551
1597
  if (gffFilehandle.locationType === 'BlobLocation') {
1552
1598
  self.setGFFFilehandle(undefined);
1553
1599
  }
1554
1600
  }
1555
1601
  catch (e) {
1556
- console.error(e);
1557
- self.setError(e);
1602
+ // on user cancel (isAbortError) drop the filehandle
1603
+ if (isAbortError(e)) {
1604
+ self.setGFFFilehandle(undefined);
1605
+ }
1606
+ else {
1607
+ console.error(e);
1608
+ self.setError(e);
1609
+ }
1558
1610
  }
1559
1611
  }
1560
1612
  }));
@@ -1567,7 +1619,11 @@ function stateModelFactory() {
1567
1619
  try {
1568
1620
  self.setLoadingMSA(true);
1569
1621
  self.setError(undefined);
1570
- const txt = await fetchAndMaybeUnzipText(openLocation(msaFilehandle));
1622
+ const txt = await fetchTextWithProgress(openLocation(msaFilehandle), status => {
1623
+ if (generation === msaGeneration) {
1624
+ self.setStatus(status);
1625
+ }
1626
+ });
1571
1627
  if (generation === msaGeneration) {
1572
1628
  transaction(() => {
1573
1629
  self.setMSA(txt);
@@ -1580,8 +1636,15 @@ function stateModelFactory() {
1580
1636
  }
1581
1637
  catch (e) {
1582
1638
  if (generation === msaGeneration) {
1583
- console.error(e);
1584
- self.setError(e);
1639
+ if (isAbortError(e)) {
1640
+ // cancelled by the user: drop the filehandle so the view
1641
+ // returns to the import form instead of a stuck spinner
1642
+ self.setMSAFilehandle(undefined);
1643
+ }
1644
+ else {
1645
+ console.error(e);
1646
+ self.setError(e);
1647
+ }
1585
1648
  }
1586
1649
  }
1587
1650
  finally {