@jbrowse/sv-core 2.18.0 → 3.0.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.
@@ -1,4 +1,3 @@
1
- import React from 'react';
2
1
  import type { AbstractSessionModel, Feature } from '@jbrowse/core/util';
3
2
  import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
4
3
  declare const BreakendMultiLevelOptionDialog: ({ session, handleClose, feature, assemblyName, stableViewId, view, }: {
@@ -8,5 +7,5 @@ declare const BreakendMultiLevelOptionDialog: ({ session, handleClose, feature,
8
7
  view?: LinearGenomeViewModel;
9
8
  assemblyName: string;
10
9
  stableViewId?: string;
11
- }) => React.JSX.Element;
10
+ }) => import("react/jsx-runtime").JSX.Element;
12
11
  export default BreakendMultiLevelOptionDialog;
@@ -1,148 +1,46 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const react_1 = __importStar(require("react"));
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
30
8
  const ui_1 = require("@jbrowse/core/ui");
31
9
  const material_1 = require("@mui/material");
32
- const mobx_1 = require("mobx");
33
10
  const mobx_react_1 = require("mobx-react");
34
11
  const mobx_state_tree_1 = require("mobx-state-tree");
35
12
  const Checkbox2_1 = __importDefault(require("./Checkbox2"));
36
- const util_1 = require("./util");
37
- function stripIds(arr) {
38
- return arr.map(({ id, displays, ...rest }) => ({
39
- ...rest,
40
- displays: displays.map(({ id, ...rest }) => rest),
41
- }));
42
- }
13
+ const navToMultiLevelBreak_1 = require("./navToMultiLevelBreak");
43
14
  const BreakendMultiLevelOptionDialog = (0, mobx_react_1.observer)(function ({ session, handleClose, feature, assemblyName, stableViewId, view, }) {
44
15
  const [copyTracks, setCopyTracks] = (0, react_1.useState)(true);
45
16
  const [mirror, setMirror] = (0, react_1.useState)(true);
46
- return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Multi-level breakpoint split view options" },
47
- react_1.default.createElement(material_1.DialogContent, null,
48
- react_1.default.createElement("div", null, "Launch multi-level breakpoint split view"),
49
- view ? (react_1.default.createElement(react_1.default.Fragment, null,
50
- react_1.default.createElement(Checkbox2_1.default, { checked: copyTracks, label: "Copy tracks into the new view", onChange: event => {
51
- setCopyTracks(event.target.checked);
52
- } }),
53
- copyTracks ? (react_1.default.createElement(Checkbox2_1.default, { checked: mirror, disabled: !copyTracks, label: "Mirror the copied tracks (only available if copying tracks and using two level)", onChange: event => {
54
- setMirror(event.target.checked);
55
- } })) : null)) : null),
56
- react_1.default.createElement(material_1.DialogActions, null,
57
- react_1.default.createElement(material_1.Button, { onClick: () => {
58
- ;
59
- (async () => {
60
- try {
61
- const { assemblyManager } = session;
62
- const assembly = await assemblyManager.waitForAssembly(assemblyName);
63
- if (!assembly) {
64
- throw new Error(`assembly ${assemblyName} not found`);
65
- }
66
- const { refName, pos, mateRefName, matePos } = (0, util_1.getBreakendCoveringRegions)({
67
- feature,
68
- assembly: assembly,
69
- });
70
- const viewTracks = view
71
- ? (0, mobx_state_tree_1.getSnapshot)(view.tracks)
72
- : [];
73
- let viewInStack = session.views.find(f => f.id === stableViewId);
74
- const displayName = `${feature.get('name') || feature.get('id') || 'breakend'} split detail`;
75
- if (!viewInStack) {
76
- viewInStack = session.addView('BreakpointSplitView', {
77
- id: stableViewId,
78
- type: 'BreakpointSplitView',
79
- displayName,
80
- views: [
81
- {
82
- type: 'LinearGenomeView',
83
- hideHeader: true,
84
- tracks: stripIds(viewTracks),
85
- },
86
- {
87
- type: 'LinearGenomeView',
88
- hideHeader: true,
89
- tracks: stripIds(mirror ? [...viewTracks].reverse() : viewTracks),
90
- },
91
- ],
92
- });
93
- }
94
- viewInStack.setDisplayName(displayName);
95
- const r1 = assembly.regions.find(r => r.refName === refName);
96
- const r2 = assembly.regions.find(r => r.refName === mateRefName);
97
- if (!r1 || !r2) {
98
- throw new Error("can't find regions");
99
- }
100
- await Promise.all([
101
- viewInStack.views[0].navToLocations([
102
- {
103
- refName,
104
- start: r1.start,
105
- end: pos,
106
- assemblyName,
107
- },
108
- {
109
- refName,
110
- start: pos + 1,
111
- end: r1.end,
112
- assemblyName,
113
- },
114
- ]),
115
- viewInStack.views[1].navToLocations([
116
- {
117
- refName: mateRefName,
118
- start: r2.start,
119
- end: matePos,
120
- assemblyName,
121
- },
122
- {
123
- refName: mateRefName,
124
- start: matePos + 1,
125
- end: r2.end,
17
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Dialog, { open: true, onClose: handleClose, title: "Multi-level breakpoint split view options", children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [(0, jsx_runtime_1.jsx)("div", { children: "Launch multi-level breakpoint split view" }), view ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Checkbox2_1.default, { checked: copyTracks, label: "Copy tracks into the new view", onChange: event => {
18
+ setCopyTracks(event.target.checked);
19
+ } }), copyTracks ? ((0, jsx_runtime_1.jsx)(Checkbox2_1.default, { checked: mirror, disabled: !copyTracks, label: "Mirror the copied tracks (only available if copying tracks and using two level)", onChange: event => {
20
+ setMirror(event.target.checked);
21
+ } })) : null] })) : null] }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { onClick: () => {
22
+ ;
23
+ (async () => {
24
+ try {
25
+ await (0, navToMultiLevelBreak_1.navToMultiLevelBreak)({
26
+ stableViewId,
27
+ session,
28
+ tracks: copyTracks && view
29
+ ? (0, mobx_state_tree_1.getSnapshot)(view.tracks)
30
+ : [],
31
+ mirror,
32
+ feature,
126
33
  assemblyName,
127
- },
128
- ]),
129
- ]);
130
- await (0, mobx_1.when)(() => viewInStack.views[1].initialized &&
131
- viewInStack.views[0].initialized);
132
- viewInStack.views[1].zoomTo(10);
133
- viewInStack.views[0].zoomTo(10);
134
- viewInStack.views[1].centerAt(matePos, mateRefName);
135
- viewInStack.views[0].centerAt(pos, refName);
136
- }
137
- catch (e) {
138
- console.error(e);
139
- session.notifyError(`${e}`, e);
140
- }
141
- })();
142
- handleClose();
143
- }, variant: "contained", color: "primary", autoFocus: true }, "OK"),
144
- react_1.default.createElement(material_1.Button, { color: "secondary", variant: "contained", onClick: () => {
145
- handleClose();
146
- } }, "Cancel"))));
34
+ });
35
+ }
36
+ catch (e) {
37
+ console.error(e);
38
+ session.notifyError(`${e}`, e);
39
+ }
40
+ })();
41
+ handleClose();
42
+ }, variant: "contained", color: "primary", autoFocus: true, children: "OK" }), (0, jsx_runtime_1.jsx)(material_1.Button, { color: "secondary", variant: "contained", onClick: () => {
43
+ handleClose();
44
+ }, children: "Cancel" })] })] }));
147
45
  });
