summaryrefslogtreecommitdiff
path: root/js/controller/packages.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/controller/packages.js')
-rw-r--r--js/controller/packages.js124
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);