UNPKG

fundamental-ngx

Version:

SAP Fundamentals, implemented in Angular

121 lines 8.86 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core'; /** * A directive designed to help navigation elements determine the element currently in view of the user. */ export class ScrollSpyDirective { /** * @hidden * @param {?} elRef */ constructor(elRef) { this.elRef = elRef; /** * An array of tags to track. */ this.trackedTags = []; /** * Whether events are still fired if there is no tag present on the user's screen. */ this.fireEmpty = false; /** * A number that represent at what location in the container the event is fired. * 0.5 would fire the events in the middle of the container, * 0 for the top and 1 for the bottom. */ this.targetPercent = 0; /** * Event fired on the scroll element when a new item becomes activated by the scrollspy . * The returned value is the HTMLElement itself. */ this.spyChange = new EventEmitter(); } /** * @hidden * @param {?} event * @return {?} */ onScroll(event) { /** @type {?} */ let spiedTag; /** @type {?} */ const children = this.elRef.nativeElement.children; /** @type {?} */ const targetScrollTop = event.target.scrollTop; /** @type {?} */ const targetOffsetTop = event.target.offsetTop; for (let i = 0; i < children.length; i++) { /** @type {?} */ const element = children[i]; if (this.trackedTags.some((/** * @param {?} tag * @return {?} */ tag => tag.toLocaleUpperCase() === element.tagName.toLocaleUpperCase()))) { if ((element.offsetTop - targetOffsetTop) <= targetScrollTop + event.target.offsetHeight * this.targetPercent) { spiedTag = element; } } } if ((spiedTag || this.fireEmpty) && spiedTag !== this.currentActive) { this.currentActive = spiedTag; this.spyChange.emit(this.currentActive); } } } ScrollSpyDirective.decorators = [ { type: Directive, args: [{ selector: '[fdScrollSpy]' },] } ]; /** @nocollapse */ ScrollSpyDirective.ctorParameters = () => [ { type: ElementRef } ]; ScrollSpyDirective.propDecorators = { trackedTags: [{ type: Input }], fireEmpty: [{ type: Input }], targetPercent: [{ type: Input }], spyChange: [{ type: Output }], onScroll: [{ type: HostListener, args: ['scroll', ['$event'],] }] }; if (false) { /** * An array of tags to track. * @type {?} */ ScrollSpyDirective.prototype.trackedTags; /** * Whether events are still fired if there is no tag present on the user's screen. * @type {?} */ ScrollSpyDirective.prototype.fireEmpty; /** * A number that represent at what location in the container the event is fired. * 0.5 would fire the events in the middle of the container, * 0 for the top and 1 for the bottom. * @type {?} */ ScrollSpyDirective.prototype.targetPercent; /** * Event fired on the scroll element when a new item becomes activated by the scrollspy . * The returned value is the HTMLElement itself. * @type {?} */ ScrollSpyDirective.prototype.spyChange; /** * @hidden * @type {?} * @private */ ScrollSpyDirective.prototype.currentActive; /** * @type {?} * @private */ ScrollSpyDirective.prototype.elRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXNweS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvc2Nyb2xsLXNweS9zY3JvbGwtc3B5LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBUWpHLE1BQU0sT0FBTyxrQkFBa0I7Ozs7O0lBZ0MzQixZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZOzs7O1FBM0I5QixnQkFBVyxHQUFhLEVBQUUsQ0FBQzs7OztRQU0zQixjQUFTLEdBQVksS0FBSyxDQUFDOzs7Ozs7UUFRM0Isa0JBQWEsR0FBVyxDQUFDLENBQUM7Ozs7O1FBT2pCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQWUsQ0FBQztJQU0vQyxDQUFDOzs7Ozs7SUFJekMsUUFBUSxDQUFDLEtBQVU7O1lBQ1gsUUFBcUI7O2NBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFROztjQUM1QyxlQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTOztjQUN4QyxlQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTO1FBRTlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztrQkFDaEMsT0FBTyxHQUFnQixRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJOzs7O1lBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUMsRUFBRTtnQkFDL0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQzNHLFFBQVEsR0FBRyxPQUFPLENBQUM7aUJBQ3RCO2FBQ0o7U0FDSjtRQUVELElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2pFLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7OztZQTFESixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGVBQWU7YUFDNUI7Ozs7WUFQbUIsVUFBVTs7OzBCQVl6QixLQUFLO3dCQU1MLEtBQUs7NEJBUUwsS0FBSzt3QkFPTCxNQUFNO3VCQVVOLFlBQVksU0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7SUEvQmxDLHlDQUNrQzs7Ozs7SUFLbEMsdUNBQ2tDOzs7Ozs7O0lBT2xDLDJDQUNpQzs7Ozs7O0lBTWpDLHVDQUN1Rjs7Ozs7O0lBR3ZGLDJDQUFtQzs7Ozs7SUFHdkIsbUNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIGRlc2lnbmVkIHRvIGhlbHAgbmF2aWdhdGlvbiBlbGVtZW50cyBkZXRlcm1pbmUgdGhlIGVsZW1lbnQgY3VycmVudGx5IGluIHZpZXcgb2YgdGhlIHVzZXIuIFxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tmZFNjcm9sbFNweV0nXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbFNweURpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdGFncyB0byB0cmFjay5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0cmFja2VkVGFnczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgZXZlbnRzIGFyZSBzdGlsbCBmaXJlZCBpZiB0aGVyZSBpcyBubyB0YWcgcHJlc2VudCBvbiB0aGUgdXNlcidzIHNjcmVlbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmaXJlRW1wdHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBcbiAgICAgKiBBIG51bWJlciB0aGF0IHJlcHJlc2VudCBhdCB3aGF0IGxvY2F0aW9uIGluIHRoZSBjb250YWluZXIgdGhlIGV2ZW50IGlzIGZpcmVkLiBcbiAgICAgKiAwLjUgd291bGQgZmlyZSB0aGUgZXZlbnRzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNvbnRhaW5lciwgXG4gICAgICogMCBmb3IgdGhlIHRvcCBhbmQgMSBmb3IgdGhlIGJvdHRvbS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0YXJnZXRQZXJjZW50OiBudW1iZXIgPSAwO1xuXG4gICAgLyoqIFxuICAgICAqIEV2ZW50IGZpcmVkIG9uIHRoZSBzY3JvbGwgZWxlbWVudCB3aGVuIGEgbmV3IGl0ZW0gYmVjb21lcyBhY3RpdmF0ZWQgYnkgdGhlIHNjcm9sbHNweSAuIFxuICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgSFRNTEVsZW1lbnQgaXRzZWxmLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBzcHlDaGFuZ2U6IEV2ZW50RW1pdHRlcjxIVE1MRWxlbWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50PigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGN1cnJlbnRBY3RpdmU6IEhUTUxFbGVtZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdzY3JvbGwnLCBbJyRldmVudCddKVxuICAgIG9uU2Nyb2xsKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IHNwaWVkVGFnOiBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGV2ZW50LnRhcmdldC5zY3JvbGxUb3A7XG4gICAgICAgIGNvbnN0IHRhcmdldE9mZnNldFRvcCA9IGV2ZW50LnRhcmdldC5vZmZzZXRUb3A7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrZWRUYWdzLnNvbWUodGFnID0+IHRhZy50b0xvY2FsZVVwcGVyQ2FzZSgpID09PSBlbGVtZW50LnRhZ05hbWUudG9Mb2NhbGVVcHBlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQub2Zmc2V0VG9wIC0gdGFyZ2V0T2Zmc2V0VG9wKSA8PSB0YXJnZXRTY3JvbGxUb3AgKyBldmVudC50YXJnZXQub2Zmc2V0SGVpZ2h0ICogdGhpcy50YXJnZXRQZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHNwaWVkVGFnID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHNwaWVkVGFnIHx8IHRoaXMuZmlyZUVtcHR5KSAmJiBzcGllZFRhZyAhPT0gdGhpcy5jdXJyZW50QWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBY3RpdmUgPSBzcGllZFRhZztcbiAgICAgICAgICAgIHRoaXMuc3B5Q2hhbmdlLmVtaXQodGhpcy5jdXJyZW50QWN0aXZlKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIl19