import pull from "lodash.pull"; import uniq from "lodash.uniq"; import React from "react"; import { connect } from "react-redux"; import { Button, Dialog, Classes, Colors } from "@blueprintjs/core"; import { Tooltip2 } from "@blueprintjs/popover2"; import LabelInput from "../../labelInput"; import actions from "../../../actions"; @connect((state) => ({ annotations: state.annotations, schema: state.annoMatrix?.schema, obsCrossfilter: state.obsCrossfilter, genesets: state.genesets.genesets, genesetsUI: state.genesetsUI, })) class CreateGenesetDialogue extends React.PureComponent { constructor(props) { super(props); this.state = { genesetName: "", genesToPopulateGeneset: "", genesetDescription: "", }; } disableCreateGenesetMode = (e) => { const { dispatch } = this.props; this.setState({ genesetName: "", genesToPopulateGeneset: "", genesetDescription: "", nameErrorMessage: "", }); dispatch({ type: "geneset: disable create geneset mode", }); if (e) e.preventDefault(); }; createGeneset = (e) => { const { dispatch } = this.props; const { genesetName, genesToPopulateGeneset, genesetDescription } = this.state; dispatch({ type: "geneset: create", genesetName: genesetName.trim(), genesetDescription, }); if (genesToPopulateGeneset) { const genesTmpHardcodedFormat = []; const genesArrayFromString = pull( uniq(genesToPopulateGeneset.split(/[ ,]+/)), "" ); genesArrayFromString.forEach((_gene) => { genesTmpHardcodedFormat.push({ geneSymbol: _gene, }); }); dispatch(actions.genesetAddGenes(genesetName, genesTmpHardcodedFormat)); } dispatch({ type: "geneset: disable create geneset mode", }); this.setState({ genesetName: "", genesToPopulateGeneset: "", }); e.preventDefault(); }; genesetNameError = () => false; handleChange = (e) => { const { genesets } = this.props; this.setState({ genesetName: e }); this.validate(e, genesets); }; handleGenesetInputChange = (e) => { this.setState({ genesToPopulateGeneset: e }); }; handleDescriptionInputChange = (e) => { this.setState({ genesetDescription: e }); }; instruction = (genesetName, genesets) => genesets.has(genesetName) ? "Gene set name must be unique." : "New, unique gene set name"; validate = (genesetName, genesets) => { if (genesets.has(genesetName)) { this.setState({ nameErrorMessage: "There is already a gene set with that name", }); return false; } if ( genesetName.length > 1 && // eslint-disable-next-line no-control-regex -- unicode 0-31 127-65535 genesetName.match(/^[\u0000-\u001F\u007F-\uFFFF]|[ ]{2,}/g)?.length ) { this.setState({ nameErrorMessage: "Gene set names can only contain alphanumeric characters and the following special characters: ! ” # $ % ’ ( ) * + , - . / : ; < = > ? @ ] ^ _ ` | ~", }); return false; } this.setState({ nameErrorMessage: "", }); return true; }; render() { const { genesetName, nameErrorMessage } = this.state; const { genesetsUI, genesets } = this.props; return (
{ e.preventDefault(); }} >

{this.instruction(genesetName, genesets)}

{nameErrorMessage}

Optionally add a{" "} description for this gene set

Optionally add a list of comma separated{" "} genes to populate the gene set

); } } export default CreateGenesetDialogue;