UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

129 lines 17 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { DOCUMENT } from '@angular/common'; import { Inject, Injectable } from '@angular/core'; import { reqAnimFrame } from 'ng-zorro-antd/core/polyfill'; import * as i0 from "@angular/core"; function easeInOutCubic(t, b, c, d) { const cc = c - b; let tt = t / (d / 2); if (tt < 1) { return (cc / 2) * tt * tt * tt + b; } else { return (cc / 2) * ((tt -= 2) * tt * tt + 2) + b; } } export class NzScrollService { constructor(ngZone, doc) { this.ngZone = ngZone; this.doc = doc; } /** Set the position of the scroll bar of `el`. */ setScrollTop(el, topValue = 0) { if (el === window) { this.doc.body.scrollTop = topValue; this.doc.documentElement.scrollTop = topValue; } else { el.scrollTop = topValue; } } /** Get position of `el` against window. */ getOffset(el) { const ret = { top: 0, left: 0 }; if (!el || !el.getClientRects().length) { return ret; } const rect = el.getBoundingClientRect(); if (rect.width || rect.height) { const doc = el.ownerDocument.documentElement; ret.top = rect.top - doc.clientTop; ret.left = rect.left - doc.clientLeft; } else { ret.top = rect.top; ret.left = rect.left; } return ret; } /** Get the position of the scoll bar of `el`. */ // TODO: remove '| Window' as the fallback already happens here getScroll(target, top = true) { if (typeof window === 'undefined') { return 0; } const method = top ? 'scrollTop' : 'scrollLeft'; let result = 0; if (this.isWindow(target)) { result = target[top ? 'pageYOffset' : 'pageXOffset']; } else if (target instanceof Document) { result = target.documentElement[method]; } else if (target) { result = target[method]; } if (target && !this.isWindow(target) && typeof result !== 'number') { result = (target.ownerDocument || target).documentElement[method]; } return result; } isWindow(obj) { return obj !== null && obj !== undefined && obj === obj.window; } /** * Scroll `el` to some position with animation. * * @param containerEl container, `window` by default * @param y Scroll to `top`, 0 by default */ scrollTo(containerEl, y = 0, options = {}) { const target = containerEl ? containerEl : window; const scrollTop = this.getScroll(target); const startTime = Date.now(); const { easing, callback, duration = 450 } = options; const frameFunc = () => { const timestamp = Date.now(); const time = timestamp - startTime; const nextScrollTop = (easing || easeInOutCubic)(time > duration ? duration : time, scrollTop, y, duration); if (this.isWindow(target)) { target.scrollTo(window.pageXOffset, nextScrollTop); } else if (target instanceof HTMLDocument || target.constructor.name === 'HTMLDocument') { target.documentElement.scrollTop = nextScrollTop; } else { target.scrollTop = nextScrollTop; } if (time < duration) { reqAnimFrame(frameFunc); } else if (typeof callback === 'function') { // Caretaker note: the `frameFunc` is called within the `<root>` zone, but we have to re-enter // the Angular zone when calling custom callback to be backwards-compatible. this.ngZone.run(callback); } }; // Caretaker note: the `requestAnimationFrame` triggers change detection, but updating a `scrollTop` property or // calling `window.scrollTo` doesn't require Angular to run `ApplicationRef.tick()`. this.ngZone.runOutsideAngular(() => reqAnimFrame(frameFunc)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: NzScrollService, deps: [{ token: i0.NgZone }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: NzScrollService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: NzScrollService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i0.NgZone }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb3JlL3NlcnZpY2VzL3Njcm9sbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQUszRCxTQUFTLGNBQWMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ1gsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztBQUNILENBQUM7QUFjRCxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUNVLE1BQWMsRUFDSixHQUFjO1FBRHhCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFHdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxZQUFZLENBQUMsRUFBb0IsRUFBRSxXQUFtQixDQUFDO1FBQ3JELElBQUksRUFB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MUIsQ0FBQztpQkFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyw4RkFBOEY7Z0JBQzlGLDRFQUE0RTtnQkFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLGdIQUFnSDtRQUNoSCxvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDOzhHQXpHVSxlQUFlLHdDQUtoQixRQUFRO2tIQUxQLGVBQWUsY0FGZCxNQUFNOzsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBTUksTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgcmVxQW5pbUZyYW1lIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3BvbHlmaWxsJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIEVhc3lpbmdGbiA9ICh0OiBudW1iZXIsIGI6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIpID0+IG51bWJlcjtcblxuZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgY2MgPSBjIC0gYjtcbiAgbGV0IHR0ID0gdCAvIChkIC8gMik7XG4gIGlmICh0dCA8IDEpIHtcbiAgICByZXR1cm4gKGNjIC8gMikgKiB0dCAqIHR0ICogdHQgKyBiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoY2MgLyAyKSAqICgodHQgLT0gMikgKiB0dCAqIHR0ICsgMikgKyBiO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnpTY3JvbGxUb09wdGlvbnMge1xuICAvKiogU2Nyb2xsIGNvbnRhaW5lciwgZGVmYXVsdCBhcyB3aW5kb3cgKi9cbiAgZWFzaW5nPzogRWFzeWluZ0ZuO1xuICAvKiogU2Nyb2xsIGVuZCBjYWxsYmFjayAqL1xuICBjYWxsYmFjaz8oKTogdm9pZDtcbiAgLyoqIEFuaW1hdGlvbiBkdXJhdGlvbiwgZGVmYXVsdCBhcyA0NTAgKi9cbiAgZHVyYXRpb24/OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE56U2Nyb2xsU2VydmljZSB7XG4gIHByaXZhdGUgZG9jOiBEb2N1bWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIGRvYzogTnpTYWZlQW55XG4gICkge1xuICAgIHRoaXMuZG9jID0gZG9jO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHNjcm9sbCBiYXIgb2YgYGVsYC4gKi9cbiAgc2V0U2Nyb2xsVG9wKGVsOiBFbGVtZW50IHwgV2luZG93LCB0b3BWYWx1ZTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGlmIChlbCA9PT0gd2luZG93KSB7XG4gICAgICB0aGlzLmRvYy5ib2R5LnNjcm9sbFRvcCA9IHRvcFZhbHVlO1xuICAgICAgdGhpcy5kb2MuZG9jdW1lbnRFbGVtZW50IS5zY3JvbGxUb3AgPSB0b3BWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgKGVsIGFzIEVsZW1lbnQpLnNjcm9sbFRvcCA9IHRvcFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgcG9zaXRpb24gb2YgYGVsYCBhZ2FpbnN0IHdpbmRvdy4gKi9cbiAgZ2V0T2Zmc2V0KGVsOiBFbGVtZW50KTogeyB0b3A6IG51bWJlcjsgbGVmdDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHJldCA9IHtcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDBcbiAgICB9O1xuICAgIGlmICghZWwgfHwgIWVsLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCB8fCByZWN0LmhlaWdodCkge1xuICAgICAgY29uc3QgZG9jID0gZWwub3duZXJEb2N1bWVudCEuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgcmV0LnRvcCA9IHJlY3QudG9wIC0gZG9jIS5jbGllbnRUb3A7XG4gICAgICByZXQubGVmdCA9IHJlY3QubGVmdCAtIGRvYyEuY2xpZW50TGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0LnRvcCA9IHJlY3QudG9wO1xuICAgICAgcmV0LmxlZnQgPSByZWN0LmxlZnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzY29sbCBiYXIgb2YgYGVsYC4gKi9cbiAgLy8gVE9ETzogcmVtb3ZlICd8IFdpbmRvdycgYXMgdGhlIGZhbGxiYWNrIGFscmVhZHkgaGFwcGVucyBoZXJlXG4gIGdldFNjcm9sbCh0YXJnZXQ/OiBFbGVtZW50IHwgSFRNTEVsZW1lbnQgfCBXaW5kb3cgfCBEb2N1bWVudCB8IG51bGwsIHRvcDogYm9vbGVhbiA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9IHRvcCA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGlmICh0aGlzLmlzV2luZG93KHRhcmdldCkpIHtcbiAgICAgIHJlc3VsdCA9ICh0YXJnZXQgYXMgV2luZG93KVt0b3AgPyAncGFnZVlPZmZzZXQnIDogJ3BhZ2VYT2Zmc2V0J107XG4gICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgcmVzdWx0ID0gdGFyZ2V0LmRvY3VtZW50RWxlbWVudFttZXRob2RdO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICByZXN1bHQgPSAodGFyZ2V0IGFzIEhUTUxFbGVtZW50KVttZXRob2RdO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmICF0aGlzLmlzV2luZG93KHRhcmdldCkgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJlc3VsdCA9ICgodGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5vd25lckRvY3VtZW50IHx8ICh0YXJnZXQgYXMgRG9jdW1lbnQpKS5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlzV2luZG93KG9iajogTnpTYWZlQW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogPT09IG9iai53aW5kb3c7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGBlbGAgdG8gc29tZSBwb3NpdGlvbiB3aXRoIGFuaW1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIGNvbnRhaW5lciwgYHdpbmRvd2AgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0geSBTY3JvbGwgdG8gYHRvcGAsIDAgYnkgZGVmYXVsdFxuICAgKi9cbiAgc2Nyb2xsVG8oXG4gICAgY29udGFpbmVyRWw/OiBFbGVtZW50IHwgSFRNTEVsZW1lbnQgfCBXaW5kb3cgfCBEb2N1bWVudCB8IG51bGwsXG4gICAgeTogbnVtYmVyID0gMCxcbiAgICBvcHRpb25zOiBOelNjcm9sbFRvT3B0aW9ucyA9IHt9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbnRhaW5lckVsID8gY29udGFpbmVyRWwgOiB3aW5kb3c7XG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gdGhpcy5nZXRTY3JvbGwodGFyZ2V0KTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgZWFzaW5nLCBjYWxsYmFjaywgZHVyYXRpb24gPSA0NTAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgZnJhbWVGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHRpbWUgPSB0aW1lc3RhbXAgLSBzdGFydFRpbWU7XG4gICAgICBjb25zdCBuZXh0U2Nyb2xsVG9wID0gKGVhc2luZyB8fCBlYXNlSW5PdXRDdWJpYykodGltZSA+IGR1cmF0aW9uID8gZHVyYXRpb24gOiB0aW1lLCBzY3JvbGxUb3AsIHksIGR1cmF0aW9uKTtcbiAgICAgIGlmICh0aGlzLmlzV2luZG93KHRhcmdldCkpIHtcbiAgICAgICAgKHRhcmdldCBhcyBXaW5kb3cpLnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCwgbmV4dFNjcm9sbFRvcCk7XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxEb2N1bWVudCB8fCB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA9PT0gJ0hUTUxEb2N1bWVudCcpIHtcbiAgICAgICAgKHRhcmdldCBhcyBIVE1MRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBuZXh0U2Nyb2xsVG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKHRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsVG9wID0gbmV4dFNjcm9sbFRvcDtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lIDwgZHVyYXRpb24pIHtcbiAgICAgICAgcmVxQW5pbUZyYW1lKGZyYW1lRnVuYyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBDYXJldGFrZXIgbm90ZTogdGhlIGBmcmFtZUZ1bmNgIGlzIGNhbGxlZCB3aXRoaW4gdGhlIGA8cm9vdD5gIHpvbmUsIGJ1dCB3ZSBoYXZlIHRvIHJlLWVudGVyXG4gICAgICAgIC8vIHRoZSBBbmd1bGFyIHpvbmUgd2hlbiBjYWxsaW5nIGN1c3RvbSBjYWxsYmFjayB0byBiZSBiYWNrd2FyZHMtY29tcGF0aWJsZS5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIENhcmV0YWtlciBub3RlOiB0aGUgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbiwgYnV0IHVwZGF0aW5nIGEgYHNjcm9sbFRvcGAgcHJvcGVydHkgb3JcbiAgICAvLyBjYWxsaW5nIGB3aW5kb3cuc2Nyb2xsVG9gIGRvZXNuJ3QgcmVxdWlyZSBBbmd1bGFyIHRvIHJ1biBgQXBwbGljYXRpb25SZWYudGljaygpYC5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiByZXFBbmltRnJhbWUoZnJhbWVGdW5jKSk7XG4gIH1cbn1cbiJdfQ==