@activecollab/components 2.0.226 → 2.0.228
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.
- package/dist/cjs/components/ChooseV2/ChooseV2.js +60 -0
- package/dist/cjs/components/ChooseV2/ChooseV2.js.map +1 -0
- package/dist/cjs/components/ChooseV2/index.js +17 -0
- package/dist/cjs/components/ChooseV2/index.js.map +1 -0
- package/dist/cjs/components/Input/InputNumber.js.map +1 -1
- package/dist/cjs/components/index.js +11 -0
- package/dist/cjs/components/index.js.map +1 -1
- package/dist/cjs/hooks/useInputNumber.js +77 -45
- package/dist/cjs/hooks/useInputNumber.js.map +1 -1
- package/dist/cjs/utils/currencyUtils.js +1 -0
- package/dist/cjs/utils/currencyUtils.js.map +1 -1
- package/dist/cjs/utils/currencyUtils.test.js +16 -0
- package/dist/cjs/utils/currencyUtils.test.js.map +1 -1
- package/dist/esm/components/ChooseV2/ChooseV2.d.ts +16 -0
- package/dist/esm/components/ChooseV2/ChooseV2.d.ts.map +1 -0
- package/dist/esm/components/ChooseV2/ChooseV2.js +42 -0
- package/dist/esm/components/ChooseV2/ChooseV2.js.map +1 -0
- package/dist/esm/components/ChooseV2/index.d.ts +2 -0
- package/dist/esm/components/ChooseV2/index.d.ts.map +1 -0
- package/dist/esm/components/ChooseV2/index.js +2 -0
- package/dist/esm/components/ChooseV2/index.js.map +1 -0
- package/dist/esm/components/Input/InputNumber.d.ts +2 -0
- package/dist/esm/components/Input/InputNumber.d.ts.map +1 -1
- package/dist/esm/components/Input/InputNumber.js.map +1 -1
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +1 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/hooks/useInputNumber.d.ts +8 -6
- package/dist/esm/hooks/useInputNumber.d.ts.map +1 -1
- package/dist/esm/hooks/useInputNumber.js +53 -31
- package/dist/esm/hooks/useInputNumber.js.map +1 -1
- package/dist/esm/utils/currencyUtils.d.ts +1 -1
- package/dist/esm/utils/currencyUtils.d.ts.map +1 -1
- package/dist/esm/utils/currencyUtils.js +1 -0
- package/dist/esm/utils/currencyUtils.js.map +1 -1
- package/dist/esm/utils/currencyUtils.test.js +16 -0
- package/dist/esm/utils/currencyUtils.test.js.map +1 -1
- package/dist/index.js +129 -48
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { MouseEvent, RefObject } from "react";
|
|
2
2
|
export type Separators = "." | "," | " " | "";
|
|
3
|
+
export type InputNumberValue = number | undefined;
|
|
3
4
|
export interface IInputNumber {
|
|
4
5
|
decimalLength?: number;
|
|
5
6
|
decimalSeparator?: Separators;
|
|
@@ -7,19 +8,19 @@ export interface IInputNumber {
|
|
|
7
8
|
disableMacros?: boolean;
|
|
8
9
|
thousandSeparator?: Separators;
|
|
9
10
|
trimDecimals?: boolean;
|
|
10
|
-
|
|
11
|
-
value?: string | number;
|
|
11
|
+
value?: number;
|
|
12
12
|
step?: number;
|
|
13
13
|
limit?: number;
|
|
14
|
-
onEnterKeyPress?: (val:
|
|
15
|
-
onChange?: (val:
|
|
14
|
+
onEnterKeyPress?: (val: InputNumberValue) => void;
|
|
15
|
+
onChange?: (val: InputNumberValue) => void;
|
|
16
16
|
onClick?: (event: MouseEvent<HTMLInputElement>) => void;
|
|
17
17
|
allowEmptyValue?: boolean;
|
|
18
18
|
onCancel?: (e: Event) => void;
|
|
19
|
+
onSave?: (e: Event) => void;
|
|
19
20
|
onBlur?: (e: Event) => void;
|
|
20
21
|
validation?: (value: string, disableMacros: boolean, decimalSeparator: string, decimalLength: number, limit?: number) => boolean;
|
|
21
|
-
min?:
|
|
22
|
-
max?:
|
|
22
|
+
min?: number;
|
|
23
|
+
max?: number;
|
|
23
24
|
update?: boolean;
|
|
24
25
|
shortenThreshold?: number;
|
|
25
26
|
}
|
|
@@ -33,5 +34,6 @@ export declare const useInputNumber: ({ decimalSeparator, thousandSeparator, dis
|
|
|
33
34
|
onFocus: () => void;
|
|
34
35
|
focused: boolean;
|
|
35
36
|
unformattedValue: string;
|
|
37
|
+
numericValue: number | undefined;
|
|
36
38
|
};
|
|
37
39
|
//# sourceMappingURL=useInputNumber.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputNumber.d.ts","sourceRoot":"","sources":["../../../src/hooks/useInputNumber.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGV,SAAS,EAEV,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useInputNumber.d.ts","sourceRoot":"","sources":["../../../src/hooks/useInputNumber.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGV,SAAS,EAEV,MAAM,OAAO,CAAC;AASf,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,CACX,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,EACtB,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,KACX,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc,iQAuBtB,YAAY,YACL,UAAU,gBAAgB,GAAG,IAAI,CAAC;;;;;;;;;;;CAya7C,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useRef, useCallback, useEffect } from "react";
|
|
2
2
|
import { validateNumberInput } from "../utils";
|
|
3
|
-
import { currencyMultiplier, formatNumber } from "../utils/currencyUtils";
|
|
3
|
+
import { currencyMultiplier, formatNumber, getNumberFromString } from "../utils/currencyUtils";
|
|
4
4
|
export const useInputNumber = (_ref, inputRef) => {
|
|
5
5
|
let {
|
|
6
6
|
decimalSeparator = ".",
|
|
@@ -8,7 +8,7 @@ export const useInputNumber = (_ref, inputRef) => {
|
|
|
8
8
|
disableAbbreviation,
|
|
9
9
|
disableMacros,
|
|
10
10
|
decimalLength,
|
|
11
|
-
value =
|
|
11
|
+
value = undefined,
|
|
12
12
|
onChange,
|
|
13
13
|
onSave,
|
|
14
14
|
onEnterKeyPress,
|
|
@@ -29,17 +29,21 @@ export const useInputNumber = (_ref, inputRef) => {
|
|
|
29
29
|
if (!isMaxValid) {
|
|
30
30
|
console.warn("Warning: The maximum value is set to be lower than the minimum value. The maximum value will be ignored.");
|
|
31
31
|
}
|
|
32
|
+
const [numericValue, setNumericValue] = useState(() => value);
|
|
33
|
+
const [prevNumericValue, setPrevNumericValue] = useState(() => value);
|
|
32
34
|
const [currentValue, setCurrentValue] = useState(() => formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short", shortenThreshold));
|
|
33
35
|
const [prevValue, setPrevValue] = useState(() => formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short", shortenThreshold));
|
|
34
36
|
const [unformattedValue, setUnformattedValue] = useState(() => formatNumber(value, "", decimalSeparator, false, decimalLength, "long", shortenThreshold));
|
|
35
37
|
const [unformattedPrevValue, setUnformattedPrevValue] = useState(() => formatNumber(value, "", decimalSeparator, false, decimalLength, "long", shortenThreshold));
|
|
36
38
|
const [focused, setFocused] = useState(false);
|
|
37
39
|
useEffect(() => {
|
|
38
|
-
if (value !==
|
|
40
|
+
if (value !== prevNumericValue && (!focused || update)) {
|
|
39
41
|
setCurrentValue(formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short", shortenThreshold));
|
|
40
42
|
setPrevValue(formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short", shortenThreshold));
|
|
41
43
|
setUnformattedValue(formatNumber(value, "", decimalSeparator, false, decimalLength, "long", shortenThreshold));
|
|
42
44
|
setUnformattedPrevValue(formatNumber(value, "", decimalSeparator, false, decimalLength, "long", shortenThreshold));
|
|
45
|
+
setNumericValue(value);
|
|
46
|
+
setPrevNumericValue(value);
|
|
43
47
|
}
|
|
44
48
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
45
49
|
}, [disableAbbreviation, thousandSeparator, decimalSeparator, decimalLength, trimDecimals, value, focused]);
|
|
@@ -48,23 +52,31 @@ export const useInputNumber = (_ref, inputRef) => {
|
|
|
48
52
|
if (escapeRef.current) {
|
|
49
53
|
setCurrentValue(prevValue);
|
|
50
54
|
setUnformattedValue(unformattedPrevValue);
|
|
51
|
-
|
|
55
|
+
setNumericValue(prevNumericValue);
|
|
56
|
+
if (onChange) onChange(prevNumericValue);
|
|
52
57
|
} else {
|
|
53
58
|
if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {
|
|
54
59
|
const _value = formatNumber(currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short", shortenThreshold);
|
|
60
|
+
const _unformatedValue = formatNumber(currentValue, "", decimalSeparator, false, decimalLength, "long", shortenThreshold);
|
|
61
|
+
const _numericValue = getNumberFromString(_unformatedValue, thousandSeparator, decimalSeparator);
|
|
55
62
|
setPrevValue(_value);
|
|
56
|
-
setUnformattedPrevValue(
|
|
57
|
-
setUnformattedValue(
|
|
63
|
+
setUnformattedPrevValue(_unformatedValue);
|
|
64
|
+
setUnformattedValue(_unformatedValue);
|
|
65
|
+
setNumericValue(_numericValue);
|
|
66
|
+
setPrevNumericValue(_numericValue);
|
|
67
|
+
if (_numericValue !== prevNumericValue) onChange == null || onChange(_numericValue);
|
|
58
68
|
setCurrentValue(_value);
|
|
59
69
|
typeof onSave === "function" && onSave(e);
|
|
60
70
|
} else {
|
|
61
71
|
if (!allowEmptyValue) {
|
|
62
72
|
setCurrentValue(prevValue);
|
|
63
73
|
setUnformattedValue(unformattedPrevValue);
|
|
74
|
+
setNumericValue(prevNumericValue);
|
|
75
|
+
onChange == null || onChange(prevNumericValue);
|
|
64
76
|
typeof onCancel === "function" && onCancel(e);
|
|
65
77
|
} else {
|
|
66
|
-
if (
|
|
67
|
-
onSave(e);
|
|
78
|
+
if (prevValue !== e.target.value) {
|
|
79
|
+
onSave == null || onSave(e);
|
|
68
80
|
} else {
|
|
69
81
|
typeof onCancel === "function" && onCancel(e);
|
|
70
82
|
}
|
|
@@ -73,52 +85,51 @@ export const useInputNumber = (_ref, inputRef) => {
|
|
|
73
85
|
}
|
|
74
86
|
setFocused(false);
|
|
75
87
|
typeof onBlur === "function" && onBlur(e);
|
|
76
|
-
}, [onBlur, prevValue, unformattedPrevValue,
|
|
88
|
+
}, [currentValue, onBlur, prevValue, unformattedPrevValue, prevNumericValue, onChange, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation, shortenThreshold, onSave, allowEmptyValue, onCancel]);
|
|
77
89
|
const updateValue = useCallback(type => {
|
|
78
|
-
|
|
79
|
-
const numericValue = parseFloat(preformattedValue);
|
|
80
|
-
if (isNaN(numericValue)) return;
|
|
81
|
-
if (max !== undefined && numericValue > Number(max) || min !== undefined && numericValue < Number(min)) {
|
|
90
|
+
if (max !== undefined && Number(numericValue) > max || min !== undefined && Number(numericValue) < min) {
|
|
82
91
|
return;
|
|
83
92
|
}
|
|
84
93
|
let newValue = numericValue;
|
|
85
94
|
if (type === "increment") {
|
|
86
|
-
if (max === undefined || numericValue + step <=
|
|
87
|
-
newValue = numericValue + step;
|
|
88
|
-
} else if (numericValue <
|
|
89
|
-
newValue =
|
|
95
|
+
if (max === undefined || Number(numericValue) + step <= max) {
|
|
96
|
+
newValue = Number(numericValue) + step;
|
|
97
|
+
} else if (Number(numericValue) < max) {
|
|
98
|
+
newValue = max;
|
|
90
99
|
} else {
|
|
91
100
|
return;
|
|
92
101
|
}
|
|
93
102
|
} else if (type === "decrement") {
|
|
94
|
-
if (min === undefined || numericValue - step >=
|
|
95
|
-
newValue = numericValue - step;
|
|
96
|
-
} else if (numericValue >
|
|
97
|
-
newValue =
|
|
103
|
+
if (min === undefined || Number(numericValue) - step >= min) {
|
|
104
|
+
newValue = Number(numericValue) - step;
|
|
105
|
+
} else if (Number(numericValue) > min) {
|
|
106
|
+
newValue = min;
|
|
98
107
|
} else {
|
|
99
108
|
return;
|
|
100
109
|
}
|
|
101
110
|
}
|
|
102
111
|
let formattedValue;
|
|
103
112
|
if (decimalLength !== undefined) {
|
|
104
|
-
formattedValue = newValue.toFixed(decimalLength);
|
|
113
|
+
formattedValue = Number(newValue).toFixed(decimalLength);
|
|
105
114
|
} else {
|
|
106
|
-
formattedValue = newValue.toFixed(2);
|
|
115
|
+
formattedValue = Number(newValue).toFixed(2);
|
|
107
116
|
}
|
|
108
117
|
if (decimalLength !== undefined && decimalLength === 0) {
|
|
109
|
-
formattedValue = Math.round(newValue).toString();
|
|
118
|
+
formattedValue = Math.round(Number(newValue)).toString();
|
|
110
119
|
}
|
|
111
120
|
if (formattedValue.includes(".") || formattedValue.includes(",")) {
|
|
112
121
|
formattedValue = formattedValue.replace(".", decimalSeparator);
|
|
113
122
|
}
|
|
123
|
+
setNumericValue(newValue);
|
|
124
|
+
setPrevNumericValue(newValue);
|
|
114
125
|
setUnformattedValue(formattedValue);
|
|
115
126
|
setCurrentValue(formattedValue);
|
|
116
|
-
if (onChange) onChange(
|
|
117
|
-
}, [
|
|
127
|
+
if (onChange) onChange(newValue);
|
|
128
|
+
}, [max, numericValue, min, decimalLength, onChange, step, decimalSeparator]);
|
|
118
129
|
const handleKeyDown = useCallback(e => {
|
|
119
130
|
if (e.key === "Enter") {
|
|
120
131
|
e.target.blur();
|
|
121
|
-
if (typeof onEnterKeyPress === "function") onEnterKeyPress(
|
|
132
|
+
if (typeof onEnterKeyPress === "function") onEnterKeyPress(numericValue);
|
|
122
133
|
}
|
|
123
134
|
if (e.key === "ArrowLeft") {
|
|
124
135
|
return;
|
|
@@ -179,25 +190,35 @@ export const useInputNumber = (_ref, inputRef) => {
|
|
|
179
190
|
e.preventDefault();
|
|
180
191
|
return;
|
|
181
192
|
}
|
|
182
|
-
}, [decimalLength, decimalSeparator, disableMacros, inputRef, limit, min, onCancel, onEnterKeyPress, updateValue, validation]);
|
|
193
|
+
}, [decimalLength, decimalSeparator, disableMacros, inputRef, limit, min, numericValue, onCancel, onEnterKeyPress, updateValue, validation]);
|
|
183
194
|
const handleChange = useCallback(e => {
|
|
184
195
|
const inputValue = e.target.value;
|
|
196
|
+
let numericNewValue = undefined;
|
|
185
197
|
const numericInput = disableMacros ? inputValue : inputValue.replace(/(\d+(?:[.,]\d+)?)([kmbtKMBT])/, (_, num, unit) => {
|
|
186
198
|
const normalizedNum = num.replace(",", ".");
|
|
187
199
|
const parts = normalizedNum.split(".");
|
|
188
200
|
const integerPart = parts[0];
|
|
189
201
|
const fractionalPart = parts[1];
|
|
190
202
|
const newInteger = parseInt(integerPart, 10) * currencyMultiplier[unit.toLowerCase()];
|
|
203
|
+
numericNewValue = parseFloat((newInteger ? newInteger : 0) + "." + (fractionalPart ? fractionalPart : 0));
|
|
191
204
|
let result = newInteger.toString();
|
|
192
205
|
if (fractionalPart !== undefined) {
|
|
193
206
|
result += decimalSeparator + fractionalPart;
|
|
194
207
|
}
|
|
195
208
|
return result;
|
|
196
209
|
});
|
|
210
|
+
if (numericNewValue === undefined) {
|
|
211
|
+
if (inputValue) {
|
|
212
|
+
numericNewValue = parseFloat(inputValue.replace(",", "."));
|
|
213
|
+
} else {
|
|
214
|
+
numericNewValue = undefined;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
197
217
|
setCurrentValue(numericInput);
|
|
198
218
|
setUnformattedValue(numericInput);
|
|
199
|
-
|
|
200
|
-
|
|
219
|
+
setNumericValue(numericNewValue);
|
|
220
|
+
if (onChange && numericNewValue !== numericValue) onChange(numericNewValue);
|
|
221
|
+
}, [disableMacros, onChange, numericValue, decimalSeparator]);
|
|
201
222
|
const handleClick = useCallback(e => {
|
|
202
223
|
if (typeof onClick === "function") {
|
|
203
224
|
onClick(e);
|
|
@@ -222,7 +243,8 @@ export const useInputNumber = (_ref, inputRef) => {
|
|
|
222
243
|
onDoubleClick: handleDoubleClick,
|
|
223
244
|
onFocus: handleFocus,
|
|
224
245
|
focused,
|
|
225
|
-
unformattedValue
|
|
246
|
+
unformattedValue,
|
|
247
|
+
numericValue
|
|
226
248
|
};
|
|
227
249
|
};
|
|
228
250
|
//# sourceMappingURL=useInputNumber.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputNumber.js","names":["useState","useRef","useCallback","useEffect","validateNumberInput","currencyMultiplier","formatNumber","useInputNumber","_ref","inputRef","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","onChange","onSave","onEnterKeyPress","onClick","onCancel","allowEmptyValue","step","trimDecimals","limit","validation","min","max","onBlur","update","shortenThreshold","isMaxValid","undefined","Number","console","warn","currentValue","setCurrentValue","prevValue","setPrevValue","unformattedValue","setUnformattedValue","unformattedPrevValue","setUnformattedPrevValue","focused","setFocused","escapeRef","handleBlur","e","current","String","target","trim","length","_value","updateValue","type","preformattedValue","replace","numericValue","parseFloat","isNaN","newValue","formattedValue","toFixed","Math","round","toString","includes","handleKeyDown","key","blur","preventDefault","metaKey","ctrlKey","_inputRef$current","select","input","start","selectionStart","end","selectionEnd","substring","Boolean","handleChange","inputValue","numericInput","_","num","unit","normalizedNum","parts","split","integerPart","fractionalPart","newInteger","parseInt","toLowerCase","result","handleClick","handleFocus","handleDoubleClick","_inputRef$current2","onKeyDown","onDoubleClick","onFocus"],"sources":["../../../src/hooks/useInputNumber.tsx"],"sourcesContent":["import {\n useState,\n MouseEvent,\n useRef,\n useCallback,\n RefObject,\n useEffect,\n} from \"react\";\n\nimport { validateNumberInput } from \"../utils\";\nimport { currencyMultiplier, formatNumber } from \"../utils/currencyUtils\";\n\nexport type Separators = \".\" | \",\" | \" \" | \"\";\n\nexport interface IInputNumber {\n decimalLength?: number;\n decimalSeparator?: Separators;\n disableAbbreviation?: boolean;\n disableMacros?: boolean;\n thousandSeparator?: Separators;\n trimDecimals?: boolean;\n onSave?: (e: Event) => void;\n value?: string | number;\n step?: number;\n limit?: number;\n onEnterKeyPress?: (val: string) => void;\n onChange?: (val: string) => void;\n onClick?: (event: MouseEvent<HTMLInputElement>) => void;\n allowEmptyValue?: boolean;\n onCancel?: (e: Event) => void;\n onBlur?: (e: Event) => void;\n validation?: (\n value: string,\n disableMacros: boolean,\n decimalSeparator: string,\n decimalLength: number,\n limit?: number\n ) => boolean;\n min?: string | number;\n max?: string | number;\n update?: boolean;\n shortenThreshold?: number;\n}\n\nexport const useInputNumber = (\n {\n decimalSeparator = \".\",\n thousandSeparator = \",\",\n disableAbbreviation,\n disableMacros,\n decimalLength,\n value = \"\",\n onChange,\n onSave,\n onEnterKeyPress,\n onClick,\n onCancel,\n allowEmptyValue,\n step = 1,\n trimDecimals = true,\n limit,\n validation = validateNumberInput,\n min,\n max,\n onBlur,\n update,\n shortenThreshold = 1000,\n }: IInputNumber,\n inputRef: RefObject<HTMLInputElement | null>\n) => {\n const isMaxValid =\n max === undefined || min === undefined || Number(max) >= Number(min);\n\n if (!isMaxValid) {\n console.warn(\n \"Warning: The maximum value is set to be lower than the minimum value. The maximum value will be ignored.\"\n );\n }\n\n const [currentValue, setCurrentValue] = useState(() =>\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n const [prevValue, setPrevValue] = useState(() =>\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n const [unformattedValue, setUnformattedValue] = useState(() =>\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n const [unformattedPrevValue, setUnformattedPrevValue] = useState(() =>\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n\n const [focused, setFocused] = useState(false);\n\n useEffect(() => {\n if (value !== prevValue && (!focused || update)) {\n setCurrentValue(\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n setPrevValue(\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n setUnformattedValue(\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n setUnformattedPrevValue(\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disableAbbreviation,\n thousandSeparator,\n decimalSeparator,\n decimalLength,\n trimDecimals,\n value,\n focused,\n ]);\n\n const escapeRef = useRef(false);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n setUnformattedValue(unformattedPrevValue);\n if (onChange) onChange(String(unformattedPrevValue));\n } else {\n if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {\n const _value = formatNumber(\n currentValue as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n );\n setPrevValue(_value);\n setUnformattedPrevValue(\n formatNumber(\n currentValue as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n setUnformattedValue(\n formatNumber(\n currentValue as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n if (!allowEmptyValue) {\n setCurrentValue(prevValue);\n setUnformattedValue(unformattedPrevValue);\n typeof onCancel === \"function\" && onCancel(e);\n } else {\n if (typeof onSave === \"function\" && prevValue !== e.target.value) {\n onSave(e);\n } else {\n typeof onCancel === \"function\" && onCancel(e);\n }\n }\n }\n }\n setFocused(false);\n typeof onBlur === \"function\" && onBlur(e);\n },\n [\n onBlur,\n prevValue,\n unformattedPrevValue,\n onChange,\n currentValue,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation,\n shortenThreshold,\n onSave,\n allowEmptyValue,\n onCancel,\n ]\n );\n\n const updateValue = useCallback(\n (type: \"increment\" | \"decrement\") => {\n const preformattedValue = String(unformattedValue)\n .replace(thousandSeparator, \"\")\n .replace(decimalSeparator, \".\");\n const numericValue = parseFloat(preformattedValue);\n\n if (isNaN(numericValue)) return;\n\n if (\n (max !== undefined && numericValue > Number(max)) ||\n (min !== undefined && numericValue < Number(min))\n ) {\n return;\n }\n\n let newValue = numericValue;\n\n if (type === \"increment\") {\n if (max === undefined || numericValue + step <= Number(max)) {\n newValue = numericValue + step;\n } else if (numericValue < Number(max)) {\n newValue = Number(max);\n } else {\n return;\n }\n } else if (type === \"decrement\") {\n if (min === undefined || numericValue - step >= Number(min)) {\n newValue = numericValue - step;\n } else if (numericValue > Number(min)) {\n newValue = Number(min);\n } else {\n return;\n }\n }\n\n let formattedValue;\n if (decimalLength !== undefined) {\n formattedValue = newValue.toFixed(decimalLength);\n } else {\n formattedValue = newValue.toFixed(2);\n }\n\n if (decimalLength !== undefined && decimalLength === 0) {\n formattedValue = Math.round(newValue).toString();\n }\n\n if (formattedValue.includes(\".\") || formattedValue.includes(\",\")) {\n formattedValue = formattedValue.replace(\".\", decimalSeparator);\n }\n\n setUnformattedValue(formattedValue);\n setCurrentValue(formattedValue);\n if (onChange) onChange(formattedValue);\n },\n [\n unformattedValue,\n thousandSeparator,\n decimalSeparator,\n decimalLength,\n onChange,\n step,\n min,\n max,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n if (typeof onEnterKeyPress === \"function\")\n onEnterKeyPress(e.target.value);\n }\n if (e.key === \"ArrowLeft\") {\n return;\n }\n if (e.key === \"ArrowRight\") {\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n updateValue(\"increment\");\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n updateValue(\"decrement\");\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel(e);\n escapeRef.current = false;\n }\n if (e.key === \"Backspace\") {\n return;\n }\n if (e.key === \"Delete\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"a\") {\n inputRef.current?.select();\n return;\n }\n if (e.key === \"Tab\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"v\") {\n e.preventDefault();\n return;\n }\n\n // Disallow \"-\" if min is 0 or greater\n if (e.key === \"-\" && min !== undefined && Number(min) >= 0) {\n e.preventDefault();\n return;\n }\n\n // Disallow decimal separator if decimalLength is 0\n if (e.key === decimalSeparator && decimalLength === 0) {\n e.preventDefault();\n return;\n }\n\n const input = e.target;\n const currentValue = input.value;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const newValue =\n currentValue.substring(0, start) + e.key + currentValue.substring(end);\n if (\n !validation(\n newValue,\n Boolean(disableMacros),\n decimalSeparator,\n decimalLength ?? 0,\n limit\n )\n ) {\n e.preventDefault();\n return;\n }\n },\n [\n decimalLength,\n decimalSeparator,\n disableMacros,\n inputRef,\n limit,\n min,\n onCancel,\n onEnterKeyPress,\n updateValue,\n validation,\n ]\n );\n\n const handleChange = useCallback(\n (e) => {\n const inputValue = e.target.value;\n const numericInput = disableMacros\n ? inputValue\n : inputValue.replace(\n /(\\d+(?:[.,]\\d+)?)([kmbtKMBT])/,\n (_, num, unit) => {\n const normalizedNum = num.replace(\",\", \".\");\n const parts = normalizedNum.split(\".\");\n const integerPart = parts[0];\n const fractionalPart = parts[1];\n\n const newInteger =\n parseInt(integerPart, 10) *\n currencyMultiplier[unit.toLowerCase()];\n\n let result = newInteger.toString();\n if (fractionalPart !== undefined) {\n result += decimalSeparator + fractionalPart;\n }\n return result;\n }\n );\n setCurrentValue(numericInput);\n setUnformattedValue(numericInput);\n if (onChange) onChange(numericInput);\n },\n [disableMacros, decimalSeparator, onChange]\n );\n\n const handleClick = useCallback(\n (e) => {\n if (typeof onClick === \"function\") {\n onClick(e);\n }\n },\n [onClick]\n );\n\n const handleFocus = useCallback(() => {\n setCurrentValue(unformattedValue);\n setFocused(true);\n }, [unformattedValue]);\n\n const handleDoubleClick = useCallback(() => {\n if (inputRef.current) {\n inputRef.current?.select();\n }\n }, [inputRef]);\n\n return {\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n onClick: handleClick,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n focused,\n unformattedValue,\n };\n};\n"],"mappings":"AAAA,SACEA,QAAQ,EAERC,MAAM,EACNC,WAAW,EAEXC,SAAS,QACJ,OAAO;AAEd,SAASC,mBAAmB,QAAQ,UAAU;AAC9C,SAASC,kBAAkB,EAAEC,YAAY,QAAQ,wBAAwB;AAkCzE,OAAO,MAAMC,cAAc,GAAGA,CAAAC,IAAA,EAwB5BC,QAA4C,KACzC;EAAA,IAxBH;IACEC,gBAAgB,GAAG,GAAG;IACtBC,iBAAiB,GAAG,GAAG;IACvBC,mBAAmB;IACnBC,aAAa;IACbC,aAAa;IACbC,KAAK,GAAG,EAAE;IACVC,QAAQ;IACRC,MAAM;IACNC,eAAe;IACfC,OAAO;IACPC,QAAQ;IACRC,eAAe;IACfC,IAAI,GAAG,CAAC;IACRC,YAAY,GAAG,IAAI;IACnBC,KAAK;IACLC,UAAU,GAAGrB,mBAAmB;IAChCsB,GAAG;IACHC,GAAG;IACHC,MAAM;IACNC,MAAM;IACNC,gBAAgB,GAAG;EACP,CAAC,GAAAtB,IAAA;EAGf,MAAMuB,UAAU,GACdJ,GAAG,KAAKK,SAAS,IAAIN,GAAG,KAAKM,SAAS,IAAIC,MAAM,CAACN,GAAG,CAAC,IAAIM,MAAM,CAACP,GAAG,CAAC;EAEtE,IAAI,CAACK,UAAU,EAAE;IACfG,OAAO,CAACC,IAAI,CACV,0GACF,CAAC;EACH;EAEA,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAGrC,QAAQ,CAAC,MAC/CM,YAAY,CACVS,KAAK,EACLJ,iBAAiB,EACjBD,gBAAgB,EAChBa,YAAY,EACZT,aAAa,EACbF,mBAAmB,GAAG,MAAM,GAAG,OAAO,EACtCkB,gBACF,CACF,CAAC;EACD,MAAM,CAACQ,SAAS,EAAEC,YAAY,CAAC,GAAGvC,QAAQ,CAAC,MACzCM,YAAY,CACVS,KAAK,EACLJ,iBAAiB,EACjBD,gBAAgB,EAChBa,YAAY,EACZT,aAAa,EACbF,mBAAmB,GAAG,MAAM,GAAG,OAAO,EACtCkB,gBACF,CACF,CAAC;EACD,MAAM,CAACU,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGzC,QAAQ,CAAC,MACvDM,YAAY,CACVS,KAAK,EACL,EAAE,EACFL,gBAAgB,EAChB,KAAK,EACLI,aAAa,EACb,MAAM,EACNgB,gBACF,CACF,CAAC;EACD,MAAM,CAACY,oBAAoB,EAAEC,uBAAuB,CAAC,GAAG3C,QAAQ,CAAC,MAC/DM,YAAY,CACVS,KAAK,EACL,EAAE,EACFL,gBAAgB,EAChB,KAAK,EACLI,aAAa,EACb,MAAM,EACNgB,gBACF,CACF,CAAC;EAED,MAAM,CAACc,OAAO,EAAEC,UAAU,CAAC,GAAG7C,QAAQ,CAAC,KAAK,CAAC;EAE7CG,SAAS,CAAC,MAAM;IACd,IAAIY,KAAK,KAAKuB,SAAS,KAAK,CAACM,OAAO,IAAIf,MAAM,CAAC,EAAE;MAC/CQ,eAAe,CACb/B,YAAY,CACVS,KAAK,EACLJ,iBAAiB,EACjBD,gBAAgB,EAChBa,YAAY,EACZT,aAAa,EACbF,mBAAmB,GAAG,MAAM,GAAG,OAAO,EACtCkB,gBACF,CACF,CAAC;MACDS,YAAY,CACVjC,YAAY,CACVS,KAAK,EACLJ,iBAAiB,EACjBD,gBAAgB,EAChBa,YAAY,EACZT,aAAa,EACbF,mBAAmB,GAAG,MAAM,GAAG,OAAO,EACtCkB,gBACF,CACF,CAAC;MACDW,mBAAmB,CACjBnC,YAAY,CACVS,KAAK,EACL,EAAE,EACFL,gBAAgB,EAChB,KAAK,EACLI,aAAa,EACb,MAAM,EACNgB,gBACF,CACF,CAAC;MACDa,uBAAuB,CACrBrC,YAAY,CACVS,KAAK,EACL,EAAE,EACFL,gBAAgB,EAChB,KAAK,EACLI,aAAa,EACb,MAAM,EACNgB,gBACF,CACF,CAAC;IACH;IACA;EACF,CAAC,EAAE,CACDlB,mBAAmB,EACnBD,iBAAiB,EACjBD,gBAAgB,EAChBI,aAAa,EACbS,YAAY,EACZR,KAAK,EACL6B,OAAO,CACR,CAAC;EAEF,MAAME,SAAS,GAAG7C,MAAM,CAAC,KAAK,CAAC;EAE/B,MAAM8C,UAAU,GAAG7C,WAAW,CAC3B8C,CAAC,IAAK;IACL,IAAIF,SAAS,CAACG,OAAO,EAAE;MACrBZ,eAAe,CAACC,SAAS,CAAC;MAC1BG,mBAAmB,CAACC,oBAAoB,CAAC;MACzC,IAAI1B,QAAQ,EAAEA,QAAQ,CAACkC,MAAM,CAACR,oBAAoB,CAAC,CAAC;IACtD,CAAC,MAAM;MACL,IAAIM,CAAC,CAACG,MAAM,CAACpC,KAAK,CAACqC,IAAI,CAAC,CAAC,CAACC,MAAM,GAAG,CAAC,IAAIf,SAAS,KAAKU,CAAC,CAACG,MAAM,CAACpC,KAAK,EAAE;QACpE,MAAMuC,MAAM,GAAGhD,YAAY,CACzB8B,YAAY,EACZzB,iBAAiB,EACjBD,gBAAgB,EAChBa,YAAY,EACZT,aAAa,EACbF,mBAAmB,GAAG,MAAM,GAAG,OAAO,EACtCkB,gBACF,CAAC;QACDS,YAAY,CAACe,MAAM,CAAC;QACpBX,uBAAuB,CACrBrC,YAAY,CACV8B,YAAY,EACZ,EAAE,EACF1B,gBAAgB,EAChB,KAAK,EACLI,aAAa,EACb,MAAM,EACNgB,gBACF,CACF,CAAC;QACDW,mBAAmB,CACjBnC,YAAY,CACV8B,YAAY,EACZ,EAAE,EACF1B,gBAAgB,EAChB,KAAK,EACLI,aAAa,EACb,MAAM,EACNgB,gBACF,CACF,CAAC;QACDO,eAAe,CAACiB,MAAM,CAAC;QACvB,OAAOrC,MAAM,KAAK,UAAU,IAAIA,MAAM,CAAC+B,CAAC,CAAC;MAC3C,CAAC,MAAM;QACL,IAAI,CAAC3B,eAAe,EAAE;UACpBgB,eAAe,CAACC,SAAS,CAAC;UAC1BG,mBAAmB,CAACC,oBAAoB,CAAC;UACzC,OAAOtB,QAAQ,KAAK,UAAU,IAAIA,QAAQ,CAAC4B,CAAC,CAAC;QAC/C,CAAC,MAAM;UACL,IAAI,OAAO/B,MAAM,KAAK,UAAU,IAAIqB,SAAS,KAAKU,CAAC,CAACG,MAAM,CAACpC,KAAK,EAAE;YAChEE,MAAM,CAAC+B,CAAC,CAAC;UACX,CAAC,MAAM;YACL,OAAO5B,QAAQ,KAAK,UAAU,IAAIA,QAAQ,CAAC4B,CAAC,CAAC;UAC/C;QACF;MACF;IACF;IACAH,UAAU,CAAC,KAAK,CAAC;IACjB,OAAOjB,MAAM,KAAK,UAAU,IAAIA,MAAM,CAACoB,CAAC,CAAC;EAC3C,CAAC,EACD,CACEpB,MAAM,EACNU,SAAS,EACTI,oBAAoB,EACpB1B,QAAQ,EACRoB,YAAY,EACZzB,iBAAiB,EACjBD,gBAAgB,EAChBa,YAAY,EACZT,aAAa,EACbF,mBAAmB,EACnBkB,gBAAgB,EAChBb,MAAM,EACNI,eAAe,EACfD,QAAQ,CAEZ,CAAC;EAED,MAAMmC,WAAW,GAAGrD,WAAW,CAC5BsD,IAA+B,IAAK;IACnC,MAAMC,iBAAiB,GAAGP,MAAM,CAACV,gBAAgB,CAAC,CAC/CkB,OAAO,CAAC/C,iBAAiB,EAAE,EAAE,CAAC,CAC9B+C,OAAO,CAAChD,gBAAgB,EAAE,GAAG,CAAC;IACjC,MAAMiD,YAAY,GAAGC,UAAU,CAACH,iBAAiB,CAAC;IAElD,IAAII,KAAK,CAACF,YAAY,CAAC,EAAE;IAEzB,IACGhC,GAAG,KAAKK,SAAS,IAAI2B,YAAY,GAAG1B,MAAM,CAACN,GAAG,CAAC,IAC/CD,GAAG,KAAKM,SAAS,IAAI2B,YAAY,GAAG1B,MAAM,CAACP,GAAG,CAAE,EACjD;MACA;IACF;IAEA,IAAIoC,QAAQ,GAAGH,YAAY;IAE3B,IAAIH,IAAI,KAAK,WAAW,EAAE;MACxB,IAAI7B,GAAG,KAAKK,SAAS,IAAI2B,YAAY,GAAGrC,IAAI,IAAIW,MAAM,CAACN,GAAG,CAAC,EAAE;QAC3DmC,QAAQ,GAAGH,YAAY,GAAGrC,IAAI;MAChC,CAAC,MAAM,IAAIqC,YAAY,GAAG1B,MAAM,CAACN,GAAG,CAAC,EAAE;QACrCmC,QAAQ,GAAG7B,MAAM,CAACN,GAAG,CAAC;MACxB,CAAC,MAAM;QACL;MACF;IACF,CAAC,MAAM,IAAI6B,IAAI,KAAK,WAAW,EAAE;MAC/B,IAAI9B,GAAG,KAAKM,SAAS,IAAI2B,YAAY,GAAGrC,IAAI,IAAIW,MAAM,CAACP,GAAG,CAAC,EAAE;QAC3DoC,QAAQ,GAAGH,YAAY,GAAGrC,IAAI;MAChC,CAAC,MAAM,IAAIqC,YAAY,GAAG1B,MAAM,CAACP,GAAG,CAAC,EAAE;QACrCoC,QAAQ,GAAG7B,MAAM,CAACP,GAAG,CAAC;MACxB,CAAC,MAAM;QACL;MACF;IACF;IAEA,IAAIqC,cAAc;IAClB,IAAIjD,aAAa,KAAKkB,SAAS,EAAE;MAC/B+B,cAAc,GAAGD,QAAQ,CAACE,OAAO,CAAClD,aAAa,CAAC;IAClD,CAAC,MAAM;MACLiD,cAAc,GAAGD,QAAQ,CAACE,OAAO,CAAC,CAAC,CAAC;IACtC;IAEA,IAAIlD,aAAa,KAAKkB,SAAS,IAAIlB,aAAa,KAAK,CAAC,EAAE;MACtDiD,cAAc,GAAGE,IAAI,CAACC,KAAK,CAACJ,QAAQ,CAAC,CAACK,QAAQ,CAAC,CAAC;IAClD;IAEA,IAAIJ,cAAc,CAACK,QAAQ,CAAC,GAAG,CAAC,IAAIL,cAAc,CAACK,QAAQ,CAAC,GAAG,CAAC,EAAE;MAChEL,cAAc,GAAGA,cAAc,CAACL,OAAO,CAAC,GAAG,EAAEhD,gBAAgB,CAAC;IAChE;IAEA+B,mBAAmB,CAACsB,cAAc,CAAC;IACnC1B,eAAe,CAAC0B,cAAc,CAAC;IAC/B,IAAI/C,QAAQ,EAAEA,QAAQ,CAAC+C,cAAc,CAAC;EACxC,CAAC,EACD,CACEvB,gBAAgB,EAChB7B,iBAAiB,EACjBD,gBAAgB,EAChBI,aAAa,EACbE,QAAQ,EACRM,IAAI,EACJI,GAAG,EACHC,GAAG,CAEP,CAAC;EAED,MAAM0C,aAAa,GAAGnE,WAAW,CAC9B8C,CAAC,IAAK;IACL,IAAIA,CAAC,CAACsB,GAAG,KAAK,OAAO,EAAE;MACrBtB,CAAC,CAACG,MAAM,CAACoB,IAAI,CAAC,CAAC;MACf,IAAI,OAAOrD,eAAe,KAAK,UAAU,EACvCA,eAAe,CAAC8B,CAAC,CAACG,MAAM,CAACpC,KAAK,CAAC;IACnC;IACA,IAAIiC,CAAC,CAACsB,GAAG,KAAK,WAAW,EAAE;MACzB;IACF;IACA,IAAItB,CAAC,CAACsB,GAAG,KAAK,YAAY,EAAE;MAC1B;IACF;IACA,IAAItB,CAAC,CAACsB,GAAG,KAAK,SAAS,EAAE;MACvBtB,CAAC,CAACwB,cAAc,CAAC,CAAC;MAClBjB,WAAW,CAAC,WAAW,CAAC;IAC1B;IACA,IAAIP,CAAC,CAACsB,GAAG,KAAK,WAAW,EAAE;MACzBtB,CAAC,CAACwB,cAAc,CAAC,CAAC;MAClBjB,WAAW,CAAC,WAAW,CAAC;IAC1B;IACA,IAAIP,CAAC,CAACsB,GAAG,KAAK,QAAQ,EAAE;MACtBxB,SAAS,CAACG,OAAO,GAAG,IAAI;MACxBD,CAAC,CAACG,MAAM,CAACoB,IAAI,CAAC,CAAC;MACf,OAAOnD,QAAQ,KAAK,UAAU,IAAIA,QAAQ,CAAC4B,CAAC,CAAC;MAC7CF,SAAS,CAACG,OAAO,GAAG,KAAK;IAC3B;IACA,IAAID,CAAC,CAACsB,GAAG,KAAK,WAAW,EAAE;MACzB;IACF;IACA,IAAItB,CAAC,CAACsB,GAAG,KAAK,QAAQ,EAAE;MACtB;IACF;IACA,IAAI,CAACtB,CAAC,CAACyB,OAAO,IAAIzB,CAAC,CAAC0B,OAAO,KAAK1B,CAAC,CAACsB,GAAG,KAAK,GAAG,EAAE;MAAA,IAAAK,iBAAA;MAC7C,CAAAA,iBAAA,GAAAlE,QAAQ,CAACwC,OAAO,aAAhB0B,iBAAA,CAAkBC,MAAM,CAAC,CAAC;MAC1B;IACF;IACA,IAAI5B,CAAC,CAACsB,GAAG,KAAK,KAAK,EAAE;MACnB;IACF;IACA,IAAI,CAACtB,CAAC,CAACyB,OAAO,IAAIzB,CAAC,CAAC0B,OAAO,KAAK1B,CAAC,CAACsB,GAAG,KAAK,GAAG,EAAE;MAC7CtB,CAAC,CAACwB,cAAc,CAAC,CAAC;MAClB;IACF;;IAEA;IACA,IAAIxB,CAAC,CAACsB,GAAG,KAAK,GAAG,IAAI5C,GAAG,KAAKM,SAAS,IAAIC,MAAM,CAACP,GAAG,CAAC,IAAI,CAAC,EAAE;MAC1DsB,CAAC,CAACwB,cAAc,CAAC,CAAC;MAClB;IACF;;IAEA;IACA,IAAIxB,CAAC,CAACsB,GAAG,KAAK5D,gBAAgB,IAAII,aAAa,KAAK,CAAC,EAAE;MACrDkC,CAAC,CAACwB,cAAc,CAAC,CAAC;MAClB;IACF;IAEA,MAAMK,KAAK,GAAG7B,CAAC,CAACG,MAAM;IACtB,MAAMf,YAAY,GAAGyC,KAAK,CAAC9D,KAAK;IAChC,MAAM+D,KAAK,GAAGD,KAAK,CAACE,cAAc;IAClC,MAAMC,GAAG,GAAGH,KAAK,CAACI,YAAY;IAC9B,MAAMnB,QAAQ,GACZ1B,YAAY,CAAC8C,SAAS,CAAC,CAAC,EAAEJ,KAAK,CAAC,GAAG9B,CAAC,CAACsB,GAAG,GAAGlC,YAAY,CAAC8C,SAAS,CAACF,GAAG,CAAC;IACxE,IACE,CAACvD,UAAU,CACTqC,QAAQ,EACRqB,OAAO,CAACtE,aAAa,CAAC,EACtBH,gBAAgB,EAChBI,aAAa,WAAbA,aAAa,GAAI,CAAC,EAClBU,KACF,CAAC,EACD;MACAwB,CAAC,CAACwB,cAAc,CAAC,CAAC;MAClB;IACF;EACF,CAAC,EACD,CACE1D,aAAa,EACbJ,gBAAgB,EAChBG,aAAa,EACbJ,QAAQ,EACRe,KAAK,EACLE,GAAG,EACHN,QAAQ,EACRF,eAAe,EACfqC,WAAW,EACX9B,UAAU,CAEd,CAAC;EAED,MAAM2D,YAAY,GAAGlF,WAAW,CAC7B8C,CAAC,IAAK;IACL,MAAMqC,UAAU,GAAGrC,CAAC,CAACG,MAAM,CAACpC,KAAK;IACjC,MAAMuE,YAAY,GAAGzE,aAAa,GAC9BwE,UAAU,GACVA,UAAU,CAAC3B,OAAO,CAChB,+BAA+B,EAC/B,CAAC6B,CAAC,EAAEC,GAAG,EAAEC,IAAI,KAAK;MAChB,MAAMC,aAAa,GAAGF,GAAG,CAAC9B,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;MAC3C,MAAMiC,KAAK,GAAGD,aAAa,CAACE,KAAK,CAAC,GAAG,CAAC;MACtC,MAAMC,WAAW,GAAGF,KAAK,CAAC,CAAC,CAAC;MAC5B,MAAMG,cAAc,GAAGH,KAAK,CAAC,CAAC,CAAC;MAE/B,MAAMI,UAAU,GACdC,QAAQ,CAACH,WAAW,EAAE,EAAE,CAAC,GACzBxF,kBAAkB,CAACoF,IAAI,CAACQ,WAAW,CAAC,CAAC,CAAC;MAExC,IAAIC,MAAM,GAAGH,UAAU,CAAC5B,QAAQ,CAAC,CAAC;MAClC,IAAI2B,cAAc,KAAK9D,SAAS,EAAE;QAChCkE,MAAM,IAAIxF,gBAAgB,GAAGoF,cAAc;MAC7C;MACA,OAAOI,MAAM;IACf,CACF,CAAC;IACL7D,eAAe,CAACiD,YAAY,CAAC;IAC7B7C,mBAAmB,CAAC6C,YAAY,CAAC;IACjC,IAAItE,QAAQ,EAAEA,QAAQ,CAACsE,YAAY,CAAC;EACtC,CAAC,EACD,CAACzE,aAAa,EAAEH,gBAAgB,EAAEM,QAAQ,CAC5C,CAAC;EAED,MAAMmF,WAAW,GAAGjG,WAAW,CAC5B8C,CAAC,IAAK;IACL,IAAI,OAAO7B,OAAO,KAAK,UAAU,EAAE;MACjCA,OAAO,CAAC6B,CAAC,CAAC;IACZ;EACF,CAAC,EACD,CAAC7B,OAAO,CACV,CAAC;EAED,MAAMiF,WAAW,GAAGlG,WAAW,CAAC,MAAM;IACpCmC,eAAe,CAACG,gBAAgB,CAAC;IACjCK,UAAU,CAAC,IAAI,CAAC;EAClB,CAAC,EAAE,CAACL,gBAAgB,CAAC,CAAC;EAEtB,MAAM6D,iBAAiB,GAAGnG,WAAW,CAAC,MAAM;IAC1C,IAAIO,QAAQ,CAACwC,OAAO,EAAE;MAAA,IAAAqD,kBAAA;MACpB,CAAAA,kBAAA,GAAA7F,QAAQ,CAACwC,OAAO,aAAhBqD,kBAAA,CAAkB1B,MAAM,CAAC,CAAC;IAC5B;EACF,CAAC,EAAE,CAACnE,QAAQ,CAAC,CAAC;EAEd,OAAO;IACLM,KAAK,EAAEqB,YAAY;IACnBR,MAAM,EAAEmB,UAAU;IAClBwD,SAAS,EAAElC,aAAa;IACxBrD,QAAQ,EAAEoE,YAAY;IACtBjE,OAAO,EAAEgF,WAAW;IACpBK,aAAa,EAAEH,iBAAiB;IAChCI,OAAO,EAAEL,WAAW;IACpBxD,OAAO;IACPJ;EACF,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"useInputNumber.js","names":["useState","useRef","useCallback","useEffect","validateNumberInput","currencyMultiplier","formatNumber","getNumberFromString","useInputNumber","_ref","inputRef","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","undefined","onChange","onSave","onEnterKeyPress","onClick","onCancel","allowEmptyValue","step","trimDecimals","limit","validation","min","max","onBlur","update","shortenThreshold","isMaxValid","Number","console","warn","numericValue","setNumericValue","prevNumericValue","setPrevNumericValue","currentValue","setCurrentValue","prevValue","setPrevValue","unformattedValue","setUnformattedValue","unformattedPrevValue","setUnformattedPrevValue","focused","setFocused","escapeRef","handleBlur","e","current","target","trim","length","_value","_unformatedValue","_numericValue","updateValue","type","newValue","formattedValue","toFixed","Math","round","toString","includes","replace","handleKeyDown","key","blur","preventDefault","metaKey","ctrlKey","_inputRef$current","select","input","start","selectionStart","end","selectionEnd","substring","Boolean","handleChange","inputValue","numericNewValue","numericInput","_","num","unit","normalizedNum","parts","split","integerPart","fractionalPart","newInteger","parseInt","toLowerCase","parseFloat","result","handleClick","handleFocus","handleDoubleClick","_inputRef$current2","onKeyDown","onDoubleClick","onFocus"],"sources":["../../../src/hooks/useInputNumber.tsx"],"sourcesContent":["import {\n useState,\n MouseEvent,\n useRef,\n useCallback,\n RefObject,\n useEffect,\n} from \"react\";\n\nimport { validateNumberInput } from \"../utils\";\nimport {\n currencyMultiplier,\n formatNumber,\n getNumberFromString,\n} from \"../utils/currencyUtils\";\n\nexport type Separators = \".\" | \",\" | \" \" | \"\";\n\nexport type InputNumberValue = number | undefined;\n\nexport interface IInputNumber {\n decimalLength?: number;\n decimalSeparator?: Separators;\n disableAbbreviation?: boolean;\n disableMacros?: boolean;\n thousandSeparator?: Separators;\n trimDecimals?: boolean;\n value?: number;\n step?: number;\n limit?: number;\n onEnterKeyPress?: (val: InputNumberValue) => void;\n onChange?: (val: InputNumberValue) => void;\n onClick?: (event: MouseEvent<HTMLInputElement>) => void;\n allowEmptyValue?: boolean;\n onCancel?: (e: Event) => void;\n onSave?: (e: Event) => void;\n onBlur?: (e: Event) => void;\n validation?: (\n value: string,\n disableMacros: boolean,\n decimalSeparator: string,\n decimalLength: number,\n limit?: number\n ) => boolean;\n min?: number;\n max?: number;\n update?: boolean;\n shortenThreshold?: number;\n}\n\nexport const useInputNumber = (\n {\n decimalSeparator = \".\",\n thousandSeparator = \",\",\n disableAbbreviation,\n disableMacros,\n decimalLength,\n value = undefined,\n onChange,\n onSave,\n onEnterKeyPress,\n onClick,\n onCancel,\n allowEmptyValue,\n step = 1,\n trimDecimals = true,\n limit,\n validation = validateNumberInput,\n min,\n max,\n onBlur,\n update,\n shortenThreshold = 1000,\n }: IInputNumber,\n inputRef: RefObject<HTMLInputElement | null>\n) => {\n const isMaxValid =\n max === undefined || min === undefined || Number(max) >= Number(min);\n\n if (!isMaxValid) {\n console.warn(\n \"Warning: The maximum value is set to be lower than the minimum value. The maximum value will be ignored.\"\n );\n }\n\n const [numericValue, setNumericValue] = useState(() => value);\n const [prevNumericValue, setPrevNumericValue] = useState(() => value);\n\n const [currentValue, setCurrentValue] = useState(() =>\n formatNumber(\n value,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n const [prevValue, setPrevValue] = useState(() =>\n formatNumber(\n value,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n const [unformattedValue, setUnformattedValue] = useState(() =>\n formatNumber(\n value,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n const [unformattedPrevValue, setUnformattedPrevValue] = useState(() =>\n formatNumber(\n value,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n\n const [focused, setFocused] = useState(false);\n\n useEffect(() => {\n if (value !== prevNumericValue && (!focused || update)) {\n setCurrentValue(\n formatNumber(\n value,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n setPrevValue(\n formatNumber(\n value,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n )\n );\n setUnformattedValue(\n formatNumber(\n value,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n setUnformattedPrevValue(\n formatNumber(\n value,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n )\n );\n setNumericValue(value);\n setPrevNumericValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disableAbbreviation,\n thousandSeparator,\n decimalSeparator,\n decimalLength,\n trimDecimals,\n value,\n focused,\n ]);\n\n const escapeRef = useRef(false);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n setUnformattedValue(unformattedPrevValue);\n setNumericValue(prevNumericValue);\n if (onChange) onChange(prevNumericValue);\n } else {\n if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {\n const _value = formatNumber(\n currentValue,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\",\n shortenThreshold\n );\n const _unformatedValue = formatNumber(\n currentValue,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\",\n shortenThreshold\n );\n const _numericValue = getNumberFromString(\n _unformatedValue,\n thousandSeparator,\n decimalSeparator\n );\n setPrevValue(_value);\n setUnformattedPrevValue(_unformatedValue);\n setUnformattedValue(_unformatedValue);\n setNumericValue(_numericValue);\n setPrevNumericValue(_numericValue);\n if (_numericValue !== prevNumericValue) onChange?.(_numericValue);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n if (!allowEmptyValue) {\n setCurrentValue(prevValue);\n setUnformattedValue(unformattedPrevValue);\n setNumericValue(prevNumericValue);\n onChange?.(prevNumericValue);\n typeof onCancel === \"function\" && onCancel(e);\n } else {\n if (prevValue !== e.target.value) {\n onSave?.(e);\n } else {\n typeof onCancel === \"function\" && onCancel(e);\n }\n }\n }\n }\n setFocused(false);\n typeof onBlur === \"function\" && onBlur(e);\n },\n [\n currentValue,\n onBlur,\n prevValue,\n unformattedPrevValue,\n prevNumericValue,\n onChange,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation,\n shortenThreshold,\n onSave,\n allowEmptyValue,\n onCancel,\n ]\n );\n\n const updateValue = useCallback(\n (type: \"increment\" | \"decrement\") => {\n if (\n (max !== undefined && Number(numericValue) > max) ||\n (min !== undefined && Number(numericValue) < min)\n ) {\n return;\n }\n\n let newValue = numericValue;\n\n if (type === \"increment\") {\n if (max === undefined || Number(numericValue) + step <= max) {\n newValue = Number(numericValue) + step;\n } else if (Number(numericValue) < max) {\n newValue = max;\n } else {\n return;\n }\n } else if (type === \"decrement\") {\n if (min === undefined || Number(numericValue) - step >= min) {\n newValue = Number(numericValue) - step;\n } else if (Number(numericValue) > min) {\n newValue = min;\n } else {\n return;\n }\n }\n\n let formattedValue;\n if (decimalLength !== undefined) {\n formattedValue = Number(newValue).toFixed(decimalLength);\n } else {\n formattedValue = Number(newValue).toFixed(2);\n }\n\n if (decimalLength !== undefined && decimalLength === 0) {\n formattedValue = Math.round(Number(newValue)).toString();\n }\n\n if (formattedValue.includes(\".\") || formattedValue.includes(\",\")) {\n formattedValue = formattedValue.replace(\".\", decimalSeparator);\n }\n\n setNumericValue(newValue);\n setPrevNumericValue(newValue);\n setUnformattedValue(formattedValue);\n setCurrentValue(formattedValue);\n if (onChange) onChange(newValue);\n },\n [max, numericValue, min, decimalLength, onChange, step, decimalSeparator]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n if (typeof onEnterKeyPress === \"function\")\n onEnterKeyPress(numericValue);\n }\n if (e.key === \"ArrowLeft\") {\n return;\n }\n if (e.key === \"ArrowRight\") {\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n updateValue(\"increment\");\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n updateValue(\"decrement\");\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel(e);\n escapeRef.current = false;\n }\n if (e.key === \"Backspace\") {\n return;\n }\n if (e.key === \"Delete\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"a\") {\n inputRef.current?.select();\n return;\n }\n if (e.key === \"Tab\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"v\") {\n e.preventDefault();\n return;\n }\n\n // Disallow \"-\" if min is 0 or greater\n if (e.key === \"-\" && min !== undefined && Number(min) >= 0) {\n e.preventDefault();\n return;\n }\n\n // Disallow decimal separator if decimalLength is 0\n if (e.key === decimalSeparator && decimalLength === 0) {\n e.preventDefault();\n return;\n }\n\n const input = e.target;\n const currentValue = input.value;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const newValue =\n currentValue.substring(0, start) + e.key + currentValue.substring(end);\n if (\n !validation(\n newValue,\n Boolean(disableMacros),\n decimalSeparator,\n decimalLength ?? 0,\n limit\n )\n ) {\n e.preventDefault();\n return;\n }\n },\n [\n decimalLength,\n decimalSeparator,\n disableMacros,\n inputRef,\n limit,\n min,\n numericValue,\n onCancel,\n onEnterKeyPress,\n updateValue,\n validation,\n ]\n );\n\n const handleChange = useCallback(\n (e) => {\n const inputValue = e.target.value;\n let numericNewValue: InputNumberValue = undefined;\n const numericInput = disableMacros\n ? inputValue\n : inputValue.replace(\n /(\\d+(?:[.,]\\d+)?)([kmbtKMBT])/,\n (_, num, unit) => {\n const normalizedNum = num.replace(\",\", \".\");\n const parts = normalizedNum.split(\".\");\n const integerPart = parts[0];\n const fractionalPart = parts[1];\n const newInteger =\n parseInt(integerPart, 10) *\n currencyMultiplier[unit.toLowerCase()];\n\n numericNewValue = parseFloat(\n `${newInteger ? newInteger : 0}.${\n fractionalPart ? fractionalPart : 0\n }`\n );\n\n let result = newInteger.toString();\n if (fractionalPart !== undefined) {\n result += decimalSeparator + fractionalPart;\n }\n return result;\n }\n );\n\n if (numericNewValue === undefined) {\n if (inputValue) {\n numericNewValue = parseFloat(inputValue.replace(\",\", \".\"));\n } else {\n numericNewValue = undefined;\n }\n }\n\n setCurrentValue(numericInput);\n setUnformattedValue(numericInput);\n setNumericValue(numericNewValue);\n if (onChange && numericNewValue !== numericValue)\n onChange(numericNewValue);\n },\n [disableMacros, onChange, numericValue, decimalSeparator]\n );\n\n const handleClick = useCallback(\n (e) => {\n if (typeof onClick === \"function\") {\n onClick(e);\n }\n },\n [onClick]\n );\n\n const handleFocus = useCallback(() => {\n setCurrentValue(unformattedValue);\n setFocused(true);\n }, [unformattedValue]);\n\n const handleDoubleClick = useCallback(() => {\n if (inputRef.current) {\n inputRef.current?.select();\n }\n }, [inputRef]);\n\n return {\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n onClick: handleClick,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n focused,\n unformattedValue,\n numericValue,\n };\n};\n"],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ export declare const getNumberFromString: (number: string | number, thousandSepa
|
|
|
28
28
|
* formatNumber(1500) // "1,500.00"
|
|
29
29
|
* formatNumber(1500000, ",", ".", true, 2, "short") // "1.5M"
|
|
30
30
|
*/
|
|
31
|
-
export declare const formatNumber: (n
|
|
31
|
+
export declare const formatNumber: (n?: string | number, thousandSeparator?: string, decimalSeperator?: string, trimDecimals?: boolean, decimalSpaces?: number, format?: string, shortenThreshold?: number) => string;
|
|
32
32
|
export declare const numberWithSeparator: (x: number | string, thousandSeparator?: string, decimalSeparator?: string, format?: boolean) => string | number;
|
|
33
33
|
/**
|
|
34
34
|
* @function formatCurrency
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currencyUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/currencyUtils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,SAAS,MAAM,WAQ5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,WACtB,MAAM,GAAG,MAAM,kEAsCxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"currencyUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/currencyUtils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,SAAS,MAAM,WAQ5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,WACtB,MAAM,GAAG,MAAM,kEAsCxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY,OACnB,MAAM,GAAG,MAAM,8JAyDpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,MAC3B,MAAM,GAAG,MAAM,6FAYnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,MACtB,MAAM,GAAG,MAAM,yLA0BnB,CAAC"}
|
|
@@ -89,6 +89,7 @@ export const formatNumber = function (n, thousandSeparator, decimalSeperator, tr
|
|
|
89
89
|
if (shortenThreshold === void 0) {
|
|
90
90
|
shortenThreshold = 1000;
|
|
91
91
|
}
|
|
92
|
+
if (typeof n === undefined || typeof n === null) return "";
|
|
92
93
|
const number = getNumberFromString(n, thousandSeparator, decimalSeperator);
|
|
93
94
|
if (isNaN(number)) {
|
|
94
95
|
return "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currencyUtils.js","names":["currencyMultiplier","k","m","b","t","fixedDecimalSpaces","num","fixed","Math","pow","parts","toString","split","length","parseInt","floor","round","getNumberFromString","number","thousandSeparator","decimalSeparator","NaN","isNaN","Number","result","parseFloat","String","replaceAll","formatNumber","n","decimalSeperator","trimDecimals","decimalSpaces","format","shortenThreshold","isNegative","absoluteNumber","abs","suffixes","scale","shouldShorten","formattedNum","toFixed","numberWithSeparator","x","replace","join","formatCurrency","currencyCode","currencyCodePosition"],"sources":["../../../src/utils/currencyUtils.ts"],"sourcesContent":["export const currencyMultiplier = {\n k: 1_000,\n m: 1_000_000,\n b: 1_000_000_000,\n t: 1_000_000_000_000,\n};\n\nexport const fixedDecimalSpaces = (num: number, fixed: number) => {\n fixed = fixed || 0;\n fixed = Math.pow(10, fixed);\n const parts = num.toString().split(\".\");\n if (parts.length > 1 && parseInt(parts[1]) > fixed) {\n return Math.floor(num * fixed) / fixed;\n }\n return Math.round(num * fixed) / fixed;\n};\n\nexport const getNumberFromString = (\n number: string | number,\n thousandSeparator = \",\",\n decimalSeparator = \".\"\n) => {\n if (typeof number === \"string\" && number === \"\") {\n return NaN;\n }\n if (!isNaN(Number(number)) || typeof number === \"number\") {\n return Number(number);\n }\n if (decimalSeparator === \",\") {\n const parts = number.split(decimalSeparator);\n\n let result = 0;\n if (parts.length === 2) {\n result = parts[0]\n ? parseFloat(String(parts[0]).replaceAll(thousandSeparator, \"\"))\n : 0;\n if (result < 0) {\n result -= parts[1]\n ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length)\n : 0;\n } else {\n result += parts[1]\n ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length)\n : 0;\n }\n return result;\n }\n if (parts.length === 1) {\n result = parseFloat(String(parts[0]).replaceAll(thousandSeparator, \"\"));\n\n return result;\n }\n return 0;\n } else {\n return parseFloat(String(number).replaceAll(thousandSeparator, \"\"));\n }\n};\n\n/**\n * @function formatNumber\n * @description\n * Formats a number or string into a human-readable format with options for thousand separators,\n * decimal precision, and shortening the number using suffixes (K, M, B, T).\n * It can handle negative numbers and optionally trim decimals and set number of decimal places based on the configuration.\n *\n * @param {string | number} n - The number or string to be formatted.\n * @param {\",\" | \".\" | \" \" | \"\"} [thousandSeparator=\",\"] - The character to use as a thousand separator.\n * @param {\",\" | \".\"} [decimalSeperator=\".\"] - The character to use as a decimal separator.\n * @param {boolean} [trimDecimals=true] - Whether to trim decimals to the specified number of decimal spaces.\n * @param {number} [decimalSpaces=2] - The number of decimal spaces to keep in the formatted output.\n * @param {\"long\" | \"short\"} [format=\"long\"] - The format type, either \"long\" for full numbers or \"short\" for shortened numbers with suffixes.\n * @param {number} [shortenThreshold=1000] - The minimum numeric value at which the number should be shortened\n * using suffixes. Numbers below this threshold will always be shown in long format.\n *\n * @returns {string} - The formatted number as a string with separators and potentially with decimals.\n *\n * @example\n * formatNumber(1500) // \"1,500.00\"\n * formatNumber(1500000, \",\", \".\", true, 2, \"short\") // \"1.5M\"\n */\nexport const formatNumber = (\n n: string | number,\n thousandSeparator = \",\",\n decimalSeperator = \".\",\n trimDecimals = true,\n decimalSpaces = 2,\n format = \"long\",\n shortenThreshold = 1000\n) => {\n const number = getNumberFromString(n, thousandSeparator, decimalSeperator);\n\n if (isNaN(number)) {\n return \"\";\n }\n\n const isNegative = number < 0;\n let absoluteNumber = Math.abs(number);\n\n const suffixes = [\"\", \"K\", \"M\", \"B\", \"T\"];\n let scale = 0;\n\n const shouldShorten =\n absoluteNumber >= shortenThreshold && format === \"short\";\n\n while (\n shouldShorten &&\n scale < suffixes.length - 1 &&\n absoluteNumber >= 1000\n ) {\n absoluteNumber /= 1000;\n scale++;\n }\n\n let formattedNum =\n scale === 0\n ? fixedDecimalSpaces(absoluteNumber, decimalSpaces)\n : parseFloat(absoluteNumber.toFixed(1));\n\n if (formattedNum === 1000 && scale > 0 && scale < 4) {\n formattedNum = 1;\n scale++;\n }\n\n const result = numberWithSeparator(\n trimDecimals ? formattedNum : formattedNum.toFixed(decimalSpaces),\n thousandSeparator,\n decimalSeperator\n );\n\n return isNegative\n ? `-${result}${suffixes[scale]}`\n : `${result}${suffixes[scale]}`;\n};\n\nexport const numberWithSeparator = (\n x: number | string,\n thousandSeparator = \",\",\n decimalSeparator = \".\",\n format = true\n) => {\n if (!format) {\n return x;\n }\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n\n return parts.join(decimalSeparator);\n};\n\n/**\n * @function formatCurrency\n * @description\n * Formats a number or string as a currency string with options for thousand separators,\n * decimal precision, currency code, currency code position, and the use of suffixes (K, M, B, T) if needed.\n * It can handle negative values and supports customization of the currency code and its position.\n *\n * @param {string | number} n - The number or string to be formatted as currency.\n * @param {\",\" | \".\" | \" \" | \"\"} [thousandSeparator=\",\"] - The character to use as a thousand separator.\n * @param {\",\" | \".\"} [decimalSeperator=\".\"] - The character to use as a decimal separator.\n * @param {boolean} [trimDecimals=false] - Whether to trim decimals to the specified number of decimal spaces.\n * @param {number} [decimalSpaces=2] - The number of decimal spaces to keep in the formatted output.\n * @param {\"long\" | \"short\"} [format=\"long\"] - The format type, either \"long\" for full numbers or \"short\" for shortened numbers with suffixes.\n * @param {string} [currencyCode=\"\"] - The currency code to append or prepend to the formatted number.\n * @param {\"right\" | \"left\"} [currencyCodePosition=\"right\"] - The position of the currency code relative to the formatted number.\n *\n * @returns {string} - The formatted currency string, including the currency code if provided.\n *\n * @example\n * formatCurrency(1500, \",\", \".\", false, 2, \"long\", \"USD\", \"right\") // \"1,500.00 USD\"\n * formatCurrency(1500000, \",\", \".\", true, 2, \"short\", \"JPY\", \"left\") // \"JPY 1.5M\"\n */\nexport const formatCurrency = (\n n: string | number,\n thousandSeparator = \",\",\n decimalSeperator = \".\",\n trimDecimals = false,\n decimalSpaces = 2,\n format = \"long\",\n currencyCode = \"\",\n currencyCodePosition = \"right\"\n) => {\n const formattedNum = formatNumber(\n n,\n thousandSeparator,\n decimalSeperator,\n trimDecimals,\n decimalSpaces,\n format,\n 10000\n );\n\n if (!currencyCode) {\n return formattedNum;\n }\n\n return currencyCodePosition === \"right\"\n ? `${formattedNum} ${currencyCode}`\n : `${currencyCode} ${formattedNum}`;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"currencyUtils.js","names":["currencyMultiplier","k","m","b","t","fixedDecimalSpaces","num","fixed","Math","pow","parts","toString","split","length","parseInt","floor","round","getNumberFromString","number","thousandSeparator","decimalSeparator","NaN","isNaN","Number","result","parseFloat","String","replaceAll","formatNumber","n","decimalSeperator","trimDecimals","decimalSpaces","format","shortenThreshold","undefined","isNegative","absoluteNumber","abs","suffixes","scale","shouldShorten","formattedNum","toFixed","numberWithSeparator","x","replace","join","formatCurrency","currencyCode","currencyCodePosition"],"sources":["../../../src/utils/currencyUtils.ts"],"sourcesContent":["export const currencyMultiplier = {\n k: 1_000,\n m: 1_000_000,\n b: 1_000_000_000,\n t: 1_000_000_000_000,\n};\n\nexport const fixedDecimalSpaces = (num: number, fixed: number) => {\n fixed = fixed || 0;\n fixed = Math.pow(10, fixed);\n const parts = num.toString().split(\".\");\n if (parts.length > 1 && parseInt(parts[1]) > fixed) {\n return Math.floor(num * fixed) / fixed;\n }\n return Math.round(num * fixed) / fixed;\n};\n\nexport const getNumberFromString = (\n number: string | number,\n thousandSeparator = \",\",\n decimalSeparator = \".\"\n) => {\n if (typeof number === \"string\" && number === \"\") {\n return NaN;\n }\n if (!isNaN(Number(number)) || typeof number === \"number\") {\n return Number(number);\n }\n if (decimalSeparator === \",\") {\n const parts = number.split(decimalSeparator);\n\n let result = 0;\n if (parts.length === 2) {\n result = parts[0]\n ? parseFloat(String(parts[0]).replaceAll(thousandSeparator, \"\"))\n : 0;\n if (result < 0) {\n result -= parts[1]\n ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length)\n : 0;\n } else {\n result += parts[1]\n ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length)\n : 0;\n }\n return result;\n }\n if (parts.length === 1) {\n result = parseFloat(String(parts[0]).replaceAll(thousandSeparator, \"\"));\n\n return result;\n }\n return 0;\n } else {\n return parseFloat(String(number).replaceAll(thousandSeparator, \"\"));\n }\n};\n\n/**\n * @function formatNumber\n * @description\n * Formats a number or string into a human-readable format with options for thousand separators,\n * decimal precision, and shortening the number using suffixes (K, M, B, T).\n * It can handle negative numbers and optionally trim decimals and set number of decimal places based on the configuration.\n *\n * @param {string | number} n - The number or string to be formatted.\n * @param {\",\" | \".\" | \" \" | \"\"} [thousandSeparator=\",\"] - The character to use as a thousand separator.\n * @param {\",\" | \".\"} [decimalSeperator=\".\"] - The character to use as a decimal separator.\n * @param {boolean} [trimDecimals=true] - Whether to trim decimals to the specified number of decimal spaces.\n * @param {number} [decimalSpaces=2] - The number of decimal spaces to keep in the formatted output.\n * @param {\"long\" | \"short\"} [format=\"long\"] - The format type, either \"long\" for full numbers or \"short\" for shortened numbers with suffixes.\n * @param {number} [shortenThreshold=1000] - The minimum numeric value at which the number should be shortened\n * using suffixes. Numbers below this threshold will always be shown in long format.\n *\n * @returns {string} - The formatted number as a string with separators and potentially with decimals.\n *\n * @example\n * formatNumber(1500) // \"1,500.00\"\n * formatNumber(1500000, \",\", \".\", true, 2, \"short\") // \"1.5M\"\n */\nexport const formatNumber = (\n n?: string | number,\n thousandSeparator = \",\",\n decimalSeperator = \".\",\n trimDecimals = true,\n decimalSpaces = 2,\n format = \"long\",\n shortenThreshold = 1000\n) => {\n if (typeof n === undefined || typeof n === null) return \"\";\n\n const number = getNumberFromString(\n n as string,\n thousandSeparator,\n decimalSeperator\n );\n\n if (isNaN(number)) {\n return \"\";\n }\n\n const isNegative = number < 0;\n let absoluteNumber = Math.abs(number);\n\n const suffixes = [\"\", \"K\", \"M\", \"B\", \"T\"];\n let scale = 0;\n\n const shouldShorten =\n absoluteNumber >= shortenThreshold && format === \"short\";\n\n while (\n shouldShorten &&\n scale < suffixes.length - 1 &&\n absoluteNumber >= 1000\n ) {\n absoluteNumber /= 1000;\n scale++;\n }\n\n let formattedNum =\n scale === 0\n ? fixedDecimalSpaces(absoluteNumber, decimalSpaces)\n : parseFloat(absoluteNumber.toFixed(1));\n\n if (formattedNum === 1000 && scale > 0 && scale < 4) {\n formattedNum = 1;\n scale++;\n }\n\n const result = numberWithSeparator(\n trimDecimals ? formattedNum : formattedNum.toFixed(decimalSpaces),\n thousandSeparator,\n decimalSeperator\n );\n\n return isNegative\n ? `-${result}${suffixes[scale]}`\n : `${result}${suffixes[scale]}`;\n};\n\nexport const numberWithSeparator = (\n x: number | string,\n thousandSeparator = \",\",\n decimalSeparator = \".\",\n format = true\n) => {\n if (!format) {\n return x;\n }\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n\n return parts.join(decimalSeparator);\n};\n\n/**\n * @function formatCurrency\n * @description\n * Formats a number or string as a currency string with options for thousand separators,\n * decimal precision, currency code, currency code position, and the use of suffixes (K, M, B, T) if needed.\n * It can handle negative values and supports customization of the currency code and its position.\n *\n * @param {string | number} n - The number or string to be formatted as currency.\n * @param {\",\" | \".\" | \" \" | \"\"} [thousandSeparator=\",\"] - The character to use as a thousand separator.\n * @param {\",\" | \".\"} [decimalSeperator=\".\"] - The character to use as a decimal separator.\n * @param {boolean} [trimDecimals=false] - Whether to trim decimals to the specified number of decimal spaces.\n * @param {number} [decimalSpaces=2] - The number of decimal spaces to keep in the formatted output.\n * @param {\"long\" | \"short\"} [format=\"long\"] - The format type, either \"long\" for full numbers or \"short\" for shortened numbers with suffixes.\n * @param {string} [currencyCode=\"\"] - The currency code to append or prepend to the formatted number.\n * @param {\"right\" | \"left\"} [currencyCodePosition=\"right\"] - The position of the currency code relative to the formatted number.\n *\n * @returns {string} - The formatted currency string, including the currency code if provided.\n *\n * @example\n * formatCurrency(1500, \",\", \".\", false, 2, \"long\", \"USD\", \"right\") // \"1,500.00 USD\"\n * formatCurrency(1500000, \",\", \".\", true, 2, \"short\", \"JPY\", \"left\") // \"JPY 1.5M\"\n */\nexport const formatCurrency = (\n n: string | number,\n thousandSeparator = \",\",\n decimalSeperator = \".\",\n trimDecimals = false,\n decimalSpaces = 2,\n format = \"long\",\n currencyCode = \"\",\n currencyCodePosition = \"right\"\n) => {\n const formattedNum = formatNumber(\n n,\n thousandSeparator,\n decimalSeperator,\n trimDecimals,\n decimalSpaces,\n format,\n 10000\n );\n\n if (!currencyCode) {\n return formattedNum;\n }\n\n return currencyCodePosition === \"right\"\n ? `${formattedNum} ${currencyCode}`\n : `${currencyCode} ${formattedNum}`;\n};\n"],"mappings":"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"}
|
|
@@ -33,6 +33,13 @@ describe("format currency with thousandseparator set to ',' and decimalSeparator
|
|
|
33
33
|
thousandSeparator: ".",
|
|
34
34
|
decimalSeparator: ","
|
|
35
35
|
}, "900,25"], [{
|
|
36
|
+
value: 0,
|
|
37
|
+
thousandSeparator: ".",
|
|
38
|
+
decimalSeparator: ",",
|
|
39
|
+
trimDecimals: false,
|
|
40
|
+
format: "long",
|
|
41
|
+
decimalSpaces: 2
|
|
42
|
+
}, "0,00"], [{
|
|
36
43
|
value: "900,25",
|
|
37
44
|
thousandSeparator: ".",
|
|
38
45
|
decimalSeparator: ","
|
|
@@ -353,6 +360,15 @@ describe("format currency with thousandseparator set to ',' and decimalSeparator
|
|
|
353
360
|
currencyCode: "",
|
|
354
361
|
currencyCodePosition: "right"
|
|
355
362
|
}, ""], [{
|
|
363
|
+
value: 0,
|
|
364
|
+
thousandSeparator: ",",
|
|
365
|
+
decimalSeparator: ".",
|
|
366
|
+
trimDecimals: false,
|
|
367
|
+
decimalSpaces: 2,
|
|
368
|
+
format: "long",
|
|
369
|
+
currencyCode: "USD",
|
|
370
|
+
currencyCodePosition: "right"
|
|
371
|
+
}, "0.00 USD"], [{
|
|
356
372
|
value: "10",
|
|
357
373
|
thousandSeparator: ",",
|
|
358
374
|
decimalSeparator: ".",
|