From ed66ae6e4a1371ce9aaed59fccaa12dc832d89ee Mon Sep 17 00:00:00 2001
From: Colin Megill
Date: Fri, 26 Oct 2018 19:21:39 -0400
Subject: [PATCH] tooltips, copy, scatterplot tray (#383)
* tooltips, copy, scatterplot tray
* reset interface
* copy
---
client/src/actions/index.js | 29 +++--
.../components/brushableHistogram/index.js | 16 +--
client/src/components/categorical/category.js | 16 +--
.../geneExpression/cellSetButtons.js | 15 ++-
.../geneExpression/expressionButtons.js | 46 ++++---
client/src/components/geneExpression/index.js | 18 +--
client/src/components/graph/graph.js | 118 ++++++++++--------
.../src/components/scatterplot/scatterplot.js | 9 +-
client/src/globals.js | 2 +-
client/src/reducers/controls.js | 15 +++
10 files changed, 178 insertions(+), 106 deletions(-)
diff --git a/client/src/actions/index.js b/client/src/actions/index.js
index 30725123..f82b7e6e 100644
--- a/client/src/actions/index.js
+++ b/client/src/actions/index.js
@@ -115,12 +115,6 @@ const regraph = () => (dispatch, getState) => {
});
};
-const resetGraph = () => (dispatch, getState) =>
- dispatch({
- type: "reset World to eq Universe",
- universe: getState().controls.universe
- });
-
/*
Fetch expression vectors for each gene in genes. This is NOT an action
function, but rather a helper to be called from an action helper that
@@ -302,9 +296,30 @@ const requestDifferentialExpression = (set1, set2, num_genes = 10) => async (
}
};
+const resetInterface = () => (dispatch, getState) => {
+ const { universe } = getState().controls;
+
+ dispatch({
+ type: "clear all user defined genes"
+ });
+ dispatch({
+ type: "clear differential expression"
+ });
+ dispatch({
+ type: "reset colorscale"
+ });
+ dispatch({
+ type: "clear scatterplot"
+ });
+ dispatch({
+ type: "reset World to eq Universe",
+ universe
+ });
+};
+
export default {
regraph,
- resetGraph,
+ resetInterface,
requestSingleGeneExpressionCountsForColoringPOST,
requestGeneExpressionCountsPOST,
requestDifferentialExpression,
diff --git a/client/src/components/brushableHistogram/index.js b/client/src/components/brushableHistogram/index.js
index 9aed42af..25672e6b 100644
--- a/client/src/components/brushableHistogram/index.js
+++ b/client/src/components/brushableHistogram/index.js
@@ -6,7 +6,7 @@ https://bl.ocks.org/SpaceActuary/2f004899ea1b2bd78d6f1dbb2febf771
// jshint esversion: 6
import React from "react";
import _ from "lodash";
-import { Button, ButtonGroup } from "@blueprintjs/core";
+import { Button, ButtonGroup, Tooltip } from "@blueprintjs/core";
import { connect } from "react-redux";
import * as d3 from "d3";
import memoize from "memoize-one";
@@ -283,12 +283,14 @@ class HistogramBrush extends React.Component {
remove
) : null}
-
+
+
+
-
+
+
{world && userDefinedGenes.length > 0
? _.map(userDefinedGenes, (geneName, index) => {
diff --git a/client/src/components/graph/graph.js b/client/src/components/graph/graph.js
index 1593bddf..2dd0d034 100644
--- a/client/src/components/graph/graph.js
+++ b/client/src/components/graph/graph.js
@@ -5,7 +5,7 @@ import * as d3 from "d3";
import { connect } from "react-redux";
import mat4 from "gl-mat4";
import _regl from "regl";
-import { Button } from "@blueprintjs/core";
+import { Button, AnchorButton, Tooltip } from "@blueprintjs/core";
import { worldEqUniverse } from "../../util/stateManager/world";
import setupSVGandBrushElements from "./setupSVGandBrush";
@@ -327,8 +327,13 @@ class Graph extends React.Component {
});
}
+ resetInterface() {
+ const { dispatch } = this.props;
+ dispatch(actions.resetInterface());
+ }
+
render() {
- const { dispatch, responsive, world, universe, crossfilter } = this.props;
+ const { dispatch, responsive, crossfilter } = this.props;
const { mode } = this.state;
return (
@@ -347,56 +352,69 @@ class Graph extends React.Component {
alignItems: "baseline"
}}
>
-
-
+
+ reset
+
+
-
@@ -408,9 +426,7 @@ class Graph extends React.Component {
zIndex: -9999,
position: "fixed",
right: this.graphPaddingRight,
- bottom: this.graphPaddingBottom,
- borderLeft: "2px solid rgb(233,233,233)",
- borderBottom: "2px solid rgb(233,233,233)"
+ bottom: this.graphPaddingBottom
}}
>
diff --git a/client/src/globals.js b/client/src/globals.js
index 189f7880..7f19c851 100644
--- a/client/src/globals.js
+++ b/client/src/globals.js
@@ -78,7 +78,7 @@ export const maxControlsWidth = 800;
export const graphMargin = { top: 20, right: 10, bottom: 30, left: 40 };
export const graphWidth = 700;
export const graphHeight = 700;
-export const scatterplotPaddingLeft = 14;
+export const scatterplotMarginLeft = 25;
export const leftSidebarWidth = 365;
export const leftSidebarSectionHeading = {
diff --git a/client/src/reducers/controls.js b/client/src/reducers/controls.js
index 0d60fe8d..e7b36df0 100644
--- a/client/src/reducers/controls.js
+++ b/client/src/reducers/controls.js
@@ -330,6 +330,21 @@ const Controls = (
userDefinedGenes: newUserDefinedGenes
};
}
+ case "clear all user defined genes": {
+ const { userDefinedGenes, dimensionMap } = state;
+
+ _.forEach(userDefinedGenes, gene => {
+ const dimension = dimensionMap[userDefinedDimensionName(gene)];
+ dimension.dispose();
+ delete dimensionMap[userDefinedDimensionName(gene)];
+ });
+
+ return {
+ ...state,
+ dimensionMap,
+ userDefinedGenes: []
+ };
+ }
case "reset colorscale": {
const { world } = state;
const colorName = new Array(world.nObs).fill(globals.defaultCellColor);