1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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);
|