@@ -25,10 +25,11 @@ String strokeColorClass(int i) => 'downloads-chart-stroke-${colors[i]}';
2525String fillColorClass (int i) => 'downloads-chart-fill-${colors [i ]}' ;
2626
2727void create (HTMLElement element, Map <String , String > options) {
28- final dataPoints = options['points' ];
28+ var dataPoints = options['points' ];
2929 if (dataPoints == null ) {
3030 throw UnsupportedError ('data-downloads-chart-points required' );
3131 }
32+ dataPoints = testString;
3233
3334 final svg = document.createElementNS ('http://www.w3.org/2000/svg' , 'svg' );
3435 svg.setAttribute ('height' , '100%' );
@@ -46,21 +47,25 @@ void create(HTMLElement element, Map<String, String> options) {
4647 data.majorRangeWeeklyDownloads,
4748 weeksToDisplay,
4849 );
49- final majorRanges =
50- data.majorRangeWeeklyDownloads.map ((e) => e.versionRange).toList ();
5150
52- drawChart (svg, majorRanges, majorDisplayLists, data.newestDate);
51+ drawChart (svg, majorDisplayLists, data.newestDate);
5352}
5453
55- void drawChart (Element svg, List <String > ranges, List <List <int >> values,
54+ void drawChart (
55+ Element svg,
56+ ({List <String > ranges, List <List <int >> weekLists}) displayLists,
5657 DateTime newestDate,
5758 {bool stacked = false }) {
59+ final ranges = displayLists.ranges;
60+ final values = displayLists.weekLists;
61+
5862 if (values.isEmpty) return ;
63+
5964 final frameWidth =
6065 775 ; // TODO(zarah): Investigate if this width can be dynamic
6166 final topPadding = 30 ;
6267 final leftPadding = 30 ;
63- final rightPadding = 70 ; // make extra room for labels on y-axis
68+ final rightPadding = 70 ; // Make extra room for labels on y-axis
6469 final chartWidth = frameWidth - leftPadding - rightPadding;
6570 final chartheight = 420 ;
6671
@@ -70,8 +75,8 @@ void drawChart(Element svg, List<String> ranges, List<List<int>> values,
7075 day: newestDate.day - 7 * (totalWeeks - weekNumber - 1 ));
7176 }
7277
73- // Computes max value on y-axis such that we get a nice division for the
74- // interval length between the numbers shown by the ticks on the y axis.
78+ /// Computes max value on y-axis such that we get a nice division for the
79+ /// interval length between the numbers shown by the ticks on the y axis.
7580 (int maxY, int interval) computeMaxYAndInterval (List <List <int >> values) {
7681 final maxDownloads =
7782 values.fold <int >(1 , (a, b) => math.max <int >(a, b.reduce (math.max)));
@@ -88,7 +93,7 @@ void drawChart(Element svg, List<String> ranges, List<List<int>> values,
8893 return ((maxDownloads / d).ceil () * d, d);
8994 }
9095 }
91- // This should not happen!
96+ // This should not happen! But we don't want to break if it does.
9297 return (maxDownloads, firstDiv);
9398 }
9499
@@ -129,7 +134,7 @@ void drawChart(Element svg, List<String> ranges, List<List<int>> values,
129134 chart.append (xaxis);
130135
131136 late SVGTextElement firstTickLabel;
132- // place a tick every 4 weeks
137+ // Place a tick every 4 weeks
133138 for (int week = 0 ; week < values.length; week += 4 ) {
134139 final date = computeDateForWeekNumber (newestDate, values.length, week);
135140 final (x, y) = computeCoordinates (date, 0 );
@@ -171,7 +176,7 @@ void drawChart(Element svg, List<String> ranges, List<List<int>> values,
171176
172177 final longTick = SVGPathElement ();
173178 longTick.setAttribute ('class' , 'downloads-chart-frame' );
174- longTick.setAttribute ('d' , 'M$xAxisStart } $y L$xAxisEnd $y ' );
179+ longTick.setAttribute ('d' , 'M$xAxisStart $y L$xAxisEnd $y ' );
175180 chart.append (longTick);
176181 }
177182
@@ -203,8 +208,8 @@ void drawChart(Element svg, List<String> ranges, List<List<int>> values,
203208 lines.add (line);
204209 }
205210
206- double legendXCoor = xZero;
207- double legendYCoor =
211+ double legendX = xZero;
212+ double legendY =
208213 tickLabelYCoordinate + firstTickLabel.getBBox ().height + labelPadding;
209214 final legendWidth = 20 ;
210215 final legendHeight = 8 ;
@@ -228,39 +233,30 @@ void drawChart(Element svg, List<String> ranges, List<List<int>> values,
228233 final legendLabel = SVGTextElement ();
229234 chart.append (legendLabel);
230235 legendLabel.setAttribute ('class' , 'downloads-chart-tick-label' );
231- if (i == 5 ) {
232- // We have an 'other' line
233- legendLabel.text = 'Other' ;
234- } else {
235- legendLabel.text = ranges[ranges.length - 1 - i];
236- }
236+ legendLabel.text = ranges[ranges.length - 1 - i];
237237
238- if (legendXCoor +
239- marginPadding +
240- legendWidth +
241- legendLabel.getBBox ().width >
238+ if (legendX + marginPadding + legendWidth + legendLabel.getBBox ().width >
242239 xMax) {
243240 // There is no room for the legend and label.
244241 // Make a new line and update legendXCoor and legendYCoor accordingly.
245242
246- legendXCoor = xZero;
247- legendYCoor += 2 * marginPadding + legendHeight;
243+ legendX = xZero;
244+ legendY += 2 * marginPadding + legendHeight;
248245 }
249246
250- legend.setAttribute ('x' , '$legendXCoor ' );
251- legend.setAttribute ('y' , '$legendYCoor ' );
252- legendLabel.setAttribute ('y' , '${legendYCoor + legendHeight }' );
253- legendLabel.setAttribute (
254- 'x' , '${legendXCoor + marginPadding + legendWidth }' );
247+ legend.setAttribute ('x' , '$legendX ' );
248+ legend.setAttribute ('y' , '$legendY ' );
249+ legendLabel.setAttribute ('y' , '${legendY + legendHeight }' );
250+ legendLabel.setAttribute ('x' , '${legendX + marginPadding + legendWidth }' );
255251
256252 // Update x coordinate for next legend
257- legendXCoor += legendWidth +
253+ legendX += legendWidth +
258254 marginPadding +
259255 legendLabel.getBBox ().width +
260256 labelPadding;
261257 }
262258
263- final frameHeight = legendYCoor + marginPadding + labelPadding;
259+ final frameHeight = legendY + marginPadding + labelPadding;
264260 final frame = SVGRectElement ()
265261 ..setAttribute ('class' , 'downloads-chart-frame' )
266262 ..setAttribute ('height' , '$frameHeight ' )
@@ -269,3 +265,6 @@ void drawChart(Element svg, List<String> ranges, List<List<int>> values,
269265 ..setAttribute ('ry' , '15' );
270266 chart.append (frame);
271267}
268+
269+ final testString =
270+ 'eyJ0b3RhbFdlZWtseURvd25sb2FkcyI6WzY5MTE5Niw2MDM1NjgsMzUxNDM1LDM1MTYyNCw2MzY0MjUsNzAwNjY4LDY3NzYwOSw2NTcyOTQsNjcwNzU4LDY1NjM0Nyw2MzY5MDQsNjI2NTI3LDY0NjUzMCw2MzgzODMsNjMwNTc3LDU3MjkzOCw2MjUwODUsNTYzMzI0LDU4MDQ1OCw1NjY0MTMsNTc3MzA5LDU5NjY5Miw1NTU3MDcsNTcwNjA3LDU2NzExNSw1MzQ5NjksNTA2OTY4LDUxMDc2NCw0NTkxMjIsNTI5NDA1LDQ5MjEzNCw0OTQwNjksNDg0MjI5LDQ3NTk2OCw0ODc0NTksNTAxNzgwLDQ2MjU4Myw0MzM2NjgsNTE3MDAwLDU1NjgzOCw1MDM1NjMsNTIxMjgwLDQ4MjMzNyw1MzA4MzIsNTM5MDAyLDUyNjYwOSw1MTQzNzEsNDgwNTYxLDQzNzY1OCw0MzA0MDMsNDU0MzYxLDM1Nzk0OV0sIm1ham9yUmFuZ2VXZWVrbHlEb3dubG9hZHMiOlt7ImNvdW50cyI6WzE2MjEyMywxNDIxMTQsOTQyNTcsODk3NzQsMTM4NDgwLDE5NzExOCwyMTE5NTksMTg3MjUxLDE3NDA1MywxNzk4MzEsMTY1NDk0LDE2MTQ0MywxNTcxMTgsMTU3MTYzLDE3NjI0NiwxNTk0OTksMTcyODg0LDE1NTczMywxNjk3ODcsMTcyNzM3LDE3NDE1OSwxNzk5NDYsMTYxOTgwLDE3NDM5NCwxOTc4NTgsMTkxMTcyLDE4NTYwOSwxODQyNjcsMTcyMzQzLDIxOTM2MCwxOTYwMzYsMTkwNDAyLDE5NTc3MiwxOTMwNDEsMjA0NzIzLDIxNzY3OCwyMDYzMTEsMjAwMTEzLDIyODM5MSwyNTc5NDQsMjQzNjU1LDI3MzI4NSwyNTEzMzUsMjc4ODU1LDI4MDkwMywyNzAzNTcsMjc4NzY2LDI1OTI3NiwyNTE1NDUsMjQ1NzczLDI2MzE4MywxOTAwNzZdLCJ2ZXJzaW9uUmFuZ2UiOiI+PTQuMC4wLTAgPDUuMC4wIn0seyJjb3VudHMiOlsxNTYwNywxNTkxNyw5MDgzLDEwMTc1LDE3MjM2LDE2Nzg1LDE4OTQ1LDE5ODgxLDE5ODc5LDIxNTUxLDE5MTkyLDI4NjA5LDI1NzU5LDI2NTkwLDI3NjMzLDI4MjU1LDI5ODIwLDI4NDIyLDMwMDUzLDI5NDk0LDM0MTY3LDM1OTE1LDM1MzQ4LDM4NjE1LDQwMzI1LDM5MzczLDQxMDY5LDQzMzI0LDQyNDgwLDQ3NDA3LDUzNjczLDYxMTk1LDY0MDA4LDYzOTczLDY2NTYwLDczMTAwLDY3NDgyLDY3Nzk1LDkyMDc3LDEwMDU0NSwxMDY2MTMsMTIwNTI1LDEzMzE0OCwxNTcxMDUsMTYzMzIyLDE2NDI4NSwxNDg4OTEsMTQxNDQ5LDEwNzI3MCw5OTk5OSw5NzY2Niw3MDAwOF0sInZlcnNpb25SYW5nZSI6Ij49NS4wLjAtMCA8Ni4wLjAifSx7ImNvdW50cyI6WzM5OTg2LDQzNzE4LDE3Mzk0LDE1MTQxLDM4MTc2LDQxNTUyLDM3MTY1LDQ0MTU1LDUxMjc5LDU1OTg5LDUzMzcyLDUwNTY4LDUwMTA5LDUzNDUxLDQ4NzA3LDU0MjQ3LDYzNDg1LDU1NTk5LDU0NDA5LDU2MzMwLDU1NDU5LDU4NTAxLDUyMjExLDYwOTczLDUzNDA3LDU4ODkwLDUzMDA4LDYyNzUzLDQ2NDcxLDU3NjAzLDUwODM3LDU4NzE3LDU1MTA5LDUzMTYwLDUyMDkyLDUzNTQ2LDUyMzk2LDQ3MzU4LDYyNjQ5LDY0ODE2LDU4NjMwLDUxOTAzLDIxNTgwLDkyNTksMCwwLDAsMCwwLDAsMCwwXSwidmVyc2lvblJhbmdlIjoiPj02LjAuMC0wIDw3LjAuMCJ9LHsiY291bnRzIjpbODk2NywxMDMzNywzODY5LDQ5MjgsOTEzNywxMDIyNywxMjM4MCwxMjkxOSwxMjcwNywxMzU1OCwxNTEyNiwxNDY1MSwxNzM3MCwxNzM5NiwxNzI4OSwxODQwNSwyMzg3MSwxODc0NywxOTM4NywxNzI1NiwxOTI1OSwxOTMxNCwyMzUzMywyNDQ5NCwyMjEzOSwyNTUxMCwyNDQ3OSwyMjUwNSwyNzM1NiwyNjQyMiwyNjgzNywyODgxMywyNjk2MCwyODk0MCwzMjY2NCwzMTMwOCwzMjY0OCw0MTYxNSw1NzE2MSw0NzY1MiwyNjE0NiwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLCJ2ZXJzaW9uUmFuZ2UiOiI+PTcuMC4wLTAgPDguMC4wIn0seyJjb3VudHMiOls0MzkwNTEsMzY4MDgyLDIxMjU1MCwyMTg3NjcsNDEyNDE5LDQwNzgzNCwzNjk0NzEsMzcxODU5LDM5MDUyMCwzNjIxNDMsMzU2MDUzLDM0MDk2MiwzNjkwNjEsMzUxNjMzLDMyNzAwMywyNzg5MjksMzAzMDIwLDI3NTc1NywyNzMzMTUsMjU2OTA0LDI1MTkyNCwyNTc2NDUsMjQzODQyLDIyNzYxNywyMTE5MjcsMTc2NDk5LDE1OTc5NiwxNTI3MjksMTMxNjA4LDEzMzk5NSwxMjE4ODEsMTEyMzg2LDEwMDA5Niw5MDg2MSw4MTQyMyw3NTYzNyw1MjA5NCwzMDg1NiwxNTI1MiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSwidmVyc2lvblJhbmdlIjoiPj04LjAuMC0wIDw5LjAuMCJ9XSwibWlub3JSYW5nZVdlZWtseURvd25sb2FkcyI6W3siY291bnRzIjpbMTU2MDcsMTU5MTcsOTA4MywxMDE3NSwxNzIzNiwxNjc4NSwxODk0NSwxOTg4MSwxOTg3OSwyMTU1MSwxOTE5MiwyODYwOSwyNTc1OSwyNjU5MCwyNzYzMywyODI1NSwyOTgyMCwyODQyMiwzMDA1MywyOTQ5NCwzNDE2NywzNTkxNSwzNTM0OCwzODYxNSw0MDMyNSwzOTM3Myw0MTA2OSw0MzMyNCw0MjQ4MCw0NzQwNyw1MzY3Myw2MTE5NSw2NDAwOCw2Mzk3Myw2NjU2MCw3MzEwMCw2NzQ4Miw2Nzc5NSw5MjA3NywxMDA1NDUsMTA2NjEzLDEyMDUyNSwxMzMxNDgsMTU3MTA1LDE2MzMyMiwxNjQyODUsMTQ4ODkxLDE0MTQ0OSwxMDcyNzAsOTk5OTksOTc2NjYsNzAwMDhdLCJ2ZXJzaW9uUmFuZ2UiOiI+PTUuMC4wLTAgPDUuMS4wIn0seyJjb3VudHMiOlszOTk4Niw0MzcxOCwxNzM5NCwxNTE0MSwzODE3Niw0MTU1MiwzNzE2NSw0NDE1NSw1MTI3OSw1NTk4OSw1MzM3Miw1MDU2OCw1MDEwOSw1MzQ1MSw0ODcwNyw1NDI0Nyw2MzQ4NSw1NTU5OSw1NDQwOSw1NjMzMCw1NTQ1OSw1ODUwMSw1MjIxMSw2MDk3Myw1MzQwNyw1ODg5MCw1MzAwOCw2Mjc1Myw0NjQ3MSw1NzYwMyw1MDgzNyw1ODcxNyw1NTEwOSw1MzE2MCw1MjA5Miw1MzU0Niw1MjM5Niw0NzM1OCw2MjY0OSw2NDgxNiw1ODYzMCw1MTkwMywyMTU4MCw5MjU5LDAsMCwwLDAsMCwwLDAsMF0sInZlcnNpb25SYW5nZSI6Ij49Ni4wLjAtMCA8Ni4xLjAifSx7ImNvdW50cyI6Wzg5NjcsMTAzMzcsMzg2OSw0OTI4LDkxMzcsMTAyMjcsMTIzODAsMTI5MTksMTI3MDcsMTM1NTgsMTUxMjYsMTQ2NTEsMTczNzAsMTczOTYsMTcyODksMTg0MDUsMjM4NzEsMTg3NDcsMTkzODcsMTcyNTYsMTkyNTksMTkzMTQsMjM1MzMsMjQ0OTQsMjIxMzksMjU1MTAsMjQ0NzksMjI1MDUsMjczNTYsMjY0MjIsMjY4MzcsMjg4MTMsMjY5NjAsMjg5NDAsMzI2NjQsMzEzMDgsMzI2NDgsNDE2MTUsNTcxNjEsNDc2NTIsMjYxNDYsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSwidmVyc2lvblJhbmdlIjoiPj03LjAuMC0wIDw3LjEuMCJ9LHsiY291bnRzIjpbMTA1NjI5LDk4Nzc2LDYwMzYxLDY0MjI3LDEyNTIyOCwxMzc5MDgsMTQ0NDQ3LDE1NTQzNCwxNzMzMDMsMTU3NTAxLDE2NTI2MywxNzUzMjMsMjA5NjM5LDI5ODg5MCwzMjcwMDMsMjc4OTI5LDMwMzAyMCwyNzU3NTcsMjczMzE1LDI1NjkwNCwyNTE5MjQsMjU3NjQ1LDI0Mzg0MiwyMjc2MTcsMjExOTI3LDE3NjQ5OSwxNTk3OTYsMTUyNzI5LDEzMTYwOCwxMzM5OTUsMTIxODgxLDExMjM4NiwxMDAwOTYsOTA4NjEsODE0MjMsNzU2MzcsNTIwOTQsMzA4NTYsMTUyNTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sInZlcnNpb25SYW5nZSI6Ij49OC4wLjAtMCA8OC4xLjAifSx7ImNvdW50cyI6WzMzMzQyMiwyNjkzMDYsMTUyMTg5LDE1NDU0MCwyODcxOTEsMjY5OTI2LDIyNTAyNCwyMTY0MjUsMjE3MjE3LDIwNDY0MiwxOTA3OTAsMTY1NjM5LDE1OTQyMiw1Mjc0MywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLCJ2ZXJzaW9uUmFuZ2UiOiI+PTguMS4wLTAgPDguMi4wIn1dLCJwYXRjaFJhbmdlV2Vla2x5RG93bmxvYWRzIjpbeyJjb3VudHMiOls4MzkwLDgzOTEsNDkyMyw1NjkwLDEwNzQyLDEzNjgxLDEzMjE1LDE1NzY5LDE2OTkxLDE3NzM3LDE4NjEyLDIzNDk3LDQwNDE1LDExODI3NCw4OTkzNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSwidmVyc2lvblJhbmdlIjoiPj04LjAuMy0wIDw4LjAuNCJ9LHsiY291bnRzIjpbMjc5OTcsMzA1NzYsMTc2NzEsMjA2MzYsMzY2OTYsNDQ2MjQsNDYxMjksNDk4MDEsNTUyNTYsNjE3NzIsMTM0NjY3LDE2NTYzOSwxNTk0MjIsNTI3NDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSwidmVyc2lvblJhbmdlIjoiPj04LjEuMC0wIDw4LjEuMSJ9LHsiY291bnRzIjpbNTUwNzksNTY1MTAsMzE1MjcsMzYzOTEsNzgzNjAsMTY3NDgwLDE3ODg5NSwxNjY2MjQsMTYxOTYxLDE0Mjg3MCw1NjEyMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLCJ2ZXJzaW9uUmFuZ2UiOiI+PTguMS4xLTAgPDguMS4yIn0seyJjb3VudHMiOlsxMDUxMjYsMTgyMjIwLDEwMjk5MSw5NzUxMywxNzIxMzUsNTc4MjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sInZlcnNpb25SYW5nZSI6Ij49OC4xLjItMCA8OC4xLjMifSx7ImNvdW50cyI6WzE0NTIyMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sInZlcnNpb25SYW5nZSI6Ij49OC4xLjMtMCA8OC4xLjQifV0sIm5ld2VzdERhdGUiOiIyMDI1LTAxLTE5VDAwOjAwOjAwLjAwMCJ9';
0 commit comments