@activecollab/components 2.0.227 → 2.0.229

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.
Files changed (31) hide show
  1. package/dist/cjs/components/Input/InputNumber.js.map +1 -1
  2. package/dist/cjs/components/Input/InputTime.js +53 -12
  3. package/dist/cjs/components/Input/InputTime.js.map +1 -1
  4. package/dist/cjs/hooks/useInputNumber.js +77 -45
  5. package/dist/cjs/hooks/useInputNumber.js.map +1 -1
  6. package/dist/cjs/utils/currencyUtils.js +1 -0
  7. package/dist/cjs/utils/currencyUtils.js.map +1 -1
  8. package/dist/cjs/utils/currencyUtils.test.js +16 -0
  9. package/dist/cjs/utils/currencyUtils.test.js.map +1 -1
  10. package/dist/esm/components/Input/InputNumber.d.ts +2 -0
  11. package/dist/esm/components/Input/InputNumber.d.ts.map +1 -1
  12. package/dist/esm/components/Input/InputNumber.js.map +1 -1
  13. package/dist/esm/components/Input/InputTime.d.ts +2 -1
  14. package/dist/esm/components/Input/InputTime.d.ts.map +1 -1
  15. package/dist/esm/components/Input/InputTime.js +32 -5
  16. package/dist/esm/components/Input/InputTime.js.map +1 -1
  17. package/dist/esm/hooks/useInputNumber.d.ts +8 -6
  18. package/dist/esm/hooks/useInputNumber.d.ts.map +1 -1
  19. package/dist/esm/hooks/useInputNumber.js +53 -31
  20. package/dist/esm/hooks/useInputNumber.js.map +1 -1
  21. package/dist/esm/utils/currencyUtils.d.ts +1 -1
  22. package/dist/esm/utils/currencyUtils.d.ts.map +1 -1
  23. package/dist/esm/utils/currencyUtils.js +1 -0
  24. package/dist/esm/utils/currencyUtils.js.map +1 -1
  25. package/dist/esm/utils/currencyUtils.test.js +16 -0
  26. package/dist/esm/utils/currencyUtils.test.js.map +1 -1
  27. package/dist/index.js +131 -57
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.min.js +1 -1
  30. package/dist/index.min.js.map +1 -1
  31. 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
- onSave?: (e: Event) => void;
11
- value?: string | number;
11
+ value?: number;
12
12
  step?: number;
13
13
  limit?: number;
14
- onEnterKeyPress?: (val: string) => void;
15
- onChange?: (val: string) => void;
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?: string | number;
22
- max?: string | number;
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;AAKf,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AAE9C,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,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,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,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,GAAG,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc,iQAuBtB,YAAY,YACL,UAAU,gBAAgB,GAAG,IAAI,CAAC;;;;;;;;;;CA8Z7C,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 !== prevValue && (!focused || update)) {
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
- if (onChange) onChange(String(unformattedPrevValue));
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(formatNumber(currentValue, "", decimalSeparator, false, decimalLength, "long", shortenThreshold));
57
- setUnformattedValue(formatNumber(currentValue, "", decimalSeparator, false, decimalLength, "long", shortenThreshold));
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 (typeof onSave === "function" && prevValue !== e.target.value) {
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, onChange, currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation, shortenThreshold, onSave, allowEmptyValue, onCancel]);
88
+ }, [currentValue, onBlur, prevValue, unformattedPrevValue, prevNumericValue, onChange, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation, shortenThreshold, onSave, allowEmptyValue, onCancel]);
77
89
  const updateValue = useCallback(type => {
78
- const preformattedValue = String(unformattedValue).replace(thousandSeparator, "").replace(decimalSeparator, ".");
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 <= Number(max)) {
87
- newValue = numericValue + step;
88
- } else if (numericValue < Number(max)) {
89
- newValue = Number(max);
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 >= Number(min)) {
95
- newValue = numericValue - step;
96
- } else if (numericValue > Number(min)) {
97
- newValue = Number(min);
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(formattedValue);
117
- }, [unformattedValue, thousandSeparator, decimalSeparator, decimalLength, onChange, step, min, max]);
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(e.target.value);
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
- if (onChange) onChange(numericInput);
200
- }, [disableMacros, decimalSeparator, onChange]);
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":"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"}
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: string | number, thousandSeparator?: string, decimalSeperator?: string, trimDecimals?: boolean, decimalSpaces?: number, format?: string, shortenThreshold?: number) => string;
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,MACpB,MAAM,GAAG,MAAM,8JAmDnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,MAC3B,MAAM,GAAG,MAAM,6FAYnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,MACtB,MAAM,GAAG,MAAM,yLA0BnB,CAAC"}
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: ".",