You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							572 lines
						
					
					
						
							26 KiB
						
					
					
				
			
		
		
	
	
							572 lines
						
					
					
						
							26 KiB
						
					
					
				import React, { forwardRef, useMemo, useState, useRef, useEffect } from 'react';
 | 
						|
 | 
						|
/*! *****************************************************************************
 | 
						|
Copyright (c) Microsoft Corporation.
 | 
						|
 | 
						|
Permission to use, copy, modify, and/or distribute this software for any
 | 
						|
purpose with or without fee is hereby granted.
 | 
						|
 | 
						|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 | 
						|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
						|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
 | 
						|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 | 
						|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
 | 
						|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
						|
PERFORMANCE OF THIS SOFTWARE.
 | 
						|
***************************************************************************** */
 | 
						|
 | 
						|
var __assign = function() {
 | 
						|
    __assign = Object.assign || function __assign(t) {
 | 
						|
        for (var s, i = 1, n = arguments.length; i < n; i++) {
 | 
						|
            s = arguments[i];
 | 
						|
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
 | 
						|
        }
 | 
						|
        return t;
 | 
						|
    };
 | 
						|
    return __assign.apply(this, arguments);
 | 
						|
};
 | 
						|
 | 
						|
function __rest(s, e) {
 | 
						|
    var t = {};
 | 
						|
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
 | 
						|
        t[p] = s[p];
 | 
						|
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
 | 
						|
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
 | 
						|
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
 | 
						|
                t[p[i]] = s[p[i]];
 | 
						|
        }
 | 
						|
    return t;
 | 
						|
}
 | 
						|
 | 
						|
