import React from "react"; import _ from "lodash"; import { connect } from "react-redux"; import { Tooltip, Position, Switch } from "@blueprintjs/core"; 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"; @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, toggleSummaryHisto: 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, // }); }; toggleSummaryHisto = () => { const { toggleSummaryHisto } = this.state; this.setState({ toggleSummaryHisto: !toggleSummaryHisto }); }; render() { const { setName, setGenes, isDiffexp } = this.props; const { isOpen, toggleSummaryHisto } = this.state; const genesetNameLengthVisible = 120; /* this magic number determines how much of a long geneset name we see */ return (