From 179c44225a0fae3d97b178d2b389c671adf5dd44 Mon Sep 17 00:00:00 2001 From: Joey Wu Date: Wed, 4 Sep 2024 18:51:27 -0700 Subject: [PATCH] fix(core): handle the full-width characters and numbers input --- demo/demo.component.ts | 1 + package-lock.json | 2 +- src/currency-mask.directive.ts | 4 +--- src/input.manager.ts | 4 ++-- src/input.service.ts | 21 +++++++++++++++++---- webpack.config.ts | 3 ++- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/demo/demo.component.ts b/demo/demo.component.ts index e965a62..06e2899 100644 --- a/demo/demo.component.ts +++ b/demo/demo.component.ts @@ -14,6 +14,7 @@ import { CurrencyMaskInputMode } from '../src/currency-mask.config'; class="form-control" currencyMask formControlName="value" + inputmode="decimal" [placeholder]="'R$ 0,00'" [options]="ngxCurrencyOptions" /> diff --git a/package-lock.json b/package-lock.json index 0935bbd..5bef9ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ngx-currency", - "version": "2.5.3", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/currency-mask.directive.ts b/src/currency-mask.directive.ts index 53dc8e9..a0ac272 100644 --- a/src/currency-mask.directive.ts +++ b/src/currency-mask.directive.ts @@ -86,9 +86,7 @@ export class CurrencyMaskDirective implements AfterViewInit, ControlValueAccesso @HostListener("input", ["$event"]) handleInput(event: any) { - if (this.isChromeAndroid()) { - !this.isReadOnly() && this.inputHandler.handleInput(event); - } + !this.isReadOnly() && this.inputHandler.handleInput(event); } @HostListener("keydown", ["$event"]) diff --git a/src/input.manager.ts b/src/input.manager.ts index e86dcf2..bb73a6e 100644 --- a/src/input.manager.ts +++ b/src/input.manager.ts @@ -26,12 +26,12 @@ export class InputManager { } get canInputMoreNumbers(): boolean { - let onlyNumbers = this.rawValue.replace(/[^0-9\u0660-\u0669\u06F0-\u06F9]/g, ""); + let onlyNumbers = this.rawValue.replace(/[^0-9\u0660-\u0669\u06F0-\u06F9\uFF10-\uFF19]/g, ""); let haventReachedMaxLength = !(onlyNumbers.length >= this.htmlInputElement.maxLength && this.htmlInputElement.maxLength >= 0); let selectionStart = this.inputSelection.selectionStart; let selectionEnd = this.inputSelection.selectionEnd; let haveNumberSelected = !!(selectionStart != selectionEnd && - this.htmlInputElement.value.substring(selectionStart, selectionEnd).match(/[^0-9\u0660-\u0669\u06F0-\u06F9]/)); + this.htmlInputElement.value.substring(selectionStart, selectionEnd).match(/[^0-9\u0660-\u0669\u06F0-\u06F9\uFF10-\uFF19]/)); let startWithZero = (this.htmlInputElement.value.substring(0, 1) == "0"); return haventReachedMaxLength || haveNumberSelected || startWithZero; } diff --git a/src/input.service.ts b/src/input.service.ts index b3c9e09..050f47d 100644 --- a/src/input.service.ts +++ b/src/input.service.ts @@ -2,8 +2,8 @@ import { InputManager } from "./input.manager"; import { CurrencyMaskConfig, CurrencyMaskInputMode } from "./currency-mask.config"; export class InputService { - private SINGLE_DIGIT_REGEX: RegExp = new RegExp(/^[0-9\u0660-\u0669\u06F0-\u06F9]$/); - private ONLY_NUMBERS_REGEX: RegExp = new RegExp(/[^0-9\u0660-\u0669\u06F0-\u06F9]/g); + private SINGLE_DIGIT_REGEX: RegExp = new RegExp(/^[0-9\u0660-\u0669\u06F0-\u06F9\uFF10-\uFF19]$/); + private ONLY_NUMBERS_REGEX: RegExp = new RegExp(/[^0-9\u0660-\u0669\u06F0-\u06F9\uFF10-\uFF19]/g); PER_AR_NUMBER: Map = new Map(); @@ -29,6 +29,18 @@ export class InputService { this.PER_AR_NUMBER.set("\u0667", "7"); this.PER_AR_NUMBER.set("\u0668", "8"); this.PER_AR_NUMBER.set("\u0669", "9"); + + + this.PER_AR_NUMBER.set("\uFF10", "0"); + this.PER_AR_NUMBER.set("\uFF11", "1"); + this.PER_AR_NUMBER.set("\uFF12", "2"); + this.PER_AR_NUMBER.set("\uFF13", "3"); + this.PER_AR_NUMBER.set("\uFF14", "4"); + this.PER_AR_NUMBER.set("\uFF15", "5"); + this.PER_AR_NUMBER.set("\uFF16", "6"); + this.PER_AR_NUMBER.set("\uFF17", "7"); + this.PER_AR_NUMBER.set("\uFF18", "8"); + this.PER_AR_NUMBER.set("\uFF19", "9"); } inputManager: InputManager; @@ -100,14 +112,15 @@ export class InputService { let integerPart = onlyNumbers.slice(0, onlyNumbers.length - precision) .replace(/^\u0660*/g, "") .replace(/^\u06F0*/g, "") - .replace(/^0*/g, ""); + .replace(/^0*/g, "") + .replace(/^\uFF10*/g, ""); if (integerPart == "") { integerPart = "0"; } let integerValue = parseInt(integerPart); - integerPart = integerPart.replace(/\B(?=([0-9\u0660-\u0669\u06F0-\u06F9]{3})+(?![0-9\u0660-\u0669\u06F0-\u06F9]))/g, thousands); + integerPart = integerPart.replace(/\B(?=([0-9\u0660-\u0669\u06F0-\u06F9\uFF10-\uFF19]{3})+(?![0-9\u0660-\u0669\u06F0-\u06F9\uFF10-\uFF19]))/g, thousands); if (thousands && integerPart.startsWith(thousands)) { integerPart = integerPart.substring(1); } diff --git a/webpack.config.ts b/webpack.config.ts index 84b3f33..31e3e03 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -31,7 +31,8 @@ export default { port: 8000, inline: true, hot: true, - historyApiFallback: true + historyApiFallback: true, + host:'0.0.0.0' }, plugins: [ ...(IS_PROD ? [] : [