UNPKG

@ngx-extensions/count-up.js

Version:
163 lines 15.9 kB
import { Directive, Input, ElementRef, HostListener, Output, EventEmitter } 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; }()); export { NgxCountUpDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQtdXAuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1leHRlbnNpb25zL2NvdW50LXVwLmpzLyIsInNvdXJjZXMiOlsibGliL2NvdW50LXVwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxVQUFVLEVBRVYsWUFBWSxFQUNaLE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDckIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEtBQUssT0FBTyxNQUFNLFlBQVksQ0FBQztBQUd0QztJQTJGRSw2QkFBNkIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXJDbkQ7OztXQUdHO1FBRUgsYUFBUSxHQUFHLENBQUMsQ0FBQztRQWNiOztXQUVHO1FBRU0scUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVyRDs7V0FFRztRQUVNLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFL0MsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxzQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFHb0IsQ0FBQztJQXpFdkQsc0JBQ0kseUNBQVE7UUFMWjs7O1dBR0c7YUFDSDtZQUVFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO2FBQ0QsVUFBYSxDQUFNO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIscUNBQXFDO2dCQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFD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QUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLGdEQUFrQixHQUExQjtRQUNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU8sa0RBQW9CLEdBQTVCLFVBQTZCLEVBQWE7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNSLEVBQUUsRUFBRSxDQUFDO1NBQ047SUFDSCxDQUFDO0lBMUp1QixtQ0FBZSxHQUFXLEdBQUcsQ0FBQzs7Z0JBTHZELFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsUUFBUSxFQUFFLFlBQVk7aUJBQ3ZCOzs7Z0JBaEJDLFVBQVU7OzswQkF3QlQsS0FBSyxTQUFDLFlBQVk7MkJBT2xCLEtBQUs7bUNBZ0JMLEtBQUs7MkJBWUwsS0FBSzsyQkFZTCxLQUFLOzZCQU9MLEtBQUs7bUNBV0wsTUFBTTtxQ0FNTixNQUFNOzBCQW1CTixZQUFZLFNBQUMsT0FBTzs7SUEyRHZCLDBCQUFDO0NBQUEsQUFoS0QsSUFnS0M7U0E1SlksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBEaXJlY3RpdmUsXHJcbiAgSW5wdXQsXHJcbiAgRWxlbWVudFJlZixcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgY29lcmNlQm9vbGVhblByb3BlcnR5LFxyXG4gIGNvZXJjZU51bWJlclByb3BlcnR5XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0ICogYXMgQ291bnRVcCBmcm9tICdjb3VudHVwLmpzJztcclxuaW1wb3J0IHsgQ291bnRVcE9wdGlvbnMgfSBmcm9tICdjb3VudHVwLmpzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW25neENvdW50VXBdJyxcclxuICBleHBvcnRBczogJ25neENvdW50VXAnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hDb3VudFVwRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTEFSR0VfVkFMVUVfRklYOiBudW1iZXIgPSAxMDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBvcHRpb25zIGZvciB0aGUgY291bnRVcC5qcyBBUEkuXHJcbiAgICogRGVmYXVsdHMgdG8gdW5kZWZpbmVkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgnbmd4Q291bnRVcCcpXHJcbiAgb3B0aW9uczogQ291bnRVcE9wdGlvbnM7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB2YWx1ZSB0byBjb3VudCB1cCB0by5cclxuICAgKiBEZWZhdWx0cyB0byB6ZXJvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGVuZFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFZhbHVlO1xyXG4gIH1cclxuICBzZXQgZW5kVmFsdWUodjogYW55KSB7XHJcbiAgICB0aGlzLl9lbmRWYWx1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYpO1xyXG4gICAgaWYgKCEhdGhpcy5jb3VudFVwKSB7XHJcbiAgICAgIC8vIFRPRE8gcmVmYWN0b3IgdG8gc2ltcGx5IGFuaW1hdGUoKT9cclxuICAgICAgdGhpcy5jb3VudFVwLnVwZGF0ZSh0aGlzLmVuZFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHNob3VsZCByZS1hbmltYXRlIHdoZW4gY2xpY2tlZC5cclxuICAgKiBEZWZhdWx0IGlzIGZhbHNlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHJlYW5pbWF0ZU9uQ2xpY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVhbmltYXRlT25DbGljaztcclxuICB9XHJcbiAgc2V0IHJlYW5pbWF0ZU9uQ2xpY2sodjogYW55KSB7XHJcbiAgICB0aGlzLl9yZWFuaW1hdGVPbkNsaWNrID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBzZWNvbmRzLlxyXG4gICAqIERlZmF1bHRzIHRvIDJbc10uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBnZXQgZHVyYXRpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHVyYXRpb247XHJcbiAgfVxyXG4gIHNldCBkdXJhdGlvbih2OiBhbnkpIHtcclxuICAgIHRoaXMuX2R1cmF0aW9uID0gY29lcmNlTnVtYmVyUHJvcGVydHkodik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuXHJcbiAgICogRGVmYXVsdCBpcyB6ZXJvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZGVjaW1hbHMgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBzdGFydCB2YWx1ZSBmb3IgdGhlIGNvdW50LlxyXG4gICAqIERlZmF1bHRzIHRvIHplcm8uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBnZXQgc3RhcnRWYWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGFydFZhbHVlO1xyXG4gIH1cclxuICBzZXQgc3RhcnRWYWx1ZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3N0YXJ0VmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gdGhlIGNvdW50LXVwIGFuaW1hdGlvbiBoYXMgY29tcGxldGVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcmVhZG9ubHkgYW5pbWF0aW9uU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgd2hlbiB0aGUgY291bnQtdXAgYW5pbWF0aW9uIGhhcyBzdGFydGVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcmVhZG9ubHkgYW5pbWF0aW9uQ29tcGxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIF9zdGFydFZhbHVlID0gMDtcclxuICBwcml2YXRlIF9lbmRWYWx1ZSA9IDA7XHJcbiAgcHJpdmF0ZSBfZHVyYXRpb24gPSAyO1xyXG4gIHByaXZhdGUgX3JlYW5pbWF0ZU9uQ2xpY2sgPSBmYWxzZTtcclxuICBwcml2YXRlIGNvdW50VXA6IENvdW50VXA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5jb3VudFVwID0gdGhpcy5jcmVhdGVDb3VudFVwKCk7XHJcbiAgICB0aGlzLmFuaW1hdGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIGNsaWNrIGV2ZW50IG9mIHRoZSBob3N0IGVsZW1lbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXHJcbiAgb25DbGljaygpIHtcclxuICAgIGlmICh0aGlzLnJlYW5pbWF0ZU9uQ2xpY2spIHtcclxuICAgICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmlnZ2VycyB0aGUgY291bnQtdXAgYW5pbWF0aW9uLlxyXG4gICAqL1xyXG4gIGFuaW1hdGUoKSB7XHJcbiAgICB0aGlzLmNvdW50VXAucmVzZXQoKTtcclxuICAgIHRoaXMub25BbmltYXRpb25TdGFydGVkKCk7XHJcbiAgICBpZiAodGhpcy5lbmRWYWx1ZSA+IDk5OSkge1xyXG4gICAgICB0aGlzLmNvdW50VXAuc3RhcnQoKCkgPT5cclxuICAgICAgICB0aGlzLm9uQW5pbWF0aW9uQ29tcGxldGVkKCgpID0+IHRoaXMuY291bnRVcC51cGRhdGUodGhpcy5lbmRWYWx1ZSkpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvdW50VXAuc3RhcnQoKCkgPT4gdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlZCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ291bnRVcCgpOiBDb3VudFVwIHtcclxuICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyh0aGlzLmVuZFZhbHVlIC0gdGhpcy5zdGFydFZhbHVlKTtcclxuICAgIGNvbnN0IGNvdW50VXBGYWN0b3J5OiAoZW5kVmFsdWU6IG51bWJlciwgZHVyYXRpb246IG51bWJlcikgPT4gQ291bnRVcCA9IChcclxuICAgICAgZW5kVmFsdWUsXHJcbiAgICAgIGR1cmF0aW9uXHJcbiAgICApID0+XHJcbiAgICAgIG5ldyBDb3VudFVwKFxyXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZSxcclxuICAgICAgICBlbmRWYWx1ZSxcclxuICAgICAgICB0aGlzLmRlY2ltYWxzLFxyXG4gICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgICApO1xyXG4gICAgbGV0IGNvdW50VXA6IENvdW50VXA7XHJcblxyXG4gICAgaWYgKGRpZmYgPiA5OTkpIHtcclxuICAgICAgY29uc3QgZml4RmFjdG9yID0gdGhpcy5lbmRWYWx1ZSA+IHRoaXMuc3RhcnRWYWx1ZSA/IC0xIDogMTtcclxuICAgICAgY29uc3QgY2FsY3VsYXRlZEVuZCA9XHJcbiAgICAgICAgdGhpcy5lbmRWYWx1ZSArIGZpeEZhY3RvciAqIE5neENvdW50VXBEaXJlY3RpdmUuTEFSR0VfVkFMVUVfRklYO1xyXG4gICAgICBjb3VudFVwID0gY291bnRVcEZhY3RvcnkoY2FsY3VsYXRlZEVuZCwgdGhpcy5kdXJhdGlvbiAvIDIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY291bnRVcCA9IGNvdW50VXBGYWN0b3J5KHRoaXMuZW5kVmFsdWUsIHRoaXMuZHVyYXRpb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvdW50VXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQW5pbWF0aW9uU3RhcnRlZCgpIHtcclxuICAgIHRoaXMuYW5pbWF0aW9uU3RhcnRlZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQW5pbWF0aW9uQ29tcGxldGVkKGZuPzogRnVuY3Rpb24pIHtcclxuICAgIHRoaXMuYW5pbWF0aW9uQ29tcGxldGVkLmVtaXQoKTtcclxuICAgIGlmICghIWZuKSB7XHJcbiAgICAgIGZuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==