function __spreadArray(to, from, pack) {
 | 
						|
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
 | 
						|
        if (ar || !(i in from)) {
 | 
						|
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
 | 
						|
            ar[i] = from[i];
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return to.concat(ar || from);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Escape regex char
 | 
						|
 *
 | 
						|
 * See: https://stackoverflow.com/questions/17885855/use-dynamic-variable-string-as-regex-pattern-in-javascript
 | 
						|
 */
 | 
						|
var escapeRegExp = function (stringToGoIntoTheRegex) {
 | 
						|
    return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
 | 
						|
};
 | 
						|
 | 
						|
var abbrMap = { k: 1000, m: 1000000, b: 1000000000 };
 | 
						|
/**
 | 
						|
 * Parse a value with abbreviation e.g 1k = 1000
 | 
						|
 */
 | 
						|
var parseAbbrValue = function (value, decimalSeparator) {
 | 
						|
    if (decimalSeparator === void 0) { decimalSeparator = '.'; }
 | 
						|
    var reg = new RegExp("(\\d+(" + escapeRegExp(decimalSeparator) + "\\d*)?)([kmb])$", 'i');
 | 
						|
    var match = value.match(reg);
 | 
						|
    if (match) {
 | 
						|
        var digits = match[1], abbr = match[3];
 | 
						|
        var multiplier = abbrMap[abbr.toLowerCase()];
 | 
						|
        return Number(digits.replace(decimalSeparator, '.')) * multiplier;
 | 
						|
    }
 | 
						|
    return undefined;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * Remove group separator from value eg. 1,000 > 1000
 | 
						|
 */
 | 
						|
var removeSeparators = function (value, separator) {
 | 
						|
    if (separator === void 0) { separator = ','; }
 | 
						|
    var reg = new RegExp(escapeRegExp(separator), 'g');
 | 
						|
    return value.replace(reg, '');
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * Remove invalid characters
 | 
						|
 */
 | 
						|
var removeInvalidChars = function (value, validChars) {
 | 
						|
    var chars = escapeRegExp(validChars.join(''));
 | 
						|
    var reg = new RegExp("[^\\d" + chars + "]", 'gi');
 | 
						|
    return value.replace(reg, '');
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * Remove prefix, separators and extra decimals from value
 | 
						|
 */
 | 
						|
var cleanValue = function (_a) {
 | 
						|
    var value = _a.value, _b = _a.groupSeparator, groupSeparator = _b === void 0 ? ',' : _b, _c = _a.decimalSeparator, decimalSeparator = _c === void 0 ? '.' : _c, _d = _a.allowDecimals, allowDecimals = _d === void 0 ? true : _d, _e = _a.decimalsLimit, decimalsLimit = _e === void 0 ? 2 : _e, _f = _a.allowNegativeValue, allowNegativeValue = _f === void 0 ? true : _f, _g = _a.disableAbbreviations, disableAbbreviations = _g === void 0 ? false : _g, _h = _a.prefix, prefix = _h === void 0 ? '' : _h, _j = _a.transformRawValue, transformRawValue = _j === void 0 ? function (rawValue) { return rawValue; } : _j;
 | 
						|
    var transformedValue = transformRawValue(value);
 | 
						|
    if (transformedValue === '-') {
 | 
						|
        return transformedValue;
 | 
						|
    }
 | 
						|
    var abbreviations = disableAbbreviations ? [] : ['k', 'm', 'b'];
 | 
						|
    var reg = new RegExp("((^|\\D)-\\d)|(-" + escapeRegExp(prefix) + ")");
 | 
						|
    var isNegative = reg.test(transformedValue);
 | 
						|
    // Is there a digit before the prefix? eg. 1$
 | 
						|
    var _k = RegExp("(\\d+)-?" + escapeRegExp(prefix)).exec(value) || [], prefixWithValue = _k[0], preValue = _k[1];
 | 
						|
    var withoutPrefix = prefix
 | 
						|
        ? prefixWithValue
 | 
						|
            ? transformedValue.replace(prefixWithValue, '').concat(preValue)
 | 
						|
            : transformedValue.replace(prefix, '')
 | 
						|
        : transformedValue;
 | 
						|
    var withoutSeparators = removeSeparators(withoutPrefix, groupSeparator);
 | 
						|
    var withoutInvalidChars = removeInvalidChars(withoutSeparators, __spreadArray([
 | 
						|
        groupSeparator,
 | 
						|
        decimalSeparator
 | 
						|
    ], abbreviations));
 | 
						|
    var valueOnly = withoutInvalidChars;
 | 
						|
    if (!disableAbbreviations) {
 | 
						|
        // disallow letter without number
 | 
						|
        if (abbreviations.some(function (letter) { return letter === withoutInvalidChars.toLowerCase(); })) {
 | 
						|
            return '';
 | 
						|
        }
 | 
						|
        var parsed = parseAbbrValue(withoutInvalidChars, decimalSeparator);
 | 
						|
        if (parsed) {
 | 
						|
            valueOnly = String(parsed);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    var includeNegative = isNegative && allowNegativeValue ? '-' : '';
 | 
						|
    if (decimalSeparator && valueOnly.includes(decimalSeparator)) {
 | 
						|
        var _l = withoutInvalidChars.split(decimalSeparator), int = _l[0], decimals = _l[1];
 | 
						|
        var trimmedDecimals = decimalsLimit && decimals ? decimals.slice(0, decimalsLimit) : decimals;
 | 
						|
        var includeDecimals = allowDecimals ? "" + decimalSeparator + trimmedDecimals : '';
 | 
						|
        return "" + includeNegative + int + includeDecimals;
 | 
						|
    }
 | 
						|
    return "" + includeNegative + valueOnly;
 | 
						|
};
 | 
						|
 | 
						|
var fixedDecimalValue = function (value, decimalSeparator, fixedDecimalLength) {
 | 
						|
    if (fixedDecimalLength && value.length > 1) {
 | 
						|
        if (value.includes(decimalSeparator)) {
 | 
						|
            var _a = value.split(decimalSeparator), int = _a[0], decimals = _a[1];
 | 
						|
            if (decimals.length > fixedDecimalLength) {
 | 
						|
                return "" + int + decimalSeparator + decimals.slice(0, fixedDecimalLength);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        var reg = value.length > fixedDecimalLength
 | 
						|
            ? new RegExp("(\\d+)(\\d{" + fixedDecimalLength + "})")
 | 
						|
            : new RegExp("(\\d)(\\d+)");
 | 
						|
        var match = value.match(reg);
 | 
						|
        if (match) {
 | 
						|
            var int = match[1], decimals = match[2];
 | 
						|
            return "" + int + decimalSeparator + decimals;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return value;
 | 
						|
};
 | 
						|
 | 
						|
var getSuffix = function (value, _a) {
 | 
						|
    var _b = _a.groupSeparator, groupSeparator = _b === void 0 ? ',' : _b, _c = _a.decimalSeparator, decimalSeparator = _c === void 0 ? '.' : _c;
 | 
						|
    var suffixReg = new RegExp("\\d([^" + escapeRegExp(groupSeparator) + escapeRegExp(decimalSeparator) + "0-9]+)");
 | 
						|
    var suffixMatch = value.match(suffixReg);
 | 
						|
    return suffixMatch ? suffixMatch[1] : undefined;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * Format value with decimal separator, group separator and prefix
 | 
						|
 */
 | 
						|
var formatValue = function (options) {
 | 
						|
    var _value = options.value, decimalSeparator = options.decimalSeparator, intlConfig = options.intlConfig, decimalScale = options.decimalScale, _a = options.prefix, prefix = _a === void 0 ? '' : _a, _b = options.suffix, suffix = _b === void 0 ? '' : _b;
 | 
						|
    if (_value === '' || _value === undefined) {
 | 
						|
        return '';
 | 
						|
    }
 | 
						|
    if (_value === '-') {
 | 
						|
        return '-';
 | 
						|
    }
 | 
						|
    var isNegative = new RegExp("^\\d?-" + (prefix ? escapeRegExp(prefix) + "?" : '') + "\\d").test(_value);
 | 
						|
    var value = decimalSeparator !== '.'
 | 
						|
        ? replaceDecimalSeparator(_value, decimalSeparator, isNegative)
 | 
						|
        : _value;
 | 
						|
    var defaultNumberFormatOptions = {
 | 
						|
        minimumFractionDigits: decimalScale || 0,
 | 
						|
        maximumFractionDigits: 20,
 | 
						|
    };
 | 
						|
    var numberFormatter = intlConfig
 | 
						|
        ? new Intl.NumberFormat(intlConfig.locale, intlConfig.currency
 | 
						|
            ? __assign(__assign({}, defaultNumberFormatOptions), { style: 'currency', currency: intlConfig.currency }) : defaultNumberFormatOptions)
 | 
						|
        : new Intl.NumberFormat(undefined, defaultNumberFormatOptions);
 | 
						|
    var parts = numberFormatter.formatToParts(Number(value));
 | 
						|
    var formatted = replaceParts(parts, options);
 | 
						|
    // Does intl formatting add a suffix?
 | 
						|
    var intlSuffix = getSuffix(formatted, __assign({}, options));
 | 
						|
    // Include decimal separator if user input ends with decimal separator
 | 
						|
    var includeDecimalSeparator = _value.slice(-1) === decimalSeparator ? decimalSeparator : '';
 | 
						|
    var _c = value.match(RegExp('\\d+\\.(\\d+)')) || [], decimals = _c[1];
 | 
						|
    // Keep original decimal padding if no decimalScale
 | 
						|
    if (decimalScale === undefined && decimals && decimalSeparator) {
 | 
						|
        if (formatted.includes(decimalSeparator)) {
 | 
						|
            formatted = formatted.replace(RegExp("(\\d+)(" + escapeRegExp(decimalSeparator) + ")(\\d+)", 'g'), "$1$2" + decimals);
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            if (intlSuffix && !suffix) {
 | 
						|
                formatted = formatted.replace(intlSuffix, "" + decimalSeparator + decimals + intlSuffix);
 | 
						|
            }
 | 
						|
            else {
 | 
						|
                formatted = "" + formatted + decimalSeparator + decimals;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    if (suffix && includeDecimalSeparator) {
 | 
						|
        return "" + formatted + includeDecimalSeparator + suffix;
 | 
						|
    }
 | 
						|
    if (intlSuffix && includeDecimalSeparator) {
 | 
						|
        return formatted.replace(intlSuffix, "" + includeDecimalSeparator + intlSuffix);
 | 
						|
    }
 | 
						|
    if (intlSuffix && suffix) {
 | 
						|
        return formatted.replace(intlSuffix, "" + includeDecimalSeparator + suffix);
 | 
						|
    }
 | 
						|
    return [formatted, includeDecimalSeparator, suffix].join('');
 | 
						|
};
 | 
						|
/**
 | 
						|
 * Before converting to Number, decimal separator has to be .
 | 
						|
 */
 | 
						|
var replaceDecimalSeparator = function (value, decimalSeparator, isNegative) {
 | 
						|
    var newValue = value;
 | 
						|
    if (decimalSeparator && decimalSeparator !== '.') {
 | 
						|
        newValue = newValue.replace(RegExp(escapeRegExp(decimalSeparator), 'g'), '.');
 | 
						|
        if (isNegative && decimalSeparator === '-') {
 | 
						|
            newValue = "-" + newValue.slice(1);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return newValue;
 | 
						|
};
 | 
						|
var replaceParts = function (parts, _a) {
 | 
						|
    var prefix = _a.prefix, groupSeparator = _a.groupSeparator, decimalSeparator = _a.decimalSeparator, decimalScale = _a.decimalScale, _b = _a.disableGroupSeparators, disableGroupSeparators = _b === void 0 ? false : _b;
 | 
						|
    return parts
 | 
						|
        .reduce(function (prev, _a, i) {
 | 
						|
        var type = _a.type, value = _a.value;
 | 
						|
        if (i === 0 && prefix) {
 | 
						|
            if (type === 'minusSign') {
 | 
						|
                return [value, prefix];
 | 
						|
            }
 | 
						|
            if (type === 'currency') {
 | 
						|
                return __spreadArray(__spreadArray([], prev), [prefix]);
 | 
						|
            }
 | 
						|
            return [prefix, value];
 | 
						|
        }
 | 
						|
        if (type === 'currency') {
 | 
						|
            return prefix ? prev : __spreadArray(__spreadArray([], prev), [value]);
 | 
						|
        }
 | 
						|
        if (type === 'group') {
 | 
						|
            return !disableGroupSeparators
 | 
						|
                ? __spreadArray(__spreadArray([], prev), [groupSeparator !== undefined ? groupSeparator : value]) : prev;
 | 
						|
        }
 | 
						|
        if (type === 'decimal') {
 | 
						|
            if (decimalScale !== undefined && decimalScale === 0) {
 | 
						|
                return prev;
 | 
						|
            }
 | 
						|
            return __spreadArray(__spreadArray([], prev), [decimalSeparator !== undefined ? decimalSeparator : value]);
 | 
						|
        }
 | 
						|
        if (type === 'fraction') {
 | 
						|
            return __spreadArray(__spreadArray([], prev), [decimalScale !== undefined ? value.slice(0, decimalScale) : value]);
 | 
						|
        }
 | 
						|
        return __spreadArray(__spreadArray([], prev), [value]);
 | 
						|
    }, [''])
 | 
						|
        .join('');
 | 
						|
};
 | 
						|
 | 
						|
var defaultConfig = {
 | 
						|
    currencySymbol: '',
 | 
						|
    groupSeparator: '',
 | 
						|
    decimalSeparator: '',
 | 
						|
    prefix: '',
 | 
						|
    suffix: '',
 | 
						|
};
 | 
						|
/**
 | 
						|
 * Get locale config from input or default
 | 
						|
 */
 | 
						|
var getLocaleConfig = function (intlConfig) {
 | 
						|
    var _a = intlConfig || {}, locale = _a.locale, currency = _a.currency;
 | 
						|
    var numberFormatter = locale
 | 
						|
        ? new Intl.NumberFormat(locale, currency ? { currency: currency, style: 'currency' } : undefined)
 | 
						|
        : new Intl.NumberFormat();
 | 
						|
    return numberFormatter.formatToParts(1000.1).reduce(function (prev, curr, i) {
 | 
						|
        if (curr.type === 'currency') {
 | 
						|
            if (i === 0) {
 | 
						|
                return __assign(__assign({}, prev), { currencySymbol: curr.value, prefix: curr.value });
 | 
						|
            }
 | 
						|
            else {
 | 
						|
                return __assign(__assign({}, prev), { currencySymbol: curr.value, suffix: curr.value });
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (curr.type === 'group') {
 | 
						|
            return __assign(__assign({}, prev), { groupSeparator: curr.value });
 | 
						|
        }
 | 
						|
        if (curr.type === 'decimal') {
 | 
						|
            return __assign(__assign({}, prev), { decimalSeparator: curr.value });
 | 
						|
        }
 | 
						|
        return prev;
 | 
						|
    }, defaultConfig);
 | 
						|
};
 | 
						|
 | 
						|
var isNumber = function (input) { return RegExp(/\d/, 'gi').test(input); };
 | 
						|
 | 
						|
var padTrimValue = function (value, decimalSeparator, decimalScale) {
 | 
						|
    if (decimalSeparator === void 0) { decimalSeparator = '.'; }
 | 
						|
    if (decimalScale === undefined || value === '' || value === undefined) {
 | 
						|
        return value;
 | 
						|
    }
 | 
						|
    if (!value.match(/\d/g)) {
 | 
						|
        return '';
 | 
						|
    }
 | 
						|
    var _a = value.split(decimalSeparator), int = _a[0], decimals = _a[1];
 | 
						|
    if (decimalScale === 0) {
 | 
						|
        return int;
 | 
						|
    }
 | 
						|
    var newValue = decimals || '';
 | 
						|
    if (newValue.length < decimalScale) {
 | 
						|
        while (newValue.length < decimalScale) {
 | 
						|
            newValue += '0';
 | 
						|
        }
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        newValue = newValue.slice(0, decimalScale);
 | 
						|
    }
 | 
						|
    return "" + int + decimalSeparator + newValue;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * Based on the last key stroke and the cursor position, update the value
 | 
						|
 * and reposition the cursor to the right place
 | 
						|
 */
 | 
						|
var repositionCursor = function (_a) {
 | 
						|
    var selectionStart = _a.selectionStart, value = _a.value, lastKeyStroke = _a.lastKeyStroke, stateValue = _a.stateValue, groupSeparator = _a.groupSeparator;
 | 
						|
    var cursorPosition = selectionStart;
 | 
						|
    var modifiedValue = value;
 | 
						|
    if (stateValue && cursorPosition) {
 | 
						|
        var splitValue = value.split('');
 | 
						|
        // if cursor is to right of groupSeparator and backspace pressed, delete the character to the left of the separator and reposition the cursor
 | 
						|
        if (lastKeyStroke === 'Backspace' && stateValue[cursorPosition] === groupSeparator) {
 | 
						|
            splitValue.splice(cursorPosition - 1, 1);
 | 
						|
            cursorPosition -= 1;
 | 
						|
        }
 | 
						|
        // if cursor is to left of groupSeparator and delete pressed, delete the character to the right of the separator and reposition the cursor
 | 
						|
        if (lastKeyStroke === 'Delete' && stateValue[cursorPosition] === groupSeparator) {
 | 
						|
            splitValue.splice(cursorPosition, 1);
 | 
						|
            cursorPosition += 1;
 | 
						|
        }
 | 
						|
        modifiedValue = splitValue.join('');
 | 
						|
        return { modifiedValue: modifiedValue, cursorPosition: cursorPosition };
 | 
						|
    }
 | 
						|
    return { modifiedValue: modifiedValue, cursorPosition: selectionStart };
 | 
						|
};
 | 
						|
 | 
						|
var CurrencyInput = forwardRef(function (_a, ref) {
 | 
						|
    var _b = _a.allowDecimals, allowDecimals = _b === void 0 ? true : _b, _c = _a.allowNegativeValue, allowNegativeValue = _c === void 0 ? true : _c, id = _a.id, name = _a.name, className = _a.className, customInput = _a.customInput, decimalsLimit = _a.decimalsLimit, defaultValue = _a.defaultValue, _d = _a.disabled, disabled = _d === void 0 ? false : _d, userMaxLength = _a.maxLength, userValue = _a.value, onValueChange = _a.onValueChange, fixedDecimalLength = _a.fixedDecimalLength, placeholder = _a.placeholder, decimalScale = _a.decimalScale, prefix = _a.prefix, suffix = _a.suffix, intlConfig = _a.intlConfig, step = _a.step, min = _a.min, max = _a.max, _e = _a.disableGroupSeparators, disableGroupSeparators = _e === void 0 ? false : _e, _f = _a.disableAbbreviations, disableAbbreviations = _f === void 0 ? false : _f, _decimalSeparator = _a.decimalSeparator, _groupSeparator = _a.groupSeparator, onChange = _a.onChange, onFocus = _a.onFocus, onBlur = _a.onBlur, onKeyDown = _a.onKeyDown, onKeyUp = _a.onKeyUp, transformRawValue = _a.transformRawValue, props = __rest(_a, ["allowDecimals", "allowNegativeValue", "id", "name", "className", "customInput", "decimalsLimit", "defaultValue", "disabled", "maxLength", "value", "onValueChange", "fixedDecimalLength", "placeholder", "decimalScale", "prefix", "suffix", "intlConfig", "step", "min", "max", "disableGroupSeparators", "disableAbbreviations", "decimalSeparator", "groupSeparator", "onChange", "onFocus", "onBlur", "onKeyDown", "onKeyUp", "transformRawValue"]);
 | 
						|
    if (_decimalSeparator && isNumber(_decimalSeparator)) {
 | 
						|
        throw new Error('decimalSeparator cannot be a number');
 | 
						|
    }
 | 
						|
    if (_groupSeparator && isNumber(_groupSeparator)) {
 | 
						|
        throw new Error('groupSeparator cannot be a number');
 | 
						|
    }
 | 
						|
    var localeConfig = useMemo(function () { return getLocaleConfig(intlConfig); }, [intlConfig]);
 | 
						|
    var decimalSeparator = _decimalSeparator || localeConfig.decimalSeparator || '';
 | 
						|
    var groupSeparator = _groupSeparator || localeConfig.groupSeparator || '';
 | 
						|
    if (decimalSeparator &&
 | 
						|
        groupSeparator &&
 | 
						|
        decimalSeparator === groupSeparator &&
 | 
						|
        disableGroupSeparators === false) {
 | 
						|
        throw new Error('decimalSeparator cannot be the same as groupSeparator');
 | 
						|
    }
 | 
						|
    var formatValueOptions = {
 | 
						|
        decimalSeparator: decimalSeparator,
 | 
						|
        groupSeparator: groupSeparator,
 | 
						|
        disableGroupSeparators: disableGroupSeparators,
 | 
						|
        intlConfig: intlConfig,
 | 
						|
        prefix: prefix || localeConfig.prefix,
 | 
						|
        suffix: suffix,
 | 
						|
    };
 | 
						|
    var cleanValueOptions = {
 | 
						|
        decimalSeparator: decimalSeparator,
 | 
						|
        groupSeparator: groupSeparator,
 | 
						|
        allowDecimals: allowDecimals,
 | 
						|
        decimalsLimit: decimalsLimit || fixedDecimalLength || 2,
 | 
						|
        allowNegativeValue: allowNegativeValue,
 | 
						|
        disableAbbreviations: disableAbbreviations,
 | 
						|
        prefix: prefix || localeConfig.prefix,
 | 
						|
        transformRawValue: transformRawValue,
 | 
						|
    };
 | 
						|
    var formattedStateValue = defaultValue !== undefined && defaultValue !== null
 | 
						|
        ? formatValue(__assign(__assign({}, formatValueOptions), { decimalScale: decimalScale, value: String(defaultValue) }))
 | 
						|
        : userValue !== undefined && userValue !== null
 | 
						|
            ? formatValue(__assign(__assign({}, formatValueOptions), { decimalScale: decimalScale, value: String(userValue) }))
 | 
						|
            : '';
 | 
						|
    var _g = useState(formattedStateValue), stateValue = _g[0], setStateValue = _g[1];
 | 
						|
    var _h = useState(false), dirty = _h[0], setDirty = _h[1];
 | 
						|
    var _j = useState(0), cursor = _j[0], setCursor = _j[1];
 | 
						|
    var _k = useState(0), changeCount = _k[0], setChangeCount = _k[1];
 | 
						|
    var _l = useState(null), lastKeyStroke = _l[0], setLastKeyStroke = _l[1];
 | 
						|
    var inputRef = ref || useRef(null);
 | 
						|
    /**
 | 
						|
     * Process change in value
 | 
						|
     */
 | 
						|
    var processChange = function (value, selectionStart) {
 | 
						|
        setDirty(true);
 | 
						|
        var _a = repositionCursor({
 | 
						|
            selectionStart: selectionStart,
 | 
						|
            value: value,
 | 
						|
            lastKeyStroke: lastKeyStroke,
 | 
						|
            stateValue: stateValue,
 | 
						|
            groupSeparator: groupSeparator,
 | 
						|
        }), modifiedValue = _a.modifiedValue, cursorPosition = _a.cursorPosition;
 | 
						|
        var stringValue = cleanValue(__assign({ value: modifiedValue }, cleanValueOptions));
 | 
						|
        if (userMaxLength && stringValue.replace(/-/g, '').length > userMaxLength) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        if (stringValue === '' || stringValue === '-' || stringValue === decimalSeparator) {
 | 
						|
            onValueChange && onValueChange(undefined, name, { float: null, formatted: '', value: '' });
 | 
						|
            setStateValue(stringValue);
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        var stringValueWithoutSeparator = decimalSeparator
 | 
						|
            ? stringValue.replace(decimalSeparator, '.')
 | 
						|
            : stringValue;
 | 
						|
        var numberValue = parseFloat(stringValueWithoutSeparator);
 | 
						|
        var formattedValue = formatValue(__assign({ value: stringValue }, formatValueOptions));
 | 
						|
        if (cursorPosition !== undefined && cursorPosition !== null) {
 | 
						|
            // Prevent cursor jumping
 | 
						|
            var newCursor = cursorPosition + (formattedValue.length - value.length);
 | 
						|
            newCursor = newCursor <= 0 ? (prefix ? prefix.length : 0) : newCursor;
 | 
						|
            setCursor(newCursor);
 | 
						|
            setChangeCount(changeCount + 1);
 | 
						|
        }
 | 
						|
        setStateValue(formattedValue);
 | 
						|
        if (onValueChange) {
 | 
						|
            var values = {
 | 
						|
                float: numberValue,
 | 
						|
                formatted: formattedValue,
 | 
						|
                value: stringValue,
 | 
						|
            };
 | 
						|
            onValueChange(stringValue, name, values);
 | 
						|
        }
 | 
						|
    };
 | 
						|
    /**
 | 
						|
     * Handle change event
 | 
						|
     */
 | 
						|
    var handleOnChange = function (event) {
 | 
						|
        var _a = event.target, value = _a.value, selectionStart = _a.selectionStart;
 | 
						|
        processChange(value, selectionStart);
 | 
						|
        onChange && onChange(event);
 | 
						|
    };
 | 
						|
    /**
 | 
						|
     * Handle focus event
 | 
						|
     */
 | 
						|
    var handleOnFocus = function (event) {
 | 
						|
        onFocus && onFocus(event);
 | 
						|
        return stateValue ? stateValue.length : 0;
 | 
						|
    };
 | 
						|
    /**
 | 
						|
     * Handle blur event
 | 
						|
     *
 | 
						|
     * Format value by padding/trimming decimals if required by
 | 
						|
     */
 | 
						|
    var handleOnBlur = function (event) {
 | 
						|
        var value = event.target.value;
 | 
						|
        var valueOnly = cleanValue(__assign({ value: value }, cleanValueOptions));
 | 
						|
        if (valueOnly === '-' || !valueOnly) {
 | 
						|
            setStateValue('');
 | 
						|
            onBlur && onBlur(event);
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        var fixedDecimals = fixedDecimalValue(valueOnly, decimalSeparator, fixedDecimalLength);
 | 
						|
        var newValue = padTrimValue(fixedDecimals, decimalSeparator, decimalScale !== undefined ? decimalScale : fixedDecimalLength);
 | 
						|
        var numberValue = parseFloat(newValue.replace(decimalSeparator, '.'));
 | 
						|
        var formattedValue = formatValue(__assign(__assign({}, formatValueOptions), { value: newValue }));
 | 
						|
        if (onValueChange) {
 | 
						|
            onValueChange(newValue, name, {
 | 
						|
                float: numberValue,
 | 
						|
                formatted: formattedValue,
 | 
						|
                value: newValue,
 | 
						|
            });
 | 
						|
        }
 | 
						|
        setStateValue(formattedValue);
 | 
						|
        onBlur && onBlur(event);
 | 
						|
    };
 | 
						|
    /**
 | 
						|
     * Handle key down event
 | 
						|
     *
 | 
						|
     * Increase or decrease value by step
 | 
						|
     */
 | 
						|
    var handleOnKeyDown = function (event) {
 | 
						|
        var key = event.key;
 | 
						|
        setLastKeyStroke(key);
 | 
						|
        if (step && (key === 'ArrowUp' || key === 'ArrowDown')) {
 | 
						|
            event.preventDefault();
 | 
						|
            setCursor(stateValue.length);
 | 
						|
            var currentValue = parseFloat(userValue !== undefined && userValue !== null
 | 
						|
                ? String(userValue).replace(decimalSeparator, '.')
 | 
						|
                : cleanValue(__assign({ value: stateValue }, cleanValueOptions))) || 0;
 | 
						|
            var newValue = key === 'ArrowUp' ? currentValue + step : currentValue - step;
 | 
						|
            if (min !== undefined && newValue < min) {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            if (max !== undefined && newValue > max) {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            var fixedLength = String(step).includes('.')
 | 
						|
                ? Number(String(step).split('.')[1].length)
 | 
						|
                : undefined;
 | 
						|
            processChange(String(fixedLength ? newValue.toFixed(fixedLength) : newValue).replace('.', decimalSeparator));
 | 
						|
        }
 | 
						|
        onKeyDown && onKeyDown(event);
 | 
						|
    };
 | 
						|
    /**
 | 
						|
     * Handle key up event
 | 
						|
     *
 | 
						|
     * Move cursor if there is a suffix to prevent user typing past suffix
 | 
						|
     */
 | 
						|
    var handleOnKeyUp = function (event) {
 | 
						|
        var key = event.key, selectionStart = event.currentTarget.selectionStart;
 | 
						|
        if (key !== 'ArrowUp' && key !== 'ArrowDown' && stateValue !== '-') {
 | 
						|
            var suffix_1 = getSuffix(stateValue, { groupSeparator: groupSeparator, decimalSeparator: decimalSeparator });
 | 
						|
            if (suffix_1 && selectionStart && selectionStart > stateValue.length - suffix_1.length) {
 | 
						|
                /* istanbul ignore else */
 | 
						|
                if (inputRef && typeof inputRef === 'object' && inputRef.current) {
 | 
						|
                    var newCursor = stateValue.length - suffix_1.length;
 | 
						|
                    inputRef.current.setSelectionRange(newCursor, newCursor);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        onKeyUp && onKeyUp(event);
 | 
						|
    };
 | 
						|
    useEffect(function () {
 | 
						|
        // prevent cursor jumping if editing value
 | 
						|
        if (dirty &&
 | 
						|
            stateValue !== '-' &&
 | 
						|
            inputRef &&
 | 
						|
            typeof inputRef === 'object' &&
 | 
						|
            inputRef.current &&
 | 
						|
            document.activeElement === inputRef.current) {
 | 
						|
            inputRef.current.setSelectionRange(cursor, cursor);
 | 
						|
        }
 | 
						|
    }, [stateValue, cursor, inputRef, dirty, changeCount]);
 | 
						|
    /**
 | 
						|
     * If user has only entered "-" or decimal separator,
 | 
						|
     * keep the char to allow them to enter next value
 | 
						|
     */
 | 
						|
    var getRenderValue = function () {
 | 
						|
        if (userValue !== undefined &&
 | 
						|
            userValue !== null &&
 | 
						|
            stateValue !== '-' &&
 | 
						|
            (!decimalSeparator || stateValue !== decimalSeparator)) {
 | 
						|
            return formatValue(__assign(__assign({}, formatValueOptions), { decimalScale: dirty ? undefined : decimalScale, value: String(userValue) }));
 | 
						|
        }
 | 
						|
        return stateValue;
 | 
						|
    };
 | 
						|
    var inputProps = __assign({ type: 'text', inputMode: 'decimal', id: id,
 | 
						|
        name: name,
 | 
						|
        className: className, onChange: handleOnChange, onBlur: handleOnBlur, onFocus: handleOnFocus, onKeyDown: handleOnKeyDown, onKeyUp: handleOnKeyUp, placeholder: placeholder,
 | 
						|
        disabled: disabled, value: getRenderValue(), ref: inputRef }, props);
 | 
						|
    if (customInput) {
 | 
						|
        var CustomInput = customInput;
 | 
						|
        return React.createElement(CustomInput, __assign({}, inputProps));
 | 
						|
    }
 | 
						|
    return React.createElement("input", __assign({}, inputProps));
 | 
						|
});
 | 
						|
CurrencyInput.displayName = 'CurrencyInput';
 | 
						|
 | 
						|
export default CurrencyInput;
 | 
						|
export { formatValue };
 | 
						|
//# sourceMappingURL=index.esm.js.map
 |