import React from "react"; import { connect } from "react-redux"; import { FaChevronRight, FaChevronDown } from "react-icons/fa"; import actions from "../../actions"; import Gene from "./gene"; import { memoize } from "../../util/dataframe/util"; import Truncate from "../util/truncate"; import * as globals from "../../globals"; import GenesetMenus from "./menus/genesetMenus"; import EditGenesetNameDialogue from "./menus/editGenesetNameDialogue"; import HistogramBrush from "../brushableHistogram"; @connect((state, ownProps) => { return { world: state.world, userDefinedGenes: state.controls.userDefinedGenes, userDefinedGenesLoading: state.controls.userDefinedGenesLoading, isColorAccessor: state.colors.colorAccessor === ownProps.setName, }; }) class GeneSet extends React.Component { _memoGenesToUpper = memoize(this._genesToUpper, (arr) => arr); constructor(props) { super(props); this.state = { isOpen: false, }; } _genesToUpper = (listGenes) => { // Has to be a Map to preserve index const upperGenes = new Map(); for (let i = 0, { length } = listGenes; i < length; i += 1) { upperGenes.set(listGenes[i].toUpperCase(), i); } return upperGenes; }; fetchGenes = () => { const { world, dispatch, setGenes } = this.props; const varIndexName = world.schema.annotations.var.index; const worldGenes = world.varAnnotations.col(varIndexName).asArray(); const upperGenes = this._genesToUpper(setGenes); const upperWorldGenes = this._memoGenesToUpper(worldGenes); dispatch({ type: "bulk user defined gene start" }); Promise.all( [...upperGenes.keys()].map((upperGene) => { const indexOfGene = upperWorldGenes.get(upperGene); return dispatch( actions.requestUserDefinedGene(worldGenes[indexOfGene]) ); }) ).then( () => dispatch({ type: "bulk user defined gene complete" }), () => dispatch({ type: "bulk user defined gene error" }) ); return undefined; }; onGenesetMenuClick = () => { const { isOpen } = this.state; this.setState({ isOpen: !isOpen }); }; onColorChangeClick = () => { // const { dispatch, setName } = this.props; // dispatch({ // type: "color by gene set", // colorAccessor: setName, // }); }; renderGenes() { const { setName, setGenes, setGenesWithDescriptions } = this.props; return setGenes.map((gene) => { const { geneDescription } = setGenesWithDescriptions.get(gene); return ( ); }); } render() { const { setName, setGenes, genesetDescription } = this.props; const { isOpen } = this.state; const genesetNameLengthVisible = 150; /* this magic number determines how much of a long geneset name we see */ const genesetIsEmpty = setGenes.length === 0; return (
{} } style={{ cursor: "pointer", userSelect: "none", }} onClick={this.onGenesetMenuClick} > {setName} {isOpen ? ( ) : ( )}
{isOpen && genesetIsEmpty && (

No genes to display

)}
{isOpen && !genesetIsEmpty && setGenes.length > 0 && ( )} {isOpen && !genesetIsEmpty && this.renderGenes()}
); } } export default GeneSet;