148
46
  exports.default = BreakendMultiLevelOptionDialog;
@@ -1,4 +1,3 @@
1
- import React from 'react';
2
1
  import type { AbstractSessionModel, Feature } from '@jbrowse/core/util';
3
2
  import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
4
3
  declare const BreakendSingleLevelOptionDialog: ({ session, handleClose, feature, stableViewId, assemblyName, view, }: {
@@ -8,5 +7,5 @@ declare const BreakendSingleLevelOptionDialog: ({ session, handleClose, feature,
8
7
  feature: Feature;
9
8
  view?: LinearGenomeViewModel;
10
9
  assemblyName: string;
11
- }) => React.JSX.Element;
10
+ }) => import("react/jsx-runtime").JSX.Element;
12
11
  export default BreakendSingleLevelOptionDialog;
@@ -1,77 +1,53 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const react_1 = __importStar(require("react"));
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
30
8
  const ui_1 = require("@jbrowse/core/ui");
31
9
  const util_1 = require("@jbrowse/core/util");
32
10
  const material_1 = require("@mui/material");
33
11
  const mobx_react_1 = require("mobx-react");
34
12
  const Checkbox2_1 = __importDefault(require("./Checkbox2"));
35
- const util_2 = require("./util");
13
+ const navToSingleLevelBreak_1 = require("./navToSingleLevelBreak");
36
14
  const BreakendSingleLevelOptionDialog = (0, mobx_react_1.observer)(function ({ session, handleClose, feature, stableViewId, assemblyName, view, }) {
37
15
  const [copyTracks, setCopyTracks] = (0, react_1.useState)(true);
16
+ const [focusOnBreakends, setFocusOnBreakends] = (0, react_1.useState)(true);
38
17
  const [windowSize, setWindowSize] = (0, util_1.useLocalStorage)('breakpointWindowSize', '5000');
39
- return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Single-level breakpoint split view options" },
40
- react_1.default.createElement(material_1.DialogContent, null,
41
- view ? (react_1.default.createElement(Checkbox2_1.default, { checked: copyTracks, label: "Copy tracks into the new view", onChange: event => {
42
- setCopyTracks(event.target.checked);
43
- } })) : null,
44
- react_1.default.createElement(material_1.TextField, { label: "Window size (bp)", value: windowSize, onChange: event => {
45
- setWindowSize(event.target.value);
46
- } })),
47
- react_1.default.createElement(material_1.DialogActions, null,
48
- react_1.default.createElement(material_1.Button, { onClick: () => {
49
- ;
50
- (async () => {
51
- try {
52
- const { assemblyManager } = session;
53
- const assembly = await assemblyManager.waitForAssembly(assemblyName);
54
- if (!assembly) {
55
- throw new Error(`assembly ${assemblyName} not found`);
56
- }
57
- await (0, util_2.navToSingleLevelBreak)({
58
- feature,
59
- assemblyName,
60
- session,
61
- stableViewId,
62
- tracks: view === null || view === void 0 ? void 0 : view.tracks,
63
- windowSize: +windowSize || 0,
64
- });
65
- }
66
- catch (e) {
67
- console.error(e);
68
- session.notifyError(`${e}`, e);
69
- }
70
- })();
71
- handleClose();
72
- }, variant: "contained", color: "primary", autoFocus: true }, "OK"),
73
- react_1.default.createElement(material_1.Button, { color: "secondary", variant: "contained", onClick: () => {
74
- handleClose();
75
- } }, "Cancel"))));
18
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Dialog, { open: true, onClose: handleClose, title: "Single-level breakpoint split view options", children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [view ? ((0, jsx_runtime_1.jsx)(Checkbox2_1.default, { checked: copyTracks, label: "Copy tracks into the new view", onChange: event => {
19
+ setCopyTracks(event.target.checked);
20
+ } })) : null, (0, jsx_runtime_1.jsx)(Checkbox2_1.default, { checked: copyTracks, label: "Focus on breakends", onChange: event => {
21
+ setFocusOnBreakends(event.target.checked);
22
+ } }), (0, jsx_runtime_1.jsx)(material_1.TextField, { label: "Window size (bp)", value: windowSize, onChange: event => {
23
+ setWindowSize(event.target.value);
24
+ } })] }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { onClick: () => {
25
+ ;
26
+ (async () => {
27
+ try {
28
+ const { assemblyManager } = session;
29
+ const assembly = await assemblyManager.waitForAssembly(assemblyName);
30
+ if (!assembly) {
31
+ throw new Error(`assembly ${assemblyName} not found`);
32
+ }
33
+ await (0, navToSingleLevelBreak_1.navToSingleLevelBreak)({
34
+ feature,
35
+ assemblyName,
36
+ focusOnBreakends,
37
+ session,
38
+ stableViewId,
39
+ tracks: view === null || view === void 0 ? void 0 : view.tracks,
40
+ windowSize: +windowSize || 0,
41
+ });
42
+ }
43
+ catch (e) {
44
+ console.error(e);
45
+ session.notifyError(`${e}`, e);
46
+ }
47
+ })();
48
+ handleClose();
49
+ }, variant: "contained", color: "primary", autoFocus: true, children: "OK" }), (0, jsx_runtime_1.jsx)(material_1.Button, { color: "secondary", variant: "contained", onClick: () => {
50
+ handleClose();
51
+ }, children: "Cancel" })] })] }));
76
52
  });
