@cloukit/pagination
Version:
210 lines • 16.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/*!
* @license MIT
* Copyright (c) 2017 Bernhard Grünewaldt - codeclou.io
* https://github.com/cloukit/legal
*/
import { EventEmitter, Component, Input, Output } from '@angular/core';
import { CloukitThemeService, } from '@cloukit/theme';
import { calculatePaginationItems } from './logic/pagination-helper';
import { PaginationButtonType, PaginationItem } from './pagination.model';
/**
* Pagination Component.
*
* Just use this inside your templates:
*
* ```html
* <cloukit-pagination ...></cloukit-pagination>
* ```
*/
export class CloukitPaginationComponent {
/**
* @param {?} themeService
*/
constructor(themeService) {
this.themeService = themeService;
/**
* External way to disable the whole pagination e.g.
* during loading external data
*/
this.disabled = false;
/**
* Event emitted, when page is clicked.
*/
this.onPageSelect = new EventEmitter();
this.PaginationButtonType = PaginationButtonType;
this.state = {
pages: []
};
this.themeSelected = this.themeService.getComponentTheme('pagination');
}
/**
* @param {?} element
* @return {?}
*/
getStyle(element) {
/** @type {?} */
const style = this.themeSelected.getStyle(element, 'normal', 'base');
return this.themeService.prefixStyle(style);
}
/**
* \@overrides OnChanges
* @hidden
* @return {?}
*/
ngOnChanges() {
if (this.theme !== undefined && this.theme !== null) {
this.themeSelected = this.themeService.getComponentTheme(this.theme);
if (this.themeSelected === null) {
console.log(`WARN: requested theme ${this.theme} does not exist. Falling back to default theme for pagination.`);
this.themeSelected = this.themeService.getComponentTheme('pagination');
}
}
this.state.pages = calculatePaginationItems(this.total, this.current);
}
/**
* @param {?} event
* @return {?}
*/
selectPage(event) {
if (event.type === PaginationButtonType['previous'] &&
this.isPreviousPossible()) {
this.onPageSelect.emit(this.current - 1);
}
else if (event.type === PaginationButtonType['next'] &&
this.isNextPossible()) {
this.onPageSelect.emit(this.current + 1);
}
else if (event.type === PaginationButtonType['normal']) {
this.onPageSelect.emit(event.page);
}
}
/**
* @return {?}
*/
previousDummyPaginationItem() {
/** @type {?} */
let label = 'Prev';
if (this.labelPrev !== undefined && this.labelPrev !== null) {
label = this.labelPrev;
}
return new PaginationItem(-1, false, false, label);
}
/**
* @return {?}
*/
nextDummyPaginationItem() {
/** @type {?} */
let label = 'Next';
if (this.labelNext !== undefined && this.labelNext !== null) {
label = this.labelNext;
}
return new PaginationItem(-1, false, false, label);
}
/**
* @return {?}
*/
isPreviousPossible() {
return this.current > 1;
}
/**
* @return {?}
*/
isNextPossible() {
return this.current < this.total;
}
}
CloukitPaginationComponent.decorators = [
{ type: Component, args: [{
selector: 'cloukit-pagination',
template: `
<div [ngStyle]="getStyle('wrapper').style">
<cloukit-pagination-button
[disabled]="!isPreviousPossible() || disabled"
[paginationItem]="previousDummyPaginationItem()"
[themeSelected]="themeSelected"
[type]="PaginationButtonType['previous']"
(clicked)="selectPage($event)"
></cloukit-pagination-button>
<cloukit-pagination-button
*ngFor="let page of state.pages"
[disabled]="disabled"
[paginationItem]="page"
[themeSelected]="themeSelected"
[type]="PaginationButtonType['normal']"
(clicked)="selectPage($event)"
></cloukit-pagination-button>
<cloukit-pagination-button
[disabled]="!isNextPossible() || disabled"
[paginationItem]="nextDummyPaginationItem()"
[themeSelected]="themeSelected"
[type]="PaginationButtonType['next']"
(clicked)="selectPage($event)"
></cloukit-pagination-button>
</div>`
}] }
];
/** @nocollapse */
CloukitPaginationComponent.ctorParameters = () => [
{ type: CloukitThemeService }
];
CloukitPaginationComponent.propDecorators = {
theme: [{ type: Input }],
total: [{ type: Input }],
current: [{ type: Input }],
disabled: [{ type: Input }],
labelNext: [{ type: Input }],
labelPrev: [{ type: Input }],
onPageSelect: [{ type: Output }]
};
if (false) {
/**
* Optional theme selector. Only use `theme` when you have registered a valid theme
* via the `CloukitThemeService` from [`\@cloukit/theme`]{\@link https://cloukit.github.io/#/component/theme}.
* @type {?}
*/
CloukitPaginationComponent.prototype.theme;
/**
* Number of total Pages
* @type {?}
*/
CloukitPaginationComponent.prototype.total;
/**
* Current Page
* @type {?}
*/
CloukitPaginationComponent.prototype.current;
/**
* External way to disable the whole pagination e.g.
* during loading external data
* @type {?}
*/
CloukitPaginationComponent.prototype.disabled;
/**
* Optional Label for the "Next" button, defaults to "Next"
* @type {?}
*/
CloukitPaginationComponent.prototype.labelNext;
/**
* Optional Label for the "Previous" button, defaults to "Prev"
* @type {?}
*/
CloukitPaginationComponent.prototype.labelPrev;
/**
* Event emitted, when page is clicked.
* @type {?}
*/
CloukitPaginationComponent.prototype.onPageSelect;
/** @type {?} */
CloukitPaginationComponent.prototype.themeSelected;
/** @type {?} */
CloukitPaginationComponent.prototype.PaginationButtonType;
/** @type {?} */
CloukitPaginationComponent.prototype.state;
/** @type {?} */
CloukitPaginationComponent.prototype.themeService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2xvdWtpdC9wYWdpbmF0aW9uLyIsInNvdXJjZXMiOlsibGliL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUtBLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUVMLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBOEIsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUF3Q3RHLE1BQU0sT0FBTywwQkFBMEI7Ozs7SUFzRHJDLFlBQW9CLFlBQWlDO1FBQWpDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjs7Ozs7UUE1QjlDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFtQmpCLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFJeEQseUJBQW9CLEdBQUcsb0JBQW9CLENBQUM7UUFDNUMsVUFBSyxHQUFHO1lBQ2IsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBR0EsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Ozs7O0lBRU0sUUFBUSxDQUFDLE9BQWU7O2NBQ3ZCLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUNwRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7Ozs7OztJQU1ELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxLQUFL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O0lBS3pCLCtDQUN5Qjs7Ozs7SUFLekIsa0RBRStEOztJQUcvRCxtREFBNEM7O0lBQzVDLDBEQUFtRDs7SUFDbkQsMkNBRUU7O0lBRVUsa0RBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZSBNSVRcbiAqIENvcHlyaWdodCAoYykgMjAxNyBCZXJuaGFyZCBHcsO8bmV3YWxkdCAtIGNvZGVjbG91LmlvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2xvdWtpdC9sZWdhbFxuICovXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDbG91a2l0Q29tcG9uZW50VGhlbWUsIENsb3VraXRTdGF0ZWZ1bEFuZE1vZGlmaWVyQXdhcmVFbGVtZW50VGhlbWVTdHlsZURlZmluaXRpb24sXG4gIENsb3VraXRUaGVtZVNlcnZpY2UsXG59IGZyb20gJ0BjbG91a2l0L3RoZW1lJztcbmltcG9ydCB7IGNhbGN1bGF0ZVBhZ2luYXRpb25JdGVtcyB9IGZyb20gJy4vbG9naWMvcGFnaW5hdGlvbi1oZWxwZXInO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkJ1dHRvbkNsaWNrRXZlbnQsIFBhZ2luYXRpb25CdXR0b25UeXBlLCBQYWdpbmF0aW9uSXRlbSB9IGZyb20gJy4vcGFnaW5hdGlvbi5tb2RlbCc7XG5cbi8qKlxuICogUGFnaW5hdGlvbiBDb21wb25lbnQuXG4gKlxuICogSnVzdCB1c2UgdGhpcyBpbnNpZGUgeW91ciB0ZW1wbGF0ZXM6XG4gKlxuICogYGBgaHRtbFxuICogPGNsb3VraXQtcGFnaW5hdGlvbiAuLi4+PC9jbG91a2l0LXBhZ2luYXRpb24+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xvdWtpdC1wYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgPGRpdiBbbmdTdHlsZV09XCJnZXRTdHlsZSgnd3JhcHBlcicpLnN0eWxlXCI+XG4gICAgPGNsb3VraXQtcGFnaW5hdGlvbi1idXR0b25cbiAgICAgIFtkaXNhYmxlZF09XCIhaXNQcmV2aW91c1Bvc3NpYmxlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgW3BhZ2luYXRpb25JdGVtXT1cInByZXZpb3VzRHVtbXlQYWdpbmF0aW9uSXRlbSgpXCJcbiAgICAgIFt0aGVtZVNlbGVjdGVkXT1cInRoZW1lU2VsZWN0ZWRcIlxuICAgICAgW3R5cGVdPVwiUGFnaW5hdGlvbkJ1dHRvblR5cGVbJ3ByZXZpb3VzJ11cIlxuICAgICAgKGNsaWNrZWQpPVwic2VsZWN0UGFnZSgkZXZlbnQpXCJcbiAgICA+PC9jbG91a2l0LXBhZ2luYXRpb24tYnV0dG9uPlxuICAgIDxjbG91a2l0LXBhZ2luYXRpb24tYnV0dG9uXG4gICAgICAqbmdGb3I9XCJsZXQgcGFnZSBvZiBzdGF0ZS5wYWdlc1wiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3BhZ2luYXRpb25JdGVtXT1cInBhZ2VcIlxuICAgICAgW3RoZW1lU2VsZWN0ZWRdPVwidGhlbWVTZWxlY3RlZFwiXG4gICAgICBbdHlwZV09XCJQYWdpbmF0aW9uQnV0dG9uVHlwZVsnbm9ybWFsJ11cIlxuICAgICAgKGNsaWNrZWQpPVwic2VsZWN0UGFnZSgkZXZlbnQpXCJcbiAgICA+PC9jbG91a2l0LXBhZ2luYXRpb24tYnV0dG9uPlxuICAgIDxjbG91a2l0LXBhZ2luYXRpb24tYnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPVwiIWlzTmV4dFBvc3NpYmxlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgW3BhZ2luYXRpb25JdGVtXT1cIm5leHREdW1teVBhZ2luYXRpb25JdGVtKClcIlxuICAgICAgW3RoZW1lU2VsZWN0ZWRdPVwidGhlbWVTZWxlY3RlZFwiXG4gICAgICBbdHlwZV09XCJQYWdpbmF0aW9uQnV0dG9uVHlwZVsnbmV4dCddXCJcbiAgICAgIChjbGlja2VkKT1cInNlbGVjdFBhZ2UoJGV2ZW50KVwiXG4gICAgPjwvY2xvdWtpdC1wYWdpbmF0aW9uLWJ1dHRvbj5cbiAgPC9kaXY+YCxcbiAgc3R5bGVzOiBbIF0sXG59KVxuZXhwb3J0IGNsYXNzIENsb3VraXRQYWdpbmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICAvKipcbiAgICogT3B0aW9uYWwgdGhlbWUgc2VsZWN0b3IuIE9ubHkgdXNlIGB0aGVtZWAgd2hlbiB5b3UgaGF2ZSByZWdpc3RlcmVkIGEgdmFsaWQgdGhlbWVcbiAgICogdmlhIHRoZSBgQ2xvdWtpdFRoZW1lU2VydmljZWAgZnJvbSBbYEBjbG91a2l0L3RoZW1lYF17QGxpbmsgaHR0cHM6Ly9jbG91a2l0LmdpdGh1Yi5pby8jL2NvbXBvbmVudC90aGVtZX0uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGhlbWU6IHN0cmluZztcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHRvdGFsIFBhZ2VzXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdG90YWw6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3VycmVudCBQYWdlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY3VycmVudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbCB3YXkgdG8gZGlzYWJsZSB0aGUgd2hvbGUgcGFnaW5hdGlvbiBlLmcuXG4gICAqIGR1cmluZyBsb2FkaW5nIGV4dGVybmFsIGRhdGFcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBMYWJlbCBmb3IgdGhlIFwiTmV4dFwiIGJ1dHRvbiwgZGVmYXVsdHMgdG8gXCJOZXh0XCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsYWJlbE5leHQ6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgTGFiZWwgZm9yIHRoZSBcIlByZXZpb3VzXCIgYnV0dG9uLCBkZWZhdWx0cyB0byBcIlByZXZcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGxhYmVsUHJldjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkLCB3aGVuIHBhZ2UgaXMgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgcHVibGljIG9uUGFnZVNlbGVjdDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy8gSU5URVJOQUwgVkFSSUFCTEVTXG4gIHB1YmxpYyB0aGVtZVNlbGVjdGVkOiBDbG91a2l0Q29tcG9uZW50VGhlbWU7XG4gIHB1YmxpYyBQYWdpbmF0aW9uQnV0dG9uVHlwZSA9IFBhZ2luYXRpb25CdXR0b25UeXBlO1xuICBwdWJsaWMgc3RhdGUgPSB7XG4gICAgcGFnZXM6IFtdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aGVtZVNlcnZpY2U6IENsb3VraXRUaGVtZVNlcnZpY2UpIHtcbiAgICB0aGlzLnRoZW1lU2VsZWN0ZWQgPSB0aGlzLnRoZW1lU2VydmljZS5nZXRDb21wb25lbnRUaGVtZSgncGFnaW5hdGlvbicpO1xuICB9XG5cbiAgcHVibGljIGdldFN0eWxlKGVsZW1lbnQ6IHN0cmluZyk6IENsb3VraXRTdGF0ZWZ1bEFuZE1vZGlmaWVyQXdhcmVFbGVtZW50VGhlbWVTdHlsZURlZmluaXRpb24ge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy50aGVtZVNlbGVjdGVkLmdldFN0eWxlKGVsZW1lbnQsICdub3JtYWwnLCAnYmFzZScpO1xuICAgIHJldHVybiB0aGlzLnRoZW1lU2VydmljZS5wcmVmaXhTdHlsZShzdHlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlcyBPbkNoYW5nZXNcbiAgICogQGhpZGRlblxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMudGhlbWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnRoZW1lICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnRoZW1lU2VsZWN0ZWQgPSB0aGlzLnRoZW1lU2VydmljZS5nZXRDb21wb25lbnRUaGVtZSh0aGlzLnRoZW1lKTtcbiAgICAgIGlmICh0aGlzLnRoZW1lU2VsZWN0ZWQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFdBUk46IHJlcXVlc3RlZCB0aGVtZSAke3RoaXMudGhlbWV9IGRvZXMgbm90IGV4aXN0LiBGYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCB0aGVtZSBmb3IgcGFnaW5hdGlvbi5gKTtcbiAgICAgICAgdGhpcy50aGVtZVNlbGVjdGVkID0gdGhpcy50aGVtZVNlcnZpY2UuZ2V0Q29tcG9uZW50VGhlbWUoJ3BhZ2luYXRpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5wYWdlcyA9IGNhbGN1bGF0ZVBhZ2luYXRpb25JdGVtcyh0aGlzLnRvdGFsLCB0aGlzLmN1cnJlbnQpO1xuICB9XG5cbiAgc2VsZWN0UGFnZShldmVudDogUGFnaW5hdGlvbkJ1dHRvbkNsaWNrRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gUGFnaW5hdGlvbkJ1dHRvblR5cGVbJ3ByZXZpb3VzJ10gJiZcbiAgICAgIHRoaXMuaXNQcmV2aW91c1Bvc3NpYmxlKCkpIHtcbiAgICAgIHRoaXMub25QYWdlU2VsZWN0LmVtaXQodGhpcy5jdXJyZW50IC0gMSk7XG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBQYWdpbmF0aW9uQnV0dG9uVHlwZVsnbmV4dCddICYmXG4gICAgICB0aGlzLmlzTmV4dFBvc3NpYmxlKCkpIHtcbiAgICAgIHRoaXMub25QYWdlU2VsZWN0LmVtaXQodGhpcy5jdXJyZW50ICsgMSk7XG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBQYWdpbmF0aW9uQnV0dG9uVHlwZVsnbm9ybWFsJ10pIHtcbiAgICAgIHRoaXMub25QYWdlU2VsZWN0LmVtaXQoZXZlbnQucGFnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJldmlvdXNEdW1teVBhZ2luYXRpb25JdGVtKCkge1xuICAgIGxldCBsYWJlbCA9ICdQcmV2JztcbiAgICBpZiAodGhpcy5sYWJlbFByZXYgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmxhYmVsUHJldiAhPT0gbnVsbCkge1xuICAgICAgbGFiZWwgPSB0aGlzLmxhYmVsUHJldjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQYWdpbmF0aW9uSXRlbSgtMSwgZmFsc2UsIGZhbHNlLCBsYWJlbCk7XG4gIH1cblxuICBuZXh0RHVtbXlQYWdpbmF0aW9uSXRlbSgpIHtcbiAgICBsZXQgbGFiZWwgPSAnTmV4dCc7XG4gICAgaWYgKHRoaXMubGFiZWxOZXh0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5sYWJlbE5leHQgIT09IG51bGwpIHtcbiAgICAgIGxhYmVsID0gdGhpcy5sYWJlbE5leHQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkl0ZW0oLTEsIGZhbHNlLCBmYWxzZSwgbGFiZWwpO1xuICB9XG5cbiAgaXNQcmV2aW91c1Bvc3NpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPiAxO1xuICB9XG5cbiAgaXNOZXh0UG9zc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudCA8IHRoaXMudG90YWw7XG4gIH1cblxufVxuXG4iXX0=