@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
90 lines (89 loc) • 3.39 kB
JavaScript
import { addDisposer, destroy, types } from '@jbrowse/mobx-state-tree';
import { autorun } from 'mobx';
import { localStorageGetBoolean, localStorageGetItem, localStorageGetNumber, localStorageSetItem, } from "../../util/index.js";
function localStorageSetNumber(key, value) {
localStorageSetItem(key, JSON.stringify(value));
}
function localStorageSetBoolean(key, value) {
localStorageSetItem(key, JSON.stringify(value));
}
const p = 'sequenceFeatureDetails';
export function SequenceFeatureDetailsF() {
return types
.model('SequenceFeatureDetails')
.volatile(() => ({
showCoordinatesSetting: localStorageGetItem(`${p}-showCoordinatesSetting`) || 'none',
intronBp: localStorageGetNumber(`${p}-intronBp`, 10),
upDownBp: localStorageGetNumber(`${p}-upDownBp`, 100),
upperCaseCDS: localStorageGetBoolean(`${p}-upperCaseCDS`, true),
charactersPerRow: 100,
feature: undefined,
mode: '',
}))
.actions(self => ({
setFeature(f) {
self.feature = f;
},
setUpDownBp(f) {
self.upDownBp = f;
},
setIntronBp(f) {
self.intronBp = f;
},
setUpperCaseCDS(f) {
self.upperCaseCDS = f;
},
setShowCoordinates(f) {
self.showCoordinatesSetting = f;
},
setMode(mode) {
self.mode = mode;
},
}))
.views(self => ({
get showCoordinates() {
return self.showCoordinatesSetting !== 'none';
},
get showGenomicCoordsOption() {
return (self.mode === 'gene' ||
self.mode === 'gene_updownstream' ||
self.mode === 'genomic' ||
self.mode === 'genomic_sequence_updownstream');
},
get hasCDS() {
const featureType = self.feature?.type?.toLowerCase();
if (featureType === 'mature_protein_region_of_cds') {
return true;
}
return self.feature?.subfeatures?.some(sub => {
const type = sub.type?.toLowerCase();
return type === 'cds' || type === 'mature_protein_region_of_cds';
});
},
get hasExon() {
return self.feature?.subfeatures?.some(sub => sub.type === 'exon');
},
get hasExonOrCDS() {
return this.hasExon || this.hasCDS;
},
}))
.actions(self => ({
afterCreate() {
addDisposer(self, autorun(function sequenceFeatureLocalStorageAutorun() {
localStorageSetNumber(`${p}-upDownBp`, self.upDownBp);
localStorageSetNumber(`${p}-intronBp`, self.intronBp);
localStorageSetBoolean(`${p}-upperCaseCDS`, self.upperCaseCDS);
localStorageSetItem(`${p}-showCoordinatesSetting`, self.showCoordinatesSetting);
}, { name: 'SequenceFeatureLocalStorage' }));
addDisposer(self, autorun(function sequenceFeatureModeAutorun() {
self.setMode(self.hasCDS ? 'cds' : self.hasExon ? 'cdna' : 'genomic');
}, { name: 'SequenceFeatureMode' }));
},
}));
}
export function createSequenceFeatureDetailsModel() {
return SequenceFeatureDetailsF().create({});
}
export function destroySequenceFeatureDetailsModel(model) {
destroy(model);
}