UNPKG

taxonium-component

Version:

React component for exploring large phylogenetic trees in the browser

281 lines (280 loc) 8.75 kB
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