@jbrowse/plugin-linear-genome-view 1.7.8 → 1.7.11

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.
Files changed (53) hide show
  1. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.d.ts +1 -5
  2. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js +32 -120
  3. package/dist/BaseLinearDisplay/components/Tooltip.d.ts +8 -0
  4. package/dist/BaseLinearDisplay/components/Tooltip.js +125 -0
  5. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +4 -4
  6. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +3 -2
  7. package/dist/LinearBareDisplay/model.d.ts +1 -1
  8. package/dist/LinearBasicDisplay/model.d.ts +1 -2
  9. package/dist/LinearBasicDisplay/model.js +2 -2
  10. package/dist/LinearGenomeView/components/ExportSvgDialog.js +35 -25
  11. package/dist/LinearGenomeView/components/Header.d.ts +0 -1
  12. package/dist/LinearGenomeView/components/Header.js +3 -1
  13. package/dist/LinearGenomeView/components/HelpDialog.js +2 -3
  14. package/dist/LinearGenomeView/components/ImportForm.d.ts +0 -1
  15. package/dist/LinearGenomeView/components/ImportForm.js +40 -70
  16. package/dist/LinearGenomeView/components/LinearGenomeView.js +6 -2
  17. package/dist/LinearGenomeView/components/LinearGenomeView.test.js +2 -2
  18. package/dist/LinearGenomeView/components/OverviewScaleBar.d.ts +21 -5
  19. package/dist/LinearGenomeView/components/OverviewScaleBar.js +25 -18
  20. package/dist/LinearGenomeView/components/ScaleBar.d.ts +6 -2
  21. package/dist/LinearGenomeView/components/ScaleBar.js +8 -3
  22. package/dist/LinearGenomeView/components/SearchBox.js +36 -72
  23. package/dist/LinearGenomeView/components/SearchResultsDialog.d.ts +1 -1
  24. package/dist/LinearGenomeView/components/SearchResultsDialog.js +0 -1
  25. package/dist/LinearGenomeView/components/TrackLabel.js +25 -41
  26. package/dist/LinearGenomeView/components/util.d.ts +12 -0
  27. package/dist/LinearGenomeView/components/util.js +59 -0
  28. package/dist/LinearGenomeView/index.d.ts +7 -11
  29. package/dist/LinearGenomeView/index.js +60 -33
  30. package/dist/LinearGenomeView/index.test.js +22 -5
  31. package/dist/index.d.ts +3 -3
  32. package/dist/index.js +22 -11
  33. package/package.json +3 -2
  34. package/src/BaseLinearDisplay/components/BaseLinearDisplay.tsx +4 -89
  35. package/src/BaseLinearDisplay/components/Tooltip.tsx +97 -0
  36. package/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx +11 -4
  37. package/src/LinearBasicDisplay/model.ts +2 -4
  38. package/src/LinearGenomeView/components/ExportSvgDialog.tsx +24 -11
  39. package/src/LinearGenomeView/components/Header.tsx +2 -1
  40. package/src/LinearGenomeView/components/HelpDialog.tsx +5 -4
  41. package/src/LinearGenomeView/components/ImportForm.tsx +18 -25
  42. package/src/LinearGenomeView/components/LinearGenomeView.test.js +2 -2
  43. package/src/LinearGenomeView/components/LinearGenomeView.tsx +16 -10
  44. package/src/LinearGenomeView/components/OverviewScaleBar.tsx +42 -34
  45. package/src/LinearGenomeView/components/ScaleBar.tsx +6 -9
  46. package/src/LinearGenomeView/components/SearchBox.tsx +18 -29
  47. package/src/LinearGenomeView/components/SearchResultsDialog.tsx +0 -1
  48. package/src/LinearGenomeView/components/TrackLabel.tsx +25 -28
  49. package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap +4 -21
  50. package/src/LinearGenomeView/components/util.ts +43 -0
  51. package/src/LinearGenomeView/index.test.ts +20 -5
  52. package/src/LinearGenomeView/index.tsx +56 -27
  53. package/src/index.ts +35 -30
@@ -11,8 +11,6 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
11
11
 
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
 
14
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
-
16
14
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
15
 
18
16
  var _react = _interopRequireDefault(require("react"));
@@ -21,8 +19,6 @@ var _mobxReact = require("mobx-react");
21
19
 
