@activecollab/components 2.0.190 → 2.0.192

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 (36) hide show
  1. package/dist/cjs/components/EditableCurrency/EditableCurrency.js.map +1 -1
  2. package/dist/cjs/components/Input/InputNumber.js +4 -2
  3. package/dist/cjs/components/Input/InputNumber.js.map +1 -1
  4. package/dist/cjs/components/Menu/Menu.js +0 -1
  5. package/dist/cjs/components/Menu/Menu.js.map +1 -1
  6. package/dist/cjs/components/Nav/Nav.js +4 -3
  7. package/dist/cjs/components/Nav/Nav.js.map +1 -1
  8. package/dist/cjs/components/Select/Select.js +0 -1
  9. package/dist/cjs/components/Select/Select.js.map +1 -1
  10. package/dist/cjs/hooks/useInputNumber.js +32 -27
  11. package/dist/cjs/hooks/useInputNumber.js.map +1 -1
  12. package/dist/esm/components/EditableCurrency/EditableCurrency.d.ts +1 -1
  13. package/dist/esm/components/EditableCurrency/EditableCurrency.d.ts.map +1 -1
  14. package/dist/esm/components/EditableCurrency/EditableCurrency.js.map +1 -1
  15. package/dist/esm/components/Input/InputNumber.d.ts +1 -1
  16. package/dist/esm/components/Input/InputNumber.d.ts.map +1 -1
  17. package/dist/esm/components/Input/InputNumber.js +3 -1
  18. package/dist/esm/components/Input/InputNumber.js.map +1 -1
  19. package/dist/esm/components/Menu/Menu.d.ts.map +1 -1
  20. package/dist/esm/components/Menu/Menu.js +0 -1
  21. package/dist/esm/components/Menu/Menu.js.map +1 -1
  22. package/dist/esm/components/Nav/Nav.d.ts.map +1 -1
  23. package/dist/esm/components/Nav/Nav.js +4 -3
  24. package/dist/esm/components/Nav/Nav.js.map +1 -1
  25. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  26. package/dist/esm/components/Select/Select.js +0 -1
  27. package/dist/esm/components/Select/Select.js.map +1 -1
  28. package/dist/esm/hooks/useInputNumber.d.ts +2 -1
  29. package/dist/esm/hooks/useInputNumber.d.ts.map +1 -1
  30. package/dist/esm/hooks/useInputNumber.js +32 -27
  31. package/dist/esm/hooks/useInputNumber.js.map +1 -1
  32. package/dist/index.js +40 -34
  33. package/dist/index.js.map +1 -1
  34. package/dist/index.min.js +1 -1
  35. package/dist/index.min.js.map +1 -1
  36. package/package.json +1 -1
@@ -20,7 +20,8 @@ export const useInputNumber = (_ref, inputRef) => {
20
20
  limit,
21
21
  validation = validateNumberInput,
22
22
  min,
23
- max
23
+ max,
24
+ onBlur
24
25
  } = _ref;
25
26
  const isMaxValid = max === undefined || min === undefined || Number(max) >= Number(min);
