taxonium-component
Version:
React component for exploring large phylogenetic trees in the browser
281 lines (280 loc) • 8.75 kB
JavaScript
import { jsx as m, jsxs as u, Fragment as M } from "react/jsx-runtime";
import { useState as h } from "react";
import { m as D, aG as O, u as k, o as F, a as S, D as L, d as T, B as y, e as x, c as V } from "./JBrowsePanel-BNE3gNW1.js";
import { F as $ } from "./FormControlLabel-CfHqydvH.js";
import { C as z } from "./Checkbox-D7_LksK2.js";
const A = D()({
block: {
display: "block"
}
});
function b({ checked: t, disabled: l, label: e, onChange: i }) {
const { classes: a } = A();
return m($, { disabled: l, className: a.block, control: m(z, { checked: t, onChange: i }), label: e });
}
function P({ feature: t, assembly: l }) {
var e;
const i = (e = t.get("ALT")) === null || e === void 0 ? void 0 : e[0], a = i ? O(i) : void 0, o = t.get("start"), c = t.get("refName"), r = (n) => l.getCanonicalRefName(n) || n;
if (i === "<TRA>") {
const n = t.get("INFO");
return {
pos: o,
refName: r(c),
mateRefName: r(n.CHR2[0]),
matePos: n.END[0] - 1
};
} else if (a != null && a.MatePosition) {
const n = a.MatePosition.split(":");
return {
pos: o,
refName: r(c),
mateRefName: r(n[0]),
matePos: +n[1] - 1
};
} else if (t.get("mate")) {
const n = t.get("mate");
return {
pos: o,
refName: r(c),
mateRefName: r(n.refName),
matePos: n.start
};
} else
return {
pos: o,
refName: r(c),
mateRefName: r(c),
matePos: t.get("end")
};
}
function B(t) {
return t.map(({ id: l, displays: e, ...i }) => ({
...i,
displays: e.map(({ id: a, ...o }) => o)
}));
}
function N(t) {
return `${t.get("name") || t.get("id") || "breakend"} split detail`;
}
async function G({ stableViewId: t, feature: l, assemblyName: e, session: i, mirror: a, tracks: o = [] }) {
const { assemblyManager: c } = i, r = await c.waitForAssembly(e);
if (!r)
throw new Error(`assembly ${e} not found`);
const { refName: n, pos: p, mateRefName: d, matePos: g } = P({
feature: l,
assembly: r
});
let s = i.views.find((f) => f.id === t);
s || (s = i.addView("BreakpointSplitView", {
id: t,
type: "BreakpointSplitView",
displayName: N(l),
views: [
{
type: "LinearGenomeView",
hideHeader: !0,
tracks: B(o)
},
{
type: "LinearGenomeView",
hideHeader: !0,
tracks: B(a ? [...o].reverse() : o)
}
]
})), s.setDisplayName(N(l));
const w = r.regions.find((f) => f.refName === n), v = r.regions.find((f) => f.refName === d);
if (!w || !v)
throw new Error("can't find regions");
await Promise.all([
s.views[0].navToLocations([
{
refName: n,
start: w.start,
end: p,
assemblyName: e
},
{
refName: n,
start: p + 1,
end: w.end,
assemblyName: e
}
]),
s.views[1].navToLocations([
{
refName: d,
start: v.start,
end: g,
assemblyName: e
},
{
refName: d,
start: g + 1,
end: v.end,
assemblyName: e
}
])
]), await k.when(() => s.views[1].initialized && s.views[0].initialized), s.views[1].zoomTo(10), s.views[0].zoomTo(10), s.views[1].centerAt(g, d), s.views[0].centerAt(p, n);
}
const J = F(function({ session: t, handleClose: l, feature: e, assemblyName: i, stableViewId: a, view: o }) {
const [c, r] = h(!0), [n, p] = h(!0);
return u(S.Dialog, { open: !0, onClose: l, title: "Multi-level breakpoint split view options", children: [u(L, { children: [m("div", { children: "Launch multi-level breakpoint split view" }), o ? u(M, { children: [m(b, { checked: c, label: "Copy tracks into the new view", onChange: (d) => {
r(d.target.checked);
} }), c ? m(b, { checked: n, disabled: !c, label: "Mirror the copied tracks (only available if copying tracks and using two level)", onChange: (d) => {
p(d.target.checked);
} }) : null] }) : null] }), u(T, { children: [m(y, { onClick: () => {
(async () => {
try {
await G({
stableViewId: a,
session: t,
tracks: c && o ? x(o.tracks) : [],
mirror: n,
feature: e,
assemblyName: i
});
} catch (d) {
console.error(d), t.notifyError(`${d}`, d);
}
})(), l();
}, variant: "contained", color: "primary", autoFocus: !0, children: "OK" }), m(y, { color: "secondary", variant: "contained", onClick: () => {
l();
}, children: "Cancel" })] })] });
});
function H({ feature: t, session: l, assemblyName: e, windowSize: i = 0 }) {
const { assemblyManager: a } = l, o = a.get(e);
if (!o)
throw new Error(`assembly ${e} not found`);
if (!o.regions)
throw new Error(`assembly ${e} regions not loaded`);
const c = P({
feature: t,
assembly: o
}), { refName: r, mateRefName: n } = c, p = o.regions.find((g) => g.refName === r), d = o.regions.find((g) => g.refName === n);
return {
coverage: c,
snap: {
type: "BreakpointSplitView",
views: [
{
type: "LinearGenomeView",
displayedRegions: k.gatherOverlaps([
{
...p,
end: c.pos + i,
assemblyName: e
},
{
...d,
start: c.matePos - i,
assemblyName: e
}
])
}
],
displayName: N(t)
}
};
}
function W({ feature: t, session: l, assemblyName: e }) {
const { assemblyManager: i } = l, a = i.get(e);
if (!a)
throw new Error(`assembly ${e} not found`);
if (!a.regions)
throw new Error(`assembly ${e} regions not loaded`);
const o = P({
feature: t,
assembly: a
}), { refName: c, mateRefName: r } = o, n = a.regions.find((d) => d.refName === c), p = a.regions.find((d) => d.refName === r);
return {
coverage: o,
snap: {
type: "BreakpointSplitView",
views: [
{
type: "LinearGenomeView",
displayedRegions: k.gatherOverlaps([
{ ...n, assemblyName: e },
{ ...p, assemblyName: e }
])
}
],
displayName: N(t)
}
};
}
async function j({ stableViewId: t, feature: l, assemblyName: e, session: i, tracks: a, windowSize: o = 0, focusOnBreakends: c }) {
var r;
const { snap: n, coverage: p } = c ? H({
feature: l,
assemblyName: e,
session: i,
windowSize: o
}) : W({
feature: l,
assemblyName: e,
session: i
}), { refName: d, pos: g, mateRefName: s, matePos: w } = p;
let v = i.views.find((E) => E.id === t);
v ? ((r = v.views[0]) === null || r === void 0 || r.setDisplayedRegions(n.views[0].displayedRegions), v.setDisplayName(n.displayName)) : v = i.addView("BreakpointSplitView", {
...n,
views: [
{
...n.views[0],
tracks: a ? B(x(a)) : []
}
]
});
const f = v.views[0];
await k.when(() => f.initialized);
const C = f.bpToPx({
coord: Math.max(0, g - o),
refName: d
}), R = f.bpToPx({
coord: w + o,
refName: s
});
C && R ? f.moveTo({
...C,
offset: C.offsetPx
}, {
...R,
offset: R.offsetPx
}) : k.getSession(f).notify("Unable to navigate to breakpoint");
}
const Q = F(function({ session: t, handleClose: l, feature: e, stableViewId: i, assemblyName: a, view: o }) {
const [c, r] = h(!0), [n, p] = h(!0), [d, g] = k.useLocalStorage("breakpointWindowSize", "5000");
return u(S.Dialog, { open: !0, onClose: l, title: "Single-level breakpoint split view options", children: [u(L, { children: [o ? m(b, { checked: c, label: "Copy tracks into the new view", onChange: (s) => {
r(s.target.checked);
} }) : null, m(b, { checked: c, label: "Focus on breakends", onChange: (s) => {
p(s.target.checked);
} }), m(V, { label: "Window size (bp)", value: d, onChange: (s) => {
g(s.target.value);
} })] }), u(T, { children: [m(y, { onClick: () => {
(async () => {
try {
const { assemblyManager: s } = t;
if (!await s.waitForAssembly(a))
throw new Error(`assembly ${a} not found`);
await j({
feature: e,
assemblyName: a,
focusOnBreakends: n,
session: t,
stableViewId: i,
tracks: o == null ? void 0 : o.tracks,
windowSize: +d || 0
});
} catch (s) {
console.error(s), t.notifyError(`${s}`, s);
}
})(), l();
}, variant: "contained", color: "primary", autoFocus: !0, children: "OK" }), m(y, { color: "secondary", variant: "contained", onClick: () => {
l();
}, children: "Cancel" })] })] });
});
export {
J as B,
Q as a
};
//# sourceMappingURL=BreakendSingleLevelOptionDialog-h4qtZ5vr.js.map