UNPKG

@ngx-extensions/count-up.js

Version:
191 lines (184 loc) 18.3 kB
(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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