22
20
  var _core = require("@material-ui/core");
23
21
 
24
- var _BaseResults = _interopRequireDefault(require("@jbrowse/core/TextSearch/BaseResults"));
25
-
26
22
  var _util = require("@jbrowse/core/util");
27
23
 
28
24
  var _RefNameAutocomplete = _interopRequireDefault(require("./RefNameAutocomplete"));
@@ -52,101 +48,61 @@ function SearchBox(_ref) {
52
48
  rankSearchResults = model.rankSearchResults;
53
49
  var assemblyName = assemblyNames[0];
54
50
  var assembly = assemblyManager.get(assemblyName);
55
- var searchScope = model.searchScope(assemblyName);
56
-
57
- function fetchResults(_x, _x2) {
58
- return _fetchResults.apply(this, arguments);
59
- } // gets a string as input, or use stored option results from previous query,
51
+ var searchScope = model.searchScope(assemblyName); // gets a string as input, or use stored option results from previous query,
60
52
  // then re-query and
61
53
  // 1) if it has multiple results: pop a dialog
62
54
  // 2) if it's a single result navigate to it
63
55
  // 3) else assume it's a locstring and navigate to it
64
56
 
65
-
66
- function _fetchResults() {
67
- _fetchResults = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(query, searchType) {
68
- var _assembly$allRefNames;
69
-
70
- var textSearchResults, refNameResults;
71
- return _regenerator.default.wrap(function _callee$(_context) {
72
- while (1) {
73
- switch (_context.prev = _context.next) {
74
- case 0:
75
- if (!textSearchManager) {
76
- console.warn('No text search manager');
77
- }
78
-
79
- _context.next = 3;
80
- return textSearchManager === null || textSearchManager === void 0 ? void 0 : textSearchManager.search({
81
- queryString: query,
82
- searchType: searchType
83
- }, searchScope, rankSearchResults);
84
-
85
- case 3:
86
- textSearchResults = _context.sent;
87
- refNameResults = assembly === null || assembly === void 0 ? void 0 : (_assembly$allRefNames = assembly.allRefNames) === null || _assembly$allRefNames === void 0 ? void 0 : _assembly$allRefNames.filter(function (refName) {
88
- return refName.startsWith(query);
89
- }).map(function (r) {
90
- return new _BaseResults.default({
91
- label: r
92
- });
93
- }).slice(0, 10);
94
- return _context.abrupt("return", (0, _util2.dedupe)([].concat((0, _toConsumableArray2.default)(refNameResults || []), (0, _toConsumableArray2.default)(textSearchResults || [])), function (elt) {
95
- return elt.getId();
96
- }));
97
-
98
- case 6:
99
- case "end":
100
- return _context.stop();
101
- }
102
- }
103
- }, _callee);
104
- }));
105
- return _fetchResults.apply(this, arguments);
106
- }
107
-
108
- function handleSelectedRegion(_x3) {
57
+ function handleSelectedRegion(_x) {
109
58
  return _handleSelectedRegion.apply(this, arguments);
110
59
  }
111
60
 
112
61
  function _handleSelectedRegion() {
113
- _handleSelectedRegion = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(option) {
62
+ _handleSelectedRegion = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(option) {
114
63
  var trackId, location, label, _location$split, _location$split2, ref, rest, allRefs, results;
115
64
 
116
- return _regenerator.default.wrap(function _callee2$(_context2) {
65
+ return _regenerator.default.wrap(function _callee$(_context) {
117
66
  while (1) {
118
- switch (_context2.prev = _context2.next) {
67
+ switch (_context.prev = _context.next) {
119
68
  case 0:
120
69
  trackId = option.getTrackId();
121
70
  location = option.getLocation();
122
71
  label = option.getLabel();
123
72
  _location$split = location.split(':'), _location$split2 = (0, _slicedToArray2.default)(_location$split, 2), ref = _location$split2[0], rest = _location$split2[1];
124
73
  allRefs = (assembly === null || assembly === void 0 ? void 0 : assembly.allRefNames) || [];
125
- _context2.prev = 5;
74
+ _context.prev = 5;
126
75
 
127
76
  if (!(allRefs.includes(location) || allRefs.includes(ref) && rest !== undefined && !Number.isNaN(parseInt(rest, 10)))) {
128
- _context2.next = 10;
77
+ _context.next = 10;
129
78
  break;
130
79
  }
131
80
 
132
81
  model.navToLocString(location, assemblyName);
133
- _context2.next = 21;
82
+ _context.next = 21;
134
83
  break;
135
84
 
136
85
  case 10:
137
- _context2.next = 12;
138
- return fetchResults(label, 'exact');
86
+ _context.next = 12;
87
+ return (0, _util2.fetchResults)({
88
+ queryString: label,
89
+ searchType: 'exact',
90
+ searchScope: searchScope,
91
+ rankSearchResults: rankSearchResults,
92
+ textSearchManager: textSearchManager,
93
+ assembly: assembly
94
+ });
139
95
 
140
96
  case 12:
141
- results = _context2.sent;
97
+ results = _context.sent;
142
98
 
143
99
  if (!(results.length > 1)) {
144
- _context2.next = 18;
100
+ _context.next = 18;
145
101
  break;
146
102
  }
147
103
 
148
104
  model.setSearchResults(results, label.toLowerCase());
149
- return _context2.abrupt("return");
105
+ return _context.abrupt("return");
150
106
 
151
107
  case 18:
152
108
  if (results.length === 1) {
@@ -162,21 +118,21 @@ function SearchBox(_ref) {
162
118
  }
163
119
 
164
120
  case 21:
165
- _context2.next = 27;
121
+ _context.next = 27;
166
122
  break;
167
123
 
168
124
  case 23:
169
- _context2.prev = 23;
170
- _context2.t0 = _context2["catch"](5);
171
- console.error(_context2.t0);
172
- session.notify("".concat(_context2.t0), 'warning');
125
+ _context.prev = 23;
126
+ _context.t0 = _context["catch"](5);
127
+ console.error(_context.t0);
128
+ session.notify("".concat(_context.t0), 'warning');
173
129
 
174
130
  case 27:
175
131
  case "end":
176
- return _context2.stop();
132
+ return _context.stop();
177
133
  }
178
134
  }
179
- }, _callee2, null, [[5, 23]]);
135
+ }, _callee, null, [[5, 23]]);
180
136
  }));
181
137
  return _handleSelectedRegion.apply(this, arguments);
182
138
  }
@@ -185,7 +141,15 @@ function SearchBox(_ref) {
185
141
  showHelp: showHelp,
186
142
  onSelect: handleSelectedRegion,
187
143
  assemblyName: assemblyName,
188
- fetchResults: fetchResults,
144
+ fetchResults: function fetchResults(queryString) {
145
+ return (0, _util2.fetchResults)({
146
+ queryString: queryString,
147
+ searchScope: searchScope,
148
+ rankSearchResults: rankSearchResults,
149
+ textSearchManager: textSearchManager,
150
+ assembly: assembly
151
+ });
152
+ },
189
153
  model: model,
190
154
  TextFieldProps: {
191
155
  variant: 'outlined',
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { LinearGenomeViewModel } from '../..';
3
- export declare const useStyles: (props?: any) => import("@material-ui/styles").ClassNameMap<"closeButton" | "dialogContent">;
3
+ export declare const useStyles: (props?: any) => import("@material-ui/styles").ClassNameMap<"dialogContent" | "closeButton">;
4
4
  export default function SearchResultsDialog({ model, optAssemblyName, handleClose, }: {
5
5
  model: LinearGenomeViewModel;
6
6
  optAssemblyName?: string;
@@ -146,7 +146,6 @@ function SearchResultsDialog(_ref) {
146
146
 
147
147
  handleClose();
148
148
  },
149
- disabled: !getTrackName(result.getTrackId()),
150
149
  color: "primary",
151
150
  variant: "contained"
152
151
  }, "Go")));
@@ -7,30 +7,32 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
13
 
14
14
  var _react = _interopRequireDefault(require("react"));
15
15
 
16
16
  var _configuration = require("@jbrowse/core/configuration");
17
17
 
18
- var _ui = require("@jbrowse/core/ui");
18
+ var _CascadingMenu = _interopRequireDefault(require("@jbrowse/core/ui/CascadingMenu"));
19
19
 
20
20
  var _util = require("@jbrowse/core/util");
21
21
 
22
22
  var _core = require("@material-ui/core");
23
23
 
24
+ var _hooks = require("material-ui-popup-state/hooks");
25
+
26
+ var _clsx = _interopRequireDefault(require("clsx"));
27
+
28
+ var _mobxReact = require("mobx-react");
29
+
24
30
  var _MoreVert = _interopRequireDefault(require("@material-ui/icons/MoreVert"));
25
31
 
26
32
  var _DragIndicator = _interopRequireDefault(require("@material-ui/icons/DragIndicator"));
27
33
 
28
34
  var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
29
35
 
30
- var _clsx = _interopRequireDefault(require("clsx"));
31
-
32
- var _mobxReact = require("mobx-react");
33
-
34
36
  // icons
35
37
  var useStyles = (0, _core.makeStyles)(function (theme) {
36
38
  return {
@@ -64,30 +66,20 @@ var useStyles = (0, _core.makeStyles)(function (theme) {
64
66
  };
65
67
  });
66
68
 
67
- var TrackLabel = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
69
+ var TrackLabel = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
68
70
  var _session$getTrackActi;
69
71
 
72
+ var track = _ref.track,
73
+ className = _ref.className;
70
74
  var classes = useStyles();
71
-
72
- var _React$useState = _react.default.useState(null),
73
- _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
74
- anchorEl = _React$useState2[0],
75
- setAnchorEl = _React$useState2[1];
76
-
77
- var track = props.track,
78
- className = props.className;
79
75
  var view = (0, _util.getContainingView)(track);
80
76
  var session = (0, _util.getSession)(track);
81
77
  var trackConf = track.configuration;
82
78
  var trackId = (0, _configuration.getConf)(track, 'trackId');
83
-
84
- var handleClick = function handleClick(event) {
85
- setAnchorEl(event.currentTarget);
86
- };
87
-
88
- var handleClose = function handleClose() {
89
- setAnchorEl(null);
90
- };
79
+ var popupState = (0, _hooks.usePopupState)({
80
+ popupId: 'trackLabelMenu',
81
+ variant: 'popover'
82
+ });
91
83
 
92
84
  var onDragStart = function onDragStart(event) {
93
85
  var target = event.target;
@@ -108,12 +100,7 @@ var TrackLabel = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
108
100
  var r = session.assemblies.find(function (a) {
109
101
  return a.sequence === trackConf;
110
102
  });
111
- trackName = (0, _configuration.readConfObject)(trackConf, 'name') || (r ? "Reference Sequence (".concat((0, _configuration.readConfObject)(r, 'name'), ")") : 'Reference Sequence');
112
- }
113
-
114
- function handleMenuItemClick(_, callback) {
115
- callback();
116
- handleClose();
103
+ trackName = trackName || (r ? "Reference Sequence (".concat((0, _configuration.readConfObject)(r, 'name'), ")") : 'Reference Sequence');
117
104
  }
118
105
 
119
106
  var items = [].concat((0, _toConsumableArray2.default)(((_session$getTrackActi = session.getTrackActionMenuItems) === null || _session$getTrackActi === void 0 ? void 0 : _session$getTrackActi.call(session, trackConf)) || []), (0, _toConsumableArray2.default)(track.trackMenuItems())).sort(function (a, b) {
@@ -141,21 +128,18 @@ var TrackLabel = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
141
128
  variant: "body1",
142
129
  component: "span",
143
130
  className: classes.trackName
144
- }, trackName), /*#__PURE__*/_react.default.createElement(_core.IconButton, {
145
- "aria-controls": "simple-menu",
146
- "aria-haspopup": "true",
147
- onClick: handleClick,
131
+ }, trackName), /*#__PURE__*/_react.default.createElement(_core.IconButton, (0, _extends2.default)({}, (0, _hooks.bindTrigger)(popupState), {
148
132
  className: classes.iconButton,
149
133
  color: "secondary",
150
134
  "data-testid": "track_menu_icon",
151
135
  disabled: !items.length
152
- }, /*#__PURE__*/_react.default.createElement(_MoreVert.default, null))), /*#__PURE__*/_react.default.createElement(_ui.Menu, {
153
- anchorEl: anchorEl,
154
- onMenuItemClick: handleMenuItemClick,
155
- open: Boolean(anchorEl),
156
- onClose: handleClose,
157
- menuItems: items
158
- }));
136
+ }), /*#__PURE__*/_react.default.createElement(_MoreVert.default, null))), /*#__PURE__*/_react.default.createElement(_CascadingMenu.default, (0, _extends2.default)({}, (0, _hooks.bindPopover)(popupState), {
137
+ onMenuItemClick: function onMenuItemClick(_, callback) {
138
+ return callback();
139
+ },
140
+ menuItems: items,
141
+ popupState: popupState
142
+ })));
159
143
  });
