@activecollab/components 2.0.16 → 2.0.17

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 (55) hide show
  1. package/dist/cjs/components/EditableCurrency/EditableCurrency.js +37 -18
  2. package/dist/cjs/components/EditableCurrency/EditableCurrency.js.map +1 -1
  3. package/dist/cjs/components/Input/InputCurrency.js.map +1 -1
  4. package/dist/cjs/components/Input/InputNumber.js +35 -18
  5. package/dist/cjs/components/Input/InputNumber.js.map +1 -1
  6. package/dist/cjs/components/Input/index.js +22 -0
  7. package/dist/cjs/components/Input/index.js.map +1 -1
  8. package/dist/cjs/hooks/useInputNumber.js +151 -97
  9. package/dist/cjs/hooks/useInputNumber.js.map +1 -1
  10. package/dist/cjs/utils/currencyUtils.js +2 -2
  11. package/dist/cjs/utils/currencyUtils.js.map +1 -1
  12. package/dist/cjs/utils/currencyUtils.test.js +2 -2
  13. package/dist/cjs/utils/currencyUtils.test.js.map +1 -1
  14. package/dist/cjs/utils/index.js +3 -3
  15. package/dist/cjs/utils/index.js.map +1 -1
  16. package/dist/cjs/utils/validation.js +19 -1
  17. package/dist/cjs/utils/validation.js.map +1 -1
  18. package/dist/esm/components/EditableCurrency/EditableCurrency.d.ts +6 -2
  19. package/dist/esm/components/EditableCurrency/EditableCurrency.d.ts.map +1 -1
  20. package/dist/esm/components/EditableCurrency/EditableCurrency.js +38 -17
  21. package/dist/esm/components/EditableCurrency/EditableCurrency.js.map +1 -1
  22. package/dist/esm/components/Input/InputCurrency.d.ts +2 -3
  23. package/dist/esm/components/Input/InputCurrency.d.ts.map +1 -1
  24. package/dist/esm/components/Input/InputCurrency.js.map +1 -1
  25. package/dist/esm/components/Input/InputNumber.d.ts +4 -1
  26. package/dist/esm/components/Input/InputNumber.d.ts.map +1 -1
  27. package/dist/esm/components/Input/InputNumber.js +36 -17
  28. package/dist/esm/components/Input/InputNumber.js.map +1 -1
  29. package/dist/esm/components/Input/index.d.ts +2 -0
  30. package/dist/esm/components/Input/index.d.ts.map +1 -1
  31. package/dist/esm/components/Input/index.js +22 -0
  32. package/dist/esm/components/Input/index.js.map +1 -1
  33. package/dist/esm/hooks/useInputNumber.d.ts +25 -13
  34. package/dist/esm/hooks/useInputNumber.d.ts.map +1 -1
  35. package/dist/esm/hooks/useInputNumber.js +131 -90
  36. package/dist/esm/hooks/useInputNumber.js.map +1 -1
  37. package/dist/esm/utils/currencyUtils.d.ts +1 -1
  38. package/dist/esm/utils/currencyUtils.d.ts.map +1 -1
  39. package/dist/esm/utils/currencyUtils.js +3 -3
  40. package/dist/esm/utils/currencyUtils.js.map +1 -1
  41. package/dist/esm/utils/currencyUtils.test.js +2 -2
  42. package/dist/esm/utils/currencyUtils.test.js.map +1 -1
  43. package/dist/esm/utils/index.d.ts +1 -1
  44. package/dist/esm/utils/index.d.ts.map +1 -1
  45. package/dist/esm/utils/index.js +3 -3
  46. package/dist/esm/utils/index.js.map +1 -1
  47. package/dist/esm/utils/validation.d.ts +1 -0
  48. package/dist/esm/utils/validation.d.ts.map +1 -1
  49. package/dist/esm/utils/validation.js +20 -1
  50. package/dist/esm/utils/validation.js.map +1 -1
  51. package/dist/index.js +418 -244
  52. package/dist/index.js.map +1 -1
  53. package/dist/index.min.js +1 -1
  54. package/dist/index.min.js.map +1 -1
  55. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_Input","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_InputAdornment","_InputHours"],"sources":["../../../../src/components/Input/index.ts"],"sourcesContent":["export * from \"./Input\";\nexport * from \"./InputAdornment\";\nexport * from \"./InputHours\";\n"],"mappings":";;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,MAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,MAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,MAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,eAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,eAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,eAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,eAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,WAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,WAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,WAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,WAAA,CAAAN,GAAA;IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"index.js","names":["_Input","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_InputAdornment","_InputHours","_InputCurrency","_InputNumber"],"sources":["../../../../src/components/Input/index.ts"],"sourcesContent":["export * from \"./Input\";\nexport * from \"./InputAdornment\";\nexport * from \"./InputHours\";\nexport * from \"./InputCurrency\";\nexport * from \"./InputNumber\";\n"],"mappings":";;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,MAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,MAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,MAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,eAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,eAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,eAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,eAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,WAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,WAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,WAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,WAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AACA,IAAAO,cAAA,GAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,cAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,cAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,cAAA,CAAAP,GAAA;IAAA;EAAA;AAAA;AACA,IAAAQ,YAAA,GAAAZ,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAU,YAAA,EAAAT,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAQ,YAAA,CAAAR,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAI,YAAA,CAAAR,GAAA;IAAA;EAAA;AAAA"}
@@ -1,22 +1,34 @@
1
- import { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, MutableRefObject } from "react";
2
- import type { InputProps } from "../components";
1
+ import { MouseEvent, RefObject } from "react";
3
2
  export type Separators = "." | ",";
