summaryrefslogtreecommitdiff
path: root/js/controller/packages.js
blob: 9cac565f637c58c26d7da0aa0da5f26bb89ff291 (plain)
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
// 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 = 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;
  })();
})();