160
144
 
161
145
  var _default = (0, _mobxReact.observer)(TrackLabel);
@@ -1,2 +1,14 @@
1
+ import { Assembly } from '@jbrowse/core/assemblyManager/assembly';
2
+ import { SearchType } from '@jbrowse/core/data_adapters/BaseAdapter';
1
3
  import BaseResult from '@jbrowse/core/TextSearch/BaseResults';
4
+ import { SearchScope } from '@jbrowse/core/TextSearch/TextSearchManager';
5
+ import { TextSearchManager } from '@jbrowse/core/util';
2
6
  export declare function dedupe(results: BaseResult[] | undefined, cb: (result: BaseResult) => string): BaseResult[];
7
+ export declare function fetchResults({ queryString, searchType, searchScope, rankSearchResults, textSearchManager, assembly, }: {
8
+ queryString: string;
9
+ searchScope: SearchScope;
10
+ rankSearchResults: (results: BaseResult[]) => BaseResult[];
11
+ searchType?: SearchType;
12
+ textSearchManager?: TextSearchManager;
13
+ assembly?: Assembly;
14
+ }): Promise<BaseResult[]>;
@@ -1,9 +1,20 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.dedupe = dedupe;
9
+ exports.fetchResults = fetchResults;
10
+
11
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
+
13
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14
+
15
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
16
+
17
+ var _BaseResults = _interopRequireDefault(require("@jbrowse/core/TextSearch/BaseResults"));
7
18
 
