@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
123 lines (122 loc) • 5.08 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = FeatureDensityMixin;
const jsx_runtime_1 = require("react/jsx-runtime");
const configuration_1 = require("@jbrowse/core/configuration");
const util_1 = require("@jbrowse/core/util");
const mobx_1 = require("mobx");
const mobx_state_tree_1 = require("mobx-state-tree");
const autorunFeatureDensityStats_1 = __importDefault(require("./autorunFeatureDensityStats"));
const util_2 = require("./util");
const TooLargeMessage_1 = __importDefault(require("../components/TooLargeMessage"));
function FeatureDensityMixin() {
return mobx_state_tree_1.types
.model({
userBpPerPxLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
userByteSizeLimit: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
})
.volatile(() => ({
featureDensityStatsP: undefined,
featureDensityStats: undefined,
currStatsBpPerPx: 0,
}))
.views(self => ({
get currentBytesRequested() {
var _a;
return ((_a = self.featureDensityStats) === null || _a === void 0 ? void 0 : _a.bytes) || 0;
},
get currentFeatureScreenDensity() {
var _a;
const view = (0, util_1.getContainingView)(self);
return (((_a = self.featureDensityStats) === null || _a === void 0 ? void 0 : _a.featureDensity) || 0) * view.bpPerPx;
},
get maxFeatureScreenDensity() {
return (0, configuration_1.getConf)(self, 'maxFeatureScreenDensity');
},
get featureDensityStatsReady() {
const view = (0, util_1.getContainingView)(self);
return (self.currStatsBpPerPx === view.bpPerPx &&
(!!self.featureDensityStats || !!self.userBpPerPxLimit));
},
get maxAllowableBytes() {
var _a;
return (self.userByteSizeLimit ||
((_a = self.featureDensityStats) === null || _a === void 0 ? void 0 : _a.fetchSizeLimit) ||
(0, configuration_1.getConf)(self, 'fetchSizeLimit'));
},
}))
.actions(self => ({
afterAttach() {
(0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => (0, autorunFeatureDensityStats_1.default)(self)));
},
}))
.actions(self => ({
setCurrStatsBpPerPx(n) {
self.currStatsBpPerPx = n;
},
setFeatureDensityStatsLimit(stats) {
const view = (0, util_1.getContainingView)(self);
if (stats === null || stats === void 0 ? void 0 : stats.bytes) {
self.userByteSizeLimit = stats.bytes;
}
else {
self.userBpPerPxLimit = view.bpPerPx;
}
},
getFeatureDensityStats() {
if (!self.featureDensityStatsP) {
self.featureDensityStatsP = (0, util_2.getFeatureDensityStatsPre)(self).catch((e) => {
if ((0, mobx_state_tree_1.isAlive)(self)) {
this.setFeatureDensityStatsP(undefined);
}
throw e;
});
}
return self.featureDensityStatsP;
},
setFeatureDensityStatsP(arg) {
self.featureDensityStatsP = arg;
},
setFeatureDensityStats(featureDensityStats) {
self.featureDensityStats = featureDensityStats;
},
clearFeatureDensityStats() {
self.featureDensityStatsP = undefined;
self.featureDensityStats = undefined;
},
}))
.views(self => ({
get regionTooLarge() {
const view = (0, util_1.getContainingView)(self);
if (!self.featureDensityStatsReady ||
view.dynamicBlocks.totalBp < 20000) {
return false;
}
return (self.currentBytesRequested > self.maxAllowableBytes ||
(self.userBpPerPxLimit
? view.bpPerPx > self.userBpPerPxLimit
: self.currentFeatureScreenDensity > self.maxFeatureScreenDensity));
},
get regionTooLargeReason() {
const req = self.currentBytesRequested;
const max = self.maxAllowableBytes;
return req && req > max
? `Requested too much data (${(0, util_2.getDisplayStr)(req)})`
: '';
},
}))
.views(self => ({
get statsReadyAndRegionNotTooLarge() {
return self.featureDensityStatsReady && !self.regionTooLarge;
},
regionCannotBeRenderedText(_region) {
return self.regionTooLarge ? 'Force load to see features' : '';
},
regionCannotBeRendered(_region) {
return self.regionTooLarge ? ((0, jsx_runtime_1.jsx)(TooLargeMessage_1.default, { model: self })) : null;
},
}));
}