blob: 545eb8a3f8cd320286d0bae8a5619c2e68194433 [file] [log] [blame]
<!-- The <paging-sk> custom element declaration.
Presents controls to paginate across pages of results.
Attributes:
pagination: Usually returned from the server this is an object
with the following structure:
{
size: 10,
offset: 20,
total: 210
}
where size is the page size, offset is the offset
from the beginning (starting at 0) and total is
the total number of elements in the paginated
resource.
Events:
'pagechange'
The 'paging-sk' element emits this event when a user has
clicked on page other than the current one.
When the event is fired the offset field of the
shared pagination object has been updated to the
new value.
-->
<dom-module id="paging-sk">
<template>
<div class="paginationControl" horizontal layout>
<paper-button on-click="toPageClicked" disabled$="{{ isFirstPage(page) }}" data-page="0">
First
</paper-button>
<paper-button on-click="toPageClicked" disabled$="{{ isFirstPage(page) }}" data-page$="{{ decrement(page) }}">
<iron-icon icon="image:navigate-before"></iron-icon>
</paper-button>
<template is="dom-repeat" items="{{enumPages}}" as="n">
<paper-button on-click="toPageClicked"
disabled$="{{n.disabled}}" data-page$="{{n.num}}">{{ increment(n.num) }}</paper-button>
</template>
<paper-button on-click="toPageClicked" disabled$="{{ isLastPage(page, allPages) }}" data-page$="{{ increment(page) }}">
<iron-icon icon="image:navigate-next"></iron-icon>
</paper-button>
<paper-button on-click="toPageClicked" disabled$="{{ isLastPage(page, allPages) }}" data-page$="{{ decrement(allPages) }}">
Last
</paper-button>
<paper-button disabled>{{ getPageCountsText(page, allPages) }}</paper-button>
</div>
</template>
</dom-module>
<script>
Polymer({
is: "paging-sk",
properties: {
pagination: {
type: Object,
value: function() { return {}; },
observer: 'paginationChanged',
},
showPages: {
type: Number,
value: 5,
},
showPagesOffset: {
type: Number,
value: 0,
},
valid: {
type: Boolean,
value: false,
},
page: {
type: Number,
value: 0,
},
allPages: {
type: Number,
value: 0,
},
enumPages: {
type: Array,
value: function() { return []; },
},
},
ready: function() {
this.showPagesOffset = Math.floor(this.showPages/2);
},
getPageCountsText: function(page, allPages) {
return this.increment(page) + " / " + allPages;
},
// paginationChanged primarily captures when the size and total change.
paginationChanged: function() {
this.allPages = Math.ceil(this.pagination.total / this.pagination.size);
this.update();
},
// toPageClicked is called when a user clicks on a page link.
toPageClicked: function(e) {
var button = sk.findParent(e.target, "PAPER-BUTTON");
var targetPage = button.dataset.page;
this.pagination.offset = targetPage * this.pagination.size;
this.update();
this.fire('pagechange', {});
},
isLastPage: function(n, allPages) {
return (n == (allPages-1));
},
isFirstPage: function(n) {
return (n == 0);
},
decrement: function(n) {
return n - 1;
},
increment: function(n) {
return n + 1;
},
// update recalculates the number of pages and page we are currently on.
update: function() {
// Calculate the current page and the pages to show on the selection.
this.page = Math.floor(this.pagination.offset/this.pagination.size);
var start = Math.max(Math.min(this.page - this.showPagesOffset, this.allPages - this.showPages), 0);
var end = Math.min(start + this.showPages - 1, this.allPages-1);
var tmpEnumPages = [];
for(var i=start; i <= end; i++) {
tmpEnumPages.push({'num': i, 'disabled': (i == this.page)});
}
this.enumPages = tmpEnumPages;
}
});
</script>