@jbrowse/plugin-wiggle 2.6.3 → 2.7.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/CreateMultiWiggleExtension/index.js +14 -11
- package/dist/DensityRenderer/DensityRenderer.js +2 -2
- package/dist/LinePlotRenderer/LinePlotRenderer.js +2 -2
- 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/MultiDensityRenderer/MultiDensityRenderer.js +5 -8
- package/dist/MultiLineRenderer/MultiLineRenderer.js +5 -9
- package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +3 -4
- package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.js +3 -3
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -96
- package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.d.ts +8 -0
- package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.js +138 -0
- 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 -3
- package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.js +2 -4
- package/dist/MultiLinearWiggleDisplay/components/util.js +2 -4
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +5 -5
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +5 -34
- 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 +5 -33
- 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 +2 -27
- package/dist/drawDensity.d.ts +17 -0
- package/dist/drawDensity.js +66 -0
- package/dist/drawLine.d.ts +19 -0
- package/dist/drawLine.js +73 -0
- package/dist/drawXY.d.ts +19 -0
- package/dist/drawXY.js +164 -0
- package/dist/shared/YScaleBar.d.ts +2 -2
- package/dist/shared/YScaleBar.js +2 -1
- package/dist/shared/modelShared.d.ts +4 -1
- package/dist/util.d.ts +1 -0
- package/dist/util.js +17 -1
- package/esm/CreateMultiWiggleExtension/index.js +14 -11
- package/esm/DensityRenderer/DensityRenderer.js +1 -1
- package/esm/LinePlotRenderer/LinePlotRenderer.js +1 -1
- 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/MultiDensityRenderer/MultiDensityRenderer.js +4 -7
- package/esm/MultiLineRenderer/MultiLineRenderer.js +4 -8
- package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +3 -4
- package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.js +3 -3
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -96
- package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.d.ts +8 -0
- package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.js +110 -0
- 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 -3
- package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.js +2 -2
- package/esm/MultiLinearWiggleDisplay/components/util.js +2 -4
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +4 -4
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +4 -10
- 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 +4 -9
- 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 +1 -3
- package/esm/drawDensity.d.ts +17 -0
- package/esm/drawDensity.js +62 -0
- package/esm/drawLine.d.ts +19 -0
- package/esm/drawLine.js +69 -0
- package/esm/drawXY.d.ts +19 -0
- package/esm/{drawxy.js → drawXY.js} +17 -140
- package/esm/shared/YScaleBar.d.ts +2 -2
- package/esm/shared/YScaleBar.js +2 -1
- package/esm/shared/modelShared.d.ts +4 -1
- package/esm/util.d.ts +1 -0
- package/esm/util.js +15 -0
- package/package.json +3 -4
- package/dist/drawxy.d.ts +0 -50
- package/dist/drawxy.js +0 -289
- package/esm/drawxy.d.ts +0 -50
|
@@ -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,
|
|
@@ -3,11 +3,11 @@ 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
|
-
const
|
|
6
|
+
const drawDensity_1 = require("../drawDensity");
|
|
7
7
|
const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
|
|
8
8
|
class DensityRenderer extends WiggleBaseRenderer_1.default {
|
|
9
9
|
async draw(ctx, props) {
|
|
10
|
-
return (0,
|
|
10
|
+
return (0, drawDensity_1.drawDensity)(ctx, props);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
exports.default = DensityRenderer;
|
|
@@ -5,10 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
|
|
7
7
|
const util_1 = require("../util");
|
|
8
|
-
const
|
|
8
|
+
const drawLine_1 = require("../drawLine");
|
|
9
9
|
class LinePlotRenderer extends WiggleBaseRenderer_1.default {
|
|
10
10
|
async draw(ctx, props) {
|
|
11
|
-
return (0,
|
|
11
|
+
return (0, drawLine_1.drawLine)(ctx, {
|
|
12
12
|
...props,
|
|
13
13
|
offset: util_1.YSCALEBAR_LABEL_OFFSET,
|
|
14
14
|
colorCallback: () => 'grey',
|
|
@@ -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');
|
|
@@ -5,23 +5,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const util_1 = require("@jbrowse/core/util");
|
|
7
7
|
const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
|
|
8
|
-
const
|
|
8
|
+
const drawDensity_1 = require("../drawDensity");
|
|
9
9
|
class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
|
|
10
10
|
// @ts-expect-error
|
|
11
11
|
async draw(ctx, props) {
|
|
12
12
|
const { bpPerPx, sources, regions, features } = props;
|
|
13
13
|
const [region] = regions;
|
|
14
|
-
const groups = (0, util_1.groupBy)(
|
|
14
|
+
const groups = (0, util_1.groupBy)(features.values(), f => f.get('source'));
|
|
15
15
|
const height = props.height / sources.length;
|
|
16
16
|
const width = (region.end - region.start) / bpPerPx;
|
|
17
17
|
let feats = [];
|
|
18
18
|
ctx.save();
|
|
19
19
|
sources.forEach(source => {
|
|
20
|
-
const features = groups[source.name];
|
|
21
|
-
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const { reducedFeatures } = (0, drawxy_1.drawDensity)(ctx, {
|
|
20
|
+
const features = groups[source.name] || [];
|
|
21
|
+
const { reducedFeatures } = (0, drawDensity_1.drawDensity)(ctx, {
|
|
25
22
|
...props,
|
|
26
23
|
features,
|
|
27
24
|
height,
|
|
@@ -32,7 +29,7 @@ class MultiXYPlotRenderer extends WiggleBaseRenderer_1.default {
|
|
|
32
29
|
ctx.lineTo(width, height);
|
|
33
30
|
ctx.stroke();
|
|
34
31
|
ctx.translate(0, height);
|
|
35
|
-
feats =
|
|
32
|
+
feats = feats.concat(reducedFeatures);
|
|
36
33
|
});
|
|
37
34
|
ctx.restore();
|
|
38
35
|
return { reducedFeatures: feats };
|
|
@@ -4,25 +4,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const util_1 = require("@jbrowse/core/util");
|
|
7
|
-
const
|
|
7
|
+
const drawLine_1 = require("../drawLine");
|
|
8
8
|
const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
|
|
9
9
|
class MultiLineRenderer extends WiggleBaseRenderer_1.default {
|
|
10
10
|
// @ts-expect-error
|
|
11
11
|
async draw(ctx, props) {
|
|
12
12
|
const { sources, features } = props;
|
|
13
|
-
const groups = (0, util_1.groupBy)(
|
|
13
|
+
const groups = (0, util_1.groupBy)(features.values(), f => f.get('source'));
|
|
14
14
|
let feats = [];
|
|
15
15
|
sources.forEach(source => {
|
|
16
|
-
const
|
|
17
|
-
if (!features) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const { reducedFeatures } = (0, drawxy_1.drawLine)(ctx, {
|
|
16
|
+
const { reducedFeatures } = (0, drawLine_1.drawLine)(ctx, {
|
|
21
17
|
...props,
|
|
22
|
-
features,
|
|
18
|
+
features: groups[source.name] || [],
|
|
23
19
|
colorCallback: () => source.color || 'blue',
|
|
24
20
|
});
|
|
25
|
-
feats =
|
|
21
|
+
feats = feats.concat(reducedFeatures);
|
|
26
22
|
});
|
|
27
23
|
return { reducedFeatures: feats };
|
|
28
24
|
}
|
|
@@ -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;
|
|
@@ -30,18 +30,10 @@ const react_1 = __importStar(require("react"));
|
|
|
30
30
|
const material_1 = require("@mui/material");
|
|
31
31
|
const mui_1 = require("tss-react/mui");
|
|
32
32
|
const util_1 = require("@jbrowse/core/util");
|
|
33
|
-
const x_data_grid_1 = require("@mui/x-data-grid");
|
|
34
33
|
const clone_1 = __importDefault(require("clone"));
|
|
35
34
|
// locals
|
|
36
35
|
const DraggableDialog_1 = __importDefault(require("./DraggableDialog"));
|
|
37
|
-
const
|
|
38
|
-
const util_2 = require("./util");
|
|
39
|
-
// icons
|
|
40
|
-
const KeyboardDoubleArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowUp"));
|
|
41
|
-
const KeyboardDoubleArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowDown"));
|
|
42
|
-
const KeyboardArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardArrowDown"));
|
|
43
|
-
const KeyboardArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardArrowUp"));
|
|
44
|
-
const UriLink_1 = __importDefault(require("@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail/UriLink"));
|
|
36
|
+
const SourcesGrid_1 = __importDefault(require("./SourcesGrid"));
|
|
45
37
|
const useStyles = (0, mui_1.makeStyles)()({
|
|
46
38
|
content: {
|
|
47
39
|
minWidth: 800,
|
|
@@ -66,7 +58,7 @@ function SetColorDialog({ model, handleClose, }) {
|
|
|
66
58
|
react_1.default.createElement("li", null, "Changes are applied when you hit Submit"),
|
|
67
59
|
react_1.default.createElement("li", null, "You can click and drag the dialog box to move it on the screen"),
|
|
68
60
|
react_1.default.createElement("li", null, "Columns in the table can be hidden using a vertical '...' menu on the right side of each column")))) : null,
|
|
69
|
-
react_1.default.createElement(
|
|
61
|
+
react_1.default.createElement(SourcesGrid_1.default, { rows: currLayout, onChange: setCurrLayout, showTips: showTips })),
|
|
70
62
|
react_1.default.createElement(material_1.DialogActions, null,
|
|
71
63
|
react_1.default.createElement(material_1.Button, { variant: "contained", type: "submit", color: "inherit", onClick: () => {
|
|
72
64
|
model.clearLayout();
|
|
@@ -82,89 +74,3 @@ function SetColorDialog({ model, handleClose, }) {
|
|
|
82
74
|
} }, "Submit"))));
|
|
83
75
|
}
|
|
84
76
|
exports.default = SetColorDialog;
|
|
85
|
-
function SourcesGrid({ rows, onChange, showTips, }) {
|
|
86
|
-
const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
|
|
87
|
-
const [selected, setSelected] = (0, react_1.useState)([]);
|
|
88
|
-
// @ts-expect-error
|
|
89
|
-
const { name: _name, color: _color, baseUri: _baseUri, ...rest } = rows[0];
|
|
90
|
-
const [widgetColor, setWidgetColor] = (0, react_1.useState)('blue');
|
|
91
|
-
const [currSort, setCurrSort] = (0, react_1.useState)({
|
|
92
|
-
idx: 0,
|
|
93
|
-
field: null,
|
|
94
|
-
});
|
|
95
|
-
return (react_1.default.createElement("div", null,
|
|
96
|
-
react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event => setAnchorEl(event.currentTarget) }, "Change color of selected items"),
|
|
97
|
-
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected)), disabled: !selected.length },
|
|
98
|
-
react_1.default.createElement(KeyboardArrowUp_1.default, null),
|
|
99
|
-
showTips ? 'Move selected items up' : null),
|
|
100
|
-
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected)), disabled: !selected.length },
|
|
101
|
-
react_1.default.createElement(KeyboardArrowDown_1.default, null),
|
|
102
|
-
showTips ? 'Move selected items down' : null),
|
|
103
|
-
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected, rows.length)), disabled: !selected.length },
|
|
104
|
-
react_1.default.createElement(KeyboardDoubleArrowUp_1.default, null),
|
|
105
|
-
showTips ? 'Move selected items to top' : null),
|
|
106
|
-
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected, rows.length)), disabled: !selected.length },
|
|
107
|
-
react_1.default.createElement(KeyboardDoubleArrowDown_1.default, null),
|
|
108
|
-
showTips ? 'Move selected items to bottom' : null),
|
|
109
|
-
react_1.default.createElement(ColorPicker_1.ColorPopover, { anchorEl: anchorEl, color: widgetColor, onChange: c => {
|
|
110
|
-
setWidgetColor(c);
|
|
111
|
-
selected.forEach(id => {
|
|
112
|
-
const elt = rows.find(f => f.name === id);
|
|
113
|
-
if (elt) {
|
|
114
|
-
elt.color = c;
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
onChange([...rows]);
|
|
118
|
-
}, onClose: () => setAnchorEl(null) }),
|
|
119
|
-
react_1.default.createElement("div", { style: { height: 400, width: '100%' } },
|
|
120
|
-
react_1.default.createElement(x_data_grid_1.DataGrid, { getRowId: row => row.name, checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg => setSelected(arg), rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
|
|
121
|
-
{
|
|
122
|
-
field: 'color',
|
|
123
|
-
headerName: 'Color',
|
|
124
|
-
renderCell: params => {
|
|
125
|
-
const { value, id } = params;
|
|
126
|
-
return (react_1.default.createElement(ColorPicker_1.default, { color: value || 'blue', onChange: c => {
|
|
127
|
-
const elt = rows.find(f => f.name === id);
|
|
128
|
-
if (elt) {
|
|
129
|
-
elt.color = c;
|
|
130
|
-
}
|
|
131
|
-
onChange([...rows]);
|
|
132
|
-
} }));
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
field: 'name',
|
|
137
|
-
sortingOrder: [null],
|
|
138
|
-
headerName: 'Name',
|
|
139
|
-
width: (0, util_1.measureGridWidth)(rows.map(r => r.name)),
|
|
140
|
-
},
|
|
141
|
-
...Object.keys(rest).map(val => ({
|
|
142
|
-
field: val,
|
|
143
|
-
sortingOrder: [null],
|
|
144
|
-
renderCell: (params) => {
|
|
145
|
-
const { value } = params;
|
|
146
|
-
return (0, util_1.isUriLocation)(value) ? (react_1.default.createElement(UriLink_1.default, { value: value })) : ((0, util_1.getStr)(value));
|
|
147
|
-
},
|
|
148
|
-
// @ts-ignore
|
|
149
|
-
width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
|
|
150
|
-
})),
|
|
151
|
-
], sortModel: [
|
|
152
|
-
/* we control the sort as a controlled component using onSortModelChange */
|
|
153
|
-
], onSortModelChange: args => {
|
|
154
|
-
const sort = args[0];
|
|
155
|
-
const idx = (currSort.idx + 1) % 2;
|
|
156
|
-
const field = (sort === null || sort === void 0 ? void 0 : sort.field) || currSort.field;
|
|
157
|
-
setCurrSort({ idx, field });
|
|
158
|
-
onChange(field
|
|
159
|
-
? [...rows].sort((a, b) => {
|
|
160
|
-
// @ts-expect-error
|
|
161
|
-
const aa = (0, util_1.getStr)(a[field]);
|
|
162
|
-
// @ts-expect-error
|
|
163
|
-
const bb = (0, util_1.getStr)(b[field]);
|
|
164
|
-
return idx === 1
|
|
165
|
-
? aa.localeCompare(bb)
|
|
166
|
-
: bb.localeCompare(aa);
|
|
167
|
-
})
|
|
168
|
-
: rows);
|
|
169
|
-
} }))));
|
|
170
|
-
}
|
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const react_1 = __importStar(require("react"));
|
|
30
|
+
const material_1 = require("@mui/material");
|
|
31
|
+
const util_1 = require("@jbrowse/core/util");
|
|
32
|
+
const x_data_grid_1 = require("@mui/x-data-grid");
|
|
33
|
+
const mui_1 = require("tss-react/mui");
|
|
34
|
+
// locals
|
|
35
|
+
const ColorPicker_1 = __importStar(require("@jbrowse/core/ui/ColorPicker"));
|
|
36
|
+
const util_2 = require("./util");
|
|
37
|
+
// icons
|
|
38
|
+
const KeyboardDoubleArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowUp"));
|
|
39
|
+
const KeyboardDoubleArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardDoubleArrowDown"));
|
|
40
|
+
const KeyboardArrowDown_1 = __importDefault(require("@mui/icons-material/KeyboardArrowDown"));
|
|
41
|
+
const KeyboardArrowUp_1 = __importDefault(require("@mui/icons-material/KeyboardArrowUp"));
|
|
42
|
+
const ui_1 = require("@jbrowse/core/ui");
|
|
43
|
+
const useStyles = (0, mui_1.makeStyles)()({
|
|
44
|
+
cell: {
|
|
45
|
+
whiteSpace: 'nowrap',
|
|
46
|
+
overflow: 'hidden',
|
|
47
|
+
textOverflow: 'ellipsis',
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
function SourcesGrid({ rows, onChange, showTips, }) {
|
|
51
|
+
const { classes } = useStyles();
|
|
52
|
+
const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
|
|
53
|
+
const [selected, setSelected] = (0, react_1.useState)([]);
|
|
54
|
+
// @ts-expect-error
|
|
55
|
+
const { name: _name, color: _color, baseUri: _baseUri, ...rest } = rows[0];
|
|
56
|
+
const [widgetColor, setWidgetColor] = (0, react_1.useState)('blue');
|
|
57
|
+
const [currSort, setCurrSort] = (0, react_1.useState)({
|
|
58
|
+
idx: 0,
|
|
59
|
+
field: null,
|
|
60
|
+
});
|
|
61
|
+
return (react_1.default.createElement("div", null,
|
|
62
|
+
react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event => setAnchorEl(event.currentTarget) }, "Change color of selected items"),
|
|
63
|
+
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected)), disabled: !selected.length },
|
|
64
|
+
react_1.default.createElement(KeyboardArrowUp_1.default, null),
|
|
65
|
+
showTips ? 'Move selected items up' : null),
|
|
66
|
+
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected)), disabled: !selected.length },
|
|
67
|
+
react_1.default.createElement(KeyboardArrowDown_1.default, null),
|
|
68
|
+
showTips ? 'Move selected items down' : null),
|
|
69
|
+
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveUp)([...rows], selected, rows.length)), disabled: !selected.length },
|
|
70
|
+
react_1.default.createElement(KeyboardDoubleArrowUp_1.default, null),
|
|
71
|
+
showTips ? 'Move selected items to top' : null),
|
|
72
|
+
react_1.default.createElement(material_1.Button, { onClick: () => onChange((0, util_2.moveDown)([...rows], selected, rows.length)), disabled: !selected.length },
|
|
73
|
+
react_1.default.createElement(KeyboardDoubleArrowDown_1.default, null),
|
|
74
|
+
showTips ? 'Move selected items to bottom' : null),
|
|
75
|
+
react_1.default.createElement(ColorPicker_1.ColorPopover, { anchorEl: anchorEl, color: widgetColor, onChange: c => {
|
|
76
|
+
setWidgetColor(c);
|
|
77
|
+
selected.forEach(id => {
|
|
78
|
+
const elt = rows.find(f => f.name === id);
|
|
79
|
+
if (elt) {
|
|
80
|
+
elt.color = c;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
onChange([...rows]);
|
|
84
|
+
}, onClose: () => setAnchorEl(null) }),
|
|
85
|
+
react_1.default.createElement("div", { style: { height: 400, width: '100%' } },
|
|
86
|
+
react_1.default.createElement(x_data_grid_1.DataGrid, { getRowId: row => row.name, checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg => setSelected(arg), rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
|
|
87
|
+
{
|
|
88
|
+
field: 'color',
|
|
89
|
+
headerName: 'Color',
|
|
90
|
+
renderCell: params => {
|
|
91
|
+
const { value, id } = params;
|
|
92
|
+
return (react_1.default.createElement(ColorPicker_1.default, { color: value || 'blue', onChange: c => {
|
|
93
|
+
const elt = rows.find(f => f.name === id);
|
|
94
|
+
if (elt) {
|
|
95
|
+
elt.color = c;
|
|
96
|
+
}
|
|
97
|
+
onChange([...rows]);
|
|
98
|
+
} }));
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
field: 'name',
|
|
103
|
+
sortingOrder: [null],
|
|
104
|
+
headerName: 'Name',
|
|
105
|
+
width: (0, util_1.measureGridWidth)(rows.map(r => r.name)),
|
|
106
|
+
},
|
|
107
|
+
...Object.keys(rest).map(val => ({
|
|
108
|
+
field: val,
|
|
109
|
+
sortingOrder: [null],
|
|
110
|
+
renderCell: (params) => {
|
|
111
|
+
const { value } = params;
|
|
112
|
+
return (react_1.default.createElement("div", { className: classes.cell },
|
|
113
|
+
react_1.default.createElement(ui_1.SanitizedHTML, { html: (0, util_1.getStr)(value) })));
|
|
114
|
+
},
|
|
115
|
+
// @ts-ignore
|
|
116
|
+
width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
|
|
117
|
+
})),
|
|
118
|
+
], sortModel: [
|
|
119
|
+
/* we control the sort as a controlled component using onSortModelChange */
|
|
120
|
+
], onSortModelChange: args => {
|
|
121
|
+
const sort = args[0];
|
|
122
|
+
const idx = (currSort.idx + 1) % 2;
|
|
123
|
+
const field = (sort === null || sort === void 0 ? void 0 : sort.field) || currSort.field;
|
|
124
|
+
setCurrSort({ idx, field });
|
|
125
|
+
onChange(field
|
|
126
|
+
? [...rows].sort((a, b) => {
|
|
127
|
+
// @ts-expect-error
|
|
128
|
+
const aa = (0, util_1.getStr)(a[field]);
|
|
129
|
+
// @ts-expect-error
|
|
130
|
+
const bb = (0, util_1.getStr)(b[field]);
|
|
131
|
+
return idx === 1
|
|
132
|
+
? aa.localeCompare(bb)
|
|
133
|
+
: bb.localeCompare(aa);
|
|
134
|
+
})
|
|
135
|
+
: rows);
|
|
136
|
+
} }))));
|
|
137
|
+
}
|
|
138
|
+
exports.default = SourcesGrid;
|
|
@@ -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,7 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { WiggleDisplayModel } from '../models/model';
|
|
3
|
-
declare const
|
|
3
|
+
declare const MultiLinearWiggleDisplayComponent: (props: {
|
|
4
4
|
model: WiggleDisplayModel;
|
|
5
5
|
}) => React.JSX.Element;
|
|
6
|
-
export default
|
|
7
|
-
export { default as YScaleBar } from '../../shared/YScaleBar';
|
|
6
|
+
export default MultiLinearWiggleDisplayComponent;
|
|
@@ -3,16 +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 = void 0;
|
|
7
6
|
const react_1 = __importDefault(require("react"));
|
|
8
7
|
const plugin_linear_genome_view_1 = require("@jbrowse/plugin-linear-genome-view");
|
|
9
8
|
const mobx_react_1 = require("mobx-react");
|
|
10
9
|
const YScaleBars_1 = __importDefault(require("./YScaleBars"));
|
|
11
|
-
|
|
10
|
+
const MultiLinearWiggleDisplayComponent = (0, mobx_react_1.observer)((props) => {
|
|
12
11
|
const { model } = props;
|
|
13
12
|
return (react_1.default.createElement("div", null,
|
|
14
13
|
react_1.default.createElement(plugin_linear_genome_view_1.BaseLinearDisplayComponent, { ...props }),
|
|
15
14
|
react_1.default.createElement(YScaleBars_1.default, { model: model })));
|
|
16
15
|
});
|
|
17
|
-
|
|
18
|
-
Object.defineProperty(exports, "YScaleBar", { enumerable: true, get: function () { return __importDefault(YScaleBar_1).default; } });
|
|
16
|
+
exports.default = MultiLinearWiggleDisplayComponent;
|
|
@@ -8,8 +8,7 @@ function moveUp(arr, sel, by = 1) {
|
|
|
8
8
|
.map(l => arr.findIndex(v => v.name === l))
|
|
9
9
|
.sort((a, b) => a - b);
|
|
10
10
|
let lastIdx = 0;
|
|
11
|
-
for (
|
|
12
|
-
const old = idxs[i];
|
|
11
|
+
for (const old of idxs) {
|
|
13
12
|
const idx = Math.max(lastIdx, old - by);
|
|
14
13
|
if (idx >= lastIdx) {
|
|
15
14
|
arr.splice(idx, 0, arr.splice(old, 1)[0]);
|
|
@@ -24,8 +23,7 @@ function moveDown(arr, sel, by = 1) {
|
|
|
24
23
|
.map(l => arr.findIndex(v => v.name === l))
|
|
25
24
|
.sort((a, b) => b - a);
|
|
26
25
|
let lastIdx = arr.length - 1;
|
|
27
|
-
for (
|
|
28
|
-
const old = idxs[i];
|
|
26
|
+
for (const old of idxs) {
|
|
29
27
|
const idx = Math.min(lastIdx, old + by);
|
|
30
28
|
if (idx <= lastIdx) {
|
|
31
29
|
arr.splice(idx, 0, arr.splice(old, 1)[0]);
|
|
@@ -4,22 +4,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const util_1 = require("@jbrowse/core/util");
|
|
7
|
-
const
|
|
7
|
+
const drawLine_1 = require("../drawLine");
|
|
8
8
|
const WiggleBaseRenderer_1 = __importDefault(require("../WiggleBaseRenderer"));
|
|
9
9
|
class MultiRowLineRenderer extends WiggleBaseRenderer_1.default {
|
|
10
10
|
// @ts-expect-error
|
|
11
11
|
async draw(ctx, props) {
|
|
12
12
|
const { bpPerPx, sources, regions, features } = props;
|
|
13
13
|
const [region] = regions;
|
|
14
|
-
const groups = (0, util_1.groupBy)(
|
|
14
|
+
const groups = (0, util_1.groupBy)(features.values(), f => f.get('source'));
|
|
15
15
|
const height = props.height / sources.length;
|
|
16
16
|
const width = (region.end - region.start) / bpPerPx;
|
|
17
17
|
let feats = [];
|
|
18
18
|
ctx.save();
|
|
19
19
|
sources.forEach(source => {
|
|
20
|
-
const { reducedFeatures } = (0,
|
|
20
|
+
const { reducedFeatures } = (0, drawLine_1.drawLine)(ctx, {
|
|
21
21
|
...props,
|
|
22
|
-
features: groups[source.name],
|
|
22
|
+
features: groups[source.name] || [],
|
|
23
23
|
height,
|
|
24
24
|
colorCallback: () => source.color || 'blue',
|
|
25
25
|
});
|
|
@@ -29,7 +29,7 @@ class MultiRowLineRenderer extends WiggleBaseRenderer_1.default {
|
|
|
29
29
|
ctx.lineTo(width, height);
|
|
30
30
|
ctx.stroke();
|
|
31
31
|
ctx.translate(0, height);
|
|
32
|
-
feats =
|
|
32
|
+
feats = feats.concat(reducedFeatures);
|
|
33
33
|
});
|
|
34
34
|
ctx.restore();
|
|
35
35
|
return { reducedFeatures: feats };
|