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.
- package/bundle/index.js +22 -22
- package/bundle/index.js.LICENSE.txt +1 -1
- package/bundle/index.js.map +1 -1
- package/dist/components/Checkbox2.js +3 -1
- package/dist/components/Checkbox2.js.map +1 -1
- package/dist/components/Loading.js +6 -4
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +3 -1
- package/dist/components/MSAViewer.js +3 -4
- package/dist/components/MSAViewer.js.map +1 -1
- package/dist/components/dialogs/InterProScanDialog.js +2 -1
- package/dist/components/dialogs/InterProScanDialog.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +4 -6
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/renderCtx.d.ts +1 -1
- package/dist/components/tracks/renderTracksSvg.js +1 -1
- package/dist/components/tracks/renderTracksSvg.js.map +1 -1
- package/dist/components/tree/TreeNodeMenu.js +1 -1
- package/dist/components/tree/TreeNodeMenu.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +10 -0
- package/dist/components/tree/renderTreeCanvas.js +84 -12
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/fetchUtils.d.ts +19 -0
- package/dist/fetchUtils.js +28 -0
- package/dist/fetchUtils.js.map +1 -1
- package/dist/hierarchy.d.ts +9 -1
- package/dist/hierarchy.js +37 -0
- package/dist/hierarchy.js.map +1 -1
- package/dist/model/msaModel.d.ts +7 -0
- package/dist/model/msaModel.js +14 -0
- package/dist/model/msaModel.js.map +1 -1
- package/dist/model.d.ts +9 -4
- package/dist/model.js +95 -32
- package/dist/model.js.map +1 -1
- package/dist/neighborJoining.js +44 -30
- package/dist/neighborJoining.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -5
- package/src/components/Checkbox2.tsx +7 -1
- package/src/components/Loading.tsx +15 -5
- package/src/components/MSAViewer.tsx +5 -3
- package/src/components/dialogs/InterProScanDialog.tsx +2 -1
- package/src/components/msa/renderMSABlock.ts +2 -8
- package/src/components/renderCtx.ts +1 -0
- package/src/components/tracks/renderTracksSvg.ts +1 -1
- package/src/components/tree/TreeNodeMenu.tsx +1 -1
- package/src/components/tree/renderTreeCanvas.ts +117 -11
- package/src/fetchUtils.test.ts +66 -0
- package/src/fetchUtils.ts +48 -0
- package/src/hierarchy.test.ts +56 -0
- package/src/hierarchy.ts +44 -1
- package/src/impgRender.test.tsx +125 -0
- package/src/model/msaModel.ts +21 -0
- package/src/model.ts +99 -55
- package/src/neighborJoining.ts +44 -31
- 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.
|
package/dist/hierarchy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../src/hierarchy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../src/hierarchy.ts"],"names":[],"mappings":"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"}
|
package/dist/model/msaModel.d.ts
CHANGED
|
@@ -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>;
|
package/dist/model/msaModel.js
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1070
|
-
|
|
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
|
-
|
|
1080
|
-
|
|
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
|
-
|
|
1103
|
-
|
|
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
|
-
|
|
1452
|
-
|
|
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
|
|
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
|
-
|
|
1508
|
-
|
|
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
|
|
1562
|
+
self.setTreeMetadata(await fetchTextWithProgress(openLocation(treeMetadataFilehandle), status => {
|
|
1563
|
+
self.setStatus(status);
|
|
1564
|
+
}));
|
|
1524
1565
|
}
|
|
1525
1566
|
catch (e) {
|
|
1526
|
-
|
|
1527
|
-
|
|
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
|
|
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
|
-
|
|
1557
|
-
|
|
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
|
|
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
|
-
|
|
1584
|
-
|
|
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 {
|