ngx-number-input
Version:
Componente angular para formatear números dentro de un input
140 lines • 14.9 kB
JavaScript
import { Component, forwardRef, Input, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
export class NgxNumberInputComponent {
constructor() {
this.placeholder = "";
this.locale = "en-GB";
this.currency = null;
this.onChange = (_) => { };
this.onTouched = () => { };
this.isFocused = false;
}
set max(val) {
this._max = val;
}
get min() {
return this._min;
}
set min(val) {
this._min = val;
}
get max() {
return this._max;
}
ngOnInit() {
}
ngOnChanges(simpleChange) {
if (simpleChange['max']) {
this.max = simpleChange['max'].currentValue;
}
if (simpleChange['min']) {
this.min = simpleChange['min'].currentValue;
}
}
validate({ value }) {
let isNotValid = false;
if (this.isRequired) {
if (!this.value || this.value.toString() == "") {
return {
"invalid": true,
"required": true,
};
}
}
if (this.value) {
isNotValid = this.value !== Number(value);
if (!isNotValid && this.min) {
isNotValid = (Number(value) < this.min);
}
if (!isNotValid && this.max) {
isNotValid = (Number(value) > this.max);
}
}
if (isNotValid) {
return {
"invalid": true,
"max": this.max ? (Number(value) > this.max) : null,
"min": this.min ? (Number(value) < this.min) : null
};
}
return null;
}
updateChanges() {
this.onChange(this.value);
}
writeValue(value) {
this.value = value;
this.updateChanges();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
get numberFormatted() {
if (this.value) {
if (this.currency) {
try {
return Number(this.value).toLocaleString(this.locale, {
style: 'currency',
currency: this.currency,
});
}
catch (error) {
return Number(this.value).toLocaleString(this.locale);
}
}
else {
return Number(this.value).toLocaleString(this.locale, {});
}
}
else {
return '';
}
}
onFocus() {
this.isFocused = true;
setTimeout(() => {
this.inputN.nativeElement.focus();
}, 0);
}
onBlur() {
this.onTouched();
this.isFocused = false;
}
}
NgxNumberInputComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-number-input',
template: "<input type=\"number\" [(ngModel)]=\"value\" [attr.max]=\"max\" [attr.min]=\"min\" [attr.class]=\"klass\" [ngClass]=\"ngClass\" (change)=\"updateChanges()\" [placeholder]=\"placeholder\" (blur)=\"onBlur()\" [required]=\"isRequired\" [disabled]=\"isDisabled\" [readonly]=\"isReadOnly\"\n *ngIf=\"isFocused\" #inputN>\n<input type=\"text\" value=\"{{ numberFormatted }}\" [attr.max]=\"max\" [attr.min]=\"min\" [ngClass]=\"ngClass\" [required]=\"isRequired\" [attr.class]=\"klass\" [disabled]=\"isDisabled\" [readonly]=\"isReadOnly\" [placeholder]=\"placeholder\" (focus)=\"onFocus()\" *ngIf=\"!isFocused\">\n<p *ngIf=\"isFocused\"><span class=\"text-muted\">{{ numberFormatted }}</span></p>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxNumberInputComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: NgxNumberInputComponent,
multi: true
}
],
styles: [""]
},] }
];
NgxNumberInputComponent.ctorParameters = () => [];
NgxNumberInputComponent.propDecorators = {
klass: [{ type: Input, args: ['styleClass',] }],
ngClass: [{ type: Input, args: ['ngClass',] }],
isRequired: [{ type: Input, args: ['required',] }],
isDisabled: [{ type: Input, args: ['disabled',] }],
isReadOnly: [{ type: Input, args: ['readonly',] }],
placeholder: [{ type: Input, args: ['placeholder',] }],
locale: [{ type: Input, args: ['locale',] }],
currency: [{ type: Input, args: ['currency',] }],
inputN: [{ type: ViewChild, args: ["inputN", { static: false },] }],
min: [{ type: Input, args: ["min",] }],
max: [{ type: Input, args: ["max",] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW51bWJlci1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbnVtYmVyLWlucHV0L3NyYy9saWIvbmd4LW51bWJlci1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQWlCLEtBQUssRUFBRSxTQUFTLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBQ3JKLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUMsYUFBYSxFQUE0QyxNQUFNLGdCQUFnQixDQUFDO0FBbUI3SSxNQUFNLE9BQU8sdUJBQXVCO0lBb0NsQztRQTNCc0IsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDOUIsV0FBTSxHQUFXLE9BQU8sQ0FBQztRQUN2QixhQUFRLEdBQVcsSUFBSSxDQUFDO1FBRTNDLGFBQVEsR0FBcUIsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3QyxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBSWxDLGNBQVMsR0FBWSxLQUFLLENBQUM7SUFrQlgsQ0FBQztJQWhCakIsSUFBSSxHQUFHLENBQUMsR0FBVztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBa0IsR0FBRztRQUNuQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLEdBQVc7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQWtCLEdBQUc7UUFDbkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFJRCxRQUFRO0lBQ1IsQ0FBQztJQUVELFdBQVcsQ0FBQyxZQUEyQjtRQUNyQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2QixJQUFJ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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIGZvcndhcmRSZWYsIEFmdGVyVmlld0luaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFNlbGYsIE9wdGlvbmFsLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBOR19WQUxJREFUT1JTLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9yLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtbnVtYmVyLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1udW1iZXItaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hOdW1iZXJJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBOZ3hOdW1iZXJJbnB1dENvbXBvbmVudCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neE51bWJlcklucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkNoYW5nZXMge1xuICB2YWx1ZSE6IG51bWJlcjtcbiAgX21heCE6IG51bWJlcjtcbiAgX21pbiE6IG51bWJlcjtcbiAgQElucHV0KCdzdHlsZUNsYXNzJykga2xhc3MhOiBzdHJpbmc7XG4gIEBJbnB1dCgnbmdDbGFzcycpIG5nQ2xhc3MhOiBzdHJpbmcgfCBzdHJpbmdbXSB8IFNldDxzdHJpbmc+IHwgeyBba2xhc3M6IHN0cmluZ106IGFueTsgfVxuICBASW5wdXQoJ3JlcXVpcmVkJykgaXNSZXF1aXJlZCE6IGJvb2xlYW47XG4gIEBJbnB1dCgnZGlzYWJsZWQnKSBpc0Rpc2FibGVkITogYm9vbGVhbjtcbiAgQElucHV0KCdyZWFkb25seScpIGlzUmVhZE9ubHkhOiBib29sZWFuO1xuICBASW5wdXQoJ3BsYWNlaG9sZGVyJykgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XG4gIEBJbnB1dCgnbG9jYWxlJykgbG9jYWxlOiBzdHJpbmcgPSBcImVuLUdCXCI7XG4gIEBJbnB1dCgnY3VycmVuY3knKSBjdXJyZW5jeTogc3RyaW5nID0gbnVsbDtcblxuICBvbkNoYW5nZTogKF86IGFueSkgPT4gdm9pZCA9IChfOiBhbnkpID0+IHsgfTtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dE5cIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGlucHV0TiE6IEVsZW1lbnRSZWY7XG5cbiAgaXNGb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2V0IG1heCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbDtcbiAgfVxuXG4gIEBJbnB1dChcIm1pblwiKSBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHNldCBtaW4odmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWw7XG4gIH1cblxuICBASW5wdXQoXCJtYXhcIikgZ2V0IG1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoc2ltcGxlQ2hhbmdlOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHNpbXBsZUNoYW5nZVsnbWF4J10pIHtcbiAgICAgIHRoaXMubWF4ID0gc2ltcGxlQ2hhbmdlWydtYXgnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChzaW1wbGVDaGFuZ2VbJ21pbiddKSB7XG4gICAgICB0aGlzLm1pbiA9IHNpbXBsZUNoYW5nZVsnbWluJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG5cbiAgdmFsaWRhdGUoeyB2YWx1ZSB9OiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGxldCBpc05vdFZhbGlkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUudG9TdHJpbmcoKSA9PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgXCJpbnZhbGlkXCI6IHRydWUsXG4gICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgaXNOb3RWYWxpZCA9IHRoaXMudmFsdWUgIT09IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoIWlzTm90VmFsaWQgJiYgdGhpcy5taW4pIHtcbiAgICAgICAgaXNOb3RWYWxpZCA9IChOdW1iZXIodmFsdWUpIDwgdGhpcy5taW4pO1xuICAgICAgfVxuICAgICAgaWYgKCFpc05vdFZhbGlkICYmIHRoaXMubWF4KSB7XG4gICAgICAgIGlzTm90VmFsaWQgPSAoTnVtYmVyKHZhbHVlKSA+IHRoaXMubWF4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNOb3RWYWxpZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgXCJpbnZhbGlkXCI6IHRydWUsXG4gICAgICAgIFwibWF4XCI6IHRoaXMubWF4ID8gKE51bWJlcih2YWx1ZSkgPiB0aGlzLm1heCkgOiBudWxsLFxuICAgICAgICBcIm1pblwiOiB0aGlzLm1pbiA/IChOdW1iZXIodmFsdWUpIDwgdGhpcy5taW4pIDogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG5cbiAgfVxuXG4gIHVwZGF0ZUNoYW5nZXMoKSB7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUNoYW5nZXMoKTtcblxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBnZXQgbnVtYmVyRm9ybWF0dGVkKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbmN5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLnZhbHVlKS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMudmFsdWUpLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLnZhbHVlKS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG5cbiAgb25Gb2N1cygpIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlucHV0Ti5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSwgMCk7XG5cbiAgfVxuXG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuXG59XG5cbiJdfQ==