@activecollab/components 2.0.16 → 2.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/EditableCurrency/EditableCurrency.js +38 -18
- package/dist/cjs/components/EditableCurrency/EditableCurrency.js.map +1 -1
- package/dist/cjs/components/Input/InputCurrency.js.map +1 -1
- package/dist/cjs/components/Input/InputNumber.js +35 -18
- package/dist/cjs/components/Input/InputNumber.js.map +1 -1
- package/dist/cjs/components/Input/index.js +22 -0
- package/dist/cjs/components/Input/index.js.map +1 -1
- package/dist/cjs/hooks/useInputNumber.js +152 -97
- package/dist/cjs/hooks/useInputNumber.js.map +1 -1
- package/dist/cjs/utils/currencyUtils.js +2 -2
- package/dist/cjs/utils/currencyUtils.js.map +1 -1
- package/dist/cjs/utils/currencyUtils.test.js +2 -2
- package/dist/cjs/utils/currencyUtils.test.js.map +1 -1
- package/dist/cjs/utils/index.js +3 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/validation.js +19 -1
- package/dist/cjs/utils/validation.js.map +1 -1
- package/dist/esm/components/EditableCurrency/EditableCurrency.d.ts +6 -2
- package/dist/esm/components/EditableCurrency/EditableCurrency.d.ts.map +1 -1
- package/dist/esm/components/EditableCurrency/EditableCurrency.js +39 -17
- package/dist/esm/components/EditableCurrency/EditableCurrency.js.map +1 -1
- package/dist/esm/components/Input/InputCurrency.d.ts +2 -3
- package/dist/esm/components/Input/InputCurrency.d.ts.map +1 -1
- package/dist/esm/components/Input/InputCurrency.js.map +1 -1
- package/dist/esm/components/Input/InputNumber.d.ts +4 -1
- package/dist/esm/components/Input/InputNumber.d.ts.map +1 -1
- package/dist/esm/components/Input/InputNumber.js +36 -17
- package/dist/esm/components/Input/InputNumber.js.map +1 -1
- package/dist/esm/components/Input/index.d.ts +2 -0
- package/dist/esm/components/Input/index.d.ts.map +1 -1
- package/dist/esm/components/Input/index.js +22 -0
- package/dist/esm/components/Input/index.js.map +1 -1
- package/dist/esm/hooks/useInputNumber.d.ts +26 -13
- package/dist/esm/hooks/useInputNumber.d.ts.map +1 -1
- package/dist/esm/hooks/useInputNumber.js +132 -90
- package/dist/esm/hooks/useInputNumber.js.map +1 -1
- package/dist/esm/utils/currencyUtils.d.ts +1 -1
- package/dist/esm/utils/currencyUtils.d.ts.map +1 -1
- package/dist/esm/utils/currencyUtils.js +3 -3
- package/dist/esm/utils/currencyUtils.js.map +1 -1
- package/dist/esm/utils/currencyUtils.test.js +2 -2
- package/dist/esm/utils/currencyUtils.test.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +3 -3
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/validation.d.ts +1 -0
- package/dist/esm/utils/validation.d.ts.map +1 -1
- package/dist/esm/utils/validation.js +20 -1
- package/dist/esm/utils/validation.js.map +1 -1
- package/dist/index.js +420 -244
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +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,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { InputProps } from "../components";
|
|
1
|
+
import { MouseEvent, RefObject } from "react";
|
|
3
2
|
export type Separators = "." | ",";
|
|
4
|
-
export interface
|
|
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
|
-
|
|
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,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
+
unformattedValue: string | number | undefined;
|
|
31
|
+
};
|
|
32
|
+
setCurrentValue: import("react").Dispatch<import("react").SetStateAction<string | number | undefined>>;
|
|
33
|
+
setPrevValue: import("react").Dispatch<import("react").SetStateAction<string | number | undefined>>;
|
|
21
34
|
};
|
|
22
35
|
//# 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,
|
|
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;;;;;;;;;;;;;;CAoP7C,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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
27
|
-
const [
|
|
28
|
-
const [
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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,98 @@ 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
|
-
|
|
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
|
+
unformattedValue
|
|
169
|
+
};
|
|
170
|
+
}, [currentValue, handleBlur, handleKeyDown, handleChange, handleClick, handleDoubleClick, handleFocus, focused, unformattedValue]);
|
|
124
171
|
return {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
handleChange,
|
|
129
|
-
handleKeyDown,
|
|
130
|
-
handleBlur,
|
|
131
|
-
handleFocus,
|
|
132
|
-
onValueChange
|
|
172
|
+
inputProps,
|
|
173
|
+
setCurrentValue,
|
|
174
|
+
setPrevValue
|
|
133
175
|
};
|
|
134
176
|
};
|
|
135
177
|
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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AASA,IAAAC,cAAA,GAAAD,OAAA;AAQA;AACA;;AAUO,MAAME,cAAc,GAAGA,CAAAC,IAAA,EAc5BC,GAA8C,KAC3C;EAAA,IAdH;IACEC,gBAAgB,GAAG,GAAG;IACtBC,iBAAiB,GAAG,GAAG;IACvBC,mBAAmB;IACnBC,aAAa;IACbC,aAAa;IACbC,KAAK;IACLC,aAAa;IACbC,SAAS;IACTC,MAAM;IACNC,OAAO;IACPC;EACgB,CAAC,GAAAZ,IAAA;EAGnB,MAAMa,UAAU,GAAGT,mBAAmB,GAClCG,KAAK,GACL,IAAAO,6BAAc,EAACP,KAAK,EAAYJ,iBAAiB,CAAC;EACtD,MAAM,CAACY,cAAc,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAACJ,UAAU,CAAC;EAC3D,MAAM,CAACK,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAF,eAAQ,EAACV,KAAK,CAAC;EACjD,MAAM,CAACa,OAAO,EAAEC,UAAU,CAAC,GAAG,IAAAJ,eAAQ,EAAU,KAAK,CAAC;EAEtD,MAAMK,eAAe,GAAGA,CAAA,KAAM;IAC5B,IAAIrB,GAAG,IAAIA,GAAG,CAACsB,OAAO,EAAE;MACtBtB,GAAG,CAACsB,OAAO,CAACC,IAAI,CAAC,CAAC;IACpB;EACF,CAAC;EAED,MAAMC,YAAY,GAAGA,CAAA,KAAM;IACzB,IAAIxB,GAAG,IAAIA,GAAG,CAACsB,OAAO,EAAE;MACtBtB,GAAG,CAACsB,OAAO,CAACG,MAAM,CAAC,CAAC;IACtB;EACF,CAAC;EAED,MAAMC,YAAkD,GAAIC,CAAC,IAAK;IAChE,MAAMC,UAAU,GAAGD,CAAC,CAACE,MAAM,CAACvB,KAAK;IACjC,IAAIwB,YAAY,GAAG,KAAK;IAExB,IAAIF,UAAU,CAACG,UAAU,CAAC,IAAI,CAAC,EAAE;MAC/B;IACF;IAEA,MAAMC,YAAY,GAAG5B,aAAa,GAC9BwB,UAAU,GACVA,UAAU,CAACK,OAAO,CAAC,uBAAuB,EAAE,CAACC,CAAC,EAAEC,GAAG,EAAEC,IAAI,KAAK;MAC5D,OAAO,CACLC,UAAU,CAACF,GAAG,CAAC,GAAGG,iCAAkB,CAACF,IAAI,CAACG,WAAW,CAAC,CAAC,CAAC,EACxDC,QAAQ,CAAC,CAAC;IACd,CAAC,CAAC;IAEN,MAAMC,WAAW,GAAI,mBAAkBvC,iBAAkB,oBAAmBD,gBAAiB,SAAQI,aAAc,QAAO;IAE1H,IAAIH,iBAAiB,KAAK,GAAG,EAAE;MAC7B4B,YAAY,GAAG,IAAIY,MAAM,CAACD,WAAW,CAAC,CAACE,IAAI,CAACX,YAAY,CAAC;IAC3D;IAEA,IAAI9B,iBAAiB,KAAK,GAAG,EAAE;MAC7B4B,YAAY,GAAG,IAAIY,MAAM,CAACD,WAAW,CAAC,CAACE,IAAI,CAACX,YAAY,CAAC;IAC3D;IAEA,IAAI,CAACF,YAAY,EAAE;MACjB;IACF;IAEAf,YAAY,CAACiB,YAAY,CAAC;IAE1BzB,aAAa,IAAIA,aAAa,CAACyB,YAAY,CAAC;EAC9C,CAAC;EAED,MAAMY,aAAqD,GAAIjB,CAAC,IAAK;IACnE,MAAMkB,GAAG,GAAGlB,CAAC,CAACkB,GAAG;IACjB,MAAMC,KAAK,GAAGT,UAAU,CAACU,MAAM,CAACpC,IAAI,CAAC,CAAC;IAEtC,IAAIkC,GAAG,KAAK,QAAQ,EAAE;MACpBxB,eAAe,CAAC,CAAC;IACnB;IAEA,IAAIwB,GAAG,KAAK,SAAS,EAAE;MACrBlB,CAAC,CAACqB,cAAc,CAAC,CAAC;MAElBC,WAAW,CAAC,WAAW,EAAEH,KAAK,CAAC;IACjC;IAEA,IAAID,GAAG,KAAK,WAAW,EAAE;MACvBlB,CAAC,CAACqB,cAAc,CAAC,CAAC;MAElBC,WAAW,CAAC,WAAW,EAAEH,KAAK,CAAC;IACjC;IAEA,IAAI,CAACnB,CAAC,CAACuB,OAAO,IAAIvB,CAAC,CAACwB,OAAO,KAAKxB,CAAC,CAACkB,GAAG,KAAK,GAAG,EAAE;MAC7CrB,YAAY,CAAC,CAAC;IAChB;IAEA,IAAInB,aAAa,KAAK,CAAC,IAAIsB,CAAC,CAACkB,GAAG,KAAK5C,gBAAgB,EAAE;MACrD0B,CAAC,CAACqB,cAAc,CAAC,CAAC;IACpB;IAEAxC,SAAS,IAAIA,SAAS,CAACmB,CAAC,CAAC;EAC3B,CAAC;EAED,MAAMyB,UAA+C,GAAIzB,CAAC,IAAK;IAC7D,IAAIxB,mBAAmB,EAAE;MACvBY,YAAY,CAACD,cAAc,CAAC;IAC9B,CAAC,MAAM;MACLC,YAAY,CAAC,IAAAF,6BAAc,EAACC,cAAc,EAAYZ,iBAAiB,CAAC,CAAC;IAC3E;IAEAgB,YAAY,CAACJ,cAAc,CAAC;IAC5BM,UAAU,CAAC,KAAK,CAAC;IAEjBX,MAAM,IAAIA,MAAM,CAACkB,CAAC,CAAC;EACrB,CAAC;EAED,MAAM0B,WAAgD,GAAI1B,CAAC,IAAK;IAC9DZ,YAAY,CAACE,SAAS,CAAC;IACvBG,UAAU,CAAC,IAAI,CAAC;IAEhBV,OAAO,IAAIA,OAAO,CAACiB,CAAC,CAAC;EACvB,CAAC;EAED,MAAMsB,WAAW,GAAGA,CAACK,IAA+B,EAAE3C,IAAY,KAAK;IACrE,MAAML,KAAK,GAAGyC,MAAM,CAACjC,cAAc,CAAC;IAEpC,IAAIyC,WAAW,GAAG,EAAE;IACpB,IAAIC,cAAc,GAAG,CAAC;IACtB,IAAIC,cAAc,GAAGnD,KAAK,CAACoD,UAAU,CAACxD,iBAAiB,EAAE,EAAE,CAAC;IAE5D,IAAI,CAACI,KAAK,EAAE;MACV;IACF;IAEA,IAAIA,KAAK,CAACqD,QAAQ,CAAC1D,gBAAgB,CAAC,EAAE;MACpCwD,cAAc,GAAGnD,KAAK,CACnBsD,KAAK,CAAC,CAAC,EAAEtD,KAAK,CAACuD,OAAO,CAAC5D,gBAAgB,CAAC,CAAC,CACzCyD,UAAU,CAACxD,iBAAiB,EAAE,EAAE,CAAC;IACtC;IAEA,IAAII,KAAK,CAACqD,QAAQ,CAAC1D,gBAAgB,CAAC,EAAE;MACpCsD,WAAW,GAAGjD,KAAK,CAACsD,KAAK,CAACtD,KAAK,CAACuD,OAAO,CAAC5D,gBAAgB,CAAC,CAAC;IAC5D;IAEA,IAAIqD,IAAI,KAAK,WAAW,EAAE;MACxBE,cAAc,GAAGnB,UAAU,CAACoB,cAAc,CAAC,GAAG9C,IAAI;IACpD,CAAC,MAAM;MACL6C,cAAc,GAAGnB,UAAU,CAACoB,cAAc,CAAC,GAAG9C,IAAI;IACpD;IAEA,IAAIL,KAAK,CAACqD,QAAQ,CAAC1D,gBAAgB,CAAC,EAAE;MACpCuD,cAAc,GAAGnB,UAAU,CAACmB,cAAc,CAACM,OAAO,CAACzD,aAAa,CAAC,CAAC;IACpE;IAEA,MAAM0D,WAAW,GAAG,IAAAC,kCAAmB,EACrCR,cAAc,EACdtD,iBAAiB,EACjBI,KAAK,CAACqD,QAAQ,CAACzD,iBAAiB,CAClC,CAAC;IAEDa,YAAY,CAACwC,WAAW,GAAGQ,WAAW,GAAGR,WAAW,GAAGQ,WAAW,CAAC;EACrE,CAAC;EAED,OAAO;IACL5C,OAAO;IACPL,cAAc;IACdG,SAAS;IACTS,YAAY;IACZkB,aAAa;IACbQ,UAAU;IACVC,WAAW;IACX9C;EACF,CAAC;AACH,CAAC;AAAC0D,OAAA,CAAAnE,cAAA,GAAAA,cAAA"}
|
|
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 unformattedValue,\n };\n }, [\n currentValue,\n handleBlur,\n handleKeyDown,\n handleChange,\n handleClick,\n handleDoubleClick,\n handleFocus,\n focused,\n unformattedValue,\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
|
|
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,
|
|
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.
|
|
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
|
|
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.
|
|
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","
|
|
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.
|
|
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.
|
|
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","
|
|
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 {
|
|
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,
|
|
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"}
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -8,7 +8,7 @@ var _exportNames = {
|
|
|
8
8
|
useForkRef: true,
|
|
9
9
|
useResizeObserver: true,
|
|
10
10
|
decimalToHours: true,
|
|
11
|
-
|
|
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, "
|
|
20
|
+
Object.defineProperty(exports, "formatNumber", {
|
|
21
21
|
enumerable: true,
|
|
22
22
|
get: function () {
|
|
23
|
-
return _currencyUtils.
|
|
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 {
|
|
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":"
|
|
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":["
|
|
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"}
|