// 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 // . (function() { var packages = guix.packages; packages.controller = (function() { var PAGE_SIZE = 20; function Pager(items) { return new packages.Pager(items, PAGE_SIZE); } function controller() { var self = this; this.searchTerm = m.prop(""); this.columns = [ { header: "Name", sortField: "name" }, { header: "Version", sortField: "version" }, { header: "Synopsis", sortField: "synopsis" }, { header: "Home Page", sortField: "homepage" }, { header: "License", sortField: function(package) { if(_.isArray(package.license)) { // Concatenate all license names together for sorting. return package.license.reduce(function(memo, l) { return memo.concat(l.name); }, ""); } return package.license.name; } } ]; this.sorter = m.prop(new packages.Sorter("name")); this.pager = m.prop(Pager([])); this.phase = m.prop(packages.PHASE_NONE); this.selectedPackage = m.prop(null); this.packages = m.prop([]); packages.Packages() .then(this.packages) .then(function(packages) { // All packages are visible initially self.sortAndPage(packages); }) .then(m.redraw); }; controller.prototype.packageCount = function() { return _.chain(this.pager().pages) .pluck('length') .reduce(guix.add, 0) .value(); }; controller.prototype.sortAndPage = function(packages) { this.pager(Pager(this.sorter().sort(packages))); }; controller.prototype.doSearch = function() { var regexp = new RegExp(this.searchTerm(), "i"); var filteredPackages = this.packages().filter(function(package) { return regexp.test(package.name) || regexp.test(package.synopsis); }); this.sortAndPage(filteredPackages); }; controller.prototype.sortBy = function(field) { if(this.sorter().field === field) { // Reverse sort order if the field is the same as before. this.sorter(this.sorter().reverse()); } else { this.sorter(new packages.Sorter(field)); } this.doSearch(); }; controller.prototype.installSelectedPackage = function() { var self = this; this.phase(packages.PHASE_DERIVATION); m.request({ method: "POST", url: "/packages/" .concat(this.selectedPackage().name) .concat("/install") }).then(function() { self.phase(packages.PHASE_SUCCESS); }, function() { self.phase(packages.PHASE_ERROR); }); }; return controller; })(); })();