c3-rails 0.4.8 → 0.4.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/c3/rails/version.rb +1 -1
- data/vendor/assets/javascripts/c3.js +760 -510
- data/vendor/assets/stylesheets/c3.css +77 -136
- metadata +2 -2
@@ -3,9 +3,30 @@
|
|
3
3
|
|
4
4
|
/*global define, module, exports, require */
|
5
5
|
|
6
|
-
var c3 = { version: "0.4.
|
6
|
+
var c3 = { version: "0.4.10" };
|
7
7
|
|
8
|
-
var c3_chart_fn,
|
8
|
+
var c3_chart_fn,
|
9
|
+
c3_chart_internal_fn,
|
10
|
+
c3_chart_internal_axis_fn;
|
11
|
+
|
12
|
+
function API(owner) {
|
13
|
+
this.owner = owner;
|
14
|
+
}
|
15
|
+
|
16
|
+
function inherit(base, derived) {
|
17
|
+
|
18
|
+
if (Object.create) {
|
19
|
+
derived.prototype = Object.create(base.prototype);
|
20
|
+
} else {
|
21
|
+
var f = function f() {};
|
22
|
+
f.prototype = base.prototype;
|
23
|
+
derived.prototype = new f();
|
24
|
+
}
|
25
|
+
|
26
|
+
derived.prototype.constructor = derived;
|
27
|
+
|
28
|
+
return derived;
|
29
|
+
}
|
9
30
|
|
10
31
|
function Chart(config) {
|
11
32
|
var $$ = this.internal = new ChartInternal(this);
|
@@ -40,12 +61,15 @@
|
|
40
61
|
c3.chart = {
|
41
62
|
fn: Chart.prototype,
|
42
63
|
internal: {
|
43
|
-
fn: ChartInternal.prototype
|
64
|
+
fn: ChartInternal.prototype,
|
65
|
+
axis: {
|
66
|
+
fn: Axis.prototype
|
67
|
+
}
|
44
68
|
}
|
45
69
|
};
|
46
70
|
c3_chart_fn = c3.chart.fn;
|
47
71
|
c3_chart_internal_fn = c3.chart.internal.fn;
|
48
|
-
|
72
|
+
c3_chart_internal_axis_fn = c3.chart.internal.axis.fn;
|
49
73
|
|
50
74
|
c3_chart_internal_fn.init = function () {
|
51
75
|
var $$ = this, config = $$.config;
|
@@ -154,11 +178,21 @@
|
|
154
178
|
var $$ = this, d3 = $$.d3, config = $$.config;
|
155
179
|
var defs, main, binding = true;
|
156
180
|
|
181
|
+
$$.axis = new Axis($$);
|
182
|
+
|
157
183
|
if ($$.initPie) { $$.initPie(); }
|
158
184
|
if ($$.initBrush) { $$.initBrush(); }
|
159
185
|
if ($$.initZoom) { $$.initZoom(); }
|
160
186
|
|
161
|
-
|
187
|
+
if (!config.bindto) {
|
188
|
+
$$.selectChart = d3.selectAll([]);
|
189
|
+
}
|
190
|
+
else if (typeof config.bindto.node === 'function') {
|
191
|
+
$$.selectChart = config.bindto;
|
192
|
+
}
|
193
|
+
else {
|
194
|
+
$$.selectChart = d3.select(config.bindto);
|
195
|
+
}
|
162
196
|
if ($$.selectChart.empty()) {
|
163
197
|
$$.selectChart = d3.select(document.createElement('div')).style('opacity', 0);
|
164
198
|
$$.observeInserted($$.selectChart);
|
@@ -271,7 +305,7 @@
|
|
271
305
|
if (config.axis_x_extent) { $$.brush.extent($$.getDefaultExtent()); }
|
272
306
|
|
273
307
|
// Add Axis
|
274
|
-
$$.
|
308
|
+
$$.axis.init();
|
275
309
|
|
276
310
|
// Set targets
|
277
311
|
$$.updateTargets($$.data.targets);
|
@@ -281,6 +315,7 @@
|
|
281
315
|
$$.updateDimension();
|
282
316
|
$$.config.oninit.call($$);
|
283
317
|
$$.redraw({
|
318
|
+
withTransition: false,
|
284
319
|
withTransform: true,
|
285
320
|
withUpdateXDomain: true,
|
286
321
|
withUpdateOrgXDomain: true,
|
@@ -399,7 +434,7 @@
|
|
399
434
|
};
|
400
435
|
|
401
436
|
c3_chart_internal_fn.updateTargets = function (targets) {
|
402
|
-
var $$ = this
|
437
|
+
var $$ = this;
|
403
438
|
|
404
439
|
/*-- Main --*/
|
405
440
|
|
@@ -413,14 +448,19 @@
|
|
413
448
|
$$.updateTargetsForLine(targets);
|
414
449
|
|
415
450
|
//-- Arc --//
|
416
|
-
if ($$.updateTargetsForArc) { $$.updateTargetsForArc(targets); }
|
417
|
-
if ($$.updateTargetsForSubchart) { $$.updateTargetsForSubchart(targets); }
|
451
|
+
if ($$.hasArcType() && $$.updateTargetsForArc) { $$.updateTargetsForArc(targets); }
|
418
452
|
|
419
|
-
/*--
|
453
|
+
/*-- Sub --*/
|
454
|
+
|
455
|
+
if ($$.updateTargetsForSubchart) { $$.updateTargetsForSubchart(targets); }
|
420
456
|
|
421
457
|
// Fade-in each chart
|
458
|
+
$$.showTargets();
|
459
|
+
};
|
460
|
+
c3_chart_internal_fn.showTargets = function () {
|
461
|
+
var $$ = this;
|
422
462
|
$$.svg.selectAll('.' + CLASS.target).filter(function (d) { return $$.isTargetToShow(d.id); })
|
423
|
-
.transition().duration(config.transition_duration)
|
463
|
+
.transition().duration($$.config.transition_duration)
|
424
464
|
.style("opacity", 1);
|
425
465
|
};
|
426
466
|
|
@@ -456,7 +496,7 @@
|
|
456
496
|
durationForExit = withTransitionForExit ? duration : 0;
|
457
497
|
durationForAxis = withTransitionForAxis ? duration : 0;
|
458
498
|
|
459
|
-
transitions = transitions || $$.
|
499
|
+
transitions = transitions || $$.axis.generateTransitions(durationForAxis);
|
460
500
|
|
461
501
|
// update legend and transform each g
|
462
502
|
if (withLegend && config.legend_show) {
|
@@ -475,13 +515,7 @@
|
|
475
515
|
if (targetsToShow.length) {
|
476
516
|
$$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain);
|
477
517
|
if (!config.axis_x_tick_values) {
|
478
|
-
|
479
|
-
tickValues = $$.generateTickValues($$.mapTargetsToUniqueXs(targetsToShow), config.axis_x_tick_count, $$.isTimeSeries());
|
480
|
-
} else {
|
481
|
-
tickValues = undefined;
|
482
|
-
}
|
483
|
-
$$.xAxis.tickValues(tickValues);
|
484
|
-
$$.subXAxis.tickValues(tickValues);
|
518
|
+
tickValues = $$.axis.updateXAxisTickValues(targetsToShow);
|
485
519
|
}
|
486
520
|
} else {
|
487
521
|
$$.xAxis.tickValues([]);
|
@@ -496,17 +530,17 @@
|
|
496
530
|
$$.y2.domain($$.getYDomain(targetsToShow, 'y2', xDomainForZoom));
|
497
531
|
|
498
532
|
if (!config.axis_y_tick_values && config.axis_y_tick_count) {
|
499
|
-
$$.yAxis.tickValues($$.generateTickValues($$.y.domain(), config.axis_y_tick_count));
|
533
|
+
$$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count));
|
500
534
|
}
|
501
535
|
if (!config.axis_y2_tick_values && config.axis_y2_tick_count) {
|
502
|
-
$$.y2Axis.tickValues($$.generateTickValues($$.y2.domain(), config.axis_y2_tick_count));
|
536
|
+
$$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count));
|
503
537
|
}
|
504
538
|
|
505
539
|
// axes
|
506
|
-
$$.
|
540
|
+
$$.axis.redraw(transitions, hideAxis);
|
507
541
|
|
508
542
|
// Update axis label
|
509
|
-
$$.
|
543
|
+
$$.axis.updateLabels(withTransition);
|
510
544
|
|
511
545
|
// show/hide if manual culling needed
|
512
546
|
if ((withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) {
|
@@ -556,22 +590,22 @@
|
|
556
590
|
.style('opacity', targetsToShow.length ? 0 : 1);
|
557
591
|
|
558
592
|
// grid
|
559
|
-
$$.
|
593
|
+
$$.updateGrid(duration);
|
560
594
|
|
561
595
|
// rect for regions
|
562
|
-
$$.
|
596
|
+
$$.updateRegion(duration);
|
563
597
|
|
564
598
|
// bars
|
565
|
-
$$.
|
599
|
+
$$.updateBar(durationForExit);
|
566
600
|
|
567
601
|
// lines, areas and cricles
|
568
|
-
$$.
|
569
|
-
$$.
|
570
|
-
$$.
|
602
|
+
$$.updateLine(durationForExit);
|
603
|
+
$$.updateArea(durationForExit);
|
604
|
+
$$.updateCircle();
|
571
605
|
|
572
606
|
// text
|
573
607
|
if ($$.hasDataLabel()) {
|
574
|
-
$$.
|
608
|
+
$$.updateText(durationForExit);
|
575
609
|
}
|
576
610
|
|
577
611
|
// arc
|
@@ -601,40 +635,69 @@
|
|
601
635
|
cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$);
|
602
636
|
cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$);
|
603
637
|
|
604
|
-
|
605
|
-
|
606
|
-
|
638
|
+
if (options.flow) {
|
639
|
+
flow = $$.generateFlow({
|
640
|
+
targets: targetsToShow,
|
641
|
+
flow: options.flow,
|
642
|
+
duration: options.flow.duration,
|
643
|
+
drawBar: drawBar,
|
644
|
+
drawLine: drawLine,
|
645
|
+
drawArea: drawArea,
|
646
|
+
cx: cx,
|
647
|
+
cy: cy,
|
648
|
+
xv: xv,
|
649
|
+
xForText: xForText,
|
650
|
+
yForText: yForText
|
651
|
+
});
|
652
|
+
}
|
607
653
|
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
654
|
+
if ((duration || flow) && $$.isTabVisible()) { // Only use transition if tab visible. See #938.
|
655
|
+
// transition should be derived from one transition
|
656
|
+
d3.transition().duration(duration).each(function () {
|
657
|
+
var transitionsToWait = [];
|
658
|
+
|
659
|
+
// redraw and gather transitions
|
660
|
+
[
|
661
|
+
$$.redrawBar(drawBar, true),
|
662
|
+
$$.redrawLine(drawLine, true),
|
663
|
+
$$.redrawArea(drawArea, true),
|
664
|
+
$$.redrawCircle(cx, cy, true),
|
665
|
+
$$.redrawText(xForText, yForText, options.flow, true),
|
666
|
+
$$.redrawRegion(true),
|
667
|
+
$$.redrawGrid(true),
|
668
|
+
].forEach(function (transitions) {
|
669
|
+
transitions.forEach(function (transition) {
|
670
|
+
transitionsToWait.push(transition);
|
671
|
+
});
|
672
|
+
});
|
615
673
|
|
616
|
-
|
617
|
-
if (options.flow) {
|
674
|
+
// Wait for end of transitions to call flow and onrendered callback
|
618
675
|
waitForDraw = $$.generateWait();
|
619
|
-
|
676
|
+
transitionsToWait.forEach(function (t) {
|
620
677
|
waitForDraw.add(t);
|
621
678
|
});
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
679
|
+
})
|
680
|
+
.call(waitForDraw, function () {
|
681
|
+
if (flow) {
|
682
|
+
flow();
|
683
|
+
}
|
684
|
+
if (config.onrendered) {
|
685
|
+
config.onrendered.call($$);
|
686
|
+
}
|
687
|
+
});
|
688
|
+
}
|
689
|
+
else {
|
690
|
+
$$.redrawBar(drawBar);
|
691
|
+
$$.redrawLine(drawLine);
|
692
|
+
$$.redrawArea(drawArea);
|
693
|
+
$$.redrawCircle(cx, cy);
|
694
|
+
$$.redrawText(xForText, yForText, options.flow);
|
695
|
+
$$.redrawRegion();
|
696
|
+
$$.redrawGrid();
|
697
|
+
if (config.onrendered) {
|
698
|
+
config.onrendered.call($$);
|
635
699
|
}
|
636
|
-
}
|
637
|
-
.call(waitForDraw || function () {}, flow || function () {});
|
700
|
+
}
|
638
701
|
|
639
702
|
// update fadein condition
|
640
703
|
$$.mapToIds($$.data.targets).forEach(function (id) {
|
@@ -658,7 +721,7 @@
|
|
658
721
|
$$.updateSizes();
|
659
722
|
// MEMO: called in updateLegend in redraw if withLegend
|
660
723
|
if (!(options.withLegend && config.legend_show)) {
|
661
|
-
transitions = $$.
|
724
|
+
transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0);
|
662
725
|
// Update scales
|
663
726
|
$$.updateScales();
|
664
727
|
$$.updateSvgSize();
|
@@ -836,7 +899,12 @@
|
|
836
899
|
};
|
837
900
|
|
838
901
|
c3_chart_internal_fn.observeInserted = function (selection) {
|
839
|
-
var $$ = this, observer
|
902
|
+
var $$ = this, observer;
|
903
|
+
if (typeof MutationObserver === 'undefined') {
|
904
|
+
window.console.error("MutationObserver not defined.");
|
905
|
+
return;
|
906
|
+
}
|
907
|
+
observer= new MutationObserver(function (mutations) {
|
840
908
|
mutations.forEach(function (mutation) {
|
841
909
|
if (mutation.type === 'childList' && mutation.previousSibling) {
|
842
910
|
observer.disconnect();
|
@@ -918,10 +986,10 @@
|
|
918
986
|
var $$ = this, parsedDate;
|
919
987
|
if (date instanceof Date) {
|
920
988
|
parsedDate = date;
|
989
|
+
} else if (typeof date === 'string') {
|
990
|
+
parsedDate = $$.dataTimeFormat($$.config.data_xFormat).parse(date);
|
921
991
|
} else if (typeof date === 'number' || !isNaN(date)) {
|
922
992
|
parsedDate = new Date(+date);
|
923
|
-
} else {
|
924
|
-
parsedDate = $$.dataTimeFormat($$.config.data_xFormat).parse(date);
|
925
993
|
}
|
926
994
|
if (!parsedDate || isNaN(+parsedDate)) {
|
927
995
|
window.console.error("Failed to parse x '" + date + "' to Date object");
|
@@ -929,6 +997,21 @@
|
|
929
997
|
return parsedDate;
|
930
998
|
};
|
931
999
|
|
1000
|
+
c3_chart_internal_fn.isTabVisible = function () {
|
1001
|
+
var hidden;
|
1002
|
+
if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support
|
1003
|
+
hidden = "hidden";
|
1004
|
+
} else if (typeof document.mozHidden !== "undefined") {
|
1005
|
+
hidden = "mozHidden";
|
1006
|
+
} else if (typeof document.msHidden !== "undefined") {
|
1007
|
+
hidden = "msHidden";
|
1008
|
+
} else if (typeof document.webkitHidden !== "undefined") {
|
1009
|
+
hidden = "webkitHidden";
|
1010
|
+
}
|
1011
|
+
|
1012
|
+
return document[hidden] ? false : true;
|
1013
|
+
};
|
1014
|
+
|
932
1015
|
c3_chart_internal_fn.getDefaultConfig = function () {
|
933
1016
|
var config = {
|
934
1017
|
bindto: '#chart',
|
@@ -951,6 +1034,7 @@
|
|
951
1034
|
onresize: function () {},
|
952
1035
|
onresized: function () {},
|
953
1036
|
oninit: function () {},
|
1037
|
+
onrendered: function () {},
|
954
1038
|
transition_duration: 350,
|
955
1039
|
data_x: undefined,
|
956
1040
|
data_xs: {},
|
@@ -975,13 +1059,12 @@
|
|
975
1059
|
data_selection_grouped: false,
|
976
1060
|
data_selection_isselectable: function () { return true; },
|
977
1061
|
data_selection_multiple: true,
|
1062
|
+
data_selection_draggable: false,
|
978
1063
|
data_onclick: function () {},
|
979
1064
|
data_onmouseover: function () {},
|
980
1065
|
data_onmouseout: function () {},
|
981
1066
|
data_onselected: function () {},
|
982
1067
|
data_onunselected: function () {},
|
983
|
-
data_ondragstart: function () {},
|
984
|
-
data_ondragend: function () {},
|
985
1068
|
data_url: undefined,
|
986
1069
|
data_json: undefined,
|
987
1070
|
data_rows: undefined,
|
@@ -1036,6 +1119,7 @@
|
|
1036
1119
|
axis_y_type: undefined,
|
1037
1120
|
axis_y_max: undefined,
|
1038
1121
|
axis_y_min: undefined,
|
1122
|
+
axis_y_inverted: false,
|
1039
1123
|
axis_y_center: undefined,
|
1040
1124
|
axis_y_inner: undefined,
|
1041
1125
|
axis_y_label: {},
|
@@ -1050,6 +1134,7 @@
|
|
1050
1134
|
axis_y2_show: false,
|
1051
1135
|
axis_y2_max: undefined,
|
1052
1136
|
axis_y2_min: undefined,
|
1137
|
+
axis_y2_inverted: false,
|
1053
1138
|
axis_y2_center: undefined,
|
1054
1139
|
axis_y2_inner: undefined,
|
1055
1140
|
axis_y2_label: {},
|
@@ -1114,6 +1199,7 @@
|
|
1114
1199
|
tooltip_format_title: undefined,
|
1115
1200
|
tooltip_format_name: undefined,
|
1116
1201
|
tooltip_format_value: undefined,
|
1202
|
+
tooltip_position: undefined,
|
1117
1203
|
tooltip_contents: function (d, defaultTitleFormat, defaultValueFormat, color) {
|
1118
1204
|
return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : '';
|
1119
1205
|
},
|
@@ -1203,10 +1289,10 @@
|
|
1203
1289
|
return scale;
|
1204
1290
|
};
|
1205
1291
|
c3_chart_internal_fn.getYScale = function (id) {
|
1206
|
-
return this.
|
1292
|
+
return this.axis.getId(id) === 'y2' ? this.y2 : this.y;
|
1207
1293
|
};
|
1208
1294
|
c3_chart_internal_fn.getSubYScale = function (id) {
|
1209
|
-
return this.
|
1295
|
+
return this.axis.getId(id) === 'y2' ? this.subY2 : this.subY;
|
1210
1296
|
};
|
1211
1297
|
c3_chart_internal_fn.updateScales = function () {
|
1212
1298
|
var $$ = this, config = $$.config,
|
@@ -1228,15 +1314,15 @@
|
|
1228
1314
|
$$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain());
|
1229
1315
|
$$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain());
|
1230
1316
|
// update axes
|
1231
|
-
$$.xAxisTickFormat = $$.getXAxisTickFormat();
|
1232
|
-
$$.xAxisTickValues = $$.getXAxisTickValues();
|
1233
|
-
$$.yAxisTickValues = $$.getYAxisTickValues();
|
1234
|
-
$$.y2AxisTickValues = $$.getY2AxisTickValues();
|
1317
|
+
$$.xAxisTickFormat = $$.axis.getXAxisTickFormat();
|
1318
|
+
$$.xAxisTickValues = $$.axis.getXAxisTickValues();
|
1319
|
+
$$.yAxisTickValues = $$.axis.getYAxisTickValues();
|
1320
|
+
$$.y2AxisTickValues = $$.axis.getY2AxisTickValues();
|
1235
1321
|
|
1236
|
-
$$.xAxis = $$.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);
|
1237
|
-
$$.subXAxis = $$.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);
|
1238
|
-
$$.yAxis = $$.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, config.axis_y_tick_outer);
|
1239
|
-
$$.y2Axis = $$.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, config.axis_y2_tick_outer);
|
1322
|
+
$$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);
|
1323
|
+
$$.subXAxis = $$.axis.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);
|
1324
|
+
$$.yAxis = $$.axis.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, config.axis_y_tick_outer);
|
1325
|
+
$$.y2Axis = $$.axis.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, config.axis_y2_tick_outer);
|
1240
1326
|
|
1241
1327
|
// Set initialized scales to brush and zoom
|
1242
1328
|
if (!forInit) {
|
@@ -1269,7 +1355,7 @@
|
|
1269
1355
|
id = idsInGroup[k];
|
1270
1356
|
if (! ys[id]) { continue; }
|
1271
1357
|
ys[id].forEach(function (v, i) {
|
1272
|
-
if ($$.
|
1358
|
+
if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0)) {
|
1273
1359
|
ys[baseId][i] += +v;
|
1274
1360
|
}
|
1275
1361
|
});
|
@@ -1300,7 +1386,7 @@
|
|
1300
1386
|
id = idsInGroup[k];
|
1301
1387
|
if (! ys[id]) { continue; }
|
1302
1388
|
ys[id].forEach(function (v, i) {
|
1303
|
-
if ($$.
|
1389
|
+
if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0)) {
|
1304
1390
|
ys[baseId][i] += +v;
|
1305
1391
|
}
|
1306
1392
|
});
|
@@ -1311,26 +1397,23 @@
|
|
1311
1397
|
};
|
1312
1398
|
c3_chart_internal_fn.getYDomain = function (targets, axisId, xDomain) {
|
1313
1399
|
var $$ = this, config = $$.config,
|
1314
|
-
targetsByAxisId = targets.filter(function (t) { return $$.
|
1400
|
+
targetsByAxisId = targets.filter(function (t) { return $$.axis.getId(t.id) === axisId; }),
|
1315
1401
|
yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId,
|
1316
1402
|
yMin = axisId === 'y2' ? config.axis_y2_min : config.axis_y_min,
|
1317
1403
|
yMax = axisId === 'y2' ? config.axis_y2_max : config.axis_y_max,
|
1318
|
-
yDomainMin =
|
1319
|
-
yDomainMax =
|
1320
|
-
domainLength, padding, padding_top, padding_bottom,
|
1404
|
+
yDomainMin = $$.getYDomainMin(yTargets),
|
1405
|
+
yDomainMax = $$.getYDomainMax(yTargets),
|
1406
|
+
domain, domainLength, padding, padding_top, padding_bottom,
|
1321
1407
|
center = axisId === 'y2' ? config.axis_y2_center : config.axis_y_center,
|
1322
1408
|
yDomainAbs, lengths, diff, ratio, isAllPositive, isAllNegative,
|
1323
1409
|
isZeroBased = ($$.hasType('bar', yTargets) && config.bar_zerobased) || ($$.hasType('area', yTargets) && config.area_zerobased),
|
1410
|
+
isInverted = axisId === 'y2' ? config.axis_y2_inverted : config.axis_y_inverted,
|
1324
1411
|
showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated,
|
1325
1412
|
showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated;
|
1326
1413
|
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
} else {
|
1331
|
-
yDomainMin = yDomainMax - 10; // TODO: introduce axis.y.minMax
|
1332
|
-
}
|
1333
|
-
}
|
1414
|
+
// MEMO: avoid inverting domain unexpectedly
|
1415
|
+
yDomainMin = isValue(yMin) ? yMin : isValue(yMax) ? (yDomainMin < yMax ? yDomainMin : yMax - 10) : yDomainMin;
|
1416
|
+
yDomainMax = isValue(yMax) ? yMax : isValue(yMin) ? (yMin < yDomainMax ? yDomainMax : yMin + 10) : yDomainMax;
|
1334
1417
|
|
1335
1418
|
if (yTargets.length === 0) { // use current domain if target of axisId is none
|
1336
1419
|
return axisId === 'y2' ? $$.y2.domain() : $$.y.domain();
|
@@ -1368,30 +1451,31 @@
|
|
1368
1451
|
}
|
1369
1452
|
// add padding for data label
|
1370
1453
|
if (showHorizontalDataLabel) {
|
1371
|
-
lengths = $$.getDataLabelLength(yDomainMin, yDomainMax,
|
1454
|
+
lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'width');
|
1372
1455
|
diff = diffDomain($$.y.range());
|
1373
1456
|
ratio = [lengths[0] / diff, lengths[1] / diff];
|
1374
1457
|
padding_top += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1]));
|
1375
1458
|
padding_bottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1]));
|
1376
1459
|
} else if (showVerticalDataLabel) {
|
1377
|
-
lengths = $$.getDataLabelLength(yDomainMin, yDomainMax,
|
1378
|
-
padding_top +=
|
1379
|
-
padding_bottom +=
|
1460
|
+
lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'height');
|
1461
|
+
padding_top += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength);
|
1462
|
+
padding_bottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength);
|
1380
1463
|
}
|
1381
1464
|
if (axisId === 'y' && notEmpty(config.axis_y_padding)) {
|
1382
|
-
padding_top = $$.
|
1383
|
-
padding_bottom = $$.
|
1465
|
+
padding_top = $$.axis.getPadding(config.axis_y_padding, 'top', padding_top, domainLength);
|
1466
|
+
padding_bottom = $$.axis.getPadding(config.axis_y_padding, 'bottom', padding_bottom, domainLength);
|
1384
1467
|
}
|
1385
1468
|
if (axisId === 'y2' && notEmpty(config.axis_y2_padding)) {
|
1386
|
-
padding_top = $$.
|
1387
|
-
padding_bottom = $$.
|
1469
|
+
padding_top = $$.axis.getPadding(config.axis_y2_padding, 'top', padding_top, domainLength);
|
1470
|
+
padding_bottom = $$.axis.getPadding(config.axis_y2_padding, 'bottom', padding_bottom, domainLength);
|
1388
1471
|
}
|
1389
1472
|
// Bar/Area chart should be 0-based if all positive|negative
|
1390
1473
|
if (isZeroBased) {
|
1391
1474
|
if (isAllPositive) { padding_bottom = yDomainMin; }
|
1392
1475
|
if (isAllNegative) { padding_top = -yDomainMax; }
|
1393
1476
|
}
|
1394
|
-
|
1477
|
+
domain = [yDomainMin - padding_bottom, yDomainMax + padding_top];
|
1478
|
+
return isInverted ? domain.reverse() : domain;
|
1395
1479
|
};
|
1396
1480
|
c3_chart_internal_fn.getXDomainMin = function (targets) {
|
1397
1481
|
var $$ = this, config = $$.config;
|
@@ -1747,13 +1831,13 @@
|
|
1747
1831
|
}
|
1748
1832
|
return false;
|
1749
1833
|
};
|
1750
|
-
c3_chart_internal_fn.getDataLabelLength = function (min, max,
|
1834
|
+
c3_chart_internal_fn.getDataLabelLength = function (min, max, key) {
|
1751
1835
|
var $$ = this,
|
1752
1836
|
lengths = [0, 0], paddingCoef = 1.3;
|
1753
1837
|
$$.selectChart.select('svg').selectAll('.dummy')
|
1754
1838
|
.data([min, max])
|
1755
1839
|
.enter().append('text')
|
1756
|
-
.text(function (d) { return $$.
|
1840
|
+
.text(function (d) { return $$.dataLabelFormat(d.id)(d); })
|
1757
1841
|
.each(function (d, i) {
|
1758
1842
|
lengths[i] = this.getBoundingClientRect()[key] * paddingCoef;
|
1759
1843
|
})
|
@@ -1858,6 +1942,9 @@
|
|
1858
1942
|
var $$ = this, type = mimeType ? mimeType : 'csv';
|
1859
1943
|
$$.d3.xhr(url, function (error, data) {
|
1860
1944
|
var d;
|
1945
|
+
if (!data) {
|
1946
|
+
throw new Error(error.responseURL + ' ' + error.status + ' (' + error.statusText + ')');
|
1947
|
+
}
|
1861
1948
|
if (type === 'json') {
|
1862
1949
|
d = $$.convertJsonToData(JSON.parse(data.response), keys);
|
1863
1950
|
} else if (type === 'tsv') {
|
@@ -1890,10 +1977,11 @@
|
|
1890
1977
|
var $$ = this,
|
1891
1978
|
new_rows = [], targetKeys, data;
|
1892
1979
|
if (keys) { // when keys specified, json would be an array that includes objects
|
1893
|
-
targetKeys = keys.value;
|
1894
1980
|
if (keys.x) {
|
1895
|
-
targetKeys.
|
1981
|
+
targetKeys = keys.value.concat(keys.x);
|
1896
1982
|
$$.config.data_x = keys.x;
|
1983
|
+
} else {
|
1984
|
+
targetKeys = keys.value;
|
1897
1985
|
}
|
1898
1986
|
new_rows.push(targetKeys);
|
1899
1987
|
json.forEach(function (o) {
|
@@ -2052,7 +2140,8 @@
|
|
2052
2140
|
// set type if args.types || args.type specified
|
2053
2141
|
if (args.type || args.types) {
|
2054
2142
|
targets.forEach(function (t) {
|
2055
|
-
|
2143
|
+
var type = args.types && args.types[t.id] ? args.types[t.id] : args.type;
|
2144
|
+
$$.setTargetType(t.id, type);
|
2056
2145
|
});
|
2057
2146
|
}
|
2058
2147
|
// Update/Add data
|
@@ -2251,28 +2340,11 @@
|
|
2251
2340
|
.attr("class", $$.classEvent.bind($$))
|
2252
2341
|
.style("cursor", config.data_selection_enabled && config.data_selection_grouped ? "pointer" : null)
|
2253
2342
|
.on('mouseover', function (d) {
|
2254
|
-
var index = d.index
|
2343
|
+
var index = d.index;
|
2255
2344
|
|
2256
2345
|
if ($$.dragging || $$.flowing) { return; } // do nothing while dragging/flowing
|
2257
2346
|
if ($$.hasArcType()) { return; }
|
2258
2347
|
|
2259
|
-
selectedData = $$.data.targets.map(function (t) {
|
2260
|
-
return $$.addName($$.getValueOnIndex(t.values, index));
|
2261
|
-
});
|
2262
|
-
|
2263
|
-
// Sort selectedData as names order
|
2264
|
-
newData = [];
|
2265
|
-
Object.keys(config.data_names).forEach(function (id) {
|
2266
|
-
for (var j = 0; j < selectedData.length; j++) {
|
2267
|
-
if (selectedData[j] && selectedData[j].id === id) {
|
2268
|
-
newData.push(selectedData[j]);
|
2269
|
-
selectedData.shift(j);
|
2270
|
-
break;
|
2271
|
-
}
|
2272
|
-
}
|
2273
|
-
});
|
2274
|
-
selectedData = newData.concat(selectedData); // Add remained
|
2275
|
-
|
2276
2348
|
// Expand shapes for selection
|
2277
2349
|
if (config.point_focus_expand_enabled) { $$.expandCircles(index, null, true); }
|
2278
2350
|
$$.expandBars(index, null, true);
|
@@ -2284,6 +2356,7 @@
|
|
2284
2356
|
})
|
2285
2357
|
.on('mouseout', function (d) {
|
2286
2358
|
var index = d.index;
|
2359
|
+
if (!$$.config) { return; } // chart is destroyed
|
2287
2360
|
if ($$.hasArcType()) { return; }
|
2288
2361
|
$$.hideXGridFocus();
|
2289
2362
|
$$.hideTooltip();
|
@@ -2312,7 +2385,7 @@
|
|
2312
2385
|
});
|
2313
2386
|
|
2314
2387
|
if (config.tooltip_grouped) {
|
2315
|
-
$$.showTooltip(selectedData,
|
2388
|
+
$$.showTooltip(selectedData, this);
|
2316
2389
|
$$.showXGridFocus(selectedData);
|
2317
2390
|
}
|
2318
2391
|
|
@@ -2343,7 +2416,7 @@
|
|
2343
2416
|
eventRect.style('cursor', 'pointer');
|
2344
2417
|
}
|
2345
2418
|
if (!config.tooltip_grouped) {
|
2346
|
-
$$.showTooltip([d],
|
2419
|
+
$$.showTooltip([d], this);
|
2347
2420
|
$$.showXGridFocus([d]);
|
2348
2421
|
if (config.point_focus_expand_enabled) { $$.expandCircles(index, d.id, true); }
|
2349
2422
|
$$.expandBars(index, d.id, true);
|
@@ -2368,10 +2441,12 @@
|
|
2368
2441
|
});
|
2369
2442
|
})
|
2370
2443
|
.call(
|
2371
|
-
|
2372
|
-
.
|
2373
|
-
|
2374
|
-
|
2444
|
+
config.data_selection_draggable && $$.drag ? (
|
2445
|
+
d3.behavior.drag().origin(Object)
|
2446
|
+
.on('drag', function () { $$.drag(d3.mouse(this)); })
|
2447
|
+
.on('dragstart', function () { $$.dragstart(d3.mouse(this)); })
|
2448
|
+
.on('dragend', function () { $$.dragend(); })
|
2449
|
+
) : function () {}
|
2375
2450
|
);
|
2376
2451
|
};
|
2377
2452
|
|
@@ -2393,6 +2468,7 @@
|
|
2393
2468
|
.attr('height', $$.height)
|
2394
2469
|
.attr('class', CLASS.eventRect)
|
2395
2470
|
.on('mouseout', function () {
|
2471
|
+
if (!$$.config) { return; } // chart is destroyed
|
2396
2472
|
if ($$.hasArcType()) { return; }
|
2397
2473
|
mouseout();
|
2398
2474
|
})
|
@@ -2426,7 +2502,7 @@
|
|
2426
2502
|
selectedData = sameXData.map(function (d) {
|
2427
2503
|
return $$.addName(d);
|
2428
2504
|
});
|
2429
|
-
$$.showTooltip(selectedData,
|
2505
|
+
$$.showTooltip(selectedData, this);
|
2430
2506
|
|
2431
2507
|
// expand points
|
2432
2508
|
if (config.point_focus_expand_enabled) {
|
@@ -2459,7 +2535,7 @@
|
|
2459
2535
|
|
2460
2536
|
// select if selection enabled
|
2461
2537
|
if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < 100) {
|
2462
|
-
$$.main.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(closest.id)).
|
2538
|
+
$$.main.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(closest.id)).selectAll('.' + CLASS.shape + '-' + closest.index).each(function () {
|
2463
2539
|
if (config.data_selection_grouped || $$.isWithinShape(this, closest)) {
|
2464
2540
|
$$.toggleShape(this, closest, closest.index);
|
2465
2541
|
$$.config.data_onclick.call($$.api, closest, this);
|
@@ -2468,10 +2544,12 @@
|
|
2468
2544
|
}
|
2469
2545
|
})
|
2470
2546
|
.call(
|
2471
|
-
|
2472
|
-
.
|
2473
|
-
|
2474
|
-
|
2547
|
+
config.data_selection_draggable && $$.drag ? (
|
2548
|
+
d3.behavior.drag().origin(Object)
|
2549
|
+
.on('drag', function () { $$.drag(d3.mouse(this)); })
|
2550
|
+
.on('dragstart', function () { $$.dragstart(d3.mouse(this)); })
|
2551
|
+
.on('dragend', function () { $$.dragend(); })
|
2552
|
+
) : function () {}
|
2475
2553
|
);
|
2476
2554
|
};
|
2477
2555
|
c3_chart_internal_fn.dispatchEvent = function (type, index, mouse) {
|
@@ -2512,7 +2590,7 @@
|
|
2512
2590
|
} else if (config.axis_rotated) {
|
2513
2591
|
return !config.axis_x_show ? 1 : Math.max(ceil10($$.getAxisWidthByAxisId('x', withoutRecompute)), 40);
|
2514
2592
|
} else if (!config.axis_y_show || config.axis_y_inner) { // && !config.axis_rotated
|
2515
|
-
return $$.getYAxisLabelPosition().isOuter ? 30 : 1;
|
2593
|
+
return $$.axis.getYAxisLabelPosition().isOuter ? 30 : 1;
|
2516
2594
|
} else {
|
2517
2595
|
return ceil10($$.getAxisWidthByAxisId('y', withoutRecompute));
|
2518
2596
|
}
|
@@ -2525,7 +2603,7 @@
|
|
2525
2603
|
} else if (config.axis_rotated) {
|
2526
2604
|
return defaultPadding + legendWidthOnRight;
|
2527
2605
|
} else if (!config.axis_y2_show || config.axis_y2_inner) { // && !config.axis_rotated
|
2528
|
-
return 2 + legendWidthOnRight + ($$.getY2AxisLabelPosition().isOuter ? 20 : 0);
|
2606
|
+
return 2 + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 : 0);
|
2529
2607
|
} else {
|
2530
2608
|
return ceil10($$.getAxisWidthByAxisId('y2')) + legendWidthOnRight;
|
2531
2609
|
}
|
@@ -2534,7 +2612,15 @@
|
|
2534
2612
|
c3_chart_internal_fn.getParentRectValue = function (key) {
|
2535
2613
|
var parent = this.selectChart.node(), v;
|
2536
2614
|
while (parent && parent.tagName !== 'BODY') {
|
2537
|
-
|
2615
|
+
try {
|
2616
|
+
v = parent.getBoundingClientRect()[key];
|
2617
|
+
} catch(e) {
|
2618
|
+
if (key === 'width') {
|
2619
|
+
// In IE in certain cases getBoundingClientRect
|
2620
|
+
// will cause an "unspecified error"
|
2621
|
+
v = parent.offsetWidth;
|
2622
|
+
}
|
2623
|
+
}
|
2538
2624
|
if (v) {
|
2539
2625
|
break;
|
2540
2626
|
}
|
@@ -2565,8 +2651,8 @@
|
|
2565
2651
|
|
2566
2652
|
|
2567
2653
|
c3_chart_internal_fn.getAxisWidthByAxisId = function (id, withoutRecompute) {
|
2568
|
-
var $$ = this, position = $$.
|
2569
|
-
return $$.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40);
|
2654
|
+
var $$ = this, position = $$.axis.getLabelPositionById(id);
|
2655
|
+
return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40);
|
2570
2656
|
};
|
2571
2657
|
c3_chart_internal_fn.getHorizontalAxisHeight = function (axisId) {
|
2572
2658
|
var $$ = this, config = $$.config, h = 30;
|
@@ -2576,27 +2662,13 @@
|
|
2576
2662
|
if (axisId === 'y2' && !config.axis_y2_show) { return $$.rotated_padding_top; }
|
2577
2663
|
// Calculate x axis height when tick rotated
|
2578
2664
|
if (axisId === 'x' && !config.axis_rotated && config.axis_x_tick_rotate) {
|
2579
|
-
h = $$.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180);
|
2665
|
+
h = 30 + $$.axis.getMaxTickWidth(axisId) * Math.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180);
|
2580
2666
|
}
|
2581
|
-
return h + ($$.
|
2667
|
+
return h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 10) + (axisId === 'y2' ? -10 : 0);
|
2582
2668
|
};
|
2583
2669
|
|
2584
2670
|
c3_chart_internal_fn.getEventRectWidth = function () {
|
2585
|
-
|
2586
|
-
var target = $$.getMaxDataCountTarget($$.data.targets),
|
2587
|
-
firstData, lastData, base, maxDataCount, ratio, w;
|
2588
|
-
if (!target) {
|
2589
|
-
return 0;
|
2590
|
-
}
|
2591
|
-
firstData = target.values[0], lastData = target.values[target.values.length - 1];
|
2592
|
-
base = $$.x(lastData.x) - $$.x(firstData.x);
|
2593
|
-
if (base === 0) {
|
2594
|
-
return $$.config.axis_rotated ? $$.height : $$.width;
|
2595
|
-
}
|
2596
|
-
maxDataCount = $$.getMaxDataCount();
|
2597
|
-
ratio = ($$.hasType('bar') ? (maxDataCount - ($$.isCategorized() ? 0.25 : 1)) / maxDataCount : 1);
|
2598
|
-
w = maxDataCount > 1 ? (base * ratio) / (maxDataCount - 1) : base;
|
2599
|
-
return w < 1 ? 1 : w;
|
2671
|
+
return Math.max(0, this.xAxis.tickInterval());
|
2600
2672
|
};
|
2601
2673
|
|
2602
2674
|
c3_chart_internal_fn.getShapeIndices = function (typeFilter) {
|
@@ -2712,7 +2784,7 @@
|
|
2712
2784
|
// MEMO: can not keep same color...
|
2713
2785
|
//mainLineUpdate.exit().remove();
|
2714
2786
|
};
|
2715
|
-
c3_chart_internal_fn.
|
2787
|
+
c3_chart_internal_fn.updateLine = function (durationForExit) {
|
2716
2788
|
var $$ = this;
|
2717
2789
|
$$.mainLine = $$.main.selectAll('.' + CLASS.lines).selectAll('.' + CLASS.line)
|
2718
2790
|
.data($$.lineData.bind($$));
|
@@ -2727,12 +2799,13 @@
|
|
2727
2799
|
.style('opacity', 0)
|
2728
2800
|
.remove();
|
2729
2801
|
};
|
2730
|
-
c3_chart_internal_fn.
|
2731
|
-
|
2732
|
-
|
2733
|
-
|
2734
|
-
|
2735
|
-
|
2802
|
+
c3_chart_internal_fn.redrawLine = function (drawLine, withTransition) {
|
2803
|
+
return [
|
2804
|
+
(withTransition ? this.mainLine.transition() : this.mainLine)
|
2805
|
+
.attr("d", drawLine)
|
2806
|
+
.style("stroke", this.color)
|
2807
|
+
.style("opacity", 1)
|
2808
|
+
];
|
2736
2809
|
};
|
2737
2810
|
c3_chart_internal_fn.generateDrawLine = function (lineIndices, isSub) {
|
2738
2811
|
var $$ = this, config = $$.config,
|
@@ -2797,6 +2870,7 @@
|
|
2797
2870
|
prev = -1, i, j,
|
2798
2871
|
s = "M", sWithRegion,
|
2799
2872
|
xp, yp, dx, dy, dd, diff, diffx2,
|
2873
|
+
xOffset = $$.isCategorized() ? 0.5 : 0,
|
2800
2874
|
xValue, yValue,
|
2801
2875
|
regions = [];
|
2802
2876
|
|
@@ -2830,16 +2904,31 @@
|
|
2830
2904
|
yValue = config.axis_rotated ? function (d) { return x(d.x); } : function (d) { return y(d.value); };
|
2831
2905
|
|
2832
2906
|
// Define svg generator function for region
|
2907
|
+
function generateM(points) {
|
2908
|
+
return 'M' + points[0][0] + ' ' + points[0][1] + ' ' + points[1][0] + ' ' + points[1][1];
|
2909
|
+
}
|
2833
2910
|
if ($$.isTimeSeries()) {
|
2834
2911
|
sWithRegion = function (d0, d1, j, diff) {
|
2835
2912
|
var x0 = d0.x.getTime(), x_diff = d1.x - d0.x,
|
2836
2913
|
xv0 = new Date(x0 + x_diff * j),
|
2837
|
-
xv1 = new Date(x0 + x_diff * (j + diff))
|
2838
|
-
|
2914
|
+
xv1 = new Date(x0 + x_diff * (j + diff)),
|
2915
|
+
points;
|
2916
|
+
if (config.axis_rotated) {
|
2917
|
+
points = [[y(yp(j)), x(xv0)], [y(yp(j + diff)), x(xv1)]];
|
2918
|
+
} else {
|
2919
|
+
points = [[x(xv0), y(yp(j))], [x(xv1), y(yp(j + diff))]];
|
2920
|
+
}
|
2921
|
+
return generateM(points);
|
2839
2922
|
};
|
2840
2923
|
} else {
|
2841
2924
|
sWithRegion = function (d0, d1, j, diff) {
|
2842
|
-
|
2925
|
+
var points;
|
2926
|
+
if (config.axis_rotated) {
|
2927
|
+
points = [[y(yp(j), true), x(xp(j))], [y(yp(j + diff), true), x(xp(j + diff))]];
|
2928
|
+
} else {
|
2929
|
+
points = [[x(xp(j), true), y(yp(j))], [x(xp(j + diff), true), y(yp(j + diff))]];
|
2930
|
+
}
|
2931
|
+
return generateM(points);
|
2843
2932
|
};
|
2844
2933
|
}
|
2845
2934
|
|
@@ -2852,7 +2941,7 @@
|
|
2852
2941
|
}
|
2853
2942
|
// Draw with region // TODO: Fix for horizotal charts
|
2854
2943
|
else {
|
2855
|
-
xp = $$.getScale(d[i - 1].x, d[i].x, $$.isTimeSeries());
|
2944
|
+
xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries());
|
2856
2945
|
yp = $$.getScale(d[i - 1].value, d[i].value);
|
2857
2946
|
|
2858
2947
|
dx = x(d[i].x) - x(d[i - 1].x);
|
@@ -2872,7 +2961,7 @@
|
|
2872
2961
|
};
|
2873
2962
|
|
2874
2963
|
|
2875
|
-
c3_chart_internal_fn.
|
2964
|
+
c3_chart_internal_fn.updateArea = function (durationForExit) {
|
2876
2965
|
var $$ = this, d3 = $$.d3;
|
2877
2966
|
$$.mainArea = $$.main.selectAll('.' + CLASS.areas).selectAll('.' + CLASS.area)
|
2878
2967
|
.data($$.lineData.bind($$));
|
@@ -2886,12 +2975,13 @@
|
|
2886
2975
|
.style('opacity', 0)
|
2887
2976
|
.remove();
|
2888
2977
|
};
|
2889
|
-
c3_chart_internal_fn.
|
2890
|
-
|
2891
|
-
|
2892
|
-
|
2893
|
-
|
2894
|
-
|
2978
|
+
c3_chart_internal_fn.redrawArea = function (drawArea, withTransition) {
|
2979
|
+
return [
|
2980
|
+
(withTransition ? this.mainArea.transition() : this.mainArea)
|
2981
|
+
.attr("d", drawArea)
|
2982
|
+
.style("fill", this.color)
|
2983
|
+
.style("opacity", this.orgAreaOpacity)
|
2984
|
+
];
|
2895
2985
|
};
|
2896
2986
|
c3_chart_internal_fn.generateDrawArea = function (areaIndices, isSub) {
|
2897
2987
|
var $$ = this, config = $$.config, area = $$.d3.svg.area(),
|
@@ -2899,7 +2989,7 @@
|
|
2899
2989
|
yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,
|
2900
2990
|
xValue = function (d) { return (isSub ? $$.subxx : $$.xx).call($$, d); },
|
2901
2991
|
value0 = function (d, i) {
|
2902
|
-
return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(
|
2992
|
+
return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id));
|
2903
2993
|
},
|
2904
2994
|
value1 = function (d, i) {
|
2905
2995
|
return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value);
|
@@ -2926,7 +3016,9 @@
|
|
2926
3016
|
return path ? path : "M 0 0";
|
2927
3017
|
};
|
2928
3018
|
};
|
2929
|
-
|
3019
|
+
c3_chart_internal_fn.getAreaBaseValue = function () {
|
3020
|
+
return 0;
|
3021
|
+
};
|
2930
3022
|
c3_chart_internal_fn.generateGetAreaPoints = function (areaIndices, isSub) { // partial duplication of generateGetBarPoints
|
2931
3023
|
var $$ = this, config = $$.config,
|
2932
3024
|
areaTargetsNum = areaIndices.__max__ + 1,
|
@@ -2953,7 +3045,7 @@
|
|
2953
3045
|
};
|
2954
3046
|
|
2955
3047
|
|
2956
|
-
c3_chart_internal_fn.
|
3048
|
+
c3_chart_internal_fn.updateCircle = function () {
|
2957
3049
|
var $$ = this;
|
2958
3050
|
$$.mainCircle = $$.main.selectAll('.' + CLASS.circles).selectAll('.' + CLASS.circle)
|
2959
3051
|
.data($$.lineOrScatterData.bind($$));
|
@@ -2965,16 +3057,18 @@
|
|
2965
3057
|
.style("opacity", $$.initialOpacityForCircle.bind($$));
|
2966
3058
|
$$.mainCircle.exit().remove();
|
2967
3059
|
};
|
2968
|
-
c3_chart_internal_fn.
|
2969
|
-
var
|
2970
|
-
|
2971
|
-
|
2972
|
-
|
2973
|
-
|
2974
|
-
|
2975
|
-
|
2976
|
-
|
2977
|
-
|
3060
|
+
c3_chart_internal_fn.redrawCircle = function (cx, cy, withTransition) {
|
3061
|
+
var selectedCircles = this.main.selectAll('.' + CLASS.selectedCircle);
|
3062
|
+
return [
|
3063
|
+
(withTransition ? this.mainCircle.transition() : this.mainCircle)
|
3064
|
+
.style('opacity', this.opacityForCircle.bind(this))
|
3065
|
+
.style("fill", this.color)
|
3066
|
+
.attr("cx", cx)
|
3067
|
+
.attr("cy", cy),
|
3068
|
+
(withTransition ? selectedCircles.transition() : selectedCircles)
|
3069
|
+
.attr("cx", cx)
|
3070
|
+
.attr("cy", cy)
|
3071
|
+
];
|
2978
3072
|
};
|
2979
3073
|
c3_chart_internal_fn.circleX = function (d) {
|
2980
3074
|
return d.x || d.x === 0 ? this.x(d.x) : null;
|
@@ -3059,7 +3153,7 @@
|
|
3059
3153
|
.style("cursor", function (d) { return config.data_selection_isselectable(d) ? "pointer" : null; });
|
3060
3154
|
|
3061
3155
|
};
|
3062
|
-
c3_chart_internal_fn.
|
3156
|
+
c3_chart_internal_fn.updateBar = function (durationForExit) {
|
3063
3157
|
var $$ = this,
|
3064
3158
|
barData = $$.barData.bind($$),
|
3065
3159
|
classBar = $$.classBar.bind($$),
|
@@ -3077,16 +3171,17 @@
|
|
3077
3171
|
.style('opacity', 0)
|
3078
3172
|
.remove();
|
3079
3173
|
};
|
3080
|
-
c3_chart_internal_fn.
|
3081
|
-
|
3082
|
-
|
3083
|
-
|
3084
|
-
|
3085
|
-
|
3174
|
+
c3_chart_internal_fn.redrawBar = function (drawBar, withTransition) {
|
3175
|
+
return [
|
3176
|
+
(withTransition ? this.mainBar.transition() : this.mainBar)
|
3177
|
+
.attr('d', drawBar)
|
3178
|
+
.style("fill", this.color)
|
3179
|
+
.style("opacity", 1)
|
3180
|
+
];
|
3086
3181
|
};
|
3087
3182
|
c3_chart_internal_fn.getBarW = function (axis, barTargetsNum) {
|
3088
3183
|
var $$ = this, config = $$.config,
|
3089
|
-
w = typeof config.bar_width === 'number' ? config.bar_width : barTargetsNum ? (axis.
|
3184
|
+
w = typeof config.bar_width === 'number' ? config.bar_width : barTargetsNum ? (axis.tickInterval() * config.bar_width_ratio) / barTargetsNum : 0;
|
3090
3185
|
return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w;
|
3091
3186
|
};
|
3092
3187
|
c3_chart_internal_fn.getBars = function (i, id) {
|
@@ -3178,7 +3273,7 @@
|
|
3178
3273
|
mainTextEnter.append('g')
|
3179
3274
|
.attr('class', classTexts);
|
3180
3275
|
};
|
3181
|
-
c3_chart_internal_fn.
|
3276
|
+
c3_chart_internal_fn.updateText = function (durationForExit) {
|
3182
3277
|
var $$ = this, config = $$.config,
|
3183
3278
|
barOrLineData = $$.barOrLineData.bind($$),
|
3184
3279
|
classText = $$.classText.bind($$);
|
@@ -3191,37 +3286,37 @@
|
|
3191
3286
|
.style("fill", function (d) { return $$.color(d); })
|
3192
3287
|
.style("fill-opacity", 0);
|
3193
3288
|
$$.mainText
|
3194
|
-
.text(function (d, i, j) { return $$.
|
3289
|
+
.text(function (d, i, j) { return $$.dataLabelFormat(d.id)(d.value, d.id, i, j); });
|
3195
3290
|
$$.mainText.exit()
|
3196
3291
|
.transition().duration(durationForExit)
|
3197
3292
|
.style('fill-opacity', 0)
|
3198
3293
|
.remove();
|
3199
3294
|
};
|
3200
|
-
c3_chart_internal_fn.
|
3201
|
-
|
3202
|
-
|
3203
|
-
|
3204
|
-
|
3205
|
-
|
3206
|
-
|
3207
|
-
|
3295
|
+
c3_chart_internal_fn.redrawText = function (xForText, yForText, forFlow, withTransition) {
|
3296
|
+
return [
|
3297
|
+
(withTransition ? this.mainText.transition() : this.mainText)
|
3298
|
+
.attr('x', xForText)
|
3299
|
+
.attr('y', yForText)
|
3300
|
+
.style("fill", this.color)
|
3301
|
+
.style("fill-opacity", forFlow ? 0 : this.opacityForText.bind(this))
|
3302
|
+
];
|
3208
3303
|
};
|
3209
3304
|
c3_chart_internal_fn.getTextRect = function (text, cls) {
|
3210
|
-
var
|
3211
|
-
svg =
|
3305
|
+
var dummy = this.d3.select('body').append('div').classed('c3', true),
|
3306
|
+
svg = dummy.append("svg").style('visibility', 'hidden').style('position', 'fixed').style('top', 0).style('left', 0),
|
3307
|
+
rect;
|
3212
3308
|
svg.selectAll('.dummy')
|
3213
3309
|
.data([text])
|
3214
3310
|
.enter().append('text')
|
3215
3311
|
.classed(cls ? cls : "", true)
|
3216
3312
|
.text(text)
|
3217
3313
|
.each(function () { rect = this.getBoundingClientRect(); });
|
3218
|
-
|
3219
|
-
body.classed('c3', false);
|
3314
|
+
dummy.remove();
|
3220
3315
|
return rect;
|
3221
3316
|
};
|
3222
3317
|
c3_chart_internal_fn.generateXYForText = function (areaIndices, barIndices, lineIndices, forX) {
|
3223
3318
|
var $$ = this,
|
3224
|
-
getAreaPoints = $$.generateGetAreaPoints(
|
3319
|
+
getAreaPoints = $$.generateGetAreaPoints(areaIndices, false),
|
3225
3320
|
getBarPoints = $$.generateGetBarPoints(barIndices, false),
|
3226
3321
|
getLinePoints = $$.generateGetLinePoints(lineIndices, false),
|
3227
3322
|
getter = forX ? $$.getXForText : $$.getYForText;
|
@@ -3251,11 +3346,23 @@
|
|
3251
3346
|
};
|
3252
3347
|
c3_chart_internal_fn.getYForText = function (points, d, textElement) {
|
3253
3348
|
var $$ = this,
|
3254
|
-
box = textElement.getBoundingClientRect(),
|
3349
|
+
box = textElement.getBoundingClientRect(),
|
3350
|
+
yPos;
|
3255
3351
|
if ($$.config.axis_rotated) {
|
3256
3352
|
yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2;
|
3257
3353
|
} else {
|
3258
|
-
yPos = points[2][1]
|
3354
|
+
yPos = points[2][1];
|
3355
|
+
if (d.value < 0) {
|
3356
|
+
yPos += box.height;
|
3357
|
+
if ($$.isBarType(d) && $$.isSafari()) {
|
3358
|
+
yPos -= 3;
|
3359
|
+
}
|
3360
|
+
else if (!$$.isBarType(d) && $$.isChrome()) {
|
3361
|
+
yPos += 3;
|
3362
|
+
}
|
3363
|
+
} else {
|
3364
|
+
yPos += $$.isBarType(d) ? -3 : -6;
|
3365
|
+
}
|
3259
3366
|
}
|
3260
3367
|
// show labels regardless of the domain if value is null
|
3261
3368
|
if (d.value === null && !$$.config.axis_rotated) {
|
@@ -3431,8 +3538,19 @@
|
|
3431
3538
|
$$.smoothLines($$.ygrid, 'grid');
|
3432
3539
|
};
|
3433
3540
|
|
3434
|
-
|
3435
|
-
|
3541
|
+
c3_chart_internal_fn.gridTextAnchor = function (d) {
|
3542
|
+
return d.position ? d.position : "end";
|
3543
|
+
};
|
3544
|
+
c3_chart_internal_fn.gridTextDx = function (d) {
|
3545
|
+
return d.position === 'start' ? 4 : d.position === 'middle' ? 0 : -4;
|
3546
|
+
};
|
3547
|
+
c3_chart_internal_fn.xGridTextX = function (d) {
|
3548
|
+
return d.position === 'start' ? -this.height : d.position === 'middle' ? -this.height / 2 : 0;
|
3549
|
+
};
|
3550
|
+
c3_chart_internal_fn.yGridTextX = function (d) {
|
3551
|
+
return d.position === 'start' ? 0 : d.position === 'middle' ? this.width / 2 : this.width;
|
3552
|
+
};
|
3553
|
+
c3_chart_internal_fn.updateGrid = function (duration) {
|
3436
3554
|
var $$ = this, main = $$.main, config = $$.config,
|
3437
3555
|
xgridLine, ygridLine, yv;
|
3438
3556
|
|
@@ -3451,9 +3569,9 @@
|
|
3451
3569
|
xgridLine.append('line')
|
3452
3570
|
.style("opacity", 0);
|
3453
3571
|
xgridLine.append('text')
|
3454
|
-
.attr("text-anchor",
|
3572
|
+
.attr("text-anchor", $$.gridTextAnchor)
|
3455
3573
|
.attr("transform", config.axis_rotated ? "" : "rotate(-90)")
|
3456
|
-
.attr('dx',
|
3574
|
+
.attr('dx', $$.gridTextDx)
|
3457
3575
|
.attr('dy', -5)
|
3458
3576
|
.style("opacity", 0);
|
3459
3577
|
// udpate
|
@@ -3475,9 +3593,9 @@
|
|
3475
3593
|
ygridLine.append('line')
|
3476
3594
|
.style("opacity", 0);
|
3477
3595
|
ygridLine.append('text')
|
3478
|
-
.attr("text-anchor",
|
3596
|
+
.attr("text-anchor", $$.gridTextAnchor)
|
3479
3597
|
.attr("transform", config.axis_rotated ? "rotate(-90)" : "")
|
3480
|
-
.attr('dx',
|
3598
|
+
.attr('dx', $$.gridTextDx)
|
3481
3599
|
.attr('dy', -5)
|
3482
3600
|
.style("opacity", 0);
|
3483
3601
|
// update
|
@@ -3491,7 +3609,7 @@
|
|
3491
3609
|
.style("opacity", 1);
|
3492
3610
|
$$.ygridLines.select('text')
|
3493
3611
|
.transition().duration(duration)
|
3494
|
-
.attr("x", config.axis_rotated ?
|
3612
|
+
.attr("x", config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$))
|
3495
3613
|
.attr("y", yv)
|
3496
3614
|
.text(function (d) { return d.text; })
|
3497
3615
|
.style("opacity", 1);
|
@@ -3500,19 +3618,23 @@
|
|
3500
3618
|
.style("opacity", 0)
|
3501
3619
|
.remove();
|
3502
3620
|
};
|
3503
|
-
c3_chart_internal_fn.
|
3504
|
-
var $$ = this, config = $$.config, xv = $$.xv.bind($$)
|
3505
|
-
|
3506
|
-
|
3507
|
-
|
3508
|
-
|
3509
|
-
|
3510
|
-
|
3511
|
-
|
3512
|
-
|
3513
|
-
|
3514
|
-
|
3515
|
-
|
3621
|
+
c3_chart_internal_fn.redrawGrid = function (withTransition) {
|
3622
|
+
var $$ = this, config = $$.config, xv = $$.xv.bind($$),
|
3623
|
+
lines = $$.xgridLines.select('line'),
|
3624
|
+
texts = $$.xgridLines.select('text');
|
3625
|
+
return [
|
3626
|
+
(withTransition ? lines.transition() : lines)
|
3627
|
+
.attr("x1", config.axis_rotated ? 0 : xv)
|
3628
|
+
.attr("x2", config.axis_rotated ? $$.width : xv)
|
3629
|
+
.attr("y1", config.axis_rotated ? xv : 0)
|
3630
|
+
.attr("y2", config.axis_rotated ? xv : $$.height)
|
3631
|
+
.style("opacity", 1),
|
3632
|
+
(withTransition ? texts.transition() : texts)
|
3633
|
+
.attr("x", config.axis_rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$))
|
3634
|
+
.attr("y", xv)
|
3635
|
+
.text(function (d) { return d.text; })
|
3636
|
+
.style("opacity", 1)
|
3637
|
+
];
|
3516
3638
|
};
|
3517
3639
|
c3_chart_internal_fn.showXGridFocus = function (selectedData) {
|
3518
3640
|
var $$ = this, config = $$.config,
|
@@ -3606,7 +3728,7 @@
|
|
3606
3728
|
}
|
3607
3729
|
$$.tooltip.html(config.tooltip_contents.call($$, $$.data.targets.map(function (d) {
|
3608
3730
|
return $$.addName(d.values[config.tooltip_init_x]);
|
3609
|
-
}), $$.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color));
|
3731
|
+
}), $$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color));
|
3610
3732
|
$$.tooltip.style("top", config.tooltip_init_position.top)
|
3611
3733
|
.style("left", config.tooltip_init_position.left)
|
3612
3734
|
.style("display", "block");
|
@@ -3626,33 +3748,27 @@
|
|
3626
3748
|
text = "<table class='" + CLASS.tooltip + "'>" + (title || title === 0 ? "<tr><th colspan='2'>" + title + "</th></tr>" : "");
|
3627
3749
|
}
|
3628
3750
|
|
3629
|
-
name = nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index);
|
3630
3751
|
value = valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index);
|
3631
|
-
|
3632
|
-
|
3633
|
-
|
3634
|
-
|
3635
|
-
|
3636
|
-
|
3752
|
+
if (value !== undefined) {
|
3753
|
+
name = nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index);
|
3754
|
+
bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);
|
3755
|
+
|
3756
|
+
text += "<tr class='" + CLASS.tooltipName + "-" + d[i].id + "'>";
|
3757
|
+
text += "<td class='name'><span style='background-color:" + bgcolor + "'></span>" + name + "</td>";
|
3758
|
+
text += "<td class='value'>" + value + "</td>";
|
3759
|
+
text += "</tr>";
|
3760
|
+
}
|
3637
3761
|
}
|
3638
3762
|
return text + "</table>";
|
3639
3763
|
};
|
3640
|
-
c3_chart_internal_fn.
|
3641
|
-
var $$ = this, config = $$.config;
|
3642
|
-
var
|
3764
|
+
c3_chart_internal_fn.tooltipPosition = function (dataToShow, tWidth, tHeight, element) {
|
3765
|
+
var $$ = this, config = $$.config, d3 = $$.d3;
|
3766
|
+
var svgLeft, tooltipLeft, tooltipRight, tooltipTop, chartRight;
|
3643
3767
|
var forArc = $$.hasArcType(),
|
3644
|
-
|
3645
|
-
|
3646
|
-
return;
|
3647
|
-
}
|
3648
|
-
$$.tooltip.html(config.tooltip_contents.call($$, selectedData, $$.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)).style("display", "block");
|
3649
|
-
|
3650
|
-
// Get tooltip dimensions
|
3651
|
-
tWidth = $$.tooltip.property('offsetWidth');
|
3652
|
-
tHeight = $$.tooltip.property('offsetHeight');
|
3653
|
-
// Determin tooltip position
|
3768
|
+
mouse = d3.mouse(element);
|
3769
|
+
// Determin tooltip position
|
3654
3770
|
if (forArc) {
|
3655
|
-
tooltipLeft = ($$.width / 2) + mouse[0];
|
3771
|
+
tooltipLeft = (($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2) + mouse[0];
|
3656
3772
|
tooltipTop = ($$.height / 2) + mouse[1] + 20;
|
3657
3773
|
} else {
|
3658
3774
|
svgLeft = $$.getSvgLeft(true);
|
@@ -3669,7 +3785,8 @@
|
|
3669
3785
|
}
|
3670
3786
|
|
3671
3787
|
if (tooltipRight > chartRight) {
|
3672
|
-
|
3788
|
+
// 20 is needed for Firefox to keep tooletip width
|
3789
|
+
tooltipLeft -= tooltipRight - chartRight + 20;
|
3673
3790
|
}
|
3674
3791
|
if (tooltipTop + tHeight > $$.currentHeight) {
|
3675
3792
|
tooltipTop -= tHeight + 30;
|
@@ -3678,10 +3795,28 @@
|
|
3678
3795
|
if (tooltipTop < 0) {
|
3679
3796
|
tooltipTop = 0;
|
3680
3797
|
}
|
3798
|
+
return {top: tooltipTop, left: tooltipLeft};
|
3799
|
+
};
|
3800
|
+
c3_chart_internal_fn.showTooltip = function (selectedData, element) {
|
3801
|
+
var $$ = this, config = $$.config;
|
3802
|
+
var tWidth, tHeight, position;
|
3803
|
+
var forArc = $$.hasArcType(),
|
3804
|
+
dataToShow = selectedData.filter(function (d) { return d && isValue(d.value); }),
|
3805
|
+
positionFunction = config.tooltip_position || c3_chart_internal_fn.tooltipPosition;
|
3806
|
+
if (dataToShow.length === 0 || !config.tooltip_show) {
|
3807
|
+
return;
|
3808
|
+
}
|
3809
|
+
$$.tooltip.html(config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)).style("display", "block");
|
3810
|
+
|
3811
|
+
// Get tooltip dimensions
|
3812
|
+
tWidth = $$.tooltip.property('offsetWidth');
|
3813
|
+
tHeight = $$.tooltip.property('offsetHeight');
|
3814
|
+
|
3815
|
+
position = positionFunction.call(this, dataToShow, tWidth, tHeight, element);
|
3681
3816
|
// Set tooltip
|
3682
3817
|
$$.tooltip
|
3683
|
-
.style("top",
|
3684
|
-
.style("left",
|
3818
|
+
.style("top", position.top + "px")
|
3819
|
+
.style("left", position.left + 'px');
|
3685
3820
|
};
|
3686
3821
|
c3_chart_internal_fn.hideTooltip = function () {
|
3687
3822
|
this.tooltip.style("display", "none");
|
@@ -3689,6 +3824,7 @@
|
|
3689
3824
|
|
3690
3825
|
c3_chart_internal_fn.initLegend = function () {
|
3691
3826
|
var $$ = this;
|
3827
|
+
$$.legendItemTextBox = {};
|
3692
3828
|
$$.legendHasRendered = false;
|
3693
3829
|
$$.legend = $$.svg.append("g").attr("transform", $$.getTranslate('legend'));
|
3694
3830
|
if (!$$.config.legend_show) {
|
@@ -3796,9 +3932,8 @@
|
|
3796
3932
|
.style('opacity', 0)
|
3797
3933
|
.style('visibility', 'hidden');
|
3798
3934
|
};
|
3799
|
-
var legendItemTextBox = {};
|
3800
3935
|
c3_chart_internal_fn.clearLegendItemTextBoxCache = function () {
|
3801
|
-
legendItemTextBox = {};
|
3936
|
+
this.legendItemTextBox = {};
|
3802
3937
|
};
|
3803
3938
|
c3_chart_internal_fn.updateLegend = function (targetIds, options, transitions) {
|
3804
3939
|
var $$ = this, config = $$.config;
|
@@ -3806,7 +3941,6 @@
|
|
3806
3941
|
var paddingTop = 4, paddingRight = 10, maxWidth = 0, maxHeight = 0, posMin = 10, tileWidth = 15;
|
3807
3942
|
var l, totalLength = 0, offsets = {}, widths = {}, heights = {}, margins = [0], steps = {}, step = 0;
|
3808
3943
|
var withTransition, withTransitionForTransform;
|
3809
|
-
var hasFocused = $$.legend.selectAll('.' + CLASS.legendItemFocused).size();
|
3810
3944
|
var texts, rects, tiles, background;
|
3811
3945
|
|
3812
3946
|
options = options || {};
|
@@ -3814,10 +3948,10 @@
|
|
3814
3948
|
withTransitionForTransform = getOption(options, "withTransitionForTransform", true);
|
3815
3949
|
|
3816
3950
|
function getTextBox(textElement, id) {
|
3817
|
-
if (
|
3818
|
-
legendItemTextBox[id] = $$.getTextRect(textElement.textContent, CLASS.legendItem);
|
3951
|
+
if (!$$.legendItemTextBox[id]) {
|
3952
|
+
$$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, CLASS.legendItem);
|
3819
3953
|
}
|
3820
|
-
return legendItemTextBox[id];
|
3954
|
+
return $$.legendItemTextBox[id];
|
3821
3955
|
}
|
3822
3956
|
|
3823
3957
|
function updatePositions(textElement, id, index) {
|
@@ -3996,16 +4130,7 @@
|
|
3996
4130
|
|
3997
4131
|
// toggle legend state
|
3998
4132
|
$$.legend.selectAll('.' + CLASS.legendItem)
|
3999
|
-
.classed(CLASS.legendItemHidden, function (id) { return !$$.isTargetToShow(id); })
|
4000
|
-
.transition()
|
4001
|
-
.style('opacity', function (id) {
|
4002
|
-
var This = $$.d3.select(this);
|
4003
|
-
if ($$.isTargetToShow(id)) {
|
4004
|
-
return !hasFocused || This.classed(CLASS.legendItemFocused) ? $$.opacityForLegend(This) : $$.opacityForUnfocusedLegend(This);
|
4005
|
-
} else {
|
4006
|
-
return null; // c3-legend-item-hidden will be applied
|
4007
|
-
}
|
4008
|
-
});
|
4133
|
+
.classed(CLASS.legendItemHidden, function (id) { return !$$.isTargetToShow(id); });
|
4009
4134
|
|
4010
4135
|
// Update all to reflect change of legend
|
4011
4136
|
$$.updateLegendItemWidth(maxWidth);
|
@@ -4020,8 +4145,15 @@
|
|
4020
4145
|
$$.legendHasRendered = true;
|
4021
4146
|
};
|
4022
4147
|
|
4023
|
-
|
4024
|
-
|
4148
|
+
function Axis(owner) {
|
4149
|
+
API.call(this, owner);
|
4150
|
+
}
|
4151
|
+
|
4152
|
+
inherit(API, Axis);
|
4153
|
+
|
4154
|
+
Axis.prototype.init = function init() {
|
4155
|
+
|
4156
|
+
var $$ = this.owner, config = $$.config, main = $$.main;
|
4025
4157
|
$$.axes.x = main.append("g")
|
4026
4158
|
.attr("class", CLASS.axis + ' ' + CLASS.axisX)
|
4027
4159
|
.attr("clip-path", $$.clipPathForXAxis)
|
@@ -4030,8 +4162,7 @@
|
|
4030
4162
|
$$.axes.x.append("text")
|
4031
4163
|
.attr("class", CLASS.axisXLabel)
|
4032
4164
|
.attr("transform", config.axis_rotated ? "rotate(-90)" : "")
|
4033
|
-
.style("text-anchor",
|
4034
|
-
|
4165
|
+
.style("text-anchor", this.textAnchorForXAxisLabel.bind(this));
|
4035
4166
|
$$.axes.y = main.append("g")
|
4036
4167
|
.attr("class", CLASS.axis + ' ' + CLASS.axisY)
|
4037
4168
|
.attr("clip-path", config.axis_y_inner ? "" : $$.clipPathForYAxis)
|
@@ -4040,7 +4171,7 @@
|
|
4040
4171
|
$$.axes.y.append("text")
|
4041
4172
|
.attr("class", CLASS.axisYLabel)
|
4042
4173
|
.attr("transform", config.axis_rotated ? "" : "rotate(-90)")
|
4043
|
-
.style("text-anchor",
|
4174
|
+
.style("text-anchor", this.textAnchorForYAxisLabel.bind(this));
|
4044
4175
|
|
4045
4176
|
$$.axes.y2 = main.append("g")
|
4046
4177
|
.attr("class", CLASS.axis + ' ' + CLASS.axisY2)
|
@@ -4050,15 +4181,17 @@
|
|
4050
4181
|
$$.axes.y2.append("text")
|
4051
4182
|
.attr("class", CLASS.axisY2Label)
|
4052
4183
|
.attr("transform", config.axis_rotated ? "" : "rotate(-90)")
|
4053
|
-
.style("text-anchor",
|
4184
|
+
.style("text-anchor", this.textAnchorForY2AxisLabel.bind(this));
|
4054
4185
|
};
|
4055
|
-
|
4056
|
-
var $$ = this, config = $$.config,
|
4186
|
+
Axis.prototype.getXAxis = function getXAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) {
|
4187
|
+
var $$ = this.owner, config = $$.config,
|
4057
4188
|
axisParams = {
|
4058
4189
|
isCategory: $$.isCategorized(),
|
4059
4190
|
withOuterTick: withOuterTick,
|
4060
4191
|
tickMultiline: config.axis_x_tick_multiline,
|
4061
|
-
tickWidth: config.axis_x_tick_width
|
4192
|
+
tickWidth: config.axis_x_tick_width,
|
4193
|
+
tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate,
|
4194
|
+
withoutTransition: withoutTransition,
|
4062
4195
|
},
|
4063
4196
|
axis = c3_axis($$.d3, axisParams).scale(scale).orient(orient);
|
4064
4197
|
|
@@ -4073,34 +4206,45 @@
|
|
4073
4206
|
if (isEmpty(config.axis_x_tick_culling)) {
|
4074
4207
|
config.axis_x_tick_culling = false;
|
4075
4208
|
}
|
4076
|
-
} else {
|
4077
|
-
// TODO: move this to c3_axis
|
4078
|
-
axis.tickOffset = function () {
|
4079
|
-
var scale = this.scale(),
|
4080
|
-
edgeX = $$.getEdgeX($$.data.targets), diff = scale(edgeX[1]) - scale(edgeX[0]),
|
4081
|
-
base = diff ? diff : (config.axis_rotated ? $$.height : $$.width);
|
4082
|
-
return (base / $$.getMaxDataCount()) / 2;
|
4083
|
-
};
|
4084
4209
|
}
|
4085
4210
|
|
4086
4211
|
return axis;
|
4087
4212
|
};
|
4088
|
-
|
4089
|
-
var
|
4090
|
-
|
4091
|
-
|
4092
|
-
|
4213
|
+
Axis.prototype.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) {
|
4214
|
+
var $$ = this.owner, config = $$.config, tickValues;
|
4215
|
+
if (config.axis_x_tick_fit || config.axis_x_tick_count) {
|
4216
|
+
tickValues = this.generateTickValues($$.mapTargetsToUniqueXs(targets), config.axis_x_tick_count, $$.isTimeSeries());
|
4217
|
+
}
|
4218
|
+
if (axis) {
|
4219
|
+
axis.tickValues(tickValues);
|
4220
|
+
} else {
|
4221
|
+
$$.xAxis.tickValues(tickValues);
|
4222
|
+
$$.subXAxis.tickValues(tickValues);
|
4223
|
+
}
|
4224
|
+
return tickValues;
|
4225
|
+
};
|
4226
|
+
Axis.prototype.getYAxis = function getYAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition) {
|
4227
|
+
var axisParams = {
|
4228
|
+
withOuterTick: withOuterTick,
|
4229
|
+
withoutTransition: withoutTransition,
|
4230
|
+
},
|
4231
|
+
$$ = this.owner,
|
4232
|
+
d3 = $$.d3,
|
4233
|
+
config = $$.config,
|
4234
|
+
axis = c3_axis(d3, axisParams).scale(scale).orient(orient).tickFormat(tickFormat);
|
4235
|
+
if ($$.isTimeSeriesY()) {
|
4236
|
+
axis.ticks(d3.time[config.axis_y_tick_time_value], config.axis_y_tick_time_interval);
|
4093
4237
|
} else {
|
4094
4238
|
axis.tickValues(tickValues);
|
4095
4239
|
}
|
4096
4240
|
return axis;
|
4097
4241
|
};
|
4098
|
-
|
4099
|
-
var config = this.config;
|
4242
|
+
Axis.prototype.getId = function getId(id) {
|
4243
|
+
var config = this.owner.config;
|
4100
4244
|
return id in config.data_axes ? config.data_axes[id] : 'y';
|
4101
4245
|
};
|
4102
|
-
|
4103
|
-
var $$ = this, config = $$.config,
|
4246
|
+
Axis.prototype.getXAxisTickFormat = function getXAxisTickFormat() {
|
4247
|
+
var $$ = this.owner, config = $$.config,
|
4104
4248
|
format = $$.isTimeSeries() ? $$.defaultAxisTimeFormat : $$.isCategorized() ? $$.categoryName : function (v) { return v < 0 ? v.toFixed(0) : v; };
|
4105
4249
|
if (config.axis_x_tick_format) {
|
4106
4250
|
if (isFunction(config.axis_x_tick_format)) {
|
@@ -4113,20 +4257,20 @@
|
|
4113
4257
|
}
|
4114
4258
|
return isFunction(format) ? function (v) { return format.call($$, v); } : format;
|
4115
4259
|
};
|
4116
|
-
|
4260
|
+
Axis.prototype.getTickValues = function getTickValues(tickValues, axis) {
|
4117
4261
|
return tickValues ? tickValues : axis ? axis.tickValues() : undefined;
|
4118
4262
|
};
|
4119
|
-
|
4120
|
-
return this.
|
4263
|
+
Axis.prototype.getXAxisTickValues = function getXAxisTickValues() {
|
4264
|
+
return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis);
|
4121
4265
|
};
|
4122
|
-
|
4123
|
-
return this.
|
4266
|
+
Axis.prototype.getYAxisTickValues = function getYAxisTickValues() {
|
4267
|
+
return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis);
|
4124
4268
|
};
|
4125
|
-
|
4126
|
-
return this.
|
4269
|
+
Axis.prototype.getY2AxisTickValues = function getY2AxisTickValues() {
|
4270
|
+
return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis);
|
4127
4271
|
};
|
4128
|
-
|
4129
|
-
var $$ = this, config = $$.config, option;
|
4272
|
+
Axis.prototype.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) {
|
4273
|
+
var $$ = this.owner, config = $$.config, option;
|
4130
4274
|
if (axisId === 'y') {
|
4131
4275
|
option = config.axis_y_label;
|
4132
4276
|
} else if (axisId === 'y2') {
|
@@ -4136,13 +4280,13 @@
|
|
4136
4280
|
}
|
4137
4281
|
return option;
|
4138
4282
|
};
|
4139
|
-
|
4140
|
-
var option = this.
|
4283
|
+
Axis.prototype.getLabelText = function getLabelText(axisId) {
|
4284
|
+
var option = this.getLabelOptionByAxisId(axisId);
|
4141
4285
|
return isString(option) ? option : option ? option.text : null;
|
4142
4286
|
};
|
4143
|
-
|
4144
|
-
var $$ = this, config = $$.config,
|
4145
|
-
option =
|
4287
|
+
Axis.prototype.setLabelText = function setLabelText(axisId, text) {
|
4288
|
+
var $$ = this.owner, config = $$.config,
|
4289
|
+
option = this.getLabelOptionByAxisId(axisId);
|
4146
4290
|
if (isString(option)) {
|
4147
4291
|
if (axisId === 'y') {
|
4148
4292
|
config.axis_y_label = text;
|
@@ -4155,8 +4299,8 @@
|
|
4155
4299
|
option.text = text;
|
4156
4300
|
}
|
4157
4301
|
};
|
4158
|
-
|
4159
|
-
var option = this.
|
4302
|
+
Axis.prototype.getLabelPosition = function getLabelPosition(axisId, defaultPosition) {
|
4303
|
+
var option = this.getLabelOptionByAxisId(axisId),
|
4160
4304
|
position = (option && typeof option === 'object' && option.position) ? option.position : defaultPosition;
|
4161
4305
|
return {
|
4162
4306
|
isInner: position.indexOf('inner') >= 0,
|
@@ -4169,126 +4313,109 @@
|
|
4169
4313
|
isBottom: position.indexOf('bottom') >= 0
|
4170
4314
|
};
|
4171
4315
|
};
|
4172
|
-
|
4173
|
-
return this.
|
4316
|
+
Axis.prototype.getXAxisLabelPosition = function getXAxisLabelPosition() {
|
4317
|
+
return this.getLabelPosition('x', this.owner.config.axis_rotated ? 'inner-top' : 'inner-right');
|
4174
4318
|
};
|
4175
|
-
|
4176
|
-
return this.
|
4319
|
+
Axis.prototype.getYAxisLabelPosition = function getYAxisLabelPosition() {
|
4320
|
+
return this.getLabelPosition('y', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');
|
4177
4321
|
};
|
4178
|
-
|
4179
|
-
return this.
|
4322
|
+
Axis.prototype.getY2AxisLabelPosition = function getY2AxisLabelPosition() {
|
4323
|
+
return this.getLabelPosition('y2', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');
|
4180
4324
|
};
|
4181
|
-
|
4325
|
+
Axis.prototype.getLabelPositionById = function getLabelPositionById(id) {
|
4182
4326
|
return id === 'y2' ? this.getY2AxisLabelPosition() : id === 'y' ? this.getYAxisLabelPosition() : this.getXAxisLabelPosition();
|
4183
4327
|
};
|
4184
|
-
|
4185
|
-
return this.
|
4328
|
+
Axis.prototype.textForXAxisLabel = function textForXAxisLabel() {
|
4329
|
+
return this.getLabelText('x');
|
4186
4330
|
};
|
4187
|
-
|
4188
|
-
return this.
|
4331
|
+
Axis.prototype.textForYAxisLabel = function textForYAxisLabel() {
|
4332
|
+
return this.getLabelText('y');
|
4189
4333
|
};
|
4190
|
-
|
4191
|
-
return this.
|
4334
|
+
Axis.prototype.textForY2AxisLabel = function textForY2AxisLabel() {
|
4335
|
+
return this.getLabelText('y2');
|
4192
4336
|
};
|
4193
|
-
|
4194
|
-
var $$ = this;
|
4337
|
+
Axis.prototype.xForAxisLabel = function xForAxisLabel(forHorizontal, position) {
|
4338
|
+
var $$ = this.owner;
|
4195
4339
|
if (forHorizontal) {
|
4196
4340
|
return position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width;
|
4197
4341
|
} else {
|
4198
4342
|
return position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0;
|
4199
4343
|
}
|
4200
4344
|
};
|
4201
|
-
|
4345
|
+
Axis.prototype.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) {
|
4202
4346
|
if (forHorizontal) {
|
4203
4347
|
return position.isLeft ? "0.5em" : position.isRight ? "-0.5em" : "0";
|
4204
4348
|
} else {
|
4205
4349
|
return position.isTop ? "-0.5em" : position.isBottom ? "0.5em" : "0";
|
4206
4350
|
}
|
4207
4351
|
};
|
4208
|
-
|
4352
|
+
Axis.prototype.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) {
|
4209
4353
|
if (forHorizontal) {
|
4210
4354
|
return position.isLeft ? 'start' : position.isCenter ? 'middle' : 'end';
|
4211
4355
|
} else {
|
4212
4356
|
return position.isBottom ? 'start' : position.isMiddle ? 'middle' : 'end';
|
4213
4357
|
}
|
4214
4358
|
};
|
4215
|
-
|
4216
|
-
return this.xForAxisLabel(!this.config.axis_rotated, this.getXAxisLabelPosition());
|
4359
|
+
Axis.prototype.xForXAxisLabel = function xForXAxisLabel() {
|
4360
|
+
return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());
|
4217
4361
|
};
|
4218
|
-
|
4219
|
-
return this.xForAxisLabel(this.config.axis_rotated, this.getYAxisLabelPosition());
|
4362
|
+
Axis.prototype.xForYAxisLabel = function xForYAxisLabel() {
|
4363
|
+
return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());
|
4220
4364
|
};
|
4221
|
-
|
4222
|
-
return this.xForAxisLabel(this.config.axis_rotated, this.getY2AxisLabelPosition());
|
4365
|
+
Axis.prototype.xForY2AxisLabel = function xForY2AxisLabel() {
|
4366
|
+
return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());
|
4223
4367
|
};
|
4224
|
-
|
4225
|
-
return this.dxForAxisLabel(!this.config.axis_rotated, this.getXAxisLabelPosition());
|
4368
|
+
Axis.prototype.dxForXAxisLabel = function dxForXAxisLabel() {
|
4369
|
+
return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());
|
4226
4370
|
};
|
4227
|
-
|
4228
|
-
return this.dxForAxisLabel(this.config.axis_rotated, this.getYAxisLabelPosition());
|
4371
|
+
Axis.prototype.dxForYAxisLabel = function dxForYAxisLabel() {
|
4372
|
+
return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());
|
4229
4373
|
};
|
4230
|
-
|
4231
|
-
return this.dxForAxisLabel(this.config.axis_rotated, this.getY2AxisLabelPosition());
|
4374
|
+
Axis.prototype.dxForY2AxisLabel = function dxForY2AxisLabel() {
|
4375
|
+
return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());
|
4232
4376
|
};
|
4233
|
-
|
4234
|
-
var $$ = this, config = $$.config,
|
4235
|
-
position =
|
4377
|
+
Axis.prototype.dyForXAxisLabel = function dyForXAxisLabel() {
|
4378
|
+
var $$ = this.owner, config = $$.config,
|
4379
|
+
position = this.getXAxisLabelPosition();
|
4236
4380
|
if (config.axis_rotated) {
|
4237
|
-
return position.isInner ? "1.2em" : -25 -
|
4381
|
+
return position.isInner ? "1.2em" : -25 - this.getMaxTickWidth('x');
|
4238
4382
|
} else {
|
4239
4383
|
return position.isInner ? "-0.5em" : config.axis_x_height ? config.axis_x_height - 10 : "3em";
|
4240
4384
|
}
|
4241
4385
|
};
|
4242
|
-
|
4243
|
-
var $$ = this,
|
4244
|
-
position =
|
4386
|
+
Axis.prototype.dyForYAxisLabel = function dyForYAxisLabel() {
|
4387
|
+
var $$ = this.owner,
|
4388
|
+
position = this.getYAxisLabelPosition();
|
4245
4389
|
if ($$.config.axis_rotated) {
|
4246
4390
|
return position.isInner ? "-0.5em" : "3em";
|
4247
4391
|
} else {
|
4248
|
-
return position.isInner ? "1.2em" : -10 - ($$.config.axis_y_inner ? 0 : (
|
4392
|
+
return position.isInner ? "1.2em" : -10 - ($$.config.axis_y_inner ? 0 : (this.getMaxTickWidth('y') + 10));
|
4249
4393
|
}
|
4250
4394
|
};
|
4251
|
-
|
4252
|
-
var $$ = this,
|
4253
|
-
position =
|
4395
|
+
Axis.prototype.dyForY2AxisLabel = function dyForY2AxisLabel() {
|
4396
|
+
var $$ = this.owner,
|
4397
|
+
position = this.getY2AxisLabelPosition();
|
4254
4398
|
if ($$.config.axis_rotated) {
|
4255
4399
|
return position.isInner ? "1.2em" : "-2.2em";
|
4256
4400
|
} else {
|
4257
4401
|
return position.isInner ? "-0.5em" : 15 + ($$.config.axis_y2_inner ? 0 : (this.getMaxTickWidth('y2') + 15));
|
4258
4402
|
}
|
4259
4403
|
};
|
4260
|
-
|
4261
|
-
var $$ = this;
|
4262
|
-
return
|
4404
|
+
Axis.prototype.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() {
|
4405
|
+
var $$ = this.owner;
|
4406
|
+
return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition());
|
4263
4407
|
};
|
4264
|
-
|
4265
|
-
var $$ = this;
|
4266
|
-
return
|
4267
|
-
};
|
4268
|
-
c3_chart_internal_fn.textAnchorForY2AxisLabel = function () {
|
4269
|
-
var $$ = this;
|
4270
|
-
return $$.textAnchorForAxisLabel($$.config.axis_rotated, $$.getY2AxisLabelPosition());
|
4408
|
+
Axis.prototype.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() {
|
4409
|
+
var $$ = this.owner;
|
4410
|
+
return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition());
|
4271
4411
|
};
|
4272
|
-
|
4273
|
-
|
4274
|
-
return
|
4412
|
+
Axis.prototype.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() {
|
4413
|
+
var $$ = this.owner;
|
4414
|
+
return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition());
|
4275
4415
|
};
|
4276
|
-
|
4277
|
-
|
4278
|
-
|
4279
|
-
c3_chart_internal_fn.rotateTickText = function (axis, transition, rotate) {
|
4280
|
-
axis.selectAll('.tick text')
|
4281
|
-
.style("text-anchor", rotate > 0 ? "start" : "end");
|
4282
|
-
transition.selectAll('.tick text')
|
4283
|
-
.attr("y", this.yForRotatedTickText(rotate))
|
4284
|
-
.attr("transform", "rotate(" + rotate + ")")
|
4285
|
-
.selectAll('tspan')
|
4286
|
-
.attr('dx', this.xForRotatedTickText(rotate));
|
4287
|
-
};
|
4288
|
-
|
4289
|
-
c3_chart_internal_fn.getMaxTickWidth = function (id, withoutRecompute) {
|
4290
|
-
var $$ = this, config = $$.config,
|
4291
|
-
maxWidth = 0, targetsToShow, scale, axis;
|
4416
|
+
Axis.prototype.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) {
|
4417
|
+
var $$ = this.owner, config = $$.config,
|
4418
|
+
maxWidth = 0, targetsToShow, scale, axis, dummy, svg;
|
4292
4419
|
if (withoutRecompute && $$.currentMaxTickWidths[id]) {
|
4293
4420
|
return $$.currentMaxTickWidths[id];
|
4294
4421
|
}
|
@@ -4296,48 +4423,51 @@
|
|
4296
4423
|
targetsToShow = $$.filterTargetsToShow($$.data.targets);
|
4297
4424
|
if (id === 'y') {
|
4298
4425
|
scale = $$.y.copy().domain($$.getYDomain(targetsToShow, 'y'));
|
4299
|
-
axis =
|
4426
|
+
axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, false, true);
|
4300
4427
|
} else if (id === 'y2') {
|
4301
4428
|
scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, 'y2'));
|
4302
|
-
axis =
|
4429
|
+
axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, false, true);
|
4303
4430
|
} else {
|
4304
4431
|
scale = $$.x.copy().domain($$.getXDomain(targetsToShow));
|
4305
|
-
axis =
|
4432
|
+
axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, false, true, true);
|
4433
|
+
this.updateXAxisTickValues(targetsToShow, axis);
|
4306
4434
|
}
|
4307
|
-
$$.d3.select('body').append(
|
4308
|
-
|
4435
|
+
dummy = $$.d3.select('body').append('div').classed('c3', true);
|
4436
|
+
svg = dummy.append("svg").style('visibility', 'hidden').style('position', 'fixed').style('top', 0).style('left', 0),
|
4437
|
+
svg.append('g').call(axis).each(function () {
|
4438
|
+
$$.d3.select(this).selectAll('text').each(function () {
|
4309
4439
|
var box = this.getBoundingClientRect();
|
4310
|
-
if (
|
4440
|
+
if (maxWidth < box.width) { maxWidth = box.width; }
|
4311
4441
|
});
|
4312
|
-
|
4442
|
+
dummy.remove();
|
4443
|
+
});
|
4313
4444
|
}
|
4314
4445
|
$$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth;
|
4315
4446
|
return $$.currentMaxTickWidths[id];
|
4316
4447
|
};
|
4317
4448
|
|
4318
|
-
|
4319
|
-
var $$ = this;
|
4449
|
+
Axis.prototype.updateLabels = function updateLabels(withTransition) {
|
4450
|
+
var $$ = this.owner;
|
4320
4451
|
var axisXLabel = $$.main.select('.' + CLASS.axisX + ' .' + CLASS.axisXLabel),
|
4321
4452
|
axisYLabel = $$.main.select('.' + CLASS.axisY + ' .' + CLASS.axisYLabel),
|
4322
4453
|
axisY2Label = $$.main.select('.' + CLASS.axisY2 + ' .' + CLASS.axisY2Label);
|
4323
4454
|
(withTransition ? axisXLabel.transition() : axisXLabel)
|
4324
|
-
.attr("x",
|
4325
|
-
.attr("dx",
|
4326
|
-
.attr("dy",
|
4327
|
-
.text(
|
4455
|
+
.attr("x", this.xForXAxisLabel.bind(this))
|
4456
|
+
.attr("dx", this.dxForXAxisLabel.bind(this))
|
4457
|
+
.attr("dy", this.dyForXAxisLabel.bind(this))
|
4458
|
+
.text(this.textForXAxisLabel.bind(this));
|
4328
4459
|
(withTransition ? axisYLabel.transition() : axisYLabel)
|
4329
|
-
.attr("x",
|
4330
|
-
.attr("dx",
|
4331
|
-
.attr("dy",
|
4332
|
-
.text(
|
4460
|
+
.attr("x", this.xForYAxisLabel.bind(this))
|
4461
|
+
.attr("dx", this.dxForYAxisLabel.bind(this))
|
4462
|
+
.attr("dy", this.dyForYAxisLabel.bind(this))
|
4463
|
+
.text(this.textForYAxisLabel.bind(this));
|
4333
4464
|
(withTransition ? axisY2Label.transition() : axisY2Label)
|
4334
|
-
.attr("x",
|
4335
|
-
.attr("dx",
|
4336
|
-
.attr("dy",
|
4337
|
-
.text(
|
4465
|
+
.attr("x", this.xForY2AxisLabel.bind(this))
|
4466
|
+
.attr("dx", this.dxForY2AxisLabel.bind(this))
|
4467
|
+
.attr("dy", this.dyForY2AxisLabel.bind(this))
|
4468
|
+
.text(this.textForY2AxisLabel.bind(this));
|
4338
4469
|
};
|
4339
|
-
|
4340
|
-
c3_chart_internal_fn.getAxisPadding = function (padding, key, defaultValue, domainLength) {
|
4470
|
+
Axis.prototype.getPadding = function getPadding(padding, key, defaultValue, domainLength) {
|
4341
4471
|
if (!isValue(padding[key])) {
|
4342
4472
|
return defaultValue;
|
4343
4473
|
}
|
@@ -4347,12 +4477,12 @@
|
|
4347
4477
|
// assume padding is pixels if unit is not specified
|
4348
4478
|
return this.convertPixelsToAxisPadding(padding[key], domainLength);
|
4349
4479
|
};
|
4350
|
-
|
4351
|
-
var
|
4480
|
+
Axis.prototype.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) {
|
4481
|
+
var $$ = this.owner,
|
4482
|
+
length = $$.config.axis_rotated ? $$.width : $$.height;
|
4352
4483
|
return domainLength * (pixels / length);
|
4353
4484
|
};
|
4354
|
-
|
4355
|
-
c3_chart_internal_fn.generateTickValues = function (values, tickCount, forTimeSeries) {
|
4485
|
+
Axis.prototype.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) {
|
4356
4486
|
var tickValues = values, targetCount, start, end, count, interval, i, tickValue;
|
4357
4487
|
if (tickCount) {
|
4358
4488
|
targetCount = isFunction(tickCount) ? tickCount() : tickCount;
|
@@ -4378,8 +4508,8 @@
|
|
4378
4508
|
if (!forTimeSeries) { tickValues = tickValues.sort(function (a, b) { return a - b; }); }
|
4379
4509
|
return tickValues;
|
4380
4510
|
};
|
4381
|
-
|
4382
|
-
var $$ = this, axes = $$.axes;
|
4511
|
+
Axis.prototype.generateTransitions = function generateTransitions(duration) {
|
4512
|
+
var $$ = this.owner, axes = $$.axes;
|
4383
4513
|
return {
|
4384
4514
|
axisX: duration ? axes.x.transition().duration(duration) : axes.x,
|
4385
4515
|
axisY: duration ? axes.y.transition().duration(duration) : axes.y,
|
@@ -4387,8 +4517,8 @@
|
|
4387
4517
|
axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx
|
4388
4518
|
};
|
4389
4519
|
};
|
4390
|
-
|
4391
|
-
var $$ = this
|
4520
|
+
Axis.prototype.redraw = function redraw(transitions, isHidden) {
|
4521
|
+
var $$ = this.owner;
|
4392
4522
|
$$.axes.x.style("opacity", isHidden ? 0 : 1);
|
4393
4523
|
$$.axes.y.style("opacity", isHidden ? 0 : 1);
|
4394
4524
|
$$.axes.y2.style("opacity", isHidden ? 0 : 1);
|
@@ -4397,11 +4527,6 @@
|
|
4397
4527
|
transitions.axisY.call($$.yAxis);
|
4398
4528
|
transitions.axisY2.call($$.y2Axis);
|
4399
4529
|
transitions.axisSubX.call($$.subXAxis);
|
4400
|
-
// rotate tick text if needed
|
4401
|
-
if (!config.axis_rotated && config.axis_x_tick_rotate) {
|
4402
|
-
$$.rotateTickText($$.axes.x, transitions.axisX, config.axis_x_tick_rotate);
|
4403
|
-
$$.rotateTickText($$.axes.subx, transitions.axisSubX, config.axis_x_tick_rotate);
|
4404
|
-
}
|
4405
4530
|
};
|
4406
4531
|
|
4407
4532
|
c3_chart_internal_fn.getClipPath = function (id) {
|
@@ -4501,6 +4626,9 @@
|
|
4501
4626
|
}
|
4502
4627
|
index++;
|
4503
4628
|
});
|
4629
|
+
if (isNaN(d.startAngle)) {
|
4630
|
+
d.startAngle = 0;
|
4631
|
+
}
|
4504
4632
|
if (isNaN(d.endAngle)) {
|
4505
4633
|
d.endAngle = d.startAngle;
|
4506
4634
|
}
|
@@ -4738,7 +4866,7 @@
|
|
4738
4866
|
var updated = $$.updateAngle(d),
|
4739
4867
|
arcData = $$.convertToArcData(updated),
|
4740
4868
|
selectedData = [arcData];
|
4741
|
-
$$.showTooltip(selectedData,
|
4869
|
+
$$.showTooltip(selectedData, this);
|
4742
4870
|
} : null)
|
4743
4871
|
.on('mouseout', config.interaction_enabled ? function (d) {
|
4744
4872
|
var updated, arcData;
|
@@ -4773,6 +4901,9 @@
|
|
4773
4901
|
// endAngle: Math.PI*2,
|
4774
4902
|
// };
|
4775
4903
|
// }
|
4904
|
+
if (isNaN(this._current.startAngle)) {
|
4905
|
+
this._current.startAngle = 0;
|
4906
|
+
}
|
4776
4907
|
if (isNaN(this._current.endAngle)) {
|
4777
4908
|
this._current.endAngle = this._current.startAngle;
|
4778
4909
|
}
|
@@ -4858,7 +4989,7 @@
|
|
4858
4989
|
.attr("clip-path", $$.clipPath)
|
4859
4990
|
.attr("class", CLASS.regions);
|
4860
4991
|
};
|
4861
|
-
c3_chart_internal_fn.
|
4992
|
+
c3_chart_internal_fn.updateRegion = function (duration) {
|
4862
4993
|
var $$ = this, config = $$.config;
|
4863
4994
|
|
4864
4995
|
// hide if arc type
|
@@ -4874,18 +5005,21 @@
|
|
4874
5005
|
.style("opacity", 0)
|
4875
5006
|
.remove();
|
4876
5007
|
};
|
4877
|
-
c3_chart_internal_fn.
|
5008
|
+
c3_chart_internal_fn.redrawRegion = function (withTransition) {
|
4878
5009
|
var $$ = this,
|
5010
|
+
regions = $$.mainRegion.selectAll('rect'),
|
4879
5011
|
x = $$.regionX.bind($$),
|
4880
5012
|
y = $$.regionY.bind($$),
|
4881
5013
|
w = $$.regionWidth.bind($$),
|
4882
5014
|
h = $$.regionHeight.bind($$);
|
4883
|
-
|
4884
|
-
|
4885
|
-
|
4886
|
-
|
4887
|
-
|
4888
|
-
|
5015
|
+
return [
|
5016
|
+
(withTransition ? regions.transition() : regions)
|
5017
|
+
.attr("x", x)
|
5018
|
+
.attr("y", y)
|
5019
|
+
.attr("width", w)
|
5020
|
+
.attr("height", h)
|
5021
|
+
.style("fill-opacity", function (d) { return isValue(d.opacity) ? d.opacity : 0.1; })
|
5022
|
+
];
|
4889
5023
|
};
|
4890
5024
|
c3_chart_internal_fn.regionX = function (d) {
|
4891
5025
|
var $$ = this, config = $$.config,
|
@@ -4998,7 +5132,6 @@
|
|
4998
5132
|
.attr('class', CLASS.dragarea)
|
4999
5133
|
.style('opacity', 0.1);
|
5000
5134
|
$$.dragging = true;
|
5001
|
-
$$.config.data_ondragstart.call($$.api);
|
5002
5135
|
};
|
5003
5136
|
|
5004
5137
|
c3_chart_internal_fn.dragend = function () {
|
@@ -5012,10 +5145,8 @@
|
|
5012
5145
|
$$.main.selectAll('.' + CLASS.shape)
|
5013
5146
|
.classed(CLASS.INCLUDED, false);
|
5014
5147
|
$$.dragging = false;
|
5015
|
-
$$.config.data_ondragend.call($$.api);
|
5016
5148
|
};
|
5017
5149
|
|
5018
|
-
|
5019
5150
|
c3_chart_internal_fn.selectPoint = function (target, d, i) {
|
5020
5151
|
var $$ = this, config = $$.config,
|
5021
5152
|
cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$),
|
@@ -5107,9 +5238,7 @@
|
|
5107
5238
|
var $$ = this, config = $$.config,
|
5108
5239
|
context = $$.context = $$.svg.append("g").attr("transform", $$.getTranslate('context'));
|
5109
5240
|
|
5110
|
-
|
5111
|
-
context.style('visibility', 'hidden');
|
5112
|
-
}
|
5241
|
+
context.style('visibility', config.subchart_show ? 'visible' : 'hidden');
|
5113
5242
|
|
5114
5243
|
// Define g for chart area
|
5115
5244
|
context.append('g')
|
@@ -5128,9 +5257,7 @@
|
|
5128
5257
|
context.append("g")
|
5129
5258
|
.attr("clip-path", $$.clipPath)
|
5130
5259
|
.attr("class", CLASS.brush)
|
5131
|
-
.call($$.brush)
|
5132
|
-
.selectAll("rect")
|
5133
|
-
.attr(config.axis_rotated ? "width" : "height", config.axis_rotated ? $$.width2 : $$.height2);
|
5260
|
+
.call($$.brush);
|
5134
5261
|
|
5135
5262
|
// ATTENTION: This must be called AFTER chart added
|
5136
5263
|
// Add Axis
|
@@ -5149,6 +5276,7 @@
|
|
5149
5276
|
classAreas = $$.classAreas.bind($$);
|
5150
5277
|
|
5151
5278
|
if (config.subchart_show) {
|
5279
|
+
//-- Bar --//
|
5152
5280
|
contextBarUpdate = context.select('.' + CLASS.chartBars).selectAll('.' + CLASS.chartBar)
|
5153
5281
|
.data(targets)
|
5154
5282
|
.attr('class', classChartBar);
|
@@ -5172,17 +5300,74 @@
|
|
5172
5300
|
// Area
|
5173
5301
|
contextLineEnter.append("g")
|
5174
5302
|
.attr("class", classAreas);
|
5303
|
+
|
5304
|
+
//-- Brush --//
|
5305
|
+
context.selectAll('.' + CLASS.brush + ' rect')
|
5306
|
+
.attr(config.axis_rotated ? "width" : "height", config.axis_rotated ? $$.width2 : $$.height2);
|
5175
5307
|
}
|
5176
5308
|
};
|
5309
|
+
c3_chart_internal_fn.updateBarForSubchart = function (durationForExit) {
|
5310
|
+
var $$ = this;
|
5311
|
+
$$.contextBar = $$.context.selectAll('.' + CLASS.bars).selectAll('.' + CLASS.bar)
|
5312
|
+
.data($$.barData.bind($$));
|
5313
|
+
$$.contextBar.enter().append('path')
|
5314
|
+
.attr("class", $$.classBar.bind($$))
|
5315
|
+
.style("stroke", 'none')
|
5316
|
+
.style("fill", $$.color);
|
5317
|
+
$$.contextBar
|
5318
|
+
.style("opacity", $$.initialOpacity.bind($$));
|
5319
|
+
$$.contextBar.exit().transition().duration(durationForExit)
|
5320
|
+
.style('opacity', 0)
|
5321
|
+
.remove();
|
5322
|
+
};
|
5323
|
+
c3_chart_internal_fn.redrawBarForSubchart = function (drawBarOnSub, withTransition, duration) {
|
5324
|
+
(withTransition ? this.contextBar.transition().duration(duration) : this.contextBar)
|
5325
|
+
.attr('d', drawBarOnSub)
|
5326
|
+
.style('opacity', 1);
|
5327
|
+
};
|
5328
|
+
c3_chart_internal_fn.updateLineForSubchart = function (durationForExit) {
|
5329
|
+
var $$ = this;
|
5330
|
+
$$.contextLine = $$.context.selectAll('.' + CLASS.lines).selectAll('.' + CLASS.line)
|
5331
|
+
.data($$.lineData.bind($$));
|
5332
|
+
$$.contextLine.enter().append('path')
|
5333
|
+
.attr('class', $$.classLine.bind($$))
|
5334
|
+
.style('stroke', $$.color);
|
5335
|
+
$$.contextLine
|
5336
|
+
.style("opacity", $$.initialOpacity.bind($$));
|
5337
|
+
$$.contextLine.exit().transition().duration(durationForExit)
|
5338
|
+
.style('opacity', 0)
|
5339
|
+
.remove();
|
5340
|
+
};
|
5341
|
+
c3_chart_internal_fn.redrawLineForSubchart = function (drawLineOnSub, withTransition, duration) {
|
5342
|
+
(withTransition ? this.contextLine.transition().duration(duration) : this.contextLine)
|
5343
|
+
.attr("d", drawLineOnSub)
|
5344
|
+
.style('opacity', 1);
|
5345
|
+
};
|
5346
|
+
c3_chart_internal_fn.updateAreaForSubchart = function (durationForExit) {
|
5347
|
+
var $$ = this, d3 = $$.d3;
|
5348
|
+
$$.contextArea = $$.context.selectAll('.' + CLASS.areas).selectAll('.' + CLASS.area)
|
5349
|
+
.data($$.lineData.bind($$));
|
5350
|
+
$$.contextArea.enter().append('path')
|
5351
|
+
.attr("class", $$.classArea.bind($$))
|
5352
|
+
.style("fill", $$.color)
|
5353
|
+
.style("opacity", function () { $$.orgAreaOpacity = +d3.select(this).style('opacity'); return 0; });
|
5354
|
+
$$.contextArea
|
5355
|
+
.style("opacity", 0);
|
5356
|
+
$$.contextArea.exit().transition().duration(durationForExit)
|
5357
|
+
.style('opacity', 0)
|
5358
|
+
.remove();
|
5359
|
+
};
|
5360
|
+
c3_chart_internal_fn.redrawAreaForSubchart = function (drawAreaOnSub, withTransition, duration) {
|
5361
|
+
(withTransition ? this.contextArea.transition().duration(duration) : this.contextArea)
|
5362
|
+
.attr("d", drawAreaOnSub)
|
5363
|
+
.style("fill", this.color)
|
5364
|
+
.style("opacity", this.orgAreaOpacity);
|
5365
|
+
};
|
5177
5366
|
c3_chart_internal_fn.redrawSubchart = function (withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices) {
|
5178
|
-
var $$ = this, d3 = $$.d3,
|
5179
|
-
|
5180
|
-
|
5181
|
-
|
5182
|
-
classBar = $$.classBar.bind($$),
|
5183
|
-
classLine = $$.classLine.bind($$),
|
5184
|
-
classArea = $$.classArea.bind($$),
|
5185
|
-
initialOpacity = $$.initialOpacity.bind($$);
|
5367
|
+
var $$ = this, d3 = $$.d3, config = $$.config,
|
5368
|
+
drawAreaOnSub, drawBarOnSub, drawLineOnSub;
|
5369
|
+
|
5370
|
+
$$.context.style('visibility', config.subchart_show ? 'visible' : 'hidden');
|
5186
5371
|
|
5187
5372
|
// subchart
|
5188
5373
|
if (config.subchart_show) {
|
@@ -5201,51 +5386,14 @@
|
|
5201
5386
|
drawAreaOnSub = $$.generateDrawArea(areaIndices, true);
|
5202
5387
|
drawBarOnSub = $$.generateDrawBar(barIndices, true);
|
5203
5388
|
drawLineOnSub = $$.generateDrawLine(lineIndices, true);
|
5204
|
-
|
5205
|
-
|
5206
|
-
|
5207
|
-
|
5208
|
-
|
5209
|
-
|
5210
|
-
|
5211
|
-
|
5212
|
-
.style("opacity", initialOpacity)
|
5213
|
-
.transition().duration(duration)
|
5214
|
-
.attr('d', drawBarOnSub)
|
5215
|
-
.style('opacity', 1);
|
5216
|
-
contextBar.exit().transition().duration(duration)
|
5217
|
-
.style('opacity', 0)
|
5218
|
-
.remove();
|
5219
|
-
// lines
|
5220
|
-
contextLine = context.selectAll('.' + CLASS.lines).selectAll('.' + CLASS.line)
|
5221
|
-
.data(lineData);
|
5222
|
-
contextLine.enter().append('path')
|
5223
|
-
.attr('class', classLine)
|
5224
|
-
.style('stroke', $$.color);
|
5225
|
-
contextLine
|
5226
|
-
.style("opacity", initialOpacity)
|
5227
|
-
.transition().duration(duration)
|
5228
|
-
.attr("d", drawLineOnSub)
|
5229
|
-
.style('opacity', 1);
|
5230
|
-
contextLine.exit().transition().duration(duration)
|
5231
|
-
.style('opacity', 0)
|
5232
|
-
.remove();
|
5233
|
-
// area
|
5234
|
-
contextArea = context.selectAll('.' + CLASS.areas).selectAll('.' + CLASS.area)
|
5235
|
-
.data(lineData);
|
5236
|
-
contextArea.enter().append('path')
|
5237
|
-
.attr("class", classArea)
|
5238
|
-
.style("fill", $$.color)
|
5239
|
-
.style("opacity", function () { $$.orgAreaOpacity = +d3.select(this).style('opacity'); return 0; });
|
5240
|
-
contextArea
|
5241
|
-
.style("opacity", 0)
|
5242
|
-
.transition().duration(duration)
|
5243
|
-
.attr("d", drawAreaOnSub)
|
5244
|
-
.style("fill", $$.color)
|
5245
|
-
.style("opacity", $$.orgAreaOpacity);
|
5246
|
-
contextArea.exit().transition().duration(durationForExit)
|
5247
|
-
.style('opacity', 0)
|
5248
|
-
.remove();
|
5389
|
+
|
5390
|
+
$$.updateBarForSubchart(duration);
|
5391
|
+
$$.updateLineForSubchart(duration);
|
5392
|
+
$$.updateAreaForSubchart(duration);
|
5393
|
+
|
5394
|
+
$$.redrawBarForSubchart(drawBarOnSub, duration, duration);
|
5395
|
+
$$.redrawLineForSubchart(drawLineOnSub, duration, duration);
|
5396
|
+
$$.redrawAreaForSubchart(drawAreaOnSub, duration, duration);
|
5249
5397
|
}
|
5250
5398
|
}
|
5251
5399
|
};
|
@@ -5358,7 +5506,7 @@
|
|
5358
5506
|
ids = [];
|
5359
5507
|
|
5360
5508
|
return function (d) {
|
5361
|
-
var id = d.id || d, color;
|
5509
|
+
var id = d.id || (d.data && d.data.id) || d, color;
|
5362
5510
|
|
5363
5511
|
// if callback function is provided
|
5364
5512
|
if (colors[id] instanceof Function) {
|
@@ -5402,7 +5550,7 @@
|
|
5402
5550
|
formatForY = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.yFormat,
|
5403
5551
|
formatForY2 = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.y2Format;
|
5404
5552
|
return function (v, ratio, id) {
|
5405
|
-
var format = $$.
|
5553
|
+
var format = $$.axis.getId(id) === 'y2' ? formatForY2 : formatForY;
|
5406
5554
|
return format.call($$, v, ratio);
|
5407
5555
|
};
|
5408
5556
|
};
|
@@ -5422,16 +5570,20 @@
|
|
5422
5570
|
c3_chart_internal_fn.defaultArcValueFormat = function (v, ratio) {
|
5423
5571
|
return (ratio * 100).toFixed(1) + '%';
|
5424
5572
|
};
|
5425
|
-
c3_chart_internal_fn.
|
5573
|
+
c3_chart_internal_fn.dataLabelFormat = function (targetId) {
|
5426
5574
|
var $$ = this, data_labels = $$.config.data_labels,
|
5427
|
-
format = function (v) { return isValue(v) ? +v : ""; };
|
5575
|
+
format, defaultFormat = function (v) { return isValue(v) ? +v : ""; };
|
5428
5576
|
// find format according to axis id
|
5429
5577
|
if (typeof data_labels.format === 'function') {
|
5430
5578
|
format = data_labels.format;
|
5431
5579
|
} else if (typeof data_labels.format === 'object') {
|
5432
|
-
if (data_labels.format[
|
5433
|
-
format = data_labels.format[
|
5580
|
+
if (data_labels.format[targetId]) {
|
5581
|
+
format = data_labels.format[targetId] === true ? defaultFormat : data_labels.format[targetId];
|
5582
|
+
} else {
|
5583
|
+
format = function () { return ''; };
|
5434
5584
|
}
|
5585
|
+
} else {
|
5586
|
+
format = defaultFormat;
|
5435
5587
|
}
|
5436
5588
|
return format;
|
5437
5589
|
};
|
@@ -5701,7 +5853,6 @@
|
|
5701
5853
|
targetIds = $$.mapToTargetIds(targetIds);
|
5702
5854
|
candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))),
|
5703
5855
|
|
5704
|
-
this.revert();
|
5705
5856
|
candidates.classed(CLASS.focused, false).classed(CLASS.defocused, true);
|
5706
5857
|
if ($$.hasArcType()) {
|
5707
5858
|
$$.unexpandArc(targetIds);
|
@@ -5726,6 +5877,11 @@
|
|
5726
5877
|
}
|
5727
5878
|
if ($$.config.legend_show) {
|
5728
5879
|
$$.showLegend(targetIds.filter($$.isLegendToShow.bind($$)));
|
5880
|
+
$$.legend.selectAll($$.selectorLegends(targetIds))
|
5881
|
+
.filter(function () {
|
5882
|
+
return $$.d3.select(this).classed(CLASS.legendItemFocused);
|
5883
|
+
})
|
5884
|
+
.classed(CLASS.legendItemFocused, false);
|
5729
5885
|
}
|
5730
5886
|
|
5731
5887
|
$$.focusedTargetIds = [];
|
@@ -5776,10 +5932,10 @@
|
|
5776
5932
|
$$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true});
|
5777
5933
|
};
|
5778
5934
|
|
5779
|
-
c3_chart_fn.toggle = function (targetIds) {
|
5935
|
+
c3_chart_fn.toggle = function (targetIds, options) {
|
5780
5936
|
var that = this, $$ = this.internal;
|
5781
5937
|
$$.mapToTargetIds(targetIds).forEach(function (targetId) {
|
5782
|
-
$$.isTargetToShow(targetId) ? that.hide(targetId) : that.show(targetId);
|
5938
|
+
$$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options);
|
5783
5939
|
});
|
5784
5940
|
};
|
5785
5941
|
|
@@ -5828,6 +5984,12 @@
|
|
5828
5984
|
config.data_axes[id] = args.axes[id];
|
5829
5985
|
});
|
5830
5986
|
}
|
5987
|
+
// update colors if exists
|
5988
|
+
if ('colors' in args) {
|
5989
|
+
Object.keys(args.colors).forEach(function (id) {
|
5990
|
+
config.data_colors[id] = args.colors[id];
|
5991
|
+
});
|
5992
|
+
}
|
5831
5993
|
// use cache if exists
|
5832
5994
|
if ('cacheIds' in args && $$.hasCaches(args.cacheIds)) {
|
5833
5995
|
$$.load($$.getCaches(args.cacheIds), args.done);
|
@@ -6221,6 +6383,7 @@
|
|
6221
6383
|
options.withTransitionForTransform = false;
|
6222
6384
|
$$.transiting = false;
|
6223
6385
|
$$.setTargetType(targetIds, type);
|
6386
|
+
$$.updateTargets($$.data.targets); // this is needed when transforming to arc
|
6224
6387
|
$$.updateAndRedraw(options);
|
6225
6388
|
};
|
6226
6389
|
|
@@ -6377,9 +6540,9 @@
|
|
6377
6540
|
var $$ = this.internal;
|
6378
6541
|
if (arguments.length) {
|
6379
6542
|
Object.keys(labels).forEach(function (axisId) {
|
6380
|
-
$$.
|
6543
|
+
$$.axis.setLabelText(axisId, labels[axisId]);
|
6381
6544
|
});
|
6382
|
-
$$.
|
6545
|
+
$$.axis.updateLabels();
|
6383
6546
|
}
|
6384
6547
|
// TODO: return some values?
|
6385
6548
|
};
|
@@ -6459,11 +6622,18 @@
|
|
6459
6622
|
|
6460
6623
|
c3_chart_fn.destroy = function () {
|
6461
6624
|
var $$ = this.internal;
|
6462
|
-
|
6463
|
-
$$.data.xs = {};
|
6464
|
-
$$.selectChart.classed('c3', false).html("");
|
6625
|
+
|
6465
6626
|
window.clearInterval($$.intervalForObserveInserted);
|
6466
6627
|
window.onresize = null;
|
6628
|
+
|
6629
|
+
$$.selectChart.classed('c3', false).html("");
|
6630
|
+
|
6631
|
+
// MEMO: this is needed because the reference of some elements will not be released, then memory leak will happen.
|
6632
|
+
Object.keys($$).forEach(function (key) {
|
6633
|
+
$$[key] = null;
|
6634
|
+
});
|
6635
|
+
|
6636
|
+
return null;
|
6467
6637
|
};
|
6468
6638
|
|
6469
6639
|
c3_chart_fn.tooltip = function () {};
|
@@ -6552,7 +6722,8 @@
|
|
6552
6722
|
return newScale;
|
6553
6723
|
}
|
6554
6724
|
function textFormatted(v) {
|
6555
|
-
|
6725
|
+
var formatted = tickFormat ? tickFormat(v) : v;
|
6726
|
+
return typeof formatted !== 'undefined' ? formatted : '';
|
6556
6727
|
}
|
6557
6728
|
function getSizeFor1Char(tick) {
|
6558
6729
|
if (tickTextCharSize) {
|
@@ -6575,9 +6746,13 @@
|
|
6575
6746
|
tickTextCharSize = size;
|
6576
6747
|
return size;
|
6577
6748
|
}
|
6749
|
+
function transitionise(selection) {
|
6750
|
+
return params.withoutTransition ? selection : d3.transition(selection);
|
6751
|
+
}
|
6578
6752
|
function axis(g) {
|
6579
6753
|
g.each(function () {
|
6580
|
-
var g = d3.select(this);
|
6754
|
+
var g = axis.g = d3.select(this);
|
6755
|
+
|
6581
6756
|
var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = copyScale();
|
6582
6757
|
|
6583
6758
|
var ticks = tickValues ? tickValues : generateTicks(scale1),
|
@@ -6585,12 +6760,12 @@
|
|
6585
6760
|
tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", 1e-6),
|
6586
6761
|
// MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks.
|
6587
6762
|
tickExit = tick.exit().remove(),
|
6588
|
-
tickUpdate =
|
6763
|
+
tickUpdate = transitionise(tick).style("opacity", 1),
|
6589
6764
|
tickTransform, tickX, tickY;
|
6590
6765
|
|
6591
6766
|
var range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range()),
|
6592
6767
|
path = g.selectAll(".domain").data([ 0 ]),
|
6593
|
-
pathUpdate = (path.enter().append("path").attr("class", "domain"),
|
6768
|
+
pathUpdate = (path.enter().append("path").attr("class", "domain"), transitionise(path));
|
6594
6769
|
tickEnter.append("line");
|
6595
6770
|
tickEnter.append("text");
|
6596
6771
|
|
@@ -6676,6 +6851,33 @@
|
|
6676
6851
|
tspan.exit().remove();
|
6677
6852
|
tspan.text(function (d) { return d.splitted; });
|
6678
6853
|
|
6854
|
+
var rotate = params.tickTextRotate;
|
6855
|
+
|
6856
|
+
function textAnchorForText(rotate) {
|
6857
|
+
if (!rotate) {
|
6858
|
+
return 'middle';
|
6859
|
+
}
|
6860
|
+
return rotate > 0 ? "start" : "end";
|
6861
|
+
}
|
6862
|
+
function textTransform(rotate) {
|
6863
|
+
if (!rotate) {
|
6864
|
+
return '';
|
6865
|
+
}
|
6866
|
+
return "rotate(" + rotate + ")";
|
6867
|
+
}
|
6868
|
+
function dxForText(rotate) {
|
6869
|
+
if (!rotate) {
|
6870
|
+
return 0;
|
6871
|
+
}
|
6872
|
+
return 8 * Math.sin(Math.PI * (rotate / 180));
|
6873
|
+
}
|
6874
|
+
function yForText(rotate) {
|
6875
|
+
if (!rotate) {
|
6876
|
+
return tickLength;
|
6877
|
+
}
|
6878
|
+
return 11.5 - 2.5 * (rotate / 15) * (rotate > 0 ? 1 : -1);
|
6879
|
+
}
|
6880
|
+
|
6679
6881
|
switch (orient) {
|
6680
6882
|
case "bottom":
|
6681
6883
|
{
|
@@ -6683,14 +6885,16 @@
|
|
6683
6885
|
lineEnter.attr("y2", innerTickSize);
|
6684
6886
|
textEnter.attr("y", tickLength);
|
6685
6887
|
lineUpdate.attr("x1", tickX).attr("x2", tickX).attr("y2", tickSize);
|
6686
|
-
textUpdate.attr("x", 0).attr("y",
|
6687
|
-
|
6688
|
-
|
6888
|
+
textUpdate.attr("x", 0).attr("y", yForText(rotate))
|
6889
|
+
.style("text-anchor", textAnchorForText(rotate))
|
6890
|
+
.attr("transform", textTransform(rotate));
|
6891
|
+
tspan.attr('x', 0).attr("dy", tspanDy).attr('dx', dxForText(rotate));
|
6689
6892
|
pathUpdate.attr("d", "M" + range[0] + "," + outerTickSize + "V0H" + range[1] + "V" + outerTickSize);
|
6690
6893
|
break;
|
6691
6894
|
}
|
6692
6895
|
case "top":
|
6693
6896
|
{
|
6897
|
+
// TODO: rotated tick text
|
6694
6898
|
tickTransform = axisX;
|
6695
6899
|
lineEnter.attr("y2", -innerTickSize);
|
6696
6900
|
textEnter.attr("y", -tickLength);
|
@@ -6760,9 +6964,20 @@
|
|
6760
6964
|
tickCentered = isCentered;
|
6761
6965
|
return axis;
|
6762
6966
|
};
|
6763
|
-
axis.tickOffset = function () {
|
6967
|
+
axis.tickOffset = function () {
|
6764
6968
|
return tickOffset;
|
6765
6969
|
};
|
6970
|
+
axis.tickInterval = function () {
|
6971
|
+
var interval, length;
|
6972
|
+
if (params.isCategory) {
|
6973
|
+
interval = tickOffset * 2;
|
6974
|
+
}
|
6975
|
+
else {
|
6976
|
+
length = axis.g.select('path.domain').node().getTotalLength() - outerTickSize * 2;
|
6977
|
+
interval = length / axis.g.selectAll('line').size();
|
6978
|
+
}
|
6979
|
+
return interval === Infinity ? 0 : interval;
|
6980
|
+
};
|
6766
6981
|
axis.ticks = function () {
|
6767
6982
|
if (!arguments.length) { return tickArguments; }
|
6768
6983
|
tickArguments = arguments;
|
@@ -6788,6 +7003,41 @@
|
|
6788
7003
|
return axis;
|
6789
7004
|
}
|
6790
7005
|
|
7006
|
+
c3_chart_internal_fn.isSafari = function () {
|
7007
|
+
var ua = window.navigator.userAgent;
|
7008
|
+
return ua.indexOf('Safari') >= 0 && ua.indexOf('Chrome') < 0;
|
7009
|
+
};
|
7010
|
+
c3_chart_internal_fn.isChrome = function () {
|
7011
|
+
var ua = window.navigator.userAgent;
|
7012
|
+
return ua.indexOf('Chrome') >= 0;
|
7013
|
+
};
|
7014
|
+
|
7015
|
+
// PhantomJS doesn't have support for Function.prototype.bind, which has caused confusion. Use
|
7016
|
+
// this polyfill to avoid the confusion.
|
7017
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill
|
7018
|
+
|
7019
|
+
if (!Function.prototype.bind) {
|
7020
|
+
Function.prototype.bind = function(oThis) {
|
7021
|
+
if (typeof this !== 'function') {
|
7022
|
+
// closest thing possible to the ECMAScript 5
|
7023
|
+
// internal IsCallable function
|
7024
|
+
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
|
7025
|
+
}
|
7026
|
+
|
7027
|
+
var aArgs = Array.prototype.slice.call(arguments, 1),
|
7028
|
+
fToBind = this,
|
7029
|
+
fNOP = function() {},
|
7030
|
+
fBound = function() {
|
7031
|
+
return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
|
7032
|
+
};
|
7033
|
+
|
7034
|
+
fNOP.prototype = this.prototype;
|
7035
|
+
fBound.prototype = new fNOP();
|
7036
|
+
|
7037
|
+
return fBound;
|
7038
|
+
};
|
7039
|
+
}
|
7040
|
+
|
6791
7041
|
if (typeof define === 'function' && define.amd) {
|
6792
7042
|
define("c3", ["d3"], c3);
|
6793
7043
|
} else if ('undefined' !== typeof exports && 'undefined' !== typeof module) {
|