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); })); }; }; guix.view = function(ctrl) { 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("h1", "GNU Guix"), m("h2", [ "Packages", m("span.badge", ctrl.packages().length) ]), m("div", [ m("label", "Search"), m("input", { type: "text", placeholder: 'gui.*', 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", package.name), m("td", package.version), m("td", package.synopsis), m("td", renderHomepage(package)), m("td", renderLicense(package)) ]); }) ]) ]) ]; }; m.module(document.getElementById("guix"), guix);