Skip to content

Commit 6b0e7e4

Browse files
committed
Start grouped style panels
1 parent e6dc318 commit 6b0e7e4

File tree

3 files changed

+53
-9
lines changed

3 files changed

+53
-9
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"prop-types": "^15.5.10",
7777
"react-color": "^2.13.8",
7878
"react-select": "^1.0.0-rc.10",
79+
"react-tabs": "^2.0.0",
7980
"tinycolor2": "^1.4.1"
8081
},
8182
"browserify-global-shim": {

src/DefaultEditor.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class DefaultEditor extends Component {
7474
</Panel>
7575

7676
<Panel group="Style" name="Traces">
77-
<TraceAccordion>
77+
<TraceAccordion canGroup>
7878
<Section name={_('Trace')}>
7979
<Numeric label={_('Opacity')} step={0.1} attr="opacity" />
8080
</Section>

src/components/containers/TraceAccordion.js

+51-8
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import Fold from './Fold';
22
import PropTypes from 'prop-types';
33
import React, {Component} from 'react';
44
import {EDITOR_ACTIONS} from '../../lib/constants';
5-
import {connectTraceToPlot} from '../../lib';
5+
import {connectTraceToPlot, plotlyToCustom} from '../../lib';
6+
import {Tab, Tabs, TabList, TabPanel} from 'react-tabs';
67

78
const TraceFold = connectTraceToPlot(Fold);
89

910
export default class TraceAccordion extends Component {
1011
constructor(props) {
1112
super(props);
12-
1313
this.addTrace = this.addTrace.bind(this);
1414
}
1515

@@ -23,18 +23,60 @@ export default class TraceAccordion extends Component {
2323

2424
render() {
2525
const data = this.context.data || [];
26+
const {canGroup, canAdd} = this.props;
27+
const individualPanel = data.map((d, i) => (
28+
<TraceFold key={i} traceIndex={i}>
29+
{this.props.children}
30+
</TraceFold>
31+
));
32+
let content = individualPanel;
33+
34+
if (canGroup && data.length > 1) {
35+
const groupedTraces = {};
36+
37+
data.forEach(trace => {
38+
const traceType = plotlyToCustom(trace);
39+
if (groupedTraces[traceType]) {
40+
groupedTraces[traceType].push(trace.index);
41+
} else {
42+
groupedTraces[traceType] = [trace.index];
43+
}
44+
});
45+
46+
const groupedPanel = Object.keys(groupedTraces).map(
47+
(traceType, index) => {
48+
return (
49+
<TraceFold
50+
key={index}
51+
traceIndex={groupedTraces[traceType]}
52+
name={traceType}
53+
>
54+
{this.props.children}
55+
</TraceFold>
56+
);
57+
}
58+
);
59+
60+
content = (
61+
<Tabs>
62+
<TabList>
63+
<Tab>Grouped</Tab>
64+
<Tab>Individual</Tab>
65+
</TabList>
66+
<TabPanel key={0}>{groupedPanel}</TabPanel>
67+
<TabPanel key={1}>{individualPanel}</TabPanel>
68+
</Tabs>
69+
);
70+
}
71+
2672
return (
2773
<div>
28-
{this.props.canAdd ? (
74+
{canAdd ? (
2975
<button className="panel__add-button" onClick={this.addTrace}>
3076
+ Trace
3177
</button>
3278
) : null}
33-
{data.map((d, i) => (
34-
<TraceFold key={i} traceIndex={i}>
35-
{this.props.children}
36-
</TraceFold>
37-
))}
79+
{content}
3880
</div>
3981
);
4082
}
@@ -48,4 +90,5 @@ TraceAccordion.contextTypes = {
4890
TraceAccordion.propTypes = {
4991
children: PropTypes.node,
5092
canAdd: PropTypes.bool,
93+
canGroup: PropTypes.bool,
5194
};

0 commit comments

Comments
 (0)