From 2804e28ef22ded73a95da4508f7630db1db3c97d Mon Sep 17 00:00:00 2001 From: David Thompson Date: Thu, 7 Aug 2014 17:33:13 -0400 Subject: Rename guix-web.js to guix-packages.js. * guix-web (javascripts): Update. * js/guix-packages.js: New file. * js/guix-web.js: Delete it. --- js/guix-packages.js | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 js/guix-packages.js (limited to 'js/guix-packages.js') diff --git a/js/guix-packages.js b/js/guix-packages.js new file mode 100644 index 0000000..9c4c450 --- /dev/null +++ b/js/guix-packages.js @@ -0,0 +1,114 @@ +// guix-web - Web interface for GNU Guix +// Copyright © 2014 David Thompson +// +// 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 +// . + +var guix = {}; + +guix.Packages = function() { + return m.request({ method: "GET", url: "packages.json" }); +}; + +guix.controller = function() { + this.packages = guix.Packages(); + this.visiblePackages = m.prop([]); + this.searchTerm = m.prop(""); + + // All packages are visible initially + this.packages.then(this.visiblePackages); + + this.doSearch = function() { + var regexp = new RegExp(this.searchTerm()); + + this.visiblePackages(this.packages().filter(function(package) { + return regexp.test(package.name) || + regexp.test(package.synopsis); + })); + }; +}; + +guix.view = function(ctrl) { + function renderName(package) { + var name = package.name; + + return m("a", { href: "/package/".concat(name) }, name); + } + + function renderHomepage(package) { + if(package.homepage) { + return m("a", { href: package.homepage }, package.homepage); + } else { + return ""; + } + } + + function renderLicense(package) { + function licenseLink(license) { + return m("a", { href: license.uri }, license.name); + } + + if(_.isArray(package.license)) { + return m("ul.list-inline", package.license.map(function(license) { + return m("li", licenseLink(license)); + })); + } else if(package.license) { + return licenseLink(package.license); + } else { + return ""; + } + } + + return [ + m("h2", [ + "Packages", + m("span.badge", ctrl.packages().length) + ]), + m("input.form-control", { + type: "text", + placeholder: "Search", + onchange: m.withAttr("value", function(value) { + ctrl.searchTerm(value); + ctrl.doSearch(); + }), + value: ctrl.searchTerm() + }), + m("table.table", [ + m("thead", [ + m("tr", [ + ["Name", + "Version", + "Synopsis", + "Home Page", + "License"].map(function(header) { + return m("th", header); + }) + ]) + ]), + m("tbody", [ + ctrl.visiblePackages().map(function(package) { + return m("tr", [ + m("td", renderName(package)), + m("td", package.version), + m("td", package.synopsis), + m("td", renderHomepage(package)), + m("td", renderLicense(package)) + ]); + }) + ]) + ]) + ]; +}; + +m.module(document.getElementById("guix"), guix); -- cgit v1.2.3