@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
159 lines (158 loc) • 6.7 kB
JavaScript
import { ConfigurationReference, getConf } from '@jbrowse/core/configuration';
import { types } from '@jbrowse/mobx-state-tree';
import { modelFactory as LinearFeatureDisplayModelFactory } from "../LinearFeatureDisplay/index.js";
function findSubMenu(items, label) {
return items.find((item) => 'label' in item && item.label === label);
}
function stateModelFactory(configSchema) {
return types
.compose('LinearBasicDisplay', LinearFeatureDisplayModelFactory(configSchema), types.model({
type: types.literal('LinearBasicDisplay'),
trackGeneGlyphMode: types.maybe(types.string),
trackSubfeatureLabels: types.maybe(types.string),
trackDisplayDirectionalChevrons: types.maybe(types.boolean),
configuration: ConfigurationReference(configSchema),
}))
.views(self => ({
get geneGlyphMode() {
return (self.trackGeneGlyphMode ??
getConf(self, ['renderer', 'geneGlyphMode']));
},
get subfeatureLabels() {
return (self.trackSubfeatureLabels ??
getConf(self, ['renderer', 'subfeatureLabels']));
},
get displayDirectionalChevrons() {
return (self.trackDisplayDirectionalChevrons ??
getConf(self, ['renderer', 'displayDirectionalChevrons']));
},
}))
.views(self => ({
get rendererConfig() {
const configBlob = getConf(self, ['renderer']) || {};
const config = configBlob;
return {
...config,
showLabels: self.trackShowLabels ?? config.showLabels,
showDescriptions: self.trackShowDescriptions ?? config.showDescriptions,
subfeatureLabels: self.trackSubfeatureLabels ?? config.subfeatureLabels,
displayMode: self.trackDisplayMode ?? config.displayMode,
maxHeight: self.trackMaxHeight ?? config.maxHeight,
geneGlyphMode: self.trackGeneGlyphMode ?? config.geneGlyphMode,
displayDirectionalChevrons: self.trackDisplayDirectionalChevrons ??
config.displayDirectionalChevrons,
};
},
}))
.actions(self => ({
setGeneGlyphMode(val) {
self.trackGeneGlyphMode = val;
},
setSubfeatureLabels(val) {
self.trackSubfeatureLabels = val;
},
toggleDisplayDirectionalChevrons() {
self.trackDisplayDirectionalChevrons = !self.displayDirectionalChevrons;
},
}))
.views(self => {
const { filterMenuItems: superFilterMenuItems } = self;
return {
filterMenuItems() {
const filters = self.activeFilters();
return [
{
label: 'Show only genes',
type: 'checkbox',
checked: filters.includes("jexl:get(feature,'type')=='gene'"),
onClick: () => {
const geneFilter = "jexl:get(feature,'type')=='gene'";
if (filters.includes(geneFilter)) {
self.setJexlFilters(filters.filter(f => f !== geneFilter));
}
else {
self.setJexlFilters([...filters, geneFilter]);
}
},
},
...superFilterMenuItems(),
];
},
};
})
.views(self => {
const { trackMenuItems: superTrackMenuItems } = self;
return {
trackMenuItems() {
const items = superTrackMenuItems();
const showMenu = findSubMenu(items, 'Show...');
if (showMenu) {
showMenu.subMenu = [
...showMenu.subMenu,
{
label: 'Show chevrons',
type: 'checkbox',
checked: self.displayDirectionalChevrons,
onClick: () => {
self.toggleDisplayDirectionalChevrons();
},
},
{
label: 'Subfeature labels',
subMenu: ['none', 'below', 'overlay'].map(val => ({
label: val,
type: 'radio',
checked: self.subfeatureLabels === val,
onClick: () => {
self.setSubfeatureLabels(val);
},
})),
},
{
label: 'Gene glyph',
subMenu: [
{
value: 'all',
label: 'All transcripts',
},
{
value: 'longest',
label: 'Longest transcript',
},
{
value: 'longestCoding',
label: 'Longest coding transcript',
},
].map(({ value, label }) => ({
label,
type: 'radio',
checked: self.geneGlyphMode === value,
onClick: () => {
self.setGeneGlyphMode(value);
},
})),
},
];
}
return items;
},
};
})
.postProcessSnapshot(snap => {
if (!snap) {
return snap;
}
const { trackGeneGlyphMode, trackSubfeatureLabels, trackDisplayDirectionalChevrons, ...rest } = snap;
return {
...rest,
...(trackGeneGlyphMode !== undefined ? { trackGeneGlyphMode } : {}),
...(trackSubfeatureLabels !== undefined
? { trackSubfeatureLabels }
: {}),
...(trackDisplayDirectionalChevrons !== undefined
? { trackDisplayDirectionalChevrons }
: {}),
};
});
}
export default stateModelFactory;