@q149/angular-scrollspy
Version:
A simple lightweight library for Angular which automatically updates links to indicate the currently active section in the viewport
141 lines (140 loc) • 10.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
/**
* Service that stores a list of `Spy`'s and the state
* of their nav items `inViewport` and `active` state
*
*/
var ScrollSpyService = /** @class */ (function () {
function ScrollSpyService() {
/**
* List of `Spy`'s
*
* \@memberof ScrollSpyService
*/
this.spys = [];
/**
* Stores requests to add items to spy when spy hasn't been created
* yet. Once spy has been added then request will be made again.
*
* \@memberof ScrollSpyService
*/
this.buffer = [];
}
/**
* Add spy to list of `spys`
*
* \@memberof ScrollSpyService
* @param {?} id
* @param {?} items
* @return {?}
*/
ScrollSpyService.prototype.addSpy = /**
* Add spy to list of `spys`
*
* \@memberof ScrollSpyService
* @param {?} id
* @param {?} items
* @return {?}
*/
function (id, items) {
var _this = this;
this.spys.push({ id: id, items: items });
var /** @type {?} */ buffer = this.buffer.filter(function (i) { return i.spyId === id; });
this.buffer = this.buffer.filter(function (i) { return i.spyId !== id; });
buffer.forEach(function (i) {
return _this.setSpySectionStatus(i.sectionId, i.spyId, i.inViewport);
});
};
/**
* Remove spy from list of `spys`
*
* \@memberof ScrollSpyService
* @param {?} id
* @return {?}
*/
ScrollSpyService.prototype.removeSpy = /**
* Remove spy from list of `spys`
*
* \@memberof ScrollSpyService
* @param {?} id
* @return {?}
*/
function (id) {
var /** @type {?} */ i = this.spys.findIndex(function (s) { return s.id === id; });
this.spys.splice(i, 1);
};
/**
* Set the `inViewport` status for a spy item then sets the active
* to true for the first item in the list that has `inViewport`
* set to true
*
* \@memberof ScrollSpyService
* @param {?} sectionId
* @param {?} spyId
* @param {?} inViewport
* @return {?}
*/
ScrollSpyService.prototype.setSpySectionStatus = /**
* Set the `inViewport` status for a spy item then sets the active
* to true for the first item in the list that has `inViewport`
* set to true
*
* \@memberof ScrollSpyService
* @param {?} sectionId
* @param {?} spyId
* @param {?} inViewport
* @return {?}
*/
function (sectionId, spyId, inViewport) {
var /** @type {?} */ spy = this.spys.find(function (s) { return s.id === spyId; });
if (!spy) {
this.buffer.push({ sectionId: sectionId, spyId: spyId, inViewport: inViewport });
return;
}
var /** @type {?} */ item = spy.items.find(function (i) { return i.section === sectionId; });
if (!item) {
return;
}
item.inViewport = inViewport;
var /** @type {?} */ firstInViewport = spy.items.filter(function (i) { return i.inViewport; })[0];
spy.items.forEach(function (i) { return (i.active = false); });
if (firstInViewport) {
firstInViewport.active = true;
firstInViewport.detectChanges();
}
};
ScrollSpyService.decorators = [
{ type: Injectable },
];
return ScrollSpyService;
}());
export { ScrollSpyService };
function ScrollSpyService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ScrollSpyService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ScrollSpyService.ctorParameters;
/**
* List of `Spy`'s
*
* \@memberof ScrollSpyService
* @type {?}
*/
ScrollSpyService.prototype.spys;
/**
* Stores requests to add items to spy when spy hasn't been created
* yet. Once spy has been added then request will be made again.
*
* \@memberof ScrollSpyService
* @type {?}
*/
ScrollSpyService.prototype.buffer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXNweS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHExNDkvYW5ndWxhci1zY3JvbGxzcHkvIiwic291cmNlcyI6WyJhcHAvc2Nyb2xsLXNweS9zY3JvbGwtc3B5LXNlcnZpY2Uvc2Nyb2xsLXNweS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7O29CQWlCL0IsRUFBRTs7Ozs7OztzQkFPQSxFQUFFOzs7Ozs7Ozs7O0lBTWxCLGlDQUFNOzs7Ozs7OztjQUFDLEVBQVUsRUFBRSxLQUF3Qzs7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxDQUFDLENBQUM7UUFDOUIscUJBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQWQsQ0FBYyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFkLENBQWMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDO1lBQ2QsT0FBQSxLQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFBNUQsQ0FBNEQsQ0FDN0QsQ0FBQzs7Ozs7Ozs7O0lBT0csb0NBQVM7Ozs7Ozs7Y0FBQyxFQUFVO1FBQ3pCLHFCQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFYLENBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztJQVNsQiw4Q0FBbUI7Ozs7Ozs7Ozs7O2NBQ3hCLFNBQWlCLEVBQ2pCLEtBQWEsRUFDYixVQUFtQjtRQUVuQixxQkFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBZCxDQUFjLENBQUMsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsV0FBQSxFQUFFLEtBQUssT0FBQSxFQUFFLFVBQVUsWUFBQSxFQUFFLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUM7U0FDUjtRQUNELHFCQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUF2QixDQUF1QixDQUFDLENBQUM7UUFDMUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1YsTUFBTSxDQUFDO1NBQ1I7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixxQkFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsVUFBVSxFQUFaLENBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFsQixDQUFrQixDQUFDLENBQUM7UUFFM0MsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNwQixlQUFlLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUM5QixlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDakM7OztnQkFsRUosVUFBVTs7MkJBVlg7O1NBV2EsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTY3JvbGxTcHlJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi4vc2Nyb2xsLXNweS1pdGVtL3Njcm9sbC1zcHktaXRlbS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTcHkgfSBmcm9tICcuLi9zaGFyZWQvc3B5Lm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIHRoYXQgc3RvcmVzIGEgbGlzdCBvZiBgU3B5YCdzIGFuZCB0aGUgc3RhdGVcclxuICogb2YgdGhlaXIgbmF2IGl0ZW1zIGBpblZpZXdwb3J0YCBhbmQgYGFjdGl2ZWAgc3RhdGVcclxuICpcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNjcm9sbFNweVNlcnZpY2Uge1xyXG4gIC8qKlxyXG4gICAqIExpc3Qgb2YgYFNweWAnc1xyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIFNjcm9sbFNweVNlcnZpY2VcclxuICAgKi9cclxuICBwdWJsaWMgc3B5czogU3B5W10gPSBbXTtcclxuICAvKipcclxuICAgKiBTdG9yZXMgcmVxdWVzdHMgdG8gYWRkIGl0ZW1zIHRvIHNweSB3aGVuIHNweSBoYXNuJ3QgYmVlbiBjcmVhdGVkXHJcbiAgICogeWV0LiBPbmNlIHNweSBoYXMgYmVlbiBhZGRlZCB0aGVuIHJlcXVlc3Qgd2lsbCBiZSBtYWRlIGFnYWluLlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIFNjcm9sbFNweVNlcnZpY2VcclxuICAgKi9cclxuICBwdWJsaWMgYnVmZmVyOiBhbnlbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIEFkZCBzcHkgdG8gbGlzdCBvZiBgc3B5c2BcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBTY3JvbGxTcHlTZXJ2aWNlXHJcbiAgICovXHJcbiAgcHVibGljIGFkZFNweShpZDogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFNjcm9sbFNweUl0ZW1EaXJlY3RpdmU+KTogdm9pZCB7XHJcbiAgICB0aGlzLnNweXMucHVzaCh7IGlkLCBpdGVtcyB9KTtcclxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLmZpbHRlcihpID0+IGkuc3B5SWQgPT09IGlkKTtcclxuICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuZmlsdGVyKGkgPT4gaS5zcHlJZCAhPT0gaWQpO1xyXG4gICAgYnVmZmVyLmZvckVhY2goaSA9PlxyXG4gICAgICB0aGlzLnNldFNweVNlY3Rpb25TdGF0dXMoaS5zZWN0aW9uSWQsIGkuc3B5SWQsIGkuaW5WaWV3cG9ydClcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBzcHkgZnJvbSBsaXN0IG9mIGBzcHlzYFxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIFNjcm9sbFNweVNlcnZpY2VcclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlU3B5KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnNweXMuZmluZEluZGV4KHMgPT4gcy5pZCA9PT0gaWQpO1xyXG4gICAgdGhpcy5zcHlzLnNwbGljZShpLCAxKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBgaW5WaWV3cG9ydGAgc3RhdHVzIGZvciBhIHNweSBpdGVtIHRoZW4gc2V0cyB0aGUgYWN0aXZlXHJcbiAgICogdG8gdHJ1ZSBmb3IgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QgdGhhdCBoYXMgYGluVmlld3BvcnRgXHJcbiAgICogc2V0IHRvIHRydWVcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBTY3JvbGxTcHlTZXJ2aWNlXHJcbiAgICovXHJcbiAgcHVibGljIHNldFNweVNlY3Rpb25TdGF0dXMoXHJcbiAgICBzZWN0aW9uSWQ6IHN0cmluZyxcclxuICAgIHNweUlkOiBzdHJpbmcsXHJcbiAgICBpblZpZXdwb3J0OiBib29sZWFuXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBzcHkgPSB0aGlzLnNweXMuZmluZChzID0+IHMuaWQgPT09IHNweUlkKTtcclxuICAgIGlmICghc3B5KSB7XHJcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goeyBzZWN0aW9uSWQsIHNweUlkLCBpblZpZXdwb3J0IH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtID0gc3B5Lml0ZW1zLmZpbmQoaSA9PiBpLnNlY3Rpb24gPT09IHNlY3Rpb25JZCk7XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGl0ZW0uaW5WaWV3cG9ydCA9IGluVmlld3BvcnQ7XHJcbiAgICBjb25zdCBmaXJzdEluVmlld3BvcnQgPSBzcHkuaXRlbXMuZmlsdGVyKGkgPT4gaS5pblZpZXdwb3J0KVswXTtcclxuICAgIHNweS5pdGVtcy5mb3JFYWNoKGkgPT4gKGkuYWN0aXZlID0gZmFsc2UpKTtcclxuXHJcbiAgICBpZiAoZmlyc3RJblZpZXdwb3J0KSB7XHJcbiAgICAgIGZpcnN0SW5WaWV3cG9ydC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICBmaXJzdEluVmlld3BvcnQuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=