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
|
// 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() {
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 = packages.Packages()
.then(function(packages) {
// All packages are visible initially
self.pager(Pager(packages));
})
.then(m.redraw);
};
controller.prototype.packageCount = function() {
return _.chain(this.pager().pages)
.pluck('length')
.reduce(guix.add, 0)
.value();
};
controller.prototype.doSearch = function() {
var regexp = new RegExp(this.searchTerm(), "i");
this.pager(Pager(this.packages().filter(function(package) {
return regexp.test(package.name) ||
regexp.test(package.synopsis);
})));
};
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;
})();
})();
|