@ngx-extensions/count-up.js
Version:
Wrapper module for countup.js
191 lines (184 loc) • 18.3 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/cdk/coercion'), require('countup.js')) :
typeof define === 'function' && define.amd ? define('@ngx-extensions/count-up.js', ['exports', '@angular/core', '@angular/cdk/coercion', 'countup.js'], factory) :
(factory((global['ngx-extensions'] = global['ngx-extensions'] || {}, global['ngx-extensions']['count-up'] = global['ngx-extensions']['count-up'] || {}, global['ngx-extensions']['count-up'].js = {}),global.ng.core,global.ng.cdk.coercion,global.CountUp));
}(this, (function (exports,core,coercion,CountUp) { 'use strict';
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 core.EventEmitter();
/**
* Emits when the count-up animation has started
*/
this.animationCompleted = new core.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 = coercion.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 = coercion.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 = coercion.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 = coercion.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: core.Directive, args: [{
selector: '[ngxCountUp]',
exportAs: 'ngxCountUp'
},] }
];
NgxCountUpDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
NgxCountUpDirective.propDecorators = {
options: [{ type: core.Input, args: ['ngxCountUp',] }],
endValue: [{ type: core.Input }],
reanimateOnClick: [{ type: core.Input }],
duration: [{ type: core.Input }],
decimals: [{ type: core.Input }],
startValue: [{ type: core.Input }],
animationStarted: [{ type: core.Output }],
animationCompleted: [{ type: core.Output }],
onClick: [{ type: core.HostListener, args: ['click',] }]
};
return NgxCountUpDirective;
}());
var NgxCountUpModule = /** @class */ (function () {
function NgxCountUpModule() {
}
NgxCountUpModule.decorators = [
{ type: core.NgModule, args: [{
declarations: [NgxCountUpDirective],
exports: [NgxCountUpDirective]
},] }
];
return NgxCountUpModule;
}());
/**
* Generated bundle index. Do not edit.
*/
exports.NgxCountUpDirective = NgxCountUpDirective;
exports.NgxCountUpModule = NgxCountUpModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWV4dGVuc2lvbnMtY291bnQtdXAuanMudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9Abmd4LWV4dGVuc2lvbnMvY291bnQtdXAuanMvbGliL2NvdW50LXVwLmRpcmVjdGl2ZS50cyIsIm5nOi8vQG5neC1leHRlbnNpb25zL2NvdW50LXVwLmpzL2xpYi9jb3VudC11cC5tb2R1bGUudHMiLCJuZzovL0BuZ3gtZXh0ZW5zaW9ucy9jb3VudC11cC5qcy9uZ3gtZXh0ZW5zaW9ucy1jb3VudC11cC5qcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBJbnB1dCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBjb2VyY2VCb29sZWFuUHJvcGVydHksXHJcbiAgY29lcmNlTnVtYmVyUHJvcGVydHlcclxufSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQgKiBhcyBDb3VudFVwIGZyb20gJ2NvdW50dXAuanMnO1xyXG5pbXBvcnQgeyBDb3VudFVwT3B0aW9ucyB9IGZyb20gJ2NvdW50dXAuanMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbmd4Q291bnRVcF0nLFxyXG4gIGV4cG9ydEFzOiAnbmd4Q291bnRVcCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neENvdW50VXBEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMQVJHRV9WQUxVRV9GSVg6IG51bWJlciA9IDEwMDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9wdGlvbnMgZm9yIHRoZSBjb3VudFVwLmpzIEFQSS5cclxuICAgKiBEZWZhdWx0cyB0byB1bmRlZmluZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCduZ3hDb3VudFVwJylcclxuICBvcHRpb25zOiBDb3VudFVwT3B0aW9ucztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHZhbHVlIHRvIGNvdW50IHVwIHRvLlxyXG4gICAqIERlZmF1bHRzIHRvIHplcm8uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBnZXQgZW5kVmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kVmFsdWU7XHJcbiAgfVxyXG4gIHNldCBlbmRWYWx1ZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX2VuZFZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodik7XHJcbiAgICBpZiAoISF0aGlzLmNvdW50VXApIHtcclxuICAgICAgLy8gVE9ETyByZWZhY3RvciB0byBzaW1wbHkgYW5pbWF0ZSgpP1xyXG4gICAgICB0aGlzLmNvdW50VXAudXBkYXRlKHRoaXMuZW5kVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgdGhlIGVsZW1lbnQgc2hvdWxkIHJlLWFuaW1hdGUgd2hlbiBjbGlja2VkLlxyXG4gICAqIERlZmF1bHQgaXMgZmFsc2UuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBnZXQgcmVhbmltYXRlT25DbGljaygpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWFuaW1hdGVPbkNsaWNrO1xyXG4gIH1cclxuICBzZXQgcmVhbmltYXRlT25DbGljayh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3JlYW5pbWF0ZU9uQ2xpY2sgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIHNlY29uZHMuXHJcbiAgICogRGVmYXVsdHMgdG8gMltzXS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCBkdXJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcclxuICB9XHJcbiAgc2V0IGR1cmF0aW9uKHY6IGFueSkge1xyXG4gICAgdGhpcy5fZHVyYXRpb24gPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cclxuICAgKiBEZWZhdWx0IGlzIHplcm8uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBkZWNpbWFscyA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIHN0YXJ0IHZhbHVlIGZvciB0aGUgY291bnQuXHJcbiAgICogRGVmYXVsdHMgdG8gemVyby5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCBzdGFydFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0VmFsdWU7XHJcbiAgfVxyXG4gIHNldCBzdGFydFZhbHVlKHY6IGFueSkge1xyXG4gICAgdGhpcy5fc3RhcnRWYWx1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgd2hlbiB0aGUgY291bnQtdXAgYW5pbWF0aW9uIGhhcyBjb21wbGV0ZWRcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICByZWFkb25seSBhbmltYXRpb25TdGFydGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBjb3VudC11cCBhbmltYXRpb24gaGFzIHN0YXJ0ZWRcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICByZWFkb25seSBhbmltYXRpb25Db21wbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgX3N0YXJ0VmFsdWUgPSAwO1xyXG4gIHByaXZhdGUgX2VuZFZhbHVlID0gMDtcclxuICBwcml2YXRlIF9kdXJhdGlvbiA9IDI7XHJcbiAgcHJpdmF0ZSBfcmVhbmltYXRlT25DbGljayA9IGZhbHNlO1xyXG4gIHByaXZhdGUgY291bnRVcDogQ291bnRVcDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNvdW50VXAgPSB0aGlzLmNyZWF0ZUNvdW50VXAoKTtcclxuICAgIHRoaXMuYW5pbWF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyB0aGUgY2xpY2sgZXZlbnQgb2YgdGhlIGhvc3QgZWxlbWVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcclxuICBvbkNsaWNrKCkge1xyXG4gICAgaWYgKHRoaXMucmVhbmltYXRlT25DbGljaykge1xyXG4gICAgICB0aGlzLmFuaW1hdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyaWdnZXJzIHRoZSBjb3VudC11cCBhbmltYXRpb24uXHJcbiAgICovXHJcbiAgYW5pbWF0ZSgpIHtcclxuICAgIHRoaXMuY291bnRVcC5yZXNldCgpO1xyXG4gICAgdGhpcy5vbkFuaW1hdGlvblN0YXJ0ZWQoKTtcclxuICAgIGlmICh0aGlzLmVuZFZhbHVlID4gOTk5KSB7XHJcbiAgICAgIHRoaXMuY291bnRVcC5zdGFydCgoKSA9PlxyXG4gICAgICAgIHRoaXMub25BbmltYXRpb25Db21wbGV0ZWQoKCkgPT4gdGhpcy5jb3VudFVwLnVwZGF0ZSh0aGlzLmVuZFZhbHVlKSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY291bnRVcC5zdGFydCgoKSA9PiB0aGlzLm9uQW5pbWF0aW9uQ29tcGxldGVkKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb3VudFVwKCk6IENvdW50VXAge1xyXG4gICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKHRoaXMuZW5kVmFsdWUgLSB0aGlzLnN0YXJ0VmFsdWUpO1xyXG4gICAgY29uc3QgY291bnRVcEZhY3Rvcnk6IChlbmRWYWx1ZTogbnVtYmVyLCBkdXJhdGlvbjogbnVtYmVyKSA9PiBDb3VudFVwID0gKFxyXG4gICAgICBlbmRWYWx1ZSxcclxuICAgICAgZHVyYXRpb25cclxuICAgICkgPT5cclxuICAgICAgbmV3IENvdW50VXAoXHJcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlLFxyXG4gICAgICAgIGVuZFZhbHVlLFxyXG4gICAgICAgIHRoaXMuZGVjaW1hbHMsXHJcbiAgICAgICAgZHVyYXRpb24sXHJcbiAgICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICAgICk7XHJcbiAgICBsZXQgY291bnRVcDogQ291bnRVcDtcclxuXHJcbiAgICBpZiAoZGlmZiA+IDk5OSkge1xyXG4gICAgICBjb25zdCBmaXhGYWN0b3IgPSB0aGlzLmVuZFZhbHVlID4gdGhpcy5zdGFydFZhbHVlID8gLTEgOiAxO1xyXG4gICAgICBjb25zdCBjYWxjdWxhdGVkRW5kID1cclxuICAgICAgICB0aGlzLmVuZFZhbHVlICsgZml4RmFjdG9yICogTmd4Q291bnRVcERpcmVjdGl2ZS5MQVJHRV9WQUxVRV9GSVg7XHJcbiAgICAgIGNvdW50VXAgPSBjb3VudFVwRmFjdG9yeShjYWxjdWxhdGVkRW5kLCB0aGlzLmR1cmF0aW9uIC8gMik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb3VudFVwID0gY291bnRVcEZhY3RvcnkodGhpcy5lbmRWYWx1ZSwgdGhpcy5kdXJhdGlvbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY291bnRVcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25BbmltYXRpb25TdGFydGVkKCkge1xyXG4gICAgdGhpcy5hbmltYXRpb25TdGFydGVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25BbmltYXRpb25Db21wbGV0ZWQoZm4/OiBGdW5jdGlvbikge1xyXG4gICAgdGhpcy5hbmltYXRpb25Db21wbGV0ZWQuZW1pdCgpO1xyXG4gICAgaWYgKCEhZm4pIHtcclxuICAgICAgZm4oKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IE5neENvdW50VXBEaXJlY3RpdmUgfSBmcm9tICcuL2NvdW50LXVwLmRpcmVjdGl2ZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGRlY2xhcmF0aW9uczogW05neENvdW50VXBEaXJlY3RpdmVdLFxyXG4gIGV4cG9ydHM6IFtOZ3hDb3VudFVwRGlyZWN0aXZlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4Q291bnRVcE1vZHVsZSB7fVxyXG4iLCIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljX2FwaSc7XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwiY29lcmNlTnVtYmVyUHJvcGVydHkiLCJjb2VyY2VCb29sZWFuUHJvcGVydHkiLCJEaXJlY3RpdmUiLCJFbGVtZW50UmVmIiwiSW5wdXQiLCJPdXRwdXQiLCJIb3N0TGlzdGVuZXIiLCJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztRQTJHRSw2QkFBNkIsVUFBc0I7WUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTs7Ozs7WUFoQ25ELGFBQVEsR0FBRyxDQUFDLENBQUM7Ozs7WUFrQkoscUJBQWdCLEdBQUcsSUFBSUEsaUJBQVksRUFBUSxDQUFDOzs7O1lBTTVDLHVCQUFrQixHQUFHLElBQUlBLGlCQUFZLEVBQVEsQ0FBQztZQUUvQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztZQUNoQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsY0FBUyxHQUFHLENBQUMsQ0FBQztZQUNkLHNCQUFpQixHQUFHLEtBQUssQ0FBQztTQUdxQjtRQXpFdkQsc0JBQ0kseUNBQVE7Ozs7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