UNPKG

@ngx-extensions/count-up.js

Version:
182 lines (177 loc) 16.6 kB
import { Directive, Input, ElementRef, HostListener, Output, EventEmitter, NgModule } from '@angular/core'; import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion'; import * as CountUp from 'countup.js'; var NgxCountUpDirective = /** @class */ (function () { function NgxCountUpDirective(elementRef) { this.elementRef = elementRef; /** * Optional number of decimal places. * Default is zero. */ this.decimals = 0; /** * Emits when the count-up animation has completed */ this.animationStarted = new EventEmitter(); /** * Emits when the count-up animation has started */ this.animationCompleted = new EventEmitter(); this._startValue = 0; this._endValue = 0; this._duration = 2; this._reanimateOnClick = false; } Object.defineProperty(NgxCountUpDirective.prototype, "endValue", { /** * The value to count up to. * Defaults to zero. */ get: function () { return this._endValue; }, set: function (v) { this._endValue = coerceNumberProperty(v); if (!!this.countUp) { // TODO refactor to simply animate()? this.countUp.update(this.endValue); } }, enumerable: true, configurable: true }); Object.defineProperty(NgxCountUpDirective.prototype, "reanimateOnClick", { /** * Whether or not the element should re-animate when clicked. * Default is false. */ get: function () { return this._reanimateOnClick; }, set: function (v) { this._reanimateOnClick = coerceBooleanProperty(v); }, enumerable: true, configurable: true }); Object.defineProperty(NgxCountUpDirective.prototype, "duration", { /** * Duration of the animation in seconds. * Defaults to 2[s]. */ get: function () { return this._duration; }, set: function (v) { this._duration = coerceNumberProperty(v); }, enumerable: true, configurable: true }); Object.defineProperty(NgxCountUpDirective.prototype, "startValue", { /** * Optional start value for the count. * Defaults to zero. */ get: function () { return this._startValue; }, set: function (v) { this._startValue = coerceNumberProperty(v); }, enumerable: true, configurable: true }); NgxCountUpDirective.prototype.ngAfterViewInit = function () { this.countUp = this.createCountUp(); this.animate(); }; /** * Handles the click event of the host element */ NgxCountUpDirective.prototype.onClick = function () { if (this.reanimateOnClick) { this.animate(); } }; /** * Triggers the count-up animation. */ NgxCountUpDirective.prototype.animate = function () { var _this = this; this.countUp.reset(); this.onAnimationStarted(); if (this.endValue > 999) { this.countUp.start(function () { return _this.onAnimationCompleted(function () { return _this.countUp.update(_this.endValue); }); }); } else { this.countUp.start(function () { return _this.onAnimationCompleted(); }); } }; NgxCountUpDirective.prototype.createCountUp = function () { var _this = this; var diff = Math.abs(this.endValue - this.startValue); var countUpFactory = function (endValue, duration) { return new CountUp(_this.elementRef.nativeElement, _this.startValue, endValue, _this.decimals, duration, _this.options); }; var countUp; if (diff > 999) { var fixFactor = this.endValue > this.startValue ? -1 : 1; var calculatedEnd = this.endValue + fixFactor * NgxCountUpDirective.LARGE_VALUE_FIX; countUp = countUpFactory(calculatedEnd, this.duration / 2); } else { countUp = countUpFactory(this.endValue, this.duration); } return countUp; }; NgxCountUpDirective.prototype.onAnimationStarted = function () { this.animationStarted.emit(); }; NgxCountUpDirective.prototype.onAnimationCompleted = function (fn) { this.animationCompleted.emit(); if (!!fn) { fn(); } }; NgxCountUpDirective.LARGE_VALUE_FIX = 100; NgxCountUpDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxCountUp]', exportAs: 'ngxCountUp' },] } ]; NgxCountUpDirective.ctorParameters = function () { return [ { type: ElementRef } ]; }; NgxCountUpDirective.propDecorators = { options: [{ type: Input, args: ['ngxCountUp',] }], endValue: [{ type: Input }], reanimateOnClick: [{ type: Input }], duration: [{ type: Input }], decimals: [{ type: Input }], startValue: [{ type: Input }], animationStarted: [{ type: Output }], animationCompleted: [{ type: Output }], onClick: [{ type: HostListener, args: ['click',] }] }; return NgxCountUpDirective; }()); var NgxCountUpModule = /** @class */ (function () { function NgxCountUpModule() { } NgxCountUpModule.decorators = [ { type: NgModule, args: [{ declarations: [NgxCountUpDirective], exports: [NgxCountUpDirective] },] } ]; return NgxCountUpModule; }()); /** * Generated bundle index. Do not edit. */ export { NgxCountUpDirective, NgxCountUpModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWV4dGVuc2lvbnMtY291bnQtdXAuanMuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BuZ3gtZXh0ZW5zaW9ucy9jb3VudC11cC5qcy9saWIvY291bnQtdXAuZGlyZWN0aXZlLnRzIiwibmc6Ly9Abmd4LWV4dGVuc2lvbnMvY291bnQtdXAuanMvbGliL2NvdW50LXVwLm1vZHVsZS50cyIsIm5nOi8vQG5neC1leHRlbnNpb25zL2NvdW50LXVwLmpzL25neC1leHRlbnNpb25zLWNvdW50LXVwLmpzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIElucHV0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlclxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSxcclxuICBjb2VyY2VOdW1iZXJQcm9wZXJ0eVxyXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCAqIGFzIENvdW50VXAgZnJvbSAnY291bnR1cC5qcyc7XHJcbmltcG9ydCB7IENvdW50VXBPcHRpb25zIH0gZnJvbSAnY291bnR1cC5qcyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuZ3hDb3VudFVwXScsXHJcbiAgZXhwb3J0QXM6ICduZ3hDb3VudFVwJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4Q291bnRVcERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExBUkdFX1ZBTFVFX0ZJWDogbnVtYmVyID0gMTAwO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgb3B0aW9ucyBmb3IgdGhlIGNvdW50VXAuanMgQVBJLlxyXG4gICAqIERlZmF1bHRzIHRvIHVuZGVmaW5lZC5cclxuICAgKi9cclxuICBASW5wdXQoJ25neENvdW50VXAnKVxyXG4gIG9wdGlvbnM6IENvdW50VXBPcHRpb25zO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdmFsdWUgdG8gY291bnQgdXAgdG8uXHJcbiAgICogRGVmYXVsdHMgdG8gemVyby5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCBlbmRWYWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmRWYWx1ZTtcclxuICB9XHJcbiAgc2V0IGVuZFZhbHVlKHY6IGFueSkge1xyXG4gICAgdGhpcy5fZW5kVmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2KTtcclxuICAgIGlmICghIXRoaXMuY291bnRVcCkge1xyXG4gICAgICAvLyBUT0RPIHJlZmFjdG9yIHRvIHNpbXBseSBhbmltYXRlKCk/XHJcbiAgICAgIHRoaXMuY291bnRVcC51cGRhdGUodGhpcy5lbmRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCBzaG91bGQgcmUtYW5pbWF0ZSB3aGVuIGNsaWNrZWQuXHJcbiAgICogRGVmYXVsdCBpcyBmYWxzZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCByZWFuaW1hdGVPbkNsaWNrKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlYW5pbWF0ZU9uQ2xpY2s7XHJcbiAgfVxyXG4gIHNldCByZWFuaW1hdGVPbkNsaWNrKHY6IGFueSkge1xyXG4gICAgdGhpcy5fcmVhbmltYXRlT25DbGljayA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIER1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gaW4gc2Vjb25kcy5cclxuICAgKiBEZWZhdWx0cyB0byAyW3NdLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGR1cmF0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xyXG4gIH1cclxuICBzZXQgZHVyYXRpb24odjogYW55KSB7XHJcbiAgICB0aGlzLl9kdXJhdGlvbiA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLlxyXG4gICAqIERlZmF1bHQgaXMgemVyby5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGRlY2ltYWxzID0gMDtcclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgc3RhcnQgdmFsdWUgZm9yIHRoZSBjb3VudC5cclxuICAgKiBEZWZhdWx0cyB0byB6ZXJvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHN0YXJ0VmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRWYWx1ZTtcclxuICB9XHJcbiAgc2V0IHN0YXJ0VmFsdWUodjogYW55KSB7XHJcbiAgICB0aGlzLl9zdGFydFZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBjb3VudC11cCBhbmltYXRpb24gaGFzIGNvbXBsZXRlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHJlYWRvbmx5IGFuaW1hdGlvblN0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gdGhlIGNvdW50LXVwIGFuaW1hdGlvbiBoYXMgc3RhcnRlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHJlYWRvbmx5IGFuaW1hdGlvbkNvbXBsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RhcnRWYWx1ZSA9IDA7XHJcbiAgcHJpdmF0ZSBfZW5kVmFsdWUgPSAwO1xyXG4gIHByaXZhdGUgX2R1cmF0aW9uID0gMjtcclxuICBwcml2YXRlIF9yZWFuaW1hdGVPbkNsaWNrID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBjb3VudFVwOiBDb3VudFVwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuY291bnRVcCA9IHRoaXMuY3JlYXRlQ291bnRVcCgpO1xyXG4gICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIHRoZSBjbGljayBldmVudCBvZiB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxyXG4gIG9uQ2xpY2soKSB7XHJcbiAgICBpZiAodGhpcy5yZWFuaW1hdGVPbkNsaWNrKSB7XHJcbiAgICAgIHRoaXMuYW5pbWF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJpZ2dlcnMgdGhlIGNvdW50LXVwIGFuaW1hdGlvbi5cclxuICAgKi9cclxuICBhbmltYXRlKCkge1xyXG4gICAgdGhpcy5jb3VudFVwLnJlc2V0KCk7XHJcbiAgICB0aGlzLm9uQW5pbWF0aW9uU3RhcnRlZCgpO1xyXG4gICAgaWYgKHRoaXMuZW5kVmFsdWUgPiA5OTkpIHtcclxuICAgICAgdGhpcy5jb3VudFVwLnN0YXJ0KCgpID0+XHJcbiAgICAgICAgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlZCgoKSA9PiB0aGlzLmNvdW50VXAudXBkYXRlKHRoaXMuZW5kVmFsdWUpKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb3VudFVwLnN0YXJ0KCgpID0+IHRoaXMub25BbmltYXRpb25Db21wbGV0ZWQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvdW50VXAoKTogQ291bnRVcCB7XHJcbiAgICBjb25zdCBkaWZmID0gTWF0aC5hYnModGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZSk7XHJcbiAgICBjb25zdCBjb3VudFVwRmFjdG9yeTogKGVuZFZhbHVlOiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIpID0+IENvdW50VXAgPSAoXHJcbiAgICAgIGVuZFZhbHVlLFxyXG4gICAgICBkdXJhdGlvblxyXG4gICAgKSA9PlxyXG4gICAgICBuZXcgQ291bnRVcChcclxuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcclxuICAgICAgICB0aGlzLnN0YXJ0VmFsdWUsXHJcbiAgICAgICAgZW5kVmFsdWUsXHJcbiAgICAgICAgdGhpcy5kZWNpbWFscyxcclxuICAgICAgICBkdXJhdGlvbixcclxuICAgICAgICB0aGlzLm9wdGlvbnNcclxuICAgICAgKTtcclxuICAgIGxldCBjb3VudFVwOiBDb3VudFVwO1xyXG5cclxuICAgIGlmIChkaWZmID4gOTk5KSB7XHJcbiAgICAgIGNvbnN0IGZpeEZhY3RvciA9IHRoaXMuZW5kVmFsdWUgPiB0aGlzLnN0YXJ0VmFsdWUgPyAtMSA6IDE7XHJcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRFbmQgPVxyXG4gICAgICAgIHRoaXMuZW5kVmFsdWUgKyBmaXhGYWN0b3IgKiBOZ3hDb3VudFVwRGlyZWN0aXZlLkxBUkdFX1ZBTFVFX0ZJWDtcclxuICAgICAgY291bnRVcCA9IGNvdW50VXBGYWN0b3J5KGNhbGN1bGF0ZWRFbmQsIHRoaXMuZHVyYXRpb24gLyAyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvdW50VXAgPSBjb3VudFVwRmFjdG9yeSh0aGlzLmVuZFZhbHVlLCB0aGlzLmR1cmF0aW9uKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb3VudFVwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkFuaW1hdGlvblN0YXJ0ZWQoKSB7XHJcbiAgICB0aGlzLmFuaW1hdGlvblN0YXJ0ZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkFuaW1hdGlvbkNvbXBsZXRlZChmbj86IEZ1bmN0aW9uKSB7XHJcbiAgICB0aGlzLmFuaW1hdGlvbkNvbXBsZXRlZC5lbWl0KCk7XHJcbiAgICBpZiAoISFmbikge1xyXG4gICAgICBmbigpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgTmd4Q291bnRVcERpcmVjdGl2ZSB9IGZyb20gJy4vY291bnQtdXAuZGlyZWN0aXZlJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbTmd4Q291bnRVcERpcmVjdGl2ZV0sXHJcbiAgZXhwb3J0czogW05neENvdW50VXBEaXJlY3RpdmVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hDb3VudFVwTW9kdWxlIHt9XHJcbiIsIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztJQTJHRSw2QkFBNkIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTs7Ozs7UUFoQ25ELGFBQVEsR0FBRyxDQUFDLENBQUM7Ozs7UUFrQkoscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQzs7OztRQU01Qyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRS9DLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2Qsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO0tBR3FCO0lBekV2RCxzQkFDSSx5Q0FBUTs7Ozs7YUFEWjtZQUVFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN2QjthQUNELFVBQWEsQ0FBTTtZQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FB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