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

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'));
@@ -2518,7 +2520,9 @@ function mathPower(num) {
2518
2520
  return "".concat(mathPower(~~(num / 1000)), ",").concat("00".concat(~~(num % 1000)).substr(-3, 3));
2519
2521
  }
2520
2522
 
2521
- var useStyles$4 = /*#__PURE__*/styles.makeStyles(function () {
2523
+ var useStyles$4 = /*#__PURE__*/styles.makeStyles(function
2524
+ /* theme */
2525
+ () {
2522
2526
  return {
2523
2527
  majorTickLabel: {
2524
2528
  fontSize: '11px'
@@ -2701,7 +2705,7 @@ function OverviewRubberBand(_ref2) {
2701
2705
 
2702
2706
 
2703
2707
  if (controlsRef.current && startX !== undefined && currentX === undefined) {
2704
- var clickedAt = overview.pxToBp(startX);
2708
+ var clickedAt = overview.pxToBp(startX - cytobandOffset);
2705
2709
  model.centerAt(Math.round(clickedAt.coord), clickedAt.refName, clickedAt.index);
2706
2710
  }
2707
2711
 
@@ -2905,7 +2909,7 @@ var useStyles$6 = /*#__PURE__*/core.makeStyles(function (theme) {
2905
2909
  height: HEADER_OVERVIEW_HEIGHT,
2906
2910
  pointerEvents: 'none',
2907
2911
  zIndex: 100,
2908
- border: '1px solid red'
2912
+ border: '1px solid'
2909
2913
  },
2910
2914
  overview: {
2911
2915
  height: HEADER_BAR_HEIGHT,
@@ -3149,6 +3153,8 @@ var ScaleBar = /*#__PURE__*/mobxReact.observer(function (_ref6) {
3149
3153
  var lastOverviewPx = overview.bpToPx(_objectSpread2(_objectSpread2({}, last), {}, {
3150
3154
  coord: last.reversed ? last.start : last.end
3151
3155
  })) || 0;
3156
+ var color = showCytobands ? '#f00' : scaleBarColor;
3157
+ var transparency = showCytobands ? 0.1 : 0.3;
3152
3158
  return /*#__PURE__*/React__default.createElement("div", {
3153
3159
  className: classes.scaleBar
3154
3160
  }, /*#__PURE__*/React__default.createElement("div", {
@@ -3156,7 +3162,8 @@ var ScaleBar = /*#__PURE__*/mobxReact.observer(function (_ref6) {
3156
3162
  style: {
3157
3163
  width: lastOverviewPx - firstOverviewPx,
3158
3164
  left: firstOverviewPx + cytobandOffset,
3159
- background: showCytobands ? undefined : core.alpha(scaleBarColor, 0.3)
3165
+ background: core.alpha(color, transparency),
3166
+ borderColor: color
3160
3167
  }
3161
3168
  }), overviewVisibleRegions.map(function (block, idx) {
3162
3169
  return !(block instanceof blockTypes.ContentBlock) ? /*#__PURE__*/React__default.createElement("div", {
@@ -3374,7 +3381,7 @@ var SVGHeader = function SVGHeader(_ref3) {
3374
3381
  block: block
3375
3382
  }), /*#__PURE__*/React__default.createElement("rect", {
3376
3383
  stroke: "red",
3377
- fill: "none",
3384
+ fill: "rgb(255,0,0,0.1)",
3378
3385
  width: Math.max(lastOverviewPx - firstOverviewPx, 0.5),
3379
3386
  height: HEADER_OVERVIEW_HEIGHT - 1,
3380
3387
  x: firstOverviewPx,
@@ -3549,6 +3556,9 @@ function dedupe() {
3549
3556
  });
3550
3557
  }
3551
3558
 
3559
+ var HelpDialog = /*#__PURE__*/React.lazy(function () {
3560
+ return Promise.resolve().then(function () { return HelpDialog$2; });
3561
+ }); // the logic of this method is to only apply a filter to RefSequenceResults
3552
3562
  // because they do not have a matchedObject. the trix search results already
3553
3563
  // filter so don't need re-filtering
3554
3564
 
@@ -3580,6 +3590,8 @@ function RefNameAutocomplete(_ref) {
3580
3590
  style = _ref.style,
3581
3591
  fetchResults = _ref.fetchResults,
3582
3592
  value = _ref.value,
3593
+ _ref$minWidth = _ref.minWidth,
3594
+ minWidth = _ref$minWidth === void 0 ? 200 : _ref$minWidth,
3583
3595
  _ref$TextFieldProps = _ref.TextFieldProps,
3584
3596
  TextFieldProps = _ref$TextFieldProps === void 0 ? {} : _ref$TextFieldProps;
3585
3597
  var session = util.getSession(model);
@@ -3595,20 +3607,25 @@ function RefNameAutocomplete(_ref) {
3595
3607
  loaded = _useState4[0],
3596
3608
  setLoaded = _useState4[1];
3597
3609
 
3598
- var _useState5 = React.useState(''),
3610
+ var _useState5 = React.useState(false),
3599
3611
  _useState6 = _slicedToArray(_useState5, 2),
3600
- currentSearch = _useState6[0],
3601
- setCurrentSearch = _useState6[1];
3612
+ isHelpDialogDisplayed = _useState6[0],
3613
+ setHelpDialogDisplayed = _useState6[1];
3602
3614
 
3603
3615
  var _useState7 = React.useState(''),
3604
3616
  _useState8 = _slicedToArray(_useState7, 2),
3605
- inputValue = _useState8[0],
3606
- setInputValue = _useState8[1];
3617
+ currentSearch = _useState8[0],
3618
+ setCurrentSearch = _useState8[1];
3607
3619
 
3608
- var _useState9 = React.useState(),
3620
+ var _useState9 = React.useState(''),
3609
3621
  _useState10 = _slicedToArray(_useState9, 2),
3610
- searchOptions = _useState10[0],
3611
- setSearchOptions = _useState10[1];
3622
+ inputValue = _useState10[0],
3623
+ setInputValue = _useState10[1];
3624
+
3625
+ var _useState11 = React.useState(),
3626
+ _useState12 = _slicedToArray(_useState11, 2),
3627
+ searchOptions = _useState12[0],
3628
+ setSearchOptions = _useState12[1];
3612
3629
 
3613
3630
  var debouncedSearch = util.useDebounce(currentSearch, 300);
3614
3631
  var coarseVisibleLocStrings = model.coarseVisibleLocStrings,
@@ -3688,12 +3705,13 @@ function RefNameAutocomplete(_ref) {
3688
3705
  active = false;
3689
3706
  };
3690
3707
  }, [assemblyName, fetchResults, debouncedSearch, session, model]);
3691
- var inputBoxVal = coarseVisibleLocStrings || value || ''; // heuristic, text width + icon width, minimum 200
3708
+ var inputBoxVal = coarseVisibleLocStrings || value || ''; // heuristic, text width + icon width
3709
+ // + 45 accomodates help icon and search icon
3692
3710
 
3693
- var width = Math.min(Math.max(util.measureText(inputBoxVal, 16) + 25, 200), 550); // notes on implementation:
3711
+ var width = Math.min(Math.max(util.measureText(inputBoxVal, 16) + 45, minWidth), 550); // notes on implementation:
3694
3712
  // The selectOnFocus setting helps highlight the field when clicked
3695
3713
 
3696
- return /*#__PURE__*/React__default.createElement(Autocomplete, {
3714
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Autocomplete, {
3697
3715
  id: "refNameAutocomplete-".concat(model.id),
3698
3716
  "data-testid": "autocomplete",
3699
3717
  disableListWrap: true,
@@ -3777,7 +3795,11 @@ function RefNameAutocomplete(_ref) {
3777
3795
  style: {
3778
3796
  marginRight: 7
3779
3797
  }
3780
- }, /*#__PURE__*/React__default.createElement(SearchIcon, null)), params.InputProps.endAdornment)
3798
+ }, /*#__PURE__*/React__default.createElement(SearchIcon, null), /*#__PURE__*/React__default.createElement(core.IconButton, {
3799
+ onClick: function onClick() {
3800
+ return setHelpDialogDisplayed(true);
3801
+ }
3802
+ }, /*#__PURE__*/React__default.createElement(HelpIcon, null))), params.InputProps.endAdornment)
3781
3803
  }),
3782
3804
  placeholder: "Search for location",
3783
3805
  onChange: function onChange(e) {
@@ -3800,7 +3822,11 @@ function RefNameAutocomplete(_ref) {
3800
3822
  getOptionLabel: function getOptionLabel(option) {
3801
3823
  return (typeof option === 'string' ? option : option.result.getLabel()) || '';
3802
3824
  }
3803
- });
3825
+ }), isHelpDialogDisplayed ? /*#__PURE__*/React__default.createElement(HelpDialog, {
3826
+ handleClose: function handleClose() {
3827
+ return setHelpDialogDisplayed(false);
3828
+ }
3829
+ }) : null);
3804
3830
  }
3805
3831
 
3806
3832
  var RefNameAutocomplete$1 = /*#__PURE__*/mobxReact.observer(RefNameAutocomplete);
@@ -5307,158 +5333,10 @@ function TracksContainer(_ref) {
5307
5333
 
5308
5334
  var TracksContainer$1 = /*#__PURE__*/mobxReact.observer(TracksContainer);
5309
5335
 
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
- };
5336
+ var SearchResultsDialog = /*#__PURE__*/React.lazy(function () {
5337
+ return Promise.resolve().then(function () { return SearchResultsDialog$2; });
5322
5338
  });
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) {
5339
+ var useStyles$i = /*#__PURE__*/core.makeStyles(function (theme) {
5462
5340
  return {
5463
5341
  importFormContainer: {
5464
5342
  padding: theme.spacing(2)
@@ -5468,18 +5346,11 @@ var useStyles$j = /*#__PURE__*/core.makeStyles(function (theme) {
5468
5346
  }
5469
5347
  };
5470
5348
  });
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) {
5349
+ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref) {
5479
5350
  var _regions$;
5480
5351
 
5481
- var model = _ref2.model;
5482
- var classes = useStyles$j();
5352
+ var model = _ref.model;
5353
+ var classes = useStyles$i();
5483
5354
  var session = util.getSession(model);
5484
5355
  var assemblyNames = session.assemblyNames,
5485
5356
  assemblyManager = session.assemblyManager,
@@ -5518,14 +5389,11 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5518
5389
 
5519
5390
  function fetchResults(_x, _x2) {
5520
5391
  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
- */
5392
+ } // gets a string as input, or use stored option results from previous query,
5393
+ // then re-query and
5394
+ // 1) if it has multiple results: pop a dialog
5395
+ // 2) if it's a single result navigate to it
5396
+ // 3) else assume it's a locstring and navigate to it
5529
5397
 
5530
5398
 
5531
5399
  function _fetchResults() {
@@ -5651,13 +5519,13 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5651
5519
  return _handleSelectedRegion.apply(this, arguments);
5652
5520
  }
5653
5521
 
5654
- return /*#__PURE__*/React__default.createElement("div", null, err ? /*#__PURE__*/React__default.createElement(ErrorDisplay, {
5522
+ return /*#__PURE__*/React__default.createElement("div", null, err ? /*#__PURE__*/React__default.createElement(ErrorMessage, {
5655
5523
  error: err
5656
5524
  }) : null, /*#__PURE__*/React__default.createElement(core.Container, {
5657
5525
  className: classes.importFormContainer
5658
5526
  }, /*#__PURE__*/React__default.createElement("form", {
5659
5527
  onSubmit: function onSubmit(event) {
5660
- event.preventDefault();
5528
+ return event.preventDefault();
5661
5529
  }
5662
5530
  }, /*#__PURE__*/React__default.createElement(core.Grid, {
5663
5531
  container: true,
@@ -5675,20 +5543,24 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5675
5543
  selected: selectedAsm
5676
5544
  })), /*#__PURE__*/React__default.createElement(core.Grid, {
5677
5545
  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, {
5546
+ }, selectedAsm ? err ? /*#__PURE__*/React__default.createElement(CloseIcon, {
5547
+ style: {
5548
+ color: 'red'
5549
+ }
5550
+ }) : selectedRegion ? /*#__PURE__*/React__default.createElement(RefNameAutocomplete$1, {
5681
5551
  fetchResults: fetchResults,
5682
5552
  model: model,
5683
5553
  assemblyName: assemblyError ? undefined : selectedAsm,
5684
5554
  value: selectedRegion,
5555
+ // note: minWidth 270 accomodates full width of helperText
5556
+ minWidth: 270,
5685
5557
  onSelect: function onSelect(option) {
5686
5558
  return setOption(option);
5687
5559
  },
5688
5560
  TextFieldProps: {
5689
5561
  margin: 'normal',
5690
5562
  variant: 'outlined',
5691
- helperText: 'Enter a sequence or location'
5563
+ helperText: 'Enter sequence name, feature name, or location'
5692
5564
  }
5693
5565
  }) : /*#__PURE__*/React__default.createElement(core.CircularProgress, {
5694
5566
  role: "progressbar",
@@ -5696,6 +5568,8 @@ var ImportForm = /*#__PURE__*/mobxReact.observer(function (_ref2) {
5696
5568
  disableShrink: true
5697
5569
  }) : null), /*#__PURE__*/React__default.createElement(core.Grid, {
5698
5570
  item: true
5571
+ }), /*#__PURE__*/React__default.createElement(core.Grid, {
5572
+ item: true
5699
5573
  }, /*#__PURE__*/React__default.createElement(core.Button, {
5700
5574
  type: "submit",
5701
5575
  disabled: !selectedRegion,
@@ -5776,7 +5650,7 @@ var MiniControls = /*#__PURE__*/mobxReact.observer(function (props) {
5776
5650
  }));
5777
5651
  });
5778
5652
 
5779
- var useStyles$k = /*#__PURE__*/core.makeStyles(function (theme) {
5653
+ var useStyles$j = /*#__PURE__*/core.makeStyles(function (theme) {
5780
5654
  return {
5781
5655
  loadingMessage: {
5782
5656
  padding: theme.spacing(5)
@@ -5872,7 +5746,7 @@ function _fetchSequence() {
5872
5746
  function SequenceDialog(_ref) {
5873
5747
  var model = _ref.model,
5874
5748
  handleClose = _ref.handleClose;
5875
- var classes = useStyles$k();
5749
+ var classes = useStyles$j();
5876
5750
  var session = util.getSession(model);
5877
5751
 
5878
5752
  var _useState = React.useState(),
@@ -6037,6 +5911,150 @@ function SequenceDialog(_ref) {
6037
5911
 
6038
5912
  var SequenceDialog$1 = /*#__PURE__*/mobxReact.observer(SequenceDialog);
6039
5913
 
5914
+ var useStyles$k = /*#__PURE__*/core.makeStyles(function (theme) {
5915
+ return {
5916
+ dialogContent: {
5917
+ width: '80em'
5918
+ },
5919
+ closeButton: {
5920
+ position: 'absolute',
5921
+ right: theme.spacing(1),
5922
+ top: theme.spacing(1),
5923
+ color: theme.palette.grey[500]
5924
+ }
5925
+ };
5926
+ });
5927
+ function SearchResultsDialog$1(_ref) {
5928
+ var _model$searchResults;
5929
+
5930
+ var model = _ref.model,
5931
+ optAssemblyName = _ref.optAssemblyName,
5932
+ handleClose = _ref.handleClose;
5933
+ var classes = useStyles$k();
5934
+ var session = util.getSession(model);
5935
+
5936
+ var _getEnv = mobxStateTree.getEnv(session),
5937
+ pluginManager = _getEnv.pluginManager;
5938
+
5939
+ var assemblyManager = session.assemblyManager;
5940
+ var assemblyName = optAssemblyName;
5941
+
5942
+ if (model.displayedRegions.length > 0) {
5943
+ var _model$displayedRegio;
5944
+
5945
+ assemblyName = (_model$displayedRegio = model.displayedRegions[0]) === null || _model$displayedRegio === void 0 ? void 0 : _model$displayedRegio.assemblyName;
5946
+ }
5947
+
5948
+ if (!assemblyName) {
5949
+ throw new Error("Assembly name not found");
5950
+ }
5951
+
5952
+ var assembly = assemblyManager.get(assemblyName);
5953
+
5954
+ if (!assembly) {
5955
+ throw new Error("assembly ".concat(assemblyName, " not found"));
5956
+ }
5957
+
5958
+ if (!assembly.regions) {
5959
+ throw new Error("assembly ".concat(assemblyName, " regions not loaded"));
5960
+ }
5961
+
5962
+ var assemblyRegions = assembly.regions;
5963
+
5964
+ function handleClick(location) {
5965
+ try {
5966
+ var newRegion = assemblyRegions.find(function (region) {
5967
+ return location === region.refName;
5968
+ });
5969
+
5970
+ if (newRegion) {
5971
+ model.setDisplayedRegions([newRegion]); // we use showAllRegions after setDisplayedRegions to make the entire
5972
+ // region visible, xref #1703
5973
+
5974
+ model.showAllRegions();
5975
+ } else {
5976
+ model.navToLocString(location, assemblyName);
5977
+ }
5978
+ } catch (e) {
5979
+ console.warn(e);
5980
+ session.notify("".concat(e), 'warning');
5981
+ }
5982
+ }
5983
+
5984
+ function getTrackName(trackId) {
5985
+ if (trackId) {
5986
+ var trackConfigSchema = pluginManager.pluggableConfigSchemaType('track');
5987
+ var configuration = mobxStateTree.resolveIdentifier(trackConfigSchema, mobxStateTree.getRoot(model), trackId);
5988
+
5989
+ if (configuration) {
5990
+ var _configuration$name;
5991
+
5992
+ return (_configuration$name = configuration.name) === null || _configuration$name === void 0 ? void 0 : _configuration$name.value;
5993
+ }
5994
+ }
5995
+
5996
+ return '';
5997
+ }
5998
+
5999
+ return /*#__PURE__*/React__default.createElement(core.Dialog, {
6000
+ open: true,
6001
+ maxWidth: "xl",
6002
+ onClose: handleClose
6003
+ }, /*#__PURE__*/React__default.createElement(core.DialogTitle, null, "Search results", handleClose ? /*#__PURE__*/React__default.createElement(core.IconButton, {
6004
+ "data-testid": "close-resultsDialog",
6005
+ className: classes.closeButton,
6006
+ onClick: function onClick() {
6007
+ handleClose();
6008
+ }
6009
+ }, /*#__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, {
6010
+ component: core.Paper
6011
+ }, /*#__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, {
6012
+ align: "right"
6013
+ }, "Location"), /*#__PURE__*/React__default.createElement(core.TableCell, {
6014
+ align: "right"
6015
+ }, "Track"), /*#__PURE__*/React__default.createElement(core.TableCell, {
6016
+ align: "right"
6017
+ }))), /*#__PURE__*/React__default.createElement(core.TableBody, null, model.searchResults.map(function (result) {
6018
+ return /*#__PURE__*/React__default.createElement(core.TableRow, {
6019
+ key: "".concat(result.getId())
6020
+ }, /*#__PURE__*/React__default.createElement(core.TableCell, {
6021
+ component: "th",
6022
+ scope: "row"
6023
+ }, result.getLabel()), /*#__PURE__*/React__default.createElement(core.TableCell, {
6024
+ align: "right"
6025
+ }, result.getLocation()), /*#__PURE__*/React__default.createElement(core.TableCell, {
6026
+ align: "right"
6027
+ }, getTrackName(result.getTrackId()) || 'N/A'), /*#__PURE__*/React__default.createElement(core.TableCell, {
6028
+ align: "right"
6029
+ }, /*#__PURE__*/React__default.createElement(core.Button, {
6030
+ onClick: function onClick() {
6031
+ handleClick(result.getLocation());
6032
+ var resultTrackId = result.getTrackId();
6033
+
6034
+ if (resultTrackId) {
6035
+ model.showTrack(resultTrackId);
6036
+ }
6037
+
6038
+ handleClose();
6039
+ },
6040
+ disabled: !getTrackName(result.getTrackId()),
6041
+ color: "primary",
6042
+ variant: "contained"
6043
+ }, "Go")));
6044
+ })))))), /*#__PURE__*/React__default.createElement(core.Divider, null), /*#__PURE__*/React__default.createElement(core.DialogActions, null, /*#__PURE__*/React__default.createElement(core.Button, {
6045
+ onClick: function onClick() {
6046
+ return handleClose();
6047
+ },
6048
+ color: "primary"
6049
+ }, "Cancel")));
6050
+ }
6051
+
6052
+ var SearchResultsDialog$2 = {
6053
+ __proto__: null,
6054
+ useStyles: useStyles$k,
6055
+ 'default': SearchResultsDialog$1
6056
+ };
6057
+
6040
6058
  var useStyles$l = /*#__PURE__*/core.makeStyles(function (theme) {
6041
6059
  return {
6042
6060
  note: {
@@ -6097,7 +6115,7 @@ var LinearGenomeView = /*#__PURE__*/mobxReact.observer(function (_ref) {
6097
6115
  handleClose: function handleClose() {
6098
6116
  model.setSequenceDialogOpen(false);
6099
6117
  }
6100
- }) : null, model.isSearchDialogDisplayed ? /*#__PURE__*/React__default.createElement(SearchResultsDialog, {
6118
+ }) : null, model.isSearchDialogDisplayed ? /*#__PURE__*/React__default.createElement(SearchResultsDialog$1, {
6101
6119
  model: model,
6102
6120
  handleClose: function handleClose() {
6103
6121
  model.setSearchResults(undefined, undefined);
@@ -7200,7 +7218,8 @@ function stateModelFactory$1(pluginManager) {
7200
7218
  self.zoomTo(self.bpPerPx);
7201
7219
 
7202
7220
  if ( // already zoomed all the way in
7203
- targetBpPerPx < self.bpPerPx && self.bpPerPx === self.minBpPerPx || targetBpPerPx > self.bpPerPx && self.bpPerPx === self.maxBpPerPx) {
7221
+ targetBpPerPx < self.bpPerPx && self.bpPerPx === self.minBpPerPx || // already zoomed all the way out
7222
+ targetBpPerPx > self.bpPerPx && self.bpPerPx === self.maxBpPerPx) {
7204
7223
  return;
7205
7224
  }
7206
7225
 
@@ -7729,6 +7748,43 @@ var LinearGenomeViewPlugin = /*#__PURE__*/function (_Plugin) {
7729
7748
  }(Plugin);
7730
7749
 
7731
7750
  var useStyles$m = /*#__PURE__*/core.makeStyles(function (theme) {
7751
+ return {
7752
+ closeButton: {
7753
+ position: 'absolute',
7754
+ right: theme.spacing(1),
7755
+ top: theme.spacing(1),
7756
+ color: theme.palette.grey[500]
7757
+ }
7758
+ };
7759
+ });
7760
+ function HelpDialog$1(_ref) {
7761
+ var handleClose = _ref.handleClose;
7762
+ var classes = useStyles$m();
7763
+ return /*#__PURE__*/React__default.createElement(core.Dialog, {
7764
+ open: true,
7765
+ maxWidth: "xl",
7766
+ onClose: handleClose
7767
+ }, /*#__PURE__*/React__default.createElement(core.DialogTitle, null, "Using the search box", handleClose ? /*#__PURE__*/React__default.createElement(core.IconButton, {
7768
+ "data-testid": "close-resultsDialog",
7769
+ className: classes.closeButton,
7770
+ onClick: function onClick() {
7771
+ handleClose();
7772
+ }
7773
+ }, /*#__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, {
7774
+ onClick: function onClick() {
7775
+ return handleClose();
7776
+ },
7777
+ color: "primary"
7778
+ }, "Close")));
7779
+ }
7780
+
7781
+ var HelpDialog$2 = {
7782
+ __proto__: null,
7783
+ useStyles: useStyles$m,
7784
+ 'default': HelpDialog$1
7785
+ };
7786
+
7787
+ var useStyles$n = /*#__PURE__*/core.makeStyles(function (theme) {
7732
7788
  return {
7733
7789
  root: {
7734
7790
  width: 500
@@ -7748,7 +7804,7 @@ var useStyles$m = /*#__PURE__*/core.makeStyles(function (theme) {
7748
7804
  function SetMaxHeightDlg$1(props) {
7749
7805
  var model = props.model,
7750
7806
  handleClose = props.handleClose;
7751
- var classes = useStyles$m();
7807
+ var classes = useStyles$n();
7752
7808
  var _model$maxHeight = model.maxHeight,
7753
7809
  maxHeight = _model$maxHeight === void 0 ? '' : _model$maxHeight;
7754
7810