import * as React from 'react'; import { observer } from 'mobx-react'; import { computed, makeObservable } from 'mobx'; import { MobxCache, Mutation, PTM_SOURCE_URL, PtmSource, } from 'cbioportal-utils'; import MutationMapperStore from '../../model/MutationMapperStore'; import { TrackName, TrackVisibility } from './TrackSelector'; import HotspotTrack from './HotspotTrack'; import OncoKbTrack from './OncoKbTrack'; import ExonTrack from './ExonTrack'; import PtmTrack from './PtmTrack'; import './defaultTrackTooltipTable.scss'; import { PtmAnnotationTableColumnId } from '../ptm/PtmAnnotationTable'; import UniprotTopologyTrack from './UniprotTopologyTrack'; type TrackPanelProps = { store: MutationMapperStore; pubMedCache?: MobxCache; geneWidth: number; proteinLength?: number; geneXOffset?: number; maxHeight?: number; trackVisibility?: TrackVisibility; tracks?: TrackName[]; collapsePtmTrack?: boolean; collapseUniprotTopologyTrack?: boolean; }; @observer export default class TrackPanel extends React.Component { public static defaultProps: Partial = { tracks: [ TrackName.CancerHotspots, TrackName.OncoKB, TrackName.dbPTM, TrackName.Exon, TrackName.UniprotTopology, ], }; constructor(props: TrackPanelProps) { super(props); makeObservable(this); } @computed get proteinLength() { const proteinLength = this.props.proteinLength || 0; return Math.max(proteinLength, 1); } get availableTracks(): { [trackName: string]: JSX.Element | null } { return { [TrackName.CancerHotspots]: !this.props.trackVisibility || this.props.trackVisibility[TrackName.CancerHotspots] === 'visible' ? ( ) : null, [TrackName.OncoKB]: !this.props.trackVisibility || this.props.trackVisibility[TrackName.OncoKB] === 'visible' ? ( ) : null, [TrackName.dbPTM]: this.getPtmTrack( TrackName.dbPTM, PtmSource.dbPTM ), [TrackName.UniprotPTM]: this.getPtmTrack( TrackName.UniprotPTM, PtmSource.Uniprot ), [TrackName.Exon]: !this.props.trackVisibility || this.props.trackVisibility[TrackName.Exon] === 'visible' ? ( ) : null, [TrackName.UniprotTopology]: !this.props.trackVisibility || this.props.trackVisibility[TrackName.UniprotTopology] === 'visible' ? ( ) : null, }; } public render() { return (
{this.props .tracks!.map(t => this.availableTracks[t]) .filter(e => e !== undefined && e !== null)}
); } private getPtmTrack(trackName: TrackName, ptmSource: PtmSource) { return !this.props.trackVisibility || this.props.trackVisibility[trackName] === 'visible' ? ( ) : null; } private getPtmTooltipColumnOverrides(ptmSource: PtmSource) { if (ptmSource === PtmSource.dbPTM) { // hide description column for dbPTM, we don't have description data. return { [PtmAnnotationTableColumnId.DESCRIPTION]: { show: false, }, }; } else { return undefined; } } }