@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
105 lines (104 loc) • 4.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.stateModelFactory = stateModelFactory;
const mobx_1 = require("mobx");
const mobx_state_tree_1 = require("mobx-state-tree");
const configuration_1 = require("../configuration");
const util_1 = require("../util");
const model_1 = require("./SequenceFeatureDetails/model");
const util_2 = require("./util");
const mst_1 = require("../util/types/mst");
function formatSubfeatures(obj, depth, parse, currentDepth = 0, returnObj = {}) {
var _a;
if (depth <= currentDepth) {
return;
}
(_a = obj.subfeatures) === null || _a === void 0 ? void 0 : _a.map(sub => {
formatSubfeatures(sub, depth, parse, currentDepth + 1, returnObj);
parse(sub);
});
}
function stateModelFactory(pluginManager) {
return mobx_state_tree_1.types
.model('BaseFeatureWidget', {
id: mst_1.ElementId,
type: mobx_state_tree_1.types.literal('BaseFeatureWidget'),
featureData: mobx_state_tree_1.types.frozen(),
formattedFields: mobx_state_tree_1.types.frozen(),
unformattedFeatureData: mobx_state_tree_1.types.frozen(),
view: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
track: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('track', 'stateModel')),
trackId: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
trackType: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
maxDepth: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
sequenceFeatureDetails: mobx_state_tree_1.types.optional((0, model_1.SequenceFeatureDetailsF)(), {}),
})
.volatile(() => ({
error: undefined,
}))
.actions(self => ({
setFeatureData(featureData) {
self.unformattedFeatureData = featureData;
},
clearFeatureData() {
self.featureData = undefined;
},
setFormattedData(feat) {
self.featureData = feat;
},
setExtra(type, trackId, maxDepth) {
self.trackId = trackId;
self.trackType = type;
self.maxDepth = maxDepth;
},
setError(e) {
self.error = e;
},
}))
.actions(self => ({
afterCreate() {
(0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
try {
const { unformattedFeatureData, track } = self;
const session = (0, util_1.getSession)(self);
if (track) {
self.setExtra(track.type, track.configuration.trackId, (0, configuration_1.getConf)(track, ['formatDetails', 'maxDepth']));
}
if (unformattedFeatureData) {
const feature = structuredClone(unformattedFeatureData);
const combine = (arg2, feature) => ({
...(0, configuration_1.getConf)(session, ['formatDetails', arg2], { feature }),
...(0, configuration_1.getConf)(track, ['formatDetails', arg2], { feature }),
});
if (track) {
feature.__jbrowsefmt = combine('feature', feature);
formatSubfeatures(feature, (0, configuration_1.getConf)(track, ['formatDetails', 'depth']), sub => {
sub.__jbrowsefmt = combine('subfeatures', sub);
});
}
self.setFormattedData(feature);
}
}
catch (e) {
console.error(e);
self.setError(e);
}
}));
},
}))
.preProcessSnapshot(snap => {
const { featureData, finalizedFeatureData, ...rest } = snap;
return {
unformattedFeatureData: featureData,
featureData: finalizedFeatureData,
...rest,
};
})
.postProcessSnapshot(snap => {
const { unformattedFeatureData, featureData, ...rest } = snap;
return {
finalizedFeatureData: (0, util_2.replaceUndefinedWithNull)(featureData),
...rest,
};
});
}