diff options
author | David Thompson <dthompson2@worcester.edu> | 2014-10-15 20:36:12 -0400 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2014-10-15 20:36:12 -0400 |
commit | f2b50d931ebd61dae469a03d572187aede5e06c7 (patch) | |
tree | a6d6bd7180a86f4913f26c24b6f8785f26703f42 /js/controller | |
parent | 8c5cb000f8c246a848725ecf41a0a011675f0d6b (diff) |
js: Break package components into model/view/controller files.
* js/packages.js: Delete.
* js/model/packages.js: New file.
* js/view/packages.js: New file.
* js/controller/packages.js: New file.
* js/routes.js: Use new namespace for packages.
* guix-web/view.scm (javascripts): Add new JS files.
Diffstat (limited to 'js/controller')
-rw-r--r-- | js/controller/packages.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/js/controller/packages.js b/js/controller/packages.js new file mode 100644 index 0000000..3a7858d --- /dev/null +++ b/js/controller/packages.js @@ -0,0 +1,124 @@ +// 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(packages) { + packages.controller = (function() { + function controller() { + var self = this; + + this.packages = packages.Packages(); + this.pages = m.prop([]); + this.currentPageIndex = 0; + this.pageSize = 20; + 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.phase = m.prop(packages.PHASE_NONE); + this.selectedPackage = m.prop(null); + + // All packages are visible initially + this.packages.then(function(packages) { + self.pages(self.paginate(packages, self.pageSize)); + }); + }; + + + controller.prototype.paginate = function(array, pageSize) { + return guix.chunk(this.sorter().sort(array), pageSize); + }; + + controller.prototype.currentPage = function() { + return this.pages()[this.currentPageIndex] || []; + }; + + controller.prototype.isFirstPage = function() { + return this.currentPageIndex === 0; + }; + + controller.prototype.isLastPage = function() { + return this.currentPageIndex === this.pages().length - 1; + }; + + controller.prototype.isCurrentPage = function(i) { + return this.currentPageIndex === i; + }; + + controller.prototype.packageCount = function() { + return this.pages().reduce(function(memo, page) { + return memo + page.length; + }, 0); + }; + + controller.prototype.doSearch = function() { + var regexp = new RegExp(this.searchTerm(), "i"); + + this.pages(this.paginate(this.packages().filter(function(package) { + return regexp.test(package.name) || + regexp.test(package.synopsis); + }), this.pageSize)); + // Reset pagination + this.currentPageIndex = 0; + }; + + 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; + })(); +})(guix.packages); |