import * as React from 'react';
import { observer } from 'mobx-react';
import { action, computed, observable, makeObservable } from 'mobx';
import autobind from 'autobind-decorator';
import GroupComparisonStore from './GroupComparisonStore';
import _ from 'lodash';
import {
MUTATIONS_NOT_ENOUGH_GROUPS_MSG,
MUTATIONS_TOO_MANY_GROUPS_MSG,
} from './GroupComparisonUtils';
import { MakeMobxView } from 'shared/components/MobxView';
import LoadingIndicator from 'shared/components/loadingIndicator/LoadingIndicator';
import ErrorMessage from 'shared/components/ErrorMessage';
import { LollipopGeneSelector } from './LollipopGeneSelector';
import GroupComparisonMutationsTabPlot from './GroupComparisonMutationsTabPlot';
import OverlapExclusionIndicator from './OverlapExclusionIndicator';
import { MSKTab, MSKTabs } from 'shared/components/MSKTabs/MSKTabs';
import GroupComparisonURLWrapper from './GroupComparisonURLWrapper';
import { AxisScale } from 'react-mutation-mapper';
import {
ANNOTATED_PROTEIN_IMPACT_FILTER_TYPE,
createAnnotatedProteinImpactTypeFilter,
} from 'shared/lib/MutationUtils';
import { AnnotatedMutation } from 'shared/model/AnnotatedMutation';
interface IGroupComparisonMutationsTabProps {
store: GroupComparisonStore;
urlWrapper: GroupComparisonURLWrapper;
}
@observer
export default class GroupComparisonMutationsTab extends React.Component<
IGroupComparisonMutationsTabProps,
{}
> {
constructor(props: IGroupComparisonMutationsTabProps) {
super(props);
makeObservable(this);
}
@action.bound
protected handleGeneChange(id: string) {
this.props.urlWrapper.updateURL({
selectedGene: id,
});
}
@computed get tabs() {
return this.props.store.genesSortedByMutationFrequency
.result!.slice(0, 10)
.map(g => );
}
@computed get activeTabId(): string | undefined {
let activeTabId;
if (this.props.store.userSelectedMutationMapperGene) {
activeTabId = this.props.store.userSelectedMutationMapperGene;
} else {
activeTabId = this.props.store.activeMutationMapperGene!
.hugoGeneSymbol;
}
return activeTabId;
}
@action.bound
private onScaleToggle(selectedScale: AxisScale) {
this.props.urlWrapper.updateURL({
axisMode: selectedScale,
});
}
@computed get isPutativeDriver() {
return this.props.store.driverAnnotationSettings.driversAnnotated
? (m: AnnotatedMutation) => m.putativeDriver
: undefined;
}
readonly tabUI = MakeMobxView({
await: () => [
this.props.store.genes,
this.props.store.genesWithMutations,
this.props.store.genesSortedByMutationFrequency,
],
render: () => {
// We only want 2 groups for our mirrored lollipop plot. Display message if not 2 groups
if (this.props.store.activeGroups.result!.length < 2) {
return (
{MUTATIONS_NOT_ENOUGH_GROUPS_MSG}
);
} else if (this.props.store.activeGroups.result!.length > 2) {
return (
{MUTATIONS_TOO_MANY_GROUPS_MSG}
);
}
return (
<>
{/* {!this.props.store.userSelectedMutationMapperGene ? (
Gene with highest frequency is displayed by
default. Gene can be changed in the dropdown
below.
The top 10 genes with highest frequency are
shown below the dropdown and can be selected by
clicking on their respective tabs.
) : (
The top 10 genes with highest frequency are shown
below the dropdown and can be selected by clicking
on their respective tabs.
)} */}
Highest Frequency:
this.handleGeneChange(id)
}
className="pillTabs comparisonMutationMapperTabs"
tabButtonStyle="pills"
defaultTabId={false}
>
{this.tabs}
({
group: group,
filter: {
type: 'GroupComparisonFilter',
values: [group],
},
})),
filterAppliersOverride: {
GroupComparisonFilter: this.props.store
.shouldApplySampleIdFilter,
[ANNOTATED_PROTEIN_IMPACT_FILTER_TYPE]: createAnnotatedProteinImpactTypeFilter(
this.isPutativeDriver
),
},
}}
/>
>
);
},
renderPending: () => (
),
renderError: () => ,
});
public render() {
return this.tabUI.component;
}
}