26
27
  if (!isMaxValid) {
@@ -31,11 +32,11 @@ export const useInputNumber = (_ref, inputRef) => {
31
32
  const [unformattedValue, setUnformattedValue] = useState(() => formatNumber(value, "", decimalSeparator, false, decimalLength, "long"));
32
33
  const [unformattedPrevValue, setUnformattedPrevValue] = useState(() => formatNumber(value, "", decimalSeparator, false, decimalLength, "long"));
33
34
  useEffect(() => {
34
- if (value !== prevValue) {
35
+ if (value !== prevValue && document.activeElement !== (inputRef == null ? void 0 : inputRef.current)) {
35
36
  setCurrentValue(formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short"));
36
37
  setPrevValue(formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short"));
37
- setUnformattedValue(formatNumber(value, "", decimalSeparator, trimDecimals, decimalLength, "long"));
38
- setUnformattedPrevValue(formatNumber(value, "", decimalSeparator, trimDecimals, decimalLength, "long"));
38
+ setUnformattedValue(formatNumber(value, "", decimalSeparator, false, decimalLength, "long"));
39
+ setUnformattedPrevValue(formatNumber(value, "", decimalSeparator, false, decimalLength, "long"));
39
40
  }
40
41
  // eslint-disable-next-line react-hooks/exhaustive-deps
41
42
  }, [disableAbbreviation, thousandSeparator, decimalSeparator, decimalLength, trimDecimals, value]);
@@ -50,8 +51,8 @@ export const useInputNumber = (_ref, inputRef) => {
50
51
  if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {
51
52
  const _value = formatNumber(currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short");
52
53
  setPrevValue(_value);
53
- setUnformattedPrevValue(currentValue);
54
- setUnformattedValue(currentValue);
54
+ setUnformattedPrevValue(formatNumber(currentValue, "", decimalSeparator, false, decimalLength, "long"));
55
+ setUnformattedValue(formatNumber(currentValue, "", decimalSeparator, false, decimalLength, "long"));
55
56
  setCurrentValue(_value);
56
57
  typeof onSave === "function" && onSave(e);
57
58
  } else {
@@ -69,9 +70,10 @@ export const useInputNumber = (_ref, inputRef) => {
69
70
  }
70
71
  }
71
72
  setFocused(false);
72
- }, [prevValue, unformattedPrevValue, onChange, disableAbbreviation, currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, onSave, allowEmptyValue, onCancel]);
73
+ typeof onBlur === "function" && onBlur(e);
74
+ }, [onBlur, prevValue, unformattedPrevValue, onChange, currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation, onSave, allowEmptyValue, onCancel]);
73
75
  const updateValue = useCallback(type => {
74
- const preformattedValue = String(unformattedValue).replace(",", ".");
76
+ const preformattedValue = String(unformattedValue).replace(thousandSeparator, "").replace(decimalSeparator, ".");
75
77
  const numericValue = parseFloat(preformattedValue);
76
78
  if (isNaN(numericValue)) return;
77
79
  let newValue = numericValue;
@@ -80,28 +82,22 @@ export const useInputNumber = (_ref, inputRef) => {
80
82
  } else if (type === "decrement") {
81
83
  newValue -= step;
82
84
  }
85
+ let formattedValue;
83
86
  if (decimalLength !== undefined) {
84
- newValue = parseFloat(newValue.toFixed(decimalLength));
87
+ formattedValue = newValue.toFixed(decimalLength);
85
88
  } else {
86
- newValue = parseFloat(newValue.toFixed(2));
87
- }
88
- if (min !== undefined && newValue < Number(min)) {
89
- newValue = Number(min);
90
- }
91
- if (max !== undefined && newValue > Number(max) && isMaxValid) {
92
- newValue = Number(max);
89
+ formattedValue = newValue.toFixed(2);
93
90
  }
94
91
  if (decimalLength !== undefined && decimalLength === 0) {
95
- newValue = Math.round(newValue);
92
+ formattedValue = Math.round(newValue).toString();
96
93
  }
97
- let updatedValue = String(newValue);
98
- if (updatedValue.includes(".") || updatedValue.includes(",")) {
99
- updatedValue = updatedValue.replace(".", decimalSeparator);
94
+ if (formattedValue.includes(".") || formattedValue.includes(",")) {
95
+ formattedValue = formattedValue.replace(".", decimalSeparator);
100
96
  }
101
- setUnformattedValue(updatedValue);
102
- setCurrentValue(updatedValue);
103
- if (onChange) onChange(updatedValue);
104
- }, [unformattedValue, decimalLength, min, max, isMaxValid, onChange, step, decimalSeparator]);
97
+ setUnformattedValue(formattedValue);
98
+ setCurrentValue(formattedValue);
99
+ if (onChange) onChange(formattedValue);
100
+ }, [unformattedValue, thousandSeparator, decimalSeparator, decimalLength, onChange, step]);
105
101
  const handleKeyDown = useCallback(e => {
106
102
  if (e.key === "Enter") {
107
103
  e.target.blur();
@@ -169,13 +165,22 @@ export const useInputNumber = (_ref, inputRef) => {
169
165
  }, [decimalLength, decimalSeparator, disableMacros, inputRef, limit, min, onCancel, onEnterKeyPress, updateValue, validation]);
170
166
  const handleChange = useCallback(e => {
171
167
  const inputValue = e.target.value;
172
- const numericInput = disableMacros ? inputValue : inputValue.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {
173
- return (parseFloat(num) * currencyMultiplier[unit.toLowerCase()]).toString();
168
+ const numericInput = disableMacros ? inputValue : inputValue.replace(/(\d+(?:[.,]\d+)?)([kmbtKMBT])/, (_, num, unit) => {
169
+ const normalizedNum = num.replace(",", ".");
170
+ const parts = normalizedNum.split(".");
171
+ const integerPart = parts[0];
172
+ const fractionalPart = parts[1];
173
+ const newInteger = parseInt(integerPart, 10) * currencyMultiplier[unit.toLowerCase()];
174
+ let result = newInteger.toString();
175
+ if (fractionalPart !== undefined) {
176
+ result += decimalSeparator + fractionalPart;
177
+ }
178
+ return result;
174
179
  });
175
180
  setCurrentValue(numericInput);
176
181
  setUnformattedValue(numericInput);
177
182
  if (onChange) onChange(numericInput);
178
- }, [disableMacros, onChange]);
183
+ }, [disableMacros, decimalSeparator, onChange]);
179
184
  const handleClick = useCallback(e => {
180
185
  if (typeof onClick === "function") {
181
186
  onClick(e);
@@ -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","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","toFixed","Math","round","updatedValue","includes","handleKeyDown","key","blur","preventDefault","metaKey","ctrlKey","_inputRef$current","select","input","start","selectionStart","end","selectionEnd","substring","Boolean","handleChange","inputValue","numericInput","_","num","unit","toLowerCase","toString","handleClick","handleFocus","handleDoubleClick","_inputRef$current2","onBlur","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 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}\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 }: 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 )\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 )\n );\n const [unformattedValue, setUnformattedValue] = useState(() =>\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\n )\n );\n const [unformattedPrevValue, setUnformattedPrevValue] = useState(() =>\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\n )\n );\n\n useEffect(() => {\n if (value !== prevValue) {\n setCurrentValue(\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\"\n )\n );\n setPrevValue(\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\"\n )\n );\n setUnformattedValue(\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n trimDecimals,\n decimalLength,\n \"long\"\n )\n );\n setUnformattedPrevValue(\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n trimDecimals,\n decimalLength,\n \"long\"\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 ]);\n\n const [focused, setFocused] = useState(false);\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 );\n setPrevValue(_value);\n setUnformattedPrevValue(currentValue as string);\n setUnformattedValue(currentValue as string);\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 },\n [\n prevValue,\n unformattedPrevValue,\n onChange,\n disableAbbreviation,\n currentValue,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n onSave,\n allowEmptyValue,\n onCancel,\n ]\n );\n\n const updateValue = useCallback(\n (type: \"increment\" | \"decrement\") => {\n const preformattedValue = String(unformattedValue).replace(\",\", \".\");\n const numericValue = parseFloat(preformattedValue);\n\n if (isNaN(numericValue)) return;\n\n let newValue = numericValue;\n\n if (type === \"increment\") {\n newValue += step;\n } else if (type === \"decrement\") {\n newValue -= step;\n }\n\n if (decimalLength !== undefined) {\n newValue = parseFloat(newValue.toFixed(decimalLength));\n } else {\n newValue = parseFloat(newValue.toFixed(2));\n }\n\n if (min !== undefined && newValue < Number(min)) {\n newValue = Number(min);\n }\n\n if (max !== undefined && newValue > Number(max) && isMaxValid) {\n newValue = Number(max);\n }\n\n if (decimalLength !== undefined && decimalLength === 0) {\n newValue = Math.round(newValue);\n }\n\n let updatedValue = String(newValue);\n if (updatedValue.includes(\".\") || updatedValue.includes(\",\")) {\n updatedValue = updatedValue.replace(\".\", decimalSeparator);\n }\n\n setUnformattedValue(updatedValue);\n setCurrentValue(updatedValue);\n if (onChange) onChange(updatedValue);\n },\n [\n unformattedValue,\n decimalLength,\n min,\n max,\n isMaxValid,\n onChange,\n step,\n decimalSeparator,\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(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {\n return (\n parseFloat(num) * currencyMultiplier[unit.toLowerCase()]\n ).toString();\n });\n setCurrentValue(numericInput);\n setUnformattedValue(numericInput);\n if (onChange) onChange(numericInput);\n },\n [disableMacros, 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","useInputNumber","_ref","inputRef","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","onChange","onSave","onEnterKeyPress","onClick","onCancel","allowEmptyValue","step","trimDecimals","limit","validation","min","max","onBlur","isMaxValid","undefined","Number","console","warn","currentValue","setCurrentValue","prevValue","setPrevValue","unformattedValue","setUnformattedValue","unformattedPrevValue","setUnformattedPrevValue","document","activeElement","current","focused","setFocused","escapeRef","handleBlur","e","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}\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 }: 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 )\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 )\n );\n const [unformattedValue, setUnformattedValue] = useState(() =>\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\n )\n );\n const [unformattedPrevValue, setUnformattedPrevValue] = useState(() =>\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\n )\n );\n\n useEffect(() => {\n if (value !== prevValue && document.activeElement !== inputRef?.current) {\n setCurrentValue(\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\"\n )\n );\n setPrevValue(\n formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n disableAbbreviation ? \"long\" : \"short\"\n )\n );\n setUnformattedValue(\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\n )\n );\n setUnformattedPrevValue(\n formatNumber(\n value as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\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 ]);\n\n const [focused, setFocused] = useState(false);\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 );\n setPrevValue(_value);\n setUnformattedPrevValue(\n formatNumber(\n currentValue as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\n )\n );\n setUnformattedValue(\n formatNumber(\n currentValue as string,\n \"\",\n decimalSeparator,\n false,\n decimalLength,\n \"long\"\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 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 let newValue = numericValue;\n\n if (type === \"increment\") {\n newValue += step;\n } else if (type === \"decrement\") {\n newValue -= step;\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 ]\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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"}
package/dist/index.js CHANGED
@@ -8840,7 +8840,6 @@
8840
8840
  };
8841
8841
  var targetProps = {
8842
8842
  open,
8843
- active: open,
8844
8843
  ref: handleRef,
8845
8844
  onClick: handleOpen
8846
8845
  };
@@ -14632,7 +14631,8 @@
14632
14631
  _ref$validation = _ref.validation,
14633
14632
  validation = _ref$validation === void 0 ? validateNumberInput : _ref$validation,
14634
14633
  min = _ref.min,
14635
- max = _ref.max;
14634
+ max = _ref.max,
14635
+ onBlur = _ref.onBlur;
14636
14636
  var isMaxValid = max === undefined || min === undefined || Number(max) >= Number(min);
14637
14637
  if (!isMaxValid) {
14638
14638
  console.warn("Warning: The maximum value is set to be lower than the minimum value. The maximum value will be ignored.");
@@ -14662,11 +14662,11 @@
14662
14662
  unformattedPrevValue = _useState8[0],
14663
14663
  setUnformattedPrevValue = _useState8[1];
14664
14664
  React.useEffect(function () {
14665
- if (value !== prevValue) {
14665
+ if (value !== prevValue && document.activeElement !== (inputRef === null || inputRef === void 0 ? void 0 : inputRef.current)) {
14666
14666
  setCurrentValue(formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short"));
14667
14667
  setPrevValue(formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short"));
14668
- setUnformattedValue(formatNumber(value, "", decimalSeparator, trimDecimals, decimalLength, "long"));
14669
- setUnformattedPrevValue(formatNumber(value, "", decimalSeparator, trimDecimals, decimalLength, "long"));
14668
+ setUnformattedValue(formatNumber(value, "", decimalSeparator, false, decimalLength, "long"));
14669
+ setUnformattedPrevValue(formatNumber(value, "", decimalSeparator, false, decimalLength, "long"));
14670
14670
  }
14671
14671
  // eslint-disable-next-line react-hooks/exhaustive-deps
14672
14672
  }, [disableAbbreviation, thousandSeparator, decimalSeparator, decimalLength, trimDecimals, value]);
@@ -14684,8 +14684,8 @@
14684
14684
  if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {
14685
14685
  var _value = formatNumber(currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation ? "long" : "short");
14686
14686
  setPrevValue(_value);
14687
- setUnformattedPrevValue(currentValue);
14688
- setUnformattedValue(currentValue);
14687
+ setUnformattedPrevValue(formatNumber(currentValue, "", decimalSeparator, false, decimalLength, "long"));
14688
+ setUnformattedValue(formatNumber(currentValue, "", decimalSeparator, false, decimalLength, "long"));
14689
14689
  setCurrentValue(_value);
14690
14690
  typeof onSave === "function" && onSave(e);
14691
14691
  } else {
@@ -14703,9 +14703,10 @@
14703
14703
  }
14704
14704
  }
14705
14705
  setFocused(false);
14706
- }, [prevValue, unformattedPrevValue, onChange, disableAbbreviation, currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, onSave, allowEmptyValue, onCancel]);
14706
+ typeof onBlur === "function" && onBlur(e);
14707
+ }, [onBlur, prevValue, unformattedPrevValue, onChange, currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, disableAbbreviation, onSave, allowEmptyValue, onCancel]);
14707
14708
  var updateValue = React.useCallback(function (type) {
14708
- var preformattedValue = String(unformattedValue).replace(",", ".");
14709
+ var preformattedValue = String(unformattedValue).replace(thousandSeparator, "").replace(decimalSeparator, ".");
14709
14710
  var numericValue = parseFloat(preformattedValue);
14710
14711
  if (isNaN(numericValue)) return;
14711
14712
  var newValue = numericValue;
@@ -14714,28 +14715,22 @@
14714
14715
  } else if (type === "decrement") {
14715
14716
  newValue -= step;
14716
14717
  }
14718
+ var formattedValue;
14717
14719
  if (decimalLength !== undefined) {
14718
- newValue = parseFloat(newValue.toFixed(decimalLength));
14720
+ formattedValue = newValue.toFixed(decimalLength);
14719
14721
  } else {
14720
- newValue = parseFloat(newValue.toFixed(2));
14721
- }
14722
- if (min !== undefined && newValue < Number(min)) {
14723
- newValue = Number(min);
14724
- }
14725
- if (max !== undefined && newValue > Number(max) && isMaxValid) {
14726
- newValue = Number(max);
14722
+ formattedValue = newValue.toFixed(2);
14727
14723
  }
14728
14724
  if (decimalLength !== undefined && decimalLength === 0) {
14729
- newValue = Math.round(newValue);
14725
+ formattedValue = Math.round(newValue).toString();
14730
14726
  }
14731
- var updatedValue = String(newValue);
14732
- if (updatedValue.includes(".") || updatedValue.includes(",")) {
14733
- updatedValue = updatedValue.replace(".", decimalSeparator);
14727
+ if (formattedValue.includes(".") || formattedValue.includes(",")) {
14728
+ formattedValue = formattedValue.replace(".", decimalSeparator);
14734
14729
  }
14735
- setUnformattedValue(updatedValue);
14736
- setCurrentValue(updatedValue);
14737
- if (onChange) onChange(updatedValue);
14738
- }, [unformattedValue, decimalLength, min, max, isMaxValid, onChange, step, decimalSeparator]);
14730
+ setUnformattedValue(formattedValue);
14731
+ setCurrentValue(formattedValue);
14732
+ if (onChange) onChange(formattedValue);
14733
+ }, [unformattedValue, thousandSeparator, decimalSeparator, decimalLength, onChange, step]);
14739
14734
  var handleKeyDown = React.useCallback(function (e) {
14740
14735
  if (e.key === "Enter") {
14741
14736
  e.target.blur();
@@ -14803,13 +14798,22 @@
14803
14798
  }, [decimalLength, decimalSeparator, disableMacros, inputRef, limit, min, onCancel, onEnterKeyPress, updateValue, validation]);
14804
14799
  var handleChange = React.useCallback(function (e) {
14805
14800
  var inputValue = e.target.value;
14806
- var numericInput = disableMacros ? inputValue : inputValue.replace(/([0-9.]+)([kmbtKMBT])/, function (_, num, unit) {
14807
- return (parseFloat(num) * currencyMultiplier[unit.toLowerCase()]).toString();
14801
+ var numericInput = disableMacros ? inputValue : inputValue.replace(/(\d+(?:[.,]\d+)?)([kmbtKMBT])/, function (_, num, unit) {
14802
+ var normalizedNum = num.replace(",", ".");
14803
+ var parts = normalizedNum.split(".");
14804
+ var integerPart = parts[0];
14805
+ var fractionalPart = parts[1];
14806
+ var newInteger = parseInt(integerPart, 10) * currencyMultiplier[unit.toLowerCase()];
14807
+ var result = newInteger.toString();
14808
+ if (fractionalPart !== undefined) {
14809
+ result += decimalSeparator + fractionalPart;
14810
+ }
14811
+ return result;
14808
14812
  });
14809
14813
  setCurrentValue(numericInput);
14810
14814
  setUnformattedValue(numericInput);
14811
14815
  if (onChange) onChange(numericInput);
14812
- }, [disableMacros, onChange]);
14816
+ }, [disableMacros, decimalSeparator, onChange]);
14813
14817
  var handleClick = React.useCallback(function (e) {
14814
14818
  if (typeof onClick === "function") {
14815
14819
  onClick(e);
@@ -15610,7 +15614,6 @@
15610
15614
  target,
15611
15615
  mode,
15612
15616
  open,
15613
- active: open,
15614
15617
  position,
15615
15618
  onPopperOpen: function onPopperOpen() {
15616
15619
  var _elementRef$current;
@@ -15788,10 +15791,11 @@
15788
15791
  }, [active, moreOpened, navItemNames, targetId]);
15789
15792
  React.useEffect(function () {
15790
15793
  if (!navRef.current || !wrapRef.current) return;
15791
- if (childrenWidth >= parentWidth) {
15792
- setType("dropdown");
15793
- } else {
15794
+ if (!childrenWidth || !parentWidth) return;
15795
+ if (childrenWidth < parentWidth) {
15794
15796
  setType("inline");
15797
+ } else {
15798
+ setType("dropdown");
15795
15799
  }
15796
15800
  }, [childrenWidth, parentWidth]);
15797
15801
  if (!children) return;
@@ -16147,7 +16151,7 @@
16147
16151
  });
16148
16152
  InputHours.displayName = "InputHours";
16149
16153
 
16150
- var _excluded$J = ["decimalLength", "decimalSeparator", "disableAbbreviation", "disabled", "disableMacros", "invalid", "step", "thousandSeparator", "value", "onCancel", "onSave", "onEnterKeyPress", "allowEmptyValue", "onChange", "onClick", "limit", "placeholder", "trimDecimals", "min", "max"];
16154
+ var _excluded$J = ["decimalLength", "decimalSeparator", "disableAbbreviation", "disabled", "disableMacros", "invalid", "step", "thousandSeparator", "value", "onCancel", "onSave", "onEnterKeyPress", "allowEmptyValue", "onChange", "onClick", "limit", "placeholder", "trimDecimals", "min", "max", "onBlur"];
16151
16155
  var InputNumber = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
16152
16156
  var _ref$decimalLength = _ref.decimalLength,
16153
16157
  decimalLength = _ref$decimalLength === void 0 ? 2 : _ref$decimalLength,
@@ -16176,6 +16180,7 @@
16176
16180
  trimDecimals = _ref$trimDecimals === void 0 ? true : _ref$trimDecimals,
16177
16181
  min = _ref.min,
16178
16182
  max = _ref.max,
16183
+ externalOnBlur = _ref.onBlur,
16179
16184
  rest = _objectWithoutProperties(_ref, _excluded$J);
16180
16185
  var inputRef = React.useRef(null);
16181
16186
  var handleRef = useForkRef(ref, inputRef);
@@ -16196,7 +16201,8 @@
16196
16201
  limit,
16197
16202
  trimDecimals,
16198
16203
  min,
16199
- max
16204
+ max,
16205
+ onBlur: externalOnBlur
16200
16206
  }, inputRef),
16201
16207
  value = _useInputNumber.value,
16202
16208
  onBlur = _useInputNumber.onBlur,