summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/controller/generations.js30
-rw-r--r--js/model/generations.js28
-rw-r--r--js/routes.js3
-rw-r--r--js/view/generations.js58
-rw-r--r--js/view/layout.js10
5 files changed, 124 insertions, 5 deletions
diff --git a/js/controller/generations.js b/js/controller/generations.js
new file mode 100644
index 0000000..011dfa2
--- /dev/null
+++ b/js/controller/generations.js
@@ -0,0 +1,30 @@
+// guix-web - Web interface for GNU Guix
+// Copyright © 2014 David Thompson <davet@gnu.org>
+//
+// This program is free software: you can redistribute it and/or
+// modify it under the terms of the GNU Affero General Public License
+// as published by the Free Software Foundation, either version 3 of
+// the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public
+// License along with this program. If not, see
+// <http://www.gnu.org/licenses/>.
+
+(function(generations) {
+ generations.controller = (function() {
+ function controller() {
+ this.generations = m.prop([]);
+
+ generations.Generations()
+ .then(this.generations)
+ .then(m.redraw);
+ }
+
+ return controller;
+ })();
+})(guix.generations);
diff --git a/js/model/generations.js b/js/model/generations.js
new file mode 100644
index 0000000..0dc4e6c
--- /dev/null
+++ b/js/model/generations.js
@@ -0,0 +1,28 @@
+// guix-web - Web interface for GNU Guix
+// Copyright © 2014 David Thompson <davet@gnu.org>
+//
+// This program is free software: you can redistribute it and/or
+// modify it under the terms of the GNU Affero General Public License
+// as published by the Free Software Foundation, either version 3 of
+// the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public
+// License along with this program. If not, see
+// <http://www.gnu.org/licenses/>.
+
+guix.generations = {};
+
+(function(generations) {
+ generations.Generations = function() {
+ return m.request({
+ method: "GET",
+ url: "/generations",
+ background: true
+ });
+ };
+})(guix.generations);
diff --git a/js/routes.js b/js/routes.js
index d749d3c..b3fee60 100644
--- a/js/routes.js
+++ b/js/routes.js
@@ -16,5 +16,6 @@
// <http://www.gnu.org/licenses/>.
m.route(document.body, "/", {
- "/": guix.packages
+ "/": guix.packages,
+ "/generations": guix.generations
});
diff --git a/js/view/generations.js b/js/view/generations.js
new file mode 100644
index 0000000..912a1ab
--- /dev/null
+++ b/js/view/generations.js
@@ -0,0 +1,58 @@
+// guix-web - Web interface for GNU Guix
+// Copyright © 2014 David Thompson <davet@gnu.org>
+//
+// This program is free software: you can redistribute it and/or
+// modify it under the terms of the GNU Affero General Public License
+// as published by the Free Software Foundation, either version 3 of
+// the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public
+// License along with this program. If not, see
+// <http://www.gnu.org/licenses/>.
+
+(function(generations) {
+ generations.view = function(ctrl) {
+ return guix.withLayout([
+ m("h2", [
+ "Generations",
+ m("span.badge", ctrl.generations().length)
+ ]),
+ m("table.table.table-bordered", [
+ m("thead", m("tr", [
+ m("th", "#"),
+ m("th", "Name"),
+ m("th", "Version"),
+ m("th", "Output"),
+ m("th", "Location")
+ ])),
+ m("tbody", [
+ ctrl.generations().map(function(generation) {
+ var entries = generation.manifestEntries;
+
+ function renderRow(entry, isFirst) {
+ return m("tr", [
+ isFirst ? m("td", {
+ rowspan: entries.length
+ }, m("strong", generation.number)) : null,
+ m("td", entry.name),
+ m("td", entry.version),
+ m("td", entry.output),
+ m("td", entry.location)
+ ]);
+ }
+
+ return [renderRow(entries[0], true)]
+ .concat(entries.slice(1).map(function (entry) {
+ return renderRow(entry, false);
+ }));
+ })
+ ])
+ ])
+ ]);
+ };
+})(guix.generations);
diff --git a/js/view/layout.js b/js/view/layout.js
index c733a8f..02ee639 100644
--- a/js/view/layout.js
+++ b/js/view/layout.js
@@ -53,11 +53,13 @@ guix.withLayout = (function() {
m(".navbar-header", m("img.logo", { src: "/images/logo.png" })),
m("ul.nav.navbar-nav", [
m("li.active", m("a", {
- href: "#",
- onclick: function() {
- m.route("/");
- }
+ config: m.route,
+ href: "/"
}, "Packages")),
+ m("li", m("a", {
+ config: m.route,
+ href: "/generations"
+ }, "Generations"))
]),
m("ul.nav.navbar-nav.navbar-right")
])),