import * as React from 'react'; import { observer } from 'mobx-react'; import { VictoryLabel, VictoryLegend } from 'victory'; import { CBIOPORTAL_VICTORY_THEME } from 'cbioportal-frontend-commons'; import { action, computed, makeObservable, observable } from 'mobx'; import { ComparisonGroup } from './GroupComparisonUtils'; import RectangleVennDiagram from './rectangleVennDiagram/RectangleVennDiagram'; import CreateGroupFromOverlap from './CreateGroupFromOverlap'; import autobind from 'autobind-decorator'; import { GroupLegendLabelComponent } from './labelComponents/GroupLegendLabelComponent'; import ComparisonStore from '../../shared/lib/comparison/ComparisonStore'; import GroupComparisonStore from './GroupComparisonStore'; import { SessionGroupData } from 'shared/api/session-service/sessionServiceModels'; export interface IVennProps { svgId?: string; sampleGroups: { uid: string; cases: string[]; }[]; patientGroups: { uid: string; cases: string[]; }[]; uidToGroup: { [uid: string]: ComparisonGroup }; store: ComparisonStore; onLayoutFailure: () => void; } const VENN_PLOT_WIDTH = 400; const PADDING_BTWN_SAMPLE_AND_PATIENT = 10; const VENN_PLOT_HEIGHT = 400; const PADDING_BTWN_VENN_AND_LEGEND = 20; const LEGEND_WIDTH = 180; @observer export default class Venn extends React.Component { constructor(props: IVennProps) { super(props); makeObservable(this); } @observable.shallow sampleSelection = { regions: [] as number[][], }; @observable.shallow patientSelection = { regions: [] as number[][], }; @computed get chartWidth() { return ( this.vennPlotAreaWidth + PADDING_BTWN_VENN_AND_LEGEND + LEGEND_WIDTH ); } @computed get chartHeight() { return 500; } @action.bound private submitSampleOverlapGroup( group: SessionGroupData, saveToUser: boolean ) { this.props.store.addGroup(group, saveToUser); this.sampleSelection.regions = []; } @action.bound private submitPatientOverlapGroup( group: SessionGroupData, saveToUser: boolean ) { this.props.store.addGroup(group, saveToUser); this.patientSelection.regions = []; } @action.bound private changeSelectedSampleRegions(regions: number[][]) { this.sampleSelection.regions = regions; } @action.bound private changeSelectedPatientRegions(regions: number[][]) { this.patientSelection.regions = regions; } @computed get sampleGroupUids() { return this.props.sampleGroups.map(g => g.uid); } @computed get patientGroupUids() { return this.props.patientGroups.map(g => g.uid); } @computed get legendData() { return this.props.sampleGroups.map(sampleGroup => { return { name: sampleGroup.uid, symbol: { fill: this.props.uidToGroup[sampleGroup.uid].color, strokeOpacity: 0, type: 'square', size: 6, }, }; }); } @computed get vennPlotAreaWidth() { return 2 * VENN_PLOT_WIDTH + PADDING_BTWN_SAMPLE_AND_PATIENT; } @computed get sampleSelectedRegionsUids() { return this.sampleSelection.regions.map(comb => comb.map(index => { return this.props.sampleGroups[index].uid; }) ); } @computed get patientSelectedRegionsUids() { return this.patientSelection.regions.map(comb => comb.map(index => { return this.props.patientGroups[index].uid; }) ); } public render() { return (
{this.legendData.length > 0 && ( } standalone={false} data={this.legendData} /> )} {[ , , ]}
); } }