UNPKG

ngx-scrollbar-v8

Version:

Custom overlay-scrollbars with native scrolling mechanism.

169 lines 16.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Inject, NgZone, ChangeDetectionStrategy, forwardRef, PLATFORM_ID } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { Directionality } from '@angular/cdk/bidi'; import { fromEvent, animationFrameScheduler } from 'rxjs'; import { mergeMap, pluck, takeUntil, tap } from 'rxjs/operators'; import { NgScrollbar } from './ng-scrollbar'; import { NgScrollbarThumb } from './ng-scrollbar-thumb'; export class NgScrollbarX extends NgScrollbarThumb { /** * @param {?} _document * @param {?} _parent * @param {?} _platform * @param {?} _dir * @param {?} _zone */ constructor(_document, _parent, _platform, _dir, _zone) { super(_parent, _platform, _zone); this._document = _document; this._parent = _parent; this._dir = _dir; this._zone = _zone; } /** * Calculate scrollbar thumbnail size * @return {?} */ get thumbSize() { /** @type {?} */ const barClientWidth = this.bar.nativeElement.clientWidth; /** @type {?} */ const viewClientWidth = this._view.clientWidth; /** @type {?} */ const viewScrollWidth = this._view.scrollWidth; this._naturalThumbSize = barClientWidth / viewScrollWidth * barClientWidth; this._scrollMax = viewScrollWidth - viewClientWidth; return this.scrollBoundaries(this._naturalThumbSize, this._scrollMax); } /** * Scrollbar click * @param {?} e Mouse event * @return {?} */ onScrollbarHolderClick(e) { if (e.target === e.currentTarget) { /** @type {?} */ const offsetX = e.offsetX - this._naturalThumbSize * .5; /** @type {?} */ const thumbPositionPercentage = offsetX * 100 / this.bar.nativeElement.clientWidth; /** @type {?} */ const value = thumbPositionPercentage * this._view.scrollWidth / 100; this._parent.scrollTo((/** @type {?} */ ({ left: value, duration: this.scrollToDuration }))).subscribe(); } } /** * Update scrollbar * @protected * @return {?} */ updateScrollbar() { this._thumbSize = this.thumb.nativeElement.clientWidth; this._trackMax = this.bar.nativeElement.clientWidth - this._thumbSize; this._currPos = this._view.scrollLeft * this._trackMax / this._scrollMax; this._zone.run((/** * @return {?} */ () => { animationFrameScheduler.schedule((/** * @return {?} */ () => this.updateState({ transform: `translate3d(${this._dir.value === 'rtl' ? this._currPos - this._trackMax : this._currPos}px, 0, 0)`, width: `${this.thumbSize}px` }))); })); } /** * Start horizontal thumb worker * @protected * @return {?} */ startThumbEvents() { /** @type {?} */ const mouseDown$ = fromEvent(this.thumb.nativeElement, 'mousedown'); /** @type {?} */ const mouseMove$ = fromEvent(this._document, 'mousemove'); /** @type {?} */ const mouseUp$ = fromEvent(this._document, 'mouseup').pipe(tap((/** * @return {?} */ () => this._document.onselectstart = null))); return mouseDown$.pipe(tap((/** * @return {?} */ () => { this._document.onselectstart = (/** * @return {?} */ () => false); // Initialize trackMax for before start dragging this._trackMax = this.bar.nativeElement.clientWidth - this._thumbSize; })), pluck('offsetX'), mergeMap((/** * @param {?} mouseDownOffset * @return {?} */ (mouseDownOffset) => mouseMove$.pipe(takeUntil(mouseUp$), pluck('clientX'), tap((/** * @param {?} mouseMoveClient * @return {?} */ (mouseMoveClient) => { /** @type {?} */ const offsetX = mouseMoveClient - this.bar.nativeElement.getBoundingClientRect().left; /** @type {?} */ let value = this._scrollMax * (offsetX - mouseDownOffset) / this._trackMax; if (this._dir.value === 'rtl') { value = value === 0 ? offsetX - this._trackMax : value; } this._parent.scrollable.scrollTo({ left: value }); })))))); } } NgScrollbarX.decorators = [ { type: Component, args: [{ selector: 'ng-scrollbar-x', changeDetection: ChangeDetectionStrategy.OnPush, template: ` <div #bar class="ng-scrollbar {{barClass}}" (mousedown)="onScrollbarHolderClick($event)"> <div #thumb class="ng-scrollbar-thumb {{thumbClass}}" [ngStyle]="scrollbarStyle | async"></div> </div> ` }] } ]; /** @nocollapse */ NgScrollbarX.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: NgScrollbar, decorators: [{ type: Inject, args: [forwardRef((/** * @return {?} */ () => NgScrollbar)),] }] }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: Directionality }, { type: NgZone } ]; if (false) { /** * @type {?} * @protected */ NgScrollbarX.prototype._document; /** * @type {?} * @protected */ NgScrollbarX.prototype._parent; /** * @type {?} * @protected */ NgScrollbarX.prototype._dir; /** * @type {?} * @protected */ NgScrollbarX.prototype._zone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsYmFyLXguanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2Nyb2xsYmFyLyIsInNvdXJjZXMiOlsic2Nyb2xsYmFyL25nLXNjcm9sbGJhci14LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQWMsdUJBQXVCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVd4RCxNQUFNLE9BQU8sWUFBYSxTQUFRLGdCQUFnQjs7Ozs7Ozs7SUFjaEQsWUFBd0MsU0FBYyxFQUNPLE9BQW9CLEVBQ2hELFNBQWlCLEVBQzVCLElBQW9CLEVBQ3BCLEtBQWE7UUFDakMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFMSyxjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ08sWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUUzRCxTQUFJLEdBQUosSUFBSSxDQUFnQjtRQUNwQixVQUFLLEdBQUwsS0FBSyxDQUFRO0lBRW5DLENBQUM7Ozs7O0lBZkQsSUFBSSxTQUFTOztjQUNMLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxXQUFXOztjQUNuRCxlQUFlLEdBQUcsSUFBSSxDQUFD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QTBDOzs7OztJQUMxQywrQkFBcUU7Ozs7O0lBRXJFLDRCQUE4Qjs7Ozs7SUFDOUIsNkJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIGZvcndhcmRSZWYsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1lcmdlTWFwLCBwbHVjaywgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOZ1Njcm9sbGJhciB9IGZyb20gJy4vbmctc2Nyb2xsYmFyJztcbmltcG9ydCB7IE5nU2Nyb2xsYmFyVGh1bWIgfSBmcm9tICcuL25nLXNjcm9sbGJhci10aHVtYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLXNjcm9sbGJhci14JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAjYmFyIGNsYXNzPVwibmctc2Nyb2xsYmFyIHt7YmFyQ2xhc3N9fVwiIChtb3VzZWRvd24pPVwib25TY3JvbGxiYXJIb2xkZXJDbGljaygkZXZlbnQpXCI+XG4gICAgICA8ZGl2ICN0aHVtYiBjbGFzcz1cIm5nLXNjcm9sbGJhci10aHVtYiB7e3RodW1iQ2xhc3N9fVwiIFtuZ1N0eWxlXT1cInNjcm9sbGJhclN0eWxlIHwgYXN5bmNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbGJhclggZXh0ZW5kcyBOZ1Njcm9sbGJhclRodW1iIHtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHNjcm9sbGJhciB0aHVtYm5haWwgc2l6ZVxuICAgKi9cbiAgZ2V0IHRodW1iU2l6ZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGJhckNsaWVudFdpZHRoID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCB2aWV3Q2xpZW50V2lkdGggPSB0aGlzLl92aWV3LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHZpZXdTY3JvbGxXaWR0aCA9IHRoaXMuX3ZpZXcuc2Nyb2xsV2lkdGg7XG4gICAgdGhpcy5fbmF0dXJhbFRodW1iU2l6ZSA9IGJhckNsaWVudFdpZHRoIC8gdmlld1Njcm9sbFdpZHRoICogYmFyQ2xpZW50V2lkdGg7XG4gICAgdGhpcy5fc2Nyb2xsTWF4ID0gdmlld1Njcm9sbFdpZHRoIC0gdmlld0NsaWVudFdpZHRoO1xuICAgIHJldHVybiB0aGlzLnNjcm9sbEJvdW5kYXJpZXModGhpcy5fbmF0dXJhbFRodW1iU2l6ZSwgdGhpcy5fc2Nyb2xsTWF4KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByb3RlY3RlZCBfZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgICAgICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE5nU2Nyb2xsYmFyKSkgcHJvdGVjdGVkIF9wYXJlbnQ6IE5nU2Nyb2xsYmFyLFxuICAgICAgICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBfcGxhdGZvcm06IE9iamVjdCxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3pvbmU6IE5nWm9uZSkge1xuICAgIHN1cGVyKF9wYXJlbnQsIF9wbGF0Zm9ybSwgX3pvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbGJhciBjbGlja1xuICAgKiBAcGFyYW0gZSBNb3VzZSBldmVudFxuICAgKi9cbiAgb25TY3JvbGxiYXJIb2xkZXJDbGljayhlOiBhbnkpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGUub2Zmc2V0WCAtIHRoaXMuX25hdHVyYWxUaHVtYlNpemUgKiAuNTtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb25QZXJjZW50YWdlID0gb2Zmc2V0WCAqIDEwMCAvIHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRodW1iUG9zaXRpb25QZXJjZW50YWdlICogdGhpcy5fdmlldy5zY3JvbGxXaWR0aCAvIDEwMDtcbiAgICAgIHRoaXMuX3BhcmVudC5zY3JvbGxUbyh7bGVmdDogdmFsdWUsIGR1cmF0aW9uOiB0aGlzLnNjcm9sbFRvRHVyYXRpb259IGFzIGFueSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzY3JvbGxiYXJcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVTY3JvbGxiYXIoKSB7XG4gICAgdGhpcy5fdGh1bWJTaXplID0gdGhpcy50aHVtYi5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHRoaXMuX3RyYWNrTWF4ID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCAtIHRoaXMuX3RodW1iU2l6ZTtcbiAgICB0aGlzLl9jdXJyUG9zID0gdGhpcy5fdmlldy5zY3JvbGxMZWZ0ICogdGhpcy5fdHJhY2tNYXggLyB0aGlzLl9zY3JvbGxNYXg7XG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnID8gdGhpcy5fY3VyclBvcyAtIHRoaXMuX3RyYWNrTWF4IDogdGhpcy5fY3VyclBvc31weCwgMCwgMClgLFxuICAgICAgICAgIHdpZHRoOiBgJHt0aGlzLnRodW1iU2l6ZX1weGBcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgaG9yaXpvbnRhbCB0aHVtYiB3b3JrZXJcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydFRodW1iRXZlbnRzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgbW91c2VEb3duJCA9IGZyb21FdmVudCh0aGlzLnRodW1iLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nKTtcbiAgICBjb25zdCBtb3VzZU1vdmUkID0gZnJvbUV2ZW50KHRoaXMuX2RvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XG4gICAgY29uc3QgbW91c2VVcCQgPSBmcm9tRXZlbnQodGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gbnVsbClcbiAgICApO1xuICAgIHJldHVybiBtb3VzZURvd24kLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2U7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdHJhY2tNYXggZm9yIGJlZm9yZSBzdGFydCBkcmFnZ2luZ1xuICAgICAgICB0aGlzLl90cmFja01heCA9IHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggLSB0aGlzLl90aHVtYlNpemU7XG4gICAgICB9KSxcbiAgICAgIHBsdWNrKCdvZmZzZXRYJyksXG4gICAgICBtZXJnZU1hcCgobW91c2VEb3duT2Zmc2V0OiBudW1iZXIpID0+IG1vdXNlTW92ZSQucGlwZShcbiAgICAgICAgdGFrZVVudGlsKG1vdXNlVXAkKSxcbiAgICAgICAgcGx1Y2soJ2NsaWVudFgnKSxcbiAgICAgICAgdGFwKChtb3VzZU1vdmVDbGllbnQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBtb3VzZU1vdmVDbGllbnQgLSB0aGlzLmJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fc2Nyb2xsTWF4ICogKG9mZnNldFggLSBtb3VzZURvd25PZmZzZXQpIC8gdGhpcy5fdHJhY2tNYXg7XG4gICAgICAgICAgaWYgKHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IDAgPyBvZmZzZXRYIC0gdGhpcy5fdHJhY2tNYXggOiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcGFyZW50LnNjcm9sbGFibGUuc2Nyb2xsVG8oe2xlZnQ6IHZhbHVlfSk7XG4gICAgICAgIH0pXG4gICAgICApKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==