8
19
  function dedupe() {
9
20
  var results = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
@@ -13,4 +24,52 @@ function dedupe() {
13
24
  return cb(t) === cb(elt);
14
25
  });
15
26
  });
27
+ }
28
+
29
+ function fetchResults(_x) {
30
+ return _fetchResults.apply(this, arguments);
31
+ }
32
+
33
+ function _fetchResults() {
34
+ _fetchResults = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
35
+ var _assembly$allRefNames;
36
+
37
+ var queryString, searchType, searchScope, rankSearchResults, textSearchManager, assembly, textSearchResults, refNameResults;
38
+ return _regenerator.default.wrap(function _callee$(_context) {
39
+ while (1) {
40
+ switch (_context.prev = _context.next) {
41
+ case 0:
42
+ queryString = _ref.queryString, searchType = _ref.searchType, searchScope = _ref.searchScope, rankSearchResults = _ref.rankSearchResults, textSearchManager = _ref.textSearchManager, assembly = _ref.assembly;
43
+
44
+ if (!textSearchManager) {
45
+ console.warn('No text search manager');
46
+ }
47
+
48
+ _context.next = 4;
49
+ return textSearchManager === null || textSearchManager === void 0 ? void 0 : textSearchManager.search({
50
+ queryString: queryString,
51
+ searchType: searchType
52
+ }, searchScope, rankSearchResults);
53
+
54
+ case 4:
55
+ textSearchResults = _context.sent;
56
+ refNameResults = assembly === null || assembly === void 0 ? void 0 : (_assembly$allRefNames = assembly.allRefNames) === null || _assembly$allRefNames === void 0 ? void 0 : _assembly$allRefNames.filter(function (ref) {
57
+ return ref.toLowerCase().startsWith(queryString.toLowerCase());
58
+ }).slice(0, 10).map(function (r) {
59
+ return new _BaseResults.default({
60
+ label: r
61
+ });
62
+ });
63
+ return _context.abrupt("return", dedupe([].concat((0, _toConsumableArray2.default)(refNameResults || []), (0, _toConsumableArray2.default)(textSearchResults || [])), function (elt) {
64
+ return elt.getId();
65
+ }));
66
+
67
+ case 7:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }
72
+ }, _callee);
73
+ }));
74
+ return _fetchResults.apply(this, arguments);
16
75
  }
