// 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.visiblePackages().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);