@jbrowse/plugin-wiggle 2.6.2 → 2.7.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/CreateMultiWiggleExtension/index.js +14 -11
- package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +6 -7
- package/dist/LinearWiggleDisplay/components/SetColorDialog.js +3 -3
- package/dist/LinearWiggleDisplay/components/Tooltip.js +1 -1
- package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
- package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.js +0 -3
- package/dist/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
- package/dist/MultiLinearWiggleDisplay/components/ColorLegend.d.ts +9 -0
- package/dist/MultiLinearWiggleDisplay/components/ColorLegend.js +28 -0
- package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +3 -4
- package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.js +3 -3
- package/dist/MultiLinearWiggleDisplay/components/RectBg.d.ts +9 -0
- package/dist/MultiLinearWiggleDisplay/components/RectBg.js +11 -0
- package/dist/MultiLinearWiggleDisplay/components/ScoreLegend.d.ts +6 -0
- package/dist/MultiLinearWiggleDisplay/components/ScoreLegend.js +22 -0
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +7 -1
- package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +3 -2
- package/dist/MultiLinearWiggleDisplay/components/Tooltip.js +1 -1
- package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -8
- package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.js +4 -92
- package/dist/MultiLinearWiggleDisplay/components/YScaleBars.d.ts +8 -0
- package/dist/MultiLinearWiggleDisplay/components/YScaleBars.js +53 -0
- package/dist/MultiLinearWiggleDisplay/components/util.d.ts +2 -0
- package/dist/MultiLinearWiggleDisplay/components/util.js +16 -5
- package/dist/MultiLinearWiggleDisplay/models/renderSvg.js +2 -2
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -26
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +16 -12
- package/dist/MultiWiggleRendering.d.ts +3 -4
- package/dist/MultiWiggleRendering.js +7 -5
- package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +0 -25
- package/dist/Tooltip.d.ts +5 -6
- package/dist/Tooltip.js +3 -3
- package/dist/WiggleRendering.d.ts +3 -4
- package/dist/WiggleRendering.js +3 -3
- package/dist/XYPlotRenderer/XYPlotRenderer.js +0 -25
- package/dist/drawxy.d.ts +0 -1
- package/dist/drawxy.js +17 -6
- package/dist/shared/YScaleBar.d.ts +2 -2
- package/dist/shared/YScaleBar.js +2 -1
- package/dist/shared/modelShared.d.ts +4 -1
- package/esm/CreateMultiWiggleExtension/index.js +14 -11
- package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +6 -7
- package/esm/LinearWiggleDisplay/components/SetColorDialog.js +3 -3
- package/esm/LinearWiggleDisplay/components/Tooltip.js +1 -1
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.js +0 -1
- package/esm/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
- package/esm/MultiLinearWiggleDisplay/components/ColorLegend.d.ts +9 -0
- package/esm/MultiLinearWiggleDisplay/components/ColorLegend.js +23 -0
- package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +3 -4
- package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.js +3 -3
- package/esm/MultiLinearWiggleDisplay/components/RectBg.d.ts +9 -0
- package/esm/MultiLinearWiggleDisplay/components/RectBg.js +6 -0
- package/esm/MultiLinearWiggleDisplay/components/ScoreLegend.d.ts +6 -0
- package/esm/MultiLinearWiggleDisplay/components/ScoreLegend.js +17 -0
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +7 -1
- package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +3 -2
- package/esm/MultiLinearWiggleDisplay/components/Tooltip.js +1 -1
- package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -8
- package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.js +5 -91
- package/esm/MultiLinearWiggleDisplay/components/YScaleBars.d.ts +8 -0
- package/esm/MultiLinearWiggleDisplay/components/YScaleBars.js +47 -0
- package/esm/MultiLinearWiggleDisplay/components/util.d.ts +2 -0
- package/esm/MultiLinearWiggleDisplay/components/util.js +14 -4
- package/esm/MultiLinearWiggleDisplay/models/renderSvg.js +2 -2
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -3
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +17 -13
- package/esm/MultiWiggleRendering.d.ts +3 -4
- package/esm/MultiWiggleRendering.js +7 -5
- package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +0 -2
- package/esm/Tooltip.d.ts +5 -6
- package/esm/Tooltip.js +3 -3
- package/esm/WiggleRendering.d.ts +3 -4
- package/esm/WiggleRendering.js +3 -3
- package/esm/XYPlotRenderer/XYPlotRenderer.js +0 -2
- package/esm/drawxy.d.ts +0 -1
- package/esm/drawxy.js +17 -6
- package/esm/shared/YScaleBar.d.ts +2 -2
- package/esm/shared/YScaleBar.js +2 -1
- package/esm/shared/modelShared.d.ts +4 -1
- package/package.json +3 -4
|
@@ -48,17 +48,20 @@ function default_1(pm) {
|
|
|
48
48
|
];
|
|
49
49
|
const now = +Date.now();
|
|
50
50
|
const trackId = `multitrack-${now}-sessionTrack`;
|
|
51
|
-
(0, util_1.getSession)(model)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
const session = (0, util_1.getSession)(model);
|
|
52
|
+
if ((0, util_1.isSessionWithAddTracks)(session)) {
|
|
53
|
+
session.addTrackConf({
|
|
54
|
+
type: 'MultiQuantitativeTrack',
|
|
55
|
+
trackId,
|
|
56
|
+
name: arg.name,
|
|
57
|
+
assemblyNames,
|
|
58
|
+
adapter: {
|
|
59
|
+
type: 'MultiWiggleAdapter',
|
|
60
|
+
subadapters,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
model.view.showTrack(trackId);
|
|
64
|
+
}
|
|
62
65
|
}
|
|
63
66
|
(0, util_1.getSession)(model).queueDialog(handleClose => [
|
|
64
67
|
ConfirmDialog,
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
declare
|
|
2
|
+
declare const SetColorDialog: ({ model, handleClose, }: {
|
|
3
3
|
model: {
|
|
4
|
-
color?: string;
|
|
5
|
-
posColor?: string;
|
|
6
|
-
negColor?: string;
|
|
4
|
+
color?: string | undefined;
|
|
5
|
+
posColor?: string | undefined;
|
|
6
|
+
negColor?: string | undefined;
|
|
7
7
|
setColor: (arg?: string) => void;
|
|
8
8
|
setPosColor: (arg?: string) => void;
|
|
9
9
|
setNegColor: (arg?: string) => void;
|
|
10
10
|
};
|
|
11
11
|
handleClose: () => void;
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
export default _default;
|
|
12
|
+
}) => React.JSX.Element;
|
|
13
|
+
export default SetColorDialog;
|
|
@@ -28,7 +28,7 @@ const mobx_react_1 = require("mobx-react");
|
|
|
28
28
|
const material_1 = require("@mui/material");
|
|
29
29
|
const ui_1 = require("@jbrowse/core/ui");
|
|
30
30
|
const ColorPicker_1 = require("@jbrowse/core/ui/ColorPicker");
|
|
31
|
-
function SetColorDialog({ model, handleClose, }) {
|
|
31
|
+
const SetColorDialog = (0, mobx_react_1.observer)(function SetColorDialog({ model, handleClose, }) {
|
|
32
32
|
const [posneg, setPosNeg] = (0, react_1.useState)(false);
|
|
33
33
|
return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: handleClose, title: "Set color" },
|
|
34
34
|
react_1.default.createElement(material_1.DialogContent, null,
|
|
@@ -55,5 +55,5 @@ function SetColorDialog({ model, handleClose, }) {
|
|
|
55
55
|
model.setColor(undefined);
|
|
56
56
|
}, color: "secondary", variant: "contained" }, "Restore default"),
|
|
57
57
|
react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", onClick: () => handleClose() }, "Submit"))));
|
|
58
|
-
}
|
|
59
|
-
exports.default =
|
|
58
|
+
});
|
|
59
|
+
exports.default = SetColorDialog;
|
|
@@ -10,7 +10,7 @@ const mobx_react_1 = require("mobx-react");
|
|
|
10
10
|
const Tooltip_1 = __importDefault(require("../../Tooltip"));
|
|
11
11
|
const util_1 = require("../../util");
|
|
12
12
|
const en = (n) => n.toLocaleString('en-US');
|
|
13
|
-
const TooltipContents = react_1.default.forwardRef(function ({ feature }, ref) {
|
|
13
|
+
const TooltipContents = react_1.default.forwardRef(function TooltipContents2({ feature }, ref) {
|
|
14
14
|
const start = feature.get('start');
|
|
15
15
|
const end = feature.get('end');
|
|
16
16
|
const name = feature.get('refName');
|
|
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.YScaleBar = void 0;
|
|
7
6
|
const react_1 = __importDefault(require("react"));
|
|
8
7
|
const mobx_react_1 = require("mobx-react");
|
|
9
8
|
const util_1 = require("@jbrowse/core/util");
|
|
@@ -31,5 +30,3 @@ const LinearWiggleDisplay = (0, mobx_react_1.observer)((props) => {
|
|
|
31
30
|
react_1.default.createElement(YScaleBar_1.default, { model: model }))) : null));
|
|
32
31
|
});
|
|
33
32
|
exports.default = LinearWiggleDisplay;
|
|
34
|
-
var YScaleBar_2 = require("../../shared/YScaleBar");
|
|
35
|
-
Object.defineProperty(exports, "YScaleBar", { enumerable: true, get: function () { return __importDefault(YScaleBar_2).default; } });
|
|
@@ -12,7 +12,7 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
|
|
|
12
12
|
const { bpPerPx, sources, regions, features } = props;
|
|
13
13
|
const [region] = regions;
|
|
14
14
|
const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
|
|
15
|
-
const height = props.height /
|
|
15
|
+
const height = props.height / sources.length;
|
|
16
16
|
const width = (region.end - region.start) / bpPerPx;
|
|
17
17
|
let feats = [];
|
|
18
18
|
ctx.save();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { WiggleDisplayModel } from '../models/model';
|
|
3
|
+
declare const ColorLegend: ({ model, rowHeight, labelWidth, exportSVG, }: {
|
|
4
|
+
model: WiggleDisplayModel;
|
|
5
|
+
rowHeight: number;
|
|
6
|
+
labelWidth: number;
|
|
7
|
+
exportSVG?: boolean | undefined;
|
|
8
|
+
}) => React.JSX.Element | null;
|
|
9
|
+
export default ColorLegend;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const mobx_react_1 = require("mobx-react");
|
|
8
|
+
const RectBg_1 = __importDefault(require("./RectBg"));
|
|
9
|
+
const ColorLegend = (0, mobx_react_1.observer)(function ({ model, rowHeight, labelWidth, exportSVG, }) {
|
|
10
|
+
const { needsCustomLegend, needsScalebar, needsFullHeightScalebar, rowHeightTooSmallForScalebar, renderColorBoxes, sources, } = model;
|
|
11
|
+
const svgFontSize = Math.min(rowHeight, 12);
|
|
12
|
+
const canDisplayLabel = rowHeight > 11;
|
|
13
|
+
const colorBoxWidth = renderColorBoxes ? 15 : 0;
|
|
14
|
+
const legendWidth = labelWidth + colorBoxWidth + 5;
|
|
15
|
+
const svgOffset = exportSVG ? 10 : 0;
|
|
16
|
+
const extraOffset = svgOffset || (needsScalebar && !rowHeightTooSmallForScalebar ? 50 : 0);
|
|
17
|
+
return sources ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
18
|
+
/* 0.25 for hanging letters like g */
|
|
19
|
+
needsFullHeightScalebar ? (react_1.default.createElement(RectBg_1.default, { y: 0, x: extraOffset, width: legendWidth, height: (sources.length + 0.25) * rowHeight })) : null,
|
|
20
|
+
sources.map((source, idx) => {
|
|
21
|
+
const boxHeight = Math.min(20, rowHeight);
|
|
22
|
+
return (react_1.default.createElement(react_1.default.Fragment, { key: `${source.name}-${idx}` },
|
|
23
|
+
needsFullHeightScalebar ? null : (react_1.default.createElement(RectBg_1.default, { y: idx * rowHeight + 1, x: extraOffset, width: legendWidth, height: boxHeight })),
|
|
24
|
+
source.color ? (react_1.default.createElement(RectBg_1.default, { y: idx * rowHeight + 1, x: extraOffset, width: colorBoxWidth, height: needsCustomLegend ? rowHeight : boxHeight, color: source.color })) : null,
|
|
25
|
+
canDisplayLabel ? (react_1.default.createElement("text", { y: idx * rowHeight + 13, x: extraOffset + colorBoxWidth + 2, fontSize: svgFontSize }, source.name)) : null));
|
|
26
|
+
}))) : null;
|
|
27
|
+
});
|
|
28
|
+
exports.default = ColorLegend;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { DialogProps } from '@mui/material';
|
|
3
|
-
declare
|
|
3
|
+
declare const DraggableDialog: (props: DialogProps & {
|
|
4
4
|
title: string;
|
|
5
|
-
})
|
|
6
|
-
|
|
7
|
-
export default _default;
|
|
5
|
+
}) => React.JSX.Element;
|
|
6
|
+
export default DraggableDialog;
|
|
@@ -23,7 +23,7 @@ function PaperComponent(props) {
|
|
|
23
23
|
return (react_1.default.createElement(react_draggable_1.default, { handle: "#draggable-dialog-title", cancel: '[class*="MuiDialogContent-root"]' },
|
|
24
24
|
react_1.default.createElement(material_1.Paper, { ...props })));
|
|
25
25
|
}
|
|
26
|
-
function DraggableDialog(props) {
|
|
26
|
+
const DraggableDialog = (0, mobx_react_1.observer)(function DraggableDialog(props) {
|
|
27
27
|
const { classes } = useStyles();
|
|
28
28
|
const { title, children, onClose } = props;
|
|
29
29
|
return (react_1.default.createElement(material_1.Dialog, { ...props, PaperComponent: PaperComponent, "aria-labelledby": "draggable-dialog-title" // this area is important for the draggable functionality
|
|
@@ -38,5 +38,5 @@ function DraggableDialog(props) {
|
|
|
38
38
|
react_1.default.createElement(Close_1.default, null))) : null),
|
|
39
39
|
react_1.default.createElement(material_1.Divider, null),
|
|
40
40
|
children)));
|
|
41
|
-
}
|
|
42
|
-
exports.default =
|
|
41
|
+
});
|
|
42
|
+
exports.default = DraggableDialog;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const RectBg = (props) => {
|
|
8
|
+
const { color = 'rgb(255,255,255,0.8)' } = props;
|
|
9
|
+
return react_1.default.createElement("rect", { ...props, fill: color });
|
|
10
|
+
};
|
|
11
|
+
exports.default = RectBg;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const util_1 = require("@jbrowse/core/util");
|
|
8
|
+
const mobx_react_1 = require("mobx-react");
|
|
9
|
+
const RectBg_1 = __importDefault(require("./RectBg"));
|
|
10
|
+
const ScoreLegend = (0, mobx_react_1.observer)(({ model }) => {
|
|
11
|
+
const { ticks, scaleType } = model;
|
|
12
|
+
const { width } = (0, util_1.getContainingView)(model);
|
|
13
|
+
const legend = `[${ticks === null || ticks === void 0 ? void 0 : ticks.values[0]}-${ticks === null || ticks === void 0 ? void 0 : ticks.values[1]}]` +
|
|
14
|
+
(scaleType === 'log' ? ' (log scale)' : '');
|
|
15
|
+
const len = (0, util_1.measureText)(legend, 14);
|
|
16
|
+
const padding = 25;
|
|
17
|
+
const xpos = width - len - padding;
|
|
18
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
19
|
+
react_1.default.createElement(RectBg_1.default, { y: 0, x: xpos, width: len + 6, height: 16 }),
|
|
20
|
+
react_1.default.createElement("text", { y: 13, x: xpos }, legend)));
|
|
21
|
+
});
|
|
22
|
+
exports.default = ScoreLegend;
|
|
@@ -46,6 +46,11 @@ const useStyles = (0, mui_1.makeStyles)()({
|
|
|
46
46
|
content: {
|
|
47
47
|
minWidth: 800,
|
|
48
48
|
},
|
|
49
|
+
cell: {
|
|
50
|
+
whiteSpace: 'nowrap',
|
|
51
|
+
overflow: 'hidden',
|
|
52
|
+
textOverflow: 'ellipsis',
|
|
53
|
+
},
|
|
49
54
|
});
|
|
50
55
|
function SetColorDialog({ model, handleClose, }) {
|
|
51
56
|
const { classes } = useStyles();
|
|
@@ -83,6 +88,7 @@ function SetColorDialog({ model, handleClose, }) {
|
|
|
83
88
|
}
|
|
84
89
|
exports.default = SetColorDialog;
|
|
85
90
|
function SourcesGrid({ rows, onChange, showTips, }) {
|
|
91
|
+
const { classes } = useStyles();
|
|
86
92
|
const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
|
|
87
93
|
const [selected, setSelected] = (0, react_1.useState)([]);
|
|
88
94
|
// @ts-expect-error
|
|
@@ -143,7 +149,7 @@ function SourcesGrid({ rows, onChange, showTips, }) {
|
|
|
143
149
|
sortingOrder: [null],
|
|
144
150
|
renderCell: (params) => {
|
|
145
151
|
const { value } = params;
|
|
146
|
-
return (0, util_1.isUriLocation)(value) ? (react_1.default.createElement(UriLink_1.default, { value: value })) : ((0, util_1.getStr)(value));
|
|
152
|
+
return (react_1.default.createElement("div", { className: classes.cell }, (0, util_1.isUriLocation)(value) ? (react_1.default.createElement(UriLink_1.default, { value: value })) : (react_1.default.createElement(react_1.default.Fragment, null, (0, util_1.getStr)(value)))));
|
|
147
153
|
},
|
|
148
154
|
// @ts-ignore
|
|
149
155
|
width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
|
|
@@ -2,12 +2,13 @@ import React from 'react';
|
|
|
2
2
|
import { Feature } from '@jbrowse/core/util';
|
|
3
3
|
import { Source } from '../../util';
|
|
4
4
|
import { TooltipContentsComponent } from '../../Tooltip';
|
|
5
|
-
|
|
5
|
+
interface Props {
|
|
6
6
|
model: {
|
|
7
7
|
sources: Source[];
|
|
8
8
|
};
|
|
9
9
|
feature: Feature;
|
|
10
|
-
}
|
|
10
|
+
}
|
|
11
|
+
declare const TooltipContents: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLDivElement>>;
|
|
11
12
|
type Coord = [number, number];
|
|
12
13
|
declare const WiggleTooltip: (props: {
|
|
13
14
|
model: {
|
|
@@ -10,7 +10,7 @@ const mobx_react_1 = require("mobx-react");
|
|
|
10
10
|
const util_1 = require("../../util");
|
|
11
11
|
const Tooltip_1 = __importDefault(require("../../Tooltip"));
|
|
12
12
|
const en = (n) => n.toLocaleString('en-US');
|
|
13
|
-
const TooltipContents = react_1.default.forwardRef(({ model, feature }, ref)
|
|
13
|
+
const TooltipContents = react_1.default.forwardRef(function TooltipContents2({ model, feature }, ref) {
|
|
14
14
|
const start = feature.get('start');
|
|
15
15
|
const end = feature.get('end');
|
|
16
16
|
const refName = feature.get('refName');
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { WiggleDisplayModel } from '../models/model';
|
|
3
|
-
|
|
4
|
-
model: WiggleDisplayModel;
|
|
5
|
-
orientation?: string;
|
|
6
|
-
exportSVG?: boolean;
|
|
7
|
-
}) => React.JSX.Element | null;
|
|
8
|
-
declare const _default: (props: {
|
|
3
|
+
declare const MultiLinearWiggleDisplayComponent: (props: {
|
|
9
4
|
model: WiggleDisplayModel;
|
|
10
5
|
}) => React.JSX.Element;
|
|
11
|
-
export default
|
|
12
|
-
export { default as YScaleBar } from '../../shared/YScaleBar';
|
|
6
|
+
export default MultiLinearWiggleDisplayComponent;
|
|
@@ -3,102 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.YScaleBar = exports.StatBars = void 0;
|
|
7
6
|
const react_1 = __importDefault(require("react"));
|
|
8
|
-
const util_1 = require("@jbrowse/core/util");
|
|
9
|
-
const configuration_1 = require("@jbrowse/core/configuration");
|
|
10
7
|
const plugin_linear_genome_view_1 = require("@jbrowse/plugin-linear-genome-view");
|
|
11
8
|
const mobx_react_1 = require("mobx-react");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
function getOffset(model) {
|
|
15
|
-
const { prefersOffset } = model;
|
|
16
|
-
const { trackLabels } = (0, util_1.getContainingView)(model);
|
|
17
|
-
const track = (0, util_1.getContainingTrack)(model);
|
|
18
|
-
const trackName = (0, configuration_1.getConf)(track, 'name');
|
|
19
|
-
return trackLabels === 'overlapping' && !prefersOffset
|
|
20
|
-
? (0, util_1.measureText)(trackName, trackLabelFontSize) + 100
|
|
21
|
-
: 10;
|
|
22
|
-
}
|
|
23
|
-
const Wrapper = (0, mobx_react_1.observer)(function ({ children, model, exportSVG, }) {
|
|
24
|
-
if (exportSVG) {
|
|
25
|
-
return react_1.default.createElement(react_1.default.Fragment, null, children);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
const { height } = model;
|
|
29
|
-
return (react_1.default.createElement("svg", { style: {
|
|
30
|
-
position: 'absolute',
|
|
31
|
-
top: 0,
|
|
32
|
-
left: 0,
|
|
33
|
-
pointerEvents: 'none',
|
|
34
|
-
height,
|
|
35
|
-
width: (0, util_1.getContainingView)(model).width,
|
|
36
|
-
} }, children));
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
const RectBg = (props) => {
|
|
40
|
-
const { color = 'rgb(255,255,255,0.8)' } = props;
|
|
41
|
-
return react_1.default.createElement("rect", { ...props, fill: color });
|
|
42
|
-
};
|
|
43
|
-
const ScoreLegend = (0, mobx_react_1.observer)(({ model }) => {
|
|
44
|
-
const { ticks, scaleType } = model;
|
|
45
|
-
const { width } = (0, util_1.getContainingView)(model);
|
|
46
|
-
const legend = `[${ticks === null || ticks === void 0 ? void 0 : ticks.values[0]}-${ticks === null || ticks === void 0 ? void 0 : ticks.values[1]}]` +
|
|
47
|
-
(scaleType === 'log' ? ' (log scale)' : '');
|
|
48
|
-
const len = (0, util_1.measureText)(legend, 14);
|
|
49
|
-
const padding = 25;
|
|
50
|
-
const xpos = width - len - padding;
|
|
51
|
-
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
52
|
-
react_1.default.createElement(RectBg, { y: 0, x: xpos, width: len + 6, height: 16 }),
|
|
53
|
-
react_1.default.createElement("text", { y: 13, x: xpos }, legend)));
|
|
54
|
-
});
|
|
55
|
-
const ColorLegend = (0, mobx_react_1.observer)(function ({ model, rowHeight, labelWidth, exportSVG, }) {
|
|
56
|
-
const { needsCustomLegend, needsScalebar, needsFullHeightScalebar, rowHeightTooSmallForScalebar, renderColorBoxes, sources, } = model;
|
|
57
|
-
const svgFontSize = Math.min(rowHeight, 12);
|
|
58
|
-
const canDisplayLabel = rowHeight > 11;
|
|
59
|
-
const colorBoxWidth = renderColorBoxes ? 15 : 0;
|
|
60
|
-
const legendWidth = labelWidth + colorBoxWidth + 5;
|
|
61
|
-
const svgOffset = exportSVG ? 10 : 0;
|
|
62
|
-
const extraOffset = svgOffset || (needsScalebar && !rowHeightTooSmallForScalebar ? 50 : 0);
|
|
63
|
-
return sources ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
64
|
-
/* 0.25 for hanging letters like g */
|
|
65
|
-
needsFullHeightScalebar ? (react_1.default.createElement(RectBg, { y: 0, x: extraOffset, width: legendWidth, height: (sources.length + 0.25) * rowHeight })) : null,
|
|
66
|
-
sources.map((source, idx) => {
|
|
67
|
-
const boxHeight = Math.min(20, rowHeight);
|
|
68
|
-
return (react_1.default.createElement(react_1.default.Fragment, { key: `${source.name}-${idx}` },
|
|
69
|
-
needsFullHeightScalebar ? null : (react_1.default.createElement(RectBg, { y: idx * rowHeight + 1, x: extraOffset, width: legendWidth, height: boxHeight })),
|
|
70
|
-
source.color ? (react_1.default.createElement(RectBg, { y: idx * rowHeight + 1, x: extraOffset, width: colorBoxWidth, height: needsCustomLegend ? rowHeight : boxHeight, color: source.color })) : null,
|
|
71
|
-
canDisplayLabel ? (react_1.default.createElement("text", { y: idx * rowHeight + 13, x: extraOffset + colorBoxWidth + 2, fontSize: svgFontSize }, source.name)) : null));
|
|
72
|
-
}))) : null;
|
|
73
|
-
});
|
|
74
|
-
exports.StatBars = (0, mobx_react_1.observer)(function (props) {
|
|
75
|
-
const { model, orientation, exportSVG } = props;
|
|
76
|
-
const { stats, needsCustomLegend, needsFullHeightScalebar, rowHeightTooSmallForScalebar, rowHeight, sources, ticks, } = model;
|
|
77
|
-
const svgFontSize = Math.min(rowHeight, 12);
|
|
78
|
-
const canDisplayLabel = rowHeight > 11;
|
|
79
|
-
const { width: viewWidth } = (0, util_1.getContainingView)(model);
|
|
80
|
-
const minWidth = 20;
|
|
81
|
-
const ready = stats && sources;
|
|
82
|
-
if (!ready) {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
const labelWidth = Math.max(...(sources
|
|
86
|
-
.map(s => (0, util_1.measureText)(s.name, svgFontSize))
|
|
87
|
-
.map(width => (canDisplayLabel ? width : minWidth)) || [0]));
|
|
88
|
-
return (react_1.default.createElement(Wrapper, { ...props }, needsFullHeightScalebar ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
89
|
-
react_1.default.createElement("g", { transform: `translate(${!exportSVG ? getOffset(model) : 0},0)` },
|
|
90
|
-
react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })),
|
|
91
|
-
react_1.default.createElement("g", { transform: `translate(${viewWidth - labelWidth - 100},0)` },
|
|
92
|
-
react_1.default.createElement(ColorLegend, { exportSVG: exportSVG, model: model, rowHeight: 12, labelWidth: labelWidth })))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
93
|
-
react_1.default.createElement(ColorLegend, { exportSVG: exportSVG, model: model, rowHeight: model.rowHeight, labelWidth: labelWidth }),
|
|
94
|
-
rowHeightTooSmallForScalebar || needsCustomLegend ? (react_1.default.createElement(ScoreLegend, { ...props })) : (sources.map((_source, idx) => (react_1.default.createElement("g", { transform: `translate(0 ${rowHeight * idx})`, key: `${JSON.stringify(ticks)}-${idx}` },
|
|
95
|
-
react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })))))))));
|
|
96
|
-
});
|
|
97
|
-
exports.default = (0, mobx_react_1.observer)((props) => {
|
|
9
|
+
const YScaleBars_1 = __importDefault(require("./YScaleBars"));
|
|
10
|
+
const MultiLinearWiggleDisplayComponent = (0, mobx_react_1.observer)((props) => {
|
|
98
11
|
const { model } = props;
|
|
99
12
|
return (react_1.default.createElement("div", null,
|
|
100
13
|
react_1.default.createElement(plugin_linear_genome_view_1.BaseLinearDisplayComponent, { ...props }),
|
|
101
|
-
react_1.default.createElement(
|
|
14
|
+
react_1.default.createElement(YScaleBars_1.default, { model: model })));
|
|
102
15
|
});
|
|
103
|
-
|
|
104
|
-
Object.defineProperty(exports, "YScaleBar", { enumerable: true, get: function () { return __importDefault(YScaleBar_2).default; } });
|
|
16
|
+
exports.default = MultiLinearWiggleDisplayComponent;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { WiggleDisplayModel } from '../models/model';
|
|
3
|
+
export declare const YScaleBars: (props: {
|
|
4
|
+
model: WiggleDisplayModel;
|
|
5
|
+
orientation?: string;
|
|
6
|
+
exportSVG?: boolean;
|
|
7
|
+
}) => React.JSX.Element | null;
|
|
8
|
+
export default YScaleBars;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.YScaleBars = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const util_1 = require("@jbrowse/core/util");
|
|
9
|
+
const mobx_react_1 = require("mobx-react");
|
|
10
|
+
const YScaleBar_1 = __importDefault(require("../../shared/YScaleBar"));
|
|
11
|
+
const ColorLegend_1 = __importDefault(require("./ColorLegend"));
|
|
12
|
+
const ScoreLegend_1 = __importDefault(require("./ScoreLegend"));
|
|
13
|
+
const util_2 = require("./util");
|
|
14
|
+
const Wrapper = (0, mobx_react_1.observer)(function ({ children, model, exportSVG, }) {
|
|
15
|
+
if (exportSVG) {
|
|
16
|
+
return react_1.default.createElement(react_1.default.Fragment, null, children);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const { height } = model;
|
|
20
|
+
return (react_1.default.createElement("svg", { style: {
|
|
21
|
+
position: 'absolute',
|
|
22
|
+
top: 0,
|
|
23
|
+
left: 0,
|
|
24
|
+
pointerEvents: 'none',
|
|
25
|
+
height,
|
|
26
|
+
width: (0, util_1.getContainingView)(model).width,
|
|
27
|
+
} }, children));
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
exports.YScaleBars = (0, mobx_react_1.observer)(function (props) {
|
|
31
|
+
const { model, orientation, exportSVG } = props;
|
|
32
|
+
const { stats, needsCustomLegend, needsFullHeightScalebar, rowHeightTooSmallForScalebar, rowHeight, sources, ticks, } = model;
|
|
33
|
+
const svgFontSize = Math.min(rowHeight, 12);
|
|
34
|
+
const canDisplayLabel = rowHeight > 11;
|
|
35
|
+
const { width: viewWidth } = (0, util_1.getContainingView)(model);
|
|
36
|
+
const minWidth = 20;
|
|
37
|
+
const ready = stats && sources;
|
|
38
|
+
if (!ready) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const labelWidth = Math.max(...(sources
|
|
42
|
+
.map(s => (0, util_1.measureText)(s.name, svgFontSize))
|
|
43
|
+
.map(width => (canDisplayLabel ? width : minWidth)) || [0]));
|
|
44
|
+
return (react_1.default.createElement(Wrapper, { ...props }, needsFullHeightScalebar ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
45
|
+
react_1.default.createElement("g", { transform: `translate(${!exportSVG ? (0, util_2.getOffset)(model) : 0},0)` },
|
|
46
|
+
react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })),
|
|
47
|
+
react_1.default.createElement("g", { transform: `translate(${viewWidth - labelWidth - 100},0)` },
|
|
48
|
+
react_1.default.createElement(ColorLegend_1.default, { exportSVG: exportSVG, model: model, rowHeight: 12, labelWidth: labelWidth })))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
49
|
+
react_1.default.createElement(ColorLegend_1.default, { exportSVG: exportSVG, model: model, rowHeight: model.rowHeight, labelWidth: labelWidth }),
|
|
50
|
+
rowHeightTooSmallForScalebar || needsCustomLegend ? (react_1.default.createElement(ScoreLegend_1.default, { ...props })) : (sources.map((_source, idx) => (react_1.default.createElement("g", { transform: `translate(0 ${rowHeight * idx})`, key: `${JSON.stringify(ticks)}-${idx}` },
|
|
51
|
+
react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })))))))));
|
|
52
|
+
});
|
|
53
|
+
exports.default = exports.YScaleBars;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { WiggleDisplayModel } from '../models/model';
|
|
1
2
|
export declare function moveUp(arr: {
|
|
2
3
|
name: string;
|
|
3
4
|
}[], sel: string[], by?: number): {
|
|
@@ -8,3 +9,4 @@ export declare function moveDown(arr: {
|
|
|
8
9
|
}[], sel: string[], by?: number): {
|
|
9
10
|
name: string;
|
|
10
11
|
}[];
|
|
12
|
+
export declare function getOffset(model: WiggleDisplayModel): number;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.moveDown = exports.moveUp = void 0;
|
|
3
|
+
exports.getOffset = exports.moveDown = exports.moveUp = void 0;
|
|
4
|
+
const util_1 = require("@jbrowse/core/util");
|
|
5
|
+
const configuration_1 = require("@jbrowse/core/configuration");
|
|
4
6
|
function moveUp(arr, sel, by = 1) {
|
|
5
7
|
const idxs = sel
|
|
6
8
|
.map(l => arr.findIndex(v => v.name === l))
|
|
7
9
|
.sort((a, b) => a - b);
|
|
8
10
|
let lastIdx = 0;
|
|
9
|
-
for (
|
|
10
|
-
const old = idxs[i];
|
|
11
|
+
for (const old of idxs) {
|
|
11
12
|
const idx = Math.max(lastIdx, old - by);
|
|
12
13
|
if (idx >= lastIdx) {
|
|
13
14
|
arr.splice(idx, 0, arr.splice(old, 1)[0]);
|
|
@@ -22,8 +23,7 @@ function moveDown(arr, sel, by = 1) {
|
|
|
22
23
|
.map(l => arr.findIndex(v => v.name === l))
|
|
23
24
|
.sort((a, b) => b - a);
|
|
24
25
|
let lastIdx = arr.length - 1;
|
|
25
|
-
for (
|
|
26
|
-
const old = idxs[i];
|
|
26
|
+
for (const old of idxs) {
|
|
27
27
|
const idx = Math.min(lastIdx, old + by);
|
|
28
28
|
if (idx <= lastIdx) {
|
|
29
29
|
arr.splice(idx, 0, arr.splice(old, 1)[0]);
|
|
@@ -33,3 +33,14 @@ function moveDown(arr, sel, by = 1) {
|
|
|
33
33
|
return arr;
|
|
34
34
|
}
|
|
35
35
|
exports.moveDown = moveDown;
|
|
36
|
+
const trackLabelFontSize = 12.8;
|
|
37
|
+
function getOffset(model) {
|
|
38
|
+
const { prefersOffset } = model;
|
|
39
|
+
const { trackLabels } = (0, util_1.getContainingView)(model);
|
|
40
|
+
const track = (0, util_1.getContainingTrack)(model);
|
|
41
|
+
const trackName = (0, configuration_1.getConf)(track, 'name');
|
|
42
|
+
return trackLabels === 'overlapping' && !prefersOffset
|
|
43
|
+
? (0, util_1.measureText)(trackName, trackLabelFontSize) + 100
|
|
44
|
+
: 10;
|
|
45
|
+
}
|
|
46
|
+
exports.getOffset = getOffset;
|
|
@@ -7,13 +7,13 @@ exports.renderSvg = void 0;
|
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const util_1 = require("@jbrowse/core/util");
|
|
9
9
|
const mobx_1 = require("mobx");
|
|
10
|
-
const
|
|
10
|
+
const YScaleBars_1 = __importDefault(require("../components/YScaleBars"));
|
|
11
11
|
async function renderSvg(self, opts, superRenderSvg) {
|
|
12
12
|
await (0, mobx_1.when)(() => !!self.stats && !!self.regionCannotBeRenderedText);
|
|
13
13
|
const { offsetPx } = (0, util_1.getContainingView)(self);
|
|
14
14
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
15
15
|
react_1.default.createElement("g", { id: "snpcov" }, await superRenderSvg(opts)),
|
|
16
16
|
react_1.default.createElement("g", { transform: `translate(${Math.max(-offsetPx, 0)})` },
|
|
17
|
-
react_1.default.createElement(
|
|
17
|
+
react_1.default.createElement(YScaleBars_1.default, { model: self, orientation: "left", exportSVG: true }))));
|
|
18
18
|
}
|
|
19
19
|
exports.renderSvg = renderSvg;
|
|
@@ -12,7 +12,7 @@ class MultiRowLineRenderer extends WiggleBaseRenderer_1.default {
|
|
|
12
12
|
const { bpPerPx, sources, regions, features } = props;
|
|
13
13
|
const [region] = regions;
|
|
14
14
|
const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
|
|
15
|
-
const height = props.height /
|
|
15
|
+
const height = props.height / sources.length;
|
|
16
16
|
const width = (region.end - region.start) / bpPerPx;
|
|
17
17
|
let feats = [];
|
|
18
18
|
ctx.save();
|
|
@@ -1,27 +1,4 @@
|
|
|
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
|
};
|
|
@@ -35,9 +12,8 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
|
|
|
35
12
|
const { bpPerPx, sources, regions, features } = props;
|
|
36
13
|
const [region] = regions;
|
|
37
14
|
const groups = (0, util_1.groupBy)([...features.values()], f => f.get('source'));
|
|
38
|
-
const height = props.height /
|
|
15
|
+
const height = props.height / sources.length;
|
|
39
16
|
const width = (region.end - region.start) / bpPerPx;
|
|
40
|
-
const Color = await Promise.resolve().then(() => __importStar(require('color'))).then(f => f.default);
|
|
41
17
|
let feats = [];
|
|
42
18
|
ctx.save();
|
|
43
19
|
sources.forEach(source => {
|
|
@@ -50,7 +26,6 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
|
|
|
50
26
|
features,
|
|
51
27
|
height,
|
|
52
28
|
colorCallback: () => source.color || 'blue',
|
|
53
|
-
Color,
|
|
54
29
|
});
|
|
55
30
|
ctx.strokeStyle = 'rgba(200,200,200,0.8)';
|
|
56
31
|
ctx.beginPath();
|