@jbrowse/plugin-linear-genome-view 1.5.1 → 1.5.5

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.
@@ -51,6 +51,7 @@ var BaseResult = require('@jbrowse/core/TextSearch/BaseResults');
51
51
  var BaseResult__default = _interopDefault(BaseResult);
52
52
  var SearchIcon = _interopDefault(require('@material-ui/icons/Search'));
53
53
  var Autocomplete = _interopDefault(require('@material-ui/lab/Autocomplete'));
54
+ var HelpIcon = _interopDefault(require('@material-ui/icons/Help'));
54
55
  var CloseIcon = _interopDefault(require('@material-ui/icons/Close'));
55
56
  var ArrowForwardIcon = _interopDefault(require('@material-ui/icons/ArrowForward'));
56
57
  var ArrowBackIcon = _interopDefault(require('@material-ui/icons/ArrowBack'));
@@ -65,6 +66,7 @@ var colorManipulator = require('@material-ui/core/styles/colorManipulator');
65
66
  var Popover = _interopDefault(require('@material-ui/core/Popover'));
66
67
  var Tooltip$1 = _interopDefault(require('@material-ui/core/Tooltip'));
67
68
  var AssemblySelector = _interopDefault(require('@jbrowse/core/ui/AssemblySelector'));
69
+ var ErrorMessage = _interopDefault(require('@jbrowse/core/ui/ErrorMessage'));
68
70
  var ArrowDown = _interopDefault(require('@material-ui/icons/KeyboardArrowDown'));
69
71
  var Menu = _interopDefault(require('@jbrowse/core/ui/Menu'));
70
72
  var copy = _interopDefault(require('copy-to-clipboard'));
@@ -76,14 +78,9 @@ function ownKeys(object, enumerableOnly) {
76
78
 
77
79
  if (Object.getOwnPropertySymbols) {
78
80
  var symbols = Object.getOwnPropertySymbols(object);
79
-
80
- if (enumerableOnly) {
81
- symbols = symbols.filter(function (sym) {
82
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
83
- });
84
- }
85
-
86
- keys.push.apply(keys, symbols);
81
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
82
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
83
+ })), keys.push.apply(keys, symbols);
87
84
  }
88
85
 
89
86
  return keys;
@@ -91,19 +88,12 @@ function ownKeys(object, enumerableOnly) {
91
88
 
92
89
  function _objectSpread2(target) {
93
90
  for (var i = 1; i < arguments.length; i++) {
94
- var source = arguments[i] != null ? arguments[i] : {};
95
-
96
- if (i % 2) {
97
- ownKeys(Object(source), true).forEach(function (key) {
98
- _defineProperty(target, key, source[key]);
99
- });
100
- } else if (Object.getOwnPropertyDescriptors) {
101
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
102
- } else {
103
- ownKeys(Object(source)).forEach(function (key) {
104
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
105
- });
106
- }
91
+ var source = null != arguments[i] ? arguments[i] : {};
92
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
93
+ _defineProperty(target, key, source[key]);
94
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
95
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
96
+ });
107
97
  }
108
98
 
109
99
  return target;
@@ -112,17 +102,11 @@ function _objectSpread2(target) {
112
102
  function _typeof(obj) {
113
103
  "@babel/helpers - typeof";
114
104
 
115
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
116
- _typeof = function (obj) {
117
- return typeof obj;
118
- };
119
- } else {
120
- _typeof = function (obj) {
121
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
122
- };
123
- }
124
-
125
- return _typeof(obj);
105
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
106
+ return typeof obj;
107
+ } : function (obj) {
108
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
109
+ }, _typeof(obj);
126
110
  }
127
111
 
128
112
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
@@ -180,6 +164,9 @@ function _defineProperties(target, props) {
180
164
  function _createClass(Constructor, protoProps, staticProps) {
181
165
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
182
166
  if (staticProps) _defineProperties(Constructor, staticProps);
167
+ Object.defineProperty(Constructor, "prototype", {
168
+ writable: false
169
+ });
183
170
  return Constructor;
184
171
  }
185
172
 
@@ -203,12 +190,15 @@ function _inherits(subClass, superClass) {
203
190
  throw new TypeError("Super expression must either be null or a function");
204
191
  }
205
192
 
206
- subClass.prototype = Object.create(superClass && superClass.prototype, {
207
- constructor: {
208
- value: subClass,
209
- writable: true,
210
- configurable: true
211
- }
193
+ Object.defineProperty(subClass, "prototype", {
194
+ value: Object.create(superClass && superClass.prototype, {
195
+ constructor: {
196
+ value: subClass,
197
+ writable: true,
198
+ configurable: true
199
+ }
200
+ }),
201
+ writable: false
212
202
  });
213
203
  if (superClass) _setPrototypeOf(subClass, superClass);
214
204
  }
@@ -1362,8 +1352,7 @@ var useStyles$2 = /*#__PURE__*/core.makeStyles(function (theme) {
1362
1352
  fontSize: theme.typography.pxToRem(10),
1363
1353
  lineHeight: "".concat(round(14 / 10), "em"),
1364
1354
  maxWidth: 300,
1365
- wordWrap: 'break-word',
1366
- fontWeight: theme.typography.fontWeightMedium
1355
+ wordWrap: 'break-word'
1367
1356
  }
1368
1357
  };
1369
1358
  });
