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
			| 
											3 years ago
										 | 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
 |