@@ -15,21 +15,18 @@ var Color = require('../../components/color');
1515var  helpers  =  require ( './helpers' ) ; 
1616
1717module . exports  =  function  calc ( gd ,  trace )  { 
18-     var  vals  =  trace . values , 
19-         labels  =  trace . labels , 
20-         cd  =  [ ] , 
21-         fullLayout  =  gd . _fullLayout , 
22-         colorMap  =  fullLayout . _piecolormap , 
23-         allThisTraceLabels  =  { } , 
24-         needDefaults  =  false , 
25-         vTotal  =  0 , 
26-         hiddenLabels  =  fullLayout . hiddenlabels  ||  [ ] , 
27-         i , 
28-         v , 
29-         label , 
30-         color , 
31-         hidden , 
32-         pt ; 
18+     var  vals  =  trace . values ; 
19+     var  hasVals  =  Array . isArray ( vals )  &&  vals . length ; 
20+     var  labels  =  trace . labels ; 
21+     var  colors  =  trace . marker . colors ; 
22+     var  cd  =  [ ] ; 
23+     var  fullLayout  =  gd . _fullLayout ; 
24+     var  colorMap  =  fullLayout . _piecolormap ; 
25+     var  allThisTraceLabels  =  { } ; 
26+     var  vTotal  =  0 ; 
27+     var  hiddenLabels  =  fullLayout . hiddenlabels  ||  [ ] ; 
28+ 
29+     var  i ,  v ,  label ,  hidden ,  pt ; 
3330
3431    if ( trace . dlabel )  { 
3532        labels  =  new  Array ( vals . length ) ; 
@@ -38,46 +35,60 @@ module.exports = function calc(gd, trace) {
3835        } 
3936    } 
4037
41-     for ( i  =  0 ;  i  <  vals . length ;  i ++ )  { 
42-         v  =  vals [ i ] ; 
43-         if ( ! isNumeric ( v ) )  continue ; 
44-         v  =  + v ; 
45-         if ( v  <  0 )  continue ; 
38+     function  pullColor ( color ,  label )  { 
39+         if ( ! color )  return  false ; 
40+ 
41+         color  =  tinycolor ( color ) ; 
42+         if ( ! color . isValid ( ) )  return  false ; 
43+ 
44+         color  =  Color . addOpacity ( color ,  color . getAlpha ( ) ) ; 
45+         if ( ! colorMap [ label ] )  colorMap [ label ]  =  color ; 
46+ 
47+         return  color ; 
48+     } 
49+ 
50+     var  seriesLen  =  ( hasVals  ? vals  : labels ) . length ; 
51+ 
52+     for ( i  =  0 ;  i  <  seriesLen ;  i ++ )  { 
53+         if ( hasVals )  { 
54+             v  =  vals [ i ] ; 
55+             if ( ! isNumeric ( v ) )  continue ; 
56+             v  =  + v ; 
57+             if ( v  <  0 )  continue ; 
58+         } 
59+         else  v  =  1 ; 
4660
4761        label  =  labels [ i ] ; 
4862        if ( label  ===  undefined  ||  label  ===  '' )  label  =  i ; 
4963        label  =  String ( label ) ; 
50-         // only take the first occurrence of any given label. 
51-         // TODO: perhaps (optionally?) sum values for a repeated label? 
52-         if ( allThisTraceLabels [ label ]  ===  undefined )  allThisTraceLabels [ label ]  =  true ; 
53-         else  continue ; 
54- 
55-         color  =  tinycolor ( trace . marker . colors [ i ] ) ; 
56-         if ( color . isValid ( ) )  { 
57-             color  =  Color . addOpacity ( color ,  color . getAlpha ( ) ) ; 
58-             if ( ! colorMap [ label ] )  { 
59-                 colorMap [ label ]  =  color ; 
60-             } 
61-         } 
62-         // have we seen this label and assigned a color to it in a previous trace? 
63-         else  if ( colorMap [ label ] )  color  =  colorMap [ label ] ; 
64-         // color needs a default - mark it false, come back after sorting 
65-         else  { 
66-             color  =  false ; 
67-             needDefaults  =  true ; 
68-         } 
6964
70-         hidden  =  hiddenLabels . indexOf ( label )  !==  - 1 ; 
65+         var  thisLabelIndex  =  allThisTraceLabels [ label ] ; 
66+         if ( thisLabelIndex  ===  undefined )  { 
67+             allThisTraceLabels [ label ]  =  cd . length ; 
7168
72-         if ( ! hidden )   vTotal   +=   v ; 
69+              hidden   =   hiddenLabels . indexOf ( label )   !==   - 1 ; 
7370
74-         cd . push ( { 
75-             v : v , 
76-             label : label , 
77-             color : color , 
78-             i : i , 
79-             hidden : hidden 
80-         } ) ; 
71+             if ( ! hidden )  vTotal  +=  v ; 
72+ 
73+             cd . push ( { 
74+                 v : v , 
75+                 label : label , 
76+                 color : pullColor ( colors [ i ] ) , 
77+                 i : i , 
78+                 pts : [ i ] , 
79+                 hidden : hidden 
80+             } ) ; 
81+         } 
82+         else  { 
83+             pt  =  cd [ thisLabelIndex ] ; 
84+             pt . v  +=  v ; 
85+             pt . pts . push ( i ) ; 
86+             if ( ! pt . hidden )  vTotal  +=  v ; 
87+ 
88+             if ( pt . color  ===  false  &&  colors [ i ] )  { 
89+                 pt . color  =  pullColor ( colors [ i ] ,  label ) ; 
90+             } 
91+         } 
8192    } 
8293
8394    if ( trace . sort )  cd . sort ( function ( a ,  b )  {  return  b . v  -  a . v ;  } ) ; 
@@ -88,10 +99,14 @@ module.exports = function calc(gd, trace) {
8899     * in the order slices will be displayed 
89100     */ 
90101
91-     if ( needDefaults )  { 
92-         for ( i  =  0 ;  i  <  cd . length ;  i ++ )  { 
93-             pt  =  cd [ i ] ; 
94-             if ( pt . color  ===  false )  { 
102+     for ( i  =  0 ;  i  <  cd . length ;  i ++ )  { 
103+         pt  =  cd [ i ] ; 
104+         if ( pt . color  ===  false )  { 
105+             // have we seen this label and assigned a color to it in a previous trace? 
106+             if ( colorMap [ pt . label ] )  { 
107+                 pt . color  =  colorMap [ pt . label ] ; 
108+             } 
109+             else  { 
95110                colorMap [ pt . label ]  =  pt . color  =  nextDefaultColor ( fullLayout . _piedefaultcolorcount ) ; 
96111                fullLayout . _piedefaultcolorcount ++ ; 
97112            } 
@@ -103,17 +118,21 @@ module.exports = function calc(gd, trace) {
103118
104119    // now insert text 
105120    if ( trace . textinfo  &&  trace . textinfo  !==  'none' )  { 
106-         var  hasLabel  =  trace . textinfo . indexOf ( 'label' )  !==  - 1 , 
107-             hasText  =  trace . textinfo . indexOf ( 'text' )  !==  - 1 , 
108-             hasValue  =  trace . textinfo . indexOf ( 'value' )  !==  - 1 , 
109-             hasPercent  =  trace . textinfo . indexOf ( 'percent' )  !==  - 1 , 
110-             separators  =  fullLayout . separators , 
111-             thisText ; 
121+         var  hasLabel  =  trace . textinfo . indexOf ( 'label' )  !==  - 1 ; 
122+         var  hasText  =  trace . textinfo . indexOf ( 'text' )  !==  - 1 ; 
123+         var  hasValue  =  trace . textinfo . indexOf ( 'value' )  !==  - 1 ; 
124+         var  hasPercent  =  trace . textinfo . indexOf ( 'percent' )  !==  - 1 ; 
125+         var  separators  =  fullLayout . separators ; 
126+ 
127+         var  thisText ; 
112128
113129        for ( i  =  0 ;  i  <  cd . length ;  i ++ )  { 
114130            pt  =  cd [ i ] ; 
115131            thisText  =  hasLabel  ? [ pt . label ]  : [ ] ; 
116-             if ( hasText  &&  trace . text [ pt . i ] )  thisText . push ( trace . text [ pt . i ] ) ; 
132+             if ( hasText )  { 
133+                 var  texti  =  helpers . getFirstFilled ( trace . text ,  pt . pts ) ; 
134+                 if ( texti )  thisText . push ( texti ) ; 
135+             } 
117136            if ( hasValue )  thisText . push ( helpers . formatPieValue ( pt . v ,  separators ) ) ; 
118137            if ( hasPercent )  thisText . push ( helpers . formatPiePercent ( pt . v  /  vTotal ,  separators ) ) ; 
119138            pt . text  =  thisText . join ( '<br>' ) ; 
0 commit comments