@jbrowse/plugin-linear-genome-view 1.6.9 → 1.7.3

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 (111) hide show
  1. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.d.ts +13 -13
  2. package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js +232 -0
  3. package/dist/BaseLinearDisplay/components/Block.d.ts +15 -15
  4. package/dist/BaseLinearDisplay/components/Block.js +86 -0
  5. package/dist/BaseLinearDisplay/components/LinearBlocks.d.ts +12 -12
  6. package/dist/BaseLinearDisplay/components/LinearBlocks.js +110 -0
  7. package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.d.ts +4 -4
  8. package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +192 -0
  9. package/dist/BaseLinearDisplay/index.d.ts +5 -5
  10. package/dist/BaseLinearDisplay/index.js +41 -0
  11. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.d.ts +227 -230
  12. package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +763 -0
  13. package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.d.ts +1 -1
  14. package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js +24 -0
  15. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.d.ts +96 -96
  16. package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +328 -0
  17. package/dist/LinearBareDisplay/configSchema.d.ts +2 -2
  18. package/dist/LinearBareDisplay/configSchema.js +19 -0
  19. package/dist/LinearBareDisplay/index.d.ts +2 -2
  20. package/dist/LinearBareDisplay/index.js +21 -0
  21. package/dist/LinearBareDisplay/index.test.js +33 -0
  22. package/dist/LinearBareDisplay/model.d.ts +192 -192
  23. package/dist/LinearBareDisplay/model.js +44 -0
  24. package/dist/LinearBasicDisplay/components/SetMaxHeight.d.ts +10 -10
  25. package/dist/LinearBasicDisplay/components/SetMaxHeight.js +94 -0
  26. package/dist/LinearBasicDisplay/configSchema.d.ts +2 -2
  27. package/dist/LinearBasicDisplay/configSchema.js +25 -0
  28. package/dist/LinearBasicDisplay/index.d.ts +2 -2
  29. package/dist/LinearBasicDisplay/index.js +23 -0
  30. package/dist/LinearBasicDisplay/model.d.ts +213 -213
  31. package/dist/LinearBasicDisplay/model.js +162 -0
  32. package/dist/LinearGenomeView/components/CenterLine.d.ts +14 -14
  33. package/dist/LinearGenomeView/components/CenterLine.js +80 -0
  34. package/dist/LinearGenomeView/components/ExportSvgDialog.d.ts +6 -6
  35. package/dist/LinearGenomeView/components/ExportSvgDialog.js +137 -0
  36. package/dist/LinearGenomeView/components/Header.d.ts +7 -7
  37. package/dist/LinearGenomeView/components/Header.js +144 -0
  38. package/dist/LinearGenomeView/components/HelpDialog.d.ts +5 -5
  39. package/dist/LinearGenomeView/components/HelpDialog.js +48 -0
  40. package/dist/LinearGenomeView/components/ImportForm.d.ts +7 -7
  41. package/dist/LinearGenomeView/components/ImportForm.js +330 -0
  42. package/dist/LinearGenomeView/components/LinearGenomeView.d.ts +7 -7
  43. package/dist/LinearGenomeView/components/LinearGenomeView.js +129 -0
  44. package/dist/LinearGenomeView/components/LinearGenomeView.test.js +234 -0
  45. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.d.ts +4 -4
  46. package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +349 -0
  47. package/dist/LinearGenomeView/components/MiniControls.d.ts +6 -6
  48. package/dist/LinearGenomeView/components/MiniControls.js +83 -0
  49. package/dist/LinearGenomeView/components/OverviewRubberBand.d.ts +22 -22
  50. package/dist/LinearGenomeView/components/OverviewRubberBand.js +310 -0
  51. package/dist/LinearGenomeView/components/OverviewScaleBar.d.ts +132 -124
  52. package/dist/LinearGenomeView/components/OverviewScaleBar.js +403 -0
  53. package/dist/LinearGenomeView/components/RefNameAutocomplete.d.ts +21 -21
  54. package/dist/LinearGenomeView/components/RefNameAutocomplete.js +331 -0
  55. package/dist/LinearGenomeView/components/RubberBand.d.ts +9 -20
  56. package/dist/LinearGenomeView/components/RubberBand.js +309 -0
  57. package/dist/LinearGenomeView/components/Ruler.d.ts +27 -27
  58. package/dist/LinearGenomeView/components/Ruler.js +101 -0
  59. package/dist/LinearGenomeView/components/ScaleBar.d.ts +401 -401
  60. package/dist/LinearGenomeView/components/ScaleBar.js +184 -0
  61. package/dist/LinearGenomeView/components/ScaleBar.test.js +180 -0
  62. package/dist/LinearGenomeView/components/SearchBox.d.ts +8 -8
  63. package/dist/LinearGenomeView/components/SearchBox.js +201 -0
  64. package/dist/LinearGenomeView/components/SearchResultsDialog.d.ts +8 -8
  65. package/dist/LinearGenomeView/components/SearchResultsDialog.js +159 -0
  66. package/dist/LinearGenomeView/components/SequenceDialog.d.ts +8 -8
  67. package/dist/LinearGenomeView/components/SequenceDialog.js +304 -0
  68. package/dist/LinearGenomeView/components/TrackContainer.d.ts +9 -9
  69. package/dist/LinearGenomeView/components/TrackContainer.js +179 -0
  70. package/dist/LinearGenomeView/components/TrackLabel.d.ts +44 -44
  71. package/dist/LinearGenomeView/components/TrackLabel.js +165 -0
  72. package/dist/LinearGenomeView/components/TracksContainer.d.ts +10 -10
  73. package/dist/LinearGenomeView/components/TracksContainer.js +214 -0
  74. package/dist/LinearGenomeView/components/VerticalGuides.d.ts +9 -9
  75. package/dist/LinearGenomeView/components/VerticalGuides.js +116 -0
  76. package/dist/LinearGenomeView/components/ZoomControls.d.ts +7 -7
  77. package/dist/LinearGenomeView/components/ZoomControls.js +92 -0
  78. package/dist/LinearGenomeView/components/util.d.ts +2 -2
  79. package/dist/LinearGenomeView/components/util.js +16 -0
  80. package/dist/LinearGenomeView/index.d.ts +292 -292
  81. package/dist/LinearGenomeView/index.js +1418 -0
  82. package/dist/LinearGenomeView/index.test.js +1170 -0
  83. package/dist/LinearGenomeView/util.d.ts +14 -14
  84. package/dist/LinearGenomeView/util.js +93 -0
  85. package/dist/LinearGenomeView/util.test.js +78 -0
  86. package/dist/index.d.ts +565 -565
  87. package/dist/index.js +293 -6
  88. package/package.json +6 -9
  89. package/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx +2 -0
  90. package/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts +10 -8
  91. package/src/LinearBasicDisplay/components/SetMaxHeight.tsx +1 -1
  92. package/src/LinearBasicDisplay/model.ts +17 -18
  93. package/src/LinearGenomeView/components/Header.tsx +1 -1
  94. package/src/LinearGenomeView/components/ImportForm.tsx +10 -4
  95. package/src/LinearGenomeView/components/LinearGenomeView.test.js +1 -0
  96. package/src/LinearGenomeView/components/OverviewScaleBar.tsx +2 -2
  97. package/src/LinearGenomeView/components/RubberBand.tsx +14 -24
  98. package/src/LinearGenomeView/components/ScaleBar.test.tsx +1 -0
  99. package/src/LinearGenomeView/components/ScaleBar.tsx +3 -6
  100. package/src/LinearGenomeView/components/SequenceDialog.tsx +1 -1
  101. package/src/LinearGenomeView/components/TrackLabel.tsx +1 -1
  102. package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap +0 -4
  103. package/src/LinearGenomeView/index.tsx +2 -3
  104. package/dist/LinearBareDisplay/index.test.d.ts +0 -1
  105. package/dist/LinearGenomeView/components/LinearGenomeView.test.d.ts +0 -1
  106. package/dist/plugin-linear-genome-view.cjs.development.js +0 -8121
  107. package/dist/plugin-linear-genome-view.cjs.development.js.map +0 -1
  108. package/dist/plugin-linear-genome-view.cjs.production.min.js +0 -2
  109. package/dist/plugin-linear-genome-view.cjs.production.min.js.map +0 -1
  110. package/dist/plugin-linear-genome-view.esm.js +0 -8105
  111. package/dist/plugin-linear-genome-view.esm.js.map +0 -1
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
13
+
14
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
+
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+
18
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
19
+
20
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
21
+
22
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
23
+
24
+ var _react = _interopRequireWildcard(require("react"));
25
+
26
+ var _mobxReact = require("mobx-react");
27
+
28
+ var _util = require("@jbrowse/core/util");
29
+
30
+ var _BaseResults = _interopRequireWildcard(require("@jbrowse/core/TextSearch/BaseResults"));
31
+
32
+ var _core = require("@material-ui/core");
33
+
34
+ var _Search = _interopRequireDefault(require("@material-ui/icons/Search"));
35
+
36
+ var _Autocomplete = _interopRequireDefault(require("@material-ui/lab/Autocomplete"));
37
+
38
+ var _Help = _interopRequireDefault(require("@material-ui/icons/Help"));
39
+
40
+ var _util2 = require("./util");
41
+
42
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
43
+
44
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
45
+
46
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
+
48
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || (0, _typeof2["default"])(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
49
+
50
+ // lazy
51
+ var HelpDialog = /*#__PURE__*/(0, _react.lazy)(function () {
52
+ return Promise.resolve().then(function () {
53
+ return _interopRequireWildcard(require('./HelpDialog'));
54
+ });
55
+ });
56
+
57
+ // the logic of this method is to only apply a filter to RefSequenceResults
58
+ // because they do not have a matchedObject. the trix search results already
59
+ // filter so don't need re-filtering
60
+ function _filterOptions(options, searchQuery) {
61
+ return options.filter(function (option) {
62
+ var result = option.result;
63
+ return result.getLabel().toLowerCase().includes(searchQuery) || result.matchedObject;
64
+ });
65
+ } // MyPopper used to expand search results box wider if needed
66
+ // xref https://stackoverflow.com/a/63583835/2129219
67
+
68
+
69
+ var MyPopper = function MyPopper(props) {
70
+ var style = props.style;
71
+ return /*#__PURE__*/_react["default"].createElement(_core.Popper, (0, _extends2["default"])({}, props, {
72
+ style: {
73
+ width: 'fit-content',
74
+ minWidth: Math.min(+((style === null || style === void 0 ? void 0 : style.width) || 0), 200),
75
+ background: 'white'
76
+ },
77
+ placement: "bottom-start"
78
+ }));
79
+ };
80
+
81
+ function RefNameAutocomplete(_ref) {
82
+ var model = _ref.model,
83
+ _ref$showHelp = _ref.showHelp,
84
+ showHelp = _ref$showHelp === void 0 ? true : _ref$showHelp,
85
+ onSelect = _ref.onSelect,
86
+ assemblyName = _ref.assemblyName,
87
+ style = _ref.style,
88
+ fetchResults = _ref.fetchResults,
89
+ value = _ref.value,
90
+ _ref$minWidth = _ref.minWidth,
91
+ minWidth = _ref$minWidth === void 0 ? 200 : _ref$minWidth,
92
+ _ref$TextFieldProps = _ref.TextFieldProps,
93
+ TextFieldProps = _ref$TextFieldProps === void 0 ? {} : _ref$TextFieldProps;
94
+ var session = (0, _util.getSession)(model);
95
+ var assemblyManager = session.assemblyManager;
96
+
97
+ var _useState = (0, _react.useState)(false),
98
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
99
+ open = _useState2[0],
100
+ setOpen = _useState2[1];
101
+
102
+ var _useState3 = (0, _react.useState)(true),
103
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
104
+ loaded = _useState4[0],
105
+ setLoaded = _useState4[1];
106
+
107
+ var _useState5 = (0, _react.useState)(false),
108
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
109
+ isHelpDialogDisplayed = _useState6[0],
110
+ setHelpDialogDisplayed = _useState6[1];
111
+
112
+ var _useState7 = (0, _react.useState)(''),
113
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
114
+ currentSearch = _useState8[0],
115
+ setCurrentSearch = _useState8[1];
116
+
117
+ var _useState9 = (0, _react.useState)(''),
118
+ _useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
119
+ inputValue = _useState10[0],
120
+ setInputValue = _useState10[1];
121
+
122
+ var _useState11 = (0, _react.useState)(),
123
+ _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
124
+ searchOptions = _useState12[0],
125
+ setSearchOptions = _useState12[1];
126
+
127
+ var debouncedSearch = (0, _util.useDebounce)(currentSearch, 300);
128
+ var coarseVisibleLocStrings = model.coarseVisibleLocStrings,
129
+ hasDisplayedRegions = model.hasDisplayedRegions;
130
+ var assembly = assemblyName ? assemblyManager.get(assemblyName) : undefined; // eslint-disable-next-line react-hooks/exhaustive-deps
131
+
132
+ var regions = (assembly === null || assembly === void 0 ? void 0 : assembly.regions) || [];
133
+ var options = (0, _react.useMemo)(function () {
134
+ return regions.map(function (option) {
135
+ return {
136
+ result: new _BaseResults.RefSequenceResult({
137
+ refName: option.refName,
138
+ label: option.refName,
139
+ matchedAttribute: 'refName'
140
+ })
141
+ };
142
+ });
143
+ }, [regions]);
144
+ (0, _react.useEffect)(function () {
145
+ var active = true;
146
+ (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
147
+ var results;
148
+ return _regenerator["default"].wrap(function _callee$(_context) {
149
+ while (1) {
150
+ switch (_context.prev = _context.next) {
151
+ case 0:
152
+ _context.prev = 0;
153
+
154
+ if (!(debouncedSearch === '' || !assemblyName)) {
155
+ _context.next = 3;
156
+ break;
157
+ }
158
+
159
+ return _context.abrupt("return");
160
+
161
+ case 3:
162
+ setLoaded(false);
163
+ _context.next = 6;
164
+ return fetchResults(debouncedSearch);
165
+
166
+ case 6:
167
+ results = _context.sent;
168
+
169
+ if (active) {
170
+ setSearchOptions((0, _util2.dedupe)(results, function (r) {
171
+ return r.getDisplayString();
172
+ }).map(function (result) {
173
+ return {
174
+ result: result
175
+ };
176
+ }));
177
+ setLoaded(true);
178
+ }
179
+
180
+ _context.next = 14;
181
+ break;
182
+
183
+ case 10:
184
+ _context.prev = 10;
185
+ _context.t0 = _context["catch"](0);
186
+ console.error(_context.t0);
187
+
188
+ if (active) {
189
+ session.notify("".concat(_context.t0), 'error');
190
+ }
191
+
192
+ case 14:
193
+ case "end":
194
+ return _context.stop();
195
+ }
196
+ }
197
+ }, _callee, null, [[0, 10]]);
198
+ }))();
199
+ return function () {
200
+ active = false;
201
+ };
202
+ }, [assemblyName, fetchResults, debouncedSearch, session, model]);
203
+ var inputBoxVal = coarseVisibleLocStrings || value || ''; // heuristic, text width + icon width
204
+ // + 45 accomodates help icon and search icon
205
+
206
+ var width = Math.min(Math.max((0, _util.measureText)(inputBoxVal, 16) + 45, minWidth), 550); // notes on implementation:
207
+ // The selectOnFocus setting helps highlight the field when clicked
208
+
209
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Autocomplete["default"], {
210
+ id: "refNameAutocomplete-".concat(model.id),
211
+ "data-testid": "autocomplete",
212
+ disableListWrap: true,
213
+ disableClearable: true,
214
+ PopperComponent: MyPopper,
215
+ disabled: !assemblyName,
216
+ freeSolo: true,
217
+ includeInputInList: true,
218
+ selectOnFocus: true,
219
+ style: _objectSpread(_objectSpread({}, style), {}, {
220
+ width: width
221
+ }),
222
+ value: inputBoxVal,
223
+ loading: !loaded,
224
+ inputValue: inputValue,
225
+ onInputChange: function onInputChange(event, newInputValue) {
226
+ return setInputValue(newInputValue);
227
+ },
228
+ loadingText: "loading results",
229
+ open: open,
230
+ onOpen: function onOpen() {
231
+ return setOpen(true);
232
+ },
233
+ onClose: function onClose() {
234
+ setOpen(false);
235
+ setLoaded(true);
236
+
237
+ if (hasDisplayedRegions) {
238
+ setCurrentSearch('');
239
+ setSearchOptions(undefined);
240
+ }
241
+ },
242
+ onChange: function onChange(_event, selectedOption) {
243
+ if (!selectedOption || !assemblyName) {
244
+ return;
245
+ }
246
+
247
+ if (typeof selectedOption === 'string') {
248
+ // handles string inputs on keyPress enter
249
+ onSelect(new _BaseResults["default"]({
250
+ label: selectedOption
251
+ }));
252
+ } else {
253
+ onSelect(selectedOption.result);
254
+ }
255
+
256
+ setInputValue(inputBoxVal);
257
+ },
258
+ options: !(searchOptions !== null && searchOptions !== void 0 && searchOptions.length) ? options : searchOptions,
259
+ getOptionDisabled: function getOptionDisabled(option) {
260
+ return (option === null || option === void 0 ? void 0 : option.group) === 'limitOption';
261
+ },
262
+ filterOptions: function filterOptions(options, params) {
263
+ var filtered = _filterOptions(options, params.inputValue.toLocaleLowerCase());
264
+
265
+ return [].concat((0, _toConsumableArray2["default"])(filtered.slice(0, 100)), (0, _toConsumableArray2["default"])(filtered.length > 100 ? [{
266
+ group: 'limitOption',
267
+ result: new _BaseResults["default"]({
268
+ label: 'keep typing for more results'
269
+ })
270
+ }] : []));
271
+ },
272
+ renderInput: function renderInput(params) {
273
+ var helperText = TextFieldProps.helperText,
274
+ _TextFieldProps$Input = TextFieldProps.InputProps,
275
+ InputProps = _TextFieldProps$Input === void 0 ? {} : _TextFieldProps$Input;
276
+ return /*#__PURE__*/_react["default"].createElement(_core.TextField, (0, _extends2["default"])({
277
+ onBlur: function onBlur() {
278
+ // this is used to restore a refName or the non-user-typed input
279
+ // to the box on blurring
280
+ setInputValue(inputBoxVal);
281
+ }
282
+ }, params, TextFieldProps, {
283
+ helperText: helperText,
284
+ InputProps: _objectSpread(_objectSpread(_objectSpread({}, params.InputProps), InputProps), {}, {
285
+ endAdornment: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, regions.length === 0 ? /*#__PURE__*/_react["default"].createElement(_core.CircularProgress, {
286
+ color: "inherit",
287
+ size: 20
288
+ }) : /*#__PURE__*/_react["default"].createElement(_core.InputAdornment, {
289
+ position: "end",
290
+ style: {
291
+ marginRight: 7
292
+ }
293
+ }, /*#__PURE__*/_react["default"].createElement(_Search["default"], null), showHelp ? /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
294
+ onClick: function onClick() {
295
+ return setHelpDialogDisplayed(true);
296
+ }
297
+ }, /*#__PURE__*/_react["default"].createElement(_Help["default"], null)) : null), params.InputProps.endAdornment)
298
+ }),
299
+ placeholder: "Search for location",
300
+ onChange: function onChange(e) {
301
+ setCurrentSearch(e.target.value);
302
+ }
303
+ }));
304
+ },
305
+ renderOption: function renderOption(option) {
306
+ var result = option.result;
307
+ var component = result.getRenderingComponent();
308
+
309
+ if (component && /*#__PURE__*/_react["default"].isValidElement(component)) {
310
+ return component;
311
+ }
312
+
313
+ return /*#__PURE__*/_react["default"].createElement(_core.Typography, {
314
+ noWrap: true
315
+ }, result.getDisplayString());
316
+ },
317
+ getOptionLabel: function getOptionLabel(option) {
318
+ return (typeof option === 'string' ? option : option.result.getLabel()) || '';
319
+ }
320
+ }), isHelpDialogDisplayed ? /*#__PURE__*/_react["default"].createElement(_react.Suspense, {
321
+ fallback: /*#__PURE__*/_react["default"].createElement("div", null)
322
+ }, /*#__PURE__*/_react["default"].createElement(HelpDialog, {
323
+ handleClose: function handleClose() {
324
+ return setHelpDialogDisplayed(false);
325
+ }
326
+ })) : null);
327
+ }
328
+
329
+ var _default = (0, _mobxReact.observer)(RefNameAutocomplete);
330
+
331
+ exports["default"] = _default;
@@ -1,20 +1,9 @@
1
- import React from 'react';
2
- import ReactPropTypes from 'prop-types';
3
- import { Instance } from 'mobx-state-tree';
4
- import { LinearGenomeViewStateModel } from '..';
5
- declare type LGV = Instance<LinearGenomeViewStateModel>;
6
- declare function RubberBand({ model, ControlComponent, }: {
7
- model: LGV;
8
- ControlComponent?: React.ReactElement;
9
- }): JSX.Element;
10
- declare namespace RubberBand {
11
- var propTypes: {
12
- model: ReactPropTypes.Validator<any>;
13
- ControlComponent: ReactPropTypes.Requireable<ReactPropTypes.ReactNodeLike>;
14
- };
15
- var defaultProps: {
16
- ControlComponent: JSX.Element;
17
- };
18
- }
19
- declare const _default: typeof RubberBand;
20
- export default _default;
1
+ import React from 'react';
2
+ import { LinearGenomeViewModel } from '..';
3
+ declare type LGV = LinearGenomeViewModel;
4
+ declare function RubberBand({ model, ControlComponent, }: {
5
+ model: LGV;
6
+ ControlComponent?: React.ReactElement;
7
+ }): JSX.Element;
8
+ declare const _default: typeof RubberBand;
9
+ export default _default;
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _mobxReact = require("mobx-react");
17
+
18
+ var _core = require("@material-ui/core");
19
+
20
+ var _util = require("@jbrowse/core/util");
21
+
22
+ var _ui = require("@jbrowse/core/ui");
23
+
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
28
+ var useStyles = (0, _core.makeStyles)(function (theme) {
29
+ var background = theme.palette.tertiary ? (0, _core.alpha)(theme.palette.tertiary.main, 0.7) : (0, _core.alpha)(theme.palette.primary.main, 0.7);
30
+ return {
31
+ rubberBand: {
32
+ height: '100%',
33
+ background: background,
34
+ position: 'absolute',
35
+ zIndex: 10,
36
+ textAlign: 'center',
37
+ overflow: 'hidden'
38
+ },
39
+ rubberBandControl: {
40
+ cursor: 'crosshair',
41
+ width: '100%',
42
+ minHeight: 8
43
+ },
44
+ rubberBandText: {
45
+ color: theme.palette.tertiary ? theme.palette.tertiary.contrastText : theme.palette.primary.contrastText
46
+ },
47
+ popover: {
48
+ mouseEvents: 'none',
49
+ cursor: 'crosshair'
50
+ },
51
+ paper: {
52
+ paddingLeft: theme.spacing(1),
53
+ paddingRight: theme.spacing(1)
54
+ },
55
+ guide: {
56
+ pointerEvents: 'none',
57
+ height: '100%',
58
+ width: 1,
59
+ position: 'absolute',
60
+ zIndex: 10
61
+ }
62
+ };
63
+ });
64
+ var VerticalGuide = (0, _mobxReact.observer)(function (_ref) {
65
+ var model = _ref.model,
66
+ coordX = _ref.coordX;
67
+ var classes = useStyles();
68
+ return /*#__PURE__*/_react["default"].createElement(_core.Tooltip, {
69
+ open: true,
70
+ placement: "top",
71
+ title: (0, _util.stringify)(model.pxToBp(coordX)),
72
+ arrow: true
73
+ }, /*#__PURE__*/_react["default"].createElement("div", {
74
+ className: classes.guide,
75
+ style: {
76
+ left: coordX,
77
+ background: 'red'
78
+ }
79
+ }));
80
+ });
81
+
82
+ function RubberBand(_ref2) {
83
+ var model = _ref2.model,
84
+ _ref2$ControlComponen = _ref2.ControlComponent,
85
+ ControlComponent = _ref2$ControlComponen === void 0 ? /*#__PURE__*/_react["default"].createElement("div", null) : _ref2$ControlComponen;
86
+
87
+ var _useState = (0, _react.useState)(),
88
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
89
+ startX = _useState2[0],
90
+ setStartX = _useState2[1];
91
+
92
+ var _useState3 = (0, _react.useState)(),
93
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
94
+ currentX = _useState4[0],
95
+ setCurrentX = _useState4[1]; // clientX and clientY used for anchorPosition for menu
96
+ // offsetX used for calculations about width of selection
97
+
98
+
99
+ var _useState5 = (0, _react.useState)(),
100
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
101
+ anchorPosition = _useState6[0],
102
+ setAnchorPosition = _useState6[1];
103
+
104
+ var _useState7 = (0, _react.useState)(),
105
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
106
+ guideX = _useState8[0],
107
+ setGuideX = _useState8[1];
108
+
109
+ var controlsRef = (0, _react.useRef)(null);
110
+ var rubberBandRef = (0, _react.useRef)(null);
111
+ var classes = useStyles();
112
+ var mouseDragging = startX !== undefined && anchorPosition === undefined;
113
+ var setOffsets = model.setOffsets,
114
+ pxToBp = model.pxToBp;
115
+ (0, _react.useEffect)(function () {
116
+ function computeOffsets(offsetX) {
117
+ if (startX === undefined) {
118
+ return;
119
+ }
120
+
121
+ var leftPx = startX;
122
+ var rightPx = offsetX; // handles clicking and draging to the left
123
+
124
+ if (rightPx < leftPx) {
125
+ ;
126
+ var _ref3 = [rightPx, leftPx];
127
+ leftPx = _ref3[0];
128
+ rightPx = _ref3[1];
129
+ }
130
+
131
+ var leftOffset = pxToBp(leftPx);
132
+ var rightOffset = pxToBp(rightPx);
133
+ return {
134
+ leftOffset: leftOffset,
135
+ rightOffset: rightOffset
136
+ };
137
+ }
138
+
139
+ function globalMouseMove(event) {
140
+ if (controlsRef.current && mouseDragging) {
141
+ var relativeX = event.clientX - controlsRef.current.getBoundingClientRect().left;
142
+ setCurrentX(relativeX);
143
+ }
144
+ }
145
+
146
+ function globalMouseUp(event) {
147
+ if (startX !== undefined && controlsRef.current) {
148
+ var clientX = event.clientX,
149
+ clientY = event.clientY;
150
+ var ref = controlsRef.current;
151
+ var offsetX = clientX - ref.getBoundingClientRect().left; // as stated above, store both clientX/Y and offsetX for different
152
+ // purposes
153
+
154
+ setAnchorPosition({
155
+ offsetX: offsetX,
156
+ clientX: clientX,
157
+ clientY: clientY
158
+ });
159
+ var args = computeOffsets(offsetX);
160
+
161
+ if (args) {
162
+ var leftOffset = args.leftOffset,
163
+ rightOffset = args.rightOffset;
164
+ setOffsets(leftOffset, rightOffset);
165
+ }
166
+
167
+ setGuideX(undefined);
168
+ }
169
+ }
170
+
171
+ if (mouseDragging) {
172
+ window.addEventListener('mousemove', globalMouseMove);
173
+ window.addEventListener('mouseup', globalMouseUp);
174
+ return function () {
175
+ window.removeEventListener('mousemove', globalMouseMove);
176
+ window.removeEventListener('mouseup', globalMouseUp);
177
+ };
178
+ }
179
+
180
+ return function () {};
181
+ }, [startX, mouseDragging, anchorPosition, setOffsets, pxToBp]);
182
+ (0, _react.useEffect)(function () {
183
+ if (!mouseDragging && currentX !== undefined && startX !== undefined && Math.abs(currentX - startX) <= 3) {
184
+ handleClose();
185
+ }
186
+ }, [mouseDragging, currentX, startX, model.bpPerPx]);
187
+
188
+ function mouseDown(event) {
189
+ event.preventDefault();
190
+ event.stopPropagation();
191
+ var relativeX = event.clientX - event.target.getBoundingClientRect().left;
192
+ setStartX(relativeX);
193
+ setCurrentX(relativeX);
194
+ }
195
+
196
+ function mouseMove(event) {
197
+ var target = event.target;
198
+ setGuideX(event.clientX - target.getBoundingClientRect().left);
199
+ }
200
+
201
+ function mouseOut() {
202
+ setGuideX(undefined);
203
+ model.setOffsets(undefined, undefined);
204
+ }
205
+
206
+ function handleClose() {
207
+ setAnchorPosition(undefined);
208
+ setStartX(undefined);
209
+ setCurrentX(undefined);
210
+ }
211
+
212
+ var open = Boolean(anchorPosition);
213
+
214
+ function handleMenuItemClick(_, callback) {
215
+ callback();
216
+ handleClose();
217
+ }
218
+
219
+ if (startX === undefined) {
220
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, guideX !== undefined ? /*#__PURE__*/_react["default"].createElement(VerticalGuide, {
221
+ model: model,
222
+ coordX: guideX
223
+ }) : null, /*#__PURE__*/_react["default"].createElement("div", {
224
+ "data-testid": "rubberBand_controls",
225
+ className: classes.rubberBandControl,
226
+ role: "presentation",
227
+ ref: controlsRef,
228
+ onMouseDown: mouseDown,
229
+ onMouseOut: mouseOut,
230
+ onMouseMove: mouseMove
231
+ }, ControlComponent));
232
+ }
233
+ /* Calculating Pixels for Mouse Dragging */
234
+
235
+
236
+ var right = anchorPosition ? anchorPosition.offsetX : currentX || 0;
237
+ var left = right < startX ? right : startX;
238
+ var width = Math.abs(right - startX);
239
+ var leftBpOffset = model.pxToBp(left);
240
+ var rightBpOffset = model.pxToBp(left + width);
241
+ var numOfBpSelected = Math.ceil(width * model.bpPerPx);
242
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, rubberBandRef.current ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_core.Popover, {
243
+ className: classes.popover,
244
+ classes: {
245
+ paper: classes.paper
246
+ },
247
+ open: true,
248
+ anchorEl: rubberBandRef.current,
249
+ anchorOrigin: {
250
+ vertical: 'top',
251
+ horizontal: 'left'
252
+ },
253
+ transformOrigin: {
254
+ vertical: 'bottom',
255
+ horizontal: 'right'
256
+ },
257
+ keepMounted: true,
258
+ disableRestoreFocus: true
259
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, (0, _util.stringify)(leftBpOffset))), /*#__PURE__*/_react["default"].createElement(_core.Popover, {
260
+ className: classes.popover,
261
+ classes: {
262
+ paper: classes.paper
263
+ },
264
+ open: true,
265
+ anchorEl: rubberBandRef.current,
266
+ anchorOrigin: {
267
+ vertical: 'top',
268
+ horizontal: 'right'
269
+ },
270
+ transformOrigin: {
271
+ vertical: 'bottom',
272
+ horizontal: 'left'
273
+ },
274
+ keepMounted: true,
275
+ disableRestoreFocus: true
276
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, null, (0, _util.stringify)(rightBpOffset)))) : null, /*#__PURE__*/_react["default"].createElement("div", {
277
+ ref: rubberBandRef,
278
+ className: classes.rubberBand,
279
+ style: {
280
+ left: left,
281
+ width: width
282
+ }
283
+ }, /*#__PURE__*/_react["default"].createElement(_core.Typography, {
284
+ variant: "h6",
285
+ className: classes.rubberBandText
286
+ }, numOfBpSelected.toLocaleString('en-US'), " bp")), /*#__PURE__*/_react["default"].createElement("div", {
287
+ "data-testid": "rubberBand_controls",
288
+ className: classes.rubberBandControl,
289
+ role: "presentation",
290
+ ref: controlsRef,
291
+ onMouseDown: mouseDown,
292
+ onMouseOut: mouseOut,
293
+ onMouseMove: mouseMove
294
+ }, ControlComponent), anchorPosition ? /*#__PURE__*/_react["default"].createElement(_ui.Menu, {
295
+ anchorReference: "anchorPosition",
296
+ anchorPosition: {
297
+ left: anchorPosition.clientX,
298
+ top: anchorPosition.clientY
299
+ },
300
+ onMenuItemClick: handleMenuItemClick,
301
+ open: open,
302
+ onClose: handleClose,
303
+ menuItems: model.rubberBandMenuItems()
304
+ }) : null);
305
+ }
306
+
307
+ var _default = (0, _mobxReact.observer)(RubberBand);
308
+
309
+ exports["default"] = _default;