{ "version": 3, "sources": ["src/app/shared/scroll/scrollbar.service.ts"], "sourcesContent": ["import { Platform } from '@angular/cdk/platform';\r\n// Import the core angular services.\r\nimport { Injectable, Inject, OnDestroy, ElementRef, Renderer2, RendererFactory2, NgZone } from '@angular/core';\r\nimport { Router, Scroll, Event } from '@angular/router';\r\nimport { LazyLoadService } from 'app/lazy-load/lazy-load.service';\r\nimport { NgScrollbar } from 'ngx-scrollbar';\r\nimport { of, Subject, Subscription, Observable, Observer, distinctUntilChanged, fromEvent } from 'rxjs';\r\nimport { auditTime, filter, pluck, startWith, pairwise, map, take, switchMap } from 'rxjs/operators';\r\n\r\n/** Time in ms to throttle the scrolling events by default. */\r\nexport const DEFAULT_SCROLL_TIME = 20;\r\n\r\nexport interface ScrollbarDictionary {\r\n [key: string]: NgScrollbar;\r\n}\r\n\r\n// TODO: Add Angular decorator.\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ScrollBarService implements OnDestroy {\r\n private renderer: Renderer2; // creato da factory\r\n scrollbars: Map = new Map();\r\n\r\n /** Subject for notifying that a registered scrollable reference element has been scrolled. */\r\n private _scrolled = new Subject();\r\n /** Keeps track of the amount of subscriptions to `scrolled`. Used for cleaning up afterwards. */\r\n private _scrolledCount = 0;\r\n private _disableMonitor = false;\r\n\r\n public get mainScrollbar(): NgScrollbar {\r\n if (!this._mainScrollbar) {\r\n const mainScrollbar = this.getById('main-scrollbar');\r\n if (mainScrollbar) {\r\n this._mainScrollbar = mainScrollbar;\r\n }\r\n }\r\n return this._mainScrollbar;\r\n }\r\n private _mainScrollbar: NgScrollbar;\r\n\r\n constructor(\r\n private platform: Platform,\r\n private router: Router,\r\n rendererFactory: RendererFactory2,\r\n private lazyLoadService: LazyLoadService,\r\n private zone: NgZone\r\n ) {\r\n if (platform.isBrowser) {\r\n\r\n if ('onwheel' in document.createElement('div')) {\r\n fromEvent(document, 'wheel')\r\n .pipe(\r\n take(1),\r\n // https://github.com/gblazex/smoothscroll-for-websites v 1.4.10\r\n switchMap(() => this.lazyLoadService.loadScript('/lib/SmoothScroll.min.js', true))\r\n )\r\n .subscribe(() => {\r\n this.setSmoothScroll()\r\n });\r\n }\r\n\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n this.router.events.pipe(\r\n filter((e: Event): e is Scroll => e instanceof Scroll)\r\n ).subscribe(e => {\r\n // c'è un problema con la mainScrollbar, che sembra che non aggiorni passando da una pagina all'altra\r\n // se ad esempio passi dalla pagina login (aggiornata) alla home, non mostra più la scrollbar\r\n // setTimeout(() => {\r\n // this.mainScrollbar.update();\r\n // }, 100);\r\n\r\n if (e.position) {\r\n // backward navigation\r\n this.mainScrollbar.scrollTo({ top: e.position[1], duration: 500 });\r\n } else if (e.anchor) {\r\n // anchor navigation\r\n const target = this.mainScrollbar.viewport.nativeElement.querySelector(`#${e.anchor}`);\r\n\r\n if (target) {\r\n this.mainScrollbar.scrollToElement(`#${e.anchor}`);\r\n }\r\n\r\n } else {\r\n // forward navigation\r\n this.mainScrollbar.viewport.nativeElement.scrollTop = 0;\r\n }\r\n });\r\n }\r\n }\r\n\r\n register(scrollable: NgScrollbar): void {\r\n if (!this.scrollbars.has(scrollable)) {\r\n // this.scrollbars.set(scrollable, scrollable.scrolled\r\n // .subscribe(() => this._scrolled.next(scrollable)));\r\n this.scrollbars.set(scrollable, null);\r\n }\r\n }\r\n\r\n /**\r\n * Deregisters a Scrollable reference and unsubscribes from its scroll event observable.\r\n * @param ngScrollBar Scrollable instance to be deregistered.\r\n */\r\n deregister(scrollable: NgScrollbar): void {\r\n const scrollableReference = this.scrollbars.get(scrollable);\r\n\r\n if (scrollableReference) {\r\n scrollableReference.unsubscribe();\r\n this.scrollbars.delete(scrollable);\r\n }\r\n }\r\n\r\n scrolled(auditTimeInMs: number = DEFAULT_SCROLL_TIME): Observable {\r\n if (this.platform.isBrowser) {\r\n return of(null);\r\n }\r\n\r\n return new Observable((observer: Observer) => {\r\n // In the case of a 0ms delay, use an observable without auditTime\r\n // since it does add a perceptible delay in processing overhead.\r\n const subscription = auditTimeInMs > 0 ?\r\n this._scrolled.pipe(auditTime(auditTimeInMs)).subscribe(observer) :\r\n this._scrolled.subscribe(observer);\r\n\r\n this._scrolledCount++;\r\n\r\n return () => {\r\n subscription.unsubscribe();\r\n this._scrolledCount--;\r\n };\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.scrollbars.forEach((_, container) => this.deregister(container));\r\n this._scrolled.complete();\r\n }\r\n\r\n /**\r\n * Returns an observable that emits whenever any of the\r\n * scrollable ancestors of an element are scrolled.\r\n * @param elementRef Element whose ancestors to listen for.\r\n * @param auditTimeInMs Time to throttle the scroll events.\r\n */\r\n ancestorScrolled(elementRef: ElementRef, auditTimeInMs?: number): Observable {\r\n const ancestors = this.getAncestorScrollBars(elementRef);\r\n\r\n return this.scrolled(auditTimeInMs).pipe(filter(target => {\r\n return !target || ancestors.indexOf(target) > -1;\r\n }));\r\n }\r\n\r\n /** Returns all registered Scrollables that contain the provided element. */\r\n getAncestorScrollBars(elementRef: ElementRef): NgScrollbar[] {\r\n const scrollBars: NgScrollbar[] = [];\r\n\r\n this.scrollbars.forEach((_subscription: Subscription, scrollBar: NgScrollbar) => {\r\n if (this._scrollableContainsElement(scrollBar, elementRef)) {\r\n scrollBars.push(scrollBar);\r\n }\r\n });\r\n\r\n return scrollBars;\r\n }\r\n\r\n /** Returns true if the element is contained within the provided Scrollable. */\r\n private _scrollableContainsElement(scrollBar: NgScrollbar, elementRef: ElementRef): boolean {\r\n let element: HTMLElement | null = elementRef.nativeElement;\r\n const scrollableElement = scrollBar.nativeElement;\r\n\r\n // Traverse through the element parents until we reach null, checking if any of the elements\r\n // are the scrollable's element.\r\n do {\r\n if (element == scrollableElement) { return true; }\r\n } while (element = element!.parentElement);\r\n\r\n return false;\r\n }\r\n\r\n public getById(id: string): NgScrollbar {\r\n for (const sb of this.scrollbars.keys()) {\r\n if (sb.nativeElement.id === id) {\r\n return sb;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public monitorScrollTop(scrollbar: NgScrollbar, ignorePageRestoring?: boolean): Observable<[any, any]> {\r\n return fromEvent(scrollbar.viewport.nativeElement, 'scroll')\r\n .pipe(\r\n startWith(0),\r\n filter(() => (this._disableMonitor && ignorePageRestoring) ? false : true),\r\n pluck('target', 'scrollTop'),\r\n pairwise()\r\n );\r\n }\r\n\r\n public reachedBottom(scrollbar?: NgScrollbar, offset = 0): Observable {\r\n scrollbar = scrollbar ? scrollbar : this.mainScrollbar;\r\n return fromEvent(scrollbar.viewport.nativeElement, 'scroll')\r\n .pipe(\r\n map(({target}: any) => target.scrollTop + target.clientHeight >= target.scrollHeight - offset),\r\n distinctUntilChanged()\r\n );\r\n }\r\n\r\n public addScrollMonitor(id: string, sb: NgScrollbar): void {\r\n if (this.getById(id)) {\r\n throw new Error(`${id} was alrady be added to the monitor scroll service`);\r\n }\r\n this.scrollbars[id] = sb;\r\n }\r\n\r\n setSmoothScroll(customOptions?: any): void {\r\n if (window['SmoothScroll']) {\r\n let defaultOptions = {\r\n keyboardSupport: false,\r\n animationTime: 600, //400\r\n stepSize: 80, // 100\r\n accelerationDelta : 50, // 50\r\n accelerationMax : 3, // 3\r\n };\r\n\r\n const opt = customOptions ? Object.assign(defaultOptions, customOptions) : defaultOptions\r\n this.zone.runOutsideAngular(() => {\r\n window['SmoothScroll'](opt);\r\n });\r\n\r\n }\r\n }\r\n\r\n public removeScrollMonitor(id: string): void {\r\n delete this.scrollbars[id];\r\n }\r\n}\r\n"], "mappings": "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", "names": ["DEFAULT_SCROLL_TIME", "ScrollBarService", "mainScrollbar", "_mainScrollbar", "getById", "constructor", "platform", "router", "rendererFactory", "lazyLoadService", "zone", "scrollbars", "Map", "_scrolled", "Subject", "_scrolledCount", "_disableMonitor", "isBrowser", "document", "createElement", "fromEvent", "pipe", "take", "switchMap", "loadScript", "subscribe", "setSmoothScroll", "renderer", "createRenderer", "events", "filter", "e", "Scroll", "position", "scrollTo", "top", "duration", "anchor", "viewport", "nativeElement", "querySelector", "scrollToElement", "scrollTop", "register", "scrollable", "has", "set", "deregister", "scrollableReference", "get", "unsubscribe", "delete", "scrolled", "auditTimeInMs", "of", "Observable", "observer", "subscription", "auditTime", "ngOnDestroy", "forEach", "_", "container", "complete", "ancestorScrolled", "elementRef", "ancestors", "getAncestorScrollBars", "target", "indexOf", "scrollBars", "_subscription", "scrollBar", "_scrollableContainsElement", "push", "element", "scrollableElement", "parentElement", "id", "sb", "keys", "monitorScrollTop", "scrollbar", "ignorePageRestoring", "startWith", "pluck", "pairwise", "reachedBottom", "offset", "map", "clientHeight", "scrollHeight", "distinctUntilChanged", "addScrollMonitor", "Error", "customOptions", "window", "defaultOptions", "keyboardSupport", "animationTime", "stepSize", "accelerationDelta", "accelerationMax", "opt", "Object", "assign", "runOutsideAngular", "removeScrollMonitor", "\u0275\u0275inject", "Platform", "Router", "RendererFactory2", "LazyLoadService", "NgZone", "factory", "\u0275fac", "providedIn", "_ScrollBarService"] }