@jbrowse/sv-core 2.17.0 → 3.0.0
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/dist/BreakendMultiLevelOptionDialog.d.ts +6 -18
- package/dist/BreakendMultiLevelOptionDialog.js +33 -127
- package/dist/BreakendSingleLevelOptionDialog.d.ts +6 -18
- package/dist/BreakendSingleLevelOptionDialog.js +41 -91
- package/dist/Checkbox2.d.ts +1 -2
- package/dist/Checkbox2.js +2 -5
- package/dist/index.d.ts +3 -0
- package/dist/index.js +17 -0
- package/dist/navToMultiLevelBreak.d.ts +11 -0
- package/dist/navToMultiLevelBreak.js +77 -0
- package/dist/navToSingleLevelBreak.d.ts +61 -0
- package/dist/navToSingleLevelBreak.js +136 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.js +2 -0
- package/dist/util.d.ts +18 -0
- package/dist/util.js +58 -0
- package/esm/BreakendMultiLevelOptionDialog.d.ts +6 -18
- package/esm/BreakendMultiLevelOptionDialog.js +33 -104
- package/esm/BreakendSingleLevelOptionDialog.d.ts +6 -18
- package/esm/BreakendSingleLevelOptionDialog.js +42 -69
- package/esm/Checkbox2.d.ts +1 -2
- package/esm/Checkbox2.js +2 -2
- package/esm/index.d.ts +3 -0
- package/esm/index.js +3 -0
- package/esm/navToMultiLevelBreak.d.ts +11 -0
- package/esm/navToMultiLevelBreak.js +74 -0
- package/esm/navToSingleLevelBreak.d.ts +61 -0
- package/esm/navToSingleLevelBreak.js +131 -0
- package/esm/types.d.ts +13 -0
- package/esm/types.js +1 -0
- package/esm/util.d.ts +18 -0
- package/esm/util.js +53 -0
- package/package.json +5 -3
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.singleLevelFocusedSnapshotFromBreakendFeature = singleLevelFocusedSnapshotFromBreakendFeature;
|
|
4
|
+
exports.singleLevelEncompassingSnapshotFromBreakendFeature = singleLevelEncompassingSnapshotFromBreakendFeature;
|
|
5
|
+
exports.navToSingleLevelBreak = navToSingleLevelBreak;
|
|
6
|
+
const util_1 = require("@jbrowse/core/util");
|
|
7
|
+
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
8
|
+
const util_2 = require("./util");
|
|
9
|
+
function singleLevelFocusedSnapshotFromBreakendFeature({ feature, session, assemblyName, windowSize = 0, }) {
|
|
10
|
+
const { assemblyManager } = session;
|
|
11
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
12
|
+
if (!assembly) {
|
|
13
|
+
throw new Error(`assembly ${assemblyName} not found`);
|
|
14
|
+
}
|
|
15
|
+
if (!assembly.regions) {
|
|
16
|
+
throw new Error(`assembly ${assemblyName} regions not loaded`);
|
|
17
|
+
}
|
|
18
|
+
const coverage = (0, util_2.getBreakendCoveringRegions)({
|
|
19
|
+
feature,
|
|
20
|
+
assembly,
|
|
21
|
+
});
|
|
22
|
+
const { refName, mateRefName } = coverage;
|
|
23
|
+
const topRegion = assembly.regions.find(f => f.refName === refName);
|
|
24
|
+
const bottomRegion = assembly.regions.find(f => f.refName === mateRefName);
|
|
25
|
+
return {
|
|
26
|
+
coverage,
|
|
27
|
+
snap: {
|
|
28
|
+
type: 'BreakpointSplitView',
|
|
29
|
+
views: [
|
|
30
|
+
{
|
|
31
|
+
type: 'LinearGenomeView',
|
|
32
|
+
displayedRegions: (0, util_1.gatherOverlaps)([
|
|
33
|
+
{
|
|
34
|
+
...topRegion,
|
|
35
|
+
end: coverage.pos + windowSize,
|
|
36
|
+
assemblyName,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
...bottomRegion,
|
|
40
|
+
start: coverage.matePos - windowSize,
|
|
41
|
+
assemblyName,
|
|
42
|
+
},
|
|
43
|
+
]),
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
displayName: (0, util_2.makeTitle)(feature),
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function singleLevelEncompassingSnapshotFromBreakendFeature({ feature, session, assemblyName, }) {
|
|
51
|
+
const { assemblyManager } = session;
|
|
52
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
53
|
+
if (!assembly) {
|
|
54
|
+
throw new Error(`assembly ${assemblyName} not found`);
|
|
55
|
+
}
|
|
56
|
+
if (!assembly.regions) {
|
|
57
|
+
throw new Error(`assembly ${assemblyName} regions not loaded`);
|
|
58
|
+
}
|
|
59
|
+
const coverage = (0, util_2.getBreakendCoveringRegions)({
|
|
60
|
+
feature,
|
|
61
|
+
assembly,
|
|
62
|
+
});
|
|
63
|
+
const { refName, mateRefName } = coverage;
|
|
64
|
+
const topRegion = assembly.regions.find(f => f.refName === refName);
|
|
65
|
+
const bottomRegion = assembly.regions.find(f => f.refName === mateRefName);
|
|
66
|
+
return {
|
|
67
|
+
coverage,
|
|
68
|
+
snap: {
|
|
69
|
+
type: 'BreakpointSplitView',
|
|
70
|
+
views: [
|
|
71
|
+
{
|
|
72
|
+
type: 'LinearGenomeView',
|
|
73
|
+
displayedRegions: (0, util_1.gatherOverlaps)([
|
|
74
|
+
{ ...topRegion, assemblyName },
|
|
75
|
+
{ ...bottomRegion, assemblyName },
|
|
76
|
+
]),
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
displayName: (0, util_2.makeTitle)(feature),
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function navToSingleLevelBreak({ stableViewId, feature, assemblyName, session, tracks, windowSize = 0, focusOnBreakends, }) {
|
|
84
|
+
var _a;
|
|
85
|
+
const { snap, coverage } = focusOnBreakends
|
|
86
|
+
? singleLevelFocusedSnapshotFromBreakendFeature({
|
|
87
|
+
feature,
|
|
88
|
+
assemblyName,
|
|
89
|
+
session,
|
|
90
|
+
windowSize,
|
|
91
|
+
})
|
|
92
|
+
: singleLevelEncompassingSnapshotFromBreakendFeature({
|
|
93
|
+
feature,
|
|
94
|
+
assemblyName,
|
|
95
|
+
session,
|
|
96
|
+
});
|
|
97
|
+
const { refName, pos: startPos, mateRefName, matePos: endPos } = coverage;
|
|
98
|
+
let view = session.views.find(f => f.id === stableViewId);
|
|
99
|
+
if (!view) {
|
|
100
|
+
view = session.addView('BreakpointSplitView', {
|
|
101
|
+
...snap,
|
|
102
|
+
views: [
|
|
103
|
+
{
|
|
104
|
+
...snap.views[0],
|
|
105
|
+
tracks: tracks ? (0, util_2.stripIds)((0, mobx_state_tree_1.getSnapshot)(tracks)) : [],
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
(_a = view.views[0]) === null || _a === void 0 ? void 0 : _a.setDisplayedRegions(snap.views[0].displayedRegions);
|
|
112
|
+
view.setDisplayName(snap.displayName);
|
|
113
|
+
}
|
|
114
|
+
const lgv = view.views[0];
|
|
115
|
+
await (0, util_1.when)(() => lgv.initialized);
|
|
116
|
+
const l0 = lgv.bpToPx({
|
|
117
|
+
coord: Math.max(0, startPos - windowSize),
|
|
118
|
+
refName,
|
|
119
|
+
});
|
|
120
|
+
const r0 = lgv.bpToPx({
|
|
121
|
+
coord: endPos + windowSize,
|
|
122
|
+
refName: mateRefName,
|
|
123
|
+
});
|
|
124
|
+
if (l0 && r0) {
|
|
125
|
+
lgv.moveTo({
|
|
126
|
+
...l0,
|
|
127
|
+
offset: l0.offsetPx,
|
|
128
|
+
}, {
|
|
129
|
+
...r0,
|
|
130
|
+
offset: r0.offsetPx,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
(0, util_1.getSession)(lgv).notify('Unable to navigate to breakpoint');
|
|
135
|
+
}
|
|
136
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
|
|
2
|
+
export interface Display {
|
|
3
|
+
id: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
export interface Track {
|
|
7
|
+
id: string;
|
|
8
|
+
displays: Display[];
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface BreakpointSplitView {
|
|
12
|
+
views: LinearGenomeViewModel[];
|
|
13
|
+
}
|
package/dist/types.js
ADDED
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Track } from './types';
|
|
2
|
+
import type { Assembly } from '@jbrowse/core/assemblyManager/assembly';
|
|
3
|
+
import type { Feature } from '@jbrowse/core/util';
|
|
4
|
+
export declare function getBreakendCoveringRegions({ feature, assembly, }: {
|
|
5
|
+
feature: Feature;
|
|
6
|
+
assembly: Assembly;
|
|
7
|
+
}): {
|
|
8
|
+
pos: number;
|
|
9
|
+
refName: string;
|
|
10
|
+
mateRefName: string;
|
|
11
|
+
matePos: any;
|
|
12
|
+
};
|
|
13
|
+
export declare function stripIds(arr: Track[]): {
|
|
14
|
+
displays: {
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}[];
|
|
17
|
+
}[];
|
|
18
|
+
export declare function makeTitle(f: Feature): string;
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBreakendCoveringRegions = getBreakendCoveringRegions;
|
|
4
|
+
exports.stripIds = stripIds;
|
|
5
|
+
exports.makeTitle = makeTitle;
|
|
6
|
+
const vcf_1 = require("@gmod/vcf");
|
|
7
|
+
function getBreakendCoveringRegions({ feature, assembly, }) {
|
|
8
|
+
var _a;
|
|
9
|
+
const alt = (_a = feature.get('ALT')) === null || _a === void 0 ? void 0 : _a[0];
|
|
10
|
+
const bnd = alt ? (0, vcf_1.parseBreakend)(alt) : undefined;
|
|
11
|
+
const startPos = feature.get('start');
|
|
12
|
+
const refName = feature.get('refName');
|
|
13
|
+
const f = (ref) => assembly.getCanonicalRefName(ref) || ref;
|
|
14
|
+
if (alt === '<TRA>') {
|
|
15
|
+
const INFO = feature.get('INFO');
|
|
16
|
+
return {
|
|
17
|
+
pos: startPos,
|
|
18
|
+
refName: f(refName),
|
|
19
|
+
mateRefName: f(INFO.CHR2[0]),
|
|
20
|
+
matePos: INFO.END[0] - 1,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
else if (bnd === null || bnd === void 0 ? void 0 : bnd.MatePosition) {
|
|
24
|
+
const matePosition = bnd.MatePosition.split(':');
|
|
25
|
+
return {
|
|
26
|
+
pos: startPos,
|
|
27
|
+
refName: f(refName),
|
|
28
|
+
mateRefName: f(matePosition[0]),
|
|
29
|
+
matePos: +matePosition[1] - 1,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
else if (feature.get('mate')) {
|
|
33
|
+
const mate = feature.get('mate');
|
|
34
|
+
return {
|
|
35
|
+
pos: startPos,
|
|
36
|
+
refName: f(refName),
|
|
37
|
+
mateRefName: f(mate.refName),
|
|
38
|
+
matePos: mate.start,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return {
|
|
43
|
+
pos: startPos,
|
|
44
|
+
refName: f(refName),
|
|
45
|
+
mateRefName: f(refName),
|
|
46
|
+
matePos: feature.get('end'),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function stripIds(arr) {
|
|
51
|
+
return arr.map(({ id, displays, ...rest }) => ({
|
|
52
|
+
...rest,
|
|
53
|
+
displays: displays.map(({ id, ...rest }) => rest),
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
function makeTitle(f) {
|
|
57
|
+
return `${f.get('name') || f.get('id') || 'breakend'} split detail`;
|
|
58
|
+
}
|
|
@@ -1,23 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Feature } from '@jbrowse/core/util';
|
|
1
|
+
import type { AbstractSessionModel, Feature } from '@jbrowse/core/util';
|
|
3
2
|
import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
model: unknown;
|
|
3
|
+
declare const BreakendMultiLevelOptionDialog: ({ session, handleClose, feature, assemblyName, stableViewId, view, }: {
|
|
4
|
+
session: AbstractSessionModel;
|
|
7
5
|
handleClose: () => void;
|
|
8
6
|
feature: Feature;
|
|
9
|
-
view
|
|
7
|
+
view?: LinearGenomeViewModel;
|
|
10
8
|
assemblyName: string;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
feature: Feature;
|
|
14
|
-
assembly: Assembly;
|
|
15
|
-
}) => {
|
|
16
|
-
pos: number;
|
|
17
|
-
refName: string;
|
|
18
|
-
mateRefName: string;
|
|
19
|
-
matePos: number;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
}) => React.JSX.Element;
|
|
9
|
+
stableViewId?: string;
|
|
10
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
23
11
|
export default BreakendMultiLevelOptionDialog;
|
|
@@ -1,112 +1,41 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Dialog } from '@jbrowse/core/ui';
|
|
3
4
|
import { Button, DialogActions, DialogContent } from '@mui/material';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
4
6
|
import { getSnapshot } from 'mobx-state-tree';
|
|
5
|
-
import { Dialog } from '@jbrowse/core/ui';
|
|
6
|
-
import { when } from 'mobx';
|
|
7
|
-
import { getSession } from '@jbrowse/core/util';
|
|
8
|
-
// locals
|
|
9
7
|
import Checkbox2 from './Checkbox2';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
...rest,
|
|
13
|
-
displays: displays.map(({ id, ...rest }) => rest),
|
|
14
|
-
}));
|
|
15
|
-
}
|
|
16
|
-
const BreakendMultiLevelOptionDialog = observer(function ({ model, handleClose, feature, assemblyName, viewType, view, }) {
|
|
8
|
+
import { navToMultiLevelBreak } from './navToMultiLevelBreak';
|
|
9
|
+
const BreakendMultiLevelOptionDialog = observer(function ({ session, handleClose, feature, assemblyName, stableViewId, view, }) {
|
|
17
10
|
const [copyTracks, setCopyTracks] = useState(true);
|
|
18
11
|
const [mirror, setMirror] = useState(true);
|
|
19
|
-
return (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if (!asm) {
|
|
36
|
-
throw new Error(`assembly ${assemblyName} not found`);
|
|
37
|
-
}
|
|
38
|
-
const { refName, pos, mateRefName, matePos } = viewType.getBreakendCoveringRegions({
|
|
39
|
-
feature,
|
|
40
|
-
assembly: asm,
|
|
41
|
-
});
|
|
42
|
-
const viewTracks = getSnapshot(view.tracks);
|
|
43
|
-
const breakpointSplitView = session.addView('BreakpointSplitView', {
|
|
44
|
-
type: 'BreakpointSplitView',
|
|
45
|
-
displayName: `${feature.get('name') || feature.get('id') || 'breakend'} split detail`,
|
|
46
|
-
views: [
|
|
47
|
-
{
|
|
48
|
-
type: 'LinearGenomeView',
|
|
49
|
-
hideHeader: true,
|
|
50
|
-
tracks: stripIds(getSnapshot(view.tracks)),
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
type: 'LinearGenomeView',
|
|
54
|
-
hideHeader: true,
|
|
55
|
-
tracks: stripIds(mirror ? [...viewTracks].reverse() : viewTracks),
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
});
|
|
59
|
-
const r1 = asm.regions.find(r => r.refName === refName);
|
|
60
|
-
const r2 = asm.regions.find(r => r.refName === mateRefName);
|
|
61
|
-
if (!r1 || !r2) {
|
|
62
|
-
throw new Error("can't find regions");
|
|
63
|
-
}
|
|
64
|
-
await Promise.all([
|
|
65
|
-
breakpointSplitView.views[0].navToLocations([
|
|
66
|
-
{
|
|
67
|
-
refName,
|
|
68
|
-
start: r1.start,
|
|
69
|
-
end: pos,
|
|
70
|
-
assemblyName,
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
refName,
|
|
74
|
-
start: pos + 1,
|
|
75
|
-
end: r1.end,
|
|
76
|
-
assemblyName,
|
|
77
|
-
},
|
|
78
|
-
]),
|
|
79
|
-
breakpointSplitView.views[1].navToLocations([
|
|
80
|
-
{
|
|
81
|
-
refName: mateRefName,
|
|
82
|
-
start: r2.start,
|
|
83
|
-
end: matePos,
|
|
84
|
-
assemblyName,
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
refName: mateRefName,
|
|
88
|
-
start: matePos + 1,
|
|
89
|
-
end: r2.end,
|
|
12
|
+
return (_jsxs(Dialog, { open: true, onClose: handleClose, title: "Multi-level breakpoint split view options", children: [_jsxs(DialogContent, { children: [_jsx("div", { children: "Launch multi-level breakpoint split view" }), view ? (_jsxs(_Fragment, { children: [_jsx(Checkbox2, { checked: copyTracks, label: "Copy tracks into the new view", onChange: event => {
|
|
13
|
+
setCopyTracks(event.target.checked);
|
|
14
|
+
} }), copyTracks ? (_jsx(Checkbox2, { checked: mirror, disabled: !copyTracks, label: "Mirror the copied tracks (only available if copying tracks and using two level)", onChange: event => {
|
|
15
|
+
setMirror(event.target.checked);
|
|
16
|
+
} })) : null] })) : null] }), _jsxs(DialogActions, { children: [_jsx(Button, { onClick: () => {
|
|
17
|
+
;
|
|
18
|
+
(async () => {
|
|
19
|
+
try {
|
|
20
|
+
await navToMultiLevelBreak({
|
|
21
|
+
stableViewId,
|
|
22
|
+
session,
|
|
23
|
+
tracks: copyTracks && view
|
|
24
|
+
? getSnapshot(view.tracks)
|
|
25
|
+
: [],
|
|
26
|
+
mirror,
|
|
27
|
+
feature,
|
|
90
28
|
assemblyName,
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
console.error(e);
|
|
103
|
-
session.notify(`${e}`);
|
|
104
|
-
}
|
|
105
|
-
})();
|
|
106
|
-
handleClose();
|
|
107
|
-
}, variant: "contained", color: "primary", autoFocus: true }, "OK"),
|
|
108
|
-
React.createElement(Button, { color: "secondary", variant: "contained", onClick: () => {
|
|
109
|
-
handleClose();
|
|
110
|
-
} }, "Cancel"))));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
console.error(e);
|
|
33
|
+
session.notifyError(`${e}`, e);
|
|
34
|
+
}
|
|
35
|
+
})();
|
|
36
|
+
handleClose();
|
|
37
|
+
}, variant: "contained", color: "primary", autoFocus: true, children: "OK" }), _jsx(Button, { color: "secondary", variant: "contained", onClick: () => {
|
|
38
|
+
handleClose();
|
|
39
|
+
}, children: "Cancel" })] })] }));
|
|
111
40
|
});
|
|
112
41
|
export default BreakendMultiLevelOptionDialog;
|
|
@@ -1,23 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Feature } from '@jbrowse/core/util';
|
|
1
|
+
import type { AbstractSessionModel, Feature } from '@jbrowse/core/util';
|
|
3
2
|
import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
model: unknown;
|
|
3
|
+
declare const BreakendSingleLevelOptionDialog: ({ session, handleClose, feature, stableViewId, assemblyName, view, }: {
|
|
4
|
+
session: AbstractSessionModel;
|
|
7
5
|
handleClose: () => void;
|
|
6
|
+
stableViewId?: string;
|
|
8
7
|
feature: Feature;
|
|
9
|
-
view
|
|
8
|
+
view?: LinearGenomeViewModel;
|
|
10
9
|
assemblyName: string;
|
|
11
|
-
|
|
12
|
-
getBreakendCoveringRegions: (arg: {
|
|
13
|
-
feature: Feature;
|
|
14
|
-
assembly: Assembly;
|
|
15
|
-
}) => {
|
|
16
|
-
pos: number;
|
|
17
|
-
refName: string;
|
|
18
|
-
mateRefName: string;
|
|
19
|
-
matePos: number;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
}) => React.JSX.Element;
|
|
10
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
23
11
|
export default BreakendSingleLevelOptionDialog;
|
|
@@ -1,75 +1,48 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { Button, DialogActions, DialogContent, TextField } from '@mui/material';
|
|
4
|
-
import { getSnapshot } from 'mobx-state-tree';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
5
3
|
import { Dialog } from '@jbrowse/core/ui';
|
|
6
|
-
import {
|
|
7
|
-
|
|
4
|
+
import { useLocalStorage } from '@jbrowse/core/util';
|
|
5
|
+
import { Button, DialogActions, DialogContent, TextField } from '@mui/material';
|
|
6
|
+
import { observer } from 'mobx-react';
|
|
8
7
|
import Checkbox2 from './Checkbox2';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
...rest,
|
|
12
|
-
displays: displays.map(({ id, ...rest }) => rest),
|
|
13
|
-
}));
|
|
14
|
-
}
|
|
15
|
-
const BreakendSingleLevelOptionDialog = observer(function ({ model, handleClose, feature, assemblyName, viewType, view, }) {
|
|
8
|
+
import { navToSingleLevelBreak } from './navToSingleLevelBreak';
|
|
9
|
+
const BreakendSingleLevelOptionDialog = observer(function ({ session, handleClose, feature, stableViewId, assemblyName, view, }) {
|
|
16
10
|
const [copyTracks, setCopyTracks] = useState(true);
|
|
11
|
+
const [focusOnBreakends, setFocusOnBreakends] = useState(true);
|
|
17
12
|
const [windowSize, setWindowSize] = useLocalStorage('breakpointWindowSize', '5000');
|
|
18
|
-
return (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
start: Math.max(0, pos - w),
|
|
53
|
-
end: pos + w,
|
|
54
|
-
assemblyName,
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
refName: mateRefName,
|
|
58
|
-
start: Math.max(0, matePos - w),
|
|
59
|
-
end: matePos + w,
|
|
60
|
-
assemblyName,
|
|
61
|
-
},
|
|
62
|
-
], w));
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
console.error(e);
|
|
66
|
-
session.notify(`${e}`);
|
|
67
|
-
}
|
|
68
|
-
})();
|
|
69
|
-
handleClose();
|
|
70
|
-
}, variant: "contained", color: "primary", autoFocus: true }, "OK"),
|
|
71
|
-
React.createElement(Button, { color: "secondary", variant: "contained", onClick: () => {
|
|
72
|
-
handleClose();
|
|
73
|
-
} }, "Cancel"))));
|
|
13
|
+
return (_jsxs(Dialog, { open: true, onClose: handleClose, title: "Single-level breakpoint split view options", children: [_jsxs(DialogContent, { children: [view ? (_jsx(Checkbox2, { checked: copyTracks, label: "Copy tracks into the new view", onChange: event => {
|
|
14
|
+
setCopyTracks(event.target.checked);
|
|
15
|
+
} })) : null, _jsx(Checkbox2, { checked: copyTracks, label: "Focus on breakends", onChange: event => {
|
|
16
|
+
setFocusOnBreakends(event.target.checked);
|
|
17
|
+
} }), _jsx(TextField, { label: "Window size (bp)", value: windowSize, onChange: event => {
|
|
18
|
+
setWindowSize(event.target.value);
|
|
19
|
+
} })] }), _jsxs(DialogActions, { children: [_jsx(Button, { onClick: () => {
|
|
20
|
+
;
|
|
21
|
+
(async () => {
|
|
22
|
+
try {
|
|
23
|
+
const { assemblyManager } = session;
|
|
24
|
+
const assembly = await assemblyManager.waitForAssembly(assemblyName);
|
|
25
|
+
if (!assembly) {
|
|
26
|
+
throw new Error(`assembly ${assemblyName} not found`);
|
|
27
|
+
}
|
|
28
|
+
await navToSingleLevelBreak({
|
|
29
|
+
feature,
|
|
30
|
+
assemblyName,
|
|
31
|
+
focusOnBreakends,
|
|
32
|
+
session,
|
|
33
|
+
stableViewId,
|
|
34
|
+
tracks: view === null || view === void 0 ? void 0 : view.tracks,
|
|
35
|
+
windowSize: +windowSize || 0,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
console.error(e);
|
|
40
|
+
session.notifyError(`${e}`, e);
|
|
41
|
+
}
|
|
42
|
+
})();
|
|
43
|
+
handleClose();
|
|
44
|
+
}, variant: "contained", color: "primary", autoFocus: true, children: "OK" }), _jsx(Button, { color: "secondary", variant: "contained", onClick: () => {
|
|
45
|
+
handleClose();
|
|
46
|
+
}, children: "Cancel" })] })] }));
|
|
74
47
|
});
|
|
75
48
|
export default BreakendSingleLevelOptionDialog;
|
package/esm/Checkbox2.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
export default function Checkbox2({ checked, disabled, label, onChange, }: {
|
|
3
2
|
checked: boolean;
|
|
4
3
|
disabled?: boolean;
|
|
5
4
|
label: string;
|
|
6
5
|
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
7
|
-
}):
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
package/esm/Checkbox2.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Checkbox, FormControlLabel } from '@mui/material';
|
|
3
3
|
import { makeStyles } from 'tss-react/mui';
|
|
4
4
|
const useStyles = makeStyles()({
|
|
@@ -8,5 +8,5 @@ const useStyles = makeStyles()({
|
|
|
8
8
|
});
|
|
9
9
|
export default function Checkbox2({ checked, disabled, label, onChange, }) {
|
|
10
10
|
const { classes } = useStyles();
|
|
11
|
-
return (
|
|
11
|
+
return (_jsx(FormControlLabel, { disabled: disabled, className: classes.block, control: _jsx(Checkbox, { checked: checked, onChange: onChange }), label: label }));
|
|
12
12
|
}
|
package/esm/index.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export { default as BreakendMultiLevelOptionDialog } from './BreakendMultiLevelOptionDialog';
|
|
2
2
|
export { default as BreakendSingleLevelOptionDialog } from './BreakendSingleLevelOptionDialog';
|
|
3
|
+
export * from './util';
|
|
4
|
+
export * from './navToSingleLevelBreak';
|
|
5
|
+
export * from './navToMultiLevelBreak';
|
package/esm/index.js
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export { default as BreakendMultiLevelOptionDialog } from './BreakendMultiLevelOptionDialog';
|
|
2
2
|
export { default as BreakendSingleLevelOptionDialog } from './BreakendSingleLevelOptionDialog';
|
|
3
|
+
export * from './util';
|
|
4
|
+
export * from './navToSingleLevelBreak';
|
|
5
|
+
export * from './navToMultiLevelBreak';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Track } from './types';
|
|
2
|
+
import type { AbstractSessionModel, Feature } from '@jbrowse/core/util';
|
|
3
|
+
export declare function navToMultiLevelBreak({ stableViewId, feature, assemblyName, session, mirror, tracks: viewTracks, }: {
|
|
4
|
+
stableViewId?: string;
|
|
5
|
+
feature: Feature;
|
|
6
|
+
assemblyName: string;
|
|
7
|
+
windowSize?: number;
|
|
8
|
+
session: AbstractSessionModel;
|
|
9
|
+
mirror?: boolean;
|
|
10
|
+
tracks?: Track[];
|
|
11
|
+
}): Promise<void>;
|