mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-10-10 05:30:56 +08:00
prepopulate geneset with genes from modal
This commit is contained in:
@@ -18,6 +18,8 @@ class AnnoDialog extends React.PureComponent {
|
|||||||
validationError,
|
validationError,
|
||||||
annoSelect,
|
annoSelect,
|
||||||
annoInput,
|
annoInput,
|
||||||
|
secondaryInstructions,
|
||||||
|
secondaryInput,
|
||||||
handleCancel,
|
handleCancel,
|
||||||
handleSubmit,
|
handleSubmit,
|
||||||
primaryButtonText,
|
primaryButtonText,
|
||||||
@@ -46,6 +48,10 @@ class AnnoDialog extends React.PureComponent {
|
|||||||
>
|
>
|
||||||
{errorMessage}
|
{errorMessage}
|
||||||
</p>
|
</p>
|
||||||
|
<p style={{ marginTop: secondaryInstructions ? 20 : 0 }}>
|
||||||
|
{secondaryInstructions || null}
|
||||||
|
</p>
|
||||||
|
{secondaryInput || null}
|
||||||
</div>
|
</div>
|
||||||
{annoSelect || null}
|
{annoSelect || null}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ class Gene extends React.Component {
|
|||||||
isColorAccessor,
|
isColorAccessor,
|
||||||
isScatterplotXXaccessor,
|
isScatterplotXXaccessor,
|
||||||
isScatterplotYYaccessor,
|
isScatterplotYYaccessor,
|
||||||
|
isDiffexp,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const { geneIsExpanded } = this.state;
|
const { geneIsExpanded } = this.state;
|
||||||
return (
|
return (
|
||||||
@@ -127,15 +128,17 @@ class Gene extends React.Component {
|
|||||||
) : null}
|
) : null}
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span>
|
||||||
<AnchorButton
|
{!isDiffexp ? (
|
||||||
minimal
|
<AnchorButton
|
||||||
small
|
minimal
|
||||||
data-testid={`delete-from-geneset-${gene}`}
|
small
|
||||||
onClick={this.handleDeleteGeneFromSet}
|
data-testid={`delete-from-geneset-${gene}`}
|
||||||
intent="danger"
|
onClick={this.handleDeleteGeneFromSet}
|
||||||
style={{ fontWeight: 700, marginRight: 2 }}
|
intent="danger"
|
||||||
icon={<Icon icon="trash" iconSize={10} />}
|
style={{ fontWeight: 700, marginRight: 2 }}
|
||||||
/>
|
icon={<Icon icon="trash" iconSize={10} />}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
<AnchorButton
|
<AnchorButton
|
||||||
minimal
|
minimal
|
||||||
small
|
small
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class GeneSet extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { setName, setGenes } = this.props;
|
const { setName, setGenes, isDiffexp } = this.props;
|
||||||
const { isOpen, toggleSummaryHisto } = this.state;
|
const { isOpen, toggleSummaryHisto } = this.state;
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBottom: 3 }}>
|
<div style={{ marginBottom: 3 }}>
|
||||||
@@ -181,7 +181,14 @@ class GeneSet extends React.Component {
|
|||||||
|
|
||||||
{isOpen && !toggleSummaryHisto
|
{isOpen && !toggleSummaryHisto
|
||||||
? _.map(setGenes, (gene) => {
|
? _.map(setGenes, (gene) => {
|
||||||
return <Gene key={gene} gene={gene} geneset={setName} />;
|
return (
|
||||||
|
<Gene
|
||||||
|
key={gene}
|
||||||
|
gene={gene}
|
||||||
|
geneset={setName}
|
||||||
|
isDiffexp={isDiffexp}
|
||||||
|
/>
|
||||||
|
);
|
||||||
})
|
})
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class GeneExpression extends React.Component {
|
|||||||
<GeneSet
|
<GeneSet
|
||||||
key="Temp DiffExp Set"
|
key="Temp DiffExp Set"
|
||||||
setGenes={setGenes}
|
setGenes={setGenes}
|
||||||
|
isDiffexp
|
||||||
setName="Temp DiffExp Set"
|
setName="Temp DiffExp Set"
|
||||||
/>
|
/>
|
||||||
) : null;
|
) : null;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
import _ from "lodash";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import AnnoDialog from "../../categorical/annoDialog";
|
import AnnoDialog from "../../categorical/annoDialog";
|
||||||
import LabelInput from "../../categorical/labelInput";
|
import LabelInput from "../../categorical/labelInput";
|
||||||
@@ -27,7 +28,7 @@ class AddGeneToGenesetDialogue extends React.PureComponent {
|
|||||||
dispatch({
|
dispatch({
|
||||||
type: "geneset: add genes",
|
type: "geneset: add genes",
|
||||||
name: geneset,
|
name: geneset,
|
||||||
genes: genesToAdd.split(","),
|
genes: _.pull(_.uniq(genesToAdd.split(/[ ,]+/)), ""),
|
||||||
});
|
});
|
||||||
dispatch({
|
dispatch({
|
||||||
type: "geneset: disable add new genes mode",
|
type: "geneset: disable add new genes mode",
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import _ from "lodash";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import AnnoDialog from "../../categorical/annoDialog";
|
import AnnoDialog from "../../categorical/annoDialog";
|
||||||
@@ -24,6 +25,7 @@ class CreateGenesetDialogue extends React.PureComponent {
|
|||||||
const { dispatch } = this.props;
|
const { dispatch } = this.props;
|
||||||
this.setState({
|
this.setState({
|
||||||
genesetName: "",
|
genesetName: "",
|
||||||
|
genesToPopulateGeneset: "",
|
||||||
});
|
});
|
||||||
dispatch({
|
dispatch({
|
||||||
type: "geneset: disable create geneset mode",
|
type: "geneset: disable create geneset mode",
|
||||||
@@ -33,9 +35,13 @@ class CreateGenesetDialogue extends React.PureComponent {
|
|||||||
|
|
||||||
createGeneset = (e) => {
|
createGeneset = (e) => {
|
||||||
const { dispatch } = this.props;
|
const { dispatch } = this.props;
|
||||||
const { genesetName } = this.state;
|
const { genesetName, genesToPopulateGeneset } = this.state;
|
||||||
|
|
||||||
dispatch({ type: "geneset: create", name: genesetName });
|
dispatch({
|
||||||
|
type: "geneset: create",
|
||||||
|
name: genesetName,
|
||||||
|
genes: _.pull(_.uniq(genesToPopulateGeneset.split(/[ ,]+/)), "") || null,
|
||||||
|
});
|
||||||
dispatch({
|
dispatch({
|
||||||
type: "geneset: disable create geneset mode",
|
type: "geneset: disable create geneset mode",
|
||||||
});
|
});
|
||||||
@@ -51,6 +57,10 @@ class CreateGenesetDialogue extends React.PureComponent {
|
|||||||
this.setState({ genesetName: e });
|
this.setState({ genesetName: e });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
handleGenesetInputChange = (e) => {
|
||||||
|
this.setState({ genesToPopulateGeneset: e });
|
||||||
|
};
|
||||||
|
|
||||||
instruction = () => {
|
instruction = () => {
|
||||||
return "New, unique geneset";
|
return "New, unique geneset";
|
||||||
/* todo genesets */
|
/* todo genesets */
|
||||||
@@ -80,7 +90,7 @@ class CreateGenesetDialogue extends React.PureComponent {
|
|||||||
<LabelInput
|
<LabelInput
|
||||||
onChange={this.handleChange}
|
onChange={this.handleChange}
|
||||||
inputProps={{
|
inputProps={{
|
||||||
"data-testid": "add-genes",
|
"data-testid": "create-geneset-modal",
|
||||||
leftIcon: "manually-entered-data",
|
leftIcon: "manually-entered-data",
|
||||||
intent: "none",
|
intent: "none",
|
||||||
autoFocus: true,
|
autoFocus: true,
|
||||||
@@ -88,6 +98,18 @@ class CreateGenesetDialogue extends React.PureComponent {
|
|||||||
newLabelMessage="New geneset"
|
newLabelMessage="New geneset"
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
secondaryInstructions="Optionally add a list of comma separated genes to populate the geneset"
|
||||||
|
secondaryInput={
|
||||||
|
<LabelInput
|
||||||
|
onChange={this.handleGenesetInputChange}
|
||||||
|
inputProps={{
|
||||||
|
"data-testid": "add-genes",
|
||||||
|
intent: "none",
|
||||||
|
autoFocus: false,
|
||||||
|
}}
|
||||||
|
newLabelMessage="populate geneset with genes"
|
||||||
|
/>
|
||||||
|
}
|
||||||
handleSubmit={this.createGeneset}
|
handleSubmit={this.createGeneset}
|
||||||
handleCancel={this.disableCreateGenesetMode}
|
handleCancel={this.disableCreateGenesetMode}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user