UNPKG

@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
/** * @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=