@jbrowse/plugin-linear-genome-view 1.6.7 → 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.d.ts +7 -7
- 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.d.ts +7 -7
- 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.d.ts +6 -6
- 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.d.ts +21 -21
- package/dist/index.js +293 -6
- package/dist/plugin-linear-genome-view.cjs.development.js +37 -22
- package/dist/plugin-linear-genome-view.cjs.development.js.map +1 -1
- package/dist/plugin-linear-genome-view.cjs.production.min.js +1 -1
- package/dist/plugin-linear-genome-view.cjs.production.min.js.map +1 -1
- package/dist/plugin-linear-genome-view.esm.js +37 -22
- package/dist/plugin-linear-genome-view.esm.js.map +1 -1
- package/package.json +4 -8
- package/src/BaseLinearDisplay/components/BaseLinearDisplay.tsx +9 -12
- package/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx +2 -0
- package/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +10 -8
- package/src/LinearBasicDisplay/components/SetMaxHeight.tsx +21 -12
- 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/TrackContainer.tsx +31 -24
- package/src/LinearGenomeView/components/TrackLabel.tsx +1 -1
- package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap +23 -47
- package/src/LinearGenomeView/index.tsx +2 -3
|
@@ -0,0 +1,330 @@
|
|
|
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"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
+
|
|
12
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
13
|
+
|
|
14
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
|
+
|
|
16
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
17
|
+
|
|
18
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
19
|
+
|
|
20
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
21
|
+
|
|
22
|
+
var _mobxReact = require("mobx-react");
|
|
23
|
+
|
|
24
|
+
var _util = require("@jbrowse/core/util");
|
|
25
|
+
|
|
26
|
+
var _core = require("@material-ui/core");
|
|
27
|
+
|
|
28
|
+
var _ErrorMessage = _interopRequireDefault(require("@jbrowse/core/ui/ErrorMessage"));
|
|
29
|
+
|
|
30
|
+
var _BaseResults = _interopRequireDefault(require("@jbrowse/core/TextSearch/BaseResults"));
|
|
31
|
+
|
|
32
|
+
var _AssemblySelector = _interopRequireDefault(require("@jbrowse/core/ui/AssemblySelector"));
|
|
33
|
+
|
|
34
|
+
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
|
|
35
|
+
|
|
36
|
+
var _RefNameAutocomplete = _interopRequireDefault(require("./RefNameAutocomplete"));
|
|
37
|
+
|
|
38
|
+
var _ = require("..");
|
|
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 || (0, _typeof2["default"])(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
|
+
var SearchResultsDialog = /*#__PURE__*/(0, _react.lazy)(function () {
|
|
45
|
+
return Promise.resolve().then(function () {
|
|
46
|
+
return _interopRequireWildcard(require('./SearchResultsDialog'));
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
50
|
+
return {
|
|
51
|
+
importFormContainer: {
|
|
52
|
+
padding: theme.spacing(2)
|
|
53
|
+
},
|
|
54
|
+
button: {
|
|
55
|
+
margin: theme.spacing(2)
|
|
56
|
+
},
|
|
57
|
+
container: {
|
|
58
|
+
padding: theme.spacing(4)
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
var ImportForm = (0, _mobxReact.observer)(function (_ref) {
|
|
63
|
+
var _regions$;
|
|
64
|
+
|
|
65
|
+
var model = _ref.model;
|
|
66
|
+
var classes = useStyles();
|
|
67
|
+
var session = (0, _util.getSession)(model);
|
|
68
|
+
var assemblyNames = session.assemblyNames,
|
|
69
|
+
assemblyManager = session.assemblyManager,
|
|
70
|
+
textSearchManager = session.textSearchManager;
|
|
71
|
+
var rankSearchResults = model.rankSearchResults,
|
|
72
|
+
isSearchDialogDisplayed = model.isSearchDialogDisplayed,
|
|
73
|
+
modelError = model.error;
|
|
74
|
+
|
|
75
|
+
var _useState = (0, _react.useState)(assemblyNames[0]),
|
|
76
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
77
|
+
selectedAsm = _useState2[0],
|
|
78
|
+
setSelectedAsm = _useState2[1];
|
|
79
|
+
|
|
80
|
+
var _useState3 = (0, _react.useState)(modelError),
|
|
81
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
82
|
+
error = _useState4[0],
|
|
83
|
+
setError = _useState4[1];
|
|
84
|
+
|
|
85
|
+
var searchScope = model.searchScope(selectedAsm);
|
|
86
|
+
var assembly = assemblyManager.get(selectedAsm);
|
|
87
|
+
var assemblyError = assemblyNames.length ? assembly === null || assembly === void 0 ? void 0 : assembly.error : 'No configured assemblies';
|
|
88
|
+
var regions = (assembly === null || assembly === void 0 ? void 0 : assembly.regions) || [];
|
|
89
|
+
var err = assemblyError || error;
|
|
90
|
+
|
|
91
|
+
var _useState5 = (0, _react.useState)(),
|
|
92
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
93
|
+
myOption = _useState6[0],
|
|
94
|
+
setOption = _useState6[1]; // use this instead of useState initializer because the useState initializer
|
|
95
|
+
// won't update in response to an observable
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
var option = myOption || new _BaseResults["default"]({
|
|
99
|
+
label: (_regions$ = regions[0]) === null || _regions$ === void 0 ? void 0 : _regions$.refName
|
|
100
|
+
});
|
|
101
|
+
var selectedRegion = option === null || option === void 0 ? void 0 : option.getLocation();
|
|
102
|
+
|
|
103
|
+
function fetchResults(_x, _x2) {
|
|
104
|
+
return _fetchResults.apply(this, arguments);
|
|
105
|
+
} // gets a string as input, or use stored option results from previous query,
|
|
106
|
+
// then re-query and
|
|
107
|
+
// 1) if it has multiple results: pop a dialog
|
|
108
|
+
// 2) if it's a single result navigate to it
|
|
109
|
+
// 3) else assume it's a locstring and navigate to it
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
function _fetchResults() {
|
|
113
|
+
_fetchResults = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(query, searchType) {
|
|
114
|
+
var _assembly$allRefNames;
|
|
115
|
+
|
|
116
|
+
var textSearchResults, refNameResults;
|
|
117
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
118
|
+
while (1) {
|
|
119
|
+
switch (_context.prev = _context.next) {
|
|
120
|
+
case 0:
|
|
121
|
+
if (!textSearchManager) {
|
|
122
|
+
console.warn('No text search manager');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
_context.next = 3;
|
|
126
|
+
return textSearchManager === null || textSearchManager === void 0 ? void 0 : textSearchManager.search({
|
|
127
|
+
queryString: query,
|
|
128
|
+
searchType: searchType
|
|
129
|
+
}, searchScope, rankSearchResults);
|
|
130
|
+
|
|
131
|
+
case 3:
|
|
132
|
+
textSearchResults = _context.sent;
|
|
133
|
+
refNameResults = assembly === null || assembly === void 0 ? void 0 : (_assembly$allRefNames = assembly.allRefNames) === null || _assembly$allRefNames === void 0 ? void 0 : _assembly$allRefNames.filter(function (refName) {
|
|
134
|
+
return refName.startsWith(query);
|
|
135
|
+
}).map(function (r) {
|
|
136
|
+
return new _BaseResults["default"]({
|
|
137
|
+
label: r
|
|
138
|
+
});
|
|
139
|
+
}).slice(0, 10);
|
|
140
|
+
return _context.abrupt("return", [].concat((0, _toConsumableArray2["default"])(refNameResults || []), (0, _toConsumableArray2["default"])(textSearchResults || [])));
|
|
141
|
+
|
|
142
|
+
case 6:
|
|
143
|
+
case "end":
|
|
144
|
+
return _context.stop();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}, _callee);
|
|
148
|
+
}));
|
|
149
|
+
return _fetchResults.apply(this, arguments);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function handleSelectedRegion(_x3) {
|
|
153
|
+
return _handleSelectedRegion.apply(this, arguments);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function _handleSelectedRegion() {
|
|
157
|
+
_handleSelectedRegion = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(input) {
|
|
158
|
+
var trackId, location, _assembly$allRefNames2, results;
|
|
159
|
+
|
|
160
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
161
|
+
while (1) {
|
|
162
|
+
switch (_context2.prev = _context2.next) {
|
|
163
|
+
case 0:
|
|
164
|
+
if (option) {
|
|
165
|
+
_context2.next = 2;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return _context2.abrupt("return");
|
|
170
|
+
|
|
171
|
+
case 2:
|
|
172
|
+
trackId = option.getTrackId();
|
|
173
|
+
location = input || option.getLocation() || '';
|
|
174
|
+
_context2.prev = 4;
|
|
175
|
+
|
|
176
|
+
if (!(assembly !== null && assembly !== void 0 && (_assembly$allRefNames2 = assembly.allRefNames) !== null && _assembly$allRefNames2 !== void 0 && _assembly$allRefNames2.includes(location))) {
|
|
177
|
+
_context2.next = 9;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
model.navToLocString(location, selectedAsm);
|
|
182
|
+
_context2.next = 20;
|
|
183
|
+
break;
|
|
184
|
+
|
|
185
|
+
case 9:
|
|
186
|
+
_context2.next = 11;
|
|
187
|
+
return fetchResults(input, 'exact');
|
|
188
|
+
|
|
189
|
+
case 11:
|
|
190
|
+
results = _context2.sent;
|
|
191
|
+
|
|
192
|
+
if (!(results && results.length > 1)) {
|
|
193
|
+
_context2.next = 17;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
model.setSearchResults(results, input.toLowerCase());
|
|
198
|
+
return _context2.abrupt("return");
|
|
199
|
+
|
|
200
|
+
case 17:
|
|
201
|
+
if ((results === null || results === void 0 ? void 0 : results.length) === 1) {
|
|
202
|
+
location = results[0].getLocation();
|
|
203
|
+
trackId = results[0].getTrackId();
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
case 18:
|
|
207
|
+
model.navToLocString(location, selectedAsm);
|
|
208
|
+
|
|
209
|
+
if (trackId) {
|
|
210
|
+
model.showTrack(trackId);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
case 20:
|
|
214
|
+
_context2.next = 26;
|
|
215
|
+
break;
|
|
216
|
+
|
|
217
|
+
case 22:
|
|
218
|
+
_context2.prev = 22;
|
|
219
|
+
_context2.t0 = _context2["catch"](4);
|
|
220
|
+
console.error(_context2.t0);
|
|
221
|
+
session.notify("".concat(_context2.t0), 'warning');
|
|
222
|
+
|
|
223
|
+
case 26:
|
|
224
|
+
case "end":
|
|
225
|
+
return _context2.stop();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}, _callee2, null, [[4, 22]]);
|
|
229
|
+
}));
|
|
230
|
+
return _handleSelectedRegion.apply(this, arguments);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
var height = _.WIDGET_HEIGHT + 5; // implementation notes:
|
|
234
|
+
// having this wrapped in a form allows intuitive use of enter key to submit
|
|
235
|
+
|
|
236
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
237
|
+
className: classes.container
|
|
238
|
+
}, err ? /*#__PURE__*/_react["default"].createElement(_ErrorMessage["default"], {
|
|
239
|
+
error: err
|
|
240
|
+
}) : null, /*#__PURE__*/_react["default"].createElement(_core.Container, {
|
|
241
|
+
className: classes.importFormContainer
|
|
242
|
+
}, /*#__PURE__*/_react["default"].createElement("form", {
|
|
243
|
+
onSubmit: function onSubmit(event) {
|
|
244
|
+
return event.preventDefault();
|
|
245
|
+
}
|
|
246
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
247
|
+
container: true,
|
|
248
|
+
spacing: 1,
|
|
249
|
+
justifyContent: "center",
|
|
250
|
+
alignItems: "center"
|
|
251
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
252
|
+
item: true
|
|
253
|
+
}, /*#__PURE__*/_react["default"].createElement(_AssemblySelector["default"], {
|
|
254
|
+
onChange: function onChange(val) {
|
|
255
|
+
setError(undefined);
|
|
256
|
+
setSelectedAsm(val);
|
|
257
|
+
},
|
|
258
|
+
session: session,
|
|
259
|
+
selected: selectedAsm,
|
|
260
|
+
InputProps: {
|
|
261
|
+
style: {
|
|
262
|
+
height: height
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
})), /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
266
|
+
item: true
|
|
267
|
+
}, selectedAsm ? err ? /*#__PURE__*/_react["default"].createElement(_Close["default"], {
|
|
268
|
+
style: {
|
|
269
|
+
color: 'red'
|
|
270
|
+
}
|
|
271
|
+
}) : selectedRegion ? /*#__PURE__*/_react["default"].createElement(_RefNameAutocomplete["default"], {
|
|
272
|
+
fetchResults: fetchResults,
|
|
273
|
+
model: model,
|
|
274
|
+
assemblyName: assemblyError ? undefined : selectedAsm,
|
|
275
|
+
value: selectedRegion // note: minWidth 270 accomodates full width of helperText
|
|
276
|
+
,
|
|
277
|
+
minWidth: 270,
|
|
278
|
+
onSelect: function onSelect(option) {
|
|
279
|
+
return setOption(option);
|
|
280
|
+
},
|
|
281
|
+
TextFieldProps: {
|
|
282
|
+
variant: 'outlined',
|
|
283
|
+
helperText: 'Enter sequence name, feature name, or location',
|
|
284
|
+
style: {
|
|
285
|
+
minWidth: '175px'
|
|
286
|
+
},
|
|
287
|
+
InputProps: {
|
|
288
|
+
style: {
|
|
289
|
+
height: height
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}) : /*#__PURE__*/_react["default"].createElement(_core.CircularProgress, {
|
|
294
|
+
role: "progressbar",
|
|
295
|
+
size: 20,
|
|
296
|
+
disableShrink: true
|
|
297
|
+
}) : null), /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
298
|
+
item: true
|
|
299
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
300
|
+
type: "submit",
|
|
301
|
+
disabled: !selectedRegion,
|
|
302
|
+
className: classes.button,
|
|
303
|
+
onClick: function onClick() {
|
|
304
|
+
model.setError(undefined);
|
|
305
|
+
|
|
306
|
+
if (selectedRegion) {
|
|
307
|
+
handleSelectedRegion(selectedRegion);
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
variant: "contained",
|
|
311
|
+
color: "primary"
|
|
312
|
+
}, "Open"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
313
|
+
disabled: !selectedRegion,
|
|
314
|
+
className: classes.button,
|
|
315
|
+
onClick: function onClick() {
|
|
316
|
+
model.setError(undefined);
|
|
317
|
+
model.showAllRegionsInAssembly(selectedAsm);
|
|
318
|
+
},
|
|
319
|
+
variant: "contained",
|
|
320
|
+
color: "secondary"
|
|
321
|
+
}, "Show all regions in assembly"))))), isSearchDialogDisplayed ? /*#__PURE__*/_react["default"].createElement(SearchResultsDialog, {
|
|
322
|
+
model: model,
|
|
323
|
+
optAssemblyName: selectedAsm,
|
|
324
|
+
handleClose: function handleClose() {
|
|
325
|
+
return model.setSearchResults(undefined, undefined);
|
|
326
|
+
}
|
|
327
|
+
}) : null);
|
|
328
|
+
});
|
|
329
|
+
var _default = ImportForm;
|
|
330
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,129 @@
|
|
|
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"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _core = require("@material-ui/core");
|
|
13
|
+
|
|
14
|
+
var _Icons = require("@jbrowse/core/ui/Icons");
|
|
15
|
+
|
|
16
|
+
var _mobxReact = require("mobx-react");
|
|
17
|
+
|
|
18
|
+
var _Header = _interopRequireDefault(require("./Header"));
|
|
19
|
+
|
|
20
|
+
var _TrackContainer = _interopRequireDefault(require("./TrackContainer"));
|
|
21
|
+
|
|
22
|
+
var _TracksContainer = _interopRequireDefault(require("./TracksContainer"));
|
|
23
|
+
|
|
24
|
+
var _ImportForm = _interopRequireDefault(require("./ImportForm"));
|
|
25
|
+
|
|
26
|
+
var _MiniControls = _interopRequireDefault(require("./MiniControls"));
|
|
27
|
+
|
|
28
|
+
var _SequenceDialog = _interopRequireDefault(require("./SequenceDialog"));
|
|
29
|
+
|
|
30
|
+
var _SearchResultsDialog = _interopRequireDefault(require("./SearchResultsDialog"));
|
|
31
|
+
|
|
32
|
+
var useStyles = (0, _core.makeStyles)(function (theme) {
|
|
33
|
+
return {
|
|
34
|
+
note: {
|
|
35
|
+
textAlign: 'center',
|
|
36
|
+
paddingTop: theme.spacing(1),
|
|
37
|
+
paddingBottom: theme.spacing(1)
|
|
38
|
+
},
|
|
39
|
+
dots: {
|
|
40
|
+
'&::after': {
|
|
41
|
+
display: 'inline-block',
|
|
42
|
+
animation: '$ellipsis 1.5s infinite',
|
|
43
|
+
content: '"."',
|
|
44
|
+
width: '1em',
|
|
45
|
+
textAlign: 'left'
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
'@keyframes ellipsis': {
|
|
49
|
+
'0%': {
|
|
50
|
+
content: '"."'
|
|
51
|
+
},
|
|
52
|
+
'33%': {
|
|
53
|
+
content: '".."'
|
|
54
|
+
},
|
|
55
|
+
'66%': {
|
|
56
|
+
content: '"..."'
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
var LinearGenomeView = (0, _mobxReact.observer)(function (_ref) {
|
|
62
|
+
var model = _ref.model;
|
|
63
|
+
var tracks = model.tracks,
|
|
64
|
+
error = model.error,
|
|
65
|
+
hideHeader = model.hideHeader,
|
|
66
|
+
initialized = model.initialized,
|
|
67
|
+
hasDisplayedRegions = model.hasDisplayedRegions;
|
|
68
|
+
var classes = useStyles();
|
|
69
|
+
|
|
70
|
+
if (!initialized && !error) {
|
|
71
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Typography, {
|
|
72
|
+
className: classes.dots,
|
|
73
|
+
variant: "h5"
|
|
74
|
+
}, "Loading");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!hasDisplayedRegions || error) {
|
|
78
|
+
return /*#__PURE__*/_react["default"].createElement(_ImportForm["default"], {
|
|
79
|
+
model: model
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
84
|
+
style: {
|
|
85
|
+
position: 'relative'
|
|
86
|
+
}
|
|
87
|
+
}, model.seqDialogDisplayed ? /*#__PURE__*/_react["default"].createElement(_SequenceDialog["default"], {
|
|
88
|
+
model: model,
|
|
89
|
+
handleClose: function handleClose() {
|
|
90
|
+
model.setSequenceDialogOpen(false);
|
|
91
|
+
}
|
|
92
|
+
}) : null, model.isSearchDialogDisplayed ? /*#__PURE__*/_react["default"].createElement(_SearchResultsDialog["default"], {
|
|
93
|
+
model: model,
|
|
94
|
+
handleClose: function handleClose() {
|
|
95
|
+
model.setSearchResults(undefined, undefined);
|
|
96
|
+
}
|
|
97
|
+
}) : null, !hideHeader ? /*#__PURE__*/_react["default"].createElement(_Header["default"], {
|
|
98
|
+
model: model
|
|
99
|
+
}) : /*#__PURE__*/_react["default"].createElement("div", {
|
|
100
|
+
style: {
|
|
101
|
+
position: 'absolute',
|
|
102
|
+
right: 0,
|
|
103
|
+
zIndex: 1001
|
|
104
|
+
}
|
|
105
|
+
}, /*#__PURE__*/_react["default"].createElement(_MiniControls["default"], {
|
|
106
|
+
model: model
|
|
107
|
+
})), /*#__PURE__*/_react["default"].createElement(_TracksContainer["default"], {
|
|
108
|
+
model: model
|
|
109
|
+
}, !tracks.length ? /*#__PURE__*/_react["default"].createElement(_core.Paper, {
|
|
110
|
+
variant: "outlined",
|
|
111
|
+
className: classes.note
|
|
112
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, "No tracks active."), /*#__PURE__*/_react["default"].createElement(_core.Button, {
|
|
113
|
+
variant: "contained",
|
|
114
|
+
color: "primary",
|
|
115
|
+
onClick: model.activateTrackSelector,
|
|
116
|
+
style: {
|
|
117
|
+
zIndex: 1000
|
|
118
|
+
},
|
|
119
|
+
startIcon: /*#__PURE__*/_react["default"].createElement(_Icons.TrackSelector, null)
|
|
120
|
+
}, "Open track selector")) : tracks.map(function (track) {
|
|
121
|
+
return /*#__PURE__*/_react["default"].createElement(_TrackContainer["default"], {
|
|
122
|
+
key: track.id,
|
|
123
|
+
model: model,
|
|
124
|
+
track: track
|
|
125
|
+
});
|
|
126
|
+
})));
|
|
127
|
+
});
|
|
128
|
+
var _default = LinearGenomeView;
|
|
129
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
+
|
|
7
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
8
|
+
|
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
|
+
|
|
11
|
+
var _react2 = require("@testing-library/react");
|
|
12
|
+
|
|
13
|
+
require("@testing-library/jest-dom/extend-expect");
|
|
14
|
+
|
|
15
|
+
var _rootModel = require("@jbrowse/web/src/rootModel");
|
|
16
|
+
|
|
17
|
+
require("requestidlecallback-polyfill");
|
|
18
|
+
|
|
19
|
+
var _LinearGenomeView = _interopRequireDefault(require("./LinearGenomeView"));
|
|
20
|
+
|
|
21
|
+
jest.mock('@jbrowse/web/src/makeWorkerInstance', function () {
|
|
22
|
+
return function () {};
|
|
23
|
+
});
|
|
24
|
+
var assemblyConf = {
|
|
25
|
+
name: 'volMyt1',
|
|
26
|
+
sequence: {
|
|
27
|
+
trackId: 'sequenceConfigId',
|
|
28
|
+
type: 'ReferenceSequenceTrack',
|
|
29
|
+
adapter: {
|
|
30
|
+
type: 'FromConfigSequenceAdapter',
|
|
31
|
+
features: [{
|
|
32
|
+
refName: 'ctgA',
|
|
33
|
+
uniqueId: 'firstId',
|
|
34
|
+
start: 0,
|
|
35
|
+
end: 10,
|
|
36
|
+
seq: 'cattgttgcg'
|
|
37
|
+
}]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
describe('<LinearGenomeView />', function () {
|
|
42
|
+
it('renders setup wizard', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
43
|
+
var session, model, _render, findByText;
|
|
44
|
+
|
|
45
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
46
|
+
while (1) {
|
|
47
|
+
switch (_context.prev = _context.next) {
|
|
48
|
+
case 0:
|
|
49
|
+
session = (0, _rootModel.createTestSession)();
|
|
50
|
+
session.addAssemblyConf(assemblyConf);
|
|
51
|
+
session.addView('LinearGenomeView', {
|
|
52
|
+
id: 'lgv'
|
|
53
|
+
});
|
|
54
|
+
model = session.views[0];
|
|
55
|
+
model.setWidth(800);
|
|
56
|
+
_render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_LinearGenomeView["default"], {
|
|
57
|
+
model: model
|
|
58
|
+
})), findByText = _render.findByText;
|
|
59
|
+
expect(model.displayedRegions.length).toEqual(0);
|
|
60
|
+
_context.t0 = _react2.fireEvent;
|
|
61
|
+
_context.next = 10;
|
|
62
|
+
return findByText('Open');
|
|
63
|
+
|
|
64
|
+
case 10:
|
|
65
|
+
_context.t1 = _context.sent;
|
|
66
|
+
|
|
67
|
+
_context.t0.click.call(_context.t0, _context.t1);
|
|
68
|
+
|
|
69
|
+
_context.next = 14;
|
|
70
|
+
return (0, _react2.waitFor)(function () {
|
|
71
|
+
expect(model.displayedRegions.length).toEqual(1);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
case 14:
|
|
75
|
+
case "end":
|
|
76
|
+
return _context.stop();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}, _callee);
|
|
80
|
+
})));
|
|
81
|
+
it('renders one track, one region', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
82
|
+
var session, model, _render2, container, findByText;
|
|
83
|
+
|
|
84
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
85
|
+
while (1) {
|
|
86
|
+
switch (_context2.prev = _context2.next) {
|
|
87
|
+
case 0:
|
|
88
|
+
session = (0, _rootModel.createTestSession)();
|
|
89
|
+
session.addAssemblyConf(assemblyConf);
|
|
90
|
+
session.addTrackConf({
|
|
91
|
+
trackId: 'testConfig',
|
|
92
|
+
assemblyNames: ['volMyt1'],
|
|
93
|
+
name: 'Foo Track',
|
|
94
|
+
type: 'BasicTrack',
|
|
95
|
+
adapter: {
|
|
96
|
+
type: 'FromConfigAdapter',
|
|
97
|
+
features: []
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
session.addView('LinearGenomeView', {
|
|
101
|
+
type: 'LinearGenomeView',
|
|
102
|
+
id: 'lgv',
|
|
103
|
+
offsetPx: 0,
|
|
104
|
+
bpPerPx: 1,
|
|
105
|
+
tracks: [{
|
|
106
|
+
id: 'foo',
|
|
107
|
+
type: 'BasicTrack',
|
|
108
|
+
height: 20,
|
|
109
|
+
configuration: 'testConfig',
|
|
110
|
+
displays: [{
|
|
111
|
+
type: 'LinearBareDisplay',
|
|
112
|
+
configuration: 'testConfig-LinearBareDisplay'
|
|
113
|
+
}]
|
|
114
|
+
}],
|
|
115
|
+
displayedRegions: [{
|
|
116
|
+
assemblyName: 'volMyt1',
|
|
117
|
+
refName: 'ctgA',
|
|
118
|
+
start: 0,
|
|
119
|
+
end: 100
|
|
120
|
+
}]
|
|
121
|
+
});
|
|
122
|
+
model = session.views[0];
|
|
123
|
+
model.setWidth(800);
|
|
124
|
+
_render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_LinearGenomeView["default"], {
|
|
125
|
+
model: model
|
|
126
|
+
})), container = _render2.container, findByText = _render2.findByText;
|
|
127
|
+
_context2.next = 9;
|
|
128
|
+
return findByText('Foo Track');
|
|
129
|
+
|
|
130
|
+
case 9:
|
|
131
|
+
_context2.next = 11;
|
|
132
|
+
return findByText('100 bp');
|
|
133
|
+
|
|
134
|
+
case 11:
|
|
135
|
+
expect(container.firstChild).toMatchSnapshot();
|
|
136
|
+
|
|
137
|
+
case 12:
|
|
138
|
+
case "end":
|
|
139
|
+
return _context2.stop();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}, _callee2);
|
|
143
|
+
})));
|
|
144
|
+
it('renders two tracks, two regions', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
145
|
+
var session, model, _render3, container, findByText, findAllByTestId;
|
|
146
|
+
|
|
147
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
148
|
+
while (1) {
|
|
149
|
+
switch (_context3.prev = _context3.next) {
|
|
150
|
+
case 0:
|
|
151
|
+
session = (0, _rootModel.createTestSession)();
|
|
152
|
+
session.addAssemblyConf(assemblyConf);
|
|
153
|
+
session.addTrackConf({
|
|
154
|
+
trackId: 'testConfig',
|
|
155
|
+
name: 'Foo Track',
|
|
156
|
+
assemblyNames: ['volMyt1'],
|
|
157
|
+
type: 'BasicTrack',
|
|
158
|
+
adapter: {
|
|
159
|
+
type: 'FromConfigAdapter',
|
|
160
|
+
features: []
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
session.addTrackConf({
|
|
164
|
+
trackId: 'testConfig2',
|
|
165
|
+
name: 'Bar Track',
|
|
166
|
+
assemblyNames: ['volMyt1'],
|
|
167
|
+
type: 'BasicTrack',
|
|
168
|
+
adapter: {
|
|
169
|
+
type: 'FromConfigAdapter',
|
|
170
|
+
features: []
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
session.addView('LinearGenomeView', {
|
|
174
|
+
id: 'lgv',
|
|
175
|
+
offsetPx: 0,
|
|
176
|
+
bpPerPx: 1,
|
|
177
|
+
displayedRegions: [{
|
|
178
|
+
assemblyName: 'volMyt1',
|
|
179
|
+
refName: 'ctgA',
|
|
180
|
+
start: 0,
|
|
181
|
+
end: 100
|
|
182
|
+
}, {
|
|
183
|
+
assemblyName: 'volMyt1',
|
|
184
|
+
refName: 'ctgB',
|
|
185
|
+
start: 1000,
|
|
186
|
+
end: 2000
|
|
187
|
+
}],
|
|
188
|
+
tracks: [{
|
|
189
|
+
id: 'foo',
|
|
190
|
+
type: 'BasicTrack',
|
|
191
|
+
height: 20,
|
|
192
|
+
configuration: 'testConfig',
|
|
193
|
+
displays: [{
|
|
194
|
+
type: 'LinearBareDisplay',
|
|
195
|
+
configuration: 'testConfig-LinearBareDisplay'
|
|
196
|
+
}]
|
|
197
|
+
}, {
|
|
198
|
+
id: 'bar',
|
|
199
|
+
type: 'BasicTrack',
|
|
200
|
+
height: 20,
|
|
201
|
+
configuration: 'testConfig2',
|
|
202
|
+
displays: [{
|
|
203
|
+
type: 'LinearBareDisplay',
|
|
204
|
+
configuration: 'testConfig2-LinearBareDisplay'
|
|
205
|
+
}]
|
|
206
|
+
}]
|
|
207
|
+
});
|
|
208
|
+
model = session.views[0];
|
|
209
|
+
model.setWidth(800);
|
|
210
|
+
_render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_LinearGenomeView["default"], {
|
|
211
|
+
model: model
|
|
212
|
+
})), container = _render3.container, findByText = _render3.findByText, findAllByTestId = _render3.findAllByTestId;
|
|
213
|
+
_context3.next = 10;
|
|
214
|
+
return findByText('Foo Track');
|
|
215
|
+
|
|
216
|
+
case 10:
|
|
217
|
+
_context3.next = 12;
|
|
218
|
+
return findByText('798 bp');
|
|
219
|
+
|
|
220
|
+
case 12:
|
|
221
|
+
_context3.next = 14;
|
|
222
|
+
return findAllByTestId('svgfeatures');
|
|
223
|
+
|
|
224
|
+
case 14:
|
|
225
|
+
expect(container.firstChild).toMatchSnapshot();
|
|
226
|
+
|
|
227
|
+
case 15:
|
|
228
|
+
case "end":
|
|
229
|
+
return _context3.stop();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}, _callee3);
|
|
233
|
+
})));
|
|
234
|
+
});
|