UNPKG

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