@jbrowse/plugin-linear-genome-view 2.0.0 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js +28 -55
- package/dist/BaseLinearDisplay/components/BaseLinearDisplay.js.map +1 -1
- package/dist/BaseLinearDisplay/components/Block.js +17 -28
- package/dist/BaseLinearDisplay/components/Block.js.map +1 -1
- package/dist/BaseLinearDisplay/components/LinearBlocks.js +19 -21
- package/dist/BaseLinearDisplay/components/LinearBlocks.js.map +1 -1
- package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +28 -48
- package/dist/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js.map +1 -1
- package/dist/BaseLinearDisplay/components/Tooltip.js +29 -58
- package/dist/BaseLinearDisplay/components/Tooltip.js.map +1 -1
- package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js +242 -363
- package/dist/BaseLinearDisplay/models/BaseLinearDisplayModel.js.map +1 -1
- package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js +1 -1
- package/dist/BaseLinearDisplay/models/baseLinearDisplayConfigSchema.js.map +1 -1
- package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js +77 -129
- package/dist/BaseLinearDisplay/models/serverSideRenderedBlock.js.map +1 -1
- package/dist/LinearBareDisplay/configSchema.js +2 -2
- package/dist/LinearBareDisplay/configSchema.js.map +1 -1
- package/dist/LinearBareDisplay/model.js +13 -19
- package/dist/LinearBareDisplay/model.js.map +1 -1
- package/dist/LinearBasicDisplay/components/SetMaxHeight.js +14 -31
- package/dist/LinearBasicDisplay/components/SetMaxHeight.js.map +1 -1
- package/dist/LinearBasicDisplay/configSchema.js +3 -3
- package/dist/LinearBasicDisplay/configSchema.js.map +1 -1
- package/dist/LinearBasicDisplay/model.js +119 -147
- package/dist/LinearBasicDisplay/model.js.map +1 -1
- package/dist/LinearGenomeView/components/CenterLine.js +11 -12
- package/dist/LinearGenomeView/components/CenterLine.js.map +1 -1
- package/dist/LinearGenomeView/components/ExportSvgDialog.js +30 -96
- package/dist/LinearGenomeView/components/ExportSvgDialog.js.map +1 -1
- package/dist/LinearGenomeView/components/GetSequenceDialog.d.ts +9 -0
- package/dist/LinearGenomeView/components/GetSequenceDialog.js +172 -0
- package/dist/LinearGenomeView/components/GetSequenceDialog.js.map +1 -0
- package/dist/LinearGenomeView/components/{VerticalGuides.d.ts → Gridlines.d.ts} +0 -0
- package/dist/LinearGenomeView/components/{VerticalGuides.js → Gridlines.js} +19 -21
- package/dist/LinearGenomeView/components/Gridlines.js.map +1 -0
- package/dist/LinearGenomeView/components/Header.js +26 -31
- package/dist/LinearGenomeView/components/Header.js.map +1 -1
- package/dist/LinearGenomeView/components/HelpDialog.js +10 -11
- package/dist/LinearGenomeView/components/HelpDialog.js.map +1 -1
- package/dist/LinearGenomeView/components/ImportForm.js +91 -154
- package/dist/LinearGenomeView/components/ImportForm.js.map +1 -1
- package/dist/LinearGenomeView/components/LinearGenomeView.js +20 -25
- package/dist/LinearGenomeView/components/LinearGenomeView.js.map +1 -1
- package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js +86 -157
- package/dist/LinearGenomeView/components/LinearGenomeViewSvg.js.map +1 -1
- package/dist/LinearGenomeView/components/MiniControls.js +16 -32
- package/dist/LinearGenomeView/components/MiniControls.js.map +1 -1
- package/dist/LinearGenomeView/components/OverviewRubberBand.d.ts +0 -11
- package/dist/LinearGenomeView/components/OverviewRubberBand.js +55 -84
- package/dist/LinearGenomeView/components/OverviewRubberBand.js.map +1 -1
- package/dist/LinearGenomeView/components/OverviewScaleBar.js +94 -117
- package/dist/LinearGenomeView/components/OverviewScaleBar.js.map +1 -1
- package/dist/LinearGenomeView/components/RefNameAutocomplete.js +90 -172
- package/dist/LinearGenomeView/components/RefNameAutocomplete.js.map +1 -1
- package/dist/LinearGenomeView/components/RubberBand.js +51 -72
- package/dist/LinearGenomeView/components/RubberBand.js.map +1 -1
- package/dist/LinearGenomeView/components/Ruler.js +17 -18
- package/dist/LinearGenomeView/components/Ruler.js.map +1 -1
- package/dist/LinearGenomeView/components/ScaleBar.js +37 -58
- package/dist/LinearGenomeView/components/ScaleBar.js.map +1 -1
- package/dist/LinearGenomeView/components/SearchBox.js +69 -133
- package/dist/LinearGenomeView/components/SearchBox.js.map +1 -1
- package/dist/LinearGenomeView/components/SearchResultsDialog.js +32 -33
- package/dist/LinearGenomeView/components/SearchResultsDialog.js.map +1 -1
- package/dist/LinearGenomeView/components/{SequenceDialog.d.ts → SequenceSearchDialog.d.ts} +0 -0
- package/dist/LinearGenomeView/components/SequenceSearchDialog.js +104 -0
- package/dist/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -0
- package/dist/LinearGenomeView/components/TrackContainer.d.ts +2 -1
- package/dist/LinearGenomeView/components/TrackContainer.js +36 -43
- package/dist/LinearGenomeView/components/TrackContainer.js.map +1 -1
- package/dist/LinearGenomeView/components/TrackLabel.js +50 -85
- package/dist/LinearGenomeView/components/TrackLabel.js.map +1 -1
- package/dist/LinearGenomeView/components/TracksContainer.js +33 -50
- package/dist/LinearGenomeView/components/TracksContainer.js.map +1 -1
- package/dist/LinearGenomeView/components/ZoomControls.js +15 -32
- package/dist/LinearGenomeView/components/ZoomControls.js.map +1 -1
- package/dist/LinearGenomeView/components/util.js +14 -87
- package/dist/LinearGenomeView/components/util.js.map +1 -1
- package/dist/LinearGenomeView/index.d.ts +66 -79
- package/dist/LinearGenomeView/index.js +534 -710
- package/dist/LinearGenomeView/index.js.map +1 -1
- package/dist/LinearGenomeView/util.js +17 -36
- package/dist/LinearGenomeView/util.js.map +1 -1
- package/dist/index.js +75 -146
- package/dist/index.js.map +1 -1
- package/esm/BaseLinearDisplay/components/BaseLinearDisplay.js +1 -1
- package/esm/BaseLinearDisplay/components/BaseLinearDisplay.js.map +1 -1
- package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js +1 -0
- package/esm/BaseLinearDisplay/components/ServerSideRenderedBlockContent.js.map +1 -1
- package/esm/LinearGenomeView/components/GetSequenceDialog.d.ts +9 -0
- package/esm/LinearGenomeView/components/{SequenceDialog.js → GetSequenceDialog.js} +5 -8
- package/esm/LinearGenomeView/components/GetSequenceDialog.js.map +1 -0
- package/esm/LinearGenomeView/components/{VerticalGuides.d.ts → Gridlines.d.ts} +0 -0
- package/esm/LinearGenomeView/components/{VerticalGuides.js → Gridlines.js} +1 -1
- package/esm/LinearGenomeView/components/Gridlines.js.map +1 -0
- package/esm/LinearGenomeView/components/ImportForm.js +1 -0
- package/esm/LinearGenomeView/components/ImportForm.js.map +1 -1
- package/esm/LinearGenomeView/components/LinearGenomeView.js +3 -7
- package/esm/LinearGenomeView/components/LinearGenomeView.js.map +1 -1
- package/esm/LinearGenomeView/components/OverviewRubberBand.d.ts +0 -11
- package/esm/LinearGenomeView/components/OverviewRubberBand.js +16 -21
- package/esm/LinearGenomeView/components/OverviewRubberBand.js.map +1 -1
- package/esm/LinearGenomeView/components/OverviewScaleBar.js +0 -2
- package/esm/LinearGenomeView/components/OverviewScaleBar.js.map +1 -1
- package/esm/LinearGenomeView/components/RubberBand.js +0 -2
- package/esm/LinearGenomeView/components/RubberBand.js.map +1 -1
- package/esm/LinearGenomeView/components/SearchBox.js.map +1 -1
- package/esm/LinearGenomeView/components/{SequenceDialog.d.ts → SequenceSearchDialog.d.ts} +0 -0
- package/esm/LinearGenomeView/components/SequenceSearchDialog.js +76 -0
- package/esm/LinearGenomeView/components/SequenceSearchDialog.js.map +1 -0
- package/esm/LinearGenomeView/components/TrackContainer.d.ts +2 -1
- package/esm/LinearGenomeView/components/TrackContainer.js +15 -20
- package/esm/LinearGenomeView/components/TrackContainer.js.map +1 -1
- package/esm/LinearGenomeView/components/TrackLabel.js +22 -23
- package/esm/LinearGenomeView/components/TrackLabel.js.map +1 -1
- package/esm/LinearGenomeView/components/TracksContainer.js +2 -2
- package/esm/LinearGenomeView/components/TracksContainer.js.map +1 -1
- package/esm/LinearGenomeView/index.d.ts +66 -79
- package/esm/LinearGenomeView/index.js +268 -407
- package/esm/LinearGenomeView/index.js.map +1 -1
- package/package.json +3 -4
- package/src/BaseLinearDisplay/components/BaseLinearDisplay.tsx +0 -1
- package/src/BaseLinearDisplay/components/ServerSideRenderedBlockContent.tsx +2 -1
- package/src/LinearGenomeView/components/{SequenceDialog.tsx → GetSequenceDialog.tsx} +5 -18
- package/src/LinearGenomeView/components/{VerticalGuides.tsx → Gridlines.tsx} +0 -0
- package/src/LinearGenomeView/components/ImportForm.tsx +1 -0
- package/src/LinearGenomeView/components/LinearGenomeView.tsx +4 -8
- package/src/LinearGenomeView/components/OverviewRubberBand.tsx +19 -34
- package/src/LinearGenomeView/components/OverviewScaleBar.tsx +0 -2
- package/src/LinearGenomeView/components/RubberBand.tsx +0 -2
- package/src/LinearGenomeView/components/SearchBox.tsx +1 -1
- package/src/LinearGenomeView/components/SequenceSearchDialog.tsx +165 -0
- package/src/LinearGenomeView/components/TrackContainer.tsx +18 -28
- package/src/LinearGenomeView/components/TrackLabel.tsx +60 -53
- package/src/LinearGenomeView/components/TracksContainer.tsx +2 -2
- package/src/LinearGenomeView/components/__snapshots__/LinearGenomeView.test.js.snap +14 -17
- package/src/LinearGenomeView/index.test.ts +14 -36
- package/src/LinearGenomeView/index.tsx +389 -541
- package/dist/LinearGenomeView/components/SequenceDialog.js +0 -242
- package/dist/LinearGenomeView/components/SequenceDialog.js.map +0 -1
- package/dist/LinearGenomeView/components/VerticalGuides.js.map +0 -1
- package/esm/LinearGenomeView/components/SequenceDialog.js.map +0 -1
- package/esm/LinearGenomeView/components/VerticalGuides.js.map +0 -1
|
@@ -1,15 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
3
|
if (k2 === undefined) k2 = k;
|
|
15
4
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -33,137 +22,54 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
33
22
|
__setModuleDefault(result, mod);
|
|
34
23
|
return result;
|
|
35
24
|
};
|
|
36
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
47
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
-
function step(op) {
|
|
50
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
-
while (_) try {
|
|
52
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
53
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
-
switch (op[0]) {
|
|
55
|
-
case 0: case 1: t = op; break;
|
|
56
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
-
default:
|
|
60
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
-
if (t[2]) _.ops.pop();
|
|
65
|
-
_.trys.pop(); continue;
|
|
66
|
-
}
|
|
67
|
-
op = body.call(thisArg, _);
|
|
68
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
73
|
-
var t = {};
|
|
74
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
75
|
-
t[p] = s[p];
|
|
76
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
77
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
78
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
79
|
-
t[p[i]] = s[p[i]];
|
|
80
|
-
}
|
|
81
|
-
return t;
|
|
82
|
-
};
|
|
83
|
-
var __values = (this && this.__values) || function(o) {
|
|
84
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
85
|
-
if (m) return m.call(o);
|
|
86
|
-
if (o && typeof o.length === "number") return {
|
|
87
|
-
next: function () {
|
|
88
|
-
if (o && i >= o.length) o = void 0;
|
|
89
|
-
return { value: o && o[i++], done: !o };
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
93
|
-
};
|
|
94
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
95
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
96
|
-
if (!m) return o;
|
|
97
|
-
var i = m.call(o), r, ar = [], e;
|
|
98
|
-
try {
|
|
99
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
100
|
-
}
|
|
101
|
-
catch (error) { e = { error: error }; }
|
|
102
|
-
finally {
|
|
103
|
-
try {
|
|
104
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
105
|
-
}
|
|
106
|
-
finally { if (e) throw e.error; }
|
|
107
|
-
}
|
|
108
|
-
return ar;
|
|
109
|
-
};
|
|
110
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
111
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
112
|
-
if (ar || !(i in from)) {
|
|
113
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
114
|
-
ar[i] = from[i];
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
118
|
-
};
|
|
119
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
120
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
121
27
|
};
|
|
122
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
123
29
|
exports.BaseLinearDisplay = void 0;
|
|
124
30
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
31
|
+
const react_1 = __importDefault(require("react"));
|
|
32
|
+
const material_1 = require("@mui/material");
|
|
33
|
+
const models_1 = require("@jbrowse/core/pluggableElementTypes/models");
|
|
34
|
+
const configuration_1 = require("@jbrowse/core/configuration");
|
|
35
|
+
const util_1 = require("@jbrowse/core/util");
|
|
36
|
+
const compositeMap_1 = __importDefault(require("@jbrowse/core/util/compositeMap"));
|
|
37
|
+
const simpleFeature_1 = require("@jbrowse/core/util/simpleFeature");
|
|
38
|
+
const tracks_1 = require("@jbrowse/core/util/tracks");
|
|
39
|
+
const mobx_1 = require("mobx");
|
|
40
|
+
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
135
41
|
// icons
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
42
|
+
const MenuOpen_1 = __importDefault(require("@mui/icons-material/MenuOpen"));
|
|
43
|
+
const BaseLinearDisplay_1 = require("../components/BaseLinearDisplay");
|
|
44
|
+
const serverSideRenderedBlock_1 = __importStar(require("./serverSideRenderedBlock"));
|
|
139
45
|
// stabilize clipid under test for snapshot
|
|
140
46
|
function getId(id, index) {
|
|
141
|
-
|
|
142
|
-
return
|
|
47
|
+
const isJest = typeof jest === 'undefined';
|
|
48
|
+
return `clip-${isJest ? id : 'jest'}-${index}`;
|
|
143
49
|
}
|
|
144
50
|
function getDisplayStr(totalBytes) {
|
|
145
|
-
|
|
51
|
+
let displayBp;
|
|
146
52
|
if (Math.floor(totalBytes / 1000000) > 0) {
|
|
147
|
-
displayBp =
|
|
53
|
+
displayBp = `${parseFloat((totalBytes / 1000000).toPrecision(3))} Mb`;
|
|
148
54
|
}
|
|
149
55
|
else if (Math.floor(totalBytes / 1000) > 0) {
|
|
150
|
-
displayBp =
|
|
56
|
+
displayBp = `${parseFloat((totalBytes / 1000).toPrecision(3))} Kb`;
|
|
151
57
|
}
|
|
152
58
|
else {
|
|
153
|
-
displayBp =
|
|
59
|
+
displayBp = `${Math.floor(totalBytes)} bytes`;
|
|
154
60
|
}
|
|
155
61
|
return displayBp;
|
|
156
62
|
}
|
|
157
|
-
|
|
158
|
-
|
|
63
|
+
const minDisplayHeight = 20;
|
|
64
|
+
const defaultDisplayHeight = 100;
|
|
159
65
|
exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
160
66
|
.compose('BaseLinearDisplay', models_1.BaseDisplay, mobx_state_tree_1.types.model({
|
|
161
|
-
height: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.refinement('displayHeight', mobx_state_tree_1.types.number,
|
|
67
|
+
height: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.refinement('displayHeight', mobx_state_tree_1.types.number, n => n >= minDisplayHeight), defaultDisplayHeight),
|
|
162
68
|
blockState: mobx_state_tree_1.types.map(serverSideRenderedBlock_1.default),
|
|
163
69
|
userBpPerPxLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
|
|
164
70
|
userByteSizeLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
|
|
165
71
|
}))
|
|
166
|
-
.volatile(
|
|
72
|
+
.volatile(() => ({
|
|
167
73
|
currBpPerPx: 0,
|
|
168
74
|
message: '',
|
|
169
75
|
featureIdUnderMouse: undefined,
|
|
@@ -171,21 +77,21 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
171
77
|
scrollTop: 0,
|
|
172
78
|
estimatedRegionStatsP: undefined,
|
|
173
79
|
estimatedRegionStats: undefined,
|
|
174
|
-
})
|
|
175
|
-
.views(
|
|
80
|
+
}))
|
|
81
|
+
.views(self => ({
|
|
176
82
|
get blockType() {
|
|
177
83
|
return 'staticBlocks';
|
|
178
84
|
},
|
|
179
85
|
get blockDefinitions() {
|
|
180
|
-
|
|
181
|
-
|
|
86
|
+
const { blockType } = this;
|
|
87
|
+
const view = (0, util_1.getContainingView)(self);
|
|
182
88
|
if (!view.initialized) {
|
|
183
89
|
throw new Error('view not initialized yet');
|
|
184
90
|
}
|
|
185
91
|
return view[blockType];
|
|
186
92
|
},
|
|
187
|
-
})
|
|
188
|
-
.views(
|
|
93
|
+
}))
|
|
94
|
+
.views(self => ({
|
|
189
95
|
/**
|
|
190
96
|
* how many milliseconds to wait for the display to
|
|
191
97
|
* "settle" before re-rendering a block
|
|
@@ -202,7 +108,7 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
202
108
|
*/
|
|
203
109
|
get selectedFeatureId() {
|
|
204
110
|
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
205
|
-
|
|
111
|
+
const { selection } = (0, util_1.getSession)(self);
|
|
206
112
|
// does it quack like a feature?
|
|
207
113
|
if ((0, simpleFeature_1.isFeature)(selection)) {
|
|
208
114
|
return selection.id();
|
|
@@ -217,50 +123,39 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
217
123
|
get DisplayMessageComponent() {
|
|
218
124
|
return undefined;
|
|
219
125
|
},
|
|
220
|
-
})
|
|
221
|
-
.views(
|
|
126
|
+
}))
|
|
127
|
+
.views(self => ({
|
|
222
128
|
/**
|
|
223
129
|
* a CompositeMap of `featureId -> feature obj` that
|
|
224
130
|
* just looks in all the block data for that feature
|
|
225
131
|
*/
|
|
226
132
|
get features() {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
var block = _c.value;
|
|
232
|
-
if (block && block.features) {
|
|
233
|
-
featureMaps.push(block.features);
|
|
234
|
-
}
|
|
133
|
+
const featureMaps = [];
|
|
134
|
+
for (const block of self.blockState.values()) {
|
|
135
|
+
if (block && block.features) {
|
|
136
|
+
featureMaps.push(block.features);
|
|
235
137
|
}
|
|
236
138
|
}
|
|
237
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
238
|
-
finally {
|
|
239
|
-
try {
|
|
240
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
241
|
-
}
|
|
242
|
-
finally { if (e_1) throw e_1.error; }
|
|
243
|
-
}
|
|
244
139
|
return new compositeMap_1.default(featureMaps);
|
|
245
140
|
},
|
|
246
141
|
get featureUnderMouse() {
|
|
247
|
-
|
|
142
|
+
const feat = self.featureIdUnderMouse;
|
|
248
143
|
return feat ? this.features.get(feat) : undefined;
|
|
249
144
|
},
|
|
250
|
-
getFeatureOverlapping
|
|
145
|
+
getFeatureOverlapping(blockKey, x, y) {
|
|
251
146
|
var _a, _b;
|
|
252
147
|
return (_b = (_a = self.blockState.get(blockKey)) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.getByCoord(x, y);
|
|
253
148
|
},
|
|
254
|
-
getFeatureByID
|
|
149
|
+
getFeatureByID(blockKey, id) {
|
|
255
150
|
var _a, _b;
|
|
256
151
|
return (_b = (_a = self.blockState.get(blockKey)) === null || _a === void 0 ? void 0 : _a.layout) === null || _b === void 0 ? void 0 : _b.getByID(id);
|
|
257
152
|
},
|
|
258
153
|
// if block key is not supplied, can look at all blocks
|
|
259
|
-
searchFeatureByID
|
|
260
|
-
|
|
261
|
-
self.blockState.forEach(
|
|
154
|
+
searchFeatureByID(id) {
|
|
155
|
+
let ret;
|
|
156
|
+
self.blockState.forEach(block => {
|
|
262
157
|
var _a;
|
|
263
|
-
|
|
158
|
+
const val = (_a = block === null || block === void 0 ? void 0 : block.layout) === null || _a === void 0 ? void 0 : _a.getByID(id);
|
|
264
159
|
if (val) {
|
|
265
160
|
ret = val;
|
|
266
161
|
}
|
|
@@ -273,7 +168,7 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
273
168
|
},
|
|
274
169
|
get currentFeatureScreenDensity() {
|
|
275
170
|
var _a;
|
|
276
|
-
|
|
171
|
+
const view = (0, util_1.getContainingView)(self);
|
|
277
172
|
return (((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.featureDensity) || 0) * view.bpPerPx;
|
|
278
173
|
},
|
|
279
174
|
get maxFeatureScreenDensity() {
|
|
@@ -288,73 +183,77 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
288
183
|
((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.fetchSizeLimit) ||
|
|
289
184
|
(0, configuration_1.getConf)(self, 'fetchSizeLimit'));
|
|
290
185
|
},
|
|
291
|
-
})
|
|
292
|
-
.actions(
|
|
186
|
+
}))
|
|
187
|
+
.actions(self => ({
|
|
293
188
|
// base display reload does nothing, see specialized displays for details
|
|
294
|
-
setMessage
|
|
189
|
+
setMessage(message) {
|
|
295
190
|
self.message = message;
|
|
296
191
|
},
|
|
297
|
-
afterAttach
|
|
298
|
-
var _this = this;
|
|
192
|
+
afterAttach() {
|
|
299
193
|
// watch the parent's blocks to update our block state when they change,
|
|
300
194
|
// then we recreate the blocks on our own model (creating and deleting to
|
|
301
195
|
// match the parent blocks)
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
196
|
+
const blockWatchDisposer = (0, mobx_1.autorun)(() => {
|
|
197
|
+
const blocksPresent = {};
|
|
198
|
+
const view = (0, util_1.getContainingView)(self);
|
|
305
199
|
if (view.initialized) {
|
|
306
|
-
self.blockDefinitions.contentBlocks.forEach(
|
|
200
|
+
self.blockDefinitions.contentBlocks.forEach(block => {
|
|
307
201
|
blocksPresent[block.key] = true;
|
|
308
202
|
if (!self.blockState.has(block.key)) {
|
|
309
|
-
|
|
203
|
+
this.addBlock(block.key, block);
|
|
310
204
|
}
|
|
311
205
|
});
|
|
312
|
-
self.blockState.forEach(
|
|
206
|
+
self.blockState.forEach((_, key) => {
|
|
313
207
|
if (!blocksPresent[key]) {
|
|
314
|
-
|
|
208
|
+
this.deleteBlock(key);
|
|
315
209
|
}
|
|
316
210
|
});
|
|
317
211
|
}
|
|
318
212
|
});
|
|
319
213
|
(0, mobx_state_tree_1.addDisposer)(self, blockWatchDisposer);
|
|
320
214
|
},
|
|
321
|
-
estimateRegionsStats
|
|
322
|
-
var _this = this;
|
|
215
|
+
estimateRegionsStats(regions, opts) {
|
|
323
216
|
if (self.estimatedRegionStatsP) {
|
|
324
217
|
return self.estimatedRegionStatsP;
|
|
325
218
|
}
|
|
326
|
-
|
|
327
|
-
|
|
219
|
+
const { rpcManager } = (0, util_1.getSession)(self);
|
|
220
|
+
const { adapterConfig } = self;
|
|
328
221
|
if (!adapterConfig) {
|
|
329
222
|
// A track extending the base track might not have an adapter config
|
|
330
223
|
// e.g. Apollo tracks don't use adapters
|
|
331
224
|
return Promise.resolve({});
|
|
332
225
|
}
|
|
333
|
-
|
|
334
|
-
|
|
226
|
+
const sessionId = (0, tracks_1.getRpcSessionId)(self);
|
|
227
|
+
const params = {
|
|
228
|
+
sessionId,
|
|
229
|
+
regions,
|
|
230
|
+
adapterConfig,
|
|
231
|
+
statusCallback: (message) => {
|
|
335
232
|
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
336
|
-
|
|
233
|
+
this.setMessage(message);
|
|
337
234
|
}
|
|
338
|
-
}
|
|
235
|
+
},
|
|
236
|
+
...opts,
|
|
237
|
+
};
|
|
339
238
|
self.estimatedRegionStatsP = rpcManager
|
|
340
239
|
.call(sessionId, 'CoreEstimateRegionStats', params)
|
|
341
|
-
.catch(
|
|
342
|
-
|
|
240
|
+
.catch(e => {
|
|
241
|
+
this.setRegionStatsP(undefined);
|
|
343
242
|
throw e;
|
|
344
243
|
});
|
|
345
244
|
return self.estimatedRegionStatsP;
|
|
346
245
|
},
|
|
347
|
-
setRegionStatsP
|
|
246
|
+
setRegionStatsP(p) {
|
|
348
247
|
self.estimatedRegionStatsP = p;
|
|
349
248
|
},
|
|
350
|
-
setRegionStats
|
|
249
|
+
setRegionStats(estimatedRegionStats) {
|
|
351
250
|
self.estimatedRegionStats = estimatedRegionStats;
|
|
352
251
|
},
|
|
353
|
-
clearRegionStats
|
|
252
|
+
clearRegionStats() {
|
|
354
253
|
self.estimatedRegionStatsP = undefined;
|
|
355
254
|
self.estimatedRegionStats = undefined;
|
|
356
255
|
},
|
|
357
|
-
setHeight
|
|
256
|
+
setHeight(displayHeight) {
|
|
358
257
|
if (displayHeight > minDisplayHeight) {
|
|
359
258
|
self.height = displayHeight;
|
|
360
259
|
}
|
|
@@ -363,16 +262,16 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
363
262
|
}
|
|
364
263
|
return self.height;
|
|
365
264
|
},
|
|
366
|
-
resizeHeight
|
|
367
|
-
|
|
368
|
-
|
|
265
|
+
resizeHeight(distance) {
|
|
266
|
+
const oldHeight = self.height;
|
|
267
|
+
const newHeight = this.setHeight(self.height + distance);
|
|
369
268
|
return newHeight - oldHeight;
|
|
370
269
|
},
|
|
371
|
-
setScrollTop
|
|
270
|
+
setScrollTop(scrollTop) {
|
|
372
271
|
self.scrollTop = scrollTop;
|
|
373
272
|
},
|
|
374
|
-
updateStatsLimit
|
|
375
|
-
|
|
273
|
+
updateStatsLimit(stats) {
|
|
274
|
+
const view = (0, util_1.getContainingView)(self);
|
|
376
275
|
if (stats.bytes) {
|
|
377
276
|
self.userByteSizeLimit = stats.bytes;
|
|
378
277
|
}
|
|
@@ -380,22 +279,22 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
380
279
|
self.userBpPerPxLimit = view.bpPerPx;
|
|
381
280
|
}
|
|
382
281
|
},
|
|
383
|
-
addBlock
|
|
282
|
+
addBlock(key, block) {
|
|
384
283
|
self.blockState.set(key, serverSideRenderedBlock_1.default.create({
|
|
385
|
-
key
|
|
284
|
+
key,
|
|
386
285
|
region: block.toRegion(),
|
|
387
286
|
}));
|
|
388
287
|
},
|
|
389
|
-
setCurrBpPerPx
|
|
288
|
+
setCurrBpPerPx(n) {
|
|
390
289
|
self.currBpPerPx = n;
|
|
391
290
|
},
|
|
392
|
-
deleteBlock
|
|
291
|
+
deleteBlock(key) {
|
|
393
292
|
self.blockState.delete(key);
|
|
394
293
|
},
|
|
395
|
-
selectFeature
|
|
396
|
-
|
|
294
|
+
selectFeature(feature) {
|
|
295
|
+
const session = (0, util_1.getSession)(self);
|
|
397
296
|
if ((0, util_1.isSessionModelWithWidgets)(session)) {
|
|
398
|
-
|
|
297
|
+
const featureWidget = session.addWidget('BaseFeatureWidget', 'baseFeature', {
|
|
399
298
|
view: (0, util_1.getContainingView)(self),
|
|
400
299
|
track: (0, util_1.getContainingTrack)(self),
|
|
401
300
|
featureData: feature.toJSON(),
|
|
@@ -406,32 +305,32 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
406
305
|
session.setSelection(feature);
|
|
407
306
|
}
|
|
408
307
|
},
|
|
409
|
-
clearFeatureSelection
|
|
410
|
-
|
|
308
|
+
clearFeatureSelection() {
|
|
309
|
+
const session = (0, util_1.getSession)(self);
|
|
411
310
|
session.clearSelection();
|
|
412
311
|
},
|
|
413
|
-
setFeatureIdUnderMouse
|
|
312
|
+
setFeatureIdUnderMouse(feature) {
|
|
414
313
|
self.featureIdUnderMouse = feature;
|
|
415
314
|
},
|
|
416
|
-
reload
|
|
315
|
+
reload() {
|
|
417
316
|
;
|
|
418
|
-
|
|
317
|
+
[...self.blockState.values()].map(val => val.doReload());
|
|
419
318
|
},
|
|
420
|
-
setContextMenuFeature
|
|
319
|
+
setContextMenuFeature(feature) {
|
|
421
320
|
self.contextMenuFeature = feature;
|
|
422
321
|
},
|
|
423
|
-
})
|
|
424
|
-
.views(
|
|
322
|
+
}))
|
|
323
|
+
.views(self => ({
|
|
425
324
|
// region is too large if:
|
|
426
325
|
// - stats are ready
|
|
427
326
|
// - region is greater than 20kb (don't warn when zoomed in less than that)
|
|
428
327
|
// - and bytes > max allowed bytes || curr density>max density
|
|
429
328
|
get regionTooLarge() {
|
|
430
|
-
|
|
329
|
+
const view = (0, util_1.getContainingView)(self);
|
|
431
330
|
if (!self.estimatedStatsReady || view.dynamicBlocks.totalBp < 20000) {
|
|
432
331
|
return false;
|
|
433
332
|
}
|
|
434
|
-
|
|
333
|
+
const bpLimitOrDensity = self.userBpPerPxLimit
|
|
435
334
|
? view.bpPerPx > self.userBpPerPxLimit
|
|
436
335
|
: self.currentFeatureScreenDensity > self.maxFeatureScreenDensity;
|
|
437
336
|
return (self.currentBytesRequested > self.maxAllowableBytes || bpLimitOrDensity);
|
|
@@ -439,115 +338,90 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
439
338
|
// only shows a message of bytes requested is defined, the feature density
|
|
440
339
|
// based stats don't produce any helpful message besides to zoom in
|
|
441
340
|
get regionTooLargeReason() {
|
|
442
|
-
|
|
443
|
-
|
|
341
|
+
const req = self.currentBytesRequested;
|
|
342
|
+
const max = self.maxAllowableBytes;
|
|
444
343
|
return req && req > max
|
|
445
|
-
?
|
|
344
|
+
? `Requested too much data (${getDisplayStr(req)})`
|
|
446
345
|
: '';
|
|
447
346
|
},
|
|
448
|
-
})
|
|
449
|
-
.actions(
|
|
450
|
-
|
|
347
|
+
}))
|
|
348
|
+
.actions(self => {
|
|
349
|
+
const { reload: superReload } = self;
|
|
451
350
|
return {
|
|
452
|
-
reload
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
return [2 /*return*/];
|
|
479
|
-
}
|
|
480
|
-
return [3 /*break*/, 4];
|
|
481
|
-
case 3:
|
|
482
|
-
e_2 = _a.sent();
|
|
483
|
-
console.error(e_2);
|
|
484
|
-
self.setError(e_2);
|
|
485
|
-
return [3 /*break*/, 4];
|
|
486
|
-
case 4: return [2 /*return*/];
|
|
487
|
-
}
|
|
488
|
-
});
|
|
489
|
-
});
|
|
351
|
+
async reload() {
|
|
352
|
+
self.setError();
|
|
353
|
+
const aborter = new AbortController();
|
|
354
|
+
const view = (0, util_1.getContainingView)(self);
|
|
355
|
+
// extra check for contentBlocks.length
|
|
356
|
+
// https://github.com/GMOD/jbrowse-components/issues/2694
|
|
357
|
+
if (!view.initialized || !view.staticBlocks.contentBlocks.length) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
self.estimatedRegionStatsP = self.estimateRegionsStats(view.staticBlocks.contentBlocks, { signal: aborter.signal });
|
|
362
|
+
const estimatedRegionStats = await self.estimatedRegionStatsP;
|
|
363
|
+
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
364
|
+
self.setRegionStats(estimatedRegionStats);
|
|
365
|
+
superReload();
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
catch (e) {
|
|
372
|
+
console.error(e);
|
|
373
|
+
self.setError(e);
|
|
374
|
+
}
|
|
490
375
|
},
|
|
491
|
-
afterAttach
|
|
492
|
-
var _this = this;
|
|
376
|
+
afterAttach() {
|
|
493
377
|
// this autorun performs stats estimation
|
|
494
378
|
//
|
|
495
379
|
// the chain of events calls estimateRegionsStats against the data
|
|
496
380
|
// adapter which by default uses featureDensity, but can also respond
|
|
497
381
|
// with a byte size estimate and fetch size limit (data adapter can
|
|
498
382
|
// define what is too much data)
|
|
499
|
-
(0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(
|
|
500
|
-
var aborter, view, statsP, estimatedRegionStats, e_3;
|
|
383
|
+
(0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(async () => {
|
|
501
384
|
var _a;
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
if (!view.initialized ||
|
|
511
|
-
!view.staticBlocks.contentBlocks.length) {
|
|
512
|
-
return [2 /*return*/];
|
|
513
|
-
}
|
|
514
|
-
// don't re-estimate featureDensity even if zoom level changes,
|
|
515
|
-
// jbrowse1-style assume it's sort of representative
|
|
516
|
-
if (((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.featureDensity) !== undefined) {
|
|
517
|
-
self.setCurrBpPerPx(view.bpPerPx);
|
|
518
|
-
return [2 /*return*/];
|
|
519
|
-
}
|
|
520
|
-
// we estimate stats once at a given zoom level
|
|
521
|
-
if (view.bpPerPx === self.currBpPerPx) {
|
|
522
|
-
return [2 /*return*/];
|
|
523
|
-
}
|
|
524
|
-
self.clearRegionStats();
|
|
525
|
-
self.setCurrBpPerPx(view.bpPerPx);
|
|
526
|
-
statsP = self.estimateRegionsStats(view.staticBlocks.contentBlocks, { signal: aborter.signal });
|
|
527
|
-
self.setRegionStatsP(statsP);
|
|
528
|
-
return [4 /*yield*/, statsP];
|
|
529
|
-
case 1:
|
|
530
|
-
estimatedRegionStats = _b.sent();
|
|
531
|
-
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
532
|
-
self.setRegionStats(estimatedRegionStats);
|
|
533
|
-
}
|
|
534
|
-
return [3 /*break*/, 3];
|
|
535
|
-
case 2:
|
|
536
|
-
e_3 = _b.sent();
|
|
537
|
-
if (!(0, util_1.isAbortException)(e_3) && (0, mobx_state_tree_1.isAlive)(self)) {
|
|
538
|
-
console.error(e_3);
|
|
539
|
-
self.setError(e_3);
|
|
540
|
-
}
|
|
541
|
-
return [3 /*break*/, 3];
|
|
542
|
-
case 3: return [2 /*return*/];
|
|
385
|
+
try {
|
|
386
|
+
const aborter = new AbortController();
|
|
387
|
+
const view = (0, util_1.getContainingView)(self);
|
|
388
|
+
// extra check for contentBlocks.length
|
|
389
|
+
// https://github.com/GMOD/jbrowse-components/issues/2694
|
|
390
|
+
if (!view.initialized ||
|
|
391
|
+
!view.staticBlocks.contentBlocks.length) {
|
|
392
|
+
return;
|
|
543
393
|
}
|
|
544
|
-
|
|
545
|
-
|
|
394
|
+
// don't re-estimate featureDensity even if zoom level changes,
|
|
395
|
+
// jbrowse1-style assume it's sort of representative
|
|
396
|
+
if (((_a = self.estimatedRegionStats) === null || _a === void 0 ? void 0 : _a.featureDensity) !== undefined) {
|
|
397
|
+
self.setCurrBpPerPx(view.bpPerPx);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
// we estimate stats once at a given zoom level
|
|
401
|
+
if (view.bpPerPx === self.currBpPerPx) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
self.clearRegionStats();
|
|
405
|
+
self.setCurrBpPerPx(view.bpPerPx);
|
|
406
|
+
const statsP = self.estimateRegionsStats(view.staticBlocks.contentBlocks, { signal: aborter.signal });
|
|
407
|
+
self.setRegionStatsP(statsP);
|
|
408
|
+
const estimatedRegionStats = await statsP;
|
|
409
|
+
if ((0, mobx_state_tree_1.isAlive)(self)) {
|
|
410
|
+
self.setRegionStats(estimatedRegionStats);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
catch (e) {
|
|
414
|
+
if (!(0, util_1.isAbortException)(e) && (0, mobx_state_tree_1.isAlive)(self)) {
|
|
415
|
+
console.error(e);
|
|
416
|
+
self.setError(e);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}, { delay: 500 }));
|
|
546
420
|
},
|
|
547
421
|
};
|
|
548
422
|
})
|
|
549
|
-
.views(
|
|
550
|
-
regionCannotBeRenderedText
|
|
423
|
+
.views(self => ({
|
|
424
|
+
regionCannotBeRenderedText(_region) {
|
|
551
425
|
return self.regionTooLarge ? 'Force load to see features' : '';
|
|
552
426
|
},
|
|
553
427
|
/**
|
|
@@ -557,15 +431,15 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
557
431
|
* string of text describes why it cannot be rendered
|
|
558
432
|
* react node allows user to force load at current setting
|
|
559
433
|
*/
|
|
560
|
-
regionCannotBeRendered
|
|
561
|
-
|
|
434
|
+
regionCannotBeRendered(_region) {
|
|
435
|
+
const { regionTooLarge, regionTooLargeReason } = self;
|
|
562
436
|
if (regionTooLarge) {
|
|
563
437
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
564
438
|
react_1.default.createElement(material_1.Typography, { component: "span", variant: "body2" },
|
|
565
439
|
regionTooLargeReason ? regionTooLargeReason + '. ' : '',
|
|
566
440
|
"Zoom in to see features or",
|
|
567
441
|
' '),
|
|
568
|
-
react_1.default.createElement(material_1.Button, { "data-testid": "force_reload_button", onClick:
|
|
442
|
+
react_1.default.createElement(material_1.Button, { "data-testid": "force_reload_button", onClick: () => {
|
|
569
443
|
if (!self.estimatedRegionStats) {
|
|
570
444
|
console.error('No global stats?');
|
|
571
445
|
}
|
|
@@ -578,16 +452,16 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
578
452
|
}
|
|
579
453
|
return undefined;
|
|
580
454
|
},
|
|
581
|
-
trackMenuItems
|
|
455
|
+
trackMenuItems() {
|
|
582
456
|
return [];
|
|
583
457
|
},
|
|
584
|
-
contextMenuItems
|
|
458
|
+
contextMenuItems() {
|
|
585
459
|
return self.contextMenuFeature
|
|
586
460
|
? [
|
|
587
461
|
{
|
|
588
462
|
label: 'Open feature details',
|
|
589
463
|
icon: MenuOpen_1.default,
|
|
590
|
-
onClick:
|
|
464
|
+
onClick: () => {
|
|
591
465
|
if (self.contextMenuFeature) {
|
|
592
466
|
self.selectFeature(self.contextMenuFeature);
|
|
593
467
|
}
|
|
@@ -596,25 +470,31 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
596
470
|
]
|
|
597
471
|
: [];
|
|
598
472
|
},
|
|
599
|
-
renderProps
|
|
600
|
-
|
|
601
|
-
return
|
|
602
|
-
|
|
473
|
+
renderProps() {
|
|
474
|
+
const view = (0, util_1.getContainingView)(self);
|
|
475
|
+
return {
|
|
476
|
+
...(0, tracks_1.getParentRenderProps)(self),
|
|
477
|
+
notReady: self.currBpPerPx !== view.bpPerPx || !self.estimatedRegionStats,
|
|
478
|
+
rpcDriverName: self.rpcDriverName,
|
|
479
|
+
displayModel: self,
|
|
480
|
+
onFeatureClick(_, featureId) {
|
|
481
|
+
const f = featureId || self.featureIdUnderMouse;
|
|
603
482
|
if (!f) {
|
|
604
483
|
self.clearFeatureSelection();
|
|
605
484
|
}
|
|
606
485
|
else {
|
|
607
|
-
|
|
486
|
+
const feature = self.features.get(f);
|
|
608
487
|
if (feature) {
|
|
609
488
|
self.selectFeature(feature);
|
|
610
489
|
}
|
|
611
490
|
}
|
|
612
|
-
},
|
|
491
|
+
},
|
|
492
|
+
onClick() {
|
|
613
493
|
self.clearFeatureSelection();
|
|
614
|
-
},
|
|
494
|
+
},
|
|
615
495
|
// similar to click but opens a menu with further options
|
|
616
|
-
onFeatureContextMenu
|
|
617
|
-
|
|
496
|
+
onFeatureContextMenu(_, featureId) {
|
|
497
|
+
const f = featureId || self.featureIdUnderMouse;
|
|
618
498
|
if (!f) {
|
|
619
499
|
self.clearFeatureSelection();
|
|
620
500
|
}
|
|
@@ -622,70 +502,69 @@ exports.BaseLinearDisplay = mobx_state_tree_1.types
|
|
|
622
502
|
// feature id under mouse passed to context menu
|
|
623
503
|
self.setContextMenuFeature(self.features.get(f));
|
|
624
504
|
}
|
|
625
|
-
},
|
|
505
|
+
},
|
|
506
|
+
onMouseMove(_, featureId) {
|
|
626
507
|
self.setFeatureIdUnderMouse(featureId);
|
|
627
|
-
},
|
|
508
|
+
},
|
|
509
|
+
onMouseLeave(_) {
|
|
628
510
|
self.setFeatureIdUnderMouse(undefined);
|
|
629
|
-
},
|
|
511
|
+
},
|
|
512
|
+
onContextMenu() {
|
|
630
513
|
self.setContextMenuFeature(undefined);
|
|
631
514
|
self.clearFeatureSelection();
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
return [4 /*yield*/, Promise.all(roundedDynamicBlocks.map(function (block) {
|
|
647
|
-
var blockState = serverSideRenderedBlock_1.default.create({
|
|
648
|
-
key: block.key,
|
|
649
|
-
region: block,
|
|
650
|
-
});
|
|
651
|
-
// regionCannotBeRendered can return jsx so look for plaintext
|
|
652
|
-
// version, or just get the default if none available
|
|
653
|
-
var cannotBeRenderedReason = self.regionCannotBeRenderedText(block) ||
|
|
654
|
-
self.regionCannotBeRendered(block);
|
|
655
|
-
if (cannotBeRenderedReason) {
|
|
656
|
-
return {
|
|
657
|
-
reactElement: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
658
|
-
react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: 20, fill: "#aaa" }),
|
|
659
|
-
react_1.default.createElement("text", { x: 0, y: 15 }, cannotBeRenderedReason))),
|
|
660
|
-
};
|
|
661
|
-
}
|
|
662
|
-
var _a = (0, serverSideRenderedBlock_1.renderBlockData)(blockState, self), rpcManager = _a.rpcManager, renderArgs = _a.renderArgs, renderProps = _a.renderProps, rendererType = _a.rendererType;
|
|
663
|
-
return rendererType.renderInClient(rpcManager, __assign(__assign(__assign({}, renderArgs), renderProps), { viewParams: (0, util_1.getViewParams)(self, true), exportSVG: opts }));
|
|
664
|
-
}))];
|
|
665
|
-
case 1:
|
|
666
|
-
renderings = _a.sent();
|
|
667
|
-
return [2 /*return*/, (react_1.default.createElement(react_1.default.Fragment, null, renderings.map(function (rendering, index) {
|
|
668
|
-
var offsetPx = roundedDynamicBlocks[index].offsetPx;
|
|
669
|
-
var offset = offsetPx - viewOffsetPx;
|
|
670
|
-
var clipid = getId(id, index);
|
|
671
|
-
return (react_1.default.createElement(react_1.default.Fragment, { key: "frag-".concat(index) },
|
|
672
|
-
react_1.default.createElement("defs", null,
|
|
673
|
-
react_1.default.createElement("clipPath", { id: clipid },
|
|
674
|
-
react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: overrideHeight || height }))),
|
|
675
|
-
react_1.default.createElement("g", { transform: "translate(".concat(offset, " 0)") },
|
|
676
|
-
react_1.default.createElement("g", { clipPath: "url(#".concat(clipid, ")") }, react_1.default.isValidElement(rendering.reactElement) ? (rendering.reactElement) : (
|
|
677
|
-
// eslint-disable-next-line react/no-danger
|
|
678
|
-
react_1.default.createElement("g", { dangerouslySetInnerHTML: { __html: rendering.html } }))))));
|
|
679
|
-
})))];
|
|
680
|
-
}
|
|
515
|
+
},
|
|
516
|
+
};
|
|
517
|
+
},
|
|
518
|
+
}))
|
|
519
|
+
.actions(self => ({
|
|
520
|
+
async renderSvg(opts) {
|
|
521
|
+
const { height, id } = self;
|
|
522
|
+
const { overrideHeight } = opts;
|
|
523
|
+
const view = (0, util_1.getContainingView)(self);
|
|
524
|
+
const { offsetPx: viewOffsetPx, roundedDynamicBlocks, width } = view;
|
|
525
|
+
const renderings = await Promise.all(roundedDynamicBlocks.map(block => {
|
|
526
|
+
const blockState = serverSideRenderedBlock_1.default.create({
|
|
527
|
+
key: block.key,
|
|
528
|
+
region: block,
|
|
681
529
|
});
|
|
682
|
-
|
|
530
|
+
// regionCannotBeRendered can return jsx so look for plaintext
|
|
531
|
+
// version, or just get the default if none available
|
|
532
|
+
const cannotBeRenderedReason = self.regionCannotBeRenderedText(block) ||
|
|
533
|
+
self.regionCannotBeRendered(block);
|
|
534
|
+
if (cannotBeRenderedReason) {
|
|
535
|
+
return {
|
|
536
|
+
reactElement: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
537
|
+
react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: 20, fill: "#aaa" }),
|
|
538
|
+
react_1.default.createElement("text", { x: 0, y: 15 }, cannotBeRenderedReason))),
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
const { rpcManager, renderArgs, renderProps, rendererType } = (0, serverSideRenderedBlock_1.renderBlockData)(blockState, self);
|
|
542
|
+
return rendererType.renderInClient(rpcManager, {
|
|
543
|
+
...renderArgs,
|
|
544
|
+
...renderProps,
|
|
545
|
+
viewParams: (0, util_1.getViewParams)(self, true),
|
|
546
|
+
exportSVG: opts,
|
|
547
|
+
});
|
|
548
|
+
}));
|
|
549
|
+
return (react_1.default.createElement(react_1.default.Fragment, null, renderings.map((rendering, index) => {
|
|
550
|
+
const { offsetPx } = roundedDynamicBlocks[index];
|
|
551
|
+
const offset = offsetPx - viewOffsetPx;
|
|
552
|
+
const clipid = getId(id, index);
|
|
553
|
+
return (react_1.default.createElement(react_1.default.Fragment, { key: `frag-${index}` },
|
|
554
|
+
react_1.default.createElement("defs", null,
|
|
555
|
+
react_1.default.createElement("clipPath", { id: clipid },
|
|
556
|
+
react_1.default.createElement("rect", { x: 0, y: 0, width: width, height: overrideHeight || height }))),
|
|
557
|
+
react_1.default.createElement("g", { transform: `translate(${offset} 0)` },
|
|
558
|
+
react_1.default.createElement("g", { clipPath: `url(#${clipid})` }, react_1.default.isValidElement(rendering.reactElement) ? (rendering.reactElement) : (
|
|
559
|
+
// eslint-disable-next-line react/no-danger
|
|
560
|
+
react_1.default.createElement("g", { dangerouslySetInnerHTML: { __html: rendering.html } }))))));
|
|
561
|
+
})));
|
|
683
562
|
},
|
|
684
|
-
})
|
|
685
|
-
.postProcessSnapshot(
|
|
563
|
+
}))
|
|
564
|
+
.postProcessSnapshot(self => {
|
|
686
565
|
// xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit
|
|
687
|
-
|
|
688
|
-
|
|
566
|
+
const r = self;
|
|
567
|
+
const { blockState, ...rest } = r;
|
|
689
568
|
return rest;
|
|
690
569
|
});
|
|
691
570
|
//# sourceMappingURL=BaseLinearDisplayModel.js.map
|