@seniorsistemas/angular-components 18.0.4 → 18.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-numeric-mask.mjs","sources":["../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.directive.ts","../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.module.ts","../../projects/angular-components/numeric-mask/src/seniorsistemas-angular-components-numeric-mask.ts"],"sourcesContent":["import { Directive, effect, ElementRef, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Numeric mask directive with internationalization support.\n *\n * Formats numeric values according to the specified locale, applying\n * appropriate thousand and decimal separators, with support for negative values,\n * min/max decimal places control, and scientific notation.\n *\n * @example\n * ```html\n * <input\n * type=\"text\"\n * sNumericMask\n * [locale]=\"'pt-BR'\"\n * [minDecimalPlaces]=\"2\"\n * [maxDecimalPlaces]=\"2\"\n * [allowNegative]=\"true\"\n * [(ngModel)]=\"value\"\n * />\n * ```\n */\n@Directive({\n selector: '[sNumericMask]',\n standalone: true,\n host: {\n '(input)': 'onInput($event)',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(paste)': 'onPaste($event)',\n '(keydown)': 'onKeyDown($event)',\n '(keypress)': 'onKeyPress($event)',\n '[style.text-align]': 'textAlign()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n ],\n})\nexport class NumericMaskDirective implements OnInit, ControlValueAccessor, Validator {\n /**\n * Locale for formatting (e.g. 'pt-BR', 'en-US', 'de-DE')\n * If not provided, uses the locale from LocaleService\n */\n public locale = input<string | undefined>(undefined);\n\n /**\n * Minimum number of decimal places to display\n * @default 0\n */\n public minDecimalPlaces = input(0);\n\n /**\n * Maximum number of decimal places allowed\n * @default 10\n */\n public maxDecimalPlaces = input(10);\n\n /**\n * Allows negative values\n * @default false\n */\n public allowNegative = input(false);\n\n /**\n * Enables scientific notation support\n * @default true\n */\n public allowScientificNotation = input(true);\n\n /**\n * Text alignment in input\n * @default 'right'\n */\n public textAlign = input<'left' | 'right'>('right');\n\n /**\n * Minimum value allowed\n */\n public min = input<number | undefined>(undefined);\n\n /**\n * Maximum value allowed\n */\n public max = input<number | undefined>(undefined);\n\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n private readonly renderer = inject(Renderer2);\n private readonly localeService = inject(LocaleService, { optional: true });\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n private decimalSeparator = ',';\n private thousandSeparator = '.';\n private currentLocale = 'pt-BR';\n private lastModelValue: string | null = null;\n\n constructor() {\n effect(() => {\n const inputLocale = this.locale();\n\n if (inputLocale) {\n this.currentLocale = inputLocale;\n this.updateSeparators();\n }\n });\n }\n\n public ngOnInit(): void {\n if (this.minDecimalPlaces() > this.maxDecimalPlaces()) {\n throw new Error(\n `NumericMaskDirective: minDecimalPlaces (${this.minDecimalPlaces()}) cannot be greater than maxDecimalPlaces (${this.maxDecimalPlaces()})`\n );\n }\n\n if (this.locale()) {\n this.currentLocale = this.locale()!;\n this.updateSeparators();\n this.setInputMode();\n } else if (this.localeService) {\n this.localeService.get().subscribe(() => {\n this.currentLocale = this.localeService!.getLocaleOptions()?.locale || 'pt-BR';\n this.updateSeparators();\n this.setInputMode();\n });\n } else {\n this.updateSeparators();\n this.setInputMode();\n }\n }\n\n /**\n * Listener for input events (typing)\n */\n public onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n let value = input.value;\n value = this.normalizeSeparators(value);\n this.processInputValue(value);\n }\n\n /**\n * Listener for focus events (gaining focus)\n */\n public onFocus(): void {\n const input = this.elementRef.nativeElement;\n const currentValue = input.value;\n\n if (!currentValue || currentValue.trim() === '') {\n return;\n }\n\n if (this.lastModelValue) {\n const displayValue = this.lastModelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n return;\n }\n\n const displayValue = modelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n }\n\n /**\n * Listener for blur events (focus loss)\n */\n public onBlur(): void {\n this.onTouched();\n\n const currentValue = this.elementRef.nativeElement.value;\n\n if (!currentValue || currentValue.trim() === '') {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n this.lastModelValue = modelValue;\n const displayValue = this.fromModelValue(modelValue);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', displayValue);\n this.onChange(modelValue);\n }\n\n /**\n * Listener for paste events (clipboard)\n */\n public onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n\n const pastedText = event.clipboardData?.getData('text') || '';\n let value = this.parseClipboardValue(pastedText);\n\n this.processInputValue(value);\n }\n\n /**\n * Listener for special keys (+ and -)\n */\n public onKeyDown(event: KeyboardEvent): void {\n const key = event.key;\n\n if (key === '-' || key === '+') {\n const input = this.elementRef.nativeElement;\n const value = input.value;\n const cursorPosition = input.selectionStart || 0;\n\n if (key === '-' && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n event.preventDefault();\n if (!this.allowNegative()) {\n return;\n }\n\n this.toggleSign(value, key === '-');\n }\n }\n\n /**\n * Listener for keypress to block invalid characters\n */\n public onKeyPress(event: KeyboardEvent): void {\n const key = event.key;\n const input = this.elementRef.nativeElement;\n const cursorPosition = input.selectionStart || 0;\n const value = input.value;\n\n if ((key === '-' || key === '+') && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n if (key === '+' || key === '-') {\n event.preventDefault();\n return;\n }\n\n const isDigit = /^[0-9]$/.test(key);\n const isLocaleDecimalSeparator = key === this.decimalSeparator;\n const isOtherSeparator = (key === ',' || key === '.') && key !== this.decimalSeparator;\n const isScientificNotation = (key === 'e' || key === 'E') && this.allowScientificNotation();\n const isControlKey = event.ctrlKey || event.metaKey || event.altKey;\n const isSpecialKey = [\n 'Backspace',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Delete',\n 'Home',\n 'End',\n ].includes(key);\n\n if (isOtherSeparator) {\n event.preventDefault();\n return;\n }\n\n if (isScientificNotation) {\n if (value.includes('e') || value.includes('E')) {\n event.preventDefault();\n return;\n }\n\n const charBeforeCursor = value[cursorPosition - 1];\n if (!charBeforeCursor || !/^[0-9]$/.test(charBeforeCursor)) {\n event.preventDefault();\n return;\n }\n }\n\n if (!isDigit && !isLocaleDecimalSeparator && !isScientificNotation && !isControlKey && !isSpecialKey) {\n event.preventDefault();\n }\n }\n\n /**\n * Updates separators according to the locale\n * @private\n */\n private updateSeparators(): void {\n const formatted = new Intl.NumberFormat(this.currentLocale).format(1234.5);\n\n this.thousandSeparator = formatted[1];\n this.decimalSeparator = formatted[5];\n }\n\n /**\n * Processes input value and updates the input and model\n * @private\n */\n private processInputValue(value: string): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n\n const modelValue = this.toModelValue(value);\n\n // During typing, clear the stored model value so onFocus will recalculate\n this.lastModelValue = null;\n\n this.onChange(modelValue);\n }\n\n /**\n * Sets inputmode for numeric keyboard on mobile devices\n * @private\n */\n private setInputMode(): void {\n this.renderer.setAttribute(this.elementRef.nativeElement, 'inputmode', 'decimal');\n this.renderer.setAttribute(this.elementRef.nativeElement, 'autocomplete', 'off');\n }\n\n /**\n * Removes separators from a formatted value\n * @private\n */\n private removeSeparators(value: string): string {\n const thousandRegex = new RegExp(`\\\\${this.escapeRegex(this.thousandSeparator)}`, 'g');\n return value.replace(thousandRegex, '');\n }\n\n /**\n * Strips unnecessary trailing zeros from decimal part\n * @private\n */\n private stripTrailingZeros(value: string): string {\n const parts = value.split(this.decimalSeparator);\n if (parts.length === 2) {\n const decimalPart = parts[1].replace(/0+$/, '');\n return decimalPart.length > 0 ? parts[0] + this.decimalSeparator + decimalPart : parts[0];\n }\n return value;\n }\n\n /**\n * Normalizes separators during typing\n * @private\n */\n private normalizeSeparators(value: string): string {\n value = this.removeSeparators(value);\n\n if (this.decimalSeparator === ',') {\n value = value.replace(/\\./g, ',');\n } else if (this.decimalSeparator === '.') {\n value = value.replace(/,/g, '.');\n }\n\n const parts = value.split(this.decimalSeparator);\n if (parts.length > 2) {\n value = parts[0] + this.decimalSeparator + parts.slice(1).join('');\n }\n\n return value;\n }\n\n /**\n * Escapes special characters for use in regex\n * @private\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Truncates a number to the specified decimal places (never rounds)\n * @private\n */\n private truncateToDecimalPlaces(bigNumber: BigNumber, decimalPlaces: number): BigNumber {\n if (decimalPlaces < 0) {\n return bigNumber;\n }\n const multiplier = new BigNumber(10).pow(decimalPlaces);\n return bigNumber.multipliedBy(multiplier).integerValue(BigNumber.ROUND_DOWN).dividedBy(multiplier);\n }\n\n /**\n * Checks if the value has excessive decimal places\n * @private\n */\n private hasExcessiveDecimalPlaces(value: string): boolean {\n const parts = value.split(this.decimalSeparator);\n\n if (parts.length > 1) {\n const decimalPart = parts[1].replace(/[^0-9]/g, '');\n return decimalPart.length > this.maxDecimalPlaces();\n }\n\n return false;\n }\n\n /**\n * Clears the input and notifies the model\n * @private\n */\n private clearInput(): void {\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', '');\n this.lastModelValue = null;\n this.onChange(null);\n }\n\n /**\n * Parses a string value to its numeric representation, handling separators and sign\n * Returns BigNumber to preserve full precision and optional number conversion\n * @private\n */\n private parseStringToValue(value: string): { bigNumber: BigNumber; numeric: number; isNegative: boolean } {\n const isNegative = value.startsWith('-');\n let numericStr = value\n .replace(/^-/, '')\n .replace(new RegExp(`\\\\${this.thousandSeparator}`, 'g'), '')\n .replace(new RegExp(`\\\\${this.decimalSeparator}`, 'g'), '.');\n\n if (numericStr === '.' || numericStr === '') {\n numericStr = '0';\n } else if (numericStr.startsWith('.')) {\n numericStr = '0' + numericStr;\n }\n\n let bigNumber = new BigNumber(numericStr);\n if (bigNumber.isNaN()) {\n bigNumber = new BigNumber(0);\n }\n\n if (isNegative && this.allowNegative()) {\n bigNumber = bigNumber.negated();\n }\n\n return { bigNumber, numeric: bigNumber.toNumber(), isNegative };\n }\n\n /**\n * Formats a numeric value according to the locale\n * Truncates (never rounds) to maxDecimalPlaces for display purposes only\n * @private\n */\n private formatNumeric(numeric: number | BigNumber): string {\n let bigNumeric = numeric instanceof BigNumber ? numeric : new BigNumber(numeric);\n const truncatedValue = this.truncateToDecimalPlaces(bigNumeric, this.maxDecimalPlaces());\n const valueStr = truncatedValue.toFixed(this.maxDecimalPlaces());\n let formattedValue = valueStr.replace('.', this.decimalSeparator);\n const parts = formattedValue.split(this.decimalSeparator);\n const integerPart = parts[0];\n const decimalPart = parts[1] || '';\n const formattedInteger = new Intl.NumberFormat(this.currentLocale).format(\n parseInt(integerPart, 10) || 0\n ).split(this.decimalSeparator)[0];\n const minDecimal = Math.max(this.minDecimalPlaces(), decimalPart.replace(/0+$/, '').length || 0);\n const finalDecimal = decimalPart.padEnd(minDecimal, '0');\n return formattedInteger + this.decimalSeparator + finalDecimal;\n }\n\n /**\n * Formats the value according to the locale\n * @private\n */\n private formatValue(value: string): string {\n if (!value || value.trim() === '') {\n return '';\n }\n const { numeric } = this.parseStringToValue(value);\n return this.formatNumeric(numeric);\n }\n\n /**\n * Converts the formatted value to the model format (international standard string)\n * Always returns decimal notation, never scientific notation\n * Stores the full precision value without truncation\n * @private\n */\n private toModelValue(formattedValue: string): string | null {\n if (!formattedValue || formattedValue.trim() === '') {\n return null;\n }\n const { bigNumber } = this.parseStringToValue(formattedValue);\n return bigNumber.toFixed();\n }\n\n /**\n * Converts the model value to display format\n * @private\n */\n private fromModelValue(modelValue: string | null): string {\n if (modelValue === null || modelValue === undefined || modelValue === '') {\n return '';\n }\n const bigNumber = new BigNumber(modelValue);\n if (bigNumber.isNaN()) {\n return '';\n }\n return this.formatNumeric(bigNumber);\n }\n\n /**\n * Processes pasted value from clipboard\n * Converts scientific notation to decimal using BigNumber\n * @private\n */\n private parseClipboardValue(text: string): string {\n if (this.allowScientificNotation() && /[eE]/.test(text)) {\n try {\n const bigNumeric = new BigNumber(text);\n if (!bigNumeric.isNaN()) {\n text = bigNumeric.toFixed();\n }\n } catch {\n void 0;\n }\n }\n return this.normalizeSeparators(text);\n }\n\n /**\n * Toggles the sign (- or +) of a value\n * @private\n */\n private toggleSign(value: string, makeNegative: boolean): void {\n const input = this.elementRef.nativeElement;\n let newValue = value;\n\n if (makeNegative && !newValue.startsWith('-')) {\n newValue = '-' + newValue;\n } else if (!makeNegative && newValue.startsWith('-')) {\n newValue = newValue.substring(1);\n } else {\n return;\n }\n\n this.renderer.setProperty(input, 'value', newValue);\n const modelValue = this.toModelValue(newValue);\n this.lastModelValue = null;\n this.onChange(modelValue);\n }\n\n public writeValue(value: string | null): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n const hasFocus = document.activeElement === this.elementRef.nativeElement;\n if (hasFocus) {\n const formattedValue = this.fromModelValue(value);\n const rawValue = this.stripTrailingZeros(this.removeSeparators(formattedValue));\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', rawValue);\n } else {\n const formattedValue = this.fromModelValue(value);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', formattedValue);\n }\n }\n\n public registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n const numericValue = parseFloat(value);\n\n if (isNaN(numericValue)) {\n return null;\n }\n\n if (!this.allowNegative() && numericValue < 0) {\n return { negativeNotAllowed: true };\n }\n\n const minValue = this.min();\n if (minValue !== undefined && numericValue < minValue) {\n return {\n min: {\n min: minValue,\n actual: numericValue,\n },\n };\n }\n\n const maxValue = this.max();\n if (maxValue !== undefined && numericValue > maxValue) {\n return {\n max: {\n max: maxValue,\n actual: numericValue,\n },\n };\n }\n\n const decimalPart = value.split('.')[1];\n\n if (decimalPart && decimalPart.length > this.maxDecimalPlaces()) {\n return {\n excessiveDecimalPlaces: {\n max: this.maxDecimalPlaces(),\n actual: decimalPart.length,\n },\n };\n }\n\n return null;\n }\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { NumericMaskDirective } from './numeric-mask.directive';\n\n@NgModule({\n imports: [NumericMaskDirective],\n exports: [NumericMaskDirective],\n})\nexport class CurrencyMaskModule {}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-numeric-mask.mjs","sources":["../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.directive.ts","../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.module.ts","../../projects/angular-components/numeric-mask/src/seniorsistemas-angular-components-numeric-mask.ts"],"sourcesContent":["import { Directive, effect, ElementRef, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Numeric mask directive with internationalization support.\n *\n * Formats numeric values according to the specified locale, applying\n * appropriate thousand and decimal separators, with support for negative values,\n * min/max decimal places control, and scientific notation.\n *\n * @example\n * ```html\n * <input\n * type=\"text\"\n * sNumericMask\n * [locale]=\"'pt-BR'\"\n * [minDecimalPlaces]=\"2\"\n * [maxDecimalPlaces]=\"2\"\n * [allowNegative]=\"true\"\n * [(ngModel)]=\"value\"\n * />\n * ```\n */\n@Directive({\n selector: '[sNumericMask]',\n standalone: true,\n host: {\n '(input)': 'onInput($event)',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(paste)': 'onPaste($event)',\n '(keydown)': 'onKeyDown($event)',\n '(keypress)': 'onKeyPress($event)',\n '[style.text-align]': '\"right\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n ],\n})\nexport class NumericMaskDirective implements OnInit, ControlValueAccessor, Validator {\n /**\n * Locale for formatting (e.g. 'pt-BR', 'en-US', 'de-DE')\n * If not provided, uses the locale from LocaleService\n */\n public locale = input<string | undefined>(undefined);\n\n /**\n * Minimum number of decimal places to display\n * @default 0\n */\n public minDecimalPlaces = input(0);\n\n /**\n * Maximum number of decimal places allowed\n * @default 10\n */\n public maxDecimalPlaces = input(10);\n\n /**\n * Allows negative values\n * @default false\n */\n public allowNegative = input(false);\n\n /**\n * Enables scientific notation support\n * @default true\n */\n public allowScientificNotation = input(true);\n\n /**\n * Minimum value allowed\n */\n public min = input<number | undefined>(undefined);\n\n /**\n * Maximum value allowed\n */\n public max = input<number | undefined>(undefined);\n\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n private readonly renderer = inject(Renderer2);\n private readonly localeService = inject(LocaleService, { optional: true });\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n private decimalSeparator = ',';\n private thousandSeparator = '.';\n private currentLocale = 'pt-BR';\n private lastModelValue: string | null = null;\n\n constructor() {\n effect(() => {\n const inputLocale = this.locale();\n\n if (inputLocale) {\n this.currentLocale = inputLocale;\n this.updateSeparators();\n }\n });\n }\n\n public ngOnInit(): void {\n if (this.minDecimalPlaces() > this.maxDecimalPlaces()) {\n throw new Error(\n `NumericMaskDirective: minDecimalPlaces (${this.minDecimalPlaces()}) cannot be greater than maxDecimalPlaces (${this.maxDecimalPlaces()})`\n );\n }\n\n if (this.locale()) {\n this.currentLocale = this.locale()!;\n this.updateSeparators();\n this.setInputMode();\n } else if (this.localeService) {\n this.localeService.get().subscribe(() => {\n this.currentLocale = this.localeService!.getLocaleOptions()?.locale || 'pt-BR';\n this.updateSeparators();\n this.setInputMode();\n });\n } else {\n this.updateSeparators();\n this.setInputMode();\n }\n }\n\n /**\n * Listener for input events (typing)\n */\n public onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n let value = input.value;\n value = this.normalizeSeparators(value);\n this.processInputValue(value);\n }\n\n /**\n * Listener for focus events (gaining focus)\n */\n public onFocus(): void {\n const input = this.elementRef.nativeElement;\n const currentValue = input.value;\n\n if (!currentValue || currentValue.trim() === '') {\n return;\n }\n\n if (this.lastModelValue) {\n const displayValue = this.lastModelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n return;\n }\n\n const displayValue = modelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n }\n\n /**\n * Listener for blur events (focus loss)\n */\n public onBlur(): void {\n this.onTouched();\n\n const currentValue = this.elementRef.nativeElement.value;\n\n if (!currentValue || currentValue.trim() === '') {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n this.lastModelValue = modelValue;\n const displayValue = this.fromModelValue(modelValue);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', displayValue);\n this.onChange(modelValue);\n }\n\n /**\n * Listener for paste events (clipboard)\n */\n public onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n\n const pastedText = event.clipboardData?.getData('text') || '';\n let value = this.parseClipboardValue(pastedText);\n\n this.processInputValue(value);\n }\n\n /**\n * Listener for special keys (+ and -)\n */\n public onKeyDown(event: KeyboardEvent): void {\n const key = event.key;\n\n if (key === '-' || key === '+') {\n const input = this.elementRef.nativeElement;\n const value = input.value;\n const cursorPosition = input.selectionStart || 0;\n\n if (key === '-' && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n event.preventDefault();\n if (!this.allowNegative()) {\n return;\n }\n\n this.toggleSign(value, key === '-');\n }\n }\n\n /**\n * Listener for keypress to block invalid characters\n */\n public onKeyPress(event: KeyboardEvent): void {\n const key = event.key;\n const input = this.elementRef.nativeElement;\n const cursorPosition = input.selectionStart || 0;\n const value = input.value;\n\n if ((key === '-' || key === '+') && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n if (key === '+' || key === '-') {\n event.preventDefault();\n return;\n }\n\n const isDigit = /^[0-9]$/.test(key);\n const isLocaleDecimalSeparator = key === this.decimalSeparator;\n const isOtherSeparator = (key === ',' || key === '.') && key !== this.decimalSeparator;\n const isScientificNotation = (key === 'e' || key === 'E') && this.allowScientificNotation();\n const isControlKey = event.ctrlKey || event.metaKey || event.altKey;\n const isSpecialKey = [\n 'Backspace',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Delete',\n 'Home',\n 'End',\n ].includes(key);\n\n if (isOtherSeparator) {\n event.preventDefault();\n return;\n }\n\n if (isScientificNotation) {\n if (value.includes('e') || value.includes('E')) {\n event.preventDefault();\n return;\n }\n\n const charBeforeCursor = value[cursorPosition - 1];\n if (!charBeforeCursor || !/^[0-9]$/.test(charBeforeCursor)) {\n event.preventDefault();\n return;\n }\n }\n\n if (!isDigit && !isLocaleDecimalSeparator && !isScientificNotation && !isControlKey && !isSpecialKey) {\n event.preventDefault();\n }\n }\n\n /**\n * Updates separators according to the locale\n * @private\n */\n private updateSeparators(): void {\n const formatted = new Intl.NumberFormat(this.currentLocale).format(1234.5);\n\n this.thousandSeparator = formatted[1];\n this.decimalSeparator = formatted[5];\n }\n\n /**\n * Processes input value and updates the input and model\n * @private\n */\n private processInputValue(value: string): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n\n const modelValue = this.toModelValue(value);\n\n // During typing, clear the stored model value so onFocus will recalculate\n this.lastModelValue = null;\n\n this.onChange(modelValue);\n }\n\n /**\n * Sets inputmode for numeric keyboard on mobile devices\n * @private\n */\n private setInputMode(): void {\n this.renderer.setAttribute(this.elementRef.nativeElement, 'inputmode', 'decimal');\n this.renderer.setAttribute(this.elementRef.nativeElement, 'autocomplete', 'off');\n }\n\n /**\n * Removes separators from a formatted value\n * @private\n */\n private removeSeparators(value: string): string {\n const thousandRegex = new RegExp(`\\\\${this.escapeRegex(this.thousandSeparator)}`, 'g');\n return value.replace(thousandRegex, '');\n }\n\n /**\n * Strips unnecessary trailing zeros from decimal part\n * @private\n */\n private stripTrailingZeros(value: string): string {\n const parts = value.split(this.decimalSeparator);\n if (parts.length === 2) {\n const decimalPart = parts[1].replace(/0+$/, '');\n return decimalPart.length > 0 ? parts[0] + this.decimalSeparator + decimalPart : parts[0];\n }\n return value;\n }\n\n /**\n * Normalizes separators during typing\n * @private\n */\n private normalizeSeparators(value: string): string {\n value = this.removeSeparators(value);\n\n if (this.decimalSeparator === ',') {\n value = value.replace(/\\./g, ',');\n } else if (this.decimalSeparator === '.') {\n value = value.replace(/,/g, '.');\n }\n\n const parts = value.split(this.decimalSeparator);\n if (parts.length > 2) {\n value = parts[0] + this.decimalSeparator + parts.slice(1).join('');\n }\n\n return value;\n }\n\n /**\n * Escapes special characters for use in regex\n * @private\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Truncates a number to the specified decimal places (never rounds)\n * @private\n */\n private truncateToDecimalPlaces(bigNumber: BigNumber, decimalPlaces: number): BigNumber {\n if (decimalPlaces < 0) {\n return bigNumber;\n }\n const multiplier = new BigNumber(10).pow(decimalPlaces);\n return bigNumber.multipliedBy(multiplier).integerValue(BigNumber.ROUND_DOWN).dividedBy(multiplier);\n }\n\n /**\n * Checks if the value has excessive decimal places\n * @private\n */\n private hasExcessiveDecimalPlaces(value: string): boolean {\n const parts = value.split(this.decimalSeparator);\n\n if (parts.length > 1) {\n const decimalPart = parts[1].replace(/[^0-9]/g, '');\n return decimalPart.length > this.maxDecimalPlaces();\n }\n\n return false;\n }\n\n /**\n * Clears the input and notifies the model\n * @private\n */\n private clearInput(): void {\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', '');\n this.lastModelValue = null;\n this.onChange(null);\n }\n\n /**\n * Parses a string value to its numeric representation, handling separators and sign\n * Returns BigNumber to preserve full precision and optional number conversion\n * @private\n */\n private parseStringToValue(value: string): { bigNumber: BigNumber; numeric: number; isNegative: boolean } {\n const isNegative = value.startsWith('-');\n let numericStr = value\n .replace(/^-/, '')\n .replace(new RegExp(`\\\\${this.thousandSeparator}`, 'g'), '')\n .replace(new RegExp(`\\\\${this.decimalSeparator}`, 'g'), '.');\n\n if (numericStr === '.' || numericStr === '') {\n numericStr = '0';\n } else if (numericStr.startsWith('.')) {\n numericStr = '0' + numericStr;\n }\n\n let bigNumber = new BigNumber(numericStr);\n if (bigNumber.isNaN()) {\n bigNumber = new BigNumber(0);\n }\n\n if (isNegative && this.allowNegative()) {\n bigNumber = bigNumber.negated();\n }\n\n return { bigNumber, numeric: bigNumber.toNumber(), isNegative };\n }\n\n /**\n * Formats a numeric value according to the locale\n * Truncates (never rounds) to maxDecimalPlaces and pads with zeros to minDecimalPlaces\n * @private\n */\n private formatNumeric(numeric: number | BigNumber): string {\n let bigNumeric = numeric instanceof BigNumber ? numeric : new BigNumber(numeric);\n \n const truncatedValue = this.truncateToDecimalPlaces(bigNumeric, this.maxDecimalPlaces());\n \n const valueStr = truncatedValue.toFixed(Math.max(this.minDecimalPlaces(), this.maxDecimalPlaces()));\n \n let formattedValue = valueStr.replace('.', this.decimalSeparator);\n \n const parts = formattedValue.split(this.decimalSeparator);\n const integerPart = parts[0];\n let decimalPart = parts[1] || '';\n \n const formattedInteger = new Intl.NumberFormat(this.currentLocale).format(\n parseInt(integerPart, 10) || 0\n ).split(this.decimalSeparator)[0];\n \n const effectiveDecimalPlaces = decimalPart.replace(/0+$/, '').length;\n \n const decimalPlacesToShow = Math.max(\n this.minDecimalPlaces(),\n Math.min(effectiveDecimalPlaces, this.maxDecimalPlaces())\n );\n \n decimalPart = decimalPart.substring(0, decimalPlacesToShow).padEnd(decimalPlacesToShow, '0');\n \n return formattedInteger + this.decimalSeparator + decimalPart;\n }\n\n /**\n * Formats the value according to the locale\n * @private\n */\n private formatValue(value: string): string {\n if (!value || value.trim() === '') {\n return '';\n }\n const { numeric } = this.parseStringToValue(value);\n return this.formatNumeric(numeric);\n }\n\n /**\n * Converts the formatted value to the model format (international standard string)\n * Always returns decimal notation, never scientific notation\n * Stores the full precision value without truncation\n * @private\n */\n private toModelValue(formattedValue: string): string | null {\n if (!formattedValue || formattedValue.trim() === '') {\n return null;\n }\n const { bigNumber } = this.parseStringToValue(formattedValue);\n return bigNumber.toFixed();\n }\n\n /**\n * Converts the model value to display format\n * @private\n */\n private fromModelValue(modelValue: string | null): string {\n if (modelValue === null || modelValue === undefined || modelValue === '') {\n return '';\n }\n const bigNumber = new BigNumber(modelValue);\n if (bigNumber.isNaN()) {\n return '';\n }\n return this.formatNumeric(bigNumber);\n }\n\n /**\n * Processes pasted value from clipboard\n * Converts scientific notation to decimal using BigNumber\n * @private\n */\n private parseClipboardValue(text: string): string {\n if (this.allowScientificNotation() && /[eE]/.test(text)) {\n try {\n const bigNumeric = new BigNumber(text);\n if (!bigNumeric.isNaN()) {\n text = bigNumeric.toFixed();\n }\n } catch {\n void 0;\n }\n }\n return this.normalizeSeparators(text);\n }\n\n /**\n * Toggles the sign (- or +) of a value\n * @private\n */\n private toggleSign(value: string, makeNegative: boolean): void {\n const input = this.elementRef.nativeElement;\n let newValue = value;\n\n if (makeNegative && !newValue.startsWith('-')) {\n newValue = '-' + newValue;\n } else if (!makeNegative && newValue.startsWith('-')) {\n newValue = newValue.substring(1);\n } else {\n return;\n }\n\n this.renderer.setProperty(input, 'value', newValue);\n const modelValue = this.toModelValue(newValue);\n this.lastModelValue = null;\n this.onChange(modelValue);\n }\n\n public writeValue(value: string | null): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n const hasFocus = document.activeElement === this.elementRef.nativeElement;\n if (hasFocus) {\n const formattedValue = this.fromModelValue(value);\n const rawValue = this.stripTrailingZeros(this.removeSeparators(formattedValue));\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', rawValue);\n } else {\n const formattedValue = this.fromModelValue(value);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', formattedValue);\n }\n }\n\n public registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n const numericValue = parseFloat(value);\n\n if (isNaN(numericValue)) {\n return null;\n }\n\n if (!this.allowNegative() && numericValue < 0) {\n return { negativeNotAllowed: true };\n }\n\n const minValue = this.min();\n if (minValue !== undefined && numericValue < minValue) {\n return {\n min: {\n min: minValue,\n actual: numericValue,\n },\n };\n }\n\n const maxValue = this.max();\n if (maxValue !== undefined && numericValue > maxValue) {\n return {\n max: {\n max: maxValue,\n actual: numericValue,\n },\n };\n }\n\n const decimalPart = value.split('.')[1];\n\n if (decimalPart && decimalPart.length > this.maxDecimalPlaces()) {\n return {\n excessiveDecimalPlaces: {\n max: this.maxDecimalPlaces(),\n actual: decimalPart.length,\n },\n };\n }\n\n return null;\n }\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { NumericMaskDirective } from './numeric-mask.directive';\n\n@NgModule({\n imports: [NumericMaskDirective],\n exports: [NumericMaskDirective],\n})\nexport class CurrencyMaskModule {}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}