@@ -4,22 +4,29 @@ import Panel from './Panel';
44import PropTypes from 'prop-types' ;
55import React , { Component } from 'react' ;
66import { EDITOR_ACTIONS } from 'lib/constants' ;
7- import { connectTraceToPlot , localize } from 'lib' ;
7+ import { connectTraceToPlot , localize , plotlyTraceToCustomTrace } from 'lib' ;
8+ import { Tab , Tabs , TabList , TabPanel } from 'react-tabs' ;
89
910const TraceFold = connectTraceToPlot ( Fold ) ;
1011
1112class TraceAccordion extends Component {
1213 render ( ) {
13- const { data = [ ] } = this . context ;
14- const { canAdd, children, messageIfEmptyFold, localize : _ } = this . props ;
14+ const { data = [ ] , fullData = [ ] } = this . context ;
15+ const {
16+ canAdd,
17+ canGroup,
18+ children,
19+ messageIfEmptyFold,
20+ localize : _ ,
21+ } = this . props ;
1522
16- const content =
23+ const individualTraces =
1724 data . length &&
1825 data . map ( ( d , i ) => {
1926 return (
2027 < TraceFold
2128 key = { i }
22- traceIndex = { i }
29+ traceIndexes = { [ i ] }
2330 canDelete = { canAdd }
2431 messageIfEmpty = { messageIfEmptyFold }
2532 >
@@ -39,20 +46,72 @@ class TraceAccordion extends Component {
3946 }
4047 } ,
4148 } ;
42- return < Panel addAction = { addAction } > { content ? content : null } </ Panel > ;
49+ return (
50+ < Panel addAction = { addAction } >
51+ { individualTraces ? individualTraces : null }
52+ </ Panel >
53+ ) ;
4354 }
44- return < TraceRequiredPanel > { content ? content : null } </ TraceRequiredPanel > ;
55+ if ( canGroup && data . length > 1 ) {
56+ const tracesByGroup = data . reduce ( ( allTraces , next , index ) => {
57+ const traceType = plotlyTraceToCustomTrace (
58+ fullData . filter ( trace => trace . index === index ) [ 0 ]
59+ ) ;
60+ if ( ! allTraces [ traceType ] ) {
61+ allTraces [ traceType ] = [ ] ;
62+ }
63+ allTraces [ traceType ] . push ( index ) ;
64+ return allTraces ;
65+ } , { } ) ;
66+
67+ const groupedTraces = Object . keys ( tracesByGroup ) . map (
68+ ( traceType , index ) => {
69+ return (
70+ < TraceFold
71+ key = { index }
72+ traceIndexes = { tracesByGroup [ traceType ] }
73+ name = { traceType }
74+ >
75+ { this . props . children }
76+ </ TraceFold >
77+ ) ;
78+ }
79+ ) ;
80+ return (
81+ < TraceRequiredPanel noPadding >
82+ < Tabs >
83+ < TabList >
84+ < Tab > { _ ( 'All Traces' ) } </ Tab >
85+ < Tab > { _ ( 'Individual' ) } </ Tab >
86+ </ TabList >
87+ < TabPanel >
88+ < Panel > { groupedTraces ? groupedTraces : null } </ Panel >
89+ </ TabPanel >
90+ < TabPanel >
91+ < Panel > { individualTraces ? individualTraces : null } </ Panel >
92+ </ TabPanel >
93+ </ Tabs >
94+ </ TraceRequiredPanel >
95+ ) ;
96+ }
97+ return (
98+ < TraceRequiredPanel >
99+ { individualTraces ? individualTraces : null }
100+ </ TraceRequiredPanel >
101+ ) ;
45102 }
46103}
47104
48105TraceAccordion . contextTypes = {
106+ fullData : PropTypes . array ,
49107 data : PropTypes . array ,
50108} ;
51109
52110TraceAccordion . propTypes = {
53111 localize : PropTypes . func ,
54112 children : PropTypes . node ,
55113 canAdd : PropTypes . bool ,
114+ canGroup : PropTypes . bool ,
56115 messageIfEmptyFold : PropTypes . string ,
57116} ;
58117
0 commit comments