[tor-commits] [atlas/master] Ticket #15508:

irl at torproject.org irl at torproject.org
Thu Sep 14 09:12:07 UTC 2017


commit 4af60ea0f94061ab42f8abe295453072c680503b
Author: Mark Henderson <mhenderson at stackoverflow.com>
Date:   Mon Aug 28 08:12:19 2017 -0400

    Ticket #15508:
    
    - Sorts bandwidth nicely
    - Sorts IP addresses nicely
    
    - Adds a file for custom sorting filters `dataTables.Sorting.js`
    - In `js/views/search/do.js` defines custom sorting options
---
 js/libs/datatables/dataTables.Sorting.js | 122 +++++++++++++++++++++++++++++++
 js/main.js                               |   1 +
 js/views/search/do.js                    |  24 +++++-
 3 files changed, 143 insertions(+), 4 deletions(-)

diff --git a/js/libs/datatables/dataTables.Sorting.js b/js/libs/datatables/dataTables.Sorting.js
new file mode 100644
index 0000000..ba77fdd
--- /dev/null
+++ b/js/libs/datatables/dataTables.Sorting.js
@@ -0,0 +1,122 @@
+var loadSortingExtensions = function(){
+    /**
+     * Atlas renders speed as MiB/s, KiB/sec, etc - which as a string does
+     * not sort nicely at all. This sorting plugin fixes that by converting
+     * the speeds back into a raw Bytes value, and then sorting. It is based
+     * on two different versions of the datatabes file-size sorting plugin -
+     * https://datatables.net/plug-ins/sorting/file-size - the latest edition
+     * that has superior matching, and a very old version from 2011 that works
+     * with the version of datatables that Atlas runs on.
+     *  @name File size
+     *  @author mhenderson
+     */
+
+    var getBytesFromString = function(xstring,ystring){
+        var xmatches = xstring.match( /(\d+(?:\.\d+)?)\s*([a-z]+)/i );
+        var ymatches = ystring.match( /(\d+(?:\.\d+)?)\s*([a-z]+)/i );
+        var multipliers = {
+            b:  1,
+            bytes: 1,
+            kb: 1000,
+            kib: 1024,
+            mb: 1000000,
+            mib: 1048576,
+            gb: 1000000000,
+            gib: 1073741824,
+            tb: 1000000000000,
+            tib: 1099511627776,
+            pb: 1000000000000000,
+            pib: 1125899906842624
+        };
+    
+        var x = xmatches[1];
+        if (xmatches){
+            x = x * multipliers[xmatches[2].toLowerCase()];
+        }
+        var y = ymatches[1]; 
+        if (ymatches) {
+            y = y * multipliers[ymatches[2].toLowerCase()];
+        }
+
+        return [x,y]
+    }
+
+    jQuery.extend( jQuery.fn.dataTableExt.oSort, {
+        "file-size-asc": function ( a, b ) {
+            var raw = getBytesFromString(a,b)
+            var x = raw[0]
+            var y = raw[1]
+            return ((x < y) ? -1 : ((x > y) ?  1 : 0));
+        },
+
+        "file-size-desc": function ( a, b ) {
+            var raw = getBytesFromString(a,b)
+            var x = raw[0]
+            var y = raw[1]          
+            return ((x < y) ?  1 : ((x > y) ? -1 : 0));
+        }
+    } );
+
+    /**
+     * Sorts a column containing IP addresses in typical dot notation. This can 
+     * be most useful when using DataTables for a networking application, and 
+     * reporting information containing IP address. Also has a matching type 
+     * detection plug-in for automatic type detection.
+     *  @name IP addresses 
+     *  @author Brad Wasson
+     */
+
+    jQuery.extend( jQuery.fn.dataTableExt.oSort, {
+        "ip-address-asc": function ( a, b ) {
+            var m = a.split("."), x = "";
+            var n = b.split("."), y = "";
+            for(var i = 0; i < m.length; i++) {
+                var item = m[i];
+                if(item.length == 1) {
+                    x += "00" + item;
+                } else if(item.length == 2) {
+                    x += "0" + item;
+                } else {
+                    x += item;
+                }
+            }
+            for(var i = 0; i < n.length; i++) {
+                var item = n[i];
+                if(item.length == 1) {
+                    y += "00" + item;
+                } else if(item.length == 2) {
+                    y += "0" + item;
+                } else {
+                    y += item;
+                }
+            }
+            return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+        },
+
+        "ip-address-desc": function ( a, b ) {
+            var m = a.split("."), x = "";
+            var n = b.split("."), y = "";
+            for(var i = 0; i < m.length; i++) {
+                var item = m[i];
+                if(item.length == 1) {
+                    x += "00" + item;
+                } else if (item.length == 2) {
+                    x += "0" + item;
+                } else {
+                    x += item;
+                }
+            }
+            for(var i = 0; i < n.length; i++) {
+                var item = n[i];
+                if(item.length == 1) {
+                    y += "00" + item;
+                } else if (item.length == 2) {
+                    y += "0" + item;
+                } else {
+                    y += item;
+                }
+            }
+            return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+        }
+    } );
+}
\ No newline at end of file
diff --git a/js/main.js b/js/main.js
index bd91484..8c49798 100644
--- a/js/main.js
+++ b/js/main.js
@@ -10,6 +10,7 @@ require.config({
     text: 'libs/require/text',
     datatables: 'libs/datatables/jquery.dataTables.min',
     datatablest: 'libs/datatables/dataTables.TorStatus',
+    datatablessort: 'libs/datatables/dataTables.Sorting',
     tooltip: 'libs/bootstrap/bootstrap-tooltip',
     typeahead: 'libs/bootstrap/bootstrap-typeahead',
     collapse: 'libs/bootstrap/bootstrap-collapse',
diff --git a/js/views/search/do.js b/js/views/search/do.js
index 74f38f0..eb3d2aa 100644
--- a/js/views/search/do.js
+++ b/js/views/search/do.js
@@ -6,6 +6,7 @@ define([
   'collections/results',
   'text!templates/search/do.html',
   'datatables',
+  'datatablessort',
   'tooltip',
   'helpers',
   'collapse',
@@ -115,12 +116,27 @@ define([
             document.title = "Atlas";
             this.filtering();
             var asInitVals = new Array();
-		var compiledTemplate = _.template(doSearchTemplate, {relays: this.relays, countries: CountryCodes, error: this.error});
+            var compiledTemplate = _.template(doSearchTemplate, {relays: this.relays, countries: CountryCodes, error: this.error});
 			this.el.html(compiledTemplate);
-			var fp = this;
-			// This creates the table using DataTables
+            var fp = this;
+            loadSortingExtensions();
+            // This creates the table using DataTables
 			var oTable = $('#torstatus_results').dataTable({
-				// Save the state of the tables
+                //Define column specific options
+                "aoColumns": [
+                        null,   //Status
+                        null,   //Nickname
+                        { "sType":  "file-size" },  //Bandwidth
+                        null,   //Uptime
+                        null,   //Country
+                        { "sType":  "ip-address" },  //IP Address
+                        null,   //Flags
+                        null,   //Properties
+                        null,   //ORPort
+                        null,   //DirPort
+                        null    //Type
+                    ],
+                // Save the state of the tables
                 "sDom": "<'row'<'span6'l><'span6 hide'f>r>t<'row'<'span6'i><'span6'p>>",
 				"bStateSave": false,
 				"aaSorting": [],



More information about the tor-commits mailing list