@@ -10,38 +10,109 @@ import {Tab, Tabs, TabList, TabPanel} from 'react-tabs';
10
10
const TraceFold = connectTraceToPlot ( PlotlyFold ) ;
11
11
12
12
class TraceAccordion extends Component {
13
- render ( ) {
14
- const { data = [ ] , localize : _ } = this . context ;
15
- const {
16
- canAdd,
17
- canGroup,
18
- children,
19
- messageIfEmptyFold,
20
- excludeFits,
21
- } = this . props ;
13
+ constructor ( props , context ) {
14
+ super ( props , context ) ;
15
+ this . setLocals ( props , context ) ;
16
+ }
22
17
18
+ componentWillReceiveProps ( nextProps , nextContext ) {
19
+ this . setLocals ( nextProps , nextContext ) ;
20
+ }
21
+
22
+ setLocals ( props , context ) {
23
23
// we don't want to include analysis transforms when we're in the create panel
24
- const filteredData = data . filter ( t => {
25
- if ( excludeFits ) {
24
+ const base = props . canGroup ? context . fullData : context . data ;
25
+
26
+ this . filteredTracesFullDataPositions = [ ] ;
27
+ this . filteredTraces = base . filter ( ( t , i ) => {
28
+ if ( props . excludeFits ) {
26
29
return ! ( t . transforms && t . transforms . every ( tr => tr . type === 'fit' ) ) ;
27
30
}
31
+ this . filteredTracesFullDataPositions . push ( i ) ;
28
32
return true ;
29
33
} ) ;
34
+ }
30
35
31
- const individualTraces =
32
- filteredData . length &&
33
- filteredData . map ( ( d , i ) => {
34
- return (
35
- < TraceFold
36
- key = { i }
37
- traceIndexes = { [ i ] }
38
- canDelete = { canAdd }
39
- messageIfEmpty = { messageIfEmptyFold }
40
- >
41
- { children }
42
- </ TraceFold >
43
- ) ;
44
- } ) ;
36
+ renderGroupedTraceFolds ( ) {
37
+ if ( ! this . filteredTraces . length || this . filteredTraces . length < 2 ) {
38
+ return null ;
39
+ }
40
+
41
+ const dataArrayPositionsByTraceType = { } ;
42
+ const fullDataArrayPositionsByTraceType = { } ;
43
+
44
+ this . filteredTraces . forEach ( ( trace , index ) => {
45
+ const traceType = plotlyTraceToCustomTrace ( trace ) ;
46
+ if ( ! dataArrayPositionsByTraceType [ traceType ] ) {
47
+ dataArrayPositionsByTraceType [ traceType ] = [ ] ;
48
+ }
49
+
50
+ if ( ! fullDataArrayPositionsByTraceType [ traceType ] ) {
51
+ fullDataArrayPositionsByTraceType [ traceType ] = [ ] ;
52
+ }
53
+
54
+ dataArrayPositionsByTraceType [ traceType ] . push ( trace . index ) ;
55
+ fullDataArrayPositionsByTraceType [ traceType ] . push (
56
+ this . filteredTracesFullDataPositions [ index ]
57
+ ) ;
58
+ } ) ;
59
+
60
+ return Object . keys ( fullDataArrayPositionsByTraceType ) . map ( ( type , index ) => {
61
+ return (
62
+ < TraceFold
63
+ key = { index }
64
+ traceIndexes = { dataArrayPositionsByTraceType [ type ] }
65
+ name = { type }
66
+ fullDataArrayPosition = { fullDataArrayPositionsByTraceType [ type ] }
67
+ >
68
+ { this . props . children }
69
+ </ TraceFold >
70
+ ) ;
71
+ } ) ;
72
+ }
73
+
74
+ renderUngroupedTraceFolds ( ) {
75
+ if ( ! this . filteredTraces . length ) {
76
+ return null ;
77
+ }
78
+
79
+ return this . filteredTraces . map ( ( d , i ) => {
80
+ return (
81
+ < TraceFold
82
+ key = { i }
83
+ traceIndexes = { [ d . index ] }
84
+ canDelete = { this . props . canAdd }
85
+ messageIfEmpty = { this . props . messageIfEmptyFold }
86
+ fullDataArrayPosition = { [ this . filteredTracesFullDataPositions [ i ] ] }
87
+ >
88
+ { this . props . children }
89
+ </ TraceFold >
90
+ ) ;
91
+ } ) ;
92
+ }
93
+
94
+ renderTraceFolds ( ) {
95
+ if ( ! this . filteredTraces . length ) {
96
+ return null ;
97
+ }
98
+
99
+ return this . filteredTraces . map ( ( d , i ) => {
100
+ return (
101
+ < TraceFold
102
+ key = { i }
103
+ traceIndexes = { [ i ] }
104
+ canDelete = { this . props . canAdd }
105
+ messageIfEmpty = { this . props . messageIfEmptyFold }
106
+ >
107
+ { this . props . children }
108
+ </ TraceFold >
109
+ ) ;
110
+ } ) ;
111
+ }
112
+
113
+ render ( ) {
114
+ const { canAdd, canGroup} = this . props ;
115
+ const _ = this . context . localize ;
45
116
46
117
if ( canAdd ) {
47
118
const addAction = {
@@ -54,58 +125,44 @@ class TraceAccordion extends Component {
54
125
}
55
126
} ,
56
127
} ;
128
+
57
129
return (
58
130
< PlotlyPanel addAction = { addAction } >
59
- { individualTraces ? individualTraces : null }
131
+ { this . renderTraceFolds ( ) }
60
132
</ PlotlyPanel >
61
133
) ;
62
134
}
63
- const tracesByGroup = filteredData . reduce ( ( allTraces , nextTrace , index ) => {
64
- const traceType = plotlyTraceToCustomTrace ( nextTrace ) ;
65
- if ( ! allTraces [ traceType ] ) {
66
- allTraces [ traceType ] = [ ] ;
67
- }
68
- allTraces [ traceType ] . push ( index ) ;
69
- return allTraces ;
70
- } , { } ) ;
71
135
72
- const groupedTraces = Object . keys ( tracesByGroup ) . map ( ( traceType , index ) => {
73
- return (
74
- < TraceFold
75
- key = { index }
76
- traceIndexes = { tracesByGroup [ traceType ] }
77
- name = { traceType }
78
- >
79
- { this . props . children }
80
- </ TraceFold >
81
- ) ;
82
- } ) ;
136
+ if ( canGroup ) {
137
+ if ( this . filteredTraces . length === 1 ) {
138
+ return (
139
+ < TraceRequiredPanel >
140
+ { this . renderUngroupedTraceFolds ( ) }
141
+ </ TraceRequiredPanel >
142
+ ) ;
143
+ }
83
144
84
- if ( canGroup && filteredData . length > 1 && groupedTraces . length > 0 ) {
85
- return (
86
- < TraceRequiredPanel noPadding >
87
- < Tabs >
88
- < TabList >
89
- < Tab > { _ ( 'Individually' ) } </ Tab >
90
- < Tab > { _ ( 'By Type' ) } </ Tab >
91
- </ TabList >
92
- < TabPanel >
93
- < PlotlyPanel >
94
- { individualTraces ? individualTraces : null }
95
- </ PlotlyPanel >
96
- </ TabPanel >
97
- < TabPanel >
98
- < PlotlyPanel > { groupedTraces ? groupedTraces : null } </ PlotlyPanel >
99
- </ TabPanel >
100
- </ Tabs >
101
- </ TraceRequiredPanel >
102
- ) ;
145
+ if ( this . filteredTraces . length > 1 ) {
146
+ return (
147
+ < TraceRequiredPanel noPadding >
148
+ < Tabs >
149
+ < TabList >
150
+ < Tab > { _ ( 'Individually' ) } </ Tab >
151
+ < Tab > { _ ( 'By Type' ) } </ Tab >
152
+ </ TabList >
153
+ < TabPanel >
154
+ < PlotlyPanel > { this . renderUngroupedTraceFolds ( ) } </ PlotlyPanel >
155
+ </ TabPanel >
156
+ < TabPanel >
157
+ < PlotlyPanel > { this . renderGroupedTraceFolds ( ) } </ PlotlyPanel >
158
+ </ TabPanel >
159
+ </ Tabs >
160
+ </ TraceRequiredPanel >
161
+ ) ;
162
+ }
103
163
}
104
- return (
105
- < TraceRequiredPanel >
106
- { individualTraces ? individualTraces : null }
107
- </ TraceRequiredPanel >
108
- ) ;
164
+
165
+ return < TraceRequiredPanel > { this . renderTraceFolds ( ) } </ TraceRequiredPanel > ;
109
166
}
110
167
}
111
168
0 commit comments