@thisissoon/angular-scrollspy
Version:
A simple lightweight library for Angular which automatically updates links to indicate the currently active section in the viewport
155 lines • 10.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} 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
*/
/**
* 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 });
/** @type {?} */
var 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
*/
/**
* 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) {
/** @type {?} */
var 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
*/
/**
* 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) {
/** @type {?} */
var spy = this.spys.find(function (s) { return s.id === spyId; });
if (!spy) {
this.buffer.push({ sectionId: sectionId, spyId: spyId, inViewport: inViewport });
return;
}
/** @type {?} */
var item = spy.items.find(function (i) { return i.section === sectionId; });
if (!item) {
return;
}
item.inViewport = inViewport;
/** @type {?} */
var 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 };
if (false) {
/**
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXNweS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRoaXNpc3Nvb24vYW5ndWxhci1zY3JvbGxzcHkvIiwic291cmNlcyI6WyJhcHAvc2Nyb2xsLXNweS9zY3JvbGwtc3B5LXNlcnZpY2Uvc2Nyb2xsLXNweS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFVdEQ7SUFBQTs7Ozs7O1FBT1MsU0FBSSxHQUFVLEVBQUUsQ0FBQzs7Ozs7OztRQU9qQixXQUFNLEdBQVUsRUFBRSxDQUFDO0lBc0Q1QixDQUFDO0lBckRDOzs7O09BSUc7Ozs7Ozs7OztJQUNJLGlDQUFNOzs7Ozs7OztJQUFiLFVBQWMsRUFBVSxFQUFFLEtBQXdDO1FBQWxFLGlCQU9DO1FBTkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxDQUFDLENBQUM7O1lBQ3hCLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFkLENBQWMsQ0FBQztRQUN0RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQWQsQ0FBYyxDQUFDLENBQUM7UUFDdEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7WUFDZCxPQUFBLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUE1RCxDQUE0RCxDQUM3RCxDQUFDO0lBQ0osQ0FBQztJQUNEOzs7O09BSUc7Ozs7Ozs7O0lBQ0ksb0NBQVM7Ozs7Ozs7SUFBaEIsVUFBaUIsRUFBVTs7WUFDbkIsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQVgsQ0FBVyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0Q7Ozs7OztPQU1HOzs7Ozs7Ozs7Ozs7SUFDSSw4Q0FBbUI7Ozs7Ozs7Ozs7O0lBQTFCLFVBQ0UsU0FBaUIsRUFDakIsS0FBYSxFQUNiLFVBQW1COztZQUViLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFkLENBQWMsQ0FBQztRQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLFdBQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxVQUFVLFlBQUEsRUFBRSxDQUFDLENBQUM7WUFDbkQsT0FBTztTQUNSOztZQUNLLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUF2QixDQUF1QixDQUFDO1FBQ3pELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQzs7WUFDdkIsZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFVBQVUsRUFBWixDQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQWxCLENBQWtCLENBQUMsQ0FBQztRQUUzQyxJQUFJLGVBQWUsRUFBRTtZQUNuQixlQUFlLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUM5QixlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDOztnQkFuRUYsVUFBVTs7SUFvRVgsdUJBQUM7Q0FBQSxBQXBFRCxJQW9FQztTQW5FWSxnQkFBZ0I7Ozs7Ozs7O0lBTTNCLGdDQUF3Qjs7Ozs7Ozs7SUFPeEIsa0NBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNjcm9sbFNweUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi9zY3JvbGwtc3B5LWl0ZW0vc2Nyb2xsLXNweS1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTcHkgfSBmcm9tICcuLi9zaGFyZWQvc3B5Lm1vZGVsJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRoYXQgc3RvcmVzIGEgbGlzdCBvZiBgU3B5YCdzIGFuZCB0aGUgc3RhdGVcbiAqIG9mIHRoZWlyIG5hdiBpdGVtcyBgaW5WaWV3cG9ydGAgYW5kIGBhY3RpdmVgIHN0YXRlXG4gKlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2Nyb2xsU3B5U2VydmljZSB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIGBTcHlgJ3NcbiAgICpcbiAgICogQG1lbWJlcm9mIFNjcm9sbFNweVNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBzcHlzOiBTcHlbXSA9IFtdO1xuICAvKipcbiAgICogU3RvcmVzIHJlcXVlc3RzIHRvIGFkZCBpdGVtcyB0byBzcHkgd2hlbiBzcHkgaGFzbid0IGJlZW4gY3JlYXRlZFxuICAgKiB5ZXQuIE9uY2Ugc3B5IGhhcyBiZWVuIGFkZGVkIHRoZW4gcmVxdWVzdCB3aWxsIGJlIG1hZGUgYWdhaW4uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBTY3JvbGxTcHlTZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgYnVmZmVyOiBhbnlbXSA9IFtdO1xuICAvKipcbiAgICogQWRkIHNweSB0byBsaXN0IG9mIGBzcHlzYFxuICAgKlxuICAgKiBAbWVtYmVyb2YgU2Nyb2xsU3B5U2VydmljZVxuICAgKi9cbiAgcHVibGljIGFkZFNweShpZDogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFNjcm9sbFNweUl0ZW1EaXJlY3RpdmU+KTogdm9pZCB7XG4gICAgdGhpcy5zcHlzLnB1c2goeyBpZCwgaXRlbXMgfSk7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIuZmlsdGVyKGkgPT4gaS5zcHlJZCA9PT0gaWQpO1xuICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuZmlsdGVyKGkgPT4gaS5zcHlJZCAhPT0gaWQpO1xuICAgIGJ1ZmZlci5mb3JFYWNoKGkgPT5cbiAgICAgIHRoaXMuc2V0U3B5U2VjdGlvblN0YXR1cyhpLnNlY3Rpb25JZCwgaS5zcHlJZCwgaS5pblZpZXdwb3J0KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgc3B5IGZyb20gbGlzdCBvZiBgc3B5c2BcbiAgICpcbiAgICogQG1lbWJlcm9mIFNjcm9sbFNweVNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyByZW1vdmVTcHkoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGkgPSB0aGlzLnNweXMuZmluZEluZGV4KHMgPT4gcy5pZCA9PT0gaWQpO1xuICAgIHRoaXMuc3B5cy5zcGxpY2UoaSwgMSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgYGluVmlld3BvcnRgIHN0YXR1cyBmb3IgYSBzcHkgaXRlbSB0aGVuIHNldHMgdGhlIGFjdGl2ZVxuICAgKiB0byB0cnVlIGZvciB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCB0aGF0IGhhcyBgaW5WaWV3cG9ydGBcbiAgICogc2V0IHRvIHRydWVcbiAgICpcbiAgICogQG1lbWJlcm9mIFNjcm9sbFNweVNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBzZXRTcHlTZWN0aW9uU3RhdHVzKFxuICAgIHNlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNweUlkOiBzdHJpbmcsXG4gICAgaW5WaWV3cG9ydDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc3B5ID0gdGhpcy5zcHlzLmZpbmQocyA9PiBzLmlkID09PSBzcHlJZCk7XG4gICAgaWYgKCFzcHkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goeyBzZWN0aW9uSWQsIHNweUlkLCBpblZpZXdwb3J0IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtID0gc3B5Lml0ZW1zLmZpbmQoaSA9PiBpLnNlY3Rpb24gPT09IHNlY3Rpb25JZCk7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXRlbS5pblZpZXdwb3J0ID0gaW5WaWV3cG9ydDtcbiAgICBjb25zdCBmaXJzdEluVmlld3BvcnQgPSBzcHkuaXRlbXMuZmlsdGVyKGkgPT4gaS5pblZpZXdwb3J0KVswXTtcbiAgICBzcHkuaXRlbXMuZm9yRWFjaChpID0+IChpLmFjdGl2ZSA9IGZhbHNlKSk7XG5cbiAgICBpZiAoZmlyc3RJblZpZXdwb3J0KSB7XG4gICAgICBmaXJzdEluVmlld3BvcnQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgIGZpcnN0SW5WaWV3cG9ydC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG59XG4iXX0=