@@ -20,6 +20,7 @@ export interface BpOffset {
20
20
  }
21
21
  export interface ExportSvgOptions {
22
22
  rasterizeLayers?: boolean;
23
+ filename?: string;
23
24
  }
24
25
  export interface NavLocation {
25
26
  refName: string;
@@ -55,6 +56,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
55
56
  tracks: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
56
57
  hideHeader: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
57
58
  hideHeaderOverview: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
59
+ hideNoTracksActive: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
58
60
  trackSelectorType: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<"hierarchical">, [undefined]>;
59
61
  trackLabels: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
60
62
  showCenterLine: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
@@ -86,6 +88,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
86
88
  } & {
87
89
  readonly width: number;
88
90
  readonly interRegionPaddingWidth: number;
91
+ readonly assemblyNames: string[];
89
92
  } & {
90
93
  readonly assemblyErrors: string;
91
94
  readonly assembliesInitialized: boolean;
@@ -105,19 +108,11 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
105
108
  readonly minOffset: number;
106
109
  readonly displayedRegionsTotalPx: number;
107
110
  renderProps(): any;
108
- readonly assemblyNames: string[];
109
111
  searchScope(assemblyName: string): {
110
112
  assemblyName: string;
111
113
  includeAggregateIndexes: boolean;
112
114
  tracks: import("mobx-state-tree").IMSTArray<import("mobx-state-tree").IAnyType> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>>;
113
115
  };
114
- /**
115
- * @param refName - refName of the displayedRegion
116
- * @param coord - coordinate at the displayed Region
117
- * @param regionNumber - optional param used as identifier when
118
- * there are multiple displayedRegions with the same refName
119
- * @returns offsetPx of the displayed region that it lands in
120
- */
121
116
  bpToPx({ refName, coord, regionNumber, }: {
122
117
  refName: string;
123
118
  coord: number;
@@ -163,6 +158,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
163
158
  setError(error: Error | undefined): void;
164
159
  toggleHeader(): void;
165
160
  toggleHeaderOverview(): void;
161
+ toggleNoTracksActive(): void;
166
162
  scrollTo(offsetPx: number): number;
167
163
  zoomTo(bpPerPx: number): number;
168
164
  setOffsets(left: undefined | BpOffset, right: undefined | BpOffset): void;
@@ -180,7 +176,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
180
176
  toggleCenterLine(): void;
181
177
  setDisplayedRegions(regions: Region[]): void;
182
178
  activateTrackSelector(): import("@jbrowse/core/util").Widget;
183
- navToLocString(locString: string, optAssemblyName?: string | undefined): void;
179
+ navToLocString(locString: string, optAssemblyName?: string): void;
184
180
  /**
185
181
  * Navigate to a location based on its refName and optionally start, end,
186
182
  * and assemblyName. Can handle if there are multiple displayedRegions
@@ -245,8 +241,8 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
245
241
  centerAt(bp: number, refName: string, regionIndex: number): void;
246
242
  center(): void;
247
243
  showAllRegions(): void;
248
- showAllRegionsInAssembly(assemblyName?: string | undefined): void;
249
- setDraggingTrackId(idx?: string | undefined): void;
244
+ showAllRegionsInAssembly(assemblyName?: string): void;
245
+ setDraggingTrackId(idx?: string): void;
250
246
  setScaleFactor(factor: number): void;
251
247
  } & {
252
248
  slide: (viewWidths: number) => void;
@@ -155,6 +155,7 @@ function stateModelFactory(pluginManager) {
155
155
  tracks: _mobxStateTree.types.array(pluginManager.pluggableMstType('track', 'stateModel')),
156
156
  hideHeader: false,
157
157
  hideHeaderOverview: false,
158
+ hideNoTracksActive: false,
158
159
  trackSelectorType: _mobxStateTree.types.optional(_mobxStateTree.types.enumeration(['hierarchical']), 'hierarchical'),
159
160
  trackLabels: _mobxStateTree.types.optional(_mobxStateTree.types.string, function () {
160
161
  return localStorageGetItem('lgv-trackLabels') || 'overlapping';
@@ -199,6 +200,12 @@ function stateModelFactory(pluginManager) {
199
200
 
200
201
  get interRegionPaddingWidth() {
201
202
  return INTER_REGION_PADDING_WIDTH;
203
+ },
204
+
205
+ get assemblyNames() {
206
+ return (0, _toConsumableArray2.default)(new Set(self.displayedRegions.map(function (region) {
207
+ return region.assemblyName;
208
+ })));
202
209
  }
203
210
 
204
211
  };
@@ -208,7 +215,8 @@ function stateModelFactory(pluginManager) {
208
215
  var _getSession = (0, _util.getSession)(self),
209
216
  assemblyManager = _getSession.assemblyManager;
210
217
 
211
- return this.assemblyNames.map(function (a) {
218
+ var assemblyNames = self.assemblyNames;
219
+ return assemblyNames.map(function (a) {
212
220
  var _assemblyManager$get;
213
221
 
214
222
  return (_assemblyManager$get = assemblyManager.get(a)) === null || _assemblyManager$get === void 0 ? void 0 : _assemblyManager$get.error;
@@ -221,7 +229,8 @@ function stateModelFactory(pluginManager) {
221
229
  var _getSession2 = (0, _util.getSession)(self),
222
230
  assemblyManager = _getSession2.assemblyManager;
223
231
 
224
- return this.assemblyNames.every(function (a) {
232
+ var assemblyNames = self.assemblyNames;
233
+ return assemblyNames.every(function (a) {
225
234
  var _assemblyManager$get2;
226
235
 
227
236
  return (_assemblyManager$get2 = assemblyManager.get(a)) === null || _assemblyManager$get2 === void 0 ? void 0 : _assemblyManager$get2.initialized;
@@ -312,13 +321,6 @@ function stateModelFactory(pluginManager) {
312
321
  highResolutionScaling: (0, _configuration.getConf)((0, _util.getSession)(self), 'highResolutionScaling')
313
322
  });
314
323
  },
315
-
316
- get assemblyNames() {
317
- return (0, _toConsumableArray2.default)(new Set(self.displayedRegions.map(function (region) {
318
- return region.assemblyName;
319
- })));
320
- },
321
-
322
324
  searchScope: function searchScope(assemblyName) {
323
325
  return {
324
326
  assemblyName: assemblyName,
@@ -326,14 +328,6 @@ function stateModelFactory(pluginManager) {
326
328
  tracks: self.tracks
327
329
  };
328
330
  },
329
-
330
- /**
331
- * @param refName - refName of the displayedRegion
332
- * @param coord - coordinate at the displayed Region
333
- * @param regionNumber - optional param used as identifier when
334
- * there are multiple displayedRegions with the same refName
335
- * @returns offsetPx of the displayed region that it lands in
336
- */
337
331
  bpToPx: function bpToPx(_ref) {
338
332
  var refName = _ref.refName,
339
333
  coord = _ref.coord,
@@ -432,10 +426,8 @@ function stateModelFactory(pluginManager) {
432
426
  return track.configuration.trackId;
433
427
  });
434
428
  results.forEach(function (result) {
435
- if (openTrackIds !== []) {
436
- if (openTrackIds.includes(result.trackId)) {
437
- result.updateScore(result.getScore() + 1);
438
- }
429
+ if (openTrackIds.includes(result.trackId)) {
430
+ result.updateScore(result.getScore() + 1);
439
431
  }
440
432
  });
441
433
  return results;
@@ -509,6 +501,9 @@ function stateModelFactory(pluginManager) {
509
501
  toggleHeaderOverview: function toggleHeaderOverview() {
510
502
  self.hideHeaderOverview = !self.hideHeaderOverview;
511
503
  },
504
+ toggleNoTracksActive: function toggleNoTracksActive() {
505
+ self.hideNoTracksActive = !self.hideNoTracksActive;
506
+ },
512
507
  scrollTo: function scrollTo(offsetPx) {
513
508
  var newOffsetPx = (0, _util.clamp)(offsetPx, self.minOffset, self.maxOffset);
514
509
  self.offsetPx = newOffsetPx;
@@ -692,6 +687,8 @@ function stateModelFactory(pluginManager) {
692
687
  throw new Error("invalid track selector type ".concat(self.trackSelectorType));
693
688
  },
694
689
  navToLocString: function navToLocString(locString, optAssemblyName) {
690
+ var _parsedLocStrings;
691
+
695
692
  var assemblyNames = self.assemblyNames;
696
693
 
697
694
  var _getSession3 = (0, _util.getSession)(self),
@@ -699,14 +696,38 @@ function stateModelFactory(pluginManager) {
699
696
 
700
697
  var isValidRefName = assemblyManager.isValidRefName;
701
698
  var assemblyName = optAssemblyName || assemblyNames[0];
702
- var parsedLocStrings = locString.split(' ').filter(function (f) {
703
- return !!f.trim();
704
- }).map(function (l) {
705
- return (0, _util.parseLocString)(l, function (ref) {
706
- return isValidRefName(ref, assemblyName);
699
+ var parsedLocStrings;
700
+ var inputs = locString.split(/(\s+)/).map(function (f) {
701
+ return f.trim();
702
+ }).filter(function (f) {
703
+ return !!f;
704
+ }); // first try interpreting as a whitespace-separated sequence of
705
+ // multiple locstrings
706
+
707
+ try {
708
+ parsedLocStrings = inputs.map(function (l) {
709
+ return (0, _util.parseLocString)(l, function (ref) {
710
+ return isValidRefName(ref, assemblyName);
711
+ });
707
712
  });
708
- });
709
- var locations = parsedLocStrings.map(function (region) {
713
+ } catch (e) {
714
+ // if this fails, try interpreting as a whitespace-separated refname,
715
+ // start, end if start and end are integer inputs
716
+ var _inputs = (0, _slicedToArray2.default)(inputs, 3),
717
+ refName = _inputs[0],
718
+ start = _inputs[1],
719
+ end = _inputs[2];
720
+
721
+ if ("".concat(e).match(/Unknown reference sequence/) && Number.isInteger(+start) && Number.isInteger(+end)) {
722
+ parsedLocStrings = [(0, _util.parseLocString)(refName + ':' + start + '..' + end, function (ref) {
723
+ return isValidRefName(ref, assemblyName);
724
+ })];
725
+ } else {
726
+ throw e;
727
+ }
728
+ }
729
+
730
+ var locations = (_parsedLocStrings = parsedLocStrings) === null || _parsedLocStrings === void 0 ? void 0 : _parsedLocStrings.map(function (region) {
710
731
  var asmName = region.assemblyName || assemblyName;
711
732
  var asm = assemblyManager.get(asmName);
712
733
  var refName = region.refName;
@@ -746,12 +767,12 @@ function stateModelFactory(pluginManager) {
746
767
  this.setDisplayedRegions([_objectSpread({
747
768
  reversed: loc.reversed
748
769
  }, loc.parentRegion)]);
749
- var start = loc.start,
750
- end = loc.end,
770
+ var _start = loc.start,
771
+ _end = loc.end,
751
772
  parentRegion = loc.parentRegion;
752
773
  this.navTo(_objectSpread(_objectSpread({}, loc), {}, {
753
- start: (0, _util.clamp)(start !== null && start !== void 0 ? start : 0, 0, parentRegion.end),
754
- end: (0, _util.clamp)(end !== null && end !== void 0 ? end : parentRegion.end, 0, parentRegion.end)
774
+ start: (0, _util.clamp)(_start !== null && _start !== void 0 ? _start : 0, 0, parentRegion.end),
775
+ end: (0, _util.clamp)(_end !== null && _end !== void 0 ? _end : parentRegion.end, 0, parentRegion.end)
755
776
  }));
756
777
  } else {
757
778
  this.setDisplayedRegions( // @ts-ignore
@@ -1230,6 +1251,12 @@ function stateModelFactory(pluginManager) {
1230
1251
  checked: !self.hideHeaderOverview,
1231
1252
  onClick: self.toggleHeaderOverview,
1232
1253
  disabled: self.hideHeader
1254
+ }, {
1255
+ label: 'Show no tracks active button',
1256
+ icon: _Visibility.default,
1257
+ type: 'checkbox',
1258
+ checked: !self.hideNoTracksActive,
1259
+ onClick: self.toggleNoTracksActive
1233
1260
  }, {
1234
1261
  label: 'Track labels',
1235
1262
  icon: _Label.default,
@@ -1380,7 +1407,7 @@ function stateModelFactory(pluginManager) {
1380
1407
  blob = new Blob([html], {
1381
1408
  type: 'image/svg+xml'
1382
1409
  });
1383
- (0, _fileSaver.saveAs)(blob, 'image.svg');
1410
+ (0, _fileSaver.saveAs)(blob, opts.filename || 'image.svg');
1384
1411
 
1385
1412
  case 6:
1386
1413
  case "end":