Commits

dgc committed e4d3165

downloads: put each available version into a separate table

With this update we generate a separate table on the /downloads page for
each version that is represented in sources.js. Downloader.maxversions
is the number of versions to display by default; 0 means to display all.
If any versions are not displayed by default, a "more versions" label
appears. Clicking it reveals the remaining versions.

Comments (0)

Files changed (2)

static/css/styles.css

 thead td, thead th { background: #999; color: #fff; font-weight: bold; }
 tbody td { border-bottom: 1px solid #ccc; }
 tbody td em { font-style: normal; font-weight: bolder; }
+tbody td:last-child { width: 5em; }
+
+/*
+ * Table expansion
+ */
+div #more { font-size: smaller; color: #999; }
 
 /*
  * Quotes

static/js/download.js

 
 
 var Downloader = {
+    // maximum number of versions to display (0 to display all available)
+    maxversions: 3,
+
     downloads: [],
 
     init: function (sources) {
         return null;
     },
 
-    listall: function () {
-        // copy the download list
-        var downloads = this.downloads.slice(0);
+    versions: function () {
+        var uniq = new Object();
+        for (i in this.downloads) {
+            uniq[this.downloads[i].version] = 1;
+        }
+        var versions = new Array();
+        for (key in uniq) {
+            versions.push(key);
+        }
+        versions.sort(function (a, b) {
+            a = a.toLowerCase();
+            b = b.toLowerCase();
+            return (a < b) - (b < a);
+        });
+        return versions;
+    },
+
+    listall: function (selector) {
+        if (selector == null)
+            selector = function (o) { return true; }
+
+        // copy the download list, selecting only wanted nodes
+        var downloads = new Array();
+        for (i in this.downloads) {
+            if (selector(this.downloads[i])) {
+                downloads.push(this.downloads[i]);
+            }
+        }
+
         // alpha-sort it by description (case-folded)
         downloads.sort(function (a, b) {
             a = a.desc.toLowerCase();
         });
 
         var desc;
+        var out = ''
         for (i in downloads) {
             var dl = downloads[i];
             var ua = navigator.userAgent;
                 desc = '<em>' + dl.desc + '</em>';
             else
                 desc = dl.desc;
-            document.write('<tr>\n<td>' + desc + '</td>' +
-                           '<td></td>' +
-                           '<td><a href="' + dl.url + '">download</a></td>' +
-                           '</tr>');
+            out += '<tr>\n<td>' + desc + '</td>' +
+                   '<td></td>' +
+                   '<td><a href="' + dl.url + '">download</a></td>' +
+                   '</tr>';
         }
+        return out;
+    },
+
+    table: function (name, selector) {
+        var out = '';
+        out += '<table border="0" cellspacing="0" ' +
+               'cellpadding="0" class="latest" width="100%">\n';
+        out += '<thead>\n';
+        out += '<tr>\n';
+        out += '<th>Mercurial ';
+        out += name;
+        out += '</th>';
+        out += '<th></th>';
+        out += '<th></th>';
+        out += '</tr>';
+        out += '</thead>';
+        out += '<tbody>';
+        out += this.listall(selector);
+        out += '</tbody>';
+        out += '</table>';
+        out += '<br/>';
+        return out;
     }
 };