mirror of
https://github.com/correl/melpa.git
synced 2025-04-14 01:01:08 -09:00
Simple pagination of results (#2307)
This commit is contained in:
parent
157a264533
commit
a0a4072d6c
2 changed files with 74 additions and 8 deletions
|
@ -1,5 +1,6 @@
|
||||||
body {
|
body {
|
||||||
padding-top: 60px;
|
padding-top: 60px;
|
||||||
|
padding-bottom: 200px;
|
||||||
}
|
}
|
||||||
h1, .navbar, .navbar .brand, .navbar a, .navbar .nav>li>a {
|
h1, .navbar, .navbar .brand, .navbar a, .navbar .nav>li>a {
|
||||||
color: #922793;
|
color: #922793;
|
||||||
|
|
|
@ -178,6 +178,65 @@
|
||||||
return "/#/" + encodeURIComponent(pkg.name);
|
return "/#/" + encodeURIComponent(pkg.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Pagination
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
melpa.paginator = {};
|
||||||
|
melpa.paginator.controller = function(getItemList) {
|
||||||
|
this.pageLength = m.prop(100);
|
||||||
|
this.windowSize = m.prop(7);
|
||||||
|
this.pageNumber = m.prop(1);
|
||||||
|
this.items = getItemList;
|
||||||
|
this.paginatedItems = function() {
|
||||||
|
if (this.pageNumber() !== null) {
|
||||||
|
return this.items().slice(this.pageLength() * (this.pageNumber() - 1),
|
||||||
|
this.pageLength() * this.pageNumber());
|
||||||
|
} else {
|
||||||
|
return this.items();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.maxPage = function() {
|
||||||
|
return Math.floor(this.items().length / this.pageLength());
|
||||||
|
};
|
||||||
|
this.prevPages = function() {
|
||||||
|
return _.last(_.range(1, this.pageNumber()),
|
||||||
|
Math.floor((this.windowSize() - 1) / 2));
|
||||||
|
};
|
||||||
|
this.nextPages = function() {
|
||||||
|
return _.first(_.range(this.pageNumber() + 1, this.maxPage()),
|
||||||
|
this.windowSize() - 1 - this.prevPages().length);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
melpa.paginator.view = function(ctrl) {
|
||||||
|
var prevPage = _.last(ctrl.prevPages());
|
||||||
|
var nextPage = _.first(ctrl.nextPages());
|
||||||
|
var pageLinkAttrs = function(n) {
|
||||||
|
if (n)
|
||||||
|
return { onclick: function(){ ctrl.pageNumber(n); } };
|
||||||
|
};
|
||||||
|
var pageLink = function(n) {
|
||||||
|
return m("li", m("a", pageLinkAttrs(n), m("span", n)));
|
||||||
|
};
|
||||||
|
return m("nav",
|
||||||
|
m("ul.pagination", [
|
||||||
|
m("li", { class: (prevPage ? "" : "disabled") },
|
||||||
|
m("a", pageLinkAttrs(prevPage), [
|
||||||
|
m("span", {"aria-hidden": "true"}, m.trust("«")),
|
||||||
|
m("span.sr-only", "Previous")
|
||||||
|
])),
|
||||||
|
ctrl.prevPages().map(pageLink),
|
||||||
|
m("li.active", m("a", m("span", [ctrl.pageNumber(), " ", m("span.sr-only", "(current)")]))),
|
||||||
|
ctrl.nextPages().map(pageLink),
|
||||||
|
m("li", { class: (nextPage ? "" : "disabled") },
|
||||||
|
m("a", pageLinkAttrs(nextPage), [
|
||||||
|
m("span", {"aria-hidden": "true"}, m.trust("»")),
|
||||||
|
m("span.sr-only", "Next")
|
||||||
|
]))
|
||||||
|
]));
|
||||||
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// Package list
|
// Package list
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -192,8 +251,11 @@
|
||||||
return this.packageList().matchingPackages(this.filterTerms());
|
return this.packageList().matchingPackages(this.filterTerms());
|
||||||
};
|
};
|
||||||
this.sortedPackages = function() {
|
this.sortedPackages = function() {
|
||||||
return this.packageList().sortedPackages(this.sortBy(), this.sortAscending());
|
var visible = this.matchingPackages();
|
||||||
};
|
return this.packageList()
|
||||||
|
.sortedPackages(this.sortBy(), this.sortAscending())
|
||||||
|
.filter(function(p) { return visible[p.name]; });
|
||||||
|
}.bind(this);
|
||||||
this.toggleSort = function(field) {
|
this.toggleSort = function(field) {
|
||||||
if (this.sortBy() == field) {
|
if (this.sortBy() == field) {
|
||||||
this.sortAscending(!this.sortAscending());
|
this.sortAscending(!this.sortAscending());
|
||||||
|
@ -202,10 +264,10 @@
|
||||||
this.sortBy(field);
|
this.sortBy(field);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
this.paginatorCtrl = new melpa.paginator.controller(this.sortedPackages);
|
||||||
};
|
};
|
||||||
|
|
||||||
melpa.packagelist.view = function(ctrl) {
|
melpa.packagelist.view = function(ctrl) {
|
||||||
var visible = ctrl.matchingPackages();
|
|
||||||
var sortToggler = function(field) {
|
var sortToggler = function(field) {
|
||||||
return function() { return ctrl.toggleSort(field); };
|
return function() { return ctrl.toggleSort(field); };
|
||||||
};
|
};
|
||||||
|
@ -223,10 +285,12 @@
|
||||||
])
|
])
|
||||||
]),
|
]),
|
||||||
m("p", [
|
m("p", [
|
||||||
m("input.form-control[type=search]", {placeholder: "Enter filter terms", autofocus: true,
|
m("input.form-control[type=search]", {
|
||||||
value: ctrl.filterTerms(), onkeyup: m.withAttr("value", ctrl.filterTerms)}),
|
placeholder: "Enter filter terms", autofocus: true,
|
||||||
|
value: ctrl.filterTerms(), onkeyup: m.withAttr("value", ctrl.filterTerms)
|
||||||
|
}),
|
||||||
" ",
|
" ",
|
||||||
m("span.help-block", ["Showing ", _.keys(visible).length, " matching package(s)"])
|
m("span.help-block", [_.keys(ctrl.matchingPackages()).length, " matching package(s)"])
|
||||||
]),
|
]),
|
||||||
m("table#package-list.table.table-bordered.table-responsive.table-hover", [
|
m("table#package-list.table.table-bordered.table-responsive.table-hover", [
|
||||||
m("thead", [
|
m("thead", [
|
||||||
|
@ -240,7 +304,7 @@
|
||||||
])
|
])
|
||||||
]),
|
]),
|
||||||
m("tbody",
|
m("tbody",
|
||||||
ctrl.sortedPackages().filter(function(p) { return visible[p.name]; }).map(function(p) {
|
ctrl.paginatorCtrl.paginatedItems().map(function(p) {
|
||||||
return m("tr", { key: p.name }, [
|
return m("tr", { key: p.name }, [
|
||||||
m("td", packageLink(p)),
|
m("td", packageLink(p)),
|
||||||
m("td", packageLink(p, p.description)),
|
m("td", packageLink(p, p.description)),
|
||||||
|
@ -256,7 +320,8 @@
|
||||||
m("td", [p.downloads.toLocaleString()])
|
m("td", [p.downloads.toLocaleString()])
|
||||||
]);
|
]);
|
||||||
}))
|
}))
|
||||||
])
|
]),
|
||||||
|
melpa.paginator.view(ctrl.paginatorCtrl)
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue