diff --git a/package.json b/package.json
index ee3759e36..5b42bf77f 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"fast-isnumeric": "^1.1.1",
"immutability-helper": "^2.6.4",
"plotly-icons": "latest",
- "plotly.js": "1.39.4",
+ "plotly.js": "1.40.0",
"prop-types": "^15.5.10",
"raf": "^3.4.0",
"react-color": "^2.13.8",
diff --git a/src/DefaultEditor.js b/src/DefaultEditor.js
index 51cc03457..2786f432c 100644
--- a/src/DefaultEditor.js
+++ b/src/DefaultEditor.js
@@ -16,6 +16,7 @@ import {
StyleColorbarsPanel,
StyleUpdateMenusPanel,
} from './default_panels';
+import {traceHasColorbar} from './default_panels/StyleColorbarsPanel';
import Logo from './components/widgets/Logo';
import {TRANSFORMABLE_TRACES} from './lib/constants';
@@ -62,11 +63,7 @@ class DefaultEditor extends Component {
}
hasColorbars() {
- return this.context.fullData.some(
- d =>
- (d.marker && d.marker.showscale !== undefined) || // eslint-disable-line no-undefined
- d.showscale !== undefined // eslint-disable-line no-undefined
- );
+ return this.context.fullData.some(d => traceHasColorbar({}, d));
}
render() {
diff --git a/src/components/containers/SubplotAccordion.js b/src/components/containers/SubplotAccordion.js
index f357dcbb4..c93e26359 100644
--- a/src/components/containers/SubplotAccordion.js
+++ b/src/components/containers/SubplotAccordion.js
@@ -17,7 +17,7 @@ const CartesianSubplotFold = connectCartesianSubplotToLayout(PlotlyFold);
class SubplotAccordion extends Component {
render() {
const {data = [], layout = {}, localize: _} = this.context;
- const {children, messageIfEmptyFold} = this.props;
+ const {children} = this.props;
const subplotFolds = [];
const allCartesianAxisCombinations = data.reduce((acc, curVal, inx) => {
@@ -54,7 +54,6 @@ class SubplotAccordion extends Component {
key={d.index[0]}
traceIndexes={d.index}
canDelete={false}
- messageIfEmpty={messageIfEmptyFold}
xaxis={d.xaxis}
yaxis={d.yaxis}
name={`${d.xaxisName} | ${d.yaxisName}`}
@@ -116,7 +115,6 @@ class SubplotAccordion extends Component {
key={layoutKey}
traceIndexes={traceIndexes}
canDelete={false}
- messageIfEmpty={messageIfEmptyFold}
subplot={layoutKey}
name={subplotName}
>
@@ -140,7 +138,6 @@ class SubplotAccordion extends Component {
key={i}
traceIndexes={[i]}
canDelete={false}
- messageIfEmpty={messageIfEmptyFold}
name={
d.type === 'pie'
? `${_('Pie')} ${pieCounter > 1 ? pieCounter : ''}`
@@ -166,7 +163,6 @@ SubplotAccordion.contextTypes = {
SubplotAccordion.propTypes = {
children: PropTypes.node,
- messageIfEmptyFold: PropTypes.string,
};
export default SubplotAccordion;
diff --git a/src/components/containers/TraceAccordion.js b/src/components/containers/TraceAccordion.js
index 91a280166..216f1a863 100644
--- a/src/components/containers/TraceAccordion.js
+++ b/src/components/containers/TraceAccordion.js
@@ -23,19 +23,21 @@ class TraceAccordion extends Component {
setLocals(props, context) {
// we don't want to include analysis transforms when we're in the create panel
const base = props.canGroup ? context.fullData : context.data;
+ const traceFilterCondition =
+ this.props.traceFilterCondition || (() => true);
- this.filteredTracesFullDataPositions = [];
+ this.filteredTracesIndexes = [];
this.filteredTraces = base.filter((t, i) => {
- if (props.excludeFits) {
- return !(t.transforms && t.transforms.every(tr => tr.type === 'fit'));
+ if (traceFilterCondition(t, context.fullData[i])) {
+ this.filteredTracesIndexes.push(i);
+ return true;
}
- this.filteredTracesFullDataPositions.push(i);
- return true;
+ return false;
});
}
renderGroupedTraceFolds() {
- if (!this.filteredTraces.length || this.filteredTraces.length < 2) {
+ if (!this.filteredTraces.length || this.filteredTraces.length <= 1) {
return null;
}
@@ -55,61 +57,45 @@ class TraceAccordion extends Component {
dataArrayPositionsByTraceType[traceType].push(trace.index);
fullDataArrayPositionsByTraceType[traceType].push(
- this.filteredTracesFullDataPositions[index]
+ this.filteredTracesIndexes[index]
);
});
- return Object.keys(fullDataArrayPositionsByTraceType).map((type, index) => {
- return (
- t.value === type).label}
- fullDataArrayPosition={fullDataArrayPositionsByTraceType[type]}
- >
- {this.props.children}
-
- );
- });
+ return Object.keys(fullDataArrayPositionsByTraceType).map((type, index) => (
+ t.value === type).label}
+ fullDataArrayPosition={fullDataArrayPositionsByTraceType[type]}
+ >
+ {this.props.children}
+
+ ));
}
renderUngroupedTraceFolds() {
- if (!this.filteredTraces.length) {
- return null;
- }
-
- return this.filteredTraces.map((d, i) => {
- return (
-
- {this.props.children}
-
- );
- });
+ return this.filteredTraces.map((d, i) => (
+
+ {this.props.children}
+
+ ));
}
renderTraceFolds() {
- if (!this.filteredTraces.length) {
- return null;
- }
-
- return this.filteredTraces.map((d, i) => {
- return (
-
- {this.props.children}
-
- );
- });
+ return this.filteredTraces.map((d, i) => (
+
+ {this.props.children}
+
+ ));
}
render() {
@@ -178,8 +164,7 @@ TraceAccordion.propTypes = {
canAdd: PropTypes.bool,
canGroup: PropTypes.bool,
children: PropTypes.node,
- excludeFits: PropTypes.bool,
- messageIfEmptyFold: PropTypes.string,
+ traceFilterCondition: PropTypes.func,
};
export default TraceAccordion;
diff --git a/src/components/containers/TransformAccordion.js b/src/components/containers/TransformAccordion.js
index 8f45ae494..d64eb8122 100644
--- a/src/components/containers/TransformAccordion.js
+++ b/src/components/containers/TransformAccordion.js
@@ -3,16 +3,12 @@ import PlotlyPanel from './PlotlyPanel';
import PropTypes from 'prop-types';
import React, {Component} from 'react';
import {connectTransformToTrace} from 'lib';
-import FoldEmpty from './FoldEmpty';
-import {PlotScatterIcon} from 'plotly-icons';
-import {TRANSFORMABLE_TRACES} from 'lib/constants';
const TransformFold = connectTransformToTrace(PlotlyFold);
class TransformAccordion extends Component {
render() {
const {
- fullContainer,
fullContainer: {transforms = []},
localize: _,
container,
@@ -27,15 +23,6 @@ class TransformAccordion extends Component {
{label: _('Sort'), type: 'sort'},
];
- if (!TRANSFORMABLE_TRACES.includes(fullContainer.type)) {
- return (
-
- );
- }
-
const transformBy =
container.transforms &&
container.transforms.map(tr => {
@@ -97,6 +84,7 @@ class TransformAccordion extends Component {
const payload = {type};
if (type === 'filter') {
+ payload.target = [];
payload.targetsrc = null;
} else {
payload.groupssrc = null;
diff --git a/src/default_panels/GraphCreatePanel.js b/src/default_panels/GraphCreatePanel.js
index 6e69e7c17..3f6072934 100644
--- a/src/default_panels/GraphCreatePanel.js
+++ b/src/default_panels/GraphCreatePanel.js
@@ -19,7 +19,12 @@ import {
const GraphCreatePanel = (props, {localize: _}) => {
return (
-
+
+ !(t.transforms && t.transforms.every(tr => tr.type === 'fit'))
+ }
+ >
diff --git a/src/default_panels/GraphTransformsPanel.js b/src/default_panels/GraphTransformsPanel.js
index 9b0deeea3..ad77348c4 100644
--- a/src/default_panels/GraphTransformsPanel.js
+++ b/src/default_panels/GraphTransformsPanel.js
@@ -11,6 +11,7 @@ import {
FilterValue,
} from '../components';
import {connectAggregationToTransform} from '../lib';
+import {TRANSFORMABLE_TRACES} from 'lib/constants';
const AggregationSection = connectAggregationToTransform(PlotlySection);
@@ -68,7 +69,9 @@ Aggregations.contextTypes = {
const GraphTransformsPanel = (props, {localize: _}) => {
return (
-
+ TRANSFORMABLE_TRACES.includes(t.type)}
+ >
+ (fullTrace.marker && fullTrace.marker.showscale !== undefined) || // eslint-disable-line no-undefined
+ fullTrace.showscale !== undefined; // eslint-disable-line no-undefined
+
const StyleColorBarsPanel = (props, {localize: _}) => {
return (
-
+
{['', 'marker.'].map(prefix => {
return (