toggleable

This commit is contained in:
Colin Megill
2020-09-29 11:17:40 -07:00
parent 77c44af0b1
commit 86d369e63e
4 changed files with 122 additions and 79 deletions
@@ -17,6 +17,7 @@ const Histogram = ({
margin, margin,
isColorBy, isColorBy,
selectionRange, selectionRange,
mini,
}) => { }) => {
const svgRef = useRef(null); const svgRef = useRef(null);
const [brush, setBrush] = useState(null); const [brush, setBrush] = useState(null);
@@ -28,6 +29,8 @@ const Histogram = ({
const { marginLeft, marginRight, marginBottom, marginTop } = margin; const { marginLeft, marginRight, marginBottom, marginTop } = margin;
const { x, y, bins, binStart, binEnd, binWidth } = histogram; const { x, y, bins, binStart, binEnd, binWidth } = histogram;
const svg = d3.select(svgRef.current); const svg = d3.select(svgRef.current);
const binPadding = mini ? 0 : -1;
const defaultBarColor = mini ? "black" : "#bbb";
/* Remove everything */ /* Remove everything */
svg.selectAll("*").remove(); svg.selectAll("*").remove();
@@ -62,11 +65,13 @@ const Histogram = ({
.append("rect") .append("rect")
.attr("x", (d, i) => x(binStart(i)) + 1) .attr("x", (d, i) => x(binStart(i)) + 1)
.attr("y", (d) => y(d)) .attr("y", (d) => y(d))
.attr("width", (d, i) => x(binEnd(i)) - x(binStart(i)) - 1) .attr("width", (d, i) => x(binEnd(i)) - x(binStart(i)) - binPadding)
.attr("height", (d) => y(0) - y(d)) .attr("height", (d) => y(0) - y(d))
.style( .style(
"fill", "fill",
isColorBy ? (d, i) => colorScale(histogramScale(binStart(i))) : "#bbb" isColorBy
? (d, i) => colorScale(histogramScale(binStart(i)))
: defaultBarColor
); );
} }
@@ -53,14 +53,30 @@ class HistogramBrush extends React.PureComponent {
const marginRight = 54; // space for Y axis & labels const marginRight = 54; // space for Y axis & labels
const marginBottom = 25; // space for X axis & labels const marginBottom = 25; // space for X axis & labels
const marginTop = 3; const marginTop = 3;
this.margin = {
const marginLeftMini = 10; // Space for 0 tick label on X axis
const marginRightMini = 54; // space for Y axis & labels
const marginBottomMini = 25; // space for X axis & labels
const marginTopMini = 3;
this.state = {
margin: {
marginLeft, marginLeft,
marginRight, marginRight,
marginBottom, marginBottom,
marginTop, marginTop,
},
width: 340 - marginLeft - marginRight,
height: 135 - marginTop - marginBottom,
marginMini: {
marginLeftMini,
marginRightMini,
marginBottomMini,
marginTopMini,
},
widthMini: 340 - marginLeft - marginRight,
heightMini: 135 - marginTop - marginBottom,
}; };
this.width = 340 - marginLeft - marginRight;
this.height = 135 - marginTop - marginBottom;
} }
onBrush = (selection, x, eventType) => { onBrush = (selection, x, eventType) => {
@@ -190,6 +206,14 @@ class HistogramBrush extends React.PureComponent {
fetchAsyncProps = async () => { fetchAsyncProps = async () => {
const { annoMatrix } = this.props; const { annoMatrix } = this.props;
const {
margin,
width,
height,
marginMini,
widthMini,
heightMini,
} = this.state;
const { isClipped } = annoMatrix; const { isClipped } = annoMatrix;
const query = this.createQuery(); const query = this.createQuery();
@@ -217,11 +241,12 @@ class HistogramBrush extends React.PureComponent {
: globals.blue, : globals.blue,
]; ];
const histogram = this.calcHistogramCache( const histogram = this.calcHistogramCache(column, margin, width, height);
const miniHistogram = this.calcHistogramCache(
column, column,
this.margin, marginMini,
this.width, widthMini,
this.height heightMini
); );
const isSingleValue = summary.min === summary.max; const isSingleValue = summary.min === summary.max;
@@ -235,6 +260,7 @@ class HistogramBrush extends React.PureComponent {
return { return {
histogram, histogram,
miniHistogram,
range, range,
unclippedRange, unclippedRange,
unclippedRangeColor, unclippedRangeColor,
@@ -314,7 +340,16 @@ class HistogramBrush extends React.PureComponent {
zebra, zebra,
continuousSelectionRange, continuousSelectionRange,
isObs, isObs,
mini,
} = this.props; } = this.props;
const {
margin,
width,
height,
marginMini,
widthMini,
heightMini,
} = this.state;
const fieldForId = field.replace(/\s/g, "_"); const fieldForId = field.replace(/\s/g, "_");
const showScatterPlot = isDiffExp || isUserDefined; const showScatterPlot = isDiffExp || isUserDefined;
@@ -346,6 +381,7 @@ class HistogramBrush extends React.PureComponent {
backgroundColor: zebra ? globals.lightestGrey : "white", backgroundColor: zebra ? globals.lightestGrey : "white",
}} }}
> >
{!mini ? (
<HistogramHeader <HistogramHeader
fieldId={field} fieldId={field}
isColorBy={isColorAccessor} isColorBy={isColorAccessor}
@@ -361,19 +397,24 @@ class HistogramBrush extends React.PureComponent {
showScatterPlot ? this.handleSetGeneAsScatterplotY : null showScatterPlot ? this.handleSetGeneAsScatterplotY : null
} }
/> />
) : null}
<Histogram <Histogram
field={field} field={field}
fieldForId={fieldForId} fieldForId={fieldForId}
display={asyncProps.isSingleValue ? "none" : "block"} display={asyncProps.isSingleValue ? "none" : "block"}
histogram={asyncProps.histogram} histogram={
width={this.width} mini ? asyncProps.miniHistogram : asyncProps.histogram
height={this.height} }
width={mini ? widthMini : width}
height={mini ? heightMini : height}
onBrush={this.onBrush} onBrush={this.onBrush}
onBrushEnd={this.onBrushEnd} onBrushEnd={this.onBrushEnd}
margin={this.margin} margin={mini ? marginMini : margin}
isColorBy={isColorAccessor} isColorBy={isColorAccessor}
selectionRange={continuousSelectionRange} selectionRange={continuousSelectionRange}
mini={mini}
/> />
{!mini ? (
<HistogramFooter <HistogramFooter
displayName={field} displayName={field}
hideRanges={asyncProps.isSingleValue} hideRanges={asyncProps.isSingleValue}
@@ -384,6 +425,7 @@ class HistogramBrush extends React.PureComponent {
logFoldChange={logFoldChange} logFoldChange={logFoldChange}
pvalAdj={pvalAdj} pvalAdj={pvalAdj}
/> />
) : null}
</div> </div>
) : null ) : null
} }
+19 -23
View File
@@ -11,7 +11,7 @@ import HistogramBrush from "../brushableHistogram";
// import TestMiniHisto from "./test_miniHisto"; // import TestMiniHisto from "./test_miniHisto";
import * as globals from "../../globals"; import * as globals from "../../globals";
import GeneMenus from "./menus/geneMenus"; // import GeneMenus from "./menus/geneMenus";
@connect(() => { @connect(() => {
return {}; return {};
@@ -41,15 +41,12 @@ class Gene extends React.Component {
const { gene } = this.props; const { gene } = this.props;
const { geneIsExpanded } = this.state; const { geneIsExpanded } = this.state;
return ( return (
<div>
<div <div
style={{ style={{
display: "flex",
justifyContent: "space-between",
alignItems: "baseline",
marginLeft: 15, marginLeft: 15,
}} }}
> >
<div>
<Icon <Icon
icon="drag-handle-horizontal" icon="drag-handle-horizontal"
iconSize={12} iconSize={12}
@@ -82,24 +79,6 @@ class Gene extends React.Component {
{gene} {gene}
</span> </span>
</Truncate> </Truncate>
<HistogramBrush isUserDefined field={gene} mini={!geneIsExpanded} />
{/* <TestMiniHisto /> */}
</span>
</div>
<div>
<GeneMenus genesetsEditable gene={gene} />
<AnchorButton
minimal
small
data-testclass="colorby"
data-testid={`colorby-${gene}`}
onClick={/* todo gene sets */ () => {}}
active={false /* todo gene sets */}
intent="none"
icon={<Icon icon="tint" iconSize={12} />}
/>
<AnchorButton <AnchorButton
minimal minimal
small small
@@ -110,7 +89,13 @@ class Gene extends React.Component {
intent="none" intent="none"
icon={<Icon icon="maximize" iconSize={10} />} icon={<Icon icon="maximize" iconSize={10} />}
/> />
{/* <TestMiniHisto /> */}
</span>
</div> </div>
<HistogramBrush isUserDefined field={gene} mini={!geneIsExpanded} />
{/* <GeneMenus genesetsEditable gene={gene} /> */}
</div> </div>
); );
} }
@@ -118,6 +103,17 @@ class Gene extends React.Component {
export default Gene; export default Gene;
// <AnchorButton
// minimal
// small
// data-testclass="colorby"
// data-testid={`colorby-${gene}`}
// onClick={/* todo gene sets */ () => {}}
// active={false /* todo gene sets */}
// intent="none"
// icon={<Icon icon="tint" iconSize={12} />}
// />
// {geneIsExpanded ? ( // {geneIsExpanded ? (
// <FaChevronDown // <FaChevronDown
// data-testclass="gene-expand-is-expanded" // data-testclass="gene-expand-is-expanded"
@@ -12,7 +12,7 @@ import { memoize } from "../../util/dataframe/util";
import Truncate from "../util/truncate"; import Truncate from "../util/truncate";
// import TestMiniHisto from "./test_miniHisto"; // import TestMiniHisto from "./test_miniHisto";
import * as globals from "../../globals"; import * as globals from "../../globals";
import GenesetMenus from "./menus/genesetMenus"; // import GenesetMenus from "./menus/genesetMenus";
@connect((state, ownProps) => { @connect((state, ownProps) => {
return { return {
@@ -145,7 +145,7 @@ class GeneSet extends React.Component {
</span> </span>
<div> <div>
{/* <TestMiniHisto /> */} {/* <TestMiniHisto /> */}
<GenesetMenus genesetsEditable geneset={setName} /> {/* <GenesetMenus genesetsEditable geneset={setName} /> */}
<Tooltip <Tooltip
content="Color by geneset" content="Color by geneset"
position={Position.LEFT} position={Position.LEFT}