@jbrowse/plugin-circular-view 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.
- package/dist/BaseChordDisplay/components/BaseChordDisplay.d.ts +1 -2
- package/dist/BaseChordDisplay/components/BaseChordDisplay.js +3 -3
- package/dist/BaseChordDisplay/components/DisplayError.d.ts +1 -2
- package/dist/BaseChordDisplay/components/DisplayError.js +2 -11
- package/dist/BaseChordDisplay/components/Loading.d.ts +1 -2
- package/dist/BaseChordDisplay/components/Loading.js +3 -32
- package/dist/BaseChordDisplay/model.d.ts +1 -2
- package/dist/BaseChordDisplay/model.js +2 -5
- package/dist/CircularView/components/CircularView.d.ts +1 -2
- package/dist/CircularView/components/CircularView.js +20 -28
- package/dist/CircularView/components/Controls.d.ts +1 -2
- package/dist/CircularView/components/Controls.js +22 -58
- package/dist/CircularView/components/ExportSvgDialog.d.ts +1 -2
- package/dist/CircularView/components/ExportSvgDialog.js +31 -64
- package/dist/CircularView/components/ImportForm.d.ts +1 -2
- package/dist/CircularView/components/ImportForm.js +9 -39
- package/dist/CircularView/components/Ruler.d.ts +1 -2
- package/dist/CircularView/components/Ruler.js +17 -30
- package/dist/CircularView/index.js +17 -7
- package/dist/CircularView/model.js +17 -7
- package/dist/CircularView/svgcomponents/SVGBackground.d.ts +1 -2
- package/dist/CircularView/svgcomponents/SVGBackground.js +2 -5
- package/dist/CircularView/svgcomponents/SVGCircularView.js +3 -10
- package/esm/BaseChordDisplay/components/BaseChordDisplay.d.ts +1 -2
- package/esm/BaseChordDisplay/components/BaseChordDisplay.js +3 -3
- package/esm/BaseChordDisplay/components/DisplayError.d.ts +1 -2
- package/esm/BaseChordDisplay/components/DisplayError.js +2 -8
- package/esm/BaseChordDisplay/components/Loading.d.ts +1 -2
- package/esm/BaseChordDisplay/components/Loading.js +3 -9
- package/esm/BaseChordDisplay/model.d.ts +1 -2
- package/esm/BaseChordDisplay/model.js +2 -2
- package/esm/CircularView/components/CircularView.d.ts +1 -2
- package/esm/CircularView/components/CircularView.js +20 -28
- package/esm/CircularView/components/Controls.d.ts +1 -2
- package/esm/CircularView/components/Controls.js +22 -35
- package/esm/CircularView/components/ExportSvgDialog.d.ts +1 -2
- package/esm/CircularView/components/ExportSvgDialog.js +31 -41
- package/esm/CircularView/components/ImportForm.d.ts +1 -2
- package/esm/CircularView/components/ImportForm.js +9 -16
- package/esm/CircularView/components/Ruler.d.ts +1 -2
- package/esm/CircularView/components/Ruler.js +17 -27
- package/esm/CircularView/svgcomponents/SVGBackground.d.ts +1 -2
- package/esm/CircularView/svgcomponents/SVGBackground.js +2 -2
- package/esm/CircularView/svgcomponents/SVGCircularView.js +3 -10
- package/package.json +9 -9
|
@@ -1,9 +1,6 @@
|
|
|
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
|
-
const
|
|
3
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
4
|
const util_1 = require("@jbrowse/core/util");
|
|
8
5
|
const color_1 = require("@jbrowse/core/util/color");
|
|
9
6
|
const styles_1 = require("@mui/material/styles");
|
|
@@ -49,19 +46,17 @@ const ElisionRulerArc = (0, mobx_react_1.observer)(function ({ model, slice, reg
|
|
|
49
46
|
const largeArc = endRadians - startRadians > Math.PI ? '1' : '0';
|
|
50
47
|
const centerRadians = (endRadians + startRadians) / 2;
|
|
51
48
|
const regionCount = `[${Number(region.regions.length).toLocaleString()}]`;
|
|
52
|
-
return (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
'
|
|
63
|
-
...endXY,
|
|
64
|
-
].join(' '), ...(0, util_1.getStrokeProps)(theme.palette.text.secondary), strokeWidth: 2, strokeDasharray: "2,2", fill: "none" })));
|
|
49
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(RulerLabel, { text: regionCount, view: model, maxWidthPx: widthPx, radians: centerRadians, radiusPx: radiusPx, title: `${regionCount} more regions`, color: theme.palette.text.primary }), (0, jsx_runtime_1.jsx)("path", { d: [
|
|
50
|
+
'M',
|
|
51
|
+
...startXY,
|
|
52
|
+
'A',
|
|
53
|
+
radiusPx,
|
|
54
|
+
radiusPx,
|
|
55
|
+
'0',
|
|
56
|
+
largeArc,
|
|
57
|
+
'1',
|
|
58
|
+
...endXY,
|
|
59
|
+
].join(' '), ...(0, util_1.getStrokeProps)(theme.palette.text.secondary), strokeWidth: 2, strokeDasharray: "2,2", fill: "none" })] }));
|
|
65
60
|
});
|
|
66
61
|
const RulerLabel = (0, mobx_react_1.observer)(function ({ view, text, maxWidthPx, radians, radiusPx, title, color, }) {
|
|
67
62
|
const { classes } = useStyles();
|
|
@@ -70,20 +65,14 @@ const RulerLabel = (0, mobx_react_1.observer)(function ({ view, text, maxWidthPx
|
|
|
70
65
|
return null;
|
|
71
66
|
}
|
|
72
67
|
if (text.length * 6.5 < maxWidthPx) {
|
|
73
|
-
return (
|
|
74
|
-
text,
|
|
75
|
-
react_1.default.createElement("title", null, title || text)));
|
|
68
|
+
return ((0, jsx_runtime_1.jsxs)("text", { x: 0, y: 0, className: classes.rulerLabel, textAnchor: "middle", dominantBaseline: "baseline", transform: `translate(${textXY}) rotate(${(0, util_1.radToDeg)(radians) + 90})`, ...(0, util_1.getFillProps)(color), children: [text, (0, jsx_runtime_1.jsx)("title", { children: title || text })] }));
|
|
76
69
|
}
|
|
77
70
|
if (maxWidthPx > 4) {
|
|
78
71
|
const overallRotation = (0, util_1.radToDeg)(radians + view.offsetRadians - Math.PI / 2);
|
|
79
72
|
if (overallRotation >= 180) {
|
|
80
|
-
return (
|
|
81
|
-
text,
|
|
82
|
-
react_1.default.createElement("title", null, title || text)));
|
|
73
|
+
return ((0, jsx_runtime_1.jsxs)("text", { x: 0, y: 0, className: classes.rulerLabel, textAnchor: "start", dominantBaseline: "middle", transform: `translate(${textXY}) rotate(${(0, util_1.radToDeg)(radians)})`, fill: color, children: [text, (0, jsx_runtime_1.jsx)("title", { children: title || text })] }));
|
|
83
74
|
}
|
|
84
|
-
return (
|
|
85
|
-
text,
|
|
86
|
-
react_1.default.createElement("title", null, title || text)));
|
|
75
|
+
return ((0, jsx_runtime_1.jsxs)("text", { x: 0, y: 0, className: classes.rulerLabel, textAnchor: "end", dominantBaseline: "middle", transform: `translate(${textXY}) rotate(${(0, util_1.radToDeg)(radians) + 180})`, fill: color, children: [text, (0, jsx_runtime_1.jsx)("title", { children: title || text })] }));
|
|
87
76
|
}
|
|
88
77
|
return null;
|
|
89
78
|
});
|
|
@@ -107,11 +96,9 @@ const RegionRulerArc = (0, mobx_react_1.observer)(function ({ model, slice, regi
|
|
|
107
96
|
else {
|
|
108
97
|
color = theme.palette.text.primary;
|
|
109
98
|
}
|
|
110
|
-
return (
|
|
111
|
-
react_1.default.createElement(RulerLabel, { text: region.refName, view: model, maxWidthPx: widthPx, radians: centerRadians, radiusPx: radiusPx, color: color }),
|
|
112
|
-
react_1.default.createElement("path", { d: sliceArcPath(slice, radiusPx + 1, region.start, region.end), stroke: color, strokeWidth: 2, fill: "none" })));
|
|
99
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(RulerLabel, { text: region.refName, view: model, maxWidthPx: widthPx, radians: centerRadians, radiusPx: radiusPx, color: color }), (0, jsx_runtime_1.jsx)("path", { d: sliceArcPath(slice, radiusPx + 1, region.start, region.end), stroke: color, strokeWidth: 2, fill: "none" })] }));
|
|
113
100
|
});
|
|
114
101
|
const Ruler = (0, mobx_react_1.observer)(function ({ model, slice, }) {
|
|
115
|
-
return slice.region.elided ? (
|
|
102
|
+
return slice.region.elided ? ((0, jsx_runtime_1.jsx)(ElisionRulerArc, { model: model, region: slice.region, slice: slice }, (0, util_1.assembleLocString)(slice.region.regions[0]))) : ((0, jsx_runtime_1.jsx)(RegionRulerArc, { region: slice.region, model: model, slice: slice }, (0, util_1.assembleLocString)(slice.region)));
|
|
116
103
|
});
|
|
117
104
|
exports.default = Ruler;
|
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
37
|
};
|
|
@@ -1,13 +1,10 @@
|
|
|
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 = SVGBackground;
|
|
7
|
-
const
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
5
|
const util_1 = require("@jbrowse/core/util");
|
|
9
6
|
const material_1 = require("@mui/material");
|
|
10
7
|
function SVGBackground({ width, height, shift, }) {
|
|
11
8
|
const theme = (0, material_1.useTheme)();
|
|
12
|
-
return (
|
|
9
|
+
return ((0, jsx_runtime_1.jsx)("rect", { width: width + shift * 2, height: height, fill: (0, util_1.stripAlpha)(theme.palette.background.default) }));
|
|
13
10
|
}
|
|
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.renderToSvg = renderToSvg;
|
|
7
|
-
const
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
8
9
|
const ui_1 = require("@jbrowse/core/ui");
|
|
9
10
|
const util_1 = require("@jbrowse/core/util");
|
|
10
11
|
const material_1 = require("@mui/material");
|
|
11
12
|
const mobx_1 = require("mobx");
|
|
12
|
-
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
13
13
|
const SVGBackground_1 = __importDefault(require("./SVGBackground"));
|
|
14
14
|
const Ruler_1 = __importDefault(require("../components/Ruler"));
|
|
15
15
|
async function renderToSvg(model, opts) {
|
|
@@ -18,7 +18,6 @@ async function renderToSvg(model, opts) {
|
|
|
18
18
|
const { themeName = 'default', Wrapper = ({ children }) => children } = opts;
|
|
19
19
|
const session = (0, util_1.getSession)(model);
|
|
20
20
|
const theme = (_a = session.allThemes) === null || _a === void 0 ? void 0 : _a.call(session)[themeName];
|
|
21
|
-
const { createRootFn } = (0, mobx_state_tree_1.getRoot)(model);
|
|
22
21
|
const { width, tracks, height } = model;
|
|
23
22
|
const shift = 50;
|
|
24
23
|
const displayResults = await Promise.all(tracks.map(async (track) => {
|
|
@@ -28,11 +27,5 @@ async function renderToSvg(model, opts) {
|
|
|
28
27
|
}));
|
|
29
28
|
const { staticSlices, offsetRadians, centerXY } = model;
|
|
30
29
|
const deg = (0, util_1.radToDeg)(offsetRadians);
|
|
31
|
-
return (0, util_1.renderToStaticMarkup)(
|
|
32
|
-
react_1.default.createElement(Wrapper, null,
|
|
33
|
-
react_1.default.createElement("svg", { width: width, height: height, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, width + shift * 2, height].toString() },
|
|
34
|
-
react_1.default.createElement(SVGBackground_1.default, { width: width, height: height, shift: shift }),
|
|
35
|
-
react_1.default.createElement("g", { transform: `translate(${centerXY}) rotate(${deg})` },
|
|
36
|
-
staticSlices.map((slice, i) => (react_1.default.createElement(Ruler_1.default, { key: i, model: model, slice: slice }))),
|
|
37
|
-
displayResults.map(({ result }, i) => (react_1.default.createElement(react_1.default.Fragment, { key: i }, result))))))), createRootFn);
|
|
30
|
+
return (0, util_1.renderToStaticMarkup)((0, jsx_runtime_1.jsx)(material_1.ThemeProvider, { theme: (0, ui_1.createJBrowseTheme)(theme), children: (0, jsx_runtime_1.jsx)(Wrapper, { children: (0, jsx_runtime_1.jsxs)("svg", { width: width, height: height, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, width + shift * 2, height].toString(), children: [(0, jsx_runtime_1.jsx)(SVGBackground_1.default, { width: width, height: height, shift: shift }), (0, jsx_runtime_1.jsxs)("g", { transform: `translate(${centerXY}) rotate(${deg})`, children: [staticSlices.map((slice, i) => ((0, jsx_runtime_1.jsx)(Ruler_1.default, { model: model, slice: slice }, i))), displayResults.map(({ result }, i) => ((0, jsx_runtime_1.jsx)(react_1.Fragment, { children: result }, i)))] })] }) }) }));
|
|
38
31
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
declare const BaseChordDisplay: ({ display, }: {
|
|
3
2
|
display: {
|
|
4
3
|
filled: boolean;
|
|
@@ -8,5 +7,5 @@ declare const BaseChordDisplay: ({ display, }: {
|
|
|
8
7
|
radius: number;
|
|
9
8
|
};
|
|
10
9
|
};
|
|
11
|
-
}) =>
|
|
10
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
12
11
|
export default BaseChordDisplay;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
3
|
import DisplayError from './DisplayError';
|
|
4
4
|
import Loading from './Loading';
|
|
5
5
|
const BaseChordDisplay = observer(function ({ display, }) {
|
|
6
6
|
if (display.error) {
|
|
7
|
-
return
|
|
7
|
+
return _jsx(DisplayError, { model: display });
|
|
8
8
|
}
|
|
9
9
|
else if (!display.filled) {
|
|
10
|
-
return
|
|
10
|
+
return _jsx(Loading, { model: display });
|
|
11
11
|
}
|
|
12
12
|
else {
|
|
13
13
|
return display.reactElement;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
declare const DisplayError: ({ model, }: {
|
|
3
2
|
model: {
|
|
4
3
|
renderProps: {
|
|
@@ -6,5 +5,5 @@ declare const DisplayError: ({ model, }: {
|
|
|
6
5
|
};
|
|
7
6
|
error: unknown;
|
|
8
7
|
};
|
|
9
|
-
}) =>
|
|
8
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
10
9
|
export default DisplayError;
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
3
|
const DisplayError = observer(function ({ model, }) {
|
|
4
4
|
const { renderProps: { radius }, error, } = model;
|
|
5
|
-
return (
|
|
6
|
-
React.createElement("defs", null,
|
|
7
|
-
React.createElement("pattern", { id: "diagonalHatch", width: "10", height: "10", patternTransform: "rotate(45 0 0)", patternUnits: "userSpaceOnUse" },
|
|
8
|
-
React.createElement("line", { x1: "0", y1: "0", x2: "0", y2: "10", style: { stroke: 'rgba(255,0,0,0.5)', strokeWidth: 10 } }))),
|
|
9
|
-
React.createElement("circle", { cx: "0", cy: "0", r: radius, fill: "#ffb4b4" }),
|
|
10
|
-
React.createElement("circle", { cx: "0", cy: "0", r: radius, fill: "url(#diagonalHatch)" }),
|
|
11
|
-
React.createElement("text", { x: "0", y: "0", transform: "rotate(90 0 0)", dominantBaseline: "middle", textAnchor: "middle" }, String(error))));
|
|
5
|
+
return (_jsxs("g", { children: [_jsx("defs", { children: _jsx("pattern", { id: "diagonalHatch", width: "10", height: "10", patternTransform: "rotate(45 0 0)", patternUnits: "userSpaceOnUse", children: _jsx("line", { x1: "0", y1: "0", x2: "0", y2: "10", style: { stroke: 'rgba(255,0,0,0.5)', strokeWidth: 10 } }) }) }), _jsx("circle", { cx: "0", cy: "0", r: radius, fill: "#ffb4b4" }), _jsx("circle", { cx: "0", cy: "0", r: radius, fill: "url(#diagonalHatch)" }), _jsx("text", { x: "0", y: "0", transform: "rotate(90 0 0)", dominantBaseline: "middle", textAnchor: "middle", children: String(error) })] }));
|
|
12
6
|
});
|
|
13
7
|
export default DisplayError;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
declare const Loading: ({ model: { renderProps: { radius }, }, }: {
|
|
3
2
|
model: {
|
|
4
3
|
renderProps: {
|
|
5
4
|
radius: number;
|
|
6
5
|
};
|
|
7
6
|
};
|
|
8
|
-
}) =>
|
|
7
|
+
}) => import("react/jsx-runtime").JSX.Element | null;
|
|
9
8
|
export default Loading;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
2
3
|
import { observer } from 'mobx-react';
|
|
3
4
|
import { makeStyles } from 'tss-react/mui';
|
|
4
5
|
const useStyles = makeStyles()(theme => {
|
|
@@ -54,13 +55,6 @@ const Loading = observer(function ({ model: { renderProps: { radius }, }, }) {
|
|
|
54
55
|
clearTimeout(timeout);
|
|
55
56
|
};
|
|
56
57
|
});
|
|
57
|
-
return !shown ? null : (
|
|
58
|
-
React.createElement("defs", null,
|
|
59
|
-
React.createElement("pattern", { id: "diagonalHatch", width: "10", height: "10", patternTransform: "rotate(45 0 0)", patternUnits: "userSpaceOnUse" },
|
|
60
|
-
React.createElement("line", { x1: "0", y1: "0", x2: "0", y2: "10", style: { stroke: 'rgba(255,255,255,0.5)', strokeWidth: 10 } }))),
|
|
61
|
-
React.createElement("circle", { cx: "0", cy: "0", r: radius, fill: "#f1f1f1" }),
|
|
62
|
-
React.createElement("circle", { cx: "0", cy: "0", r: radius, fill: "url(#diagonalHatch)" }),
|
|
63
|
-
React.createElement("text", { x: "0", y: "0", transform: "rotate(90 0 0)", dominantBaseline: "middle", textAnchor: "middle" }, "Loading\u2026"),
|
|
64
|
-
React.createElement("circle", { className: classes.path, fill: "none", strokeWidth: "4", strokeLinecap: "round", cx: "0", cy: "0", r: "60" })));
|
|
58
|
+
return !shown ? null : (_jsxs("g", { children: [_jsx("defs", { children: _jsx("pattern", { id: "diagonalHatch", width: "10", height: "10", patternTransform: "rotate(45 0 0)", patternUnits: "userSpaceOnUse", children: _jsx("line", { x1: "0", y1: "0", x2: "0", y2: "10", style: { stroke: 'rgba(255,255,255,0.5)', strokeWidth: 10 } }) }) }), _jsx("circle", { cx: "0", cy: "0", r: radius, fill: "#f1f1f1" }), _jsx("circle", { cx: "0", cy: "0", r: radius, fill: "url(#diagonalHatch)" }), _jsx("text", { x: "0", y: "0", transform: "rotate(90 0 0)", dominantBaseline: "middle", textAnchor: "middle", children: "Loading\u2026" }), _jsx("circle", { className: classes.path, fill: "none", strokeWidth: "4", strokeLinecap: "round", cx: "0", cy: "0", r: "60" })] }));
|
|
65
59
|
});
|
|
66
60
|
export default Loading;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
import type { ExportSvgOptions } from '../CircularView/model';
|
|
3
2
|
import type { AnyReactComponentType, Feature } from '@jbrowse/core/util';
|
|
4
3
|
import type { ThemeOptions } from '@mui/material';
|
|
@@ -106,5 +105,5 @@ export declare const BaseChordDisplayModel: import("mobx-state-tree").IModelType
|
|
|
106
105
|
} & {
|
|
107
106
|
renderSvg(opts: ExportSvgOptions & {
|
|
108
107
|
theme?: ThemeOptions;
|
|
109
|
-
}): Promise<
|
|
108
|
+
}): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
110
109
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { ConfigurationReference, getConf } from '@jbrowse/core/configuration';
|
|
3
3
|
import { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models';
|
|
4
4
|
import { ReactRendering, getContainingView, getEnv, getSession, isFeature, makeAbortableReaction, } from '@jbrowse/core/util';
|
|
@@ -158,6 +158,6 @@ export const BaseChordDisplayModel = types
|
|
|
158
158
|
exportSVG: opts,
|
|
159
159
|
theme: opts.theme || data.renderProps.theme,
|
|
160
160
|
});
|
|
161
|
-
return
|
|
161
|
+
return _jsx(ReactRendering, { rendering: rendering });
|
|
162
162
|
},
|
|
163
163
|
}));
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
import type { CircularViewModel } from '../model';
|
|
3
2
|
declare const CircularView: ({ model }: {
|
|
4
3
|
model: CircularViewModel;
|
|
5
|
-
}) =>
|
|
4
|
+
}) => import("react/jsx-runtime").JSX.Element | null;
|
|
6
5
|
export default CircularView;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { ResizeHandle } from '@jbrowse/core/ui';
|
|
3
3
|
import { assembleLocString } from '@jbrowse/core/util';
|
|
4
4
|
import { observer } from 'mobx-react';
|
|
@@ -18,12 +18,10 @@ const useStyles = makeStyles()(theme => ({
|
|
|
18
18
|
},
|
|
19
19
|
}));
|
|
20
20
|
const Slices = observer(({ model }) => {
|
|
21
|
-
return (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return (React.createElement(display.RenderingComponent, { key: display.id, display: display, view: model }));
|
|
26
|
-
})));
|
|
21
|
+
return (_jsxs(_Fragment, { children: [model.staticSlices.map(slice => (_jsx(Ruler, { model: model, slice: slice }, assembleLocString(slice.region.elided ? slice.region.regions[0] : slice.region)))), model.tracks.map(track => {
|
|
22
|
+
const display = track.displays[0];
|
|
23
|
+
return (_jsx(display.RenderingComponent, { display: display, view: model }, display.id));
|
|
24
|
+
})] }));
|
|
27
25
|
});
|
|
28
26
|
const CircularView = observer(({ model }) => {
|
|
29
27
|
const initialized = !!model.displayedRegions.length &&
|
|
@@ -32,32 +30,26 @@ const CircularView = observer(({ model }) => {
|
|
|
32
30
|
model.initialized;
|
|
33
31
|
const showImportForm = !initialized && !model.disableImportForm;
|
|
34
32
|
const showFigure = initialized && !showImportForm;
|
|
35
|
-
return showImportForm || model.error ? (
|
|
33
|
+
return showImportForm || model.error ? (_jsx(ImportForm, { model: model })) : showFigure ? (_jsx(CircularViewLoaded, { model: model })) : null;
|
|
36
34
|
});
|
|
37
35
|
const CircularViewLoaded = observer(function ({ model, }) {
|
|
38
36
|
const { width, height, id, offsetRadians, centerXY, figureWidth, figureHeight, hideVerticalResizeHandle, } = model;
|
|
39
37
|
const { classes } = useStyles();
|
|
40
|
-
return (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
return (_jsxs("div", { className: classes.root, style: { width, height }, "data-testid": id, children: [_jsx("div", { className: classes.scroller, style: { width, height }, children: _jsx("svg", { style: {
|
|
39
|
+
transform: `rotate(${offsetRadians}rad)`,
|
|
40
|
+
transition: 'transform 0.5s',
|
|
41
|
+
transformOrigin: centerXY.map(x => `${x}px`).join(' '),
|
|
42
|
+
position: 'absolute',
|
|
43
|
+
left: 0,
|
|
44
|
+
top: 0,
|
|
45
|
+
}, width: figureWidth, height: figureHeight, children: _jsx("g", { transform: `translate(${centerXY})`, children: _jsx(Slices, { model: model }) }) }) }), _jsx(Controls, { model: model }), hideVerticalResizeHandle ? null : (_jsx(ResizeHandle, { onDrag: model.resizeHeight, style: {
|
|
46
|
+
height: dragHandleHeight,
|
|
46
47
|
position: 'absolute',
|
|
48
|
+
bottom: 0,
|
|
47
49
|
left: 0,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
React.createElement(Controls, { model: model }),
|
|
53
|
-
hideVerticalResizeHandle ? null : (React.createElement(ResizeHandle, { onDrag: model.resizeHeight, style: {
|
|
54
|
-
height: dragHandleHeight,
|
|
55
|
-
position: 'absolute',
|
|
56
|
-
bottom: 0,
|
|
57
|
-
left: 0,
|
|
58
|
-
background: '#ccc',
|
|
59
|
-
boxSizing: 'border-box',
|
|
60
|
-
borderTop: '1px solid #fafafa',
|
|
61
|
-
} }))));
|
|
50
|
+
background: '#ccc',
|
|
51
|
+
boxSizing: 'border-box',
|
|
52
|
+
borderTop: '1px solid #fafafa',
|
|
53
|
+
} }))] }));
|
|
62
54
|
});
|
|
63
55
|
export default CircularView;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
2
3
|
import { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons';
|
|
3
4
|
import JBrowseMenu from '@jbrowse/core/ui/Menu';
|
|
4
5
|
import { getSession } from '@jbrowse/core/util';
|
|
@@ -26,40 +27,26 @@ const useStyles = makeStyles()(theme => ({
|
|
|
26
27
|
const Controls = observer(function ({ model }) {
|
|
27
28
|
const { classes } = useStyles();
|
|
28
29
|
const [anchorEl, setAnchorEl] = useState(null);
|
|
29
|
-
return (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} },
|
|
44
|
-
React.createElement(MoreVert, null)),
|
|
45
|
-
model.hideTrackSelectorButton ? null : (React.createElement(IconButton, { onClick: model.activateTrackSelector, title: "Open track selector", "data-testid": "circular_track_select" },
|
|
46
|
-
React.createElement(TrackSelectorIcon, null))),
|
|
47
|
-
anchorEl ? (React.createElement(JBrowseMenu, { anchorEl: anchorEl, menuItems: [
|
|
48
|
-
{
|
|
49
|
-
label: 'Export SVG',
|
|
50
|
-
icon: PhotoCamera,
|
|
51
|
-
onClick: () => {
|
|
52
|
-
getSession(model).queueDialog(handleClose => [
|
|
53
|
-
ExportSvgDialog,
|
|
54
|
-
{ model, handleClose },
|
|
55
|
-
]);
|
|
30
|
+
return (_jsxs("div", { className: classes.controls, children: [_jsx(IconButton, { onClick: model.zoomOutButton, title: model.lockedFitToWindow ? 'unlock to zoom out' : 'zoom out', disabled: model.atMaxBpPerPx || model.lockedFitToWindow, children: _jsx(ZoomOutIcon, {}) }), _jsx(IconButton, { onClick: model.zoomInButton, disabled: model.atMinBpPerPx, title: "zoom in", children: _jsx(ZoomInIcon, {}) }), _jsx(IconButton, { onClick: model.rotateCounterClockwiseButton, title: "rotate counter-clockwise", children: _jsx(RotateLeftIcon, {}) }), _jsx(IconButton, { onClick: model.rotateClockwiseButton, title: "rotate clockwise", children: _jsx(RotateRightIcon, {}) }), _jsx(IconButton, { onClick: model.toggleFitToWindowLock, title: model.lockedFitToWindow
|
|
31
|
+
? 'locked model to window size'
|
|
32
|
+
: 'unlocked model to zoom further', disabled: model.tooSmallToLock, children: model.lockedFitToWindow ? _jsx(LockIcon, {}) : _jsx(LockOpenIcon, {}) }), _jsx(IconButton, { onClick: event => {
|
|
33
|
+
setAnchorEl(event.currentTarget);
|
|
34
|
+
}, children: _jsx(MoreVert, {}) }), model.hideTrackSelectorButton ? null : (_jsx(IconButton, { onClick: model.activateTrackSelector, title: "Open track selector", "data-testid": "circular_track_select", children: _jsx(TrackSelectorIcon, {}) })), anchorEl ? (_jsx(JBrowseMenu, { anchorEl: anchorEl, menuItems: [
|
|
35
|
+
{
|
|
36
|
+
label: 'Export SVG',
|
|
37
|
+
icon: PhotoCamera,
|
|
38
|
+
onClick: () => {
|
|
39
|
+
getSession(model).queueDialog(handleClose => [
|
|
40
|
+
ExportSvgDialog,
|
|
41
|
+
{ model, handleClose },
|
|
42
|
+
]);
|
|
43
|
+
},
|
|
56
44
|
},
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
} })) : null));
|
|
45
|
+
], onMenuItemClick: (_event, callback) => {
|
|
46
|
+
callback();
|
|
47
|
+
setAnchorEl(null);
|
|
48
|
+
}, open: Boolean(anchorEl), onClose: () => {
|
|
49
|
+
setAnchorEl(null);
|
|
50
|
+
} })) : null] }));
|
|
64
51
|
});
|
|
65
52
|
export default Controls;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
import type { ExportSvgOptions } from '../model';
|
|
3
2
|
export default function ExportSvgDialog({ model, handleClose, }: {
|
|
4
3
|
model: {
|
|
5
4
|
exportSvg(opts: ExportSvgOptions): Promise<void>;
|
|
6
5
|
};
|
|
7
6
|
handleClose: () => void;
|
|
8
|
-
}):
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
2
3
|
import { Dialog, ErrorMessage } from '@jbrowse/core/ui';
|
|
3
4
|
import { getSession, useLocalStorage } from '@jbrowse/core/util';
|
|
4
5
|
import { Button, Checkbox, CircularProgress, DialogActions, DialogContent, FormControlLabel, MenuItem, TextField, Typography, } from '@mui/material';
|
|
5
6
|
function LoadingMessage() {
|
|
6
|
-
return (
|
|
7
|
-
React.createElement(CircularProgress, { size: 20, style: { marginRight: 20 } }),
|
|
8
|
-
React.createElement(Typography, { display: "inline" }, "Creating SVG")));
|
|
7
|
+
return (_jsxs("div", { children: [_jsx(CircularProgress, { size: 20, style: { marginRight: 20 } }), _jsx(Typography, { display: "inline", children: "Creating SVG" })] }));
|
|
9
8
|
}
|
|
10
9
|
function TextField2({ children, ...rest }) {
|
|
11
|
-
return (
|
|
12
|
-
React.createElement(TextField, { ...rest }, children)));
|
|
10
|
+
return (_jsx("div", { children: _jsx(TextField, { ...rest, children: children }) }));
|
|
13
11
|
}
|
|
14
12
|
function useSvgLocal(key, val) {
|
|
15
13
|
return useLocalStorage(`svg-${key}`, val);
|
|
@@ -22,39 +20,31 @@ export default function ExportSvgDialog({ model, handleClose, }) {
|
|
|
22
20
|
const [error, setError] = useState();
|
|
23
21
|
const [filename, setFilename] = useSvgLocal('file', 'jbrowse.svg');
|
|
24
22
|
const [themeName, setThemeName] = useSvgLocal('theme', session.themeName || 'default');
|
|
25
|
-
return (
|
|
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
|
-
catch (e) {
|
|
53
|
-
console.error(e);
|
|
54
|
-
setError(e);
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
setLoading(false);
|
|
58
|
-
}
|
|
59
|
-
} }, "Submit"))));
|
|
23
|
+
return (_jsxs(Dialog, { open: true, onClose: handleClose, title: "Export SVG", children: [_jsxs(DialogContent, { children: [error ? (_jsx(ErrorMessage, { error: error })) : loading ? (_jsx(LoadingMessage, {})) : null, _jsx(TextField2, { helperText: "filename", value: filename, onChange: event => {
|
|
24
|
+
setFilename(event.target.value);
|
|
25
|
+
} }), session.allThemes ? (_jsx(TextField2, { select: true, label: "Theme", value: themeName, onChange: event => {
|
|
26
|
+
setThemeName(event.target.value);
|
|
27
|
+
}, children: Object.entries(session.allThemes()).map(([key, val]) => (_jsx(MenuItem, { value: key, children: val.name || '(Unknown name)' }, key))) })) : null, offscreenCanvas ? (_jsx(FormControlLabel, { control: _jsx(Checkbox, { checked: rasterizeLayers, onChange: () => {
|
|
28
|
+
setRasterizeLayers(val => !val);
|
|
29
|
+
} }), label: "Rasterize canvas based tracks? File may be much larger if this is turned off" })) : (_jsx(Typography, { children: "Note: rasterizing layers not yet supported in this browser, so SVG size may be large" }))] }), _jsxs(DialogActions, { children: [_jsx(Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
30
|
+
handleClose();
|
|
31
|
+
}, children: "Cancel" }), _jsx(Button, { variant: "contained", color: "primary", type: "submit", onClick: async () => {
|
|
32
|
+
setLoading(true);
|
|
33
|
+
setError(undefined);
|
|
34
|
+
try {
|
|
35
|
+
await model.exportSvg({
|
|
36
|
+
rasterizeLayers,
|
|
37
|
+
filename,
|
|
38
|
+
themeName,
|
|
39
|
+
});
|
|
40
|
+
handleClose();
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
console.error(e);
|
|
44
|
+
setError(e);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
setLoading(false);
|
|
48
|
+
}
|
|
49
|
+
}, children: "Submit" })] })] }));
|
|
60
50
|
}
|