UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

105 lines (104 loc) 4.41 kB
"use strict"; 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, }; }); }