[tor-commits] [atlas/master] Adds map options panel

irl at torproject.org irl at torproject.org
Sat Dec 2 22:08:49 UTC 2017


commit 966321690a124e50e55ae83bab27e53b78529a94
Author: Iain R. Learmonth <irl at fsfe.org>
Date:   Sat Dec 2 18:12:03 2017 +0000

    Adds map options panel
---
 css/atlas.css                |  8 ++++++-
 js/router.js                 |  1 -
 js/views/aggregate/map.js    | 53 +++++++++++++++++++++++++++-----------------
 templates/aggregate/map.html | 13 ++++++++++-
 4 files changed, 52 insertions(+), 23 deletions(-)

diff --git a/css/atlas.css b/css/atlas.css
index 3fd9cdb..89a1def 100644
--- a/css/atlas.css
+++ b/css/atlas.css
@@ -52,7 +52,7 @@ span.flags {
     background: #ff1515;
 }
 
-#home-search, #home-aggregate-search, #home-advanced-search {
+#home-search, #home-aggregate-search, #home-advanced-search, #map-radio-buttons {
     padding: 0;
     margin: 0 0 10px 0;
     width: 100%;
@@ -92,3 +92,9 @@ td a {
     width: 120px;
     display: inline;
 }
+
+label.radio-inline {
+    display: inline !important;
+    width: auto;
+}
+
diff --git a/js/router.js b/js/router.js
index 8a73620..6428622 100644
--- a/js/router.js
+++ b/js/router.js
@@ -124,7 +124,6 @@ define([
         $(".progress").show();
 
         aggregateMapView.collection.aType = "cc";
-        aggregateMapView.aggregateType = "consensus_weight_fraction";
 
         if (query) {
           query = query.trim();
diff --git a/js/views/aggregate/map.js b/js/views/aggregate/map.js
index d8d7ec0..f585e33 100644
--- a/js/views/aggregate/map.js
+++ b/js/views/aggregate/map.js
@@ -17,17 +17,8 @@ define([
     initialize: function() {
       this.collection = new aggregatesCollection;
     },
-    render: function(query){
-      document.title = "Relay Search";
-      var compiledTemplate = _.template(aggregateMapTemplate)
-      this.$el.html(compiledTemplate({query: query,
-                                     aggregates: this.collection.models,
-                                     countries: CountryCodes,
-                                     error: this.error,
-                                     relaysPublished: this.relaysPublished,
-                                     bridgesPublished: this.bridgesPublished}));
-
-      var aggregate_type = this.aggregateType;
+    plot: function() {
+      var aggregate_property = $('input[name="aggregate-property"]:checked').val();
       var aggregates = this.collection.models;
 
       var m_width = $("#container").width();
@@ -41,11 +32,11 @@ define([
       var path = d3.geo.path()
         .projection(projection);
 
+      $("#aggregate-map").html("");
+
       var svg = d3.select("#aggregate-map").append("svg")
         .attr("preserveAspectRatio", "xMidYMid")
         .attr("viewBox", "0 0 " + width + " " + height)
-        .attr("width", m_width)
-        .attr("height", m_width * height / width);
 
       svg.append("rect")
         .attr("class", "background")
@@ -58,13 +49,13 @@ define([
 
       var maximum_value = 0;
       _.each(aggregates, function(aggregate) {
-        if (aggregate[aggregate_type] > maximum_value) maximum_value = aggregate[aggregate_type];
+        if (aggregate[aggregate_property] > maximum_value) maximum_value = aggregate[aggregate_property];
       });
 
-      var getCountryAggregate = function(code, aggregate_type) {
+      var getCountryAggregate = function(code, aggregate_property) {
         var found = 0;
         _.each(aggregates, function(aggregate) {
-          if (aggregate.country.toUpperCase() == code) found = aggregate[aggregate_type];
+          if (aggregate.country.toUpperCase() == code) found = aggregate[aggregate_property];
         });
 
         return (found == 0) ? found : Math.sqrt(found/maximum_value);
@@ -94,7 +85,7 @@ define([
         .enter()
           .append("path")
             .attr("id", function(d) { return d.id; })
-            .style("fill-opacity", function(d) { return getCountryAggregate(d.id, aggregate_type); })
+            .style("fill-opacity", function(d) { return getCountryAggregate(d.id, aggregate_property); })
             .attr("d", path)
           .append("svg:title")
             .text( function(d) { return d.id; });
@@ -125,13 +116,35 @@ define([
           .text("" + (Math.pow(i,2)* maximum_value*100).toFixed(3) + "%");
       }
 
+     });
+    },
+    save: function() {
       /* Encode SVG image for download link. */
       html = d3.select("#aggregate-map")
         .node()
         .innerHTML;
-      d3.select("#save_svg")
-        .attr("href", "data:image/svg+xml;base64," + btoa(html));
-     });
+      window.open("data:image/svg+xml;base64," + btoa(html), "SaveSVG");
+    },
+    render: function(query){
+      document.title = "Relay Search";
+      var compiledTemplate = _.template(aggregateMapTemplate)
+      this.$el.html(compiledTemplate({query: query,
+                                     aggregates: this.collection.models,
+                                     countries: CountryCodes,
+                                     error: this.error,
+                                     relaysPublished: this.relaysPublished,
+                                     bridgesPublished: this.bridgesPublished}));
+
+      this.plot();
+
+      var thisView = this;
+
+      $('input[name="aggregate-property"]').bind('change', function(){
+        thisView.plot();
+      });
+      $('#save_svg').bind('click', function(){
+        thisView.save();
+      });
     },
     renderError: function(){
       var compiledTemplate = _.template(aggregateSearchTemplate);
diff --git a/templates/aggregate/map.html b/templates/aggregate/map.html
index 19efd66..1beac01 100644
--- a/templates/aggregate/map.html
+++ b/templates/aggregate/map.html
@@ -36,5 +36,16 @@
     <% } %>
 <% } else { %>
    <div id="aggregate-map"></div>
-   <a id="save_svg">Save Graph</a>
+   <div class="panel panel-default">
+   <div class="panel-body">
+   <form id="map-radio-buttons">
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="consensus_weight_fraction" checked="checked"> Consensus Weight</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="guard_probability"> Guard Probability</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="middle_probability"> Middle Probability</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="exit_probability"> Exit Probability</label>
+   </form>
+   <a class="btn btn-primary" href="#aggregate/cc<%= (query) ? "/" + query : "" %>">View Table</a>
+   <a class="btn btn-secondary" id="save_svg">Save Map</a>
+   </div>
+   </div>
 <% } %>





More information about the tor-commits mailing list