@jbrowse/plugin-linear-genome-view 1.6.9 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js +232 -0
- package/dist/BaseLinearDisplay/components/Block.js +86 -0
- package/dist/BaseLinearDisplay/components/LinearBlocks.js +110 -0
- package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +192 -0
- package/dist/BaseLinearDisplay/index.js +41 -0
- package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +763 -0
- package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js +24 -0
- package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +328 -0
- package/dist/LinearBareDisplay/configSchema.js +19 -0
- package/dist/LinearBareDisplay/index.js +21 -0
- package/dist/LinearBareDisplay/index.test.js +33 -0
- package/dist/LinearBareDisplay/model.js +44 -0
- package/dist/LinearBasicDisplay/components/SetMaxHeight.js +94 -0
- package/dist/LinearBasicDisplay/configSchema.js +25 -0
- package/dist/LinearBasicDisplay/index.js +23 -0
- package/dist/LinearBasicDisplay/model.js +162 -0
- package/dist/LinearGenomeView/components/CenterLine.js +80 -0
- package/dist/LinearGenomeView/components/ExportSvgDialog.js +137 -0
- package/dist/LinearGenomeView/components/Header.js +144 -0
- package/dist/LinearGenomeView/components/HelpDialog.js +48 -0
- package/dist/LinearGenomeView/components/ImportForm.js +330 -0
- package/dist/LinearGenomeView/components/LinearGenomeView.js +129 -0
- package/dist/LinearGenomeView/components/LinearGenomeView.test.js +234 -0
- package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +349 -0
- package/dist/LinearGenomeView/components/MiniControls.js +83 -0
- package/dist/LinearGenomeView/components/OverviewRubberBand.js +310 -0
- package/dist/LinearGenomeView/components/OverviewScaleBar.js +403 -0
- package/dist/LinearGenomeView/components/RefNameAutocomplete.js +331 -0
- package/dist/LinearGenomeView/components/RubberBand.js +309 -0
- package/dist/LinearGenomeView/components/Ruler.js +101 -0
- package/dist/LinearGenomeView/components/ScaleBar.js +184 -0
- package/dist/LinearGenomeView/components/ScaleBar.test.js +180 -0
- package/dist/LinearGenomeView/components/SearchBox.js +201 -0
- package/dist/LinearGenomeView/components/SearchResultsDialog.js +159 -0
- package/dist/LinearGenomeView/components/SequenceDialog.js +304 -0
- package/dist/LinearGenomeView/components/TrackContainer.js +179 -0
- package/dist/LinearGenomeView/components/TrackLabel.js +165 -0
- package/dist/LinearGenomeView/components/TracksContainer.js +214 -0
- package/dist/LinearGenomeView/components/VerticalGuides.js +116 -0
- package/dist/LinearGenomeView/components/ZoomControls.js +92 -0
- package/dist/LinearGenomeView/components/util.js +16 -0
- package/dist/LinearGenomeView/index.js +1418 -0
- package/dist/LinearGenomeView/index.test.js +1170 -0
- package/dist/LinearGenomeView/util.js +93 -0
- package/dist/LinearGenomeView/util.test.js +78 -0
- package/dist/index.js +293 -6
- package/package.json +4 -8
- package/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx +2 -0
- package/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +10 -8
- package/src/LinearBasicDisplay/components/SetMaxHeight.tsx +1 -1
- package/src/LinearBasicDisplay/model.ts +17 -18
- package/src/LinearGenomeView/components/Header.tsx +1 -1
- package/src/LinearGenomeView/components/ImportForm.tsx +10 -4
- package/src/LinearGenomeView/components/LinearGenomeView.test.js +1 -0
- package/src/LinearGenomeView/components/OverviewScaleBar.tsx +2 -2
- package/src/LinearGenomeView/components/RubberBand.tsx +14 -24
- package/src/LinearGenomeView/components/ScaleBar.test.tsx +1 -0
- package/src/LinearGenomeView/components/ScaleBar.tsx +3 -6
- package/src/LinearGenomeView/components/SequenceDialog.tsx +1 -1
- package/src/LinearGenomeView/components/TrackLabel.tsx +1 -1
- package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap +0 -4
- package/src/LinearGenomeView/index.tsx +2 -3
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = SearchResultsDialog;
|
|
9
|
+
exports.useStyles = void 0;
|
|
10
|
+
|
|
11
|
+
var _react = _interopRequireDefault(require("react"));
|
|
12
|
+
|
|
13
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
14
|
+
|
|
15
|
+
var _util = require("@jbrowse/core/util");
|
|
16
|
+
|
|
17
|
+
var _core = require("@material-ui/core");
|
|
18
|
+
|
|
19
|
+
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
|
|
20
|
+
|
|
21
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
22
|
+
return {
|
|
23
|
+
dialogContent: {
|
|
24
|
+
width: '80em'
|
|
25
|
+
},
|
|
26
|
+
closeButton: {
|
|
27
|
+
position: 'absolute',
|
|
28
|
+
right: theme.spacing(1),
|
|
29
|
+
top: theme.spacing(1),
|
|
30
|
+
color: theme.palette.grey[500]
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
exports.useStyles = useStyles;
|
|
35
|
+
|
|
36
|
+
function SearchResultsDialog(_ref) {
|
|
37
|
+
var _model$searchResults;
|
|
38
|
+
|
|
39
|
+
var model = _ref.model,
|
|
40
|
+
optAssemblyName = _ref.optAssemblyName,
|
|
41
|
+
handleClose = _ref.handleClose;
|
|
42
|
+
var classes = useStyles();
|
|
43
|
+
var session = (0, _util.getSession)(model);
|
|
44
|
+
|
|
45
|
+
var _getEnv = (0, _mobxStateTree.getEnv)(session),
|
|
46
|
+
pluginManager = _getEnv.pluginManager;
|
|
47
|
+
|
|
48
|
+
var assemblyManager = session.assemblyManager;
|
|
49
|
+
var assemblyName = optAssemblyName;
|
|
50
|
+
|
|
51
|
+
if (model.displayedRegions.length > 0) {
|
|
52
|
+
var _model$displayedRegio;
|
|
53
|
+
|
|
54
|
+
assemblyName = (_model$displayedRegio = model.displayedRegions[0]) === null || _model$displayedRegio === void 0 ? void 0 : _model$displayedRegio.assemblyName;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!assemblyName) {
|
|
58
|
+
throw new Error("Assembly name not found");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
var assembly = assemblyManager.get(assemblyName);
|
|
62
|
+
|
|
63
|
+
if (!assembly) {
|
|
64
|
+
throw new Error("assembly ".concat(assemblyName, " not found"));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!assembly.regions) {
|
|
68
|
+
throw new Error("assembly ".concat(assemblyName, " regions not loaded"));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
var assemblyRegions = assembly.regions;
|
|
72
|
+
|
|
73
|
+
function handleClick(location) {
|
|
74
|
+
try {
|
|
75
|
+
var newRegion = assemblyRegions.find(function (region) {
|
|
76
|
+
return location === region.refName;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if (newRegion) {
|
|
80
|
+
model.setDisplayedRegions([newRegion]); // we use showAllRegions after setDisplayedRegions to make the entire
|
|
81
|
+
// region visible, xref #1703
|
|
82
|
+
|
|
83
|
+
model.showAllRegions();
|
|
84
|
+
} else {
|
|
85
|
+
model.navToLocString(location, assemblyName);
|
|
86
|
+
}
|
|
87
|
+
} catch (e) {
|
|
88
|
+
console.warn(e);
|
|
89
|
+
session.notify("".concat(e), 'warning');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function getTrackName(trackId) {
|
|
94
|
+
if (trackId) {
|
|
95
|
+
var trackConfigSchema = pluginManager.pluggableConfigSchemaType('track');
|
|
96
|
+
var configuration = (0, _mobxStateTree.resolveIdentifier)(trackConfigSchema, (0, _mobxStateTree.getRoot)(model), trackId);
|
|
97
|
+
|
|
98
|
+
if (configuration) {
|
|
99
|
+
var _configuration$name;
|
|
100
|
+
|
|
101
|
+
return (_configuration$name = configuration.name) === null || _configuration$name === void 0 ? void 0 : _configuration$name.value;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return '';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
|
|
109
|
+
open: true,
|
|
110
|
+
maxWidth: "xl",
|
|
111
|
+
onClose: handleClose
|
|
112
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Search results", handleClose ? /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
113
|
+
"data-testid": "close-resultsDialog",
|
|
114
|
+
className: classes.closeButton,
|
|
115
|
+
onClick: function onClick() {
|
|
116
|
+
handleClose();
|
|
117
|
+
}
|
|
118
|
+
}, /*#__PURE__*/_react["default"].createElement(_Close["default"], null)) : null), /*#__PURE__*/_react["default"].createElement(_core.Divider, null), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, !((_model$searchResults = model.searchResults) !== null && _model$searchResults !== void 0 && _model$searchResults.length) ? /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "No results found for ", /*#__PURE__*/_react["default"].createElement("b", null, model.searchQuery)) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "Showing results for ", /*#__PURE__*/_react["default"].createElement("b", null, model.searchQuery)), /*#__PURE__*/_react["default"].createElement(_core.TableContainer, {
|
|
119
|
+
component: _core.Paper
|
|
120
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Table, null, /*#__PURE__*/_react["default"].createElement(_core.TableHead, null, /*#__PURE__*/_react["default"].createElement(_core.TableRow, null, /*#__PURE__*/_react["default"].createElement(_core.TableCell, null, "Name"), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
|
|
121
|
+
align: "right"
|
|
122
|
+
}, "Location"), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
|
|
123
|
+
align: "right"
|
|
124
|
+
}, "Track"), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
|
|
125
|
+
align: "right"
|
|
126
|
+
}))), /*#__PURE__*/_react["default"].createElement(_core.TableBody, null, model.searchResults.map(function (result) {
|
|
127
|
+
return /*#__PURE__*/_react["default"].createElement(_core.TableRow, {
|
|
128
|
+
key: "".concat(result.getId())
|
|
129
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
|
|
130
|
+
component: "th",
|
|
131
|
+
scope: "row"
|
|
132
|
+
}, result.getLabel()), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
|
|
133
|
+
align: "right"
|
|
134
|
+
}, result.getLocation()), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
|
|
135
|
+
align: "right"
|
|
136
|
+
}, getTrackName(result.getTrackId()) || 'N/A'), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
|
|
137
|
+
align: "right"
|
|
138
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
139
|
+
onClick: function onClick() {
|
|
140
|
+
handleClick(result.getLocation());
|
|
141
|
+
var resultTrackId = result.getTrackId();
|
|
142
|
+
|
|
143
|
+
if (resultTrackId) {
|
|
144
|
+
model.showTrack(resultTrackId);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
handleClose();
|
|
148
|
+
},
|
|
149
|
+
disabled: !getTrackName(result.getTrackId()),
|
|
150
|
+
color: "primary",
|
|
151
|
+
variant: "contained"
|
|
152
|
+
}, "Go")));
|
|
153
|
+
})))))), /*#__PURE__*/_react["default"].createElement(_core.Divider, null), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
154
|
+
onClick: function onClick() {
|
|
155
|
+
return handleClose();
|
|
156
|
+
},
|
|
157
|
+
color: "primary"
|
|
158
|
+
}, "Cancel")));
|
|
159
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
13
|
+
|
|
14
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
15
|
+
|
|
16
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
17
|
+
|
|
18
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
19
|
+
|
|
20
|
+
var _core = require("@material-ui/core");
|
|
21
|
+
|
|
22
|
+
var _mobxReact = require("mobx-react");
|
|
23
|
+
|
|
24
|
+
var _fileSaver = require("file-saver");
|
|
25
|
+
|
|
26
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
27
|
+
|
|
28
|
+
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
|
|
29
|
+
|
|
30
|
+
var _util = require("@jbrowse/core/util");
|
|
31
|
+
|
|
32
|
+
var _formatFastaStrings = require("@jbrowse/core/util/formatFastaStrings");
|
|
33
|
+
|
|
34
|
+
var _Icons = require("@jbrowse/core/ui/Icons");
|
|
35
|
+
|
|
36
|
+
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
|
|
37
|
+
|
|
38
|
+
var _GetApp = _interopRequireDefault(require("@material-ui/icons/GetApp"));
|
|
39
|
+
|
|
40
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
41
|
+
|
|
42
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
43
|
+
|
|
44
|
+
// icons
|
|
45
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
46
|
+
return {
|
|
47
|
+
loadingMessage: {
|
|
48
|
+
padding: theme.spacing(5)
|
|
49
|
+
},
|
|
50
|
+
closeButton: {
|
|
51
|
+
position: 'absolute',
|
|
52
|
+
right: theme.spacing(1),
|
|
53
|
+
top: theme.spacing(1),
|
|
54
|
+
color: theme.palette.grey[500]
|
|
55
|
+
},
|
|
56
|
+
dialogContent: {
|
|
57
|
+
width: '80em'
|
|
58
|
+
},
|
|
59
|
+
textAreaFont: {
|
|
60
|
+
fontFamily: 'Courier New'
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Fetches and returns a list features for a given list of regions
|
|
67
|
+
*/
|
|
68
|
+
function fetchSequence(_x, _x2, _x3) {
|
|
69
|
+
return _fetchSequence.apply(this, arguments);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function _fetchSequence() {
|
|
73
|
+
_fetchSequence = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(model, regions, signal) {
|
|
74
|
+
var session, leftOffset, rightOffset, rpcManager, assemblyManager, assemblyName, assembly, adapterConfig, sessionId, chunks;
|
|
75
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
76
|
+
while (1) {
|
|
77
|
+
switch (_context2.prev = _context2.next) {
|
|
78
|
+
case 0:
|
|
79
|
+
session = (0, _util.getSession)(model);
|
|
80
|
+
leftOffset = model.leftOffset, rightOffset = model.rightOffset;
|
|
81
|
+
|
|
82
|
+
if (!(!leftOffset || !rightOffset)) {
|
|
83
|
+
_context2.next = 4;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
throw new Error('no offsets on model to use for range');
|
|
88
|
+
|
|
89
|
+
case 4:
|
|
90
|
+
if (!(leftOffset.assemblyName !== rightOffset.assemblyName)) {
|
|
91
|
+
_context2.next = 6;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
throw new Error('not able to fetch sequences from multiple assemblies');
|
|
96
|
+
|
|
97
|
+
case 6:
|
|
98
|
+
rpcManager = session.rpcManager, assemblyManager = session.assemblyManager;
|
|
99
|
+
assemblyName = leftOffset.assemblyName || rightOffset.assemblyName || '';
|
|
100
|
+
assembly = assemblyManager.get(assemblyName);
|
|
101
|
+
|
|
102
|
+
if (assembly) {
|
|
103
|
+
_context2.next = 11;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
throw new Error("assembly ".concat(assemblyName, " not found"));
|
|
108
|
+
|
|
109
|
+
case 11:
|
|
110
|
+
adapterConfig = (0, _configuration.getConf)(assembly, ['sequence', 'adapter']);
|
|
111
|
+
sessionId = 'getSequence';
|
|
112
|
+
_context2.next = 15;
|
|
113
|
+
return Promise.all(regions.map(function (region) {
|
|
114
|
+
return rpcManager.call(sessionId, 'CoreGetFeatures', {
|
|
115
|
+
adapterConfig: adapterConfig,
|
|
116
|
+
region: region,
|
|
117
|
+
sessionId: sessionId,
|
|
118
|
+
signal: signal
|
|
119
|
+
});
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
case 15:
|
|
123
|
+
chunks = _context2.sent;
|
|
124
|
+
return _context2.abrupt("return", chunks.map(function (chunk) {
|
|
125
|
+
return chunk[0];
|
|
126
|
+
}));
|
|
127
|
+
|
|
128
|
+
case 17:
|
|
129
|
+
case "end":
|
|
130
|
+
return _context2.stop();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}, _callee2);
|
|
134
|
+
}));
|
|
135
|
+
return _fetchSequence.apply(this, arguments);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function SequenceDialog(_ref) {
|
|
139
|
+
var model = _ref.model,
|
|
140
|
+
handleClose = _ref.handleClose;
|
|
141
|
+
var classes = useStyles();
|
|
142
|
+
var session = (0, _util.getSession)(model);
|
|
143
|
+
|
|
144
|
+
var _useState = (0, _react.useState)(),
|
|
145
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
146
|
+
error = _useState2[0],
|
|
147
|
+
setError = _useState2[1];
|
|
148
|
+
|
|
149
|
+
var _useState3 = (0, _react.useState)(),
|
|
150
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
151
|
+
sequence = _useState4[0],
|
|
152
|
+
setSequence = _useState4[1];
|
|
153
|
+
|
|
154
|
+
var loading = Boolean(sequence === undefined);
|
|
155
|
+
var leftOffset = model.leftOffset,
|
|
156
|
+
rightOffset = model.rightOffset; // avoid infinite looping of useEffect
|
|
157
|
+
// random note: the current selected region can't be a computed because it
|
|
158
|
+
// uses action on base1dview even though it's on the ephemeral base1dview
|
|
159
|
+
|
|
160
|
+
var regionsSelected = (0, _react.useMemo)(function () {
|
|
161
|
+
return model.getSelectedRegions(leftOffset, rightOffset);
|
|
162
|
+
}, [model, leftOffset, rightOffset]);
|
|
163
|
+
(0, _react.useEffect)(function () {
|
|
164
|
+
var active = true;
|
|
165
|
+
var controller = new AbortController();
|
|
166
|
+
(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
167
|
+
var chunks;
|
|
168
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
169
|
+
while (1) {
|
|
170
|
+
switch (_context.prev = _context.next) {
|
|
171
|
+
case 0:
|
|
172
|
+
_context.prev = 0;
|
|
173
|
+
|
|
174
|
+
if (!(regionsSelected.length > 0)) {
|
|
175
|
+
_context.next = 8;
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
_context.next = 4;
|
|
180
|
+
return fetchSequence(model, regionsSelected, controller.signal);
|
|
181
|
+
|
|
182
|
+
case 4:
|
|
183
|
+
chunks = _context.sent;
|
|
184
|
+
|
|
185
|
+
if (active) {
|
|
186
|
+
setSequence((0, _formatFastaStrings.formatSeqFasta)(chunks.filter(function (f) {
|
|
187
|
+
return !!f;
|
|
188
|
+
}).map(function (chunk) {
|
|
189
|
+
var chunkSeq = chunk.get('seq');
|
|
190
|
+
var chunkRefName = chunk.get('refName');
|
|
191
|
+
var chunkStart = chunk.get('start') + 1;
|
|
192
|
+
var chunkEnd = chunk.get('end');
|
|
193
|
+
var chunkLocstring = "".concat(chunkRefName, ":").concat(chunkStart, "-").concat(chunkEnd);
|
|
194
|
+
|
|
195
|
+
if ((chunkSeq === null || chunkSeq === void 0 ? void 0 : chunkSeq.length) !== chunkEnd - chunkStart + 1) {
|
|
196
|
+
throw new Error("".concat(chunkLocstring, " returned ").concat(chunkSeq.length.toLocaleString(), " bases, but should have returned ").concat((chunkEnd - chunkStart).toLocaleString()));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
header: chunkLocstring,
|
|
201
|
+
seq: chunkSeq
|
|
202
|
+
};
|
|
203
|
+
})));
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
_context.next = 9;
|
|
207
|
+
break;
|
|
208
|
+
|
|
209
|
+
case 8:
|
|
210
|
+
throw new Error('Selected region is out of bounds');
|
|
211
|
+
|
|
212
|
+
case 9:
|
|
213
|
+
_context.next = 15;
|
|
214
|
+
break;
|
|
215
|
+
|
|
216
|
+
case 11:
|
|
217
|
+
_context.prev = 11;
|
|
218
|
+
_context.t0 = _context["catch"](0);
|
|
219
|
+
console.error(_context.t0);
|
|
220
|
+
|
|
221
|
+
if (active) {
|
|
222
|
+
setError(_context.t0);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
case 15:
|
|
226
|
+
case "end":
|
|
227
|
+
return _context.stop();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}, _callee, null, [[0, 11]]);
|
|
231
|
+
}))();
|
|
232
|
+
return function () {
|
|
233
|
+
controller.abort();
|
|
234
|
+
active = false;
|
|
235
|
+
};
|
|
236
|
+
}, [model, session, regionsSelected, setSequence]);
|
|
237
|
+
var sequenceTooLarge = sequence ? sequence.length > 1000000 : false;
|
|
238
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
|
|
239
|
+
"data-testid": "sequence-dialog",
|
|
240
|
+
maxWidth: "xl",
|
|
241
|
+
open: true,
|
|
242
|
+
onClose: handleClose,
|
|
243
|
+
"aria-labelledby": "alert-dialog-title",
|
|
244
|
+
"aria-describedby": "alert-dialog-description"
|
|
245
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, {
|
|
246
|
+
id: "alert-dialog-title"
|
|
247
|
+
}, "Reference sequence", handleClose ? /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
|
|
248
|
+
"data-testid": "close-seqDialog",
|
|
249
|
+
className: classes.closeButton,
|
|
250
|
+
onClick: function onClick() {
|
|
251
|
+
handleClose();
|
|
252
|
+
model.setOffsets(undefined, undefined);
|
|
253
|
+
}
|
|
254
|
+
}, /*#__PURE__*/_react["default"].createElement(_Close["default"], null)) : null), /*#__PURE__*/_react["default"].createElement(_core.Divider, null), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, error ? /*#__PURE__*/_react["default"].createElement(_core.Typography, {
|
|
255
|
+
color: "error"
|
|
256
|
+
}, "".concat(error)) : null, loading && !error ? /*#__PURE__*/_react["default"].createElement(_core.Container, null, "Retrieving reference sequence...", /*#__PURE__*/_react["default"].createElement(_core.CircularProgress, {
|
|
257
|
+
style: {
|
|
258
|
+
marginLeft: 10
|
|
259
|
+
},
|
|
260
|
+
size: 20,
|
|
261
|
+
disableShrink: true
|
|
262
|
+
})) : null, /*#__PURE__*/_react["default"].createElement(_core.TextField, {
|
|
263
|
+
"data-testid": "rubberband-sequence",
|
|
264
|
+
variant: "outlined",
|
|
265
|
+
multiline: true,
|
|
266
|
+
minRows: 5,
|
|
267
|
+
disabled: sequenceTooLarge,
|
|
268
|
+
className: classes.dialogContent,
|
|
269
|
+
fullWidth: true,
|
|
270
|
+
value: sequenceTooLarge ? 'Reference sequence too large to display, use the download FASTA button' : sequence,
|
|
271
|
+
InputProps: {
|
|
272
|
+
readOnly: true,
|
|
273
|
+
classes: {
|
|
274
|
+
input: classes.textAreaFont
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
})), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
278
|
+
onClick: function onClick() {
|
|
279
|
+
(0, _copyToClipboard["default"])(sequence || '');
|
|
280
|
+
session.notify('Copied to clipboard', 'success');
|
|
281
|
+
},
|
|
282
|
+
disabled: loading || !!error || sequenceTooLarge,
|
|
283
|
+
color: "primary",
|
|
284
|
+
startIcon: /*#__PURE__*/_react["default"].createElement(_Icons.ContentCopy, null)
|
|
285
|
+
}, "Copy to clipboard"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
286
|
+
onClick: function onClick() {
|
|
287
|
+
var seqFastaFile = new Blob([sequence || ''], {
|
|
288
|
+
type: 'text/x-fasta;charset=utf-8'
|
|
289
|
+
});
|
|
290
|
+
(0, _fileSaver.saveAs)(seqFastaFile, 'jbrowse_ref_seq.fa');
|
|
291
|
+
},
|
|
292
|
+
disabled: loading || !!error,
|
|
293
|
+
color: "primary",
|
|
294
|
+
startIcon: /*#__PURE__*/_react["default"].createElement(_GetApp["default"], null)
|
|
295
|
+
}, "Download FASTA"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
296
|
+
onClick: handleClose,
|
|
297
|
+
color: "primary",
|
|
298
|
+
autoFocus: true
|
|
299
|
+
}, "Close")));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
var _default = (0, _mobxReact.observer)(SequenceDialog);
|
|
303
|
+
|
|
304
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
|
|
14
|
+
var _mobxReact = require("mobx-react");
|
|
15
|
+
|
|
16
|
+
var _mobxStateTree = require("mobx-state-tree");
|
|
17
|
+
|
|
18
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
19
|
+
|
|
20
|
+
var _ui = require("@jbrowse/core/ui");
|
|
21
|
+
|
|
22
|
+
var _util = require("@jbrowse/core/util");
|
|
23
|
+
|
|
24
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
25
|
+
|
|
26
|
+
var _Paper = _interopRequireDefault(require("@material-ui/core/Paper"));
|
|
27
|
+
|
|
28
|
+
var _styles = require("@material-ui/core/styles");
|
|
29
|
+
|
|
30
|
+
var _ = require("..");
|
|
31
|
+
|
|
32
|
+
var _TrackLabel = _interopRequireDefault(require("./TrackLabel"));
|
|
33
|
+
|
|
34
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
35
|
+
|
|
36
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
37
|
+
|
|
38
|
+
var useStyles = (0, _styles.makeStyles)(function (theme) {
|
|
39
|
+
return {
|
|
40
|
+
root: {
|
|
41
|
+
marginTop: 2
|
|
42
|
+
},
|
|
43
|
+
resizeHandle: {
|
|
44
|
+
height: _.RESIZE_HANDLE_HEIGHT,
|
|
45
|
+
boxSizing: 'border-box',
|
|
46
|
+
position: 'relative',
|
|
47
|
+
zIndex: 2
|
|
48
|
+
},
|
|
49
|
+
overlay: {
|
|
50
|
+
pointerEvents: 'none',
|
|
51
|
+
position: 'absolute',
|
|
52
|
+
top: 0,
|
|
53
|
+
left: 0,
|
|
54
|
+
width: '100%',
|
|
55
|
+
zIndex: 3,
|
|
56
|
+
borderRadius: theme.shape.borderRadius
|
|
57
|
+
},
|
|
58
|
+
trackLabel: {
|
|
59
|
+
zIndex: 3
|
|
60
|
+
},
|
|
61
|
+
// aligns with block bounderies. check for example the breakpoint split view
|
|
62
|
+
// demo to see if features align if wanting to change things
|
|
63
|
+
renderingComponentContainer: {
|
|
64
|
+
position: 'absolute',
|
|
65
|
+
// -1 offset because of the 1px border of the Paper
|
|
66
|
+
left: -1,
|
|
67
|
+
height: '100%',
|
|
68
|
+
width: '100%'
|
|
69
|
+
},
|
|
70
|
+
trackLabelInline: {
|
|
71
|
+
position: 'relative',
|
|
72
|
+
display: 'inline-block'
|
|
73
|
+
},
|
|
74
|
+
trackLabelOverlap: {
|
|
75
|
+
position: 'absolute'
|
|
76
|
+
},
|
|
77
|
+
trackRenderingContainer: {
|
|
78
|
+
overflowY: 'auto',
|
|
79
|
+
overflowX: 'hidden',
|
|
80
|
+
whiteSpace: 'nowrap',
|
|
81
|
+
position: 'relative',
|
|
82
|
+
background: 'none',
|
|
83
|
+
zIndex: 2
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
var TrackContainerLabel = (0, _mobxReact.observer)(function (_ref) {
|
|
88
|
+
var model = _ref.model,
|
|
89
|
+
view = _ref.view;
|
|
90
|
+
var classes = useStyles();
|
|
91
|
+
var labelStyle = view.trackLabels === 'overlapping' ? classes.trackLabelOverlap : classes.trackLabelInline;
|
|
92
|
+
return view.trackLabels !== 'hidden' ? /*#__PURE__*/_react["default"].createElement(_TrackLabel["default"], {
|
|
93
|
+
track: model,
|
|
94
|
+
className: (0, _clsx["default"])(classes.trackLabel, labelStyle)
|
|
95
|
+
}) : null;
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
function TrackContainer(_ref2) {
|
|
99
|
+
var model = _ref2.model,
|
|
100
|
+
track = _ref2.track;
|
|
101
|
+
var classes = useStyles();
|
|
102
|
+
var display = track.displays[0];
|
|
103
|
+
var horizontalScroll = model.horizontalScroll,
|
|
104
|
+
draggingTrackId = model.draggingTrackId,
|
|
105
|
+
moveTrack = model.moveTrack;
|
|
106
|
+
var height = display.height;
|
|
107
|
+
var trackId = (0, _configuration.getConf)(track, 'trackId');
|
|
108
|
+
var ref = (0, _react.useRef)(null);
|
|
109
|
+
(0, _react.useEffect)(function () {
|
|
110
|
+
if (ref.current) {
|
|
111
|
+
model.trackRefs[trackId] = ref.current;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return function () {
|
|
115
|
+
delete model.trackRefs[trackId];
|
|
116
|
+
};
|
|
117
|
+
}, [model.trackRefs, trackId]);
|
|
118
|
+
|
|
119
|
+
function onDragEnter() {
|
|
120
|
+
if (draggingTrackId !== undefined && (0, _mobxStateTree.isAlive)(display) && draggingTrackId !== display.id) {
|
|
121
|
+
moveTrack(draggingTrackId, track.id);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
var debouncedOnDragEnter = (0, _util.useDebouncedCallback)(onDragEnter, 100);
|
|
126
|
+
var RenderingComponent = display.RenderingComponent,
|
|
127
|
+
DisplayBlurb = display.DisplayBlurb;
|
|
128
|
+
var dimmed = draggingTrackId !== undefined && draggingTrackId !== display.id;
|
|
129
|
+
return /*#__PURE__*/_react["default"].createElement(_Paper["default"], {
|
|
130
|
+
className: classes.root,
|
|
131
|
+
variant: "outlined"
|
|
132
|
+
}, /*#__PURE__*/_react["default"].createElement(TrackContainerLabel, {
|
|
133
|
+
model: track,
|
|
134
|
+
view: model
|
|
135
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
136
|
+
className: classes.trackRenderingContainer,
|
|
137
|
+
style: {
|
|
138
|
+
height: height
|
|
139
|
+
},
|
|
140
|
+
onScroll: function onScroll(event) {
|
|
141
|
+
var target = event.target;
|
|
142
|
+
display.setScrollTop(target.scrollTop);
|
|
143
|
+
},
|
|
144
|
+
onDragEnter: debouncedOnDragEnter,
|
|
145
|
+
"data-testid": "trackRenderingContainer-".concat(model.id, "-").concat(trackId),
|
|
146
|
+
role: "presentation"
|
|
147
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
148
|
+
ref: ref,
|
|
149
|
+
className: classes.renderingComponentContainer,
|
|
150
|
+
style: {
|
|
151
|
+
transform: "scaleX(".concat(model.scaleFactor, ")")
|
|
152
|
+
}
|
|
153
|
+
}, /*#__PURE__*/_react["default"].createElement(RenderingComponent, {
|
|
154
|
+
model: display,
|
|
155
|
+
onHorizontalScroll: horizontalScroll
|
|
156
|
+
})), DisplayBlurb ? /*#__PURE__*/_react["default"].createElement("div", {
|
|
157
|
+
style: {
|
|
158
|
+
position: 'absolute',
|
|
159
|
+
left: 0,
|
|
160
|
+
top: display.height - 20
|
|
161
|
+
}
|
|
162
|
+
}, /*#__PURE__*/_react["default"].createElement(DisplayBlurb, {
|
|
163
|
+
model: display
|
|
164
|
+
})) : null), /*#__PURE__*/_react["default"].createElement("div", {
|
|
165
|
+
className: classes.overlay,
|
|
166
|
+
style: {
|
|
167
|
+
height: display.height,
|
|
168
|
+
background: dimmed ? 'rgba(0, 0, 0, 0.4)' : undefined
|
|
169
|
+
},
|
|
170
|
+
onDragEnter: debouncedOnDragEnter
|
|
171
|
+
}), /*#__PURE__*/_react["default"].createElement(_ui.ResizeHandle, {
|
|
172
|
+
onDrag: display.resizeHeight,
|
|
173
|
+
className: classes.resizeHandle
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
var _default = (0, _mobxReact.observer)(TrackContainer);
|
|
178
|
+
|
|
179
|
+
exports["default"] = _default;
|