summaryrefslogtreecommitdiff
path: root/js/controller/packages.js
blob: 3a7858dcfce0c3cb47dda8267cb3bf4bed6091ab (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
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);