Skip to content

Commit a92d97e

Browse files
committed
Start grouped style panels
1 parent 8d47ab7 commit a92d97e

File tree

3 files changed

+52
-9
lines changed

3 files changed

+52
-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

+50-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,59 @@ 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 = data.reduce((allTraces, next, index) => {
36+
const traceType = plotlyToCustom(next);
37+
if (allTraces[traceType]) {
38+
allTraces[traceType].push(index);
39+
} else {
40+
allTraces[traceType] = [index];
41+
}
42+
return allTraces;
43+
}, {});
44+
45+
const groupedPanel = Object.keys(groupedTraces).map(
46+
(traceType, index) => {
47+
return (
48+
<TraceFold
49+
key={index}
50+
traceIndex={groupedTraces[traceType]}
51+
name={traceType}
52+
>
53+
{this.props.children}
54+
</TraceFold>
55+
);
56+
}
57+
);
58+
59+
content = (
60+
<Tabs>
61+
<TabList>
62+
<Tab>Grouped</Tab>
63+
<Tab>Individual</Tab>
64+
</TabList>
65+
<TabPanel key={0}>{groupedPanel}</TabPanel>
66+
<TabPanel key={1}>{individualPanel}</TabPanel>
67+
</Tabs>
68+
);
69+
}
70+
2671
return (
2772
<div>
28-
{this.props.canAdd ? (
73+
{canAdd ? (
2974
<button className="panel__add-button" onClick={this.addTrace}>
3075
+ Trace
3176
</button>
3277
) : null}
33-
{data.map((d, i) => (
34-
<TraceFold key={i} traceIndex={i}>
35-
{this.props.children}
36-
</TraceFold>
37-
))}
78+
{content}
3879
</div>
3980
);
4081
}
@@ -48,4 +89,5 @@ TraceAccordion.contextTypes = {
4889
TraceAccordion.propTypes = {
4990
children: PropTypes.node,
5091
canAdd: PropTypes.bool,
92+
canGroup: PropTypes.bool,
5193
};

0 commit comments

Comments
 (0)