@jbrowse/plugin-wiggle 2.13.1 → 2.14.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/BigWigAdapter/BigWigAdapter.d.ts +1 -1
- package/dist/BigWigAdapter/BigWigAdapter.js +1 -1
- package/dist/CreateMultiWiggleExtension/ConfirmDialog.js +12 -4
- package/dist/LinearWiggleDisplay/components/SetColorDialog.js +12 -4
- package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/dist/LinearWiggleDisplay/components/Tooltip.js +7 -2
- package/dist/LinearWiggleDisplay/models/model.d.ts +1 -1
- package/dist/LinearWiggleDisplay/models/model.js +10 -4
- package/dist/MultiLinearWiggleDisplay/components/ScoreLegend.js +1 -2
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +3 -1
- package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.js +22 -8
- package/dist/MultiLinearWiggleDisplay/components/Tooltip.js +4 -7
- package/dist/MultiLinearWiggleDisplay/components/YScaleBars.js +2 -2
- package/dist/MultiLinearWiggleDisplay/models/model.d.ts +1 -1
- package/dist/MultiLinearWiggleDisplay/models/model.js +16 -6
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
- package/dist/MultiWiggleAdapter/MultiWiggleAdapter.js +1 -3
- package/dist/MultiWiggleAddTrackWorkflow/AddTrackWorkflow.js +8 -4
- package/dist/MultiWiggleRendering.d.ts +4 -4
- package/dist/MultiWiggleRendering.js +6 -3
- package/dist/Tooltip.d.ts +1 -1
- package/dist/Tooltip.js +1 -1
- package/dist/WiggleBaseRenderer.d.ts +1 -1
- package/dist/WiggleBaseRenderer.js +1 -1
- package/dist/WiggleRPC/MultiWiggleGetSources.d.ts +1 -1
- package/dist/WiggleRPC/MultiWiggleGetSources.js +0 -1
- package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +0 -1
- package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +2 -2
- package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +0 -1
- package/dist/WiggleRendering.d.ts +3 -3
- package/dist/WiggleRendering.js +3 -3
- package/dist/drawDensity.js +5 -3
- package/dist/drawLine.js +5 -3
- package/dist/drawXY.js +5 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/shared/SetMinMaxDialog.d.ts +2 -2
- package/dist/shared/SetMinMaxDialog.js +6 -2
- package/dist/shared/YScaleBar.d.ts +1 -1
- package/dist/shared/modelShared.d.ts +5 -5
- package/dist/shared/modelShared.js +15 -5
- package/dist/util.d.ts +2 -2
- package/dist/util.js +8 -11
- package/esm/BigWigAdapter/BigWigAdapter.d.ts +1 -1
- package/esm/BigWigAdapter/BigWigAdapter.js +1 -1
- package/esm/CreateMultiWiggleExtension/ConfirmDialog.js +12 -4
- package/esm/LinearWiggleDisplay/components/SetColorDialog.js +12 -4
- package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/esm/LinearWiggleDisplay/components/Tooltip.js +7 -2
- package/esm/LinearWiggleDisplay/models/model.d.ts +1 -1
- package/esm/LinearWiggleDisplay/models/model.js +10 -4
- package/esm/MultiLinearWiggleDisplay/components/ScoreLegend.js +1 -2
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +3 -1
- package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.js +22 -8
- package/esm/MultiLinearWiggleDisplay/components/Tooltip.js +4 -7
- package/esm/MultiLinearWiggleDisplay/components/YScaleBars.js +2 -2
- package/esm/MultiLinearWiggleDisplay/models/model.d.ts +1 -1
- package/esm/MultiLinearWiggleDisplay/models/model.js +16 -6
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
- package/esm/MultiWiggleAdapter/MultiWiggleAdapter.js +1 -3
- package/esm/MultiWiggleAddTrackWorkflow/AddTrackWorkflow.js +8 -4
- package/esm/MultiWiggleRendering.d.ts +4 -4
- package/esm/MultiWiggleRendering.js +6 -3
- package/esm/Tooltip.d.ts +1 -1
- package/esm/Tooltip.js +1 -1
- package/esm/WiggleBaseRenderer.d.ts +1 -1
- package/esm/WiggleBaseRenderer.js +1 -1
- package/esm/WiggleRPC/MultiWiggleGetSources.d.ts +1 -1
- package/esm/WiggleRPC/MultiWiggleGetSources.js +0 -1
- package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +0 -1
- package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +2 -2
- package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +0 -1
- package/esm/WiggleRendering.d.ts +3 -3
- package/esm/WiggleRendering.js +3 -3
- package/esm/drawDensity.js +5 -3
- package/esm/drawLine.js +5 -3
- package/esm/drawXY.js +5 -3
- package/esm/index.d.ts +3 -3
- package/esm/index.js +1 -1
- package/esm/shared/SetMinMaxDialog.d.ts +2 -2
- package/esm/shared/SetMinMaxDialog.js +6 -2
- package/esm/shared/YScaleBar.d.ts +1 -1
- package/esm/shared/modelShared.d.ts +5 -5
- package/esm/shared/modelShared.js +15 -5
- package/esm/util.d.ts +2 -2
- package/esm/util.js +8 -11
- package/package.json +5 -6
|
@@ -14,7 +14,7 @@ export default class BigWigAdapter extends BaseFeatureDataAdapter {
|
|
|
14
14
|
header: Awaited<ReturnType<BigWig["getHeader"]>>;
|
|
15
15
|
}>;
|
|
16
16
|
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
17
|
-
refIdToName(refId: number): Promise<string>;
|
|
17
|
+
refIdToName(refId: number): Promise<string | undefined>;
|
|
18
18
|
getGlobalStats(opts?: BaseOptions): Promise<import("@jbrowse/core/util/stats").QuantitativeStats>;
|
|
19
19
|
getFeatures(region: Region, opts?: WiggleOptions): import("rxjs").Observable<Feature>;
|
|
20
20
|
getMultiRegionFeatureDensityStats(_regions: Region[]): Promise<{
|
|
@@ -18,7 +18,7 @@ class BigWigAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
18
18
|
}
|
|
19
19
|
async setup(opts) {
|
|
20
20
|
if (!this.setupP) {
|
|
21
|
-
this.setupP = this.setupPre(opts).catch(e => {
|
|
21
|
+
this.setupP = this.setupPre(opts).catch((e) => {
|
|
22
22
|
this.setupP = undefined;
|
|
23
23
|
throw e;
|
|
24
24
|
});
|
|
@@ -33,7 +33,9 @@ const configuration_1 = require("@jbrowse/core/configuration");
|
|
|
33
33
|
const ConfirmDialog = ({ tracks, onClose, }) => {
|
|
34
34
|
const [val, setVal] = (0, react_1.useState)(`MultiWiggle ${Date.now()}`);
|
|
35
35
|
const allQuant = tracks.every(t => t.type === 'QuantitativeTrack');
|
|
36
|
-
return (react_1.default.createElement(Dialog_1.default, { open: true, onClose: () =>
|
|
36
|
+
return (react_1.default.createElement(Dialog_1.default, { open: true, onClose: () => {
|
|
37
|
+
onClose(false);
|
|
38
|
+
}, title: "Confirm multi-wiggle track create" },
|
|
37
39
|
react_1.default.createElement(material_1.DialogContent, null,
|
|
38
40
|
react_1.default.createElement(material_1.Typography, null,
|
|
39
41
|
!allQuant
|
|
@@ -44,10 +46,16 @@ const ConfirmDialog = ({ tracks, onClose, }) => {
|
|
|
44
46
|
(0, configuration_1.readConfObject)(track, 'name'),
|
|
45
47
|
" - ",
|
|
46
48
|
track.type)))),
|
|
47
|
-
react_1.default.createElement(material_1.TextField, { value: val, onChange: event =>
|
|
49
|
+
react_1.default.createElement(material_1.TextField, { value: val, onChange: event => {
|
|
50
|
+
setVal(event.target.value);
|
|
51
|
+
}, helperText: "Track name" }),
|
|
48
52
|
react_1.default.createElement(material_1.Typography, null, "Confirm creation of track?")),
|
|
49
53
|
react_1.default.createElement(material_1.DialogActions, null,
|
|
50
|
-
react_1.default.createElement(material_1.Button, { onClick: () =>
|
|
51
|
-
|
|
54
|
+
react_1.default.createElement(material_1.Button, { onClick: () => {
|
|
55
|
+
onClose(false);
|
|
56
|
+
}, color: "primary" }, "Cancel"),
|
|
57
|
+
react_1.default.createElement(material_1.Button, { onClick: () => {
|
|
58
|
+
onClose(true, { name: val });
|
|
59
|
+
}, color: "primary", variant: "contained", autoFocus: true }, "Submit"))));
|
|
52
60
|
};
|
|
53
61
|
exports.default = ConfirmDialog;
|
|
@@ -33,8 +33,12 @@ const SetColorDialog = (0, mobx_react_1.observer)(function SetColorDialog({ mode
|
|
|
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,
|
|
35
35
|
react_1.default.createElement(material_1.Typography, null, "Select either an overall color, or the positive/negative colors. Note that density renderers only work properly with positive/negative colors"),
|
|
36
|
-
react_1.default.createElement(material_1.FormControlLabel, { checked: !posneg, onClick: () =>
|
|
37
|
-
|
|
36
|
+
react_1.default.createElement(material_1.FormControlLabel, { checked: !posneg, onClick: () => {
|
|
37
|
+
setPosNeg(false);
|
|
38
|
+
}, control: react_1.default.createElement(material_1.Radio, null), label: "Overall color" }),
|
|
39
|
+
react_1.default.createElement(material_1.FormControlLabel, { checked: posneg, onClick: () => {
|
|
40
|
+
setPosNeg(true);
|
|
41
|
+
}, control: react_1.default.createElement(material_1.Radio, null), label: "Positive/negative color" }),
|
|
38
42
|
posneg ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
39
43
|
react_1.default.createElement(material_1.Typography, null, "Positive color"),
|
|
40
44
|
react_1.default.createElement(ColorPicker_1.ColorPicker, { color: model.posColor || 'black', onChange: event => {
|
|
@@ -47,13 +51,17 @@ const SetColorDialog = (0, mobx_react_1.observer)(function SetColorDialog({ mode
|
|
|
47
51
|
model.setColor(undefined);
|
|
48
52
|
} }))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
49
53
|
react_1.default.createElement(material_1.Typography, null, "Overall color"),
|
|
50
|
-
react_1.default.createElement(ColorPicker_1.ColorPicker, { color: model.color || 'black', onChange: event =>
|
|
54
|
+
react_1.default.createElement(ColorPicker_1.ColorPicker, { color: model.color || 'black', onChange: event => {
|
|
55
|
+
model.setColor(event);
|
|
56
|
+
} })))),
|
|
51
57
|
react_1.default.createElement(material_1.DialogActions, null,
|
|
52
58
|
react_1.default.createElement(material_1.Button, { onClick: () => {
|
|
53
59
|
model.setPosColor(undefined);
|
|
54
60
|
model.setNegColor(undefined);
|
|
55
61
|
model.setColor(undefined);
|
|
56
62
|
}, color: "secondary", variant: "contained" }, "Restore default"),
|
|
57
|
-
react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", onClick: () =>
|
|
63
|
+
react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", type: "submit", onClick: () => {
|
|
64
|
+
handleClose();
|
|
65
|
+
} }, "Submit"))));
|
|
58
66
|
});
|
|
59
67
|
exports.default = SetColorDialog;
|
|
@@ -13,8 +13,13 @@ const en = (n) => n.toLocaleString('en-US');
|
|
|
13
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
|
-
const
|
|
17
|
-
const
|
|
16
|
+
const refName = feature.get('refName');
|
|
17
|
+
const name = feature.get('name');
|
|
18
|
+
const loc = [
|
|
19
|
+
refName,
|
|
20
|
+
name,
|
|
21
|
+
start === end ? en(start) : `${en(start)}..${en(end)}`,
|
|
22
|
+
]
|
|
18
23
|
.filter(f => !!f)
|
|
19
24
|
.join(':');
|
|
20
25
|
return feature.get('summary') !== undefined ? (react_1.default.createElement("div", { ref: ref },
|
|
@@ -155,7 +155,7 @@ declare function stateModelFactory(pluginManager: PluginManager, configSchema: A
|
|
|
155
155
|
}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree" /**
|
|
156
156
|
* #getter
|
|
157
157
|
*/)._NotCustomized>>;
|
|
158
|
-
onHorizontalScroll?:
|
|
158
|
+
onHorizontalScroll?: () => void;
|
|
159
159
|
blockState?: Record<string, any>;
|
|
160
160
|
}>;
|
|
161
161
|
readonly DisplayBlurb: React.FC<{
|
|
@@ -136,7 +136,7 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
136
136
|
if (self.filled) {
|
|
137
137
|
return 0;
|
|
138
138
|
}
|
|
139
|
-
else if (
|
|
139
|
+
else if (self.minSize === 1) {
|
|
140
140
|
return 1;
|
|
141
141
|
}
|
|
142
142
|
else {
|
|
@@ -167,7 +167,9 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
167
167
|
label: elt,
|
|
168
168
|
type: 'radio',
|
|
169
169
|
checked: self.fillSetting === idx,
|
|
170
|
-
onClick: () =>
|
|
170
|
+
onClick: () => {
|
|
171
|
+
self.setFill(idx);
|
|
172
|
+
},
|
|
171
173
|
})),
|
|
172
174
|
},
|
|
173
175
|
]
|
|
@@ -178,7 +180,9 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
178
180
|
type: 'checkbox',
|
|
179
181
|
label: 'Draw cross hatches',
|
|
180
182
|
checked: self.displayCrossHatchesSetting,
|
|
181
|
-
onClick: () =>
|
|
183
|
+
onClick: () => {
|
|
184
|
+
self.toggleCrossHatches();
|
|
185
|
+
},
|
|
182
186
|
},
|
|
183
187
|
]
|
|
184
188
|
: []),
|
|
@@ -190,7 +194,9 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
190
194
|
label: key,
|
|
191
195
|
type: 'radio',
|
|
192
196
|
checked: self.rendererTypeNameSimple === key,
|
|
193
|
-
onClick: () =>
|
|
197
|
+
onClick: () => {
|
|
198
|
+
self.setRendererType(key);
|
|
199
|
+
},
|
|
194
200
|
})),
|
|
195
201
|
},
|
|
196
202
|
]
|
|
@@ -10,8 +10,7 @@ const RectBg_1 = __importDefault(require("./RectBg"));
|
|
|
10
10
|
const ScoreLegend = (0, mobx_react_1.observer)(({ model }) => {
|
|
11
11
|
const { ticks, scaleType } = model;
|
|
12
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)' : '');
|
|
13
|
+
const legend = `[${ticks === null || ticks === void 0 ? void 0 : ticks.values[0]}-${ticks === null || ticks === void 0 ? void 0 : ticks.values[1]}]${scaleType === 'log' ? ' (log scale)' : ''}`;
|
|
15
14
|
const len = (0, util_1.measureText)(legend, 14);
|
|
16
15
|
const padding = 25;
|
|
17
16
|
const xpos = width - len - padding;
|
|
@@ -47,7 +47,9 @@ function SetColorDialog({ model, handleClose, }) {
|
|
|
47
47
|
const [showTips, setShowTips] = (0, util_1.useLocalStorage)('multiwiggle-showTips', true);
|
|
48
48
|
return (react_1.default.createElement(DraggableDialog_1.default, { open: true, onClose: handleClose, maxWidth: "xl", title: 'Multi-wiggle color/arrangement editor' },
|
|
49
49
|
react_1.default.createElement(material_1.DialogContent, { className: classes.content },
|
|
50
|
-
react_1.default.createElement(material_1.Button, { variant: "contained", style: { float: 'right' }, onClick: () =>
|
|
50
|
+
react_1.default.createElement(material_1.Button, { variant: "contained", style: { float: 'right' }, onClick: () => {
|
|
51
|
+
setShowTips(!showTips);
|
|
52
|
+
} }, showTips ? 'Hide tips' : 'Show tips'),
|
|
51
53
|
react_1.default.createElement("br", null),
|
|
52
54
|
showTips ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
53
55
|
"Helpful tips",
|
|
@@ -58,17 +58,27 @@ function SourcesGrid({ rows, onChange, showTips, }) {
|
|
|
58
58
|
field: null,
|
|
59
59
|
});
|
|
60
60
|
return (react_1.default.createElement("div", null,
|
|
61
|
-
react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event =>
|
|
62
|
-
|
|
61
|
+
react_1.default.createElement(material_1.Button, { disabled: !selected.length, onClick: event => {
|
|
62
|
+
setAnchorEl(event.currentTarget);
|
|
63
|
+
} }, "Change color of selected items"),
|
|
64
|
+
react_1.default.createElement(material_1.Button, { onClick: () => {
|
|
65
|
+
onChange((0, util_2.moveUp)([...rows], selected));
|
|
66
|
+
}, disabled: !selected.length },
|
|
63
67
|
react_1.default.createElement(KeyboardArrowUp_1.default, null),
|
|
64
68
|
showTips ? 'Move selected items up' : null),
|
|
65
|
-
react_1.default.createElement(material_1.Button, { onClick: () =>
|
|
69
|
+
react_1.default.createElement(material_1.Button, { onClick: () => {
|
|
70
|
+
onChange((0, util_2.moveDown)([...rows], selected));
|
|
71
|
+
}, disabled: !selected.length },
|
|
66
72
|
react_1.default.createElement(KeyboardArrowDown_1.default, null),
|
|
67
73
|
showTips ? 'Move selected items down' : null),
|
|
68
|
-
react_1.default.createElement(material_1.Button, { onClick: () =>
|
|
74
|
+
react_1.default.createElement(material_1.Button, { onClick: () => {
|
|
75
|
+
onChange((0, util_2.moveUp)([...rows], selected, rows.length));
|
|
76
|
+
}, disabled: !selected.length },
|
|
69
77
|
react_1.default.createElement(KeyboardDoubleArrowUp_1.default, null),
|
|
70
78
|
showTips ? 'Move selected items to top' : null),
|
|
71
|
-
react_1.default.createElement(material_1.Button, { onClick: () =>
|
|
79
|
+
react_1.default.createElement(material_1.Button, { onClick: () => {
|
|
80
|
+
onChange((0, util_2.moveDown)([...rows], selected, rows.length));
|
|
81
|
+
}, disabled: !selected.length },
|
|
72
82
|
react_1.default.createElement(KeyboardDoubleArrowDown_1.default, null),
|
|
73
83
|
showTips ? 'Move selected items to bottom' : null),
|
|
74
84
|
react_1.default.createElement(ColorPicker_1.ColorPopover, { anchorEl: anchorEl, color: widgetColor, onChange: c => {
|
|
@@ -80,9 +90,13 @@ function SourcesGrid({ rows, onChange, showTips, }) {
|
|
|
80
90
|
}
|
|
81
91
|
});
|
|
82
92
|
onChange([...rows]);
|
|
83
|
-
}, onClose: () =>
|
|
93
|
+
}, onClose: () => {
|
|
94
|
+
setAnchorEl(null);
|
|
95
|
+
} }),
|
|
84
96
|
react_1.default.createElement("div", { style: { height: 400, width: '100%' } },
|
|
85
|
-
react_1.default.createElement(x_data_grid_1.DataGrid, { getRowId: row => row.name, checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg =>
|
|
97
|
+
react_1.default.createElement(x_data_grid_1.DataGrid, { getRowId: row => row.name, checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg => {
|
|
98
|
+
setSelected(arg);
|
|
99
|
+
}, rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
|
|
86
100
|
{
|
|
87
101
|
field: 'color',
|
|
88
102
|
headerName: 'Color',
|
|
@@ -117,7 +131,7 @@ function SourcesGrid({ rows, onChange, showTips, }) {
|
|
|
117
131
|
// thing since we are controlling sort instead of the default data
|
|
118
132
|
// grid sort anyways
|
|
119
133
|
const idx = (currSort.idx + 1) % 2;
|
|
120
|
-
const field =
|
|
134
|
+
const field = sort.field || currSort.field;
|
|
121
135
|
setCurrSort({ idx, field });
|
|
122
136
|
onChange(field
|
|
123
137
|
? [...rows].sort((a, b) => {
|
|
@@ -28,13 +28,10 @@ const TooltipContents = react_1.default.forwardRef(function TooltipContents2({ m
|
|
|
28
28
|
react_1.default.createElement("th", null, "color"),
|
|
29
29
|
react_1.default.createElement("th", null, "source"),
|
|
30
30
|
react_1.default.createElement("th", null, "score"))),
|
|
31
|
-
react_1.default.createElement("tbody", null, Object.entries(sources).map(([source, data]) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
react_1.default.createElement("td", null, source),
|
|
36
|
-
react_1.default.createElement("td", null, (0, util_1.toP)(data.score))));
|
|
37
|
-
})))) : (react_1.default.createElement("span", null,
|
|
31
|
+
react_1.default.createElement("tbody", null, Object.entries(sources).map(([source, data]) => (react_1.default.createElement("tr", { key: source },
|
|
32
|
+
react_1.default.createElement("td", { style: { background: obj[source].color } }, " "),
|
|
33
|
+
react_1.default.createElement("td", null, source),
|
|
34
|
+
react_1.default.createElement("td", null, (0, util_1.toP)(data.score)))))))) : (react_1.default.createElement("span", null,
|
|
38
35
|
source,
|
|
39
36
|
' ',
|
|
40
37
|
summary
|
|
@@ -33,9 +33,9 @@ exports.YScaleBars = (0, mobx_react_1.observer)(function (props) {
|
|
|
33
33
|
if (!ready) {
|
|
34
34
|
return null;
|
|
35
35
|
}
|
|
36
|
-
const labelWidth = Math.max(...
|
|
36
|
+
const labelWidth = Math.max(...sources
|
|
37
37
|
.map(s => (0, util_1.measureText)(s.name, svgFontSize))
|
|
38
|
-
.map(width => (canDisplayLabel ? width : minWidth))
|
|
38
|
+
.map(width => (canDisplayLabel ? width : minWidth)));
|
|
39
39
|
return (react_1.default.createElement(Wrapper, { ...props }, needsFullHeightScalebar ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
40
40
|
react_1.default.createElement("g", { transform: `translate(${!exportSVG ? (0, util_2.getOffset)(model) : 0},0)` },
|
|
41
41
|
react_1.default.createElement(YScaleBar_1.default, { model: model, orientation: orientation })),
|
|
@@ -157,7 +157,7 @@ export declare function stateModelFactory(pluginManager: PluginManager, configSc
|
|
|
157
157
|
}, import("mobx-state-tree" /**
|
|
158
158
|
* #property
|
|
159
159
|
*/)._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
160
|
-
onHorizontalScroll?:
|
|
160
|
+
onHorizontalScroll?: () => void;
|
|
161
161
|
blockState?: Record<string, any>;
|
|
162
162
|
}>;
|
|
163
163
|
readonly DisplayBlurb: React.FC<{
|
|
@@ -277,8 +277,12 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
277
277
|
scaleOpts,
|
|
278
278
|
sources,
|
|
279
279
|
ticks,
|
|
280
|
-
onMouseMove: (_, f) =>
|
|
281
|
-
|
|
280
|
+
onMouseMove: (_, f) => {
|
|
281
|
+
self.setFeatureUnderMouse(f);
|
|
282
|
+
},
|
|
283
|
+
onMouseLeave: () => {
|
|
284
|
+
self.setFeatureUnderMouse(undefined);
|
|
285
|
+
},
|
|
282
286
|
};
|
|
283
287
|
},
|
|
284
288
|
/**
|
|
@@ -300,7 +304,7 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
300
304
|
if (self.filled) {
|
|
301
305
|
return 0;
|
|
302
306
|
}
|
|
303
|
-
else if (
|
|
307
|
+
else if (self.minSize === 1) {
|
|
304
308
|
return 1;
|
|
305
309
|
}
|
|
306
310
|
else {
|
|
@@ -331,7 +335,9 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
331
335
|
label: elt,
|
|
332
336
|
type: 'radio',
|
|
333
337
|
checked: self.fillSetting === idx,
|
|
334
|
-
onClick: () =>
|
|
338
|
+
onClick: () => {
|
|
339
|
+
self.setFill(idx);
|
|
340
|
+
},
|
|
335
341
|
})),
|
|
336
342
|
},
|
|
337
343
|
]
|
|
@@ -342,7 +348,9 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
342
348
|
type: 'checkbox',
|
|
343
349
|
label: 'Draw cross hatches',
|
|
344
350
|
checked: self.displayCrossHatchesSetting,
|
|
345
|
-
onClick: () =>
|
|
351
|
+
onClick: () => {
|
|
352
|
+
self.toggleCrossHatches();
|
|
353
|
+
},
|
|
346
354
|
},
|
|
347
355
|
]
|
|
348
356
|
: []),
|
|
@@ -360,7 +368,9 @@ function stateModelFactory(pluginManager, configSchema) {
|
|
|
360
368
|
label: key,
|
|
361
369
|
type: 'radio',
|
|
362
370
|
checked: self.rendererTypeNameSimple === key,
|
|
363
|
-
onClick: () =>
|
|
371
|
+
onClick: () => {
|
|
372
|
+
self.setRendererType(key);
|
|
373
|
+
},
|
|
364
374
|
})),
|
|
365
375
|
},
|
|
366
376
|
]
|
|
@@ -10,7 +10,7 @@ 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
|
-
const
|
|
13
|
+
const region = regions[0];
|
|
14
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;
|
|
@@ -10,7 +10,7 @@ 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
|
-
const
|
|
13
|
+
const region = regions[0];
|
|
14
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;
|
|
@@ -26,9 +26,7 @@ class MultiWiggleAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
26
26
|
},
|
|
27
27
|
}));
|
|
28
28
|
}
|
|
29
|
-
return Promise.all(
|
|
30
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
|
-
subConfs.map(async (conf) => {
|
|
29
|
+
return Promise.all(subConfs.map(async (conf) => {
|
|
32
30
|
const dataAdapter = (await getSubAdapter(conf))
|
|
33
31
|
.dataAdapter;
|
|
34
32
|
return {
|
|
@@ -51,11 +51,13 @@ function MultiWiggleWidget({ model }) {
|
|
|
51
51
|
react_1.default.createElement("ul", null,
|
|
52
52
|
react_1.default.createElement("li", null, "Enter list of URLs for bigwig files in the textbox"),
|
|
53
53
|
react_1.default.createElement("li", null, "Or, use the button below the text box to select files from your computer")),
|
|
54
|
-
react_1.default.createElement(material_1.TextField, { multiline: true, rows: 10, value: val, onChange: event =>
|
|
54
|
+
react_1.default.createElement(material_1.TextField, { multiline: true, rows: 10, value: val, onChange: event => {
|
|
55
|
+
setVal(event.target.value);
|
|
56
|
+
}, placeholder: 'Paste list of URLs here, or use file selector below', variant: "outlined", className: classes.textbox }),
|
|
55
57
|
react_1.default.createElement(material_1.Button, { variant: "outlined", component: "label" },
|
|
56
58
|
"Choose Files from your computer",
|
|
57
59
|
react_1.default.createElement("input", { type: "file", hidden: true, multiple: true, onChange: ({ target }) => {
|
|
58
|
-
const res = [...(
|
|
60
|
+
const res = [...(target.files || [])].map(file => ({
|
|
59
61
|
type: 'BigWigAdapter',
|
|
60
62
|
bigWigLocation: util_1.isElectron
|
|
61
63
|
? {
|
|
@@ -67,13 +69,15 @@ function MultiWiggleWidget({ model }) {
|
|
|
67
69
|
}));
|
|
68
70
|
setVal(JSON.stringify(res, null, 2));
|
|
69
71
|
} })),
|
|
70
|
-
react_1.default.createElement(material_1.TextField, { value: trackName, onChange: event =>
|
|
72
|
+
react_1.default.createElement(material_1.TextField, { value: trackName, onChange: event => {
|
|
73
|
+
setTrackName(event.target.value);
|
|
74
|
+
}, helperText: "Track name" }),
|
|
71
75
|
react_1.default.createElement(material_1.Button, { variant: "contained", className: classes.submit, onClick: () => {
|
|
72
76
|
var _a;
|
|
73
77
|
const session = (0, util_1.getSession)(model);
|
|
74
78
|
const trackId = [
|
|
75
79
|
`${trackName.toLowerCase().replaceAll(' ', '_')}-${Date.now()}`,
|
|
76
|
-
|
|
80
|
+
session.adminMode ? '' : '-sessionTrack',
|
|
77
81
|
].join('');
|
|
78
82
|
// allow list of bigwigs in JSON format or line-by-line
|
|
79
83
|
let bigWigs;
|
|
@@ -8,13 +8,13 @@ declare const MultiWiggleRendering: (props: {
|
|
|
8
8
|
bpPerPx: number;
|
|
9
9
|
width: number;
|
|
10
10
|
height: number;
|
|
11
|
-
onMouseLeave: Function;
|
|
12
|
-
onMouseMove: Function;
|
|
13
|
-
onFeatureClick: Function;
|
|
14
11
|
blockKey: string;
|
|
15
12
|
sources: Source[];
|
|
16
|
-
displayModel
|
|
13
|
+
displayModel?: {
|
|
17
14
|
isMultiRow: boolean;
|
|
18
15
|
};
|
|
16
|
+
onMouseLeave?: (event: React.MouseEvent) => void;
|
|
17
|
+
onMouseMove?: (event: React.MouseEvent, arg?: Feature) => void;
|
|
18
|
+
onFeatureClick?: (event: React.MouseEvent, arg?: Feature) => void;
|
|
19
19
|
}) => React.JSX.Element;
|
|
20
20
|
export default MultiWiggleRendering;
|
|
@@ -29,8 +29,9 @@ const util_1 = require("@jbrowse/core/util");
|
|
|
29
29
|
const ui_1 = require("@jbrowse/core/ui");
|
|
30
30
|
const MultiWiggleRendering = (0, mobx_react_1.observer)(function (props) {
|
|
31
31
|
const { regions, features, bpPerPx, width, height, sources, onMouseLeave = () => { }, onMouseMove = () => { }, onFeatureClick = () => { }, displayModel, } = props;
|
|
32
|
-
const
|
|
32
|
+
const region = regions[0];
|
|
33
33
|
const ref = (0, react_1.useRef)(null);
|
|
34
|
+
const { isMultiRow } = displayModel || {};
|
|
34
35
|
function getFeatureUnderMouse(eventClientX, eventClientY) {
|
|
35
36
|
if (!ref.current) {
|
|
36
37
|
return;
|
|
@@ -45,7 +46,7 @@ const MultiWiggleRendering = (0, mobx_react_1.observer)(function (props) {
|
|
|
45
46
|
const px = region.reversed ? width - offsetX : offsetX;
|
|
46
47
|
const mouseoverBp = region.start + bpPerPx * px;
|
|
47
48
|
let featureUnderMouse;
|
|
48
|
-
if (
|
|
49
|
+
if (isMultiRow) {
|
|
49
50
|
for (const feature of features.values()) {
|
|
50
51
|
if (feature.get('source') !== source.name) {
|
|
51
52
|
continue;
|
|
@@ -91,7 +92,9 @@ const MultiWiggleRendering = (0, mobx_react_1.observer)(function (props) {
|
|
|
91
92
|
const { clientX, clientY } = event;
|
|
92
93
|
const featureUnderMouse = getFeatureUnderMouse(clientX, clientY);
|
|
93
94
|
onFeatureClick(event, featureUnderMouse);
|
|
94
|
-
}, onMouseLeave: event =>
|
|
95
|
+
}, onMouseLeave: event => {
|
|
96
|
+
onMouseLeave(event);
|
|
97
|
+
}, style: {
|
|
95
98
|
overflow: 'visible',
|
|
96
99
|
position: 'relative',
|
|
97
100
|
height,
|
package/dist/Tooltip.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type TooltipContentsComponent = React.ForwardRefExoticComponent<{
|
|
|
7
7
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
8
8
|
declare const Tooltip: ({ model, height, clientMouseCoord, offsetMouseCoord, clientRect, TooltipContents, useClientY, }: {
|
|
9
9
|
model: {
|
|
10
|
-
featureUnderMouse
|
|
10
|
+
featureUnderMouse?: Feature;
|
|
11
11
|
};
|
|
12
12
|
useClientY?: boolean;
|
|
13
13
|
height: number;
|
package/dist/Tooltip.js
CHANGED
|
@@ -50,7 +50,7 @@ const Tooltip = (0, mobx_react_1.observer)(function Tooltip({ model, height, cli
|
|
|
50
50
|
const y = useClientY ? clientMouseCoord[1] : (clientRect === null || clientRect === void 0 ? void 0 : clientRect.top) || 0;
|
|
51
51
|
const clientPoint = (0, react_2.useClientPoint)(context, { x, y });
|
|
52
52
|
const { getFloatingProps } = (0, react_2.useInteractions)([clientPoint]);
|
|
53
|
-
const popperTheme = (_a = theme
|
|
53
|
+
const popperTheme = (_a = theme.components) === null || _a === void 0 ? void 0 : _a.MuiPopper;
|
|
54
54
|
return featureUnderMouse ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
55
55
|
react_1.default.createElement(material_1.Portal, { container: (_b = popperTheme === null || popperTheme === void 0 ? void 0 : popperTheme.defaultProps) === null || _b === void 0 ? void 0 : _b.container },
|
|
56
56
|
react_1.default.createElement("div", { className: classes.tooltip, ref: refs.setFloating, style: {
|
|
@@ -52,6 +52,6 @@ export default abstract class WiggleBaseRenderer extends FeatureRendererType {
|
|
|
52
52
|
* draw features to context given props, to be used by derived renderer
|
|
53
53
|
* classes
|
|
54
54
|
*/
|
|
55
|
-
abstract draw<T extends RenderArgsDeserializedWithFeatures>(ctx: CanvasRenderingContext2D, props: T): Promise<Record<string, unknown> |
|
|
55
|
+
abstract draw<T extends RenderArgsDeserializedWithFeatures>(ctx: CanvasRenderingContext2D, props: T): Promise<Record<string, unknown> | undefined>;
|
|
56
56
|
}
|
|
57
57
|
export { type RenderArgsSerialized, type RenderResults, type ResultsDeserialized, type ResultsSerialized, } from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType';
|
|
@@ -13,7 +13,7 @@ class WiggleBaseRenderer extends FeatureRendererType_1.default {
|
|
|
13
13
|
async render(renderProps) {
|
|
14
14
|
const features = await this.getFeatures(renderProps);
|
|
15
15
|
const { height, regions, bpPerPx } = renderProps;
|
|
16
|
-
const
|
|
16
|
+
const region = regions[0];
|
|
17
17
|
const width = (region.end - region.start) / bpPerPx;
|
|
18
18
|
// @ts-expect-error
|
|
19
19
|
const { reducedFeatures, ...rest } = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => this.draw(ctx, {
|
|
@@ -9,7 +9,7 @@ export declare class MultiWiggleGetSources extends RpcMethodType {
|
|
|
9
9
|
serializeArguments(args: RenderArgs & {
|
|
10
10
|
signal?: AbortSignal;
|
|
11
11
|
statusCallback?: (arg: string) => void;
|
|
12
|
-
}, rpcDriverClassName: string): Promise<
|
|
12
|
+
}, rpcDriverClassName: string): Promise<Record<string, unknown>>;
|
|
13
13
|
execute(args: {
|
|
14
14
|
adapterConfig: AnyConfigurationModel;
|
|
15
15
|
signal?: RemoteAbortSignal;
|
|
@@ -13,7 +13,6 @@ class MultiWiggleGetSources extends RpcMethodType_1.default {
|
|
|
13
13
|
super(...arguments);
|
|
14
14
|
this.name = 'MultiWiggleGetSources';
|
|
15
15
|
}
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
16
|
async deserializeArguments(args, rpcDriverClassName) {
|
|
18
17
|
const l = await super.deserializeArguments(args, rpcDriverClassName);
|
|
19
18
|
return {
|
|
@@ -12,7 +12,6 @@ class WiggleGetGlobalQuantitativeStats extends RpcMethodType_1.default {
|
|
|
12
12
|
super(...arguments);
|
|
13
13
|
this.name = 'WiggleGetGlobalQuantitativeStats';
|
|
14
14
|
}
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
15
|
async deserializeArguments(args, rpcDriverClassName) {
|
|
17
16
|
const l = await super.deserializeArguments(args, rpcDriverClassName);
|
|
18
17
|
return {
|
|
@@ -8,9 +8,9 @@ export declare class WiggleGetMultiRegionQuantitativeStats extends RpcMethodType
|
|
|
8
8
|
serializeArguments(args: RenderArgs & {
|
|
9
9
|
signal?: AbortSignal;
|
|
10
10
|
statusCallback?: (arg: string) => void;
|
|
11
|
-
}, rpcDriverClassName: string): Promise<
|
|
11
|
+
}, rpcDriverClassName: string): Promise<Record<string, unknown>>;
|
|
12
12
|
execute(args: {
|
|
13
|
-
adapterConfig:
|
|
13
|
+
adapterConfig: Record<string, unknown>;
|
|
14
14
|
signal?: RemoteAbortSignal;
|
|
15
15
|
sessionId: string;
|
|
16
16
|
headers?: Record<string, string>;
|
|
@@ -13,7 +13,6 @@ class WiggleGetMultiRegionQuantitativeStats extends RpcMethodType_1.default {
|
|
|
13
13
|
super(...arguments);
|
|
14
14
|
this.name = 'WiggleGetMultiRegionQuantitativeStats';
|
|
15
15
|
}
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
16
|
async deserializeArguments(args, rpcDriverClassName) {
|
|
18
17
|
const l = await super.deserializeArguments(args, rpcDriverClassName);
|
|
19
18
|
return {
|
|
@@ -7,9 +7,9 @@ declare const WiggleRendering: (props: {
|
|
|
7
7
|
bpPerPx: number;
|
|
8
8
|
width: number;
|
|
9
9
|
height: number;
|
|
10
|
-
onMouseLeave: Function;
|
|
11
|
-
onMouseMove: Function;
|
|
12
|
-
onFeatureClick: Function;
|
|
13
10
|
blockKey: string;
|
|
11
|
+
onMouseLeave?: (event: React.MouseEvent) => void;
|
|
12
|
+
onMouseMove?: (event: React.MouseEvent, arg?: string) => void;
|
|
13
|
+
onFeatureClick?: (event: React.MouseEvent, arg?: string) => void;
|
|
14
14
|
}) => React.JSX.Element;
|
|
15
15
|
export default WiggleRendering;
|
package/dist/WiggleRendering.js
CHANGED
|
@@ -27,8 +27,8 @@ const mobx_react_1 = require("mobx-react");
|
|
|
27
27
|
const react_1 = __importStar(require("react"));
|
|
28
28
|
const ui_1 = require("@jbrowse/core/ui");
|
|
29
29
|
const WiggleRendering = (0, mobx_react_1.observer)(function (props) {
|
|
30
|
-
const { regions, features, bpPerPx, width, height, onMouseLeave
|
|
31
|
-
const
|
|
30
|
+
const { regions, features, bpPerPx, width, height, onMouseLeave, onMouseMove, onFeatureClick, } = props;
|
|
31
|
+
const region = regions[0];
|
|
32
32
|
const ref = (0, react_1.useRef)(null);
|
|
33
33
|
function getFeatureUnderMouse(eventClientX) {
|
|
34
34
|
// calculates feature under mouse
|
|
@@ -50,7 +50,7 @@ const WiggleRendering = (0, mobx_react_1.observer)(function (props) {
|
|
|
50
50
|
}
|
|
51
51
|
return featureUnderMouse;
|
|
52
52
|
}
|
|
53
|
-
return (react_1.default.createElement("div", { ref: ref, "data-testid": "wiggle-rendering-test", onMouseMove:
|
|
53
|
+
return (react_1.default.createElement("div", { ref: ref, "data-testid": "wiggle-rendering-test", onMouseMove: e => { var _a; return onMouseMove === null || onMouseMove === void 0 ? void 0 : onMouseMove(e, (_a = getFeatureUnderMouse(e.clientX)) === null || _a === void 0 ? void 0 : _a.id()); }, onClick: e => { var _a; return onFeatureClick === null || onFeatureClick === void 0 ? void 0 : onFeatureClick(e, (_a = getFeatureUnderMouse(e.clientX)) === null || _a === void 0 ? void 0 : _a.id()); }, onMouseLeave: e => onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(e), style: {
|
|
54
54
|
overflow: 'visible',
|
|
55
55
|
position: 'relative',
|
|
56
56
|
height,
|
package/dist/drawDensity.js
CHANGED
|
@@ -9,7 +9,7 @@ const fudgeFactor = 0.3;
|
|
|
9
9
|
const clipHeight = 2;
|
|
10
10
|
function drawDensity(ctx, props) {
|
|
11
11
|
const { features, regions, bpPerPx, scaleOpts, height, config } = props;
|
|
12
|
-
const
|
|
12
|
+
const region = regions[0];
|
|
13
13
|
const pivot = (0, configuration_1.readConfObject)(config, 'bicolorPivot');
|
|
14
14
|
const pivotValue = (0, configuration_1.readConfObject)(config, 'bicolorPivotValue');
|
|
15
15
|
const negColor = (0, configuration_1.readConfObject)(config, 'negColor');
|
|
@@ -26,8 +26,10 @@ function drawDensity(ctx, props) {
|
|
|
26
26
|
const cb = color === '#f0f'
|
|
27
27
|
? (_, score) => scale(score)
|
|
28
28
|
: (feature, score) => (0, configuration_1.readConfObject)(config, 'color', { feature, score });
|
|
29
|
-
const
|
|
30
|
-
|
|
29
|
+
const domain = scale2.domain();
|
|
30
|
+
const niceMin = domain[0];
|
|
31
|
+
const niceMax = domain[1];
|
|
32
|
+
let prevLeftPx = Number.NEGATIVE_INFINITY;
|
|
31
33
|
let hasClipping = false;
|
|
32
34
|
const reducedFeatures = [];
|
|
33
35
|
for (const feature of features.values()) {
|