changeset 355:e4d31654a9d3

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.
author David Champion <dgc@uchicago.edu>
date Tue, 23 Nov 2010 09:36:25 -0600
parents 3e0b0dc69adf
children a71e03f5edde
files static/css/styles.css static/js/download.js
diffstat 2 files changed, 65 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/static/css/styles.css	Mon Nov 22 20:16:50 2010 +0100
+++ b/static/css/styles.css	Tue Nov 23 09:36:25 2010 -0600
@@ -67,6 +67,12 @@
 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
--- a/static/js/download.js	Mon Nov 22 20:16:50 2010 +0100
+++ b/static/js/download.js	Tue Nov 23 09:36:25 2010 -0600
@@ -28,6 +28,9 @@
 
 
 var Downloader = {
+    // maximum number of versions to display (0 to display all available)
+    maxversions: 3,
+
     downloads: [],
 
     init: function (sources) {
@@ -47,9 +50,35 @@
         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();
@@ -58,6 +87,7 @@
         });
 
         var desc;
+        var out = ''
         for (i in downloads) {
             var dl = downloads[i];
             var ua = navigator.userAgent;
@@ -65,10 +95,32 @@
                 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;
     }
 };