]> nos-oignons.net Git - website.git/blob - assets/pie_graphs.js
graphnion.*.draw: Passage à l'API basée sur les promesses
[website.git] / assets / pie_graphs.js
1 function PieDrawer(selector) {
2   this.selector = selector;
3 };
4 PieDrawer.width = 150;
5 PieDrawer.height = 150;
6 PieDrawer.radius = Math.min(PieDrawer.width, PieDrawer.height) / 2;
7 PieDrawer.formatPercent = d3.format(".2%");
8
9 PieDrawer.color_nos_oignons = "#ffa430";
10 PieDrawer.color_others = "#57075f";
11
12 PieDrawer.arc = d3.arc()
13     .outerRadius(PieDrawer.radius - 10)
14     .innerRadius(PieDrawer.radius - 40);
15
16 PieDrawer.labelRadius = PieDrawer.radius - 15;
17
18 PieDrawer.pie = d3.pie()
19     .sort(null)
20     .value(function(d) { return d.frac; });
21
22 PieDrawer.onionoo_url = "https://onionoo.torproject.org/details?type=relay&contact=adminsys@nos-oignons.net";
23
24 PieDrawer.prototype.getFieldName = undefined;
25 PieDrawer.prototype.getField = undefined;
26 PieDrawer.prototype.draw = function() {
27   var svg = d3.select(this.selector).append("svg")
28       .style("margin", "auto")
29       .attr("width", PieDrawer.width)
30       .attr("height", PieDrawer.height)
31     .append("g")
32       .attr("transform", "translate(" + PieDrawer.width / 2 + "," + PieDrawer.height / 2 + ")");
33
34   var text = svg.append("text")
35       .attr("text-anchor", "middle")
36       .attr("dy", ".35em")
37       .text(L10n.loading);
38
39   var field_getter = this.getField;
40   d3.json(PieDrawer.onionoo_url + "&fields=fingerprint," + this.getFieldName())
41     .then(function(raw_data) {
42       var frac_nos_oignons = 0;
43       raw_data['relays'].forEach(function(d) {
44         nos_oignons_relays.forEach(function(r) {
45           if (r.fingerprint == d.fingerprint) {
46             var value = field_getter(d);
47             if (value) {
48               frac_nos_oignons += value;
49             }
50           }
51         });
52       });
53       var frac_others = 1 - frac_nos_oignons;
54
55       data = [ { name: L10n.nos_oignons, frac: frac_nos_oignons, color: PieDrawer.color_nos_oignons, },
56                { name: L10n.others,      frac: frac_others,      color: PieDrawer.color_others }, ];
57
58       text.text(PieDrawer.formatPercent(data[0].frac));
59
60       var g = svg.selectAll(".arc")
61           .data(PieDrawer.pie(data))
62         .enter().append("g")
63           .attr("class", "arc");
64
65       g.append("path")
66           .attr("d", PieDrawer.arc)
67           .style("fill", function(d) { return d.data.color; });
68
69   });
70 }
71
72 function ConsensusPieDrawer(selector) {
73   this.selector = selector;
74 };
75 ConsensusPieDrawer.prototype = new PieDrawer();
76 ConsensusPieDrawer.prototype.getSelector = function() {
77   return "#consensus-pie";
78 };
79 ConsensusPieDrawer.prototype.getFieldName = function() {
80   return "consensus_weight_fraction";
81 };
82 ConsensusPieDrawer.prototype.getField = function(r) {
83   return r.consensus_weight_fraction;
84 };
85
86 function ExitPieDrawer(selector) {
87   this.selector = selector;
88 };
89 ExitPieDrawer.prototype = new PieDrawer();
90 ExitPieDrawer.prototype.getFieldName = function() {
91   return "exit_probability";
92 };
93 ExitPieDrawer.prototype.getField = function(r) {
94   return r.exit_probability;
95 };