diff --git a/src/UI/.idea/jsLibraryMappings.xml b/src/UI/.idea/jsLibraryMappings.xml
index f6e673adc..62c621f94 100644
--- a/src/UI/.idea/jsLibraryMappings.xml
+++ b/src/UI/.idea/jsLibraryMappings.xml
@@ -1,3 +1,8 @@
-
+
+
+
+
+
+
diff --git a/src/UI/.idea/jsLinters/jshint.xml b/src/UI/.idea/jsLinters/jshint.xml
index e85398a55..4e0df49ad 100644
--- a/src/UI/.idea/jsLinters/jshint.xml
+++ b/src/UI/.idea/jsLinters/jshint.xml
@@ -8,16 +8,16 @@
+
+
-
-
diff --git a/src/UI/Content/Backgrid/paginator.less b/src/UI/Content/Backgrid/paginator.less
index 29f36b4ff..929dabd99 100644
--- a/src/UI/Content/Backgrid/paginator.less
+++ b/src/UI/Content/Backgrid/paginator.less
@@ -34,6 +34,10 @@
text-decoration : none;
}
+ select {
+ width: auto;
+ }
+
.pager-btn {
.clickable;
}
diff --git a/src/UI/Handlebars/Helpers/Enumerable.js b/src/UI/Handlebars/Helpers/Enumerable.js
new file mode 100644
index 000000000..6df9d82d5
--- /dev/null
+++ b/src/UI/Handlebars/Helpers/Enumerable.js
@@ -0,0 +1,25 @@
+'use strict';
+define(
+ [
+ 'handlebars'
+ ], function (Handlebars) {
+ Handlebars.registerHelper('times', function(n, block) {
+ var accum = '';
+
+ for(var i = 0; i < n; ++i) {
+ accum += block.fn(i);
+ }
+
+ return accum;
+ });
+
+ Handlebars.registerHelper('for', function(from, to, incr, block) {
+ var accum = '';
+
+ for(var i = from; i < to; i += incr) {
+ accum += block.fn(i);
+ }
+
+ return accum;
+ });
+ });
diff --git a/src/UI/Handlebars/backbone.marionette.templates.js b/src/UI/Handlebars/backbone.marionette.templates.js
index 6b0ed8ac5..8778df684 100644
--- a/src/UI/Handlebars/backbone.marionette.templates.js
+++ b/src/UI/Handlebars/backbone.marionette.templates.js
@@ -11,6 +11,7 @@ define(
'Handlebars/Helpers/Quality',
'Handlebars/Helpers/System',
'Handlebars/Helpers/EachReverse',
+ 'Handlebars/Helpers/EachReverse',
'Handlebars/Handlebars.Debug'
], function (Templates) {
return function () {
diff --git a/src/UI/Shared/Grid/JumpToPageTemplate.html b/src/UI/Shared/Grid/JumpToPageTemplate.html
new file mode 100644
index 000000000..131689d29
--- /dev/null
+++ b/src/UI/Shared/Grid/JumpToPageTemplate.html
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/src/UI/Shared/Grid/Pager.js b/src/UI/Shared/Grid/Pager.js
index e230f8d1d..e34a82aac 100644
--- a/src/UI/Shared/Grid/Pager.js
+++ b/src/UI/Shared/Grid/Pager.js
@@ -1,16 +1,20 @@
'use strict';
define(
[
+ 'jquery',
'marionette',
'backgrid.paginator'
- ], function (Marionette, Paginator) {
+ ], function ($, Marionette, Paginator) {
return Paginator.extend({
template: 'Shared/Grid/PagerTemplate',
events: {
- 'click .pager-btn': 'changePage'
+ 'click .pager-btn' : 'changePage',
+ 'click .x-page-number' : '_showPageJumper',
+ 'change .x-page-number select' : '_jumpToPage',
+ 'blur .x-page-number select' : 'render'
},
windowSize: 1,
@@ -25,7 +29,7 @@ define(
changePage: function (e) {
e.preventDefault();
- var target =this.$(e.target);
+ var target = this.$(e.target);
if (target.closest('li').hasClass('disabled')) {
return;
@@ -77,7 +81,7 @@ define(
var lastPage = +state.lastPage;
lastPage = Math.max(0, firstPage ? lastPage - 1 :lastPage);
var currentPage = Math.max(state.currentPage, state.firstPage);
- currentPage = firstPage ? currentPage - 1 :currentPage;
+ currentPage = firstPage ? currentPage - 1 : currentPage;
var windowStart = Math.floor(currentPage / this.windowSize) * this.windowSize;
var windowEnd = Math.min(lastPage + 1, windowStart + this.windowSize);
@@ -145,6 +149,42 @@ define(
this.delegateEvents();
return this;
+ },
+
+ _showPageJumper: function (e) {
+ if ($(e.target).is('select')) {
+ return;
+ }
+
+ var templateFunction = Marionette.TemplateCache.get('Shared/Grid/JumpToPageTemplate');
+ var state = this.collection.state;
+ var currentPage = Math.max(state.currentPage, state.firstPage);
+ currentPage = state.firstPage ? currentPage - 1 : currentPage;
+
+ var pages = [];
+
+ for (var i = 0; i < this.collection.state.lastPage; i++) {
+ if (i === currentPage) {
+ pages.push({ page: i + 1, current: true });
+ }
+
+ else {
+ pages.push({ page: i + 1 });
+ }
+ }
+
+ this.$el.find('.x-page-number').html(templateFunction({
+ pages : pages
+ }));
+
+ this.$el.find('.x-page-number select').trigger('click');
+ },
+
+ _jumpToPage: function () {
+ var selectedPage = parseInt(this.$el.find('.x-page-number select').val(), 10);
+
+ this.$el.find('.x-page-number').html('');
+ this.collection.getPage(selectedPage);
}
});
});
diff --git a/src/UI/Shared/Grid/PagerTemplate.html b/src/UI/Shared/Grid/PagerTemplate.html
index 3e829409e..44b6f9d78 100644
--- a/src/UI/Shared/Grid/PagerTemplate.html
+++ b/src/UI/Shared/Grid/PagerTemplate.html
@@ -2,7 +2,7 @@
{{#each handles}}
{{#if pageNumber}}
- {{pageNumber}} / {{lastPage}}
+ {{pageNumber}} / {{lastPage}}
{{else}}
{{/if}}