77
53
  exports.default = BreakendSingleLevelOptionDialog;
@@ -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
- }): React.JSX.Element;
6
+ }): import("react/jsx-runtime").JSX.Element;
package/dist/Checkbox2.js CHANGED
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.default = Checkbox2;
7
- const react_1 = __importDefault(require("react"));
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
5
  const material_1 = require("@mui/material");
9
6
  const mui_1 = require("tss-react/mui");
10
7
  const useStyles = (0, mui_1.makeStyles)()({
@@ -14,5 +11,5 @@ const useStyles = (0, mui_1.makeStyles)()({
14
11
  });
15
12
  function Checkbox2({ checked, disabled, label, onChange, }) {
16
13
  const { classes } = useStyles();
17
- return (react_1.default.createElement(material_1.FormControlLabel, { disabled: disabled, className: classes.block, control: react_1.default.createElement(material_1.Checkbox, { checked: checked, onChange: onChange }), label: label }));
14
+ return ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { disabled: disabled, className: classes.block, control: (0, jsx_runtime_1.jsx)(material_1.Checkbox, { checked: checked, onChange: onChange }), label: label }));
18
15
  }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { default as BreakendMultiLevelOptionDialog } from './BreakendMultiLevelOptionDialog';
2
2
  export { default as BreakendSingleLevelOptionDialog } from './BreakendSingleLevelOptionDialog';
3
3
  export * from './util';
4
+ export * from './navToSingleLevelBreak';
5
+ export * from './navToMultiLevelBreak';
package/dist/index.js CHANGED
@@ -23,3 +23,5 @@ Object.defineProperty(exports, "BreakendMultiLevelOptionDialog", { enumerable: t
23
23
  var BreakendSingleLevelOptionDialog_1 = require("./BreakendSingleLevelOptionDialog");
24
24
  Object.defineProperty(exports, "BreakendSingleLevelOptionDialog", { enumerable: true, get: function () { return __importDefault(BreakendSingleLevelOptionDialog_1).default; } });
25
25
  __exportStar(require("./util"), exports);
26
+ __exportStar(require("./navToSingleLevelBreak"), exports);
27
+ __exportStar(require("./navToMultiLevelBreak"), exports);
@@ -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>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.navToMultiLevelBreak = navToMultiLevelBreak;
4
+ const util_1 = require("@jbrowse/core/util");
5
+ const util_2 = require("./util");
6
+ async function navToMultiLevelBreak({ stableViewId, feature, assemblyName, session, mirror, tracks: viewTracks = [], }) {
7
+ const { assemblyManager } = session;
8
+ const assembly = await assemblyManager.waitForAssembly(assemblyName);
9
+ if (!assembly) {
10
+ throw new Error(`assembly ${assemblyName} not found`);
11
+ }
12
+ const { refName, pos, mateRefName, matePos } = (0, util_2.getBreakendCoveringRegions)({
13
+ feature,
14
+ assembly: assembly,
15
+ });
16
+ let view = session.views.find(f => f.id === stableViewId);
17
+ if (!view) {
18
+ view = session.addView('BreakpointSplitView', {
19
+ id: stableViewId,
20
+ type: 'BreakpointSplitView',
21
+ displayName: (0, util_2.makeTitle)(feature),
22
+ views: [
23
+ {
24
+ type: 'LinearGenomeView',
25
+ hideHeader: true,
26
+ tracks: (0, util_2.stripIds)(viewTracks),
27
+ },
28
+ {
29
+ type: 'LinearGenomeView',
30
+ hideHeader: true,
31
+ tracks: (0, util_2.stripIds)(mirror ? [...viewTracks].reverse() : viewTracks),
32
+ },
33
+ ],
34
+ });
35
+ }
36
+ view.setDisplayName((0, util_2.makeTitle)(feature));
37
+ const r1 = assembly.regions.find(r => r.refName === refName);
38
+ const r2 = assembly.regions.find(r => r.refName === mateRefName);
39
+ if (!r1 || !r2) {
40
+ throw new Error("can't find regions");
41
+ }
42
+ await Promise.all([
43
+ view.views[0].navToLocations([
44
+ {
45
+ refName,
46
+ start: r1.start,
47
+ end: pos,
48
+ assemblyName,
49
+ },
50
+ {
51
+ refName,
52
+ start: pos + 1,
53
+ end: r1.end,
54
+ assemblyName,
55
+ },
56
+ ]),
57
+ view.views[1].navToLocations([
58
+ {
59
+ refName: mateRefName,
60
+ start: r2.start,
61
+ end: matePos,
62
+ assemblyName,
63
+ },
64
+ {
65
+ refName: mateRefName,
66
+ start: matePos + 1,
67
+ end: r2.end,
68
+ assemblyName,
69
+ },
70
+ ]),
71
+ ]);
72
+ await (0, util_1.when)(() => view.views[1].initialized && view.views[0].initialized);
73
+ view.views[1].zoomTo(10);
74
+ view.views[0].zoomTo(10);
75
+ view.views[1].centerAt(matePos, mateRefName);
76
+ view.views[0].centerAt(pos, refName);
77
+ }
@@ -0,0 +1,61 @@
1
+ import type { AbstractSessionModel, Feature } from '@jbrowse/core/util';
2
+ export declare function singleLevelFocusedSnapshotFromBreakendFeature({ feature, session, assemblyName, windowSize, }: {
3
+ feature: Feature;
4
+ session: AbstractSessionModel;
5
+ assemblyName: string;
6
+ windowSize?: number;
7
+ }): {
8
+ coverage: {
9
+ pos: number;
10
+ refName: string;
11
+ mateRefName: string;
12
+ matePos: any;
13
+ };
14
+ snap: {
15
+ type: string;
16
+ views: {
17
+ type: string;
18
+ displayedRegions: {
19
+ end: number;
20
+ assemblyName: string;
21
+ start: number;
22
+ refName: string;
23
+ }[];
24
+ }[];
25
+ displayName: string;
26
+ };
27
+ };
28
+ export declare function singleLevelEncompassingSnapshotFromBreakendFeature({ feature, session, assemblyName, }: {
29
+ feature: Feature;
30
+ session: AbstractSessionModel;
31
+ assemblyName: string;
32
+ }): {
33
+ coverage: {
34
+ pos: number;
35
+ refName: string;
36
+ mateRefName: string;
37
+ matePos: any;
38
+ };
39
+ snap: {
40
+ type: string;
41
+ views: {
42
+ type: string;
43
+ displayedRegions: {
44
+ assemblyName: string;
45
+ start: number;
46
+ end: number;
47
+ refName: string;
48
+ }[];
49
+ }[];
50
+ displayName: string;
51
+ };
52
+ };
53
+ export declare function navToSingleLevelBreak({ stableViewId, feature, assemblyName, session, tracks, windowSize, focusOnBreakends, }: {
54
+ stableViewId?: string;
55
+ feature: Feature;
56
+ assemblyName: string;
57
+ windowSize?: number;
58
+ session: AbstractSessionModel;
59
+ tracks?: any;
60
+ focusOnBreakends?: boolean;
61
+ }): Promise<void>;
@@ -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
+ }