@ngx-extensions/count-up.js
Version:
Wrapper module for countup.js
163 lines • 15.9 kB
JavaScript
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==