theme-lib
Version:
This is a simple example Angular Library published to npm.
152 lines • 12.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ContentChildren, QueryList, Input, ElementRef, Output, EventEmitter, } from '@angular/core';
import { takeWhile } from 'rxjs/operators';
import 'intersection-observer';
import { NbListItemComponent } from './list.component';
/*
* List pager directive
*
* Directive allows you to determine page of currently viewing items.
*
*/
export class NbListPageTrackerDirective {
constructor() {
this.alive = true;
/*
* Page to start counting with.
*/
this.startPage = 1;
/*
* Emits when another page become visible.
*/
this.pageChange = new EventEmitter();
this.observer = new IntersectionObserver(entries => this.checkForPageChange(entries), { threshold: 0.5 });
}
/**
* @return {?}
*/
ngAfterViewInit() {
if (this.listItems && this.listItems.length) {
this.observeItems();
}
this.listItems.changes
.pipe(takeWhile(() => this.alive))
.subscribe(() => this.observeItems());
}
/**
* @return {?}
*/
ngOnDestroy() {
this.observer.disconnect && this.observer.disconnect();
}
/**
* @private
* @return {?}
*/
observeItems() {
this.listItems.forEach(i => this.observer.observe(i.nativeElement));
}
/**
* @private
* @param {?} entries
* @return {?}
*/
checkForPageChange(entries) {
/** @type {?} */
const mostVisiblePage = this.findMostVisiblePage(entries);
if (mostVisiblePage && this.currentPage !== mostVisiblePage) {
this.currentPage = mostVisiblePage;
this.pageChange.emit(this.currentPage);
}
}
/**
* @private
* @param {?} entries
* @return {?}
*/
findMostVisiblePage(entries) {
/** @type {?} */
const intersectionRatioByPage = new Map();
for (const entry of entries) {
if (entry.intersectionRatio < 0.5) {
continue;
}
/** @type {?} */
const elementIndex = this.elementIndex(entry.target);
if (elementIndex === -1) {
continue;
}
/** @type {?} */
const page = this.startPage + Math.floor(elementIndex / this.pageSize);
/** @type {?} */
let ratio = entry.intersectionRatio;
if (intersectionRatioByPage.has(page)) {
ratio += intersectionRatioByPage.get(page);
}
intersectionRatioByPage.set(page, ratio);
}
/** @type {?} */
let maxRatio = 0;
/** @type {?} */
let mostVisiblePage;
intersectionRatioByPage.forEach((ratio, page) => {
if (ratio > maxRatio) {
maxRatio = ratio;
mostVisiblePage = page;
}
});
return mostVisiblePage;
}
/**
* @private
* @param {?} element
* @return {?}
*/
elementIndex(element) {
return element.parentElement && element.parentElement.children
? Array.from(element.parentElement.children).indexOf(element)
: -1;
}
}
NbListPageTrackerDirective.decorators = [
{ type: Directive, args: [{
selector: '[nbListPageTracker]',
},] }
];
/** @nocollapse */
NbListPageTrackerDirective.ctorParameters = () => [];
NbListPageTrackerDirective.propDecorators = {
pageSize: [{ type: Input }],
startPage: [{ type: Input }],
pageChange: [{ type: Output }],
listItems: [{ type: ContentChildren, args: [NbListItemComponent, { read: ElementRef },] }]
};
if (false) {
/**
* @type {?}
* @private
*/
NbListPageTrackerDirective.prototype.alive;
/**
* @type {?}
* @private
*/
NbListPageTrackerDirective.prototype.observer;
/**
* @type {?}
* @private
*/
NbListPageTrackerDirective.prototype.currentPage;
/** @type {?} */
NbListPageTrackerDirective.prototype.pageSize;
/** @type {?} */
NbListPageTrackerDirective.prototype.startPage;
/** @type {?} */
NbListPageTrackerDirective.prototype.pageChange;
/** @type {?} */
NbListPageTrackerDirective.prototype.listItems;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1wYWdlLXRyYWNrZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdGhlbWUtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvbGlzdC9saXN0LXBhZ2UtdHJhY2tlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFDVCxLQUFLLEVBQ0wsVUFBVSxFQUdWLE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFXdkQsTUFBTSxPQUFPLDBCQUEwQjtJQTRCckM7UUExQlEsVUFBSyxHQUFHLElBQUksQ0FBQzs7OztRQWVyQixjQUFTLEdBQVcsQ0FBQyxDQUFDOzs7O1FBTXRCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBTXRDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxvQkFBb0IsQ0FDdEMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQzNDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUNuQixDQUFDO0lBQ0osQ0FBQzs7OztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FB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biAgRGlyZWN0aXZlLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBRdWVyeUxpc3QsXHJcbiAgSW5wdXQsXHJcbiAgRWxlbWVudFJlZixcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAnaW50ZXJzZWN0aW9uLW9ic2VydmVyJztcclxuaW1wb3J0IHsgTmJMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vbGlzdC5jb21wb25lbnQnO1xyXG5cclxuLypcclxuICogTGlzdCBwYWdlciBkaXJlY3RpdmVcclxuICpcclxuICogRGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gZGV0ZXJtaW5lIHBhZ2Ugb2YgY3VycmVudGx5IHZpZXdpbmcgaXRlbXMuXHJcbiAqXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuYkxpc3RQYWdlVHJhY2tlcl0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJMaXN0UGFnZVRyYWNrZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBwcml2YXRlIGFsaXZlID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XHJcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogbnVtYmVyO1xyXG5cclxuICAvKlxyXG4gICAqIEl0ZW1zIHBlciBwYWdlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuXHJcbiAgLypcclxuICAgKiBQYWdlIHRvIHN0YXJ0IGNvdW50aW5nIHdpdGguXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzdGFydFBhZ2U6IG51bWJlciA9IDE7XHJcblxyXG4gIC8qXHJcbiAgICogRW1pdHMgd2hlbiBhbm90aGVyIHBhZ2UgYmVjb21lIHZpc2libGUuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKE5iTGlzdEl0ZW1Db21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxyXG4gIGxpc3RJdGVtczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXHJcbiAgICAgIGVudHJpZXMgPT4gdGhpcy5jaGVja0ZvclBhZ2VDaGFuZ2UoZW50cmllcyksXHJcbiAgICAgIHsgdGhyZXNob2xkOiAwLjUgfSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAodGhpcy5saXN0SXRlbXMgJiYgdGhpcy5saXN0SXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZUl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5saXN0SXRlbXMuY2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vYnNlcnZlSXRlbXMoKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCAmJiB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb2JzZXJ2ZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaChpID0+IHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShpLm5hdGl2ZUVsZW1lbnQpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tGb3JQYWdlQ2hhbmdlKGVudHJpZXM6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXSkge1xyXG4gICAgY29uc3QgbW9zdFZpc2libGVQYWdlID0gdGhpcy5maW5kTW9zdFZpc2libGVQYWdlKGVudHJpZXMpO1xyXG5cclxuICAgIGlmIChtb3N0VmlzaWJsZVBhZ2UgJiYgdGhpcy5jdXJyZW50UGFnZSAhPT0gbW9zdFZpc2libGVQYWdlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBtb3N0VmlzaWJsZVBhZ2U7XHJcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMuY3VycmVudFBhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kTW9zdFZpc2libGVQYWdlKGVudHJpZXM6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXSk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgaW50ZXJzZWN0aW9uUmF0aW9CeVBhZ2UgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xyXG4gICAgICBpZiAoZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gPCAwLjUpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZWxlbWVudEluZGV4ID0gdGhpcy5lbGVtZW50SW5kZXgoZW50cnkudGFyZ2V0KTtcclxuICAgICAgaWYgKGVsZW1lbnRJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYWdlID0gdGhpcy5zdGFydFBhZ2UgKyBNYXRoLmZsb29yKGVsZW1lbnRJbmRleCAvIHRoaXMucGFnZVNpemUpO1xyXG5cclxuICAgICAgbGV0IHJhdGlvID0gZW50cnkuaW50ZXJzZWN0aW9uUmF0aW87XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb25SYXRpb0J5UGFnZS5oYXMocGFnZSkpIHtcclxuICAgICAgICByYXRpbyArPSBpbnRlcnNlY3Rpb25SYXRpb0J5UGFnZS5nZXQocGFnZSk7XHJcbiAgICAgIH1cclxuICAgICAgaW50ZXJzZWN0aW9uUmF0aW9CeVBhZ2Uuc2V0KHBhZ2UsIHJhdGlvKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF4UmF0aW8gPSAwO1xyXG4gICAgbGV0IG1vc3RWaXNpYmxlUGFnZTtcclxuICAgIGludGVyc2VjdGlvblJhdGlvQnlQYWdlLmZvckVhY2goKHJhdGlvLCBwYWdlKSA9PiB7XHJcbiAgICAgIGlmIChyYXRpbyA+IG1heFJhdGlvKSB7XHJcbiAgICAgICAgbWF4UmF0aW8gPSByYXRpbztcclxuICAgICAgICBtb3N0VmlzaWJsZVBhZ2UgPSBwYWdlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbW9zdFZpc2libGVQYWdlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbGVtZW50SW5kZXgoZWxlbWVudDogRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlblxyXG4gICAgICA/IEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKGVsZW1lbnQpXHJcbiAgICAgIDogLTE7XHJcbiAgfVxyXG59XHJcbiJdfQ==