4
- export interface InputNumberProps extends InputProps {
3
+ export interface IInputNumber {
5
4
  decimalLength?: number;
6
5
  decimalSeparator?: Separators;
7
6
  disableAbbreviation?: boolean;
8
7
  disableMacros?: boolean;
9
8
  thousandSeparator?: Separators;
10
- onValueChange?: (value: string) => void;
9
+ onSave?: (e: Event) => void;
10
+ value?: string | number;
11
+ step?: number;
12
+ limit?: number;
13
+ onEnterKeyPress?: (val: string) => void;
14
+ onChange?: (val: string) => void;
15
+ onClick?: (event: MouseEvent<HTMLInputElement>) => void;
16
+ allowEmptyValue?: boolean;
17
+ onCancel?: (e: Event) => void;
18
+ validation?: (value: string, disableMacros: boolean, decimalSeparator: string, decimalLength: number, limit?: number) => boolean;
11
19
  }
12
- export declare const useInputNumber: ({ decimalSeparator, thousandSeparator, disableAbbreviation, disableMacros, decimalLength, value, onValueChange, onKeyDown, onBlur, onFocus, step, }: InputNumberProps, ref: MutableRefObject<HTMLInputElement | null>) => {
13
- readonly focused: boolean;
14
- readonly formattedValue: string | number | readonly string[] | undefined;
15
- readonly rootValue: string | number | readonly string[] | undefined;
16
- readonly handleChange: ChangeEventHandler<HTMLInputElement>;
17
- readonly handleKeyDown: KeyboardEventHandler<HTMLInputElement>;
18
- readonly handleBlur: FocusEventHandler<HTMLInputElement>;
19
- readonly handleFocus: FocusEventHandler<HTMLInputElement>;
20
- readonly onValueChange: ((value: string) => void) | undefined;
20
+ export declare const useInputNumber: ({ decimalSeparator, thousandSeparator, disableAbbreviation, disableMacros, decimalLength, value, onChange, onSave, onEnterKeyPress, onClick, onCancel, allowEmptyValue, step, limit, validation, }: IInputNumber, inputRef: RefObject<HTMLInputElement | null>) => {
21
+ inputProps: {
22
+ value: string | number | undefined;
23
+ onBlur: (e: any) => void;
24
+ onKeyDown: (e: any) => void;
25
+ onChange: (e: any) => void;
26
+ onClick: (e: any) => void;
27
+ onDoubleClick: () => void;
28
+ onFocus: () => void;
29
+ focused: boolean;
30
+ };
31
+ setCurrentValue: import("react").Dispatch<import("react").SetStateAction<string | number | undefined>>;
32
+ setPrevValue: import("react").Dispatch<import("react").SetStateAction<string | number | undefined>>;
21
33
  };
22
34
  //# 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,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,CAAC;AAInC,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,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,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,cAAc,wJAatB,gBAAgB,OACd,iBAAiB,gBAAgB,GAAG,IAAI,CAAC;;;;;;;;qCAjBtB,MAAM,KAAK,IAAI;CA8KxC,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,CAAC;AAEnC,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,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,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;CACd;AAED,eAAO,MAAM,cAAc,uMAiBtB,YAAY,YACL,UAAU,gBAAgB,GAAG,IAAI,CAAC;;;;;;;;;;;;;CAkP7C,CAAC"}
@@ -5,11 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useInputNumber = void 0;
7
7
  var _react = require("react");
8
+ var _utils = require("../utils");
8
9
  var _currencyUtils = require("../utils/currencyUtils");
9
- // https://www.youtube.com/watch?v=2AilA-M6N5U
10
- // @TODO: Pitati foo za testove.
11
-
12
- const useInputNumber = (_ref, ref) => {
10
+ const useInputNumber = (_ref, inputRef) => {
13
11
  let {
14
12
  decimalSeparator = ".",
15
13
  thousandSeparator = ",",
@@ -17,87 +15,50 @@ const useInputNumber = (_ref, ref) => {
17
15
  disableMacros,
18
16
  decimalLength,
19
17
  value,
20
- onValueChange,
21
- onKeyDown,
22
- onBlur,
23
- onFocus,
24
- step
18
+ onChange,
19
+ onSave,
20
+ onEnterKeyPress,
21
+ onClick,
22
+ onCancel,
23
+ allowEmptyValue,
24
+ step = 1,
25
+ limit,
26
+ validation = _utils.validateNumberInput
25
27
  } = _ref;
26
- const startValue = disableAbbreviation ? value : (0, _currencyUtils.formatCurrency)(value, thousandSeparator);
27
- const [formattedValue, setFormatted] = (0, _react.useState)(startValue);
28
- const [rootValue, setRootValue] = (0, _react.useState)(value);
28
+ const [currentValue, setCurrentValue] = (0, _react.useState)(() => disableAbbreviation ? value : (0, _currencyUtils.formatNumber)(value, thousandSeparator));
29
+ const [prevValue, setPrevValue] = (0, _react.useState)(() => disableAbbreviation ? value : (0, _currencyUtils.formatNumber)(value, thousandSeparator));
30
+ const [unformattedValue, setUnformattedValue] = (0, _react.useState)(() => value);
29
31
  const [focused, setFocused] = (0, _react.useState)(false);
30
- const handleInputBlur = () => {
31
- if (ref && ref.current) {
32
- ref.current.blur();
33
- }
34
- };
35
- const handleSelect = () => {
36
- if (ref && ref.current) {
37
- ref.current.select();
38
- }
39
- };
40
- const handleChange = e => {
41
- const inputValue = e.target.value;
42
- let isValidInput = false;
43
- if (inputValue.startsWith("00")) {
44
- return;
45
- }
46
- const numericInput = disableMacros ? inputValue : inputValue.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {
47
- return (parseFloat(num) * _currencyUtils.currencyMultiplier[unit.toLowerCase()]).toString();
48
- });
49
- const regexString = `^(-?\\d{0,9}(?:[${thousandSeparator}]?\\d{0,3})*(?:\\${decimalSeparator}\\d{0,${decimalLength}})?)?$`;
50
- if (thousandSeparator === ",") {
51
- isValidInput = new RegExp(regexString).test(numericInput);
52
- }
53
- if (thousandSeparator === ".") {
54
- isValidInput = new RegExp(regexString).test(numericInput);
55
- }
56
- if (!isValidInput) {
57
- return;
58
- }
59
- setFormatted(numericInput);
60
- onValueChange && onValueChange(numericInput);
61
- };
62
- const handleKeyDown = e => {
63
- const key = e.key;
64
- const _step = parseFloat(String(step));
65
- if (key === "Escape") {
66
- handleInputBlur();
67
- }
68
- if (key === "ArrowUp") {
69
- e.preventDefault();
70
- updateValue("increment", _step);
71
- }
72
- if (key === "ArrowDown") {
73
- e.preventDefault();
74
- updateValue("decrement", _step);
75
- }
76
- if ((e.metaKey || e.ctrlKey) && e.key === "a") {
77
- handleSelect();
78
- }
79
- if (decimalLength === 0 && e.key === decimalSeparator) {
80
- e.preventDefault();
81
- }
82
- onKeyDown && onKeyDown(e);
83
- };
84
- const handleBlur = e => {
85
- if (disableAbbreviation) {
86
- setFormatted(formattedValue);
32
+ const escapeRef = (0, _react.useRef)(false);
33
+ const handleBlur = (0, _react.useCallback)(e => {
34
+ if (escapeRef.current) {
35
+ setCurrentValue(prevValue);
36
+ setUnformattedValue(prevValue);
87
37
  } else {
88
- setFormatted((0, _currencyUtils.formatCurrency)(formattedValue, thousandSeparator));
38
+ if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {
39
+ const _value = disableAbbreviation ? currentValue : (0, _currencyUtils.formatNumber)(currentValue, thousandSeparator);
40
+ setPrevValue(_value);
41
+ setUnformattedValue(currentValue);
42
+ setCurrentValue(_value);
43
+ typeof onSave === "function" && onSave(e);
44
+ } else {
45
+ if (!allowEmptyValue) {
46
+ setCurrentValue(prevValue);
47
+ setUnformattedValue(prevValue);
48
+ typeof onCancel === "function" && onCancel(e);
49
+ } else {
50
+ if (typeof onSave === "function" && prevValue !== e.target.value) {
51
+ onSave(e);
52
+ } else {
53
+ typeof onCancel === "function" && onCancel(e);
54
+ }
55
+ }
56
+ }
89
57
  }
90
- setRootValue(formattedValue);
91
58
  setFocused(false);
92
- onBlur && onBlur(e);
93
- };
94
- const handleFocus = e => {
95
- setFormatted(rootValue);
96
- setFocused(true);
97
- onFocus && onFocus(e);
98
- };
99
- const updateValue = (type, step) => {
100
- const value = String(formattedValue);
59
+ }, [allowEmptyValue, disableAbbreviation, onCancel, onSave, prevValue, thousandSeparator, currentValue]);
60
+ const updateValue = (0, _react.useCallback)(type => {
61
+ const value = String(unformattedValue);
101
62
  let decimalPart = "";
102
63
  let increasedValue = 0;
103
64
  let nonDecimalPart = value.replaceAll(thousandSeparator, "");
@@ -119,17 +80,97 @@ const useInputNumber = (_ref, ref) => {
119
80
  increasedValue = parseFloat(increasedValue.toFixed(decimalLength));
120
81
  }
121
82
  const joinedValue = (0, _currencyUtils.numberWithSeparator)(increasedValue, thousandSeparator, value.includes(thousandSeparator));
122
- setFormatted(decimalPart ? joinedValue + decimalPart : joinedValue);
123
- };
83
+ setUnformattedValue(decimalPart ? joinedValue + decimalPart : joinedValue);
84
+ setCurrentValue(decimalPart ? joinedValue + decimalPart : joinedValue);
85
+ }, [decimalLength, decimalSeparator, step, thousandSeparator, unformattedValue]);
86
+ const handleKeyDown = (0, _react.useCallback)(e => {
87
+ if (e.key === "Enter") {
88
+ e.target.blur();
89
+ if (typeof onEnterKeyPress === "function") onEnterKeyPress(e.target.value);
90
+ }
91
+ if (e.key === "ArrowLeft") {
92
+ return;
93
+ }
94
+ if (e.key === "ArrowRight") {
95
+ return;
96
+ }
97
+ if (e.key === "ArrowUp") {
98
+ e.preventDefault();
99
+ updateValue("increment");
100
+ }
101
+ if (e.key === "ArrowDown") {
102
+ e.preventDefault();
103
+ updateValue("decrement");
104
+ }
105
+ if (e.key === "Escape") {
106
+ escapeRef.current = true;
107
+ e.target.blur();
108
+ typeof onCancel === "function" && onCancel(e);
109
+ escapeRef.current = false;
110
+ }
111
+ if (e.key === "Backspace") {
112
+ return;
113
+ }
114
+ if ((e.metaKey || e.ctrlKey) && e.key === "a") {
115
+ inputRef.current?.select();
116
+ return;
117
+ }
118
+ if (e.key === "Tab") {
119
+ return;
120
+ }
121
+ if ((e.metaKey || e.ctrlKey) && e.key === "v") {
122
+ e.preventDefault();
123
+ return;
124
+ }
125
+ const input = e.target;
126
+ const currentValue = input.value;
127
+ const start = input.selectionStart;
128
+ const end = input.selectionEnd;
129
+ const newValue = currentValue.substring(0, start) + e.key + currentValue.substring(end);
130
+ if (!validation(newValue, Boolean(disableMacros), decimalSeparator, decimalLength ?? 0, limit)) {
131
+ e.preventDefault();
132
+ return;
133
+ }
134
+ }, [decimalLength, decimalSeparator, disableMacros, inputRef, limit, onCancel, onEnterKeyPress, updateValue, validation]);
135
+ const handleChange = (0, _react.useCallback)(e => {
136
+ const inputValue = e.target.value;
137
+ const numericInput = disableMacros ? inputValue : inputValue.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {
138
+ return (parseFloat(num) * _currencyUtils.currencyMultiplier[unit.toLowerCase()]).toString();
139
+ });
140
+ setCurrentValue(numericInput);
141
+ setUnformattedValue(numericInput);
142
+ if (onChange) onChange(numericInput);
143
+ }, [disableMacros, onChange]);
144
+ const handleClick = (0, _react.useCallback)(e => {
145
+ if (typeof onClick === "function") {
146
+ onClick(e);
147
+ }
148
+ }, [onClick]);
149
+ const handleFocus = (0, _react.useCallback)(() => {
150
+ setCurrentValue(unformattedValue);
151
+ setFocused(true);
152
+ }, [unformattedValue]);
153
+ const handleDoubleClick = (0, _react.useCallback)(() => {
154
+ if (inputRef.current) {
155
+ inputRef.current?.select();
156
+ }
157
+ }, [inputRef]);
158
+ const inputProps = (0, _react.useMemo)(() => {
159
+ return {
160
+ value: currentValue,
161
+ onBlur: handleBlur,
162
+ onKeyDown: handleKeyDown,
163
+ onChange: handleChange,
164
+ onClick: handleClick,
165
+ onDoubleClick: handleDoubleClick,
166
+ onFocus: handleFocus,
167
+ focused
168
+ };
169
+ }, [currentValue, handleBlur, handleKeyDown, handleChange, handleClick, handleDoubleClick, handleFocus, focused]);
124
170
  return {
125
- focused,
126
- formattedValue,
127
- rootValue,
128
- handleChange,
129
- handleKeyDown,
130
- handleBlur,
131
- handleFocus,
132
- onValueChange
171
+ inputProps,
172
+ setCurrentValue,
173
+ setPrevValue
133
174
  };
134
175
  };
135
176
  exports.useInputNumber = useInputNumber;
@@ -1 +1 @@
1
- {"version":3,"file":"useInputNumber.js","names":["_react","require","_currencyUtils","useInputNumber","_ref","ref","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","onValueChange","onKeyDown","onBlur","onFocus","step","startValue","formatCurrency","formattedValue","setFormatted","useState","rootValue","setRootValue","focused","setFocused","handleInputBlur","current","blur","handleSelect","select","handleChange","e","inputValue","target","isValidInput","startsWith","numericInput","replace","_","num","unit","parseFloat","currencyMultiplier","toLowerCase","toString","regexString","RegExp","test","handleKeyDown","key","_step","String","preventDefault","updateValue","metaKey","ctrlKey","handleBlur","handleFocus","type","decimalPart","increasedValue","nonDecimalPart","replaceAll","includes","slice","indexOf","toFixed","joinedValue","numberWithSeparator","exports"],"sources":["../../../src/hooks/useInputNumber.tsx"],"sourcesContent":["import {\n useState,\n ChangeEventHandler,\n KeyboardEventHandler,\n FocusEventHandler,\n MutableRefObject,\n} from \"react\";\n\nimport type { InputProps } from \"../components\";\nimport {\n currencyMultiplier,\n formatCurrency,\n numberWithSeparator,\n} from \"../utils/currencyUtils\";\n\nexport type Separators = \".\" | \",\";\n\n// https://www.youtube.com/watch?v=2AilA-M6N5U\n// @TODO: Pitati foo za testove.\nexport interface InputNumberProps extends InputProps {\n decimalLength?: number;\n decimalSeparator?: Separators;\n disableAbbreviation?: boolean;\n disableMacros?: boolean;\n thousandSeparator?: Separators;\n onValueChange?: (value: string) => void;\n}\n\nexport const useInputNumber = (\n {\n decimalSeparator = \".\",\n thousandSeparator = \",\",\n disableAbbreviation,\n disableMacros,\n decimalLength,\n value,\n onValueChange,\n onKeyDown,\n onBlur,\n onFocus,\n step,\n }: InputNumberProps,\n ref: MutableRefObject<HTMLInputElement | null>\n) => {\n const startValue = disableAbbreviation\n ? value\n : formatCurrency(value as string, thousandSeparator);\n const [formattedValue, setFormatted] = useState(startValue);\n const [rootValue, setRootValue] = useState(value);\n const [focused, setFocused] = useState<boolean>(false);\n\n const handleInputBlur = () => {\n if (ref && ref.current) {\n ref.current.blur();\n }\n };\n\n const handleSelect = () => {\n if (ref && ref.current) {\n ref.current.select();\n }\n };\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n const inputValue = e.target.value;\n let isValidInput = false;\n\n if (inputValue.startsWith(\"00\")) {\n return;\n }\n\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\n const regexString = `^(-?\\\\d{0,9}(?:[${thousandSeparator}]?\\\\d{0,3})*(?:\\\\${decimalSeparator}\\\\d{0,${decimalLength}})?)?$`;\n\n if (thousandSeparator === \",\") {\n isValidInput = new RegExp(regexString).test(numericInput);\n }\n\n if (thousandSeparator === \".\") {\n isValidInput = new RegExp(regexString).test(numericInput);\n }\n\n if (!isValidInput) {\n return;\n }\n\n setFormatted(numericInput);\n\n onValueChange && onValueChange(numericInput);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (e) => {\n const key = e.key;\n const _step = parseFloat(String(step));\n\n if (key === \"Escape\") {\n handleInputBlur();\n }\n\n if (key === \"ArrowUp\") {\n e.preventDefault();\n\n updateValue(\"increment\", _step);\n }\n\n if (key === \"ArrowDown\") {\n e.preventDefault();\n\n updateValue(\"decrement\", _step);\n }\n\n if ((e.metaKey || e.ctrlKey) && e.key === \"a\") {\n handleSelect();\n }\n\n if (decimalLength === 0 && e.key === decimalSeparator) {\n e.preventDefault();\n }\n\n onKeyDown && onKeyDown(e);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (e) => {\n if (disableAbbreviation) {\n setFormatted(formattedValue);\n } else {\n setFormatted(formatCurrency(formattedValue as string, thousandSeparator));\n }\n\n setRootValue(formattedValue);\n setFocused(false);\n\n onBlur && onBlur(e);\n };\n\n const handleFocus: FocusEventHandler<HTMLInputElement> = (e) => {\n setFormatted(rootValue);\n setFocused(true);\n\n onFocus && onFocus(e);\n };\n\n const updateValue = (type: \"increment\" | \"decrement\", step: number) => {\n const value = String(formattedValue);\n\n let decimalPart = \"\";\n let increasedValue = 0;\n let nonDecimalPart = value.replaceAll(thousandSeparator, \"\");\n\n if (!value) {\n return;\n }\n\n if (value.includes(decimalSeparator)) {\n nonDecimalPart = value\n .slice(0, value.indexOf(decimalSeparator))\n .replaceAll(thousandSeparator, \"\");\n }\n\n if (value.includes(decimalSeparator)) {\n decimalPart = value.slice(value.indexOf(decimalSeparator));\n }\n\n if (type === \"increment\") {\n increasedValue = parseFloat(nonDecimalPart) + step;\n } else {\n increasedValue = parseFloat(nonDecimalPart) - step;\n }\n\n if (value.includes(decimalSeparator)) {\n increasedValue = parseFloat(increasedValue.toFixed(decimalLength));\n }\n\n const joinedValue = numberWithSeparator(\n increasedValue,\n thousandSeparator,\n value.includes(thousandSeparator)\n );\n\n setFormatted(decimalPart ? joinedValue + decimalPart : joinedValue);\n };\n\n return {\n focused,\n formattedValue,\n rootValue,\n handleChange,\n handleKeyDown,\n handleBlur,\n handleFocus,\n onValueChange,\n } as const;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useInputNumber.js","names":["_react","require","_utils","_currencyUtils","useInputNumber","_ref","inputRef","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","onChange","onSave","onEnterKeyPress","onClick","onCancel","allowEmptyValue","step","limit","validation","validateNumberInput","currentValue","setCurrentValue","useState","formatNumber","prevValue","setPrevValue","unformattedValue","setUnformattedValue","focused","setFocused","escapeRef","useRef","handleBlur","useCallback","e","current","target","trim","length","_value","updateValue","type","String","decimalPart","increasedValue","nonDecimalPart","replaceAll","includes","slice","indexOf","parseFloat","toFixed","joinedValue","numberWithSeparator","handleKeyDown","key","blur","preventDefault","metaKey","ctrlKey","select","input","start","selectionStart","end","selectionEnd","newValue","substring","Boolean","handleChange","inputValue","numericInput","replace","_","num","unit","currencyMultiplier","toLowerCase","toString","handleClick","handleFocus","handleDoubleClick","inputProps","useMemo","onBlur","onKeyDown","onDoubleClick","onFocus","exports"],"sources":["../../../src/hooks/useInputNumber.tsx"],"sourcesContent":["import {\n useState,\n MouseEvent,\n useRef,\n useCallback,\n RefObject,\n useMemo,\n} from \"react\";\n\nimport { validateNumberInput } from \"../utils\";\nimport {\n currencyMultiplier,\n formatNumber,\n numberWithSeparator,\n} 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 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}\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 limit,\n validation = validateNumberInput,\n }: IInputNumber,\n inputRef: RefObject<HTMLInputElement | null>\n) => {\n const [currentValue, setCurrentValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n const [prevValue, setPrevValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n const [unformattedValue, setUnformattedValue] = useState(() => value);\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(prevValue);\n } else {\n if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {\n const _value = disableAbbreviation\n ? currentValue\n : formatNumber(currentValue as string, thousandSeparator);\n setPrevValue(_value);\n setUnformattedValue(currentValue);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n if (!allowEmptyValue) {\n setCurrentValue(prevValue);\n setUnformattedValue(prevValue);\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 allowEmptyValue,\n disableAbbreviation,\n onCancel,\n onSave,\n prevValue,\n thousandSeparator,\n currentValue,\n ]\n );\n\n const updateValue = useCallback(\n (type: \"increment\" | \"decrement\") => {\n const value = String(unformattedValue);\n\n let decimalPart = \"\";\n let increasedValue = 0;\n let nonDecimalPart = value.replaceAll(thousandSeparator, \"\");\n\n if (!value) {\n return;\n }\n\n if (value.includes(decimalSeparator)) {\n nonDecimalPart = value\n .slice(0, value.indexOf(decimalSeparator))\n .replaceAll(thousandSeparator, \"\");\n }\n\n if (value.includes(decimalSeparator)) {\n decimalPart = value.slice(value.indexOf(decimalSeparator));\n }\n\n if (type === \"increment\") {\n increasedValue = parseFloat(nonDecimalPart) + step;\n } else {\n increasedValue = parseFloat(nonDecimalPart) - step;\n }\n\n if (value.includes(decimalSeparator)) {\n increasedValue = parseFloat(increasedValue.toFixed(decimalLength));\n }\n\n const joinedValue = numberWithSeparator(\n increasedValue,\n thousandSeparator,\n value.includes(thousandSeparator)\n );\n\n setUnformattedValue(\n decimalPart ? joinedValue + decimalPart : joinedValue\n );\n setCurrentValue(decimalPart ? joinedValue + decimalPart : joinedValue);\n },\n [decimalLength, decimalSeparator, step, thousandSeparator, unformattedValue]\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.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 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 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 const inputProps = useMemo(() => {\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 };\n }, [\n currentValue,\n handleBlur,\n handleKeyDown,\n handleChange,\n handleClick,\n handleDoubleClick,\n handleFocus,\n focused,\n ]);\n\n return {\n inputProps,\n setCurrentValue,\n setPrevValue,\n };\n};\n"],"mappings":"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"}
@@ -5,6 +5,6 @@ export declare const currencyMultiplier: {
5
5
  b: number;
6
6
  t: number;
7
7
  };
8
- export declare const formatCurrency: (n: string, thousandSeparator?: string) => string;
8
+ export declare const formatNumber: (n: string, thousandSeparator?: string) => string;
9
9
  export declare const numberWithSeparator: (x: number | string, thousandSeparator: Separators, format?: boolean) => string | number;
10
10
  //# sourceMappingURL=currencyUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"currencyUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/currencyUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF,eAAO,MAAM,cAAc,MAAO,MAAM,uCA2BvC,CAAC;AAEF,eAAO,MAAM,mBAAmB,MAC3B,MAAM,GAAG,MAAM,qBACC,UAAU,sCAW9B,CAAC"}
1
+ {"version":3,"file":"currencyUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/currencyUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF,eAAO,MAAM,YAAY,MAAO,MAAM,uCA2BrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,MAC3B,MAAM,GAAG,MAAM,qBACC,UAAU,sCAW9B,CAAC"}
@@ -3,14 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.numberWithSeparator = exports.formatCurrency = exports.currencyMultiplier = void 0;
6
+ exports.numberWithSeparator = exports.formatNumber = exports.currencyMultiplier = void 0;
7
7
  const currencyMultiplier = exports.currencyMultiplier = {
8
8
  k: 1_000,
9
9
  m: 1_000_000,
10
10
  b: 1_000_000_000,
11
11
  t: 1_000_000_000_000
12
12
  };
13
- const formatCurrency = function (n) {
13
+ const formatNumber = function (n) {
14
14
  let thousandSeparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ",";
15
15
  const number = parseFloat(String(n).replaceAll(thousandSeparator, ""));
16
16
  if (isNaN(number)) {
@@ -28,7 +28,7 @@ const formatCurrency = function (n) {
28
28
  const result = formattedNum.endsWith(".0") ? formattedNum.slice(0, -2) : formattedNum;
29
29
  return isNegative ? `-${result}${suffixes[scale]}` : `${result}${suffixes[scale]}`;
30
30
  };
31
- exports.formatCurrency = formatCurrency;
31
+ exports.formatNumber = formatNumber;
32
32
  const numberWithSeparator = function (x, thousandSeparator) {
33
33
  let format = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
34
34
  if (!format) {
@@ -1 +1 @@
1
- {"version":3,"file":"currencyUtils.js","names":["currencyMultiplier","exports","k","m","b","t","formatCurrency","n","thousandSeparator","arguments","length","undefined","number","parseFloat","String","replaceAll","isNaN","isNegative","absoluteNumber","Math","abs","suffixes","scale","formattedNum","toFixed","result","endsWith","slice","numberWithSeparator","x","format","parts","toString","split","replace","join"],"sources":["../../../src/utils/currencyUtils.ts"],"sourcesContent":["import { Separators } from \"../hooks\";\n\nexport 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 formatCurrency = (n: string, thousandSeparator = \",\") => {\n const number = parseFloat(String(n).replaceAll(thousandSeparator, \"\"));\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 while (absoluteNumber >= 1000 && scale < suffixes.length - 1) {\n absoluteNumber /= 1000;\n scale++;\n }\n\n const formattedNum =\n scale === 0 ? absoluteNumber.toFixed(0) : absoluteNumber.toFixed(1);\n const result = formattedNum.endsWith(\".0\")\n ? formattedNum.slice(0, -2)\n : formattedNum;\n\n return isNegative\n ? `-${result}${suffixes[scale]}`\n : `${result}${suffixes[scale]}`;\n};\n\nexport const numberWithSeparator = (\n x: number | string,\n thousandSeparator: Separators,\n format = true\n) => {\n if (!format) {\n return x;\n }\n\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n\n return parts.join(\".\");\n};\n"],"mappings":";;;;;;AAEO,MAAMA,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG;EAChCE,CAAC,EAAE,KAAK;EACRC,CAAC,EAAE,SAAS;EACZC,CAAC,EAAE,aAAa;EAChBC,CAAC,EAAE;AACL,CAAC;AAEM,MAAMC,cAAc,GAAG,SAAAA,CAACC,CAAS,EAA8B;EAAA,IAA5BC,iBAAiB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,GAAG;EAC/D,MAAMG,MAAM,GAAGC,UAAU,CAACC,MAAM,CAACP,CAAC,CAAC,CAACQ,UAAU,CAACP,iBAAiB,EAAE,EAAE,CAAC,CAAC;EAEtE,IAAIQ,KAAK,CAACJ,MAAM,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,MAAMK,UAAU,GAAGL,MAAM,GAAG,CAAC;EAC7B,IAAIM,cAAc,GAAGC,IAAI,CAACC,GAAG,CAACR,MAAM,CAAC;EAErC,MAAMS,QAAQ,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;EACzC,IAAIC,KAAK,GAAG,CAAC;EAEb,OAAOJ,cAAc,IAAI,IAAI,IAAII,KAAK,GAAGD,QAAQ,CAACX,MAAM,GAAG,CAAC,EAAE;IAC5DQ,cAAc,IAAI,IAAI;IACtBI,KAAK,EAAE;EACT;EAEA,MAAMC,YAAY,GAChBD,KAAK,KAAK,CAAC,GAAGJ,cAAc,CAACM,OAAO,CAAC,CAAC,CAAC,GAAGN,cAAc,CAACM,OAAO,CAAC,CAAC,CAAC;EACrE,MAAMC,MAAM,GAAGF,YAAY,CAACG,QAAQ,CAAC,IAAI,CAAC,GACtCH,YAAY,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACzBJ,YAAY;EAEhB,OAAON,UAAU,GACZ,IAAGQ,MAAO,GAAEJ,QAAQ,CAACC,KAAK,CAAE,EAAC,GAC7B,GAAEG,MAAO,GAAEJ,QAAQ,CAACC,KAAK,CAAE,EAAC;AACnC,CAAC;AAACrB,OAAA,CAAAK,cAAA,GAAAA,cAAA;AAEK,MAAMsB,mBAAmB,GAAG,SAAAA,CACjCC,CAAkB,EAClBrB,iBAA6B,EAE1B;EAAA,IADHsB,MAAM,GAAArB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;EAEb,IAAI,CAACqB,MAAM,EAAE;IACX,OAAOD,CAAC;EACV;EAEA,MAAME,KAAK,GAAGF,CAAC,CAACG,QAAQ,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;EACrCF,KAAK,CAAC,CAAC,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC,CAACG,OAAO,CAAC,uBAAuB,EAAE1B,iBAAiB,CAAC;EAEvE,OAAOuB,KAAK,CAACI,IAAI,CAAC,GAAG,CAAC;AACxB,CAAC;AAAClC,OAAA,CAAA2B,mBAAA,GAAAA,mBAAA"}
1
+ {"version":3,"file":"currencyUtils.js","names":["currencyMultiplier","exports","k","m","b","t","formatNumber","n","thousandSeparator","arguments","length","undefined","number","parseFloat","String","replaceAll","isNaN","isNegative","absoluteNumber","Math","abs","suffixes","scale","formattedNum","toFixed","result","endsWith","slice","numberWithSeparator","x","format","parts","toString","split","replace","join"],"sources":["../../../src/utils/currencyUtils.ts"],"sourcesContent":["import { Separators } from \"../hooks\";\n\nexport 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 formatNumber = (n: string, thousandSeparator = \",\") => {\n const number = parseFloat(String(n).replaceAll(thousandSeparator, \"\"));\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 while (absoluteNumber >= 1000 && scale < suffixes.length - 1) {\n absoluteNumber /= 1000;\n scale++;\n }\n\n const formattedNum =\n scale === 0 ? absoluteNumber.toFixed(0) : absoluteNumber.toFixed(1);\n const result = formattedNum.endsWith(\".0\")\n ? formattedNum.slice(0, -2)\n : formattedNum;\n\n return isNegative\n ? `-${result}${suffixes[scale]}`\n : `${result}${suffixes[scale]}`;\n};\n\nexport const numberWithSeparator = (\n x: number | string,\n thousandSeparator: Separators,\n format = true\n) => {\n if (!format) {\n return x;\n }\n\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n\n return parts.join(\".\");\n};\n"],"mappings":";;;;;;AAEO,MAAMA,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG;EAChCE,CAAC,EAAE,KAAK;EACRC,CAAC,EAAE,SAAS;EACZC,CAAC,EAAE,aAAa;EAChBC,CAAC,EAAE;AACL,CAAC;AAEM,MAAMC,YAAY,GAAG,SAAAA,CAACC,CAAS,EAA8B;EAAA,IAA5BC,iBAAiB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,GAAG;EAC7D,MAAMG,MAAM,GAAGC,UAAU,CAACC,MAAM,CAACP,CAAC,CAAC,CAACQ,UAAU,CAACP,iBAAiB,EAAE,EAAE,CAAC,CAAC;EAEtE,IAAIQ,KAAK,CAACJ,MAAM,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,MAAMK,UAAU,GAAGL,MAAM,GAAG,CAAC;EAC7B,IAAIM,cAAc,GAAGC,IAAI,CAACC,GAAG,CAACR,MAAM,CAAC;EAErC,MAAMS,QAAQ,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;EACzC,IAAIC,KAAK,GAAG,CAAC;EAEb,OAAOJ,cAAc,IAAI,IAAI,IAAII,KAAK,GAAGD,QAAQ,CAACX,MAAM,GAAG,CAAC,EAAE;IAC5DQ,cAAc,IAAI,IAAI;IACtBI,KAAK,EAAE;EACT;EAEA,MAAMC,YAAY,GAChBD,KAAK,KAAK,CAAC,GAAGJ,cAAc,CAACM,OAAO,CAAC,CAAC,CAAC,GAAGN,cAAc,CAACM,OAAO,CAAC,CAAC,CAAC;EACrE,MAAMC,MAAM,GAAGF,YAAY,CAACG,QAAQ,CAAC,IAAI,CAAC,GACtCH,YAAY,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACzBJ,YAAY;EAEhB,OAAON,UAAU,GACZ,IAAGQ,MAAO,GAAEJ,QAAQ,CAACC,KAAK,CAAE,EAAC,GAC7B,GAAEG,MAAO,GAAEJ,QAAQ,CAACC,KAAK,CAAE,EAAC;AACnC,CAAC;AAACrB,OAAA,CAAAK,YAAA,GAAAA,YAAA;AAEK,MAAMsB,mBAAmB,GAAG,SAAAA,CACjCC,CAAkB,EAClBrB,iBAA6B,EAE1B;EAAA,IADHsB,MAAM,GAAArB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;EAEb,IAAI,CAACqB,MAAM,EAAE;IACX,OAAOD,CAAC;EACV;EAEA,MAAME,KAAK,GAAGF,CAAC,CAACG,QAAQ,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;EACrCF,KAAK,CAAC,CAAC,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC,CAACG,OAAO,CAAC,uBAAuB,EAAE1B,iBAAiB,CAAC;EAEvE,OAAOuB,KAAK,CAACI,IAAI,CAAC,GAAG,CAAC;AACxB,CAAC;AAAClC,OAAA,CAAA2B,mBAAA,GAAAA,mBAAA"}
@@ -3,12 +3,12 @@
3
3
  var _currencyUtils = require("./currencyUtils");
4
4
  describe("format currency with thousandseparator set to ',' and decimalSeparator to '.'", () => {
5
5
  it.each([["", ""], ["10", "10"], ["1000", "1K"], ["1000.00", "1K"], ["1200.50", "1.2K"], ["1,200.00", "1.2K"], ["2,240.00", "2.2K"], ["22,240.00", "22.2K"], ["50,000,000.00", "50M"], ["-50,000.00", "-50K"], ["-1,200", "-1.2K"], ["-90,000,000.00", "-90M"]])("should format currency", (value, expected) => {
6
- expect((0, _currencyUtils.formatCurrency)(value, ",")).toEqual(expected);
6
+ expect((0, _currencyUtils.formatNumber)(value, ",")).toEqual(expected);
7
7
  });
8
8
  });
9
9
  describe("format currency with thousandseparator set to '.' and decimalSeparator to ','", () => {
10
10
  it.each([["", ""], ["10", "10"], ["1000", "1K"], ["1000,00", "1K"], ["1200,50", "1.2K"], ["1.200,00", "1.2K"], ["2.240,00", "2.2K"], ["22.240,00", "22.2K"], ["50.000.000,00", "50M"], ["-50.000,00", "-50K"], ["-1.200", "-1.2K"], ["-90.000.000,00", "-90M"]])("should format currency", (value, expected) => {
11
- expect((0, _currencyUtils.formatCurrency)(value, ".")).toEqual(expected);
11
+ expect((0, _currencyUtils.formatNumber)(value, ".")).toEqual(expected);
12
12
  });
13
13
  });
14
14
  describe("numberWithSeparator", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"currencyUtils.test.js","names":["_currencyUtils","require","describe","it","each","value","expected","expect","formatCurrency","toEqual","test","result","numberWithSeparator","toBe"],"sources":["../../../src/utils/currencyUtils.test.ts"],"sourcesContent":["import { formatCurrency, numberWithSeparator } from \"./currencyUtils\";\n\ndescribe(\"format currency with thousandseparator set to ',' and decimalSeparator to '.'\", () => {\n it.each([\n [\"\", \"\"],\n [\"10\", \"10\"],\n [\"1000\", \"1K\"],\n [\"1000.00\", \"1K\"],\n [\"1200.50\", \"1.2K\"],\n [\"1,200.00\", \"1.2K\"],\n [\"2,240.00\", \"2.2K\"],\n [\"22,240.00\", \"22.2K\"],\n [\"50,000,000.00\", \"50M\"],\n [\"-50,000.00\", \"-50K\"],\n [\"-1,200\", \"-1.2K\"],\n [\"-90,000,000.00\", \"-90M\"],\n ])(\"should format currency\", (value, expected) => {\n expect(formatCurrency(value, \",\")).toEqual(expected);\n });\n});\n\ndescribe(\"format currency with thousandseparator set to '.' and decimalSeparator to ','\", () => {\n it.each([\n [\"\", \"\"],\n [\"10\", \"10\"],\n [\"1000\", \"1K\"],\n [\"1000,00\", \"1K\"],\n [\"1200,50\", \"1.2K\"],\n [\"1.200,00\", \"1.2K\"],\n [\"2.240,00\", \"2.2K\"],\n [\"22.240,00\", \"22.2K\"],\n [\"50.000.000,00\", \"50M\"],\n [\"-50.000,00\", \"-50K\"],\n [\"-1.200\", \"-1.2K\"],\n [\"-90.000.000,00\", \"-90M\"],\n ])(\"should format currency\", (value, expected) => {\n expect(formatCurrency(value, \".\")).toEqual(expected);\n });\n});\n\ndescribe(\"numberWithSeparator\", () => {\n test(\"should format number with thousand separator\", () => {\n const result = numberWithSeparator(1000, \",\");\n expect(result).toBe(\"1,000\");\n });\n\n test(\"should format string number with thousand separator\", () => {\n const result = numberWithSeparator(\"1000\", \",\");\n expect(result).toBe(\"1,000\");\n });\n\n test(\"should format decimal number with thousand separator and keep decimal part\", () => {\n const result = numberWithSeparator(12345.67, \",\");\n expect(result).toBe(\"12,345.67\");\n });\n\n test(\"should not format when format is set to false\", () => {\n const result = numberWithSeparator(1000, \",\", false);\n expect(result).toBe(1000);\n });\n\n test(\"should handle zero with thousand separator\", () => {\n const result = numberWithSeparator(0, \",\");\n expect(result).toBe(\"0\");\n });\n\n test(\"should handle negative number with thousand separator\", () => {\n const result = numberWithSeparator(-123456789, \",\");\n expect(result).toBe(\"-123,456,789\");\n });\n\n test(\"should not format\", () => {\n const result = numberWithSeparator(123456789, \",\", false);\n expect(result).toBe(123456789);\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"currencyUtils.test.js","names":["_currencyUtils","require","describe","it","each","value","expected","expect","formatNumber","toEqual","test","result","numberWithSeparator","toBe"],"sources":["../../../src/utils/currencyUtils.test.ts"],"sourcesContent":["import { formatNumber, numberWithSeparator } from \"./currencyUtils\";\n\ndescribe(\"format currency with thousandseparator set to ',' and decimalSeparator to '.'\", () => {\n it.each([\n [\"\", \"\"],\n [\"10\", \"10\"],\n [\"1000\", \"1K\"],\n [\"1000.00\", \"1K\"],\n [\"1200.50\", \"1.2K\"],\n [\"1,200.00\", \"1.2K\"],\n [\"2,240.00\", \"2.2K\"],\n [\"22,240.00\", \"22.2K\"],\n [\"50,000,000.00\", \"50M\"],\n [\"-50,000.00\", \"-50K\"],\n [\"-1,200\", \"-1.2K\"],\n [\"-90,000,000.00\", \"-90M\"],\n ])(\"should format currency\", (value, expected) => {\n expect(formatNumber(value, \",\")).toEqual(expected);\n });\n});\n\ndescribe(\"format currency with thousandseparator set to '.' and decimalSeparator to ','\", () => {\n it.each([\n [\"\", \"\"],\n [\"10\", \"10\"],\n [\"1000\", \"1K\"],\n [\"1000,00\", \"1K\"],\n [\"1200,50\", \"1.2K\"],\n [\"1.200,00\", \"1.2K\"],\n [\"2.240,00\", \"2.2K\"],\n [\"22.240,00\", \"22.2K\"],\n [\"50.000.000,00\", \"50M\"],\n [\"-50.000,00\", \"-50K\"],\n [\"-1.200\", \"-1.2K\"],\n [\"-90.000.000,00\", \"-90M\"],\n ])(\"should format currency\", (value, expected) => {\n expect(formatNumber(value, \".\")).toEqual(expected);\n });\n});\n\ndescribe(\"numberWithSeparator\", () => {\n test(\"should format number with thousand separator\", () => {\n const result = numberWithSeparator(1000, \",\");\n expect(result).toBe(\"1,000\");\n });\n\n test(\"should format string number with thousand separator\", () => {\n const result = numberWithSeparator(\"1000\", \",\");\n expect(result).toBe(\"1,000\");\n });\n\n test(\"should format decimal number with thousand separator and keep decimal part\", () => {\n const result = numberWithSeparator(12345.67, \",\");\n expect(result).toBe(\"12,345.67\");\n });\n\n test(\"should not format when format is set to false\", () => {\n const result = numberWithSeparator(1000, \",\", false);\n expect(result).toBe(1000);\n });\n\n test(\"should handle zero with thousand separator\", () => {\n const result = numberWithSeparator(0, \",\");\n expect(result).toBe(\"0\");\n });\n\n test(\"should handle negative number with thousand separator\", () => {\n const result = numberWithSeparator(-123456789, \",\");\n expect(result).toBe(\"-123,456,789\");\n });\n\n test(\"should not format\", () => {\n const result = numberWithSeparator(123456789, \",\", false);\n expect(result).toBe(123456789);\n });\n});\n"],"mappings":"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"}
@@ -4,5 +4,5 @@ export * from "./validation";
4
4
  export { default as useForkRef } from "./useForkRef";
5
5
  export { default as useResizeObserver } from "./useResizeObserver";
6
6
  export { decimalToHours } from "./timeUtils";
7
- export { formatCurrency, numberWithSeparator } from "./currencyUtils";
7
+ export { formatNumber, numberWithSeparator } from "./currencyUtils";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -8,7 +8,7 @@ var _exportNames = {
8
8
  useForkRef: true,
9
9
  useResizeObserver: true,
10
10
  decimalToHours: true,
11
- formatCurrency: true,
11
+ formatNumber: true,
12
12
  numberWithSeparator: true
13
13
  };
14
14
  Object.defineProperty(exports, "decimalToHours", {
@@ -17,10 +17,10 @@ Object.defineProperty(exports, "decimalToHours", {
17
17
  return _timeUtils.decimalToHours;
18
18
  }
19
19
  });
20
- Object.defineProperty(exports, "formatCurrency", {
20
+ Object.defineProperty(exports, "formatNumber", {
21
21
  enumerable: true,
22
22
  get: function () {
23
- return _currencyUtils.formatCurrency;
23
+ return _currencyUtils.formatNumber;
24
24
  }
25
25
  });
26
26
  Object.defineProperty(exports, "numberWithSeparator", {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_layers","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_colors","_validation","_useForkRef","_interopRequireDefault","_useResizeObserver","_timeUtils","_currencyUtils"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./layers\";\nexport * from \"./colors\";\nexport * from \"./validation\";\nexport { default as useForkRef } from \"./useForkRef\";\nexport { default as useResizeObserver } from \"./useResizeObserver\";\nexport { decimalToHours } from \"./timeUtils\";\nexport { formatCurrency, numberWithSeparator } from \"./currencyUtils\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,OAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,OAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,OAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,OAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,WAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,WAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,WAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,WAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AACA,IAAAW,WAAA,GAAAC,sBAAA,CAAAhB,OAAA;AACA,IAAAiB,kBAAA,GAAAD,sBAAA,CAAAhB,OAAA;AACA,IAAAkB,UAAA,GAAAlB,OAAA;AACA,IAAAmB,cAAA,GAAAnB,OAAA"}
1
+ {"version":3,"file":"index.js","names":["_layers","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_colors","_validation","_useForkRef","_interopRequireDefault","_useResizeObserver","_timeUtils","_currencyUtils"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./layers\";\nexport * from \"./colors\";\nexport * from \"./validation\";\nexport { default as useForkRef } from \"./useForkRef\";\nexport { default as useResizeObserver } from \"./useResizeObserver\";\nexport { decimalToHours } from \"./timeUtils\";\nexport { formatNumber, numberWithSeparator } from \"./currencyUtils\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,OAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,OAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,OAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,OAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,WAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,WAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,WAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,WAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AACA,IAAAW,WAAA,GAAAC,sBAAA,CAAAhB,OAAA;AACA,IAAAiB,kBAAA,GAAAD,sBAAA,CAAAhB,OAAA;AACA,IAAAkB,UAAA,GAAAlB,OAAA;AACA,IAAAmB,cAAA,GAAAnB,OAAA"}
@@ -1,3 +1,4 @@
1
1
  export declare const validateStopwatchTime: (value: string) => boolean;
2
2
  export declare const validateTimeInput: (value: string, withLeadingZero: boolean) => boolean;
3
+ export declare const validateNumberInput: (value: string, disableMacros: boolean, decimalSeparator: string, decimalLength: number, limit?: number) => boolean;
3
4
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,UAAW,MAAM,YAIlD,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM,mBAAmB,OAAO,YAUxE,CAAC"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,UAAW,MAAM,YAIlD,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM,mBAAmB,OAAO,YAUxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,UACvB,MAAM,iBACE,OAAO,oBACJ,MAAM,iBACT,MAAM,UACb,MAAM,YA4Bf,CAAC"}
@@ -3,7 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.validateTimeInput = exports.validateStopwatchTime = void 0;
6
+ exports.validateTimeInput = exports.validateStopwatchTime = exports.validateNumberInput = void 0;
7
+ var _currencyUtils = require("./currencyUtils");
7
8
  const validateStopwatchTime = value => {
8
9
  return /^([0-9]{0,2})?(((:([0-5][0-9])?)|(:[0-5]?))|(\.[0-9]{0,2})|(,[0-9]{0,2}))?$/g.test(value);
9
10
  };
@@ -16,4 +17,22 @@ const validateTimeInput = (value, withLeadingZero) => {
16
17
  }
17
18
  };
18
19
  exports.validateTimeInput = validateTimeInput;
20
+ const validateNumberInput = (value, disableMacros, decimalSeparator, decimalLength, limit) => {
21
+ if (value.startsWith("00")) {
22
+ return false;
23
+ }
24
+ const numericInput = disableMacros ? value : value.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {
25
+ return (parseFloat(num) * _currencyUtils.currencyMultiplier[unit.toLowerCase()]).toString();
26
+ });
27
+ if (limit) {
28
+ const decimalIndex = numericInput.indexOf(decimalSeparator);
29
+ const integerPart = decimalIndex !== -1 ? numericInput.substring(0, decimalIndex) : numericInput;
30
+ if (integerPart.length > limit) {
31
+ return false;
32
+ }
33
+ }
34
+ const regexString = `^(-?\\d{0,9}(?:\\${decimalSeparator}\\d{0,${decimalLength}})?)?$`;
35
+ return new RegExp(regexString).test(numericInput);
36
+ };
37
+ exports.validateNumberInput = validateNumberInput;
19
38
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":["validateStopwatchTime","value","test","exports","validateTimeInput","withLeadingZero"],"sources":["../../../src/utils/validation.ts"],"sourcesContent":["export const validateStopwatchTime = (value: string) => {\n return /^([0-9]{0,2})?(((:([0-5][0-9])?)|(:[0-5]?))|(\\.[0-9]{0,2})|(,[0-9]{0,2}))?$/g.test(\n value\n );\n};\n\nexport const validateTimeInput = (value: string, withLeadingZero: boolean) => {\n if (withLeadingZero) {\n return /^(([0-9][0-9]?|[1-9][0-9]{2,8})?(([:,.][0-5][0-9]?)|([:,.][0-5]?)|(\\.[0-9]{1,2})|(,[0-9]{1,2}))?)$/.test(\n value\n );\n } else {\n return /^(([1-9][0-9]*|0)?(([:,.][0-5][0-9]?)|([:,.][0-5]?)|(\\.[0-9]{1,2})|(,[0-9]{1,2}))?)$/.test(\n value\n );\n }\n};\n"],"mappings":";;;;;;AAAO,MAAMA,qBAAqB,GAAIC,KAAa,IAAK;EACtD,OAAO,8EAA8E,CAACC,IAAI,CACxFD,KACF,CAAC;AACH,CAAC;AAACE,OAAA,CAAAH,qBAAA,GAAAA,qBAAA;AAEK,MAAMI,iBAAiB,GAAGA,CAACH,KAAa,EAAEI,eAAwB,KAAK;EAC5E,IAAIA,eAAe,EAAE;IACnB,OAAO,oGAAoG,CAACH,IAAI,CAC9GD,KACF,CAAC;EACH,CAAC,MAAM;IACL,OAAO,sFAAsF,CAACC,IAAI,CAChGD,KACF,CAAC;EACH;AACF,CAAC;AAACE,OAAA,CAAAC,iBAAA,GAAAA,iBAAA"}
1
+ {"version":3,"file":"validation.js","names":["_currencyUtils","require","validateStopwatchTime","value","test","exports","validateTimeInput","withLeadingZero","validateNumberInput","disableMacros","decimalSeparator","decimalLength","limit","startsWith","numericInput","replace","_","num","unit","parseFloat","currencyMultiplier","toLowerCase","toString","decimalIndex","indexOf","integerPart","substring","length","regexString","RegExp"],"sources":["../../../src/utils/validation.ts"],"sourcesContent":["import { currencyMultiplier } from \"./currencyUtils\";\n\nexport const validateStopwatchTime = (value: string) => {\n return /^([0-9]{0,2})?(((:([0-5][0-9])?)|(:[0-5]?))|(\\.[0-9]{0,2})|(,[0-9]{0,2}))?$/g.test(\n value\n );\n};\n\nexport const validateTimeInput = (value: string, withLeadingZero: boolean) => {\n if (withLeadingZero) {\n return /^(([0-9][0-9]?|[1-9][0-9]{2,8})?(([:,.][0-5][0-9]?)|([:,.][0-5]?)|(\\.[0-9]{1,2})|(,[0-9]{1,2}))?)$/.test(\n value\n );\n } else {\n return /^(([1-9][0-9]*|0)?(([:,.][0-5][0-9]?)|([:,.][0-5]?)|(\\.[0-9]{1,2})|(,[0-9]{1,2}))?)$/.test(\n value\n );\n }\n};\n\nexport const validateNumberInput = (\n value: string,\n disableMacros: boolean,\n decimalSeparator: string,\n decimalLength: number,\n limit?: number\n) => {\n if (value.startsWith(\"00\")) {\n return false;\n }\n\n const numericInput = disableMacros\n ? value\n : value.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {\n return (\n parseFloat(num) * currencyMultiplier[unit.toLowerCase()]\n ).toString();\n });\n\n if (limit) {\n const decimalIndex = numericInput.indexOf(decimalSeparator);\n const integerPart =\n decimalIndex !== -1\n ? numericInput.substring(0, decimalIndex)\n : numericInput;\n if (integerPart.length > limit) {\n return false;\n }\n }\n\n const regexString = `^(-?\\\\d{0,9}(?:\\\\${decimalSeparator}\\\\d{0,${decimalLength}})?)?$`;\n\n return new RegExp(regexString).test(numericInput);\n};\n"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAEO,MAAMC,qBAAqB,GAAIC,KAAa,IAAK;EACtD,OAAO,8EAA8E,CAACC,IAAI,CACxFD,KACF,CAAC;AACH,CAAC;AAACE,OAAA,CAAAH,qBAAA,GAAAA,qBAAA;AAEK,MAAMI,iBAAiB,GAAGA,CAACH,KAAa,EAAEI,eAAwB,KAAK;EAC5E,IAAIA,eAAe,EAAE;IACnB,OAAO,oGAAoG,CAACH,IAAI,CAC9GD,KACF,CAAC;EACH,CAAC,MAAM;IACL,OAAO,sFAAsF,CAACC,IAAI,CAChGD,KACF,CAAC;EACH;AACF,CAAC;AAACE,OAAA,CAAAC,iBAAA,GAAAA,iBAAA;AAEK,MAAME,mBAAmB,GAAGA,CACjCL,KAAa,EACbM,aAAsB,EACtBC,gBAAwB,EACxBC,aAAqB,EACrBC,KAAc,KACX;EACH,IAAIT,KAAK,CAACU,UAAU,CAAC,IAAI,CAAC,EAAE;IAC1B,OAAO,KAAK;EACd;EAEA,MAAMC,YAAY,GAAGL,aAAa,GAC9BN,KAAK,GACLA,KAAK,CAACY,OAAO,CAAC,uBAAuB,EAAE,CAACC,CAAC,EAAEC,GAAG,EAAEC,IAAI,KAAK;IACvD,OAAO,CACLC,UAAU,CAACF,GAAG,CAAC,GAAGG,iCAAkB,CAACF,IAAI,CAACG,WAAW,CAAC,CAAC,CAAC,EACxDC,QAAQ,CAAC,CAAC;EACd,CAAC,CAAC;EAEN,IAAIV,KAAK,EAAE;IACT,MAAMW,YAAY,GAAGT,YAAY,CAACU,OAAO,CAACd,gBAAgB,CAAC;IAC3D,MAAMe,WAAW,GACfF,YAAY,KAAK,CAAC,CAAC,GACfT,YAAY,CAACY,SAAS,CAAC,CAAC,EAAEH,YAAY,CAAC,GACvCT,YAAY;IAClB,IAAIW,WAAW,CAACE,MAAM,GAAGf,KAAK,EAAE;MAC9B,OAAO,KAAK;IACd;EACF;EAEA,MAAMgB,WAAW,GAAI,oBAAmBlB,gBAAiB,SAAQC,aAAc,QAAO;EAEtF,OAAO,IAAIkB,MAAM,CAACD,WAAW,CAAC,CAACxB,IAAI,CAACU,YAAY,CAAC;AACnD,CAAC;AAACT,OAAA,CAAAG,mBAAA,GAAAA,mBAAA"}