@jbrowse/plugin-linear-genome-view 3.0.5 → 3.2.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/BaseLinearDisplay/components/BlockErrorMessage.d.ts +7 -0
- package/dist/BaseLinearDisplay/components/{BlockError.js → BlockErrorMessage.js} +6 -3
- package/dist/BaseLinearDisplay/components/BlockLoadingMessage.d.ts +6 -0
- package/dist/BaseLinearDisplay/components/BlockLoadingMessage.js +26 -0
- package/dist/BaseLinearDisplay/components/BlockMsg.js +4 -2
- package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +4 -24
- package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +9 -9
- package/dist/LaunchLinearGenomeView/index.js +9 -5
- package/dist/LinearGenomeView/components/CenterLine.js +1 -1
- package/dist/LinearGenomeView/components/Gridlines.d.ts +2 -1
- package/dist/LinearGenomeView/components/Gridlines.js +3 -4
- package/dist/LinearGenomeView/components/Header.js +2 -0
- package/dist/LinearGenomeView/components/LinearGenomeView.js +2 -49
- package/dist/LinearGenomeView/components/LinearGenomeViewContainer.d.ts +5 -0
- package/dist/LinearGenomeView/components/LinearGenomeViewContainer.js +98 -0
- package/dist/LinearGenomeView/components/MiniControls.js +0 -1
- package/dist/LinearGenomeView/components/NoTracksActiveButton.js +1 -1
- package/dist/LinearGenomeView/components/OverviewRubberband.js +2 -15
- package/dist/LinearGenomeView/components/OverviewRubberbandHoverTooltip.d.ts +10 -0
- package/dist/LinearGenomeView/components/OverviewRubberbandHoverTooltip.js +36 -0
- package/dist/LinearGenomeView/components/Rubberband.js +7 -2
- package/dist/LinearGenomeView/components/RubberbandSpan.d.ts +3 -1
- package/dist/LinearGenomeView/components/RubberbandSpan.js +13 -25
- package/dist/LinearGenomeView/components/RubberbandTooltip.d.ts +5 -0
- package/dist/LinearGenomeView/components/RubberbandTooltip.js +28 -0
- package/dist/LinearGenomeView/components/Scalebar.js +2 -2
- package/dist/LinearGenomeView/components/TrackContainer.js +9 -4
- package/dist/LinearGenomeView/components/TrackLabel.js +1 -1
- package/dist/LinearGenomeView/components/TrackLabelContainer.js +1 -1
- package/dist/LinearGenomeView/components/TrackLabelMenu.js +21 -0
- package/dist/LinearGenomeView/components/TrackRenderingContainer.js +0 -1
- package/dist/LinearGenomeView/components/TracksContainer.js +3 -4
- package/dist/LinearGenomeView/components/VerticalGuide.js +12 -5
- package/dist/LinearGenomeView/model.d.ts +31 -3
- package/dist/LinearGenomeView/model.js +84 -24
- package/dist/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +2 -2
- package/dist/LinearGenomeView/types.d.ts +5 -0
- package/esm/BaseLinearDisplay/components/BlockErrorMessage.d.ts +7 -0
- package/esm/BaseLinearDisplay/components/{BlockError.js → BlockErrorMessage.js} +6 -3
- package/esm/BaseLinearDisplay/components/BlockLoadingMessage.d.ts +6 -0
- package/esm/BaseLinearDisplay/components/BlockLoadingMessage.js +24 -0
- package/esm/BaseLinearDisplay/components/BlockMsg.js +4 -2
- package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +4 -24
- package/esm/BaseLinearDisplay/models/BaseLinearDisplayModel.js +9 -9
- package/esm/LaunchLinearGenomeView/index.js +9 -5
- package/esm/LinearGenomeView/components/CenterLine.js +1 -1
- package/esm/LinearGenomeView/components/Gridlines.d.ts +2 -1
- package/esm/LinearGenomeView/components/Gridlines.js +3 -4
- package/esm/LinearGenomeView/components/Header.js +2 -0
- package/esm/LinearGenomeView/components/LinearGenomeView.js +3 -50
- package/esm/LinearGenomeView/components/LinearGenomeViewContainer.d.ts +5 -0
- package/esm/LinearGenomeView/components/LinearGenomeViewContainer.js +60 -0
- package/esm/LinearGenomeView/components/MiniControls.js +0 -1
- package/esm/LinearGenomeView/components/NoTracksActiveButton.js +1 -1
- package/esm/LinearGenomeView/components/OverviewRubberband.js +3 -16
- package/esm/LinearGenomeView/components/OverviewRubberbandHoverTooltip.d.ts +10 -0
- package/esm/LinearGenomeView/components/OverviewRubberbandHoverTooltip.js +34 -0
- package/esm/LinearGenomeView/components/Rubberband.js +7 -2
- package/esm/LinearGenomeView/components/RubberbandSpan.d.ts +3 -1
- package/esm/LinearGenomeView/components/RubberbandSpan.js +11 -26
- package/esm/LinearGenomeView/components/RubberbandTooltip.d.ts +5 -0
- package/esm/LinearGenomeView/components/RubberbandTooltip.js +25 -0
- package/esm/LinearGenomeView/components/Scalebar.js +2 -2
- package/esm/LinearGenomeView/components/TrackContainer.js +9 -4
- package/esm/LinearGenomeView/components/TrackLabel.js +1 -1
- package/esm/LinearGenomeView/components/TrackLabelContainer.js +1 -1
- package/esm/LinearGenomeView/components/TrackLabelMenu.js +21 -0
- package/esm/LinearGenomeView/components/TrackRenderingContainer.js +0 -1
- package/esm/LinearGenomeView/components/TracksContainer.js +3 -4
- package/esm/LinearGenomeView/components/VerticalGuide.js +13 -6
- package/esm/LinearGenomeView/model.d.ts +31 -3
- package/esm/LinearGenomeView/model.js +84 -24
- package/esm/LinearGenomeView/svgcomponents/SVGLinearGenomeView.js +2 -2
- package/esm/LinearGenomeView/types.d.ts +5 -0
- package/package.json +3 -3
- package/dist/BaseLinearDisplay/components/BlockError.d.ts +0 -4
- package/esm/BaseLinearDisplay/components/BlockError.d.ts +0 -4
|
@@ -11,14 +11,17 @@ const Report_1 = __importDefault(require("@mui/icons-material/Report"));
|
|
|
11
11
|
const material_1 = require("@mui/material");
|
|
12
12
|
const mobx_react_1 = require("mobx-react");
|
|
13
13
|
const BlockMsg_1 = __importDefault(require("./BlockMsg"));
|
|
14
|
-
const
|
|
14
|
+
const BlockErrorMessage = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
15
15
|
return ((0, jsx_runtime_1.jsx)(BlockMsg_1.default, { message: `${model.error}`, severity: "error", action: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Reload track", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { "data-testid": "reload_button", onClick: () => {
|
|
16
16
|
model.reload();
|
|
17
17
|
}, children: (0, jsx_runtime_1.jsx)(Refresh_1.default, {}) }) }), (0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: "Show stack trace", children: (0, jsx_runtime_1.jsx)(material_1.IconButton, { onClick: () => {
|
|
18
18
|
(0, util_1.getSession)(model).queueDialog(onClose => [
|
|
19
19
|
ErrorMessageStackTraceDialog_1.default,
|
|
20
|
-
{
|
|
20
|
+
{
|
|
21
|
+
onClose,
|
|
22
|
+
error: model.error,
|
|
23
|
+
},
|
|
21
24
|
]);
|
|
22
25
|
}, children: (0, jsx_runtime_1.jsx)(Report_1.default, {}) }) })] }) }));
|
|
23
26
|
});
|
|
24
|
-
exports.default =
|
|
27
|
+
exports.default = BlockErrorMessage;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
|
+
const ui_1 = require("@jbrowse/core/ui");
|
|
5
|
+
const mobx_react_1 = require("mobx-react");
|
|
6
|
+
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
7
|
+
const mui_1 = require("tss-react/mui");
|
|
8
|
+
const useStyles = (0, mui_1.makeStyles)()(theme => {
|
|
9
|
+
const bg = theme.palette.action.disabledBackground;
|
|
10
|
+
return {
|
|
11
|
+
loading: {
|
|
12
|
+
paddingLeft: '0.6em',
|
|
13
|
+
backgroundColor: theme.palette.background.default,
|
|
14
|
+
backgroundImage: `repeating-linear-gradient(45deg, transparent, transparent 5px, ${bg} 5px, ${bg} 10px)`,
|
|
15
|
+
textAlign: 'center',
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
const BlockLoadingMessage = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
20
|
+
const { classes } = useStyles();
|
|
21
|
+
const { status: blockStatus } = model;
|
|
22
|
+
const { message: displayStatus } = (0, mobx_state_tree_1.getParent)(model, 2);
|
|
23
|
+
const status = displayStatus || blockStatus;
|
|
24
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: classes.loading, children: (0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, { message: status }) }));
|
|
25
|
+
});
|
|
26
|
+
exports.default = BlockLoadingMessage;
|
|
@@ -12,7 +12,9 @@ const useStyles = (0, mui_1.makeStyles)()({
|
|
|
12
12
|
});
|
|
13
13
|
function BlockMsg({ message, severity, action, }) {
|
|
14
14
|
const { classes } = useStyles();
|
|
15
|
-
return ((0, jsx_runtime_1.jsx)(material_1.Alert, {
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)(material_1.Alert, { severity: severity, action: action, classes: {
|
|
16
|
+
message: classes.ellipses,
|
|
17
|
+
}, onMouseDown: event => {
|
|
16
18
|
event.stopPropagation();
|
|
17
|
-
},
|
|
19
|
+
}, children: (0, jsx_runtime_1.jsx)(material_1.Tooltip, { title: message, children: (0, jsx_runtime_1.jsx)("div", { children: message }) }) }));
|
|
18
20
|
}
|
|
@@ -38,39 +38,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
40
40
|
const react_1 = require("react");
|
|
41
|
-
const ui_1 = require("@jbrowse/core/ui");
|
|
42
41
|
const mobx_react_1 = require("mobx-react");
|
|
43
|
-
const
|
|
44
|
-
const mui_1 = require("tss-react/mui");
|
|
42
|
+
const BlockLoadingMessage_1 = __importDefault(require("./BlockLoadingMessage"));
|
|
45
43
|
const BlockMsg_1 = __importDefault(require("./BlockMsg"));
|
|
46
|
-
const
|
|
47
|
-
const useStyles = (0, mui_1.makeStyles)()(theme => {
|
|
48
|
-
const bg = theme.palette.action.disabledBackground;
|
|
49
|
-
return {
|
|
50
|
-
loading: {
|
|
51
|
-
paddingLeft: '0.6em',
|
|
52
|
-
backgroundColor: theme.palette.background.default,
|
|
53
|
-
backgroundImage: `repeating-linear-gradient(45deg, transparent, transparent 5px, ${bg} 5px, ${bg} 10px)`,
|
|
54
|
-
textAlign: 'center',
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
});
|
|
58
|
-
const LoadingMessage = (0, mobx_react_1.observer)(({ model }) => {
|
|
59
|
-
const { classes } = useStyles();
|
|
60
|
-
const { status: blockStatus } = model;
|
|
61
|
-
const { message: displayStatus } = (0, mobx_state_tree_1.getParent)(model, 2);
|
|
62
|
-
const status = displayStatus || blockStatus;
|
|
63
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: classes.loading, children: (0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, { message: status }) }));
|
|
64
|
-
});
|
|
44
|
+
const BlockErrorMessage = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./BlockErrorMessage'))));
|
|
65
45
|
const ServerSideRenderedBlockContent = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
66
46
|
if (model.error) {
|
|
67
|
-
return ((0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: null, children: (0, jsx_runtime_1.jsx)(
|
|
47
|
+
return ((0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: null, children: (0, jsx_runtime_1.jsx)(BlockErrorMessage, { model: model }) }));
|
|
68
48
|
}
|
|
69
49
|
else if (model.message) {
|
|
70
50
|
return (0, react_1.isValidElement)(model.message) ? (model.message) : ((0, jsx_runtime_1.jsx)(BlockMsg_1.default, { message: `${model.message}`, severity: "info" }));
|
|
71
51
|
}
|
|
72
52
|
else if (!model.filled) {
|
|
73
|
-
return (0, jsx_runtime_1.jsx)(
|
|
53
|
+
return (0, jsx_runtime_1.jsx)(BlockLoadingMessage_1.default, { model: model });
|
|
74
54
|
}
|
|
75
55
|
else {
|
|
76
56
|
return model.reactElement;
|
|
@@ -117,14 +117,14 @@ function stateModelFactory() {
|
|
|
117
117
|
return (_b = (_a = self.blockState.get(blockKey)) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.getByID(id);
|
|
118
118
|
},
|
|
119
119
|
searchFeatureByID(id) {
|
|
120
|
+
var _a;
|
|
120
121
|
let ret;
|
|
121
|
-
self.blockState.
|
|
122
|
-
var _a;
|
|
122
|
+
for (const block of self.blockState.values()) {
|
|
123
123
|
const val = (_a = block.layout) === null || _a === void 0 ? void 0 : _a.getByID(id);
|
|
124
124
|
if (val) {
|
|
125
125
|
ret = val;
|
|
126
126
|
}
|
|
127
|
-
}
|
|
127
|
+
}
|
|
128
128
|
return ret;
|
|
129
129
|
},
|
|
130
130
|
}))
|
|
@@ -177,9 +177,9 @@ function stateModelFactory() {
|
|
|
177
177
|
self.setError();
|
|
178
178
|
self.setCurrStatsBpPerPx(0);
|
|
179
179
|
self.clearFeatureDensityStats();
|
|
180
|
-
|
|
180
|
+
for (const val of self.blockState.values()) {
|
|
181
181
|
val.doReload();
|
|
182
|
-
}
|
|
182
|
+
}
|
|
183
183
|
superReload();
|
|
184
184
|
},
|
|
185
185
|
};
|
|
@@ -269,17 +269,17 @@ function stateModelFactory() {
|
|
|
269
269
|
if (!view.initialized) {
|
|
270
270
|
return;
|
|
271
271
|
}
|
|
272
|
-
self.blockDefinitions.contentBlocks
|
|
272
|
+
for (const block of self.blockDefinitions.contentBlocks) {
|
|
273
273
|
blocksPresent[block.key] = true;
|
|
274
274
|
if (!self.blockState.has(block.key)) {
|
|
275
275
|
self.addBlock(block.key, block);
|
|
276
276
|
}
|
|
277
|
-
}
|
|
278
|
-
self.blockState.
|
|
277
|
+
}
|
|
278
|
+
for (const key of self.blockState.keys()) {
|
|
279
279
|
if (!blocksPresent[key]) {
|
|
280
280
|
self.deleteBlock(key);
|
|
281
281
|
}
|
|
282
|
-
}
|
|
282
|
+
}
|
|
283
283
|
}));
|
|
284
284
|
},
|
|
285
285
|
}))
|
|
@@ -23,7 +23,7 @@ function LaunchLinearGenomeViewF(pluginManager) {
|
|
|
23
23
|
view.setHideHeader(!nav);
|
|
24
24
|
}
|
|
25
25
|
if (highlight !== undefined) {
|
|
26
|
-
|
|
26
|
+
for (const h of highlight) {
|
|
27
27
|
const p = (0, util_1.parseLocString)(h, refName => assemblyManager.isValidRefName(refName, assembly));
|
|
28
28
|
const { start, end } = p;
|
|
29
29
|
if (start !== undefined && end !== undefined) {
|
|
@@ -34,13 +34,17 @@ function LaunchLinearGenomeViewF(pluginManager) {
|
|
|
34
34
|
assemblyName: assembly,
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
-
}
|
|
37
|
+
}
|
|
38
38
|
}
|
|
39
|
-
await (0, searchUtils_1.handleSelectedRegion)({
|
|
39
|
+
await (0, searchUtils_1.handleSelectedRegion)({
|
|
40
|
+
input: loc,
|
|
41
|
+
model: view,
|
|
42
|
+
assembly: asm,
|
|
43
|
+
});
|
|
40
44
|
const idsNotFound = [];
|
|
41
|
-
|
|
45
|
+
for (const track of tracks) {
|
|
42
46
|
tryTrack(view, track, idsNotFound);
|
|
43
|
-
}
|
|
47
|
+
}
|
|
44
48
|
if (idsNotFound.length) {
|
|
45
49
|
throw new Error(`Could not resolve identifiers: ${idsNotFound.join(',')}`);
|
|
46
50
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { LinearGenomeViewModel } from '..';
|
|
2
2
|
type LGV = LinearGenomeViewModel;
|
|
3
|
-
declare const Gridlines: ({ model }: {
|
|
3
|
+
declare const Gridlines: ({ model, offset, }: {
|
|
4
4
|
model: LGV;
|
|
5
|
+
offset?: number;
|
|
5
6
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
export default Gridlines;
|
|
@@ -8,15 +8,14 @@ const util_1 = require("../util");
|
|
|
8
8
|
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
9
9
|
verticalGuidesZoomContainer: {
|
|
10
10
|
position: 'absolute',
|
|
11
|
+
top: 0,
|
|
11
12
|
height: '100%',
|
|
12
13
|
width: '100%',
|
|
13
|
-
zIndex: 1,
|
|
14
14
|
pointerEvents: 'none',
|
|
15
15
|
},
|
|
16
16
|
verticalGuidesContainer: {
|
|
17
17
|
position: 'absolute',
|
|
18
18
|
height: '100%',
|
|
19
|
-
zIndex: 1,
|
|
20
19
|
pointerEvents: 'none',
|
|
21
20
|
display: 'flex',
|
|
22
21
|
},
|
|
@@ -58,13 +57,13 @@ const RenderedVerticalGuides = (0, mobx_react_1.observer)(({ model }) => {
|
|
|
58
57
|
return null;
|
|
59
58
|
}) }));
|
|
60
59
|
});
|
|
61
|
-
const Gridlines = (0, mobx_react_1.observer)(function ({ model }) {
|
|
60
|
+
const Gridlines = (0, mobx_react_1.observer)(function ({ model, offset = 0, }) {
|
|
62
61
|
const { classes } = useStyles();
|
|
63
62
|
const offsetLeft = model.staticBlocks.offsetPx - model.offsetPx;
|
|
64
63
|
return ((0, jsx_runtime_1.jsx)("div", { className: classes.verticalGuidesZoomContainer, style: {
|
|
65
64
|
transform: model.scaleFactor !== 1 ? `scaleX(${model.scaleFactor})` : undefined,
|
|
66
65
|
}, children: (0, jsx_runtime_1.jsx)("div", { className: classes.verticalGuidesContainer, style: {
|
|
67
|
-
left: offsetLeft,
|
|
66
|
+
left: offsetLeft - offset,
|
|
68
67
|
width: model.staticBlocks.totalWidthPx,
|
|
69
68
|
}, children: (0, jsx_runtime_1.jsx)(RenderedVerticalGuides, { model: model }) }) }));
|
|
70
69
|
});
|
|
@@ -13,9 +13,11 @@ const HeaderTrackSelectorButton_1 = __importDefault(require("./HeaderTrackSelect
|
|
|
13
13
|
const HeaderZoomControls_1 = __importDefault(require("./HeaderZoomControls"));
|
|
14
14
|
const OverviewScalebar_1 = __importDefault(require("./OverviewScalebar"));
|
|
15
15
|
const SearchBox_1 = __importDefault(require("./SearchBox"));
|
|
16
|
+
const consts_1 = require("../consts");
|
|
16
17
|
const useStyles = (0, mui_1.makeStyles)()({
|
|
17
18
|
headerBar: {
|
|
18
19
|
display: 'flex',
|
|
20
|
+
height: consts_1.HEADER_BAR_HEIGHT,
|
|
19
21
|
},
|
|
20
22
|
headerForm: {
|
|
21
23
|
flexWrap: 'nowrap',
|
|
@@ -39,21 +39,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
40
40
|
const react_1 = require("react");
|
|
41
41
|
const ui_1 = require("@jbrowse/core/ui");
|
|
42
|
-
const util_1 = require("@jbrowse/core/util");
|
|
43
42
|
const mobx_react_1 = require("mobx-react");
|
|
44
|
-
const
|
|
45
|
-
const TrackContainer_1 = __importDefault(require("./TrackContainer"));
|
|
46
|
-
const TracksContainer_1 = __importDefault(require("./TracksContainer"));
|
|
43
|
+
const LinearGenomeViewContainer_1 = __importDefault(require("./LinearGenomeViewContainer"));
|
|
47
44
|
const ImportForm = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./ImportForm'))));
|
|
48
|
-
const NoTracksActiveButton = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./NoTracksActiveButton'))));
|
|
49
|
-
const useStyles = (0, mui_1.makeStyles)()({
|
|
50
|
-
rel: {
|
|
51
|
-
position: 'relative',
|
|
52
|
-
},
|
|
53
|
-
top: {
|
|
54
|
-
zIndex: 1000,
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
45
|
const LinearGenomeView = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
58
46
|
const { error, initialized, hasDisplayedRegions } = model;
|
|
59
47
|
if (!initialized && !error) {
|
|
@@ -63,42 +51,7 @@ const LinearGenomeView = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
|
63
51
|
return (0, jsx_runtime_1.jsx)(ImportForm, { model: model });
|
|
64
52
|
}
|
|
65
53
|
else {
|
|
66
|
-
return (0, jsx_runtime_1.jsx)(
|
|
54
|
+
return (0, jsx_runtime_1.jsx)(LinearGenomeViewContainer_1.default, { model: model });
|
|
67
55
|
}
|
|
68
56
|
});
|
|
69
|
-
const LinearGenomeViewContainer = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
70
|
-
const { tracks } = model;
|
|
71
|
-
const { classes } = useStyles();
|
|
72
|
-
const session = (0, util_1.getSession)(model);
|
|
73
|
-
const ref = (0, react_1.useRef)(null);
|
|
74
|
-
const MiniControlsComponent = model.MiniControlsComponent();
|
|
75
|
-
const HeaderComponent = model.HeaderComponent();
|
|
76
|
-
(0, react_1.useEffect)(() => {
|
|
77
|
-
function handleSelectView(e) {
|
|
78
|
-
var _a, _b;
|
|
79
|
-
if (e.target instanceof Element && ((_a = ref.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
|
|
80
|
-
(_b = session.setFocusedViewId) === null || _b === void 0 ? void 0 : _b.call(session, model.id);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
document.addEventListener('mousedown', handleSelectView);
|
|
84
|
-
document.addEventListener('keydown', handleSelectView);
|
|
85
|
-
return () => {
|
|
86
|
-
document.removeEventListener('mousedown', handleSelectView);
|
|
87
|
-
document.removeEventListener('keydown', handleSelectView);
|
|
88
|
-
};
|
|
89
|
-
}, [session, model]);
|
|
90
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: classes.rel, ref: ref, onMouseLeave: () => {
|
|
91
|
-
session.setHovered(undefined);
|
|
92
|
-
}, onMouseMove: event => {
|
|
93
|
-
const c = ref.current;
|
|
94
|
-
if (!c) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
const { tracks } = model;
|
|
98
|
-
const leftPx = event.clientX - c.getBoundingClientRect().left;
|
|
99
|
-
const hoverPosition = model.pxToBp(leftPx);
|
|
100
|
-
const hoverFeature = tracks.find(t => t.displays[0].featureUnderMouse);
|
|
101
|
-
session.setHovered({ hoverPosition, hoverFeature });
|
|
102
|
-
}, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { model: model }), (0, jsx_runtime_1.jsx)(MiniControlsComponent, { model: model }), (0, jsx_runtime_1.jsx)(TracksContainer_1.default, { model: model, children: !tracks.length ? ((0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: null, children: (0, jsx_runtime_1.jsx)(NoTracksActiveButton, { model: model }) })) : (tracks.map(track => ((0, jsx_runtime_1.jsx)(TrackContainer_1.default, { model: model, track: track }, track.id)))) })] }));
|
|
103
|
-
});
|
|
104
57
|
exports.default = LinearGenomeView;
|
|
@@ -0,0 +1,98 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
40
|
+
const react_1 = require("react");
|
|
41
|
+
const ui_1 = require("@jbrowse/core/ui");
|
|
42
|
+
const util_1 = require("@jbrowse/core/util");
|
|
43
|
+
const Paper_1 = __importDefault(require("@mui/material/Paper"));
|
|
44
|
+
const mobx_react_1 = require("mobx-react");
|
|
45
|
+
const mui_1 = require("tss-react/mui");
|
|
46
|
+
const TrackContainer_1 = __importDefault(require("./TrackContainer"));
|
|
47
|
+
const TracksContainer_1 = __importDefault(require("./TracksContainer"));
|
|
48
|
+
const NoTracksActiveButton = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./NoTracksActiveButton'))));
|
|
49
|
+
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
50
|
+
header: {
|
|
51
|
+
background: theme.palette.background.paper,
|
|
52
|
+
top: ui_1.VIEW_HEADER_HEIGHT,
|
|
53
|
+
zIndex: 850,
|
|
54
|
+
},
|
|
55
|
+
pinnedTracks: {
|
|
56
|
+
position: 'sticky',
|
|
57
|
+
zIndex: 3,
|
|
58
|
+
},
|
|
59
|
+
rel: {
|
|
60
|
+
position: 'relative',
|
|
61
|
+
},
|
|
62
|
+
}));
|
|
63
|
+
const LinearGenomeViewContainer = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
64
|
+
const { pinnedTracks, stickyViewHeaders, pinnedTracksTop, tracks, unpinnedTracks, } = model;
|
|
65
|
+
const { classes } = useStyles();
|
|
66
|
+
const session = (0, util_1.getSession)(model);
|
|
67
|
+
const ref = (0, react_1.useRef)(null);
|
|
68
|
+
const MiniControlsComponent = model.MiniControlsComponent();
|
|
69
|
+
const HeaderComponent = model.HeaderComponent();
|
|
70
|
+
(0, react_1.useEffect)(() => {
|
|
71
|
+
function handleSelectView(e) {
|
|
72
|
+
var _a, _b;
|
|
73
|
+
if (e.target instanceof Element && ((_a = ref.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
|
|
74
|
+
(_b = session.setFocusedViewId) === null || _b === void 0 ? void 0 : _b.call(session, model.id);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
document.addEventListener('mousedown', handleSelectView);
|
|
78
|
+
document.addEventListener('keydown', handleSelectView);
|
|
79
|
+
return () => {
|
|
80
|
+
document.removeEventListener('mousedown', handleSelectView);
|
|
81
|
+
document.removeEventListener('keydown', handleSelectView);
|
|
82
|
+
};
|
|
83
|
+
}, [session, model]);
|
|
84
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: classes.rel, ref: ref, onMouseLeave: () => {
|
|
85
|
+
session.setHovered(undefined);
|
|
86
|
+
}, onMouseMove: event => {
|
|
87
|
+
const c = ref.current;
|
|
88
|
+
if (!c) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const { tracks } = model;
|
|
92
|
+
const leftPx = event.clientX - c.getBoundingClientRect().left;
|
|
93
|
+
const hoverPosition = model.pxToBp(leftPx);
|
|
94
|
+
const hoverFeature = tracks.find(t => t.displays[0].featureUnderMouse);
|
|
95
|
+
session.setHovered({ hoverPosition, hoverFeature });
|
|
96
|
+
}, children: [(0, jsx_runtime_1.jsxs)("div", { className: classes.header, style: { position: stickyViewHeaders ? 'sticky' : undefined }, children: [(0, jsx_runtime_1.jsx)(HeaderComponent, { model: model }), (0, jsx_runtime_1.jsx)(MiniControlsComponent, { model: model })] }), (0, jsx_runtime_1.jsx)(TracksContainer_1.default, { model: model, children: !tracks.length ? ((0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: null, children: (0, jsx_runtime_1.jsx)(NoTracksActiveButton, { model: model }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [pinnedTracks.length ? ((0, jsx_runtime_1.jsx)(Paper_1.default, { elevation: 6, className: classes.pinnedTracks, style: { top: pinnedTracksTop }, children: pinnedTracks.map(track => ((0, jsx_runtime_1.jsx)(TrackContainer_1.default, { model: model, track: track }, track.id))) })) : null, unpinnedTracks.map(track => ((0, jsx_runtime_1.jsx)(TrackContainer_1.default, { model: model, track: track }, track.id)))] })) })] }));
|
|
97
|
+
});
|
|
98
|
+
exports.default = LinearGenomeViewContainer;
|
|
@@ -6,9 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
7
|
const react_1 = require("react");
|
|
8
8
|
const util_1 = require("@jbrowse/core/util");
|
|
9
|
-
const material_1 = require("@mui/material");
|
|
10
9
|
const mobx_react_1 = require("mobx-react");
|
|
11
10
|
const mui_1 = require("tss-react/mui");
|
|
11
|
+
const OverviewRubberbandHoverTooltip_1 = __importDefault(require("./OverviewRubberbandHoverTooltip"));
|
|
12
12
|
const RubberbandSpan_1 = __importDefault(require("./RubberbandSpan"));
|
|
13
13
|
const util_2 = require("./util");
|
|
14
14
|
const useStyles = (0, mui_1.makeStyles)()({
|
|
@@ -22,24 +22,11 @@ const useStyles = (0, mui_1.makeStyles)()({
|
|
|
22
22
|
height: '100%',
|
|
23
23
|
width: 1,
|
|
24
24
|
position: 'absolute',
|
|
25
|
-
zIndex: 10,
|
|
26
25
|
},
|
|
27
26
|
rel: {
|
|
28
27
|
position: 'relative',
|
|
29
28
|
},
|
|
30
29
|
});
|
|
31
|
-
const HoverTooltip = (0, mobx_react_1.observer)(function ({ model, open, guideX, overview, }) {
|
|
32
|
-
var _a;
|
|
33
|
-
const { classes } = useStyles();
|
|
34
|
-
const { cytobandOffset } = model;
|
|
35
|
-
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
36
|
-
const px = overview.pxToBp(guideX - cytobandOffset);
|
|
37
|
-
const assembly = assemblyManager.get(px.assemblyName);
|
|
38
|
-
const cytoband = (_a = assembly === null || assembly === void 0 ? void 0 : assembly.cytobands) === null || _a === void 0 ? void 0 : _a.find(f => px.coord > f.get('start') &&
|
|
39
|
-
px.coord < f.get('end') &&
|
|
40
|
-
px.refName === assembly.getCanonicalRefName(f.get('refName')));
|
|
41
|
-
return ((0, jsx_runtime_1.jsx)(material_1.Tooltip, { open: open, placement: "top", title: [(0, util_1.stringify)(px), cytoband === null || cytoband === void 0 ? void 0 : cytoband.get('name')].join(' '), arrow: true, children: (0, jsx_runtime_1.jsx)("div", { className: classes.guide, style: { left: guideX } }) }));
|
|
42
|
-
});
|
|
43
30
|
const OverviewRubberband = (0, mobx_react_1.observer)(function OverviewRubberband({ model, overview, ControlComponent = (0, jsx_runtime_1.jsx)("div", {}), }) {
|
|
44
31
|
const { cytobandOffset } = model;
|
|
45
32
|
const [startX, setStartX] = (0, react_1.useState)();
|
|
@@ -109,7 +96,7 @@ const OverviewRubberband = (0, mobx_react_1.observer)(function OverviewRubberban
|
|
|
109
96
|
setGuideX(undefined);
|
|
110
97
|
}
|
|
111
98
|
if (startX === undefined) {
|
|
112
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: classes.rel, children: [guideX !== undefined ? ((0, jsx_runtime_1.jsx)(
|
|
99
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: classes.rel, children: [guideX !== undefined ? ((0, jsx_runtime_1.jsx)(OverviewRubberbandHoverTooltip_1.default, { model: model, open: !mouseDragging, overview: overview, guideX: guideX })) : null, (0, jsx_runtime_1.jsx)("div", { className: classes.rubberbandControl, ref: controlsRef, onMouseDown: mouseDown, onMouseOut: mouseOut, onMouseMove: mouseMove, children: ControlComponent })] }));
|
|
113
100
|
}
|
|
114
101
|
let left = startX || 0;
|
|
115
102
|
let width = 0;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LinearGenomeViewModel } from '..';
|
|
2
|
+
import type { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel';
|
|
3
|
+
type LGV = LinearGenomeViewModel;
|
|
4
|
+
declare const OverviewRubberbandHoverTooltip: ({ model, open, guideX, overview, }: {
|
|
5
|
+
model: LGV;
|
|
6
|
+
open: boolean;
|
|
7
|
+
guideX: number;
|
|
8
|
+
overview: Base1DViewModel;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default OverviewRubberbandHoverTooltip;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
|
+
const util_1 = require("@jbrowse/core/util");
|
|
5
|
+
const material_1 = require("@mui/material");
|
|
6
|
+
const mobx_react_1 = require("mobx-react");
|
|
7
|
+
const mui_1 = require("tss-react/mui");
|
|
8
|
+
const useStyles = (0, mui_1.makeStyles)()({
|
|
9
|
+
rubberbandControl: {
|
|
10
|
+
cursor: 'crosshair',
|
|
11
|
+
width: '100%',
|
|
12
|
+
minHeight: 8,
|
|
13
|
+
},
|
|
14
|
+
guide: {
|
|
15
|
+
pointerEvents: 'none',
|
|
16
|
+
height: '100%',
|
|
17
|
+
width: 1,
|
|
18
|
+
position: 'absolute',
|
|
19
|
+
},
|
|
20
|
+
rel: {
|
|
21
|
+
position: 'relative',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const OverviewRubberbandHoverTooltip = (0, mobx_react_1.observer)(function ({ model, open, guideX, overview, }) {
|
|
25
|
+
var _a;
|
|
26
|
+
const { classes } = useStyles();
|
|
27
|
+
const { cytobandOffset } = model;
|
|
28
|
+
const { assemblyManager } = (0, util_1.getSession)(model);
|
|
29
|
+
const px = overview.pxToBp(guideX - cytobandOffset);
|
|
30
|
+
const assembly = assemblyManager.get(px.assemblyName);
|
|
31
|
+
const cytoband = (_a = assembly === null || assembly === void 0 ? void 0 : assembly.cytobands) === null || _a === void 0 ? void 0 : _a.find(f => px.coord > f.get('start') &&
|
|
32
|
+
px.coord < f.get('end') &&
|
|
33
|
+
px.refName === assembly.getCanonicalRefName(f.get('refName')));
|
|
34
|
+
return ((0, jsx_runtime_1.jsx)(material_1.Tooltip, { open: open, placement: "top", title: [(0, util_1.stringify)(px), cytoband === null || cytoband === void 0 ? void 0 : cytoband.get('name')].join(' '), arrow: true, children: (0, jsx_runtime_1.jsx)("div", { className: classes.guide, style: { left: guideX } }) }));
|
|
35
|
+
});
|
|
36
|
+
exports.default = OverviewRubberbandHoverTooltip;
|
|
@@ -16,15 +16,20 @@ const useStyles = (0, mui_1.makeStyles)()({
|
|
|
16
16
|
cursor: 'crosshair',
|
|
17
17
|
width: '100%',
|
|
18
18
|
minHeight: 8,
|
|
19
|
+
zIndex: 825,
|
|
19
20
|
},
|
|
20
21
|
});
|
|
21
22
|
const Rubberband = (0, mobx_react_1.observer)(function ({ model, ControlComponent = (0, jsx_runtime_1.jsx)("div", {}), }) {
|
|
22
23
|
const ref = (0, react_1.useRef)(null);
|
|
23
24
|
const { classes } = useStyles();
|
|
25
|
+
const { stickyViewHeaders, rubberbandTop } = model;
|
|
24
26
|
const { guideX, rubberbandOn, leftBpOffset, rightBpOffset, numOfBpSelected, width, left, anchorPosition, open, handleMenuItemClick, handleClose, mouseMove, mouseDown, mouseOut, } = (0, useRangeSelect_1.useRangeSelect)(ref, model);
|
|
25
|
-
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [guideX !== undefined ? ((0, jsx_runtime_1.jsx)(VerticalGuide_1.default, { model: model, coordX: guideX })) : rubberbandOn ? ((0, jsx_runtime_1.jsx)(RubberbandSpan_1.default, { leftBpOffset: leftBpOffset, rightBpOffset: rightBpOffset, numOfBpSelected: numOfBpSelected, width: width, left: left })) : null, anchorPosition ? ((0, jsx_runtime_1.jsx)(ui_1.Menu, { anchorReference: "anchorPosition", anchorPosition: {
|
|
27
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [guideX !== undefined ? ((0, jsx_runtime_1.jsx)(VerticalGuide_1.default, { model: model, coordX: guideX })) : rubberbandOn ? ((0, jsx_runtime_1.jsx)(RubberbandSpan_1.default, { leftBpOffset: leftBpOffset, rightBpOffset: rightBpOffset, numOfBpSelected: numOfBpSelected, width: width, left: left, top: rubberbandTop, sticky: stickyViewHeaders })) : null, anchorPosition ? ((0, jsx_runtime_1.jsx)(ui_1.Menu, { anchorReference: "anchorPosition", anchorPosition: {
|
|
26
28
|
left: anchorPosition.clientX,
|
|
27
29
|
top: anchorPosition.clientY,
|
|
28
|
-
}, onMenuItemClick: handleMenuItemClick, open: open, onClose: handleClose, menuItems: model.rubberBandMenuItems() })) : null, (0, jsx_runtime_1.jsx)("div", { "data-testid": "rubberband_controls", className: classes.rubberbandControl,
|
|
30
|
+
}, onMenuItemClick: handleMenuItemClick, open: open, onClose: handleClose, menuItems: model.rubberBandMenuItems() })) : null, (0, jsx_runtime_1.jsx)("div", { "data-testid": "rubberband_controls", className: classes.rubberbandControl, style: {
|
|
31
|
+
top: rubberbandTop,
|
|
32
|
+
position: stickyViewHeaders ? 'sticky' : undefined,
|
|
33
|
+
}, ref: ref, onMouseDown: mouseDown, onMouseMove: mouseMove, onMouseOut: mouseOut, children: ControlComponent })] }));
|
|
29
34
|
});
|
|
30
35
|
exports.default = Rubberband;
|
|
@@ -3,11 +3,13 @@ interface Offset {
|
|
|
3
3
|
refName?: string;
|
|
4
4
|
oob?: boolean;
|
|
5
5
|
}
|
|
6
|
-
export default function RubberbandSpan({ leftBpOffset, rightBpOffset, numOfBpSelected, left, width, }: {
|
|
6
|
+
export default function RubberbandSpan({ leftBpOffset, rightBpOffset, numOfBpSelected, left, width, top, sticky, }: {
|
|
7
7
|
leftBpOffset: Offset;
|
|
8
8
|
rightBpOffset: Offset;
|
|
9
9
|
numOfBpSelected?: number;
|
|
10
10
|
left: number;
|
|
11
11
|
width: number;
|
|
12
|
+
top?: number;
|
|
13
|
+
sticky?: boolean;
|
|
12
14
|
}): import("react/jsx-runtime").JSX.Element;
|
|
13
15
|
export {};
|