Skip to content

Instantly share code, notes, and snippets.

@LulzAugusto
Last active August 29, 2015 14:04
Show Gist options
  • Save LulzAugusto/278bd6a30e26528aabdb to your computer and use it in GitHub Desktop.
Save LulzAugusto/278bd6a30e26528aabdb to your computer and use it in GitHub Desktop.
Just a little widget to handle pagination in one of the projects of the company I work for. May be useful or not, idk.
/*=====================================================
*
* jQuery Sitef Paginator
* Inform Sistemas LTDA.
*
======================================================*/
;(function ($, window, document, undefined) {
$.widget("sitef.paginator", {
_create: function () {
this._load = this.options.resource;
var html = '<select class="input-sm" id="page_select" dir="rtl"></select><button id="first_page" class="btn btn-sm"><i class="glyphicon glyphicon-fast-backward"></i></button> <button id="previous_page" class="btn btn-sm" style="direction: rtl; unicode-bidi: bidi-override;"><i class="glyphicon glyphicon-step-backward"></i></button> <label for="page_input">Página:</label> <input id="page_input" type="text" size="2" class="input-sm" value="1"/> de <span id="total_of_pages"></span> <button id="next_page" class="btn btn-sm" ><i class="glyphicon glyphicon-step-forward"></i></button><button id="last_page" class="btn btn-sm"><i class="glyphicon glyphicon-fast-forward"></i></button>';
this.element.html(html);
this.element.addClass('sitef-paginator');
this._elements = {
nextPageButton: this.element.find('#next_page'),
previousPageButton: this.element.find('#previous_page'),
firstPageButton: this.element.find('#first_page'),
lastPageButton: this.element.find('#last_page'),
pageSelector: this.element.find('#page_select'),
pageInput: this.element.find('#page_input'),
totalOfPagesSpan: this.element.find('#total_of_pages')
};
this._vars = {
page: '',
currentPageNumber: 1,
synchronous: false
};
this._bindEvents();
this._setPage(this._vars.currentPageNumber);
this._updateNavigation();
},
_paginate: function () {
this._vars.currentPageNumber = this._elements.pageInput.val();
this._vars.page = this._load(this._vars.currentPageNumber, this._vars.synchronous);
if (!this._vars.page) {
throw 'error';
}
this._elements.totalOfPagesSpan.text(this._vars.page.totalOfPages);
this._updateButtons();
this._elements.pageSelector.val(this._vars.currentPageNumber);
},
_setPage: function(pageNumber) {
this._elements.pageInput.val(pageNumber);
this._elements.pageInput.trigger('change');
},
_updateButtons: function () {
if (this._vars.page.hasNext) {
this._elements.nextPageButton.prop('disabled', false);
this._elements.lastPageButton.prop('disabled', false);
} else {
this._elements.nextPageButton.prop('disabled', true);
this._elements.lastPageButton.prop('disabled', true);
}
if (this._vars.page.hasPrevious) {
this._elements.previousPageButton.prop('disabled', false);
this._elements.firstPageButton.prop('disabled', false);
} else {
this._elements.previousPageButton.prop('disabled', true);
this._elements.firstPageButton.prop('disabled', true);
}
},
_updateNavigation: function () {
var option = '<option value=""></option>';
for (var int = 0; int < this._vars.page.totalOfPages; int++) {
var opt = $(option).val(int+1).text(int+1);
this._elements.pageSelector.append(opt);
}
},
destroy: function () {
$.Widget.prototype.destroy.call(this);
},
_bindEvents: function () {
this.element.on('change', '#page_input', {context: this}, function(event) {
event.data.context._paginate();
});
this.element.on('click', '#first_page', {context: this}, function(event) {
event.preventDefault();
event.data.context._setPage(1);
});
this.element.on('click', '#last_page', {context: this}, function(event) {
event.preventDefault();
var self = event.data.context;
self._setPage(self._vars.page.totalOfPages);
});
this.element.on('click', '#next_page', {context: this}, function(event) {
event.preventDefault();
var self = event.data.context;
self._setPage(parseInt(self._vars.currentPageNumber) + 1);
});
this.element.on('click', '#previous_page', {context: this}, function(event) {
event.preventDefault();
var self = event.data.context;
self._setPage(parseInt(self._vars.currentPageNumber) - 1);
});
this.element.on('change', '#page_select', {context: this}, function(event) {
event.preventDefault();
var self = event.data.context;
self._setPage(self._elements.pageSelector.val());
});
},
paginate: function (page, synchronous) {
this._vars.synchronous = synchronous;
if (page === undefined) {
this._setPage(1);
} else {
if (parseInt(page) <= parseInt(this._vars.page.totalOfPages) && parseInt(page) > 0) {
this._setPage(page);
} else {
throw 'Error: invalid page number';
}
}
this._vars.synchronous = false;
}
});
})(jQuery, window, document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment