@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,159 @@
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"] = SearchResultsDialog;
9
+ exports.useStyles = void 0;
10
+
11
+ var _react = _interopRequireDefault(require("react"));
12
+
13
+ var _mobxStateTree = require("mobx-state-tree");
14
+
15
+ var _util = require("@jbrowse/core/util");
16
+
17
+ var _core = require("@material-ui/core");
18
+
19
+ var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
20
+
21
+ var useStyles = (0, _core.makeStyles)(function (theme) {
22
+ return {
23
+ dialogContent: {
24
+ width: '80em'
25
+ },
26
+ closeButton: {
27
+ position: 'absolute',
28
+ right: theme.spacing(1),
29
+ top: theme.spacing(1),
30
+ color: theme.palette.grey[500]
31
+ }
32
+ };
33
+ });
34
+ exports.useStyles = useStyles;
35
+
36
+ function SearchResultsDialog(_ref) {
37
+ var _model$searchResults;
38
+
39
+ var model = _ref.model,
40
+ optAssemblyName = _ref.optAssemblyName,
41
+ handleClose = _ref.handleClose;
42
+ var classes = useStyles();
43
+ var session = (0, _util.getSession)(model);
44
+
45
+ var _getEnv = (0, _mobxStateTree.getEnv)(session),
46
+ pluginManager = _getEnv.pluginManager;
47
+
48
+ var assemblyManager = session.assemblyManager;
49
+ var assemblyName = optAssemblyName;
50
+
51
+ if (model.displayedRegions.length > 0) {
52
+ var _model$displayedRegio;
53
+
54
+ assemblyName = (_model$displayedRegio = model.displayedRegions[0]) === null || _model$displayedRegio === void 0 ? void 0 : _model$displayedRegio.assemblyName;
55
+ }
56
+
57
+ if (!assemblyName) {
58
+ throw new Error("Assembly name not found");
59
+ }
60
+
61
+ var assembly = assemblyManager.get(assemblyName);
62
+
63
+ if (!assembly) {
64
+ throw new Error("assembly ".concat(assemblyName, " not found"));
65
+ }
66
+
67
+ if (!assembly.regions) {
68
+ throw new Error("assembly ".concat(assemblyName, " regions not loaded"));
69
+ }
70
+
71
+ var assemblyRegions = assembly.regions;
72
+
73
+ function handleClick(location) {
74
+ try {
75
+ var newRegion = assemblyRegions.find(function (region) {
76
+ return location === region.refName;
77
+ });
78
+
79
+ if (newRegion) {
80
+ model.setDisplayedRegions([newRegion]); // we use showAllRegions after setDisplayedRegions to make the entire
81
+ // region visible, xref #1703
82
+
83
+ model.showAllRegions();
84
+ } else {
85
+ model.navToLocString(location, assemblyName);
86
+ }
87
+ } catch (e) {
88
+ console.warn(e);
89
+ session.notify("".concat(e), 'warning');
90
+ }
91
+ }
92
+
93
+ function getTrackName(trackId) {
94
+ if (trackId) {
95
+ var trackConfigSchema = pluginManager.pluggableConfigSchemaType('track');
96
+ var configuration = (0, _mobxStateTree.resolveIdentifier)(trackConfigSchema, (0, _mobxStateTree.getRoot)(model), trackId);
97
+
98
+ if (configuration) {
99
+ var _configuration$name;
100
+
101
+ return (_configuration$name = configuration.name) === null || _configuration$name === void 0 ? void 0 : _configuration$name.value;
102
+ }
103
+ }
104
+
105
+ return '';
106
+ }
107
+
108
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
109
+ open: true,
110
+ maxWidth: "xl",
111
+ onClose: handleClose
112
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, null, "Search results", handleClose ? /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
113
+ "data-testid": "close-resultsDialog",
114
+ className: classes.closeButton,
115
+ onClick: function onClick() {
116
+ handleClose();
117
+ }
118
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], 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, {
119
+ component: _core.Paper
120
+ }, /*#__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, {
121
+ align: "right"
122
+ }, "Location"), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
123
+ align: "right"
124
+ }, "Track"), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
125
+ align: "right"
126
+ }))), /*#__PURE__*/_react["default"].createElement(_core.TableBody, null, model.searchResults.map(function (result) {
127
+ return /*#__PURE__*/_react["default"].createElement(_core.TableRow, {
128
+ key: "".concat(result.getId())
129
+ }, /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
130
+ component: "th",
131
+ scope: "row"
132
+ }, result.getLabel()), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
133
+ align: "right"
134
+ }, result.getLocation()), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
135
+ align: "right"
136
+ }, getTrackName(result.getTrackId()) || 'N/A'), /*#__PURE__*/_react["default"].createElement(_core.TableCell, {
137
+ align: "right"
138
+ }, /*#__PURE__*/_react["default"].createElement(_core.Button, {
139
+ onClick: function onClick() {
140
+ handleClick(result.getLocation());
141
+ var resultTrackId = result.getTrackId();
142
+
143
+ if (resultTrackId) {
144
+ model.showTrack(resultTrackId);
145
+ }
146
+
147
+ handleClose();
148
+ },
149
+ disabled: !getTrackName(result.getTrackId()),
150
+ color: "primary",
151
+ variant: "contained"
152
+ }, "Go")));
153
+ })))))), /*#__PURE__*/_react["default"].createElement(_core.Divider, null), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
154
+ onClick: function onClick() {
155
+ return handleClose();
156
+ },
157
+ color: "primary"
158
+ }, "Cancel")));
159
+ }
@@ -1,8 +1,8 @@
1
- /// <reference types="react" />
2
- import { LinearGenomeViewModel } from '..';
3
- declare function SequenceDialog({ model, handleClose, }: {
4
- model: LinearGenomeViewModel;
5
- handleClose: () => void;
6
- }): JSX.Element;
7
- declare const _default: typeof SequenceDialog;
8
- export default _default;
1
+ /// <reference types="react" />
2
+ import { LinearGenomeViewModel } from '..';
3
+ declare function SequenceDialog({ model, handleClose, }: {
4
+ model: LinearGenomeViewModel;
5
+ handleClose: () => void;
6
+ }): JSX.Element;
7
+ declare const _default: typeof SequenceDialog;
8
+ export default _default;
@@ -0,0 +1,304 @@
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 _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _core = require("@material-ui/core");
21
+
22
+ var _mobxReact = require("mobx-react");
23
+
24
+ var _fileSaver = require("file-saver");
25
+
26
+ var _configuration = require("@jbrowse/core/configuration");
27
+
28
+ var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
29
+
30
+ var _util = require("@jbrowse/core/util");
31
+
32
+ var _formatFastaStrings = require("@jbrowse/core/util/formatFastaStrings");
33
+
34
+ var _Icons = require("@jbrowse/core/ui/Icons");
35
+
36
+ var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
37
+
38
+ var _GetApp = _interopRequireDefault(require("@material-ui/icons/GetApp"));
39
+
40
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
41
+
42
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _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; }
43
+
44
+ // icons
45
+ var useStyles = (0, _core.makeStyles)(function (theme) {
46
+ return {
47
+ loadingMessage: {
48
+ padding: theme.spacing(5)
49
+ },
50
+ closeButton: {
51
+ position: 'absolute',
52
+ right: theme.spacing(1),
53
+ top: theme.spacing(1),
54
+ color: theme.palette.grey[500]
55
+ },
56
+ dialogContent: {
57
+ width: '80em'
58
+ },
59
+ textAreaFont: {
60
+ fontFamily: 'Courier New'
61
+ }
62
+ };
63
+ });
64
+
65
+ /**
66
+ * Fetches and returns a list features for a given list of regions
67
+ */
68
+ function fetchSequence(_x, _x2, _x3) {
69
+ return _fetchSequence.apply(this, arguments);
70
+ }
71
+
72
+ function _fetchSequence() {
73
+ _fetchSequence = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(model, regions, signal) {
74
+ var session, leftOffset, rightOffset, rpcManager, assemblyManager, assemblyName, assembly, adapterConfig, sessionId, chunks;
75
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
76
+ while (1) {
77
+ switch (_context2.prev = _context2.next) {
78
+ case 0:
79
+ session = (0, _util.getSession)(model);
80
+ leftOffset = model.leftOffset, rightOffset = model.rightOffset;
81
+
82
+ if (!(!leftOffset || !rightOffset)) {
83
+ _context2.next = 4;
84
+ break;
85
+ }
86
+
87
+ throw new Error('no offsets on model to use for range');
88
+
89
+ case 4:
90
+ if (!(leftOffset.assemblyName !== rightOffset.assemblyName)) {
91
+ _context2.next = 6;
92
+ break;
93
+ }
94
+
95
+ throw new Error('not able to fetch sequences from multiple assemblies');
96
+
97
+ case 6:
98
+ rpcManager = session.rpcManager, assemblyManager = session.assemblyManager;
99
+ assemblyName = leftOffset.assemblyName || rightOffset.assemblyName || '';
100
+ assembly = assemblyManager.get(assemblyName);
101
+
102
+ if (assembly) {
103
+ _context2.next = 11;
104
+ break;
105
+ }
106
+
107
+ throw new Error("assembly ".concat(assemblyName, " not found"));
108
+
109
+ case 11:
110
+ adapterConfig = (0, _configuration.getConf)(assembly, ['sequence', 'adapter']);
111
+ sessionId = 'getSequence';
112
+ _context2.next = 15;
113
+ return Promise.all(regions.map(function (region) {
114
+ return rpcManager.call(sessionId, 'CoreGetFeatures', {
115
+ adapterConfig: adapterConfig,
116
+ region: region,
117
+ sessionId: sessionId,
118
+ signal: signal
119
+ });
120
+ }));
121
+
122
+ case 15:
123
+ chunks = _context2.sent;
124
+ return _context2.abrupt("return", chunks.map(function (chunk) {
125
+ return chunk[0];
126
+ }));
127
+
128
+ case 17:
129
+ case "end":
130
+ return _context2.stop();
131
+ }
132
+ }
133
+ }, _callee2);
134
+ }));
135
+ return _fetchSequence.apply(this, arguments);
136
+ }
137
+
138
+ function SequenceDialog(_ref) {
139
+ var model = _ref.model,
140
+ handleClose = _ref.handleClose;
141
+ var classes = useStyles();
142
+ var session = (0, _util.getSession)(model);
143
+
144
+ var _useState = (0, _react.useState)(),
145
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
146
+ error = _useState2[0],
147
+ setError = _useState2[1];
148
+
149
+ var _useState3 = (0, _react.useState)(),
150
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
151
+ sequence = _useState4[0],
152
+ setSequence = _useState4[1];
153
+
154
+ var loading = Boolean(sequence === undefined);
155
+ var leftOffset = model.leftOffset,
156
+ rightOffset = model.rightOffset; // avoid infinite looping of useEffect
157
+ // random note: the current selected region can't be a computed because it
158
+ // uses action on base1dview even though it's on the ephemeral base1dview
159
+
160
+ var regionsSelected = (0, _react.useMemo)(function () {
161
+ return model.getSelectedRegions(leftOffset, rightOffset);
162
+ }, [model, leftOffset, rightOffset]);
163
+ (0, _react.useEffect)(function () {
164
+ var active = true;
165
+ var controller = new AbortController();
166
+ (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
167
+ var chunks;
168
+ return _regenerator["default"].wrap(function _callee$(_context) {
169
+ while (1) {
170
+ switch (_context.prev = _context.next) {
171
+ case 0:
172
+ _context.prev = 0;
173
+
174
+ if (!(regionsSelected.length > 0)) {
175
+ _context.next = 8;
176
+ break;
177
+ }
178
+
179
+ _context.next = 4;
180
+ return fetchSequence(model, regionsSelected, controller.signal);
181
+
182
+ case 4:
183
+ chunks = _context.sent;
184
+
185
+ if (active) {
186
+ setSequence((0, _formatFastaStrings.formatSeqFasta)(chunks.filter(function (f) {
187
+ return !!f;
188
+ }).map(function (chunk) {
189
+ var chunkSeq = chunk.get('seq');
190
+ var chunkRefName = chunk.get('refName');
191
+ var chunkStart = chunk.get('start') + 1;
192
+ var chunkEnd = chunk.get('end');
193
+ var chunkLocstring = "".concat(chunkRefName, ":").concat(chunkStart, "-").concat(chunkEnd);
194
+
195
+ if ((chunkSeq === null || chunkSeq === void 0 ? void 0 : chunkSeq.length) !== chunkEnd - chunkStart + 1) {
196
+ throw new Error("".concat(chunkLocstring, " returned ").concat(chunkSeq.length.toLocaleString(), " bases, but should have returned ").concat((chunkEnd - chunkStart).toLocaleString()));
197
+ }
198
+
199
+ return {
200
+ header: chunkLocstring,
201
+ seq: chunkSeq
202
+ };
203
+ })));
204
+ }
205
+
206
+ _context.next = 9;
207
+ break;
208
+
209
+ case 8:
210
+ throw new Error('Selected region is out of bounds');
211
+
212
+ case 9:
213
+ _context.next = 15;
214
+ break;
215
+
216
+ case 11:
217
+ _context.prev = 11;
218
+ _context.t0 = _context["catch"](0);
219
+ console.error(_context.t0);
220
+
221
+ if (active) {
222
+ setError(_context.t0);
223
+ }
224
+
225
+ case 15:
226
+ case "end":
227
+ return _context.stop();
228
+ }
229
+ }
230
+ }, _callee, null, [[0, 11]]);
231
+ }))();
232
+ return function () {
233
+ controller.abort();
234
+ active = false;
235
+ };
236
+ }, [model, session, regionsSelected, setSequence]);
237
+ var sequenceTooLarge = sequence ? sequence.length > 1000000 : false;
238
+ return /*#__PURE__*/_react["default"].createElement(_core.Dialog, {
239
+ "data-testid": "sequence-dialog",
240
+ maxWidth: "xl",
241
+ open: true,
242
+ onClose: handleClose,
243
+ "aria-labelledby": "alert-dialog-title",
244
+ "aria-describedby": "alert-dialog-description"
245
+ }, /*#__PURE__*/_react["default"].createElement(_core.DialogTitle, {
246
+ id: "alert-dialog-title"
247
+ }, "Reference sequence", handleClose ? /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
248
+ "data-testid": "close-seqDialog",
249
+ className: classes.closeButton,
250
+ onClick: function onClick() {
251
+ handleClose();
252
+ model.setOffsets(undefined, undefined);
253
+ }
254
+ }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null)) : null), /*#__PURE__*/_react["default"].createElement(_core.Divider, null), /*#__PURE__*/_react["default"].createElement(_core.DialogContent, null, error ? /*#__PURE__*/_react["default"].createElement(_core.Typography, {
255
+ color: "error"
256
+ }, "".concat(error)) : null, loading && !error ? /*#__PURE__*/_react["default"].createElement(_core.Container, null, "Retrieving reference sequence...", /*#__PURE__*/_react["default"].createElement(_core.CircularProgress, {
257
+ style: {
258
+ marginLeft: 10
259
+ },
260
+ size: 20,
261
+ disableShrink: true
262
+ })) : null, /*#__PURE__*/_react["default"].createElement(_core.TextField, {
263
+ "data-testid": "rubberband-sequence",
264
+ variant: "outlined",
265
+ multiline: true,
266
+ minRows: 5,
267
+ disabled: sequenceTooLarge,
268
+ className: classes.dialogContent,
269
+ fullWidth: true,
270
+ value: sequenceTooLarge ? 'Reference sequence too large to display, use the download FASTA button' : sequence,
271
+ InputProps: {
272
+ readOnly: true,
273
+ classes: {
274
+ input: classes.textAreaFont
275
+ }
276
+ }
277
+ })), /*#__PURE__*/_react["default"].createElement(_core.DialogActions, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
278
+ onClick: function onClick() {
279
+ (0, _copyToClipboard["default"])(sequence || '');
280
+ session.notify('Copied to clipboard', 'success');
281
+ },
282
+ disabled: loading || !!error || sequenceTooLarge,
283
+ color: "primary",
284
+ startIcon: /*#__PURE__*/_react["default"].createElement(_Icons.ContentCopy, null)
285
+ }, "Copy to clipboard"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
286
+ onClick: function onClick() {
287
+ var seqFastaFile = new Blob([sequence || ''], {
288
+ type: 'text/x-fasta;charset=utf-8'
289
+ });
290
+ (0, _fileSaver.saveAs)(seqFastaFile, 'jbrowse_ref_seq.fa');
291
+ },
292
+ disabled: loading || !!error,
293
+ color: "primary",
294
+ startIcon: /*#__PURE__*/_react["default"].createElement(_GetApp["default"], null)
295
+ }, "Download FASTA"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
296
+ onClick: handleClose,
297
+ color: "primary",
298
+ autoFocus: true
299
+ }, "Close")));
300
+ }
301
+
302
+ var _default = (0, _mobxReact.observer)(SequenceDialog);
303
+
304
+ exports["default"] = _default;
@@ -1,9 +1,9 @@
1
- /// <reference types="react" />
2
- import { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models';
3
- import { LinearGenomeViewModel } from '..';
4
- declare function TrackContainer({ model, track, }: {
5
- model: LinearGenomeViewModel;
6
- track: BaseTrackModel;
7
- }): JSX.Element;
8
- declare const _default: typeof TrackContainer;
9
- export default _default;
1
+ /// <reference types="react" />
2
+ import { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models';
3
+ import { LinearGenomeViewModel } from '..';
4
+ declare function TrackContainer({ model, track, }: {
5
+ model: LinearGenomeViewModel;
6
+ track: BaseTrackModel;
7
+ }): JSX.Element;
8
+ declare const _default: typeof TrackContainer;
9
+ export default _default;
@@ -0,0 +1,179 @@
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 _react = _interopRequireWildcard(require("react"));
13
+
14
+ var _mobxReact = require("mobx-react");
15
+
16
+ var _mobxStateTree = require("mobx-state-tree");
17
+
18
+ var _configuration = require("@jbrowse/core/configuration");
19
+
20
+ var _ui = require("@jbrowse/core/ui");
21
+
22
+ var _util = require("@jbrowse/core/util");
23
+
24
+ var _clsx = _interopRequireDefault(require("clsx"));
25
+
26
+ var _Paper = _interopRequireDefault(require("@material-ui/core/Paper"));
27
+
28
+ var _styles = require("@material-ui/core/styles");
29
+
30
+ var _ = require("..");
31
+
32
+ var _TrackLabel = _interopRequireDefault(require("./TrackLabel"));
33
+
34
+ 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); }
35
+
36
+ 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; }
37
+
38
+ var useStyles = (0, _styles.makeStyles)(function (theme) {
39
+ return {
40
+ root: {
41
+ marginTop: 2
42
+ },
43
+ resizeHandle: {
44
+ height: _.RESIZE_HANDLE_HEIGHT,
45
+ boxSizing: 'border-box',
46
+ position: 'relative',
47
+ zIndex: 2
48
+ },
49
+ overlay: {
50
+ pointerEvents: 'none',
51
+ position: 'absolute',
52
+ top: 0,
53
+ left: 0,
54
+ width: '100%',
55
+ zIndex: 3,
56
+ borderRadius: theme.shape.borderRadius
57
+ },
58
+ trackLabel: {
59
+ zIndex: 3
60
+ },
61
+ // aligns with block bounderies. check for example the breakpoint split view
62
+ // demo to see if features align if wanting to change things
63
+ renderingComponentContainer: {
64
+ position: 'absolute',
65
+ // -1 offset because of the 1px border of the Paper
66
+ left: -1,
67
+ height: '100%',
68
+ width: '100%'
69
+ },
70
+ trackLabelInline: {
71
+ position: 'relative',
72
+ display: 'inline-block'
73
+ },
74
+ trackLabelOverlap: {
75
+ position: 'absolute'
76
+ },
77
+ trackRenderingContainer: {
78
+ overflowY: 'auto',
79
+ overflowX: 'hidden',
80
+ whiteSpace: 'nowrap',
81
+ position: 'relative',
82
+ background: 'none',
83
+ zIndex: 2
84
+ }
85
+ };
86
+ });
87
+ var TrackContainerLabel = (0, _mobxReact.observer)(function (_ref) {
88
+ var model = _ref.model,
89
+ view = _ref.view;
90
+ var classes = useStyles();
91
+ var labelStyle = view.trackLabels === 'overlapping' ? classes.trackLabelOverlap : classes.trackLabelInline;
92
+ return view.trackLabels !== 'hidden' ? /*#__PURE__*/_react["default"].createElement(_TrackLabel["default"], {
93
+ track: model,
94
+ className: (0, _clsx["default"])(classes.trackLabel, labelStyle)
95
+ }) : null;
96
+ });
97
+
98
+ function TrackContainer(_ref2) {
99
+ var model = _ref2.model,
100
+ track = _ref2.track;
101
+ var classes = useStyles();
102
+ var display = track.displays[0];
103
+ var horizontalScroll = model.horizontalScroll,
104
+ draggingTrackId = model.draggingTrackId,
105
+ moveTrack = model.moveTrack;
106
+ var height = display.height;
107
+ var trackId = (0, _configuration.getConf)(track, 'trackId');
108
+ var ref = (0, _react.useRef)(null);
109
+ (0, _react.useEffect)(function () {
110
+ if (ref.current) {
111
+ model.trackRefs[trackId] = ref.current;
112
+ }
113
+
114
+ return function () {
115
+ delete model.trackRefs[trackId];
116
+ };
117
+ }, [model.trackRefs, trackId]);
118
+
119
+ function onDragEnter() {
120
+ if (draggingTrackId !== undefined && (0, _mobxStateTree.isAlive)(display) && draggingTrackId !== display.id) {
121
+ moveTrack(draggingTrackId, track.id);
122
+ }
123
+ }
124
+
125
+ var debouncedOnDragEnter = (0, _util.useDebouncedCallback)(onDragEnter, 100);
126
+ var RenderingComponent = display.RenderingComponent,
127
+ DisplayBlurb = display.DisplayBlurb;
128
+ var dimmed = draggingTrackId !== undefined && draggingTrackId !== display.id;
129
+ return /*#__PURE__*/_react["default"].createElement(_Paper["default"], {
130
+ className: classes.root,
131
+ variant: "outlined"
132
+ }, /*#__PURE__*/_react["default"].createElement(TrackContainerLabel, {
133
+ model: track,
134
+ view: model
135
+ }), /*#__PURE__*/_react["default"].createElement("div", {
136
+ className: classes.trackRenderingContainer,
137
+ style: {
138
+ height: height
139
+ },
140
+ onScroll: function onScroll(event) {
141
+ var target = event.target;
142
+ display.setScrollTop(target.scrollTop);
143
+ },
144
+ onDragEnter: debouncedOnDragEnter,
145
+ "data-testid": "trackRenderingContainer-".concat(model.id, "-").concat(trackId),
146
+ role: "presentation"
147
+ }, /*#__PURE__*/_react["default"].createElement("div", {
148
+ ref: ref,
149
+ className: classes.renderingComponentContainer,
150
+ style: {
151
+ transform: "scaleX(".concat(model.scaleFactor, ")")
152
+ }
153
+ }, /*#__PURE__*/_react["default"].createElement(RenderingComponent, {
154
+ model: display,
155
+ onHorizontalScroll: horizontalScroll
156
+ })), DisplayBlurb ? /*#__PURE__*/_react["default"].createElement("div", {
157
+ style: {
158
+ position: 'absolute',
159
+ left: 0,
160
+ top: display.height - 20
161
+ }
162
+ }, /*#__PURE__*/_react["default"].createElement(DisplayBlurb, {
163
+ model: display
164
+ })) : null), /*#__PURE__*/_react["default"].createElement("div", {
165
+ className: classes.overlay,
166
+ style: {
167
+ height: display.height,
168
+ background: dimmed ? 'rgba(0, 0, 0, 0.4)' : undefined
169
+ },
170
+ onDragEnter: debouncedOnDragEnter
171
+ }), /*#__PURE__*/_react["default"].createElement(_ui.ResizeHandle, {
172
+ onDrag: display.resizeHeight,
173
+ className: classes.resizeHandle
174
+ }));
175
+ }
176
+
177
+ var _default = (0, _mobxReact.observer)(TrackContainer);
178
+
179
+ exports["default"] = _default;