{"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 {\n    Directive,\n    ElementRef,\n    forwardRef,\n    inject,\n    input,\n    model,\n    OnChanges,\n    OnInit,\n    Renderer2,\n    SimpleChanges,\n} 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 * @description Diretiva de máscara numérica com suporte a internacionalização.\n *\n * Formata valores numéricos de acordo com o locale especificado, aplicando\n * separadores de milhar e decimal adequados, com suporte a valores negativos,\n * controle de casas decimais mín/máx e notação científica.\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 * @category Numeric\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, OnChanges, 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    public decimalSeparator = model(',');\n    public thousandSeparator = model('.');\n    protected currentLocale = 'pt-BR';\n    private lastModelValue: string | null = null;\n\n    public ngOnChanges(changes: SimpleChanges): void {\n        if (changes['locale'] && !changes['locale'].firstChange && this.locale()) {\n            this.currentLocale = this.locale()!;\n            this.updateSeparators();\n            this.setInputMode();\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 isDecimalSeparator = key === ',' || key === '.';\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 (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 && !isDecimalSeparator && !isScientificNotation && !isControlKey && !isSpecialKey) {\n            event.preventDefault();\n        }\n    }\n\n    /**\n     * Updates separators according to the locale\n     */\n    protected updateSeparators(): void {\n        const formatted = new Intl.NumberFormat(this.currentLocale).format(1234.5);\n\n        this.thousandSeparator.set(formatted[1]);\n        this.decimalSeparator.set(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     * 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)\n            .format(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 decimalPart ? formattedInteger + this.decimalSeparator() + decimalPart : formattedInteger;\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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"}