/**
Paginator's core functionality consists of keeping track of the current page
being displayed and providing information for previous and next pages.
@module paginator
@submodule paginator-core
@since 3.11.0
*/
/**
_API docs for this extension are included in the Paginator class._
Class extension providing the core API and structure for the Paginator module.
Use this class extension with Widget or another Base-based superclass to
create the basic Paginator model API and composing class structure.
@class Paginator.Core
@for Paginator
@since 3.11.0
*/
var PaginatorCore = Y.namespace('Paginator').Core = function () {};
PaginatorCore.ATTRS = {
/**
Current page count. First page is 1.
@attribute page
@type Number
@default 1
**/
page: {
value: 1
},
/**
Total number of pages to display
@readOnly
@attribute totalPages
@type Number
**/
totalPages: {
readOnly: true,
getter: '_getTotalPagesFn'
},
/**
Maximum number of items per page. A value of negative one (-1) indicates
all items on one page.
@attribute itemsPerPage
@type Number
@default 10
**/
itemsPerPage: {
value: 10
},
/**
Total number of items in all pages.
@attribute totalItems
@type Number
@default 0
**/
totalItems: {
value: 0
}
};
Y.mix(PaginatorCore.prototype, {
/**
Sets the page to the previous page in the set, if there is a previous page.
@method prevPage
@chainable
*/
prevPage: function () {
if (this.hasPrevPage()) {
this.set('page', this.get('page') - 1);
}
return this;
},
/**
Sets the page to the next page in the set, if there is a next page.
@method nextPage
@chainable
*/
nextPage: function () {
if (this.hasNextPage()) {
this.set('page', this.get('page') + 1);
}
return this;
},
/**
Returns True if there is a previous page in the set.
@method hasPrevPage
@return {Boolean} `true` if there is a previous page, `false` otherwise.
*/
hasPrevPage: function () {
return this.get('page') > 1;
},
/**
Returns True if there is a next page in the set.
If totalItems isn't set, assume there is always next page.
@method hasNextPage
@return {Boolean} `true` if there is a next page, `false` otherwise.
*/
hasNextPage: function () {
return (!this.get('totalItems') || this.get('page') < this.get('totalPages'));
},
//--- P R O T E C T E D
/**
Returns the total number of pages based on the total number of
items provided and the number of items per page
@protected
@method _getTotalPagesFn
@return {Number} Total number of pages based on total number of items and
items per page or one if itemsPerPage is less than one
*/
_getTotalPagesFn: function () {
var itemsPerPage = this.get('itemsPerPage');
return (itemsPerPage < 1) ? 1 : Math.ceil(this.get('totalItems') / itemsPerPage);
}
});