UNPKG

ngx-currency

Version:

A very simple currency mask directive that allows using a number attribute with the ngModel.

1 lines 48 kB
{"version":3,"file":"ngx-currency.mjs","sources":["../../../projects/ngx-currency/src/lib/ngx-currency.config.ts","../../../projects/ngx-currency/src/lib/input.manager.ts","../../../projects/ngx-currency/src/lib/input.service.ts","../../../projects/ngx-currency/src/lib/input.handler.ts","../../../projects/ngx-currency/src/lib/ngx-currency.directive.ts","../../../projects/ngx-currency/src/lib/ngx-currency.providers.ts","../../../projects/ngx-currency/src/public-api.ts","../../../projects/ngx-currency/src/ngx-currency.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface NgxCurrencyConfig {\n align: string;\n allowNegative: boolean;\n allowZero: boolean;\n decimal: string;\n precision: number;\n prefix: string;\n suffix: string;\n thousands: string;\n nullable: boolean;\n min?: number | null;\n max?: number | null;\n inputMode?: NgxCurrencyInputMode;\n}\n\nexport enum NgxCurrencyInputMode {\n Financial,\n Natural,\n}\n\nexport const NGX_CURRENCY_CONFIG = new InjectionToken<\n Partial<NgxCurrencyConfig>\n>('ngx-currency.config');\n","export class InputManager {\n private _storedRawValue: string | null = null;\n\n constructor(private readonly _htmlInputElement: HTMLInputElement) {}\n\n setCursorAt(position: number): void {\n this._htmlInputElement.focus();\n this._htmlInputElement.setSelectionRange(position, position);\n }\n\n updateValueAndCursor(\n newRawValue: string,\n oldLength: number,\n selectionStart: number,\n ): void {\n this.rawValue = newRawValue;\n const newLength = newRawValue.length;\n selectionStart = selectionStart - (oldLength - newLength);\n this.setCursorAt(selectionStart);\n }\n\n get canInputMoreNumbers(): boolean {\n const onlyNumbers =\n this.rawValue?.replace(/[^0-9\\u0660-\\u0669\\u06F0-\\u06F9]/g, '') ?? '';\n const hasReachedMaxLength = !(\n onlyNumbers.length >= this._htmlInputElement.maxLength &&\n this._htmlInputElement.maxLength >= 0\n );\n const selectionStart = this.inputSelection.selectionStart;\n const selectionEnd = this.inputSelection.selectionEnd;\n const haveNumberSelected = !!(\n selectionStart != selectionEnd &&\n this._htmlInputElement.value\n .substring(selectionStart, selectionEnd)\n .match(/[^0-9\\u0660-\\u0669\\u06F0-\\u06F9]/)\n );\n const startWithZero = this._htmlInputElement.value.substring(0, 1) == '0';\n return hasReachedMaxLength || haveNumberSelected || startWithZero;\n }\n\n get inputSelection(): {\n selectionStart: number;\n selectionEnd: number;\n } {\n return {\n selectionStart: this._htmlInputElement.selectionStart ?? 0,\n selectionEnd: this._htmlInputElement.selectionEnd ?? 0,\n };\n }\n\n get rawValue(): string | null {\n return this._htmlInputElement && this._htmlInputElement.value;\n }\n set rawValue(value: string | null) {\n this._storedRawValue = value;\n\n if (this._htmlInputElement) {\n this._htmlInputElement.value = value ?? '';\n }\n }\n\n get storedRawValue(): string {\n return this._storedRawValue || '';\n }\n}\n","import { InputManager } from './input.manager';\nimport { NgxCurrencyConfig, NgxCurrencyInputMode } from './ngx-currency.config';\n\nexport class InputService {\n private readonly _singleDigitRegex = new RegExp(\n /^[0-9\\u0660-\\u0669\\u06F0-\\u06F9]$/,\n );\n private readonly _onlyNumbersRegex = new RegExp(\n /[^0-9\\u0660-\\u0669\\u06F0-\\u06F9]/g,\n );\n\n private readonly _perArNumber = new Map<string, string>([\n ['\\u06F0', '0'],\n ['\\u06F1', '1'],\n ['\\u06F2', '2'],\n ['\\u06F3', '3'],\n ['\\u06F4', '4'],\n ['\\u06F5', '5'],\n ['\\u06F6', '6'],\n ['\\u06F7', '7'],\n ['\\u06F8', '8'],\n ['\\u06F9', '9'],\n\n ['\\u0660', '0'],\n ['\\u0661', '1'],\n ['\\u0662', '2'],\n ['\\u0663', '3'],\n ['\\u0664', '4'],\n ['\\u0665', '5'],\n ['\\u0666', '6'],\n ['\\u0667', '7'],\n ['\\u0668', '8'],\n ['\\u0669', '9'],\n ]);\n\n inputManager: InputManager;\n\n constructor(\n htmlInputElement: HTMLInputElement,\n private _options: NgxCurrencyConfig,\n ) {\n this.inputManager = new InputManager(htmlInputElement);\n }\n\n addNumber(keyCode: number): void {\n const { decimal, precision, inputMode } = this._options;\n const keyChar = String.fromCharCode(keyCode);\n const isDecimalChar = keyChar === this._options.decimal;\n\n if (!this.rawValue) {\n this.rawValue = this.applyMask(false, keyChar);\n let selectionStart: number | undefined = undefined;\n if (inputMode === NgxCurrencyInputMode.Natural && precision > 0) {\n selectionStart = this.rawValue.indexOf(decimal);\n if (isDecimalChar) {\n selectionStart++;\n }\n }\n this.updateFieldValue(selectionStart);\n } else {\n const selectionStart = this.inputSelection.selectionStart;\n const selectionEnd = this.inputSelection.selectionEnd;\n const rawValueStart = this.rawValue.substring(0, selectionStart);\n let rawValueEnd = this.rawValue.substring(\n selectionEnd,\n this.rawValue.length,\n );\n\n // In natural mode, replace decimals instead of shifting them.\n const inDecimalPortion = rawValueStart.indexOf(decimal) !== -1;\n if (\n inputMode === NgxCurrencyInputMode.Natural &&\n inDecimalPortion &&\n selectionStart === selectionEnd\n ) {\n rawValueEnd = rawValueEnd.substring(1);\n }\n\n const newValue = rawValueStart + keyChar + rawValueEnd;\n let nextSelectionStart = selectionStart + 1;\n const isDecimalOrThousands =\n isDecimalChar || keyChar === this._options.thousands;\n if (isDecimalOrThousands && keyChar === rawValueEnd[0]) {\n // If the cursor is just before the decimal or thousands separator and the user types the\n // decimal or thousands separator, move the cursor past it.\n nextSelectionStart++;\n } else if (!this._singleDigitRegex.test(keyChar)) {\n // Ignore other non-numbers.\n return;\n }\n\n this.rawValue = newValue;\n this.updateFieldValue(nextSelectionStart);\n }\n }\n\n applyMask(\n isNumber: boolean,\n rawValue: string,\n disablePadAndTrim = false,\n ): string {\n const {\n allowNegative,\n decimal,\n precision,\n prefix,\n suffix,\n thousands,\n min,\n inputMode,\n } = this._options;\n\n let { max } = this._options;\n\n rawValue = isNumber ? new Number(rawValue).toFixed(precision) : rawValue;\n let onlyNumbers = rawValue.replace(this._onlyNumbersRegex, '');\n\n if (!onlyNumbers && rawValue !== decimal) {\n return '';\n }\n\n if (\n inputMode === NgxCurrencyInputMode.Natural &&\n !isNumber &&\n !disablePadAndTrim\n ) {\n rawValue = this.padOrTrimPrecision(rawValue);\n onlyNumbers = rawValue.replace(this._onlyNumbersRegex, '');\n }\n\n let integerPart = onlyNumbers\n .slice(0, onlyNumbers.length - precision)\n .replace(/^\\u0660*/g, '')\n .replace(/^\\u06F0*/g, '')\n .replace(/^0*/g, '');\n\n if (integerPart == '') {\n integerPart = '0';\n }\n const integerValue = parseInt(integerPart);\n\n integerPart = integerPart.replace(\n /\\B(?=([0-9\\u0660-\\u0669\\u06F0-\\u06F9]{3})+(?![0-9\\u0660-\\u0669\\u06F0-\\u06F9]))/g,\n thousands,\n );\n if (thousands && integerPart.startsWith(thousands)) {\n integerPart = integerPart.substring(1);\n }\n\n let newRawValue = integerPart;\n const decimalPart = onlyNumbers.slice(onlyNumbers.length - precision);\n const decimalValue = parseInt(decimalPart) || 0;\n\n const isNegative = rawValue.indexOf('-') > -1;\n\n // Ensure max is at least as large as min.\n max =\n max === null || max === undefined || min === null || min === undefined\n ? max\n : Math.max(max, min);\n\n // Ensure precision number works well with more than 2 digits\n // 23 / 100... 233 / 1000 and so on\n const divideBy = Number('1'.padEnd(precision + 1, '0'));\n\n // Restrict to the min and max values.\n let newValue = integerValue + decimalValue / divideBy;\n\n newValue = isNegative ? -newValue : newValue;\n if (max !== null && max !== undefined && newValue > max) {\n return this.applyMask(true, max + '');\n } else if (min !== null && min !== undefined && newValue < min) {\n return this.applyMask(true, min + '');\n }\n\n if (precision > 0) {\n if (newRawValue == '0' && decimalPart.length < precision) {\n newRawValue += decimal + '0'.repeat(precision - 1) + decimalPart;\n } else {\n newRawValue += decimal + decimalPart;\n }\n }\n\n // let isZero = newValue == 0;\n const operator = isNegative && allowNegative /*&& !isZero */ ? '-' : '';\n return operator + prefix + newRawValue + suffix;\n }\n\n padOrTrimPrecision(rawValue: string): string {\n const { decimal, precision } = this._options;\n\n let decimalIndex = rawValue.lastIndexOf(decimal);\n if (decimalIndex === -1) {\n decimalIndex = rawValue.length;\n rawValue += decimal;\n }\n\n let decimalPortion = rawValue\n .substring(decimalIndex)\n .replace(this._onlyNumbersRegex, '');\n const actualPrecision = decimalPortion.length;\n if (actualPrecision < precision) {\n for (let i = actualPrecision; i < precision; i++) {\n decimalPortion += '0';\n }\n } else if (actualPrecision > precision) {\n decimalPortion = decimalPortion.substring(\n 0,\n decimalPortion.length + precision - actualPrecision,\n );\n }\n\n return rawValue.substring(0, decimalIndex) + decimal + decimalPortion;\n }\n\n clearMask(rawValue: string | null): number | null {\n if (this.isNullable() && rawValue === '') return null;\n\n let value = (rawValue || '0')\n .replace(this._options.prefix, '')\n .replace(this._options.suffix, '');\n\n if (this._options.thousands) {\n value = value.replace(\n new RegExp('\\\\' + this._options.thousands, 'g'),\n '',\n );\n }\n\n if (this._options.decimal) {\n value = value.replace(this._options.decimal, '.');\n }\n\n this._perArNumber.forEach((val: string, key: string) => {\n const re = new RegExp(key, 'g');\n value = value.replace(re, val);\n });\n return parseFloat(value);\n }\n\n changeToNegative(): void {\n if (\n this._options.allowNegative /*&& this.rawValue != \"\"*/ &&\n this.rawValue?.charAt(0) != '-' /*&& this.value != 0*/\n ) {\n // Apply the mask to ensure the min and max values are enforced.\n this.rawValue = this.applyMask(\n false,\n '-' + (this.rawValue ? this.rawValue : '0'),\n );\n }\n }\n\n changeToPositive(): void {\n // Apply the mask to ensure the min and max values are enforced.\n this.rawValue = this.applyMask(\n false,\n this.rawValue?.replace('-', '') ?? '',\n );\n }\n\n removeNumber(keyCode: number): void {\n const { decimal, thousands, prefix, suffix, inputMode } = this._options;\n\n if (this.isNullable() && this.value == 0) {\n this.rawValue = null;\n return;\n }\n\n let selectionEnd = this.inputSelection.selectionEnd;\n let selectionStart = this.inputSelection.selectionStart;\n\n const suffixStart = (this.rawValue?.length ?? 0) - suffix.length;\n selectionEnd = Math.min(suffixStart, Math.max(selectionEnd, prefix.length));\n selectionStart = Math.min(\n suffixStart,\n Math.max(selectionStart, prefix.length),\n );\n\n // Check if selection was entirely in the prefix or suffix.\n if (\n selectionStart === selectionEnd &&\n this.inputSelection.selectionStart !== this.inputSelection.selectionEnd\n ) {\n this.updateFieldValue(selectionStart);\n return;\n }\n\n let decimalIndex = this.rawValue?.indexOf(decimal) ?? -1;\n if (decimalIndex === -1) {\n decimalIndex = this.rawValue?.length ?? 0;\n }\n\n let shiftSelection = 0;\n let insertChars = '';\n\n const isCursorInDecimals = decimalIndex < selectionEnd;\n const isCursorImmediatelyAfterDecimalPoint =\n decimalIndex + 1 === selectionEnd;\n\n if (selectionEnd === selectionStart) {\n if (keyCode == 8) {\n if (selectionStart <= prefix.length) {\n return;\n }\n selectionStart--;\n\n // If previous char isn't a number, go back one more.\n if (\n !this.rawValue\n ?.substring(selectionStart, selectionStart + 1)\n .match(/\\d/)\n ) {\n selectionStart--;\n }\n\n // In natural mode, jump backwards when in decimal portion of number.\n if (inputMode === NgxCurrencyInputMode.Natural && isCursorInDecimals) {\n shiftSelection = -1;\n // when removing a single whole number, replace it with 0\n if (\n isCursorImmediatelyAfterDecimalPoint &&\n (this.value ?? 0) < 10 &&\n (this.value ?? 0) > -10\n ) {\n insertChars += '0';\n }\n }\n } else if (keyCode == 46 || keyCode == 63272) {\n if (selectionStart === suffixStart) {\n return;\n }\n selectionEnd++;\n\n // If next char isn't a number, go one more.\n if (\n !this.rawValue\n ?.substring(selectionStart, selectionStart + 1)\n .match(/\\d/)\n ) {\n selectionStart++;\n selectionEnd++;\n }\n }\n }\n\n // In natural mode, replace decimals with 0s.\n if (\n inputMode === NgxCurrencyInputMode.Natural &&\n selectionStart > decimalIndex\n ) {\n const replacedDecimalCount = selectionEnd - selectionStart;\n for (let i = 0; i < replacedDecimalCount; i++) {\n insertChars += '0';\n }\n }\n\n let selectionFromEnd = (this.rawValue?.length ?? 0) - selectionEnd;\n this.rawValue =\n this.rawValue?.substring(0, selectionStart) +\n insertChars +\n this.rawValue?.substring(selectionEnd);\n\n // Remove leading thousand separator from raw value.\n const startChar = this.rawValue.substring(prefix.length, prefix.length + 1);\n if (startChar === thousands) {\n this.rawValue =\n this.rawValue.substring(0, prefix.length) +\n this.rawValue.substring(prefix.length + 1);\n selectionFromEnd = Math.min(\n selectionFromEnd,\n this.rawValue.length - prefix.length,\n );\n }\n\n this.updateFieldValue(\n this.rawValue.length - selectionFromEnd + shiftSelection,\n true,\n );\n }\n\n updateFieldValue(selectionStart?: number, disablePadAndTrim = false): void {\n const newRawValue = this.applyMask(\n false,\n this.rawValue ?? '',\n disablePadAndTrim,\n );\n selectionStart ??= this.rawValue?.length ?? 0;\n selectionStart = Math.max(\n this._options.prefix.length,\n Math.min(\n selectionStart,\n (this.rawValue?.length ?? 0) - this._options.suffix.length,\n ),\n );\n this.inputManager.updateValueAndCursor(\n newRawValue,\n this.rawValue?.length ?? 0,\n selectionStart,\n );\n }\n\n updateOptions(options: NgxCurrencyConfig): void {\n const value = this.value;\n this._options = options;\n this.value = value;\n }\n\n prefixLength(): number {\n return this._options.prefix.length;\n }\n\n suffixLength(): number {\n return this._options.suffix.length;\n }\n\n isNullable() {\n return this._options.nullable;\n }\n\n get canInputMoreNumbers(): boolean {\n return this.inputManager.canInputMoreNumbers;\n }\n\n get inputSelection(): {\n selectionStart: number;\n selectionEnd: number;\n } {\n return this.inputManager.inputSelection;\n }\n\n get rawValue(): string | null {\n return this.inputManager.rawValue;\n }\n\n set rawValue(value: string | null) {\n this.inputManager.rawValue = value;\n }\n\n get storedRawValue(): string {\n return this.inputManager.storedRawValue;\n }\n\n get value(): number | null {\n return this.clearMask(this.rawValue);\n }\n\n set value(value: number | null) {\n this.rawValue = this.applyMask(true, '' + value);\n }\n\n private _isNullOrUndefined(value: number | null | undefined): boolean {\n return value === null || value === undefined;\n }\n}\n","import { InputService } from './input.service';\nimport { NgxCurrencyConfig } from './ngx-currency.config';\n\nexport class InputHandler {\n inputService: InputService;\n onModelChange: (value: number | null) => void = () => undefined;\n onModelTouched: () => void = () => undefined;\n\n constructor(htmlInputElement: HTMLInputElement, options: NgxCurrencyConfig) {\n this.inputService = new InputService(htmlInputElement, options);\n }\n\n handleCut(): void {\n setTimeout(() => {\n this.inputService.updateFieldValue();\n this.setValue(this.inputService.value);\n this.onModelChange(this.inputService.value);\n }, 0);\n }\n\n handleInput(): void {\n const rawValue = this.inputService.rawValue ?? '';\n const selectionStart = this.inputService.inputSelection.selectionStart;\n const keyCode = rawValue.charCodeAt(selectionStart - 1);\n const rawValueLength = rawValue.length;\n const storedRawValueLength = this.inputService.storedRawValue.length;\n\n if (Math.abs(rawValueLength - storedRawValueLength) != 1) {\n this.inputService.updateFieldValue(selectionStart);\n this.onModelChange(this.inputService.value);\n return;\n }\n\n // Restore the old value.\n this.inputService.rawValue = this.inputService.storedRawValue;\n\n if (rawValueLength < storedRawValueLength) {\n // Chrome Android seems to move the cursor in response to a backspace AFTER processing the\n // input event, so we need to wrap this in a timeout.\n this.timer(() => {\n // Move the cursor to just after the deleted value.\n this.inputService.updateFieldValue(selectionStart + 1);\n\n // Then backspace it.\n this.inputService.removeNumber(8);\n this.onModelChange(this.inputService.value);\n }, 0);\n }\n\n if (rawValueLength > storedRawValueLength) {\n // Move the cursor to just before the new value.\n this.inputService.updateFieldValue(selectionStart - 1);\n\n // Process the character like a keypress.\n this._handleKeypressImpl(keyCode);\n }\n }\n\n handleKeydown(event: KeyboardEvent): void {\n const keyCode = event.which || event.charCode || event.keyCode;\n if (keyCode == 8 || keyCode == 46 || keyCode == 63272) {\n event.preventDefault();\n\n if (\n this.inputService.inputSelection.selectionStart <=\n this.inputService.prefixLength() &&\n this.inputService.inputSelection.selectionEnd >=\n (this.inputService.rawValue?.length ?? 0) -\n this.inputService.suffixLength()\n ) {\n this.clearValue();\n } else {\n this.inputService.removeNumber(keyCode);\n this.onModelChange(this.inputService.value);\n }\n }\n }\n\n clearValue() {\n this.setValue(this.inputService.isNullable() ? null : 0);\n this.onModelChange(this.inputService.value);\n }\n\n handleKeypress(event: KeyboardEvent): void {\n const keyCode = event.which || event.charCode || event.keyCode;\n event.preventDefault();\n if (keyCode === 97 && event.ctrlKey) {\n return;\n }\n\n this._handleKeypressImpl(keyCode);\n }\n\n private _handleKeypressImpl(keyCode: number): void {\n switch (keyCode) {\n case undefined:\n case 9:\n case 13:\n return;\n case 43:\n this.inputService.changeToPositive();\n break;\n case 45:\n this.inputService.changeToNegative();\n break;\n default:\n if (this.inputService.canInputMoreNumbers) {\n const selectionRangeLength = Math.abs(\n this.inputService.inputSelection.selectionEnd -\n this.inputService.inputSelection.selectionStart,\n );\n\n if (\n selectionRangeLength == (this.inputService.rawValue?.length ?? 0)\n ) {\n this.setValue(null);\n }\n\n this.inputService.addNumber(keyCode);\n }\n break;\n }\n\n this.onModelChange(this.inputService.value);\n }\n\n handlePaste(): void {\n setTimeout(() => {\n this.inputService.updateFieldValue();\n this.setValue(this.inputService.value);\n this.onModelChange(this.inputService.value);\n }, 1);\n }\n\n updateOptions(options: NgxCurrencyConfig): void {\n this.inputService.updateOptions(options);\n }\n\n getOnModelChange(): (value: number | null) => void {\n return this.onModelChange;\n }\n\n setOnModelChange(callbackFunction: (value: number | null) => void): void {\n this.onModelChange = callbackFunction;\n }\n\n getOnModelTouched(): () => void {\n return this.onModelTouched;\n }\n\n setOnModelTouched(callbackFunction: () => void) {\n this.onModelTouched = callbackFunction;\n }\n\n setValue(value: number | null): void {\n this.inputService.value = value;\n }\n\n /**\n * Passthrough to setTimeout that can be stubbed out in tests.\n */\n timer(callback: () => void, delayMilliseconds: number) {\n setTimeout(callback, delayMilliseconds);\n }\n}\n","import {\n AfterViewInit,\n Directive,\n DoCheck,\n ElementRef,\n forwardRef,\n HostListener,\n Inject,\n Input,\n KeyValueDiffer,\n KeyValueDiffers,\n Optional,\n} from '@angular/core';\n\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { InputHandler } from './input.handler';\nimport {\n NGX_CURRENCY_CONFIG,\n NgxCurrencyConfig,\n NgxCurrencyInputMode,\n} from './ngx-currency.config';\n\n@Directive({\n selector: 'input[currencyMask]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxCurrencyDirective),\n multi: true,\n },\n ],\n})\nexport class NgxCurrencyDirective\n implements AfterViewInit, ControlValueAccessor, DoCheck\n{\n @Input()\n set currencyMask(value: Partial<NgxCurrencyConfig> | string) {\n if (typeof value === 'string') return;\n\n this._options = value;\n }\n\n /**\n * @deprecated Use currencyMask input instead\n */\n @Input()\n set options(value: Partial<NgxCurrencyConfig>) {\n this._options = value;\n }\n\n private readonly _inputHandler: InputHandler;\n private readonly _keyValueDiffer: KeyValueDiffer<\n keyof NgxCurrencyConfig,\n unknown\n >;\n\n private _options: Partial<NgxCurrencyConfig> = {};\n private readonly _optionsTemplate: NgxCurrencyConfig;\n\n constructor(\n @Optional()\n @Inject(NGX_CURRENCY_CONFIG)\n globalOptions: Partial<NgxCurrencyConfig>,\n keyValueDiffers: KeyValueDiffers,\n private readonly _elementRef: ElementRef<HTMLInputElement>,\n ) {\n this._optionsTemplate = {\n align: 'right',\n allowNegative: true,\n allowZero: true,\n decimal: '.',\n precision: 2,\n prefix: '$ ',\n suffix: '',\n thousands: ',',\n nullable: false,\n inputMode: NgxCurrencyInputMode.Financial,\n ...globalOptions,\n };\n\n this._keyValueDiffer = keyValueDiffers.find({}).create();\n\n this._inputHandler = new InputHandler(this._elementRef.nativeElement, {\n ...this._optionsTemplate,\n ...this._options,\n });\n }\n\n ngAfterViewInit() {\n this._elementRef.nativeElement.style.textAlign =\n this._options?.align ?? this._optionsTemplate.align;\n }\n\n ngDoCheck() {\n if (this._keyValueDiffer.diff(this._options)) {\n this._elementRef.nativeElement.style.textAlign =\n this._options?.align ?? this._optionsTemplate.align;\n\n this._inputHandler.updateOptions({\n ...this._optionsTemplate,\n ...this._options,\n });\n }\n }\n\n @HostListener('blur', ['$event'])\n handleBlur(event: FocusEvent) {\n this._inputHandler.getOnModelTouched().apply(event);\n }\n\n @HostListener('cut')\n handleCut() {\n if (!this.isChromeAndroid()) {\n if (!this.isReadOnly()) this._inputHandler.handleCut();\n }\n }\n\n @HostListener('input')\n handleInput() {\n if (this.isChromeAndroid()) {\n if (!this.isReadOnly()) this._inputHandler.handleInput();\n }\n }\n\n @HostListener('keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n if (!this.isChromeAndroid()) {\n if (!this.isReadOnly()) this._inputHandler.handleKeydown(event);\n }\n }\n\n @HostListener('keypress', ['$event'])\n handleKeypress(event: KeyboardEvent) {\n if (!this.isChromeAndroid()) {\n if (!this.isReadOnly()) this._inputHandler.handleKeypress(event);\n }\n }\n\n @HostListener('paste')\n handlePaste() {\n if (!this.isChromeAndroid()) {\n if (!this.isReadOnly()) this._inputHandler.handlePaste();\n }\n }\n\n @HostListener('drop', ['$event'])\n handleDrop(event: DragEvent) {\n if (!this.isChromeAndroid()) {\n event.preventDefault();\n }\n }\n\n isChromeAndroid(): boolean {\n return (\n /chrome/i.test(navigator.userAgent) &&\n /android/i.test(navigator.userAgent)\n );\n }\n\n isReadOnly(): boolean {\n return this._elementRef.nativeElement.hasAttribute('readonly');\n }\n\n registerOnChange(callbackFunction: (value: number | null) => void): void {\n this._inputHandler.setOnModelChange(callbackFunction);\n }\n\n registerOnTouched(callbackFunction: () => void): void {\n this._inputHandler.setOnModelTouched(callbackFunction);\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._elementRef.nativeElement.disabled = isDisabled;\n }\n\n writeValue(value: number): void {\n this._inputHandler.setValue(value);\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { NGX_CURRENCY_CONFIG, NgxCurrencyConfig } from './ngx-currency.config';\n\nexport function provideEnvironmentNgxCurrency(\n config: Partial<NgxCurrencyConfig>,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_CURRENCY_CONFIG,\n useValue: config,\n },\n ]);\n}\n","/*\n * Public API Surface of ngx-currency\n */\n\nexport * from './lib/ngx-currency.config';\nexport * from './lib/ngx-currency.directive';\nexport * from './lib/ngx-currency.providers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}