@@ -2518,7 +2507,9 @@ function mathPower(num) {
2518
2507
  return "".concat(mathPower(~~(num / 1000)), ",").concat("00".concat(~~(num % 1000)).substr(-3, 3));
2519
2508
  }
2520
2509
 
2521
- var useStyles$4 = /*#__PURE__*/styles.makeStyles(function () {
2510
+ var useStyles$4 = /*#__PURE__*/styles.makeStyles(function
2511
+ /* theme */
2512
+ () {
2522
2513
  return {
2523
2514
  majorTickLabel: {
2524
2515
  fontSize: '11px'
@@ -2701,7 +2692,7 @@ function OverviewRubberBand(_ref2) {
2701
2692
 
2702
2693
 
2703
2694
  if (controlsRef.current && startX !== undefined && currentX === undefined) {
2704
- var clickedAt = overview.pxToBp(startX);
2695
+ var clickedAt = overview.pxToBp(startX - cytobandOffset);
2705
2696
  model.centerAt(Math.round(clickedAt.coord), clickedAt.refName, clickedAt.index);
2706
2697
  }
2707
2698
 
@@ -2905,7 +2896,7 @@ var useStyles$6 = /*#__PURE__*/core.makeStyles(function (theme) {
2905
2896
  height: HEADER_OVERVIEW_HEIGHT,
2906
2897
  pointerEvents: 'none',
2907
2898
  zIndex: 100,
2908
- border: '1px solid red'
2899
+ border: '1px solid'
2909
2900
  },
2910
2901
  overview: {
2911
2902
  height: HEADER_BAR_HEIGHT,
@@ -3149,6 +3140,8 @@ var ScaleBar = /*#__PURE__*/mobxReact.observer(function (_ref6) {
3149
3140
  var lastOverviewPx = overview.bpToPx(_objectSpread2(_objectSpread2({}, last), {}, {
3150
3141
  coord: last.reversed ? last.start : last.end
3151
3142
  })) || 0;
3143
+ var color = showCytobands ? '#f00' : scaleBarColor;
3144
+ var transparency = showCytobands ? 0.1 : 0.3;
3152
3145
  return /*#__PURE__*/React__default.createElement("div", {
3153
3146
  className: classes.scaleBar
3154
3147
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -3156,7 +3149,8 @@ var ScaleBar = /*#__PURE__*/mobxReact.observer(function (_ref6) {
3156
3149
  style: {
3157
3150
  width: lastOverviewPx - firstOverviewPx,
3158
3151
  left: firstOverviewPx + cytobandOffset,
3159
- background: showCytobands ? undefined : core.alpha(scaleBarColor, 0.3)
3152
+ background: core.alpha(color, transparency),
3153
+ borderColor: color
3160
3154
  }
3161
3155
  }), overviewVisibleRegions.map(function (block, idx) {
3162
3156
  return !(block instanceof blockTypes.ContentBlock) ? /*#__PURE__*/React__default.createElement("div", {
@@ -3374,7 +3368,7 @@ var SVGHeader = function SVGHeader(_ref3) {
3374
3368
  block: block
3375
3369
  }), /*#__PURE__*/React__default.createElement("rect", {
3376
3370
  stroke: "red",
3377
- fill: "none",
3371
+ fill: "rgb(255,0,0,0.1)",
3378
3372
  width: Math.max(lastOverviewPx - firstOverviewPx, 0.5),
3379
3373
  height: HEADER_OVERVIEW_HEIGHT - 1,
3380
3374
  x: firstOverviewPx,
@@ -3549,6 +3543,9 @@ function dedupe() {
3549
3543
  });
3550
3544
  }
3551
3545
 
3546
+ var HelpDialog = /*#__PURE__*/React.lazy(function () {
3547
+ return Promise.resolve().then(function () { return HelpDialog$2; });
3548
+ }); // the logic of this method is to only apply a filter to RefSequenceResults
3552
3549
  // because they do not have a matchedObject. the trix search results already
3553
3550
  // filter so don't need re-filtering
3554
3551
 
@@ -3580,6 +3577,8 @@ function RefNameAutocomplete(_ref) {
3580
3577
  style = _ref.style,
3581
3578
  fetchResults = _ref.fetchResults,
3582
3579
  value = _ref.value,
3580
+ _ref$minWidth = _ref.minWidth,
3581
+ minWidth = _ref$minWidth === void 0 ? 200 : _ref$minWidth,
3583
3582
  _ref$TextFieldProps = _ref.TextFieldProps,
3584
3583
  TextFieldProps = _ref$TextFieldProps === void 0 ? {} : _ref$TextFieldProps;
3585
3584
  var session = util.getSession(model);
@@ -3595,20 +3594,25 @@ function RefNameAutocomplete(_ref) {
3595
3594
  loaded = _useState4[0],
3596
3595
  setLoaded = _useState4[1];
3597
3596
 
3598
- var _useState5 = React.useState(''),
3597
+ var _useState5 = React.useState(false),
3599
3598
  _useState6 = _slicedToArray(_useState5, 2),
3600
- currentSearch = _useState6[0],
3601
- setCurrentSearch = _useState6[1];
3599
+ isHelpDialogDisplayed = _useState6[0],
3600
+ setHelpDialogDisplayed = _useState6[1];
3602
3601
 
3603
3602
  var _useState7 = React.useState(''),
3604
3603
  _useState8 = _slicedToArray(_useState7, 2),
3605
- inputValue = _useState8[0],
3606
- setInputValue = _useState8[1];
3604
+ currentSearch = _useState8[0],
3605
+ setCurrentSearch = _useState8[1];
3607
3606
 
3608
- var _useState9 = React.useState(),
3607
+ var _useState9 = React.useState(''),
3609
3608
  _useState10 = _slicedToArray(_useState9, 2),
3610
- searchOptions = _useState10[0],
3611
- setSearchOptions = _useState10[1];
3609
+ inputValue = _useState10[0],
3610
+ setInputValue = _useState10[1];
3611
+
3612
+ var _useState11 = React.useState(),
3613
+ _useState12 = _slicedToArray(_useState11, 2),
3614
+ searchOptions = _useState12[0],
3615
+ setSearchOptions = _useState12[1];
3612
3616
 
3613
3617
  var debouncedSearch = util.useDebounce(currentSearch, 300);
3614
3618
  var coarseVisibleLocStrings = model.coarseVisibleLocStrings,
@@ -3688,12 +3692,13 @@ function RefNameAutocomplete(_ref) {
3688
3692
  active = false;
3689
3693
  };
3690
3694
  }, [assemblyName, fetchResults, debouncedSearch, session, model]);
3691
- var inputBoxVal = coarseVisibleLocStrings || value || ''; // heuristic, text width + icon width, minimum 200
3695
+ var inputBoxVal = coarseVisibleLocStrings || value || ''; // heuristic, text width + icon width
3696
+ // + 45 accomodates help icon and search icon
3692
3697
 
3693
- var width = Math.min(Math.max(util.measureText(inputBoxVal, 16) + 25, 200), 550); // notes on implementation:
3698
+ var width = Math.min(Math.max(util.measureText(inputBoxVal, 16) + 45, minWidth), 550); // notes on implementation:
3694
3699
  // The selectOnFocus setting helps highlight the field when clicked
3695
3700
 
3696
- return /*#__PURE__*/React__default.createElement(Autocomplete, {
3701
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Autocomplete, {
3697
3702
  id: "refNameAutocomplete-".concat(model.id),
3698
3703
  "data-testid": "autocomplete",
3699
3704
  disableListWrap: true,
@@ -3777,7 +3782,11 @@ function RefNameAutocomplete(_ref) {
3777
3782
  style: {
3778
3783
  marginRight: 7
3779
3784
  }
3780
- }, /*#__PURE__*/React__default.createElement(SearchIcon, null)), params.InputProps.endAdornment)
3785
+ }, /*#__PURE__*/React__default.createElement(SearchIcon, null), /*#__PURE__*/React__default.createElement(core.IconButton, {
3786
+ onClick: function onClick() {
3787
+ return setHelpDialogDisplayed(true);
3788
+ }
3789
+ }, /*#__PURE__*/React__default.createElement(HelpIcon, null))), params.InputProps.endAdornment)
3781
3790
  }),
3782
3791
  placeholder: "Search for location",
3783
3792
  onChange: function onChange(e) {
@@ -3800,7 +3809,11 @@ function RefNameAutocomplete(_ref) {
3800
3809
  getOptionLabel: function getOptionLabel(option) {
3801
3810
  return (typeof option === 'string' ? option : option.result.getLabel()) || '';
3802
3811
  }
3803
- });
3812
+ }), isHelpDialogDisplayed ? /*#__PURE__*/React__default.createElement(HelpDialog, {
3813
+ handleClose: function handleClose() {
3814
+ return setHelpDialogDisplayed(false);
3815
+ }
3816
+ }) : null);
3804
3817
  }
3805
3818
 
3806
3819
  var RefNameAutocomplete$1 = /*#__PURE__*/mobxReact.observer(RefNameAutocomplete);
@@ -5307,158 +5320,10 @@ function TracksContainer(_ref) {
5307
5320
 
5308
5321
  var TracksContainer$1 = /*#__PURE__*/mobxReact.observer(TracksContainer);
5309
5322
 
5310
- var useStyles$i = /*#__PURE__*/styles.makeStyles(function (theme) {
5311
- return {
5312
- dialogContent: {
5313
- width: '80em'
5314
- },
5315
- closeButton: {
5316
- position: 'absolute',
5317
- right: theme.spacing(1),
5318
- top: theme.spacing(1),
5319
- color: theme.palette.grey[500]
5320
- }
5321
- };
5323
+ var SearchResultsDialog = /*#__PURE__*/React.lazy(function () {
5324
+ return Promise.resolve().then(function () { return SearchResultsDialog$2; });
5322
5325
  });
5323
- function SearchResultsDialog(_ref) {
5324
- var _model$searchResults;
5325
-
5326
- var model = _ref.model,
5327
- optAssemblyName = _ref.optAssemblyName,
5328
- handleClose = _ref.handleClose;
5329
- var classes = useStyles$i();
5330
- var session = util.getSession(model);
5331
-
5332
- var _getEnv = mobxStateTree.getEnv(session),
5333
- pluginManager = _getEnv.pluginManager;
5334
-
5335
- var assemblyManager = session.assemblyManager;
5336
- var assemblyName = optAssemblyName;
5337
-
5338
- if (model.displayedRegions.length > 0) {
5339
- var _model$displayedRegio;
5340
-
5341
- assemblyName = (_model$displayedRegio = model.displayedRegions[0]) === null || _model$displayedRegio === void 0 ? void 0 : _model$displayedRegio.assemblyName;
5342
- }
5343
-
5344
- if (!assemblyName) {
5345
- throw new Error("Assembly name not found");
5346
- }
5347
-
5348
- var assembly = assemblyManager.get(assemblyName);
5349
-
5350
- if (!assembly) {
5351
- throw new Error("assembly ".concat(assemblyName, " not found"));
5352
- }
5353
-
5354
- if (!assembly.regions) {
5355
- throw new Error("assembly ".concat(assemblyName, " regions not loaded"));
5356
- }
5357
-
5358
- var assemblyRegions = assembly.regions;
5359
-
5360
- function handleClick(location) {
5361
- try {
5362
- var newRegion = assemblyRegions.find(function (region) {
5363
- return location === region.refName;
5364
- });
5365
-
5366
- if (newRegion) {
5367
- model.setDisplayedRegions([newRegion]); // we use showAllRegions after setDisplayedRegions to make the entire
5368
- // region visible, xref #1703
5369
-
5370
- model.showAllRegions();
5371
- } else {
5372
- model.navToLocString(location, assemblyName);
5373
- }
5374
- } catch (e) {
5375
- console.warn(e);
5376
- session.notify("".concat(e), 'warning');
5377
- }
5378
- }
5379
-
5380
- function getTrackName(trackId) {
5381
- if (trackId) {
5382
- var trackConfigSchema = pluginManager.pluggableConfigSchemaType('track');
5383
- var configuration = mobxStateTree.resolveIdentifier(trackConfigSchema, mobxStateTree.getRoot(model), trackId);
5384
-
5385
- if (configuration) {
5386
- var _configuration$name;
5387
-
5388
- return (_configuration$name = configuration.name) === null || _configuration$name === void 0 ? void 0 : _configuration$name.value;
5389
- }
5390
- }
5391
-
5392
- return '';
5393
- }
5394
-
5395
- return /*#__PURE__*/React__default.createElement(core.Dialog, {
5396
- open: true,
5397
- maxWidth: "xl",
5398
- onClose: handleClose
5399
- }, /*#__PURE__*/React__default.createElement(core.DialogTitle, {
5400
- id: "search-results-dialog"
5401
- }, "Search Results", handleClose ? /*#__PURE__*/React__default.createElement(core.IconButton, {
5402
- "data-testid": "close-resultsDialog",
5403
- className: classes.closeButton,
5404
- onClick: function onClick() {
5405
- handleClose();
5406
- }
5407
- }, /*#__PURE__*/React__default.createElement(CloseIcon, 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 ? void 0 : _model$searchResults.length) === 0 || model.searchResults === undefined ? /*#__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.DialogContentText, {
5408
- id: "alert-dialog-slide-description"
5409
- }, "Showing results for ", /*#__PURE__*/React__default.createElement("b", null, model.searchQuery)), /*#__PURE__*/React__default.createElement(core.TableContainer, {
5410
- component: core.Paper
5411
- }, /*#__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, {
5412
- align: "right"
5413
- }, "Location"), /*#__PURE__*/React__default.createElement(core.TableCell, {
5414
- align: "right"
5415
- }, "Track"), /*#__PURE__*/React__default.createElement(core.TableCell, {
5416
- align: "right"
5417
- }))), /*#__PURE__*/React__default.createElement(core.TableBody, null, model.searchResults.map(function (result, index) {
5418
- return /*#__PURE__*/React__default.createElement(core.TableRow, {
5419
- key: "".concat(result.getLabel(), "-").concat(index)
5420
- }, /*#__PURE__*/React__default.createElement(core.TableCell, {
5421
- component: "th",
5422
- scope: "row"
5423
- }, result.getLabel()), /*#__PURE__*/React__default.createElement(core.TableCell, {
5424
- align: "right"
5425
- }, result.getLocation()), /*#__PURE__*/React__default.createElement(core.TableCell, {
5426
- align: "right"
5427
- }, getTrackName(result.getTrackId()) || 'N/A'), /*#__PURE__*/React__default.createElement(core.TableCell, {
5428
- align: "right"
5429
- }, /*#__PURE__*/React__default.createElement(core.Button, {
5430
- onClick: function onClick() {
5431
- handleClick(result.getLocation());
5432
- handleClose();
5433
- },
5434
- color: "primary",
5435
- variant: "contained"
5436
- }, "Go to location")), /*#__PURE__*/React__default.createElement(core.TableCell, {
5437
- align: "right"
5438
- }, /*#__PURE__*/React__default.createElement(core.Button, {
5439
- onClick: function onClick() {
5440
- handleClick(result.getLocation());
5441
- var resultTrackId = result.getTrackId();
5442
-
5443
- if (resultTrackId) {
5444
- model.showTrack(resultTrackId);
5445
- }
5446
-
5447
- handleClose();
5448
- },
5449
- disabled: !getTrackName(result.getTrackId()),
5450
- color: "primary",
5451
- variant: "contained"
5452
- }, "Show Track")));
5453
- })))))), /*#__PURE__*/React__default.createElement(core.Divider, null), /*#__PURE__*/React__default.createElement(core.DialogActions, null, /*#__PURE__*/React__default.createElement(core.Button, {
5454
- onClick: function onClick() {
5455
- handleClose();
5456
- },
5457
- color: "primary"
5458
- }, "Cancel")));
5459
- }
5460
-
5461
- var useStyles$j = /*#__PURE__*/core.makeStyles(function (theme) {
5326
+ var useStyles$i = /*#__PURE__*/core.makeStyles(function (theme) {
5462
5327
  return {
5463
5328
  importFormContainer: {
5464
5329
  padding: theme.spacing(2)
@@ -5468,18 +5333,11 @@ var useStyles$j = /*#__PURE__*/core.makeStyles(function (theme) {
5468
5333
  }
5469
5334
  };
5470
5335
  });
5471
- var ErrorDisplay = /*#__PURE__*/mobxReact.observer(function (_ref) {
5472
- var error = _ref.error;
5473
- return /*#__PURE__*/React__default.createElement(core.Typography, {
5474
- variant: "h6",
5475
- color: "error"
5476
- }, "".concat(error));
5477
- });
5478
- var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5336
+ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref) {
5479
5337
  var _regions$;
5480
5338
 
5481
- var model = _ref2.model;
5482
- var classes = useStyles$j();
5339
+ var model = _ref.model;
5340
+ var classes = useStyles$i();
5483
5341
  var session = util.getSession(model);
5484
5342
  var assemblyNames = session.assemblyNames,
5485
5343
  assemblyManager = session.assemblyManager,
@@ -5518,14 +5376,11 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5518
5376
 
5519
5377
  function fetchResults(_x, _x2) {
5520
5378
  return _fetchResults.apply(this, arguments);
5521
- }
5522
- /**
5523
- * gets a string as input, or use stored option results from previous query,
5524
- * then re-query and
5525
- * 1) if it has multiple results: pop a dialog
5526
- * 2) if it's a single result navigate to it
5527
- * 3) else assume it's a locstring and navigate to it
5528
- */
5379
+ } // gets a string as input, or use stored option results from previous query,
5380
+ // then re-query and
5381
+ // 1) if it has multiple results: pop a dialog
5382
+ // 2) if it's a single result navigate to it
5383
+ // 3) else assume it's a locstring and navigate to it
5529
5384
 
5530
5385
 
5531
5386
  function _fetchResults() {
@@ -5651,13 +5506,13 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5651
5506
  return _handleSelectedRegion.apply(this, arguments);
5652
5507
  }
5653
5508
 
5654
- return /*#__PURE__*/React__default.createElement("div", null, err ? /*#__PURE__*/React__default.createElement(ErrorDisplay, {
5509
+ return /*#__PURE__*/React__default.createElement("div", null, err ? /*#__PURE__*/React__default.createElement(ErrorMessage, {
5655
5510
  error: err
5656
5511
  }) : null, /*#__PURE__*/React__default.createElement(core.Container, {
5657
5512
  className: classes.importFormContainer
5658
5513
  }, /*#__PURE__*/React__default.createElement("form", {
5659
5514
  onSubmit: function onSubmit(event) {
5660
- event.preventDefault();
5515
+ return event.preventDefault();
5661
5516
  }
5662
5517
  }, /*#__PURE__*/React__default.createElement(core.Grid, {
5663
5518
  container: true,
@@ -5675,20 +5530,24 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5675
5530
  selected: selectedAsm
5676
5531
  })), /*#__PURE__*/React__default.createElement(core.Grid, {
5677
5532
  item: true
5678
- }, selectedAsm ? err ? /*#__PURE__*/React__default.createElement(core.Typography, {
5679
- color: "error"
5680
- }, "X") : selectedRegion && model.volatileWidth ? /*#__PURE__*/React__default.createElement(RefNameAutocomplete$1, {
5533
+ }, selectedAsm ? err ? /*#__PURE__*/React__default.createElement(CloseIcon, {
5534
+ style: {
5535
+ color: 'red'
5536
+ }
5537
+ }) : selectedRegion ? /*#__PURE__*/React__default.createElement(RefNameAutocomplete$1, {
5681
5538
  fetchResults: fetchResults,
5682
5539
  model: model,
5683
5540
  assemblyName: assemblyError ? undefined : selectedAsm,
5684
5541
  value: selectedRegion,
5542
+ // note: minWidth 270 accomodates full width of helperText
5543
+ minWidth: 270,
5685
5544
  onSelect: function onSelect(option) {
5686
5545
  return setOption(option);
5687
5546
  },
5688
5547
  TextFieldProps: {
5689
5548
  margin: 'normal',
5690
5549
  variant: 'outlined',
5691
- helperText: 'Enter a sequence or location'
5550
+ helperText: 'Enter sequence name, feature name, or location'
5692
5551
  }
5693
5552
  }) : /*#__PURE__*/React__default.createElement(core.CircularProgress, {
5694
5553
  role: "progressbar",
@@ -5696,6 +5555,8 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5696
5555
  disableShrink: true
5697
5556
  }) : null), /*#__PURE__*/React__default.createElement(core.Grid, {
5698
5557
  item: true
5558
+ }), /*#__PURE__*/React__default.createElement(core.Grid, {
5559
+ item: true
5699
5560
  }, /*#__PURE__*/React__default.createElement(core.Button, {
5700
5561
  type: "submit",
5701
5562
  disabled: !selectedRegion,
@@ -5776,7 +5637,7 @@ var MiniControls = /*#__PURE__*/mobxReact.observer(function (props) {
5776
5637
  }));
5777
5638
  });
5778
5639
 
5779
- var useStyles$k = /*#__PURE__*/core.makeStyles(function (theme) {
5640
+ var useStyles$j = /*#__PURE__*/core.makeStyles(function (theme) {
5780
5641
  return {
5781
5642
  loadingMessage: {
5782
5643
  padding: theme.spacing(5)
@@ -5872,7 +5733,7 @@ function _fetchSequence() {
5872
5733
  function SequenceDialog(_ref) {
5873
5734
  var model = _ref.model,
5874
5735
  handleClose = _ref.handleClose;
5875
- var classes = useStyles$k();
5736
+ var classes = useStyles$j();
5876
5737
  var session = util.getSession(model);
5877
5738
 
5878
5739
  var _useState = React.useState(),
@@ -6037,6 +5898,150 @@ function SequenceDialog(_ref) {
6037
5898
 
6038
5899
  var SequenceDialog$1 = /*#__PURE__*/mobxReact.observer(SequenceDialog);
6039
5900
 
5901
+ var useStyles$k = /*#__PURE__*/core.makeStyles(function (theme) {
5902
+ return {
5903
+ dialogContent: {
5904
+ width: '80em'
5905
+ },
5906
+ closeButton: {
5907
+ position: 'absolute',
5908
+ right: theme.spacing(1),
5909
+ top: theme.spacing(1),
5910
+ color: theme.palette.grey[500]
5911
+ }
5912
+ };
5913
+ });
5914
+ function SearchResultsDialog$1(_ref) {
5915
+ var _model$searchResults;
5916
+
5917
+ var model = _ref.model,
5918
+ optAssemblyName = _ref.optAssemblyName,
5919
+ handleClose = _ref.handleClose;
5920
+ var classes = useStyles$k();
5921
+ var session = util.getSession(model);
5922
+
5923
+ var _getEnv = mobxStateTree.getEnv(session),
5924
+ pluginManager = _getEnv.pluginManager;
5925
+
5926
+ var assemblyManager = session.assemblyManager;
5927
+ var assemblyName = optAssemblyName;
5928
+
5929
+ if (model.displayedRegions.length > 0) {
5930
+ var _model$displayedRegio;
5931
+
5932
+ assemblyName = (_model$displayedRegio = model.displayedRegions[0]) === null || _model$displayedRegio === void 0 ? void 0 : _model$displayedRegio.assemblyName;
5933
+ }
5934
+
5935
+ if (!assemblyName) {
5936
+ throw new Error("Assembly name not found");
5937
+ }
5938
+
5939
+ var assembly = assemblyManager.get(assemblyName);
5940
+
5941
+ if (!assembly) {
5942
+ throw new Error("assembly ".concat(assemblyName, " not found"));
5943
+ }
5944
+
5945
+ if (!assembly.regions) {
5946
+ throw new Error("assembly ".concat(assemblyName, " regions not loaded"));
5947
+ }
5948
+
5949
+ var assemblyRegions = assembly.regions;
5950
+
5951
+ function handleClick(location) {
5952
+ try {
5953
+ var newRegion = assemblyRegions.find(function (region) {
5954
+ return location === region.refName;
5955
+ });
5956
+
5957
+ if (newRegion) {
5958
+ model.setDisplayedRegions([newRegion]); // we use showAllRegions after setDisplayedRegions to make the entire
5959
+ // region visible, xref #1703
5960
+
5961
+ model.showAllRegions();
5962
+ } else {
5963
+ model.navToLocString(location, assemblyName);
5964
+ }
5965
+ } catch (e) {
5966
+ console.warn(e);
5967
+ session.notify("".concat(e), 'warning');
5968
+ }
5969
+ }
5970
+
5971
+ function getTrackName(trackId) {
5972
+ if (trackId) {
5973
+ var trackConfigSchema = pluginManager.pluggableConfigSchemaType('track');
5974
+ var configuration = mobxStateTree.resolveIdentifier(trackConfigSchema, mobxStateTree.getRoot(model), trackId);
5975
+
5976
+ if (configuration) {
5977
+ var _configuration$name;
5978
+
5979
+ return (_configuration$name = configuration.name) === null || _configuration$name === void 0 ? void 0 : _configuration$name.value;
5980
+ }
5981
+ }
5982
+
5983
+ return '';
5984
+ }
5985
+
5986
+ return /*#__PURE__*/React__default.createElement(core.Dialog, {
5987
+ open: true,
5988
+ maxWidth: "xl",
5989
+ onClose: handleClose
5990
+ }, /*#__PURE__*/React__default.createElement(core.DialogTitle, null, "Search results", handleClose ? /*#__PURE__*/React__default.createElement(core.IconButton, {
5991
+ "data-testid": "close-resultsDialog",
5992
+ className: classes.closeButton,
5993
+ onClick: function onClick() {
5994
+ handleClose();
5995
+ }
5996
+ }, /*#__PURE__*/React__default.createElement(CloseIcon, 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, {
5997
+ component: core.Paper
5998
+ }, /*#__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, {
5999
+ align: "right"
6000
+ }, "Location"), /*#__PURE__*/React__default.createElement(core.TableCell, {
6001
+ align: "right"
6002
+ }, "Track"), /*#__PURE__*/React__default.createElement(core.TableCell, {
6003
+ align: "right"
6004
+ }))), /*#__PURE__*/React__default.createElement(core.TableBody, null, model.searchResults.map(function (result) {
6005
+ return /*#__PURE__*/React__default.createElement(core.TableRow, {
6006
+ key: "".concat(result.getId())
6007
+ }, /*#__PURE__*/React__default.createElement(core.TableCell, {
6008
+ component: "th",
6009
+ scope: "row"
6010
+ }, result.getLabel()), /*#__PURE__*/React__default.createElement(core.TableCell, {
6011
+ align: "right"
6012
+ }, result.getLocation()), /*#__PURE__*/React__default.createElement(core.TableCell, {
6013
+ align: "right"
6014
+ }, getTrackName(result.getTrackId()) || 'N/A'), /*#__PURE__*/React__default.createElement(core.TableCell, {
6015
+ align: "right"
6016
+ }, /*#__PURE__*/React__default.createElement(core.Button, {
6017
+ onClick: function onClick() {
6018
+ handleClick(result.getLocation());
6019
+ var resultTrackId = result.getTrackId();
6020
+
6021
+ if (resultTrackId) {
6022
+ model.showTrack(resultTrackId);
6023
+ }
6024
+
6025
+ handleClose();
6026
+ },
6027
+ disabled: !getTrackName(result.getTrackId()),
6028
+ color: "primary",
6029
+ variant: "contained"
6030
+ }, "Go")));
6031
+ })))))), /*#__PURE__*/React__default.createElement(core.Divider, null), /*#__PURE__*/React__default.createElement(core.DialogActions, null, /*#__PURE__*/React__default.createElement(core.Button, {
6032
+ onClick: function onClick() {
6033
+ return handleClose();
6034
+ },
6035
+ color: "primary"
6036
+ }, "Cancel")));
6037
+ }
6038
+
6039
+ var SearchResultsDialog$2 = {
6040
+ __proto__: null,
6041
+ useStyles: useStyles$k,
6042
+ 'default': SearchResultsDialog$1
6043
+ };
6044
+
6040
6045
  var useStyles$l = /*#__PURE__*/core.makeStyles(function (theme) {
6041
6046
  return {
6042
6047
  note: {
@@ -6097,7 +6102,7 @@ var LinearGenomeView = /*#__PURE__*/mobxReact.observer(function (_ref) {
6097
6102
  handleClose: function handleClose() {
6098
6103
  model.setSequenceDialogOpen(false);
6099
6104
  }
6100
- }) : null, model.isSearchDialogDisplayed ? /*#__PURE__*/React__default.createElement(SearchResultsDialog, {
6105
+ }) : null, model.isSearchDialogDisplayed ? /*#__PURE__*/React__default.createElement(SearchResultsDialog$1, {
6101
6106
  model: model,
6102
6107
  handleClose: function handleClose() {
6103
6108
  model.setSearchResults(undefined, undefined);
@@ -7200,7 +7205,8 @@ function stateModelFactory$1(pluginManager) {
7200
7205
  self.zoomTo(self.bpPerPx);
7201
7206
 
7202
7207
  if ( // already zoomed all the way in
7203
- targetBpPerPx < self.bpPerPx && self.bpPerPx === self.minBpPerPx || targetBpPerPx > self.bpPerPx && self.bpPerPx === self.maxBpPerPx) {
7208
+ targetBpPerPx < self.bpPerPx && self.bpPerPx === self.minBpPerPx || // already zoomed all the way out
7209
+ targetBpPerPx > self.bpPerPx && self.bpPerPx === self.maxBpPerPx) {
7204
7210
  return;
7205
7211
  }
7206
7212
 
@@ -7729,6 +7735,43 @@ var LinearGenomeViewPlugin = /*#__PURE__*/function (_Plugin) {
7729
7735
  }(Plugin);
7730
7736
 
7731
7737
  var useStyles$m = /*#__PURE__*/core.makeStyles(function (theme) {
7738
+ return {
7739
+ closeButton: {
7740
+ position: 'absolute',
7741
+ right: theme.spacing(1),
7742
+ top: theme.spacing(1),
7743
+ color: theme.palette.grey[500]
7744
+ }
7745
+ };
7746
+ });
7747
+ function HelpDialog$1(_ref) {
7748
+ var handleClose = _ref.handleClose;
7749
+ var classes = useStyles$m();
7750
+ return /*#__PURE__*/React__default.createElement(core.Dialog, {
7751
+ open: true,
7752
+ maxWidth: "xl",
7753
+ onClose: handleClose
7754
+ }, /*#__PURE__*/React__default.createElement(core.DialogTitle, null, "Using the search box", handleClose ? /*#__PURE__*/React__default.createElement(core.IconButton, {
7755
+ "data-testid": "close-resultsDialog",
7756
+ className: classes.closeButton,
7757
+ onClick: function onClick() {
7758
+ handleClose();
7759
+ }
7760
+ }, /*#__PURE__*/React__default.createElement(CloseIcon, null)) : null), /*#__PURE__*/React__default.createElement(core.Divider, null), /*#__PURE__*/React__default.createElement(core.DialogContent, null, /*#__PURE__*/React__default.createElement("h3", null, "Searching"), /*#__PURE__*/React__default.createElement("ul", null, /*#__PURE__*/React__default.createElement("li", null, "Jump to a feature or reference sequence by typing its name in the location box and pressing Enter."), /*#__PURE__*/React__default.createElement("li", null, "Jump to a specific region by typing the region into the location box as: ", /*#__PURE__*/React__default.createElement("code", null, "ref:start..end"), " or ", /*#__PURE__*/React__default.createElement("code", null, "ref:start-end"), ". Commas are allowed in the start and end coordinates.")), /*#__PURE__*/React__default.createElement("h3", null, "Example Searches"), /*#__PURE__*/React__default.createElement("ul", null, /*#__PURE__*/React__default.createElement("li", null, /*#__PURE__*/React__default.createElement("code", null, "BRCA"), " - searches for the feature named BRCA"), /*#__PURE__*/React__default.createElement("li", null, /*#__PURE__*/React__default.createElement("code", null, "chr4"), " - jumps to chromosome 4"), /*#__PURE__*/React__default.createElement("li", null, /*#__PURE__*/React__default.createElement("code", null, "chr4:79,500,000..80,000,000"), " - jumps the region on chromosome 4 between 79.5Mb and 80Mb."))), /*#__PURE__*/React__default.createElement(core.Divider, null), /*#__PURE__*/React__default.createElement(core.DialogActions, null, /*#__PURE__*/React__default.createElement(core.Button, {
7761
+ onClick: function onClick() {
7762
+ return handleClose();
7763
+ },
7764
+ color: "primary"
7765
+ }, "Close")));
7766
+ }
7767
+
7768
+ var HelpDialog$2 = {
7769
+ __proto__: null,
7770
+ useStyles: useStyles$m,
7771
+ 'default': HelpDialog$1
7772
+ };
7773
+
7774
+ var useStyles$n = /*#__PURE__*/core.makeStyles(function (theme) {
7732
7775
  return {
7733
7776
  root: {
7734
7777
  width: 500
@@ -7748,7 +7791,7 @@ var useStyles$m = /*#__PURE__*/core.makeStyles(function (theme) {
7748
7791
  function SetMaxHeightDlg$1(props) {
7749
7792
  var model = props.model,
7750
7793
  handleClose = props.handleClose;
7751
- var classes = useStyles$m();
7794
+ var classes = useStyles$n();
7752
7795
  var _model$maxHeight = model.maxHeight,
7753
7796
  maxHeight = _model$maxHeight === void 0 ? '' : _model$maxHeight;
7754
7797