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