diff --git a/client/src/components/geneExpression/gene.js b/client/src/components/geneExpression/gene.js new file mode 100644 index 00000000..6899d4a9 --- /dev/null +++ b/client/src/components/geneExpression/gene.js @@ -0,0 +1,31 @@ +// jshint esversion: 6 +/* rc slider https://www.npmjs.com/package/rc-slider */ + +import React from "react"; +import _ from "lodash"; +import { connect } from "react-redux"; +import HistogramBrush from "../brushableHistogram"; +import { Button, ButtonGroup, Tooltip } from "@blueprintjs/core"; +import * as globals from "../../globals"; +import actions from "../../actions"; + +@connect(state => { + return {}; +}) +class Gene extends React.Component { + constructor(props) { + super(props); + this.state = {}; + } + + render() { + const { gene } = this.props; + return ( +
+

{gene}

+
+ ); + } +} + +export default Gene; diff --git a/client/src/components/geneExpression/geneSet.js b/client/src/components/geneExpression/geneSet.js index 357cdd92..d49c45d0 100644 --- a/client/src/components/geneExpression/geneSet.js +++ b/client/src/components/geneExpression/geneSet.js @@ -7,24 +7,108 @@ import { connect } from "react-redux"; import HistogramBrush from "../brushableHistogram"; import * as globals from "../../globals"; import actions from "../../actions"; +import Gene from "./gene"; +import { Button, ButtonGroup, Tooltip } from "@blueprintjs/core"; +import { + postUserErrorToast, + keepAroundErrorToast +} from "../framework/toasters"; +import { memoize } from "../../util/dataframe/util"; @connect(state => { - return {}; + return { + world: state.world, + userDefinedGenes: state.controls.userDefinedGenes, + userDefinedGenesLoading: state.controls.userDefinedGenesLoading + }; }) class GeneSet extends React.Component { constructor(props) { super(props); - this.state = {}; + this.state = { + isOpen: false, + haveFetched: 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; + }; + + _memoGenesToUpper = memoize(this._genesToUpper, arr => arr); + + fetchGenes = () => { + const { world, dispatch, userDefinedGenes, setGenes } = this.props; + const varIndexName = world.schema.annotations.var.index; + const { haveFetched } = this.state; + + const worldGenes = world.varAnnotations.col(varIndexName).asArray(); + + const upperGenes = this._genesToUpper(setGenes); + const upperUserDefinedGenes = this._genesToUpper(userDefinedGenes); + const upperWorldGenes = this._memoGenesToUpper(worldGenes); + + dispatch({ type: "bulk user defined gene start" }); + + Promise.all( + [...upperGenes.keys()].map(upperGene => { + /* Unlike bulk add... with gene sets this test needs to be within the set... */ + // if (upperUserDefinedGenes.get(upperGene) !== undefined) { + // return keepAroundErrorToast(`${upperGene} already exists`); + // } + + const indexOfGene = upperWorldGenes.get(upperGene); + + if (indexOfGene === undefined) { + console.log("found a gene that doesn't appear to be a valid name"); + // return; + // keepAroundErrorToast( + // `${ + // genes[upperGenes.get(upperGene)] + // } doesn't appear to be a valid gene name.` + // ); + } + return dispatch( + actions.requestUserDefinedGene(worldGenes[indexOfGene]) + ); + }) + ).then( + () => dispatch({ type: "bulk user defined gene complete" }), + () => dispatch({ type: "bulk user defined gene error" }) + ); + + this.setState({ haveFetched: true }); + return undefined; + }; + render() { const { setName, setGenes } = this.props; + const { haveFetched, isOpen } = this.state; + // console.log("geneSet setGenes variable: ", setGenes); return (
- {setName} - {_.map(setGenes, gene => { - return

{gene}

; - })} + + {isOpen + ? _.map(setGenes, gene => { + return ; + }) + : null}
); } diff --git a/client/src/components/geneExpression/index.js b/client/src/components/geneExpression/index.js index a25c1ad6..dd6005bf 100644 --- a/client/src/components/geneExpression/index.js +++ b/client/src/components/geneExpression/index.js @@ -101,6 +101,7 @@ class GeneExpression extends React.Component { */ if (bulkAdd !== "") { const genes = _.pull(_.uniq(bulkAdd.split(/[ ,]+/)), ""); + console.log("geneExpression genes", genes); if (genes.length === 0) { return keepAroundErrorToast("Must enter a gene name."); }