@tecsinapse/cortex-react 1.3.1 → 1.3.3
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/Calendar/Calendar.js +1 -0
- package/dist/cjs/components/Calendar/CalendarCell.js +1 -0
- package/dist/cjs/components/Calendar/CalendarGrid.js +1 -0
- package/dist/cjs/components/Calendar/RangeCalendar.js +1 -0
- package/dist/cjs/components/DatePicker/Content.js +1 -0
- package/dist/cjs/components/DatePicker/DatePickerInput.js +1 -0
- package/dist/cjs/components/DatePicker/DateRangePickerInput.js +1 -0
- package/dist/cjs/components/Input/Mask.js +51 -23
- package/dist/cjs/components/Input/Search.js +1 -0
- package/dist/cjs/components/Input/masks.js +35 -2
- package/dist/cjs/components/Menubar/MostUsedList.js +1 -0
- package/dist/cjs/components/Popover/Provider.js +1 -0
- package/dist/cjs/components/Select/Content.js +1 -0
- package/dist/cjs/components/Select/GroupedOptions.js +1 -0
- package/dist/cjs/components/Select/MultiGroupedOptions.js +1 -0
- package/dist/cjs/components/Select/MultiOptions.js +1 -0
- package/dist/cjs/components/Select/Options.js +1 -0
- package/dist/cjs/components/Tooltip.js +1 -0
- package/dist/cjs/hooks/useNumberMask.js +76 -0
- package/dist/cjs/hooks/useStringMask.js +93 -0
- package/dist/cjs/index.js +10 -0
- package/dist/cjs/service/SnackbarSonner.js +1 -0
- package/dist/cjs/utils/extractNumbersFromString.js +7 -0
- package/dist/esm/components/Calendar/Calendar.js +1 -0
- package/dist/esm/components/Calendar/CalendarCell.js +1 -0
- package/dist/esm/components/Calendar/CalendarGrid.js +1 -0
- package/dist/esm/components/Calendar/RangeCalendar.js +1 -0
- package/dist/esm/components/DatePicker/Content.js +1 -0
- package/dist/esm/components/DatePicker/DatePickerInput.js +1 -0
- package/dist/esm/components/DatePicker/DateRangePickerInput.js +1 -0
- package/dist/esm/components/Input/Mask.js +52 -24
- package/dist/esm/components/Input/Search.js +1 -0
- package/dist/esm/components/Input/masks.js +33 -3
- package/dist/esm/components/Menubar/MostUsedList.js +1 -0
- package/dist/esm/components/Popover/Provider.js +1 -0
- package/dist/esm/components/Select/Content.js +1 -0
- package/dist/esm/components/Select/GroupedOptions.js +1 -0
- package/dist/esm/components/Select/MultiGroupedOptions.js +1 -0
- package/dist/esm/components/Select/MultiOptions.js +1 -0
- package/dist/esm/components/Select/Options.js +1 -0
- package/dist/esm/components/Tooltip.js +1 -0
- package/dist/esm/hooks/useNumberMask.js +73 -0
- package/dist/esm/hooks/useStringMask.js +89 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/service/SnackbarSonner.js +1 -0
- package/dist/esm/utils/extractNumbersFromString.js +4 -0
- package/dist/types/components/Input/masks.d.ts +24 -0
- package/dist/types/components/Input/types.d.ts +9 -9
- package/dist/types/components/Kanban.d.ts +11 -0
- package/dist/types/hooks/index.d.ts +2 -0
- package/dist/types/hooks/useNumberMask.d.ts +8 -0
- package/dist/types/hooks/useStringMask.d.ts +4 -0
- package/dist/types/tests/Kanban.test.d.ts +1 -0
- package/dist/types/utils/extractNumbersFromString.d.ts +2 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/package.json +3 -3
|
@@ -6,6 +6,7 @@ require('react-aria');
|
|
|
6
6
|
require('react-stately');
|
|
7
7
|
var useCalendarCell = require('../../hooks/useCalendarCell.js');
|
|
8
8
|
require('@floating-ui/react');
|
|
9
|
+
require('currency.js');
|
|
9
10
|
var calendarCell = require('../../styles/calendar-cell.js');
|
|
10
11
|
require('../../styles/groupButton.js');
|
|
11
12
|
require('../../styles/progressBar.js');
|
|
@@ -6,6 +6,7 @@ require('react-aria');
|
|
|
6
6
|
require('react-stately');
|
|
7
7
|
var useCalendarGrid = require('../../hooks/useCalendarGrid.js');
|
|
8
8
|
require('@floating-ui/react');
|
|
9
|
+
require('currency.js');
|
|
9
10
|
var CalendarGridBodyRows = require('./CalendarGridBodyRows.js');
|
|
10
11
|
var CalendarGridHeaderRow = require('./CalendarGridHeaderRow.js');
|
|
11
12
|
|
|
@@ -5,6 +5,7 @@ require('@internationalized/date');
|
|
|
5
5
|
require('react-aria');
|
|
6
6
|
require('react-stately');
|
|
7
7
|
require('@floating-ui/react');
|
|
8
|
+
require('currency.js');
|
|
8
9
|
var useRangeCalendar = require('../../hooks/useRangeCalendar.js');
|
|
9
10
|
var CalendarGrid = require('./CalendarGrid.js');
|
|
10
11
|
var CalendarHeader = require('./CalendarHeader.js');
|
|
@@ -5,6 +5,7 @@ require('@internationalized/date');
|
|
|
5
5
|
require('react-aria');
|
|
6
6
|
require('react-stately');
|
|
7
7
|
require('@floating-ui/react');
|
|
8
|
+
require('currency.js');
|
|
8
9
|
var useOutsideClickListener = require('../../hooks/useOutsideClickListener.js');
|
|
9
10
|
var Context = require('../Popover/Context.js');
|
|
10
11
|
|
|
@@ -7,6 +7,7 @@ require('react-stately');
|
|
|
7
7
|
var utils = require('../utils.js');
|
|
8
8
|
var useDatePickerInput = require('../../hooks/useDatePickerInput.js');
|
|
9
9
|
require('@floating-ui/react');
|
|
10
|
+
require('currency.js');
|
|
10
11
|
var Calendar = require('../Calendar/Calendar.js');
|
|
11
12
|
var DateField = require('./DateField.js');
|
|
12
13
|
var DatePickerInputBase = require('./DatePickerInputBase.js');
|
|
@@ -7,6 +7,7 @@ require('react-stately');
|
|
|
7
7
|
var utils = require('../utils.js');
|
|
8
8
|
var useDateRangePickerInput = require('../../hooks/useDateRangePickerInput.js');
|
|
9
9
|
require('@floating-ui/react');
|
|
10
|
+
require('currency.js');
|
|
10
11
|
var RangeCalendar = require('../Calendar/RangeCalendar.js');
|
|
11
12
|
var DateField = require('./DateField.js');
|
|
12
13
|
var DatePickerInputBase = require('./DatePickerInputBase.js');
|
|
@@ -1,32 +1,60 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
|
-
|
|
4
|
+
require('@internationalized/date');
|
|
5
|
+
require('react-aria');
|
|
6
|
+
require('react-stately');
|
|
7
|
+
require('@floating-ui/react');
|
|
8
|
+
var useNumberMask = require('../../hooks/useNumberMask.js');
|
|
9
|
+
var useStringMask = require('../../hooks/useStringMask.js');
|
|
5
10
|
var Root = require('./Root.js');
|
|
6
11
|
|
|
7
|
-
const useIMaskLocal = (mask, inputProps, ref, onChangeMask) => {
|
|
8
|
-
const { ref: iMaskRef, maskRef } = reactImask.useIMask(mask, {
|
|
9
|
-
onAccept: (value, mask2) => {
|
|
10
|
-
onChangeMask?.({
|
|
11
|
-
unmaskedValue: mask2._unmaskedValue,
|
|
12
|
-
value
|
|
13
|
-
});
|
|
14
|
-
},
|
|
15
|
-
ref: ref ? ref : React.createRef()
|
|
16
|
-
});
|
|
17
|
-
React.useEffect(() => {
|
|
18
|
-
if (inputProps.value === "") {
|
|
19
|
-
maskRef.current?.updateValue();
|
|
20
|
-
}
|
|
21
|
-
}, [maskRef, inputProps.value]);
|
|
22
|
-
return {
|
|
23
|
-
iMaskRef
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
12
|
const InputMask = React.forwardRef(
|
|
27
|
-
({ mask, onChange, ...rest }, ref) => {
|
|
28
|
-
const
|
|
29
|
-
|
|
13
|
+
({ mask, onChange, value, ...rest }, ref) => {
|
|
14
|
+
const getInputHook = (value2) => {
|
|
15
|
+
if (mask !== void 0) {
|
|
16
|
+
if (Array.isArray(mask) || typeof mask === "function") {
|
|
17
|
+
return useStringMask.useStringMask(mask, value2);
|
|
18
|
+
} else {
|
|
19
|
+
return useNumberMask.useNumberMask(mask, value2);
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
return [void 0, void 0];
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const [maskValue, setMaskValue] = getInputHook(value ?? "");
|
|
26
|
+
const _value = maskValue === void 0 ? value?.toString() : maskValue.formatted ? maskValue.formatted : "";
|
|
27
|
+
React.useEffect(() => {
|
|
28
|
+
if (onChange) {
|
|
29
|
+
onChange(maskValue?.raw);
|
|
30
|
+
}
|
|
31
|
+
}, [maskValue]);
|
|
32
|
+
const onChangeValue = React.useCallback(
|
|
33
|
+
(value2) => {
|
|
34
|
+
if (maskValue !== void 0 && setMaskValue !== void 0) {
|
|
35
|
+
setMaskValue(value2);
|
|
36
|
+
} else onChange?.(value2);
|
|
37
|
+
},
|
|
38
|
+
[value]
|
|
39
|
+
);
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
if (maskValue !== void 0 && setMaskValue !== void 0 && value !== void 0 && typeof maskValue === "object") {
|
|
42
|
+
if (maskValue.raw !== void 0 && maskValue.raw.toString() !== value.toString()) {
|
|
43
|
+
onChangeValue(value);
|
|
44
|
+
}
|
|
45
|
+
} else if (maskValue === void 0 && value !== void 0) {
|
|
46
|
+
onChangeValue(value);
|
|
47
|
+
}
|
|
48
|
+
}, [value]);
|
|
49
|
+
return /* @__PURE__ */ React.createElement(
|
|
50
|
+
Root.InputRoot,
|
|
51
|
+
{
|
|
52
|
+
...rest,
|
|
53
|
+
value: _value,
|
|
54
|
+
onChange: (e) => onChangeValue(e.target.value),
|
|
55
|
+
ref
|
|
56
|
+
}
|
|
57
|
+
);
|
|
30
58
|
}
|
|
31
59
|
);
|
|
32
60
|
|
|
@@ -7,6 +7,7 @@ require('react-aria');
|
|
|
7
7
|
require('react-stately');
|
|
8
8
|
var useDebouncedState = require('../../hooks/useDebouncedState.js');
|
|
9
9
|
require('@floating-ui/react');
|
|
10
|
+
require('currency.js');
|
|
10
11
|
var Box = require('./Box.js');
|
|
11
12
|
var Face = require('./Face.js');
|
|
12
13
|
var Left = require('./Left.js');
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var extractNumbersFromString = require('../../utils/extractNumbersFromString.js');
|
|
4
|
+
|
|
3
5
|
const ExpressionMasks = {
|
|
4
6
|
CPF: "000.000.000-00",
|
|
5
7
|
CNPJ: "00.000.000/0000-00",
|
|
@@ -16,7 +18,7 @@ const CurrencyIMask = {
|
|
|
16
18
|
mask: Number,
|
|
17
19
|
scale: 2,
|
|
18
20
|
thousandsSeparator: ".",
|
|
19
|
-
padFractionalZeros:
|
|
21
|
+
padFractionalZeros: false,
|
|
20
22
|
radix: ",",
|
|
21
23
|
mapToRadix: ["."]
|
|
22
24
|
}
|
|
@@ -30,14 +32,45 @@ const PercentageIMask = {
|
|
|
30
32
|
mask: Number,
|
|
31
33
|
scale: 2,
|
|
32
34
|
thousandsSeparator: ".",
|
|
33
|
-
padFractionalZeros:
|
|
35
|
+
padFractionalZeros: false,
|
|
34
36
|
radix: ",",
|
|
35
37
|
mapToRadix: ["."]
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
40
|
};
|
|
41
|
+
const Masks = {
|
|
42
|
+
CPF: ["999.999.999-99"],
|
|
43
|
+
CNPJ: ["99.999.999/9999-99"],
|
|
44
|
+
DATE: ["99/99/9999"],
|
|
45
|
+
HOUR: ["99:99"],
|
|
46
|
+
MONTH_YEAR: ["99/9999"],
|
|
47
|
+
CEP: ["99999-999"],
|
|
48
|
+
PHONE: ["(99) 9999-9999"],
|
|
49
|
+
PHONE_EXTENDED: ["(99) 99999-9999"],
|
|
50
|
+
COMBINED_PHONE: (value) => {
|
|
51
|
+
const onlyNumbers = extractNumbersFromString.extractDigitsFromString(value);
|
|
52
|
+
const isCellPhoneExtended = onlyNumbers.length === 11;
|
|
53
|
+
return value?.length <= 14 && !isCellPhoneExtended ? Masks.PHONE : Masks.PHONE_EXTENDED;
|
|
54
|
+
},
|
|
55
|
+
COMBINED_CPF_CNPJ: (value) => value?.length <= 14 ? Masks.CPF : Masks.CNPJ
|
|
56
|
+
};
|
|
57
|
+
const BRLMask = {
|
|
58
|
+
symbol: "R$ ",
|
|
59
|
+
separator: ".",
|
|
60
|
+
decimal: ",",
|
|
61
|
+
precision: 2
|
|
62
|
+
};
|
|
63
|
+
const PercentageMask = {
|
|
64
|
+
symbol: "",
|
|
65
|
+
separator: ".",
|
|
66
|
+
decimal: ",",
|
|
67
|
+
precision: 2
|
|
68
|
+
};
|
|
39
69
|
|
|
70
|
+
exports.BRLMask = BRLMask;
|
|
40
71
|
exports.CurrencyIMask = CurrencyIMask;
|
|
41
72
|
exports.ExpressionMasks = ExpressionMasks;
|
|
73
|
+
exports.Masks = Masks;
|
|
42
74
|
exports.NumberIMask = NumberIMask;
|
|
43
75
|
exports.PercentageIMask = PercentageIMask;
|
|
76
|
+
exports.PercentageMask = PercentageMask;
|
|
@@ -5,6 +5,7 @@ require('@internationalized/date');
|
|
|
5
5
|
require('react-aria');
|
|
6
6
|
require('react-stately');
|
|
7
7
|
require('@floating-ui/react');
|
|
8
|
+
require('currency.js');
|
|
8
9
|
var useOutsideClickListener = require('../../hooks/useOutsideClickListener.js');
|
|
9
10
|
var Context = require('../Popover/Context.js');
|
|
10
11
|
|
|
@@ -6,6 +6,7 @@ require('@internationalized/date');
|
|
|
6
6
|
require('react-aria');
|
|
7
7
|
require('react-stately');
|
|
8
8
|
require('@floating-ui/react');
|
|
9
|
+
require('currency.js');
|
|
9
10
|
var useSelectGroupedOptions = require('../../hooks/useSelectGroupedOptions.js');
|
|
10
11
|
var Context = require('../Popover/Context.js');
|
|
11
12
|
var Option = require('./Option.js');
|
|
@@ -6,6 +6,7 @@ require('@internationalized/date');
|
|
|
6
6
|
require('react-aria');
|
|
7
7
|
require('react-stately');
|
|
8
8
|
require('@floating-ui/react');
|
|
9
|
+
require('currency.js');
|
|
9
10
|
var useSelectGroupedOptions = require('../../hooks/useSelectGroupedOptions.js');
|
|
10
11
|
var MultiOption = require('./MultiOption.js');
|
|
11
12
|
var SkeletonOptions = require('./SkeletonOptions.js');
|
|
@@ -6,6 +6,7 @@ require('@internationalized/date');
|
|
|
6
6
|
require('react-aria');
|
|
7
7
|
require('react-stately');
|
|
8
8
|
require('@floating-ui/react');
|
|
9
|
+
require('currency.js');
|
|
9
10
|
var useSelectOptions = require('../../hooks/useSelectOptions.js');
|
|
10
11
|
var MultiOption = require('./MultiOption.js');
|
|
11
12
|
var SkeletonOptions = require('./SkeletonOptions.js');
|
|
@@ -6,6 +6,7 @@ require('@internationalized/date');
|
|
|
6
6
|
require('react-aria');
|
|
7
7
|
require('react-stately');
|
|
8
8
|
require('@floating-ui/react');
|
|
9
|
+
require('currency.js');
|
|
9
10
|
var useSelectOptions = require('../../hooks/useSelectOptions.js');
|
|
10
11
|
var Context = require('../Popover/Context.js');
|
|
11
12
|
var Option = require('./Option.js');
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var currency = require('currency.js');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var extractNumbersFromString = require('../utils/extractNumbersFromString.js');
|
|
6
|
+
|
|
7
|
+
const DEFAULT_OPTIONS = {
|
|
8
|
+
symbol: "R$ ",
|
|
9
|
+
separator: ".",
|
|
10
|
+
decimal: ",",
|
|
11
|
+
precision: 2
|
|
12
|
+
};
|
|
13
|
+
const getRegex = (precision) => new RegExp(`\\B(?=(\\d{${precision}})(?!\\d))`, "g");
|
|
14
|
+
const getInternalNumberAndMask = (value, options) => {
|
|
15
|
+
const mergedOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
16
|
+
const { precision = -1 } = mergedOptions;
|
|
17
|
+
let internalNumber;
|
|
18
|
+
if (typeof value === "number") {
|
|
19
|
+
if (precision) {
|
|
20
|
+
let stringValue = String(value);
|
|
21
|
+
const decimalIndex = stringValue.indexOf(".");
|
|
22
|
+
const currentPrecision = decimalIndex + precision;
|
|
23
|
+
if (decimalIndex !== -1 && currentPrecision <= stringValue.length) {
|
|
24
|
+
const zeros = stringValue.length + 1 - currentPrecision;
|
|
25
|
+
for (let i = 0; i < zeros; i++) stringValue = stringValue + `0`;
|
|
26
|
+
}
|
|
27
|
+
internalNumber = Number(stringValue);
|
|
28
|
+
} else {
|
|
29
|
+
internalNumber = value;
|
|
30
|
+
}
|
|
31
|
+
} else {
|
|
32
|
+
const onlyNumbers = String(extractNumbersFromString.extractNumbersFromString(value));
|
|
33
|
+
const padZeros = String(onlyNumbers).padStart(precision + 1, "0");
|
|
34
|
+
internalNumber = Number(padZeros.replace(getRegex(precision), "."));
|
|
35
|
+
}
|
|
36
|
+
if (internalNumber > Number.MAX_SAFE_INTEGER) {
|
|
37
|
+
internalNumber = Number.MAX_SAFE_INTEGER;
|
|
38
|
+
}
|
|
39
|
+
if (internalNumber < Number.MIN_SAFE_INTEGER) {
|
|
40
|
+
internalNumber = Number.MIN_SAFE_INTEGER;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
internalNumber,
|
|
44
|
+
mergedOptions
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const useNumberMask = (options, defaultValue) => {
|
|
48
|
+
const applyMask = React.useCallback(
|
|
49
|
+
(value2 = 0) => {
|
|
50
|
+
const { internalNumber, mergedOptions } = getInternalNumberAndMask(
|
|
51
|
+
value2,
|
|
52
|
+
options
|
|
53
|
+
);
|
|
54
|
+
return {
|
|
55
|
+
raw: internalNumber,
|
|
56
|
+
formatted: currency(internalNumber).format(mergedOptions)
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
[options, getRegex]
|
|
60
|
+
);
|
|
61
|
+
const [value, setValue] = React.useState(applyMask(defaultValue));
|
|
62
|
+
const handleChangeValue = React.useCallback(
|
|
63
|
+
(formattedValue) => {
|
|
64
|
+
const { raw, formatted } = applyMask(formattedValue);
|
|
65
|
+
setValue({
|
|
66
|
+
raw,
|
|
67
|
+
formatted
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
[applyMask, setValue]
|
|
71
|
+
);
|
|
72
|
+
return [value, handleChangeValue];
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
exports.getInternalNumberAndMask = getInternalNumberAndMask;
|
|
76
|
+
exports.useNumberMask = useNumberMask;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
const mergeMask = (value = "", mask) => {
|
|
6
|
+
let formatted = "";
|
|
7
|
+
let raw = "";
|
|
8
|
+
let iMask = 0;
|
|
9
|
+
let iChars = 0;
|
|
10
|
+
while (!(iMask === mask.length || iChars === value.length)) {
|
|
11
|
+
const maskChar = mask[iMask];
|
|
12
|
+
const valueChar = value[iChars];
|
|
13
|
+
if (maskChar === valueChar) {
|
|
14
|
+
formatted += maskChar;
|
|
15
|
+
iChars++;
|
|
16
|
+
iMask++;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const rawValueChar = value[iChars];
|
|
20
|
+
if (typeof maskChar === "object") {
|
|
21
|
+
iChars++;
|
|
22
|
+
const maskCharRegex = Array.isArray(maskChar) ? maskChar[0] : maskChar;
|
|
23
|
+
const matchRegex = RegExp(maskCharRegex).test(valueChar);
|
|
24
|
+
if (matchRegex) {
|
|
25
|
+
formatted += valueChar;
|
|
26
|
+
raw += rawValueChar;
|
|
27
|
+
iMask++;
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
formatted += maskChar;
|
|
31
|
+
iMask++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { raw, formatted };
|
|
35
|
+
};
|
|
36
|
+
const getMask = (mask, newValue) => {
|
|
37
|
+
let maskArray;
|
|
38
|
+
const regexArray = [];
|
|
39
|
+
if (typeof mask === "function") {
|
|
40
|
+
maskArray = mask(newValue);
|
|
41
|
+
} else {
|
|
42
|
+
maskArray = mask;
|
|
43
|
+
}
|
|
44
|
+
maskArray.forEach((exp) => {
|
|
45
|
+
if (typeof exp !== "string") {
|
|
46
|
+
if (Array.isArray(exp)) regexArray.push(exp);
|
|
47
|
+
else regexArray.push(exp);
|
|
48
|
+
} else {
|
|
49
|
+
for (let i = 0; i < exp.length; i++) {
|
|
50
|
+
if (exp[i] === "\\") {
|
|
51
|
+
regexArray.push(exp[i + 1]);
|
|
52
|
+
i++;
|
|
53
|
+
} else {
|
|
54
|
+
if (exp[i] === "9") regexArray.push(/\d/);
|
|
55
|
+
else if (exp[i] === "a") regexArray.push(/[a-zA-Z]/);
|
|
56
|
+
else regexArray.push(exp[i]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return regexArray;
|
|
62
|
+
};
|
|
63
|
+
const useStringMask = (mask, defaultValue) => {
|
|
64
|
+
const applyMask = React.useCallback(
|
|
65
|
+
(value2 = "") => {
|
|
66
|
+
const selectedMask = getMask(mask, value2);
|
|
67
|
+
const { formatted, raw } = mergeMask(value2, selectedMask);
|
|
68
|
+
return {
|
|
69
|
+
raw,
|
|
70
|
+
formatted
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
[mask]
|
|
74
|
+
);
|
|
75
|
+
const [value, setValue] = React.useState(
|
|
76
|
+
applyMask(defaultValue?.toString())
|
|
77
|
+
);
|
|
78
|
+
const handleChangeValue = React.useCallback(
|
|
79
|
+
(formattedValue) => {
|
|
80
|
+
const { raw, formatted } = applyMask(formattedValue?.toString());
|
|
81
|
+
setValue({
|
|
82
|
+
raw,
|
|
83
|
+
formatted
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
[applyMask, setValue]
|
|
87
|
+
);
|
|
88
|
+
return [value, handleChangeValue];
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
exports.getMask = getMask;
|
|
92
|
+
exports.mergeMask = mergeMask;
|
|
93
|
+
exports.useStringMask = useStringMask;
|
package/dist/cjs/index.js
CHANGED
|
@@ -41,10 +41,12 @@ var useDatePickerInput = require('./hooks/useDatePickerInput.js');
|
|
|
41
41
|
var useDateRangePickerInput = require('./hooks/useDateRangePickerInput.js');
|
|
42
42
|
var useDebouncedState = require('./hooks/useDebouncedState.js');
|
|
43
43
|
var useFloatingLogic = require('./hooks/useFloatingLogic.js');
|
|
44
|
+
var useNumberMask = require('./hooks/useNumberMask.js');
|
|
44
45
|
var useOutsideClickListener = require('./hooks/useOutsideClickListener.js');
|
|
45
46
|
var useRangeCalendar = require('./hooks/useRangeCalendar.js');
|
|
46
47
|
var useSelectGroupedOptions = require('./hooks/useSelectGroupedOptions.js');
|
|
47
48
|
var useSelectOptions = require('./hooks/useSelectOptions.js');
|
|
49
|
+
var useStringMask = require('./hooks/useStringMask.js');
|
|
48
50
|
var SnackbarSonner = require('./service/SnackbarSonner.js');
|
|
49
51
|
var MenubarProvider = require('./provider/MenubarProvider.js');
|
|
50
52
|
var SnackbarProvider = require('./provider/SnackbarProvider.js');
|
|
@@ -101,16 +103,24 @@ exports.useDatePickerInput = useDatePickerInput.useDatePickerInput;
|
|
|
101
103
|
exports.useDateRangePickerInput = useDateRangePickerInput.useDateRangePickerInput;
|
|
102
104
|
exports.useDebouncedState = useDebouncedState.useDebouncedState;
|
|
103
105
|
exports.useFloatingLogic = useFloatingLogic.useFloatingLogic;
|
|
106
|
+
exports.getInternalNumberAndMask = useNumberMask.getInternalNumberAndMask;
|
|
107
|
+
exports.useNumberMask = useNumberMask.useNumberMask;
|
|
104
108
|
exports.useOutsideClickListener = useOutsideClickListener.useOutsideClickListener;
|
|
105
109
|
exports.useRangeCalendar = useRangeCalendar.useRangeCalendar;
|
|
106
110
|
exports.useSelectGroupedOptions = useSelectGroupedOptions.useSelectGroupedOptions;
|
|
107
111
|
exports.useSelectOptions = useSelectOptions.useSelectOptions;
|
|
112
|
+
exports.getMask = useStringMask.getMask;
|
|
113
|
+
exports.mergeMask = useStringMask.mergeMask;
|
|
114
|
+
exports.useStringMask = useStringMask.useStringMask;
|
|
108
115
|
exports.SnackbarSonner = SnackbarSonner.SnackbarSonner;
|
|
109
116
|
exports.MenubarProvider = MenubarProvider.MenubarProvider;
|
|
110
117
|
exports.useMenubar = MenubarProvider.useMenubar;
|
|
111
118
|
exports.SnackbarProvider = SnackbarProvider.SnackbarProvider;
|
|
112
119
|
exports.useSnackbar = SnackbarProvider.useSnackbar;
|
|
120
|
+
exports.BRLMask = masks.BRLMask;
|
|
113
121
|
exports.CurrencyIMask = masks.CurrencyIMask;
|
|
114
122
|
exports.ExpressionMasks = masks.ExpressionMasks;
|
|
123
|
+
exports.Masks = masks.Masks;
|
|
115
124
|
exports.NumberIMask = masks.NumberIMask;
|
|
116
125
|
exports.PercentageIMask = masks.PercentageIMask;
|
|
126
|
+
exports.PercentageMask = masks.PercentageMask;
|
|
@@ -11,6 +11,7 @@ require('../components/Button.js');
|
|
|
11
11
|
require('react-aria');
|
|
12
12
|
require('react-stately');
|
|
13
13
|
require('@floating-ui/react');
|
|
14
|
+
require('currency.js');
|
|
14
15
|
require('../components/Calendar/CalendarCell.js');
|
|
15
16
|
require('@tecsinapse/cortex-core');
|
|
16
17
|
require('react-icons/fa');
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const extractNumbersFromString = (value) => Number(extractDigitsFromString(value));
|
|
4
|
+
const extractDigitsFromString = (value) => value.replace(/[^0-9]/g, "");
|
|
5
|
+
|
|
6
|
+
exports.extractDigitsFromString = extractDigitsFromString;
|
|
7
|
+
exports.extractNumbersFromString = extractNumbersFromString;
|
|
@@ -4,6 +4,7 @@ import 'react-aria';
|
|
|
4
4
|
import 'react-stately';
|
|
5
5
|
import { useCalendarCell } from '../../hooks/useCalendarCell.js';
|
|
6
6
|
import '@floating-ui/react';
|
|
7
|
+
import 'currency.js';
|
|
7
8
|
import { calendarCell } from '../../styles/calendar-cell.js';
|
|
8
9
|
import '../../styles/groupButton.js';
|
|
9
10
|
import '../../styles/progressBar.js';
|
|
@@ -4,6 +4,7 @@ import 'react-aria';
|
|
|
4
4
|
import 'react-stately';
|
|
5
5
|
import { useCalendarGrid } from '../../hooks/useCalendarGrid.js';
|
|
6
6
|
import '@floating-ui/react';
|
|
7
|
+
import 'currency.js';
|
|
7
8
|
import { CalendarGridBodyRows } from './CalendarGridBodyRows.js';
|
|
8
9
|
import { CalendarGridHeaderRow } from './CalendarGridHeaderRow.js';
|
|
9
10
|
|
|
@@ -3,6 +3,7 @@ import '@internationalized/date';
|
|
|
3
3
|
import 'react-aria';
|
|
4
4
|
import 'react-stately';
|
|
5
5
|
import '@floating-ui/react';
|
|
6
|
+
import 'currency.js';
|
|
6
7
|
import { useRangeCalendar } from '../../hooks/useRangeCalendar.js';
|
|
7
8
|
import { CalendarGrid } from './CalendarGrid.js';
|
|
8
9
|
import { CalendarHeader } from './CalendarHeader.js';
|
|
@@ -3,6 +3,7 @@ import '@internationalized/date';
|
|
|
3
3
|
import 'react-aria';
|
|
4
4
|
import 'react-stately';
|
|
5
5
|
import '@floating-ui/react';
|
|
6
|
+
import 'currency.js';
|
|
6
7
|
import { useOutsideClickListener } from '../../hooks/useOutsideClickListener.js';
|
|
7
8
|
import { usePopoverContext } from '../Popover/Context.js';
|
|
8
9
|
|
|
@@ -5,6 +5,7 @@ import 'react-stately';
|
|
|
5
5
|
import { dateToCalendarDate } from '../utils.js';
|
|
6
6
|
import { useDatePickerInput } from '../../hooks/useDatePickerInput.js';
|
|
7
7
|
import '@floating-ui/react';
|
|
8
|
+
import 'currency.js';
|
|
8
9
|
import { Calendar } from '../Calendar/Calendar.js';
|
|
9
10
|
import { DateField } from './DateField.js';
|
|
10
11
|
import { DatePickerInputBase } from './DatePickerInputBase.js';
|
|
@@ -5,6 +5,7 @@ import 'react-stately';
|
|
|
5
5
|
import { dateToCalendarDate } from '../utils.js';
|
|
6
6
|
import { useDateRangePickerInput } from '../../hooks/useDateRangePickerInput.js';
|
|
7
7
|
import '@floating-ui/react';
|
|
8
|
+
import 'currency.js';
|
|
8
9
|
import { RangeCalendar } from '../Calendar/RangeCalendar.js';
|
|
9
10
|
import { DateField } from './DateField.js';
|
|
10
11
|
import { DatePickerInputBase } from './DatePickerInputBase.js';
|
|
@@ -1,30 +1,58 @@
|
|
|
1
|
-
import React__default, {
|
|
2
|
-
import
|
|
1
|
+
import React__default, { useEffect, useCallback } from 'react';
|
|
2
|
+
import '@internationalized/date';
|
|
3
|
+
import 'react-aria';
|
|
4
|
+
import 'react-stately';
|
|
5
|
+
import '@floating-ui/react';
|
|
6
|
+
import { useNumberMask } from '../../hooks/useNumberMask.js';
|
|
7
|
+
import { useStringMask } from '../../hooks/useStringMask.js';
|
|
3
8
|
import { InputRoot } from './Root.js';
|
|
4
9
|
|
|
5
|
-
const useIMaskLocal = (mask, inputProps, ref, onChangeMask) => {
|
|
6
|
-
const { ref: iMaskRef, maskRef } = useIMask(mask, {
|
|
7
|
-
onAccept: (value, mask2) => {
|
|
8
|
-
onChangeMask?.({
|
|
9
|
-
unmaskedValue: mask2._unmaskedValue,
|
|
10
|
-
value
|
|
11
|
-
});
|
|
12
|
-
},
|
|
13
|
-
ref: ref ? ref : createRef()
|
|
14
|
-
});
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
if (inputProps.value === "") {
|
|
17
|
-
maskRef.current?.updateValue();
|
|
18
|
-
}
|
|
19
|
-
}, [maskRef, inputProps.value]);
|
|
20
|
-
return {
|
|
21
|
-
iMaskRef
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
10
|
const InputMask = React__default.forwardRef(
|
|
25
|
-
({ mask, onChange, ...rest }, ref) => {
|
|
26
|
-
const
|
|
27
|
-
|
|
11
|
+
({ mask, onChange, value, ...rest }, ref) => {
|
|
12
|
+
const getInputHook = (value2) => {
|
|
13
|
+
if (mask !== void 0) {
|
|
14
|
+
if (Array.isArray(mask) || typeof mask === "function") {
|
|
15
|
+
return useStringMask(mask, value2);
|
|
16
|
+
} else {
|
|
17
|
+
return useNumberMask(mask, value2);
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
return [void 0, void 0];
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const [maskValue, setMaskValue] = getInputHook(value ?? "");
|
|
24
|
+
const _value = maskValue === void 0 ? value?.toString() : maskValue.formatted ? maskValue.formatted : "";
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (onChange) {
|
|
27
|
+
onChange(maskValue?.raw);
|
|
28
|
+
}
|
|
29
|
+
}, [maskValue]);
|
|
30
|
+
const onChangeValue = useCallback(
|
|
31
|
+
(value2) => {
|
|
32
|
+
if (maskValue !== void 0 && setMaskValue !== void 0) {
|
|
33
|
+
setMaskValue(value2);
|
|
34
|
+
} else onChange?.(value2);
|
|
35
|
+
},
|
|
36
|
+
[value]
|
|
37
|
+
);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (maskValue !== void 0 && setMaskValue !== void 0 && value !== void 0 && typeof maskValue === "object") {
|
|
40
|
+
if (maskValue.raw !== void 0 && maskValue.raw.toString() !== value.toString()) {
|
|
41
|
+
onChangeValue(value);
|
|
42
|
+
}
|
|
43
|
+
} else if (maskValue === void 0 && value !== void 0) {
|
|
44
|
+
onChangeValue(value);
|
|
45
|
+
}
|
|
46
|
+
}, [value]);
|
|
47
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
48
|
+
InputRoot,
|
|
49
|
+
{
|
|
50
|
+
...rest,
|
|
51
|
+
value: _value,
|
|
52
|
+
onChange: (e) => onChangeValue(e.target.value),
|
|
53
|
+
ref
|
|
54
|
+
}
|
|
55
|
+
);
|
|
28
56
|
}
|
|
29
57
|
);
|
|
30
58
|
|
|
@@ -5,6 +5,7 @@ import 'react-aria';
|
|
|
5
5
|
import 'react-stately';
|
|
6
6
|
import { useDebouncedState } from '../../hooks/useDebouncedState.js';
|
|
7
7
|
import '@floating-ui/react';
|
|
8
|
+
import 'currency.js';
|
|
8
9
|
import { InputBox } from './Box.js';
|
|
9
10
|
import { InputFace } from './Face.js';
|
|
10
11
|
import { InputLeft } from './Left.js';
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { extractDigitsFromString } from '../../utils/extractNumbersFromString.js';
|
|
2
|
+
|
|
1
3
|
const ExpressionMasks = {
|
|
2
4
|
CPF: "000.000.000-00",
|
|
3
5
|
CNPJ: "00.000.000/0000-00",
|
|
@@ -14,7 +16,7 @@ const CurrencyIMask = {
|
|
|
14
16
|
mask: Number,
|
|
15
17
|
scale: 2,
|
|
16
18
|
thousandsSeparator: ".",
|
|
17
|
-
padFractionalZeros:
|
|
19
|
+
padFractionalZeros: false,
|
|
18
20
|
radix: ",",
|
|
19
21
|
mapToRadix: ["."]
|
|
20
22
|
}
|
|
@@ -28,11 +30,39 @@ const PercentageIMask = {
|
|
|
28
30
|
mask: Number,
|
|
29
31
|
scale: 2,
|
|
30
32
|
thousandsSeparator: ".",
|
|
31
|
-
padFractionalZeros:
|
|
33
|
+
padFractionalZeros: false,
|
|
32
34
|
radix: ",",
|
|
33
35
|
mapToRadix: ["."]
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
38
|
};
|
|
39
|
+
const Masks = {
|
|
40
|
+
CPF: ["999.999.999-99"],
|
|
41
|
+
CNPJ: ["99.999.999/9999-99"],
|
|
42
|
+
DATE: ["99/99/9999"],
|
|
43
|
+
HOUR: ["99:99"],
|
|
44
|
+
MONTH_YEAR: ["99/9999"],
|
|
45
|
+
CEP: ["99999-999"],
|
|
46
|
+
PHONE: ["(99) 9999-9999"],
|
|
47
|
+
PHONE_EXTENDED: ["(99) 99999-9999"],
|
|
48
|
+
COMBINED_PHONE: (value) => {
|
|
49
|
+
const onlyNumbers = extractDigitsFromString(value);
|
|
50
|
+
const isCellPhoneExtended = onlyNumbers.length === 11;
|
|
51
|
+
return value?.length <= 14 && !isCellPhoneExtended ? Masks.PHONE : Masks.PHONE_EXTENDED;
|
|
52
|
+
},
|
|
53
|
+
COMBINED_CPF_CNPJ: (value) => value?.length <= 14 ? Masks.CPF : Masks.CNPJ
|
|
54
|
+
};
|
|
55
|
+
const BRLMask = {
|
|
56
|
+
symbol: "R$ ",
|
|
57
|
+
separator: ".",
|
|
58
|
+
decimal: ",",
|
|
59
|
+
precision: 2
|
|
60
|
+
};
|
|
61
|
+
const PercentageMask = {
|
|
62
|
+
symbol: "",
|
|
63
|
+
separator: ".",
|
|
64
|
+
decimal: ",",
|
|
65
|
+
precision: 2
|
|
66
|
+
};
|
|
37
67
|
|
|
38
|
-
export { CurrencyIMask, ExpressionMasks, NumberIMask, PercentageIMask };
|
|
68
|
+
export { BRLMask, CurrencyIMask, ExpressionMasks, Masks, NumberIMask, PercentageIMask, PercentageMask };
|
|
@@ -3,6 +3,7 @@ import '@internationalized/date';
|
|
|
3
3
|
import 'react-aria';
|
|
4
4
|
import 'react-stately';
|
|
5
5
|
import '@floating-ui/react';
|
|
6
|
+
import 'currency.js';
|
|
6
7
|
import { useOutsideClickListener } from '../../hooks/useOutsideClickListener.js';
|
|
7
8
|
import { usePopoverContext } from '../Popover/Context.js';
|
|
8
9
|
|
|
@@ -4,6 +4,7 @@ import '@internationalized/date';
|
|
|
4
4
|
import 'react-aria';
|
|
5
5
|
import 'react-stately';
|
|
6
6
|
import '@floating-ui/react';
|
|
7
|
+
import 'currency.js';
|
|
7
8
|
import { useSelectGroupedOptions } from '../../hooks/useSelectGroupedOptions.js';
|
|
8
9
|
import { usePopoverContext } from '../Popover/Context.js';
|
|
9
10
|
import { SelectOption } from './Option.js';
|
|
@@ -4,6 +4,7 @@ import '@internationalized/date';
|
|
|
4
4
|
import 'react-aria';
|
|
5
5
|
import 'react-stately';
|
|
6
6
|
import '@floating-ui/react';
|
|
7
|
+
import 'currency.js';
|
|
7
8
|
import { useSelectGroupedOptions } from '../../hooks/useSelectGroupedOptions.js';
|
|
8
9
|
import { SelectMultiOption } from './MultiOption.js';
|
|
9
10
|
import { SkeletonOptions } from './SkeletonOptions.js';
|
|
@@ -4,6 +4,7 @@ import '@internationalized/date';
|
|
|
4
4
|
import 'react-aria';
|
|
5
5
|
import 'react-stately';
|
|
6
6
|
import '@floating-ui/react';
|
|
7
|
+
import 'currency.js';
|
|
7
8
|
import { useSelectOptions } from '../../hooks/useSelectOptions.js';
|
|
8
9
|
import { SelectMultiOption } from './MultiOption.js';
|
|
9
10
|
import { SkeletonOptions } from './SkeletonOptions.js';
|
|
@@ -4,6 +4,7 @@ import '@internationalized/date';
|
|
|
4
4
|
import 'react-aria';
|
|
5
5
|
import 'react-stately';
|
|
6
6
|
import '@floating-ui/react';
|
|
7
|
+
import 'currency.js';
|
|
7
8
|
import { useSelectOptions } from '../../hooks/useSelectOptions.js';
|
|
8
9
|
import { usePopoverContext } from '../Popover/Context.js';
|
|
9
10
|
import { SelectOption } from './Option.js';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import currency from 'currency.js';
|
|
2
|
+
import { useCallback, useState } from 'react';
|
|
3
|
+
import { extractNumbersFromString } from '../utils/extractNumbersFromString.js';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_OPTIONS = {
|
|
6
|
+
symbol: "R$ ",
|
|
7
|
+
separator: ".",
|
|
8
|
+
decimal: ",",
|
|
9
|
+
precision: 2
|
|
10
|
+
};
|
|
11
|
+
const getRegex = (precision) => new RegExp(`\\B(?=(\\d{${precision}})(?!\\d))`, "g");
|
|
12
|
+
const getInternalNumberAndMask = (value, options) => {
|
|
13
|
+
const mergedOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
14
|
+
const { precision = -1 } = mergedOptions;
|
|
15
|
+
let internalNumber;
|
|
16
|
+
if (typeof value === "number") {
|
|
17
|
+
if (precision) {
|
|
18
|
+
let stringValue = String(value);
|
|
19
|
+
const decimalIndex = stringValue.indexOf(".");
|
|
20
|
+
const currentPrecision = decimalIndex + precision;
|
|
21
|
+
if (decimalIndex !== -1 && currentPrecision <= stringValue.length) {
|
|
22
|
+
const zeros = stringValue.length + 1 - currentPrecision;
|
|
23
|
+
for (let i = 0; i < zeros; i++) stringValue = stringValue + `0`;
|
|
24
|
+
}
|
|
25
|
+
internalNumber = Number(stringValue);
|
|
26
|
+
} else {
|
|
27
|
+
internalNumber = value;
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
const onlyNumbers = String(extractNumbersFromString(value));
|
|
31
|
+
const padZeros = String(onlyNumbers).padStart(precision + 1, "0");
|
|
32
|
+
internalNumber = Number(padZeros.replace(getRegex(precision), "."));
|
|
33
|
+
}
|
|
34
|
+
if (internalNumber > Number.MAX_SAFE_INTEGER) {
|
|
35
|
+
internalNumber = Number.MAX_SAFE_INTEGER;
|
|
36
|
+
}
|
|
37
|
+
if (internalNumber < Number.MIN_SAFE_INTEGER) {
|
|
38
|
+
internalNumber = Number.MIN_SAFE_INTEGER;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
internalNumber,
|
|
42
|
+
mergedOptions
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const useNumberMask = (options, defaultValue) => {
|
|
46
|
+
const applyMask = useCallback(
|
|
47
|
+
(value2 = 0) => {
|
|
48
|
+
const { internalNumber, mergedOptions } = getInternalNumberAndMask(
|
|
49
|
+
value2,
|
|
50
|
+
options
|
|
51
|
+
);
|
|
52
|
+
return {
|
|
53
|
+
raw: internalNumber,
|
|
54
|
+
formatted: currency(internalNumber).format(mergedOptions)
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
[options, getRegex]
|
|
58
|
+
);
|
|
59
|
+
const [value, setValue] = useState(applyMask(defaultValue));
|
|
60
|
+
const handleChangeValue = useCallback(
|
|
61
|
+
(formattedValue) => {
|
|
62
|
+
const { raw, formatted } = applyMask(formattedValue);
|
|
63
|
+
setValue({
|
|
64
|
+
raw,
|
|
65
|
+
formatted
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
[applyMask, setValue]
|
|
69
|
+
);
|
|
70
|
+
return [value, handleChangeValue];
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export { getInternalNumberAndMask, useNumberMask };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
const mergeMask = (value = "", mask) => {
|
|
4
|
+
let formatted = "";
|
|
5
|
+
let raw = "";
|
|
6
|
+
let iMask = 0;
|
|
7
|
+
let iChars = 0;
|
|
8
|
+
while (!(iMask === mask.length || iChars === value.length)) {
|
|
9
|
+
const maskChar = mask[iMask];
|
|
10
|
+
const valueChar = value[iChars];
|
|
11
|
+
if (maskChar === valueChar) {
|
|
12
|
+
formatted += maskChar;
|
|
13
|
+
iChars++;
|
|
14
|
+
iMask++;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const rawValueChar = value[iChars];
|
|
18
|
+
if (typeof maskChar === "object") {
|
|
19
|
+
iChars++;
|
|
20
|
+
const maskCharRegex = Array.isArray(maskChar) ? maskChar[0] : maskChar;
|
|
21
|
+
const matchRegex = RegExp(maskCharRegex).test(valueChar);
|
|
22
|
+
if (matchRegex) {
|
|
23
|
+
formatted += valueChar;
|
|
24
|
+
raw += rawValueChar;
|
|
25
|
+
iMask++;
|
|
26
|
+
}
|
|
27
|
+
} else {
|
|
28
|
+
formatted += maskChar;
|
|
29
|
+
iMask++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { raw, formatted };
|
|
33
|
+
};
|
|
34
|
+
const getMask = (mask, newValue) => {
|
|
35
|
+
let maskArray;
|
|
36
|
+
const regexArray = [];
|
|
37
|
+
if (typeof mask === "function") {
|
|
38
|
+
maskArray = mask(newValue);
|
|
39
|
+
} else {
|
|
40
|
+
maskArray = mask;
|
|
41
|
+
}
|
|
42
|
+
maskArray.forEach((exp) => {
|
|
43
|
+
if (typeof exp !== "string") {
|
|
44
|
+
if (Array.isArray(exp)) regexArray.push(exp);
|
|
45
|
+
else regexArray.push(exp);
|
|
46
|
+
} else {
|
|
47
|
+
for (let i = 0; i < exp.length; i++) {
|
|
48
|
+
if (exp[i] === "\\") {
|
|
49
|
+
regexArray.push(exp[i + 1]);
|
|
50
|
+
i++;
|
|
51
|
+
} else {
|
|
52
|
+
if (exp[i] === "9") regexArray.push(/\d/);
|
|
53
|
+
else if (exp[i] === "a") regexArray.push(/[a-zA-Z]/);
|
|
54
|
+
else regexArray.push(exp[i]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return regexArray;
|
|
60
|
+
};
|
|
61
|
+
const useStringMask = (mask, defaultValue) => {
|
|
62
|
+
const applyMask = useCallback(
|
|
63
|
+
(value2 = "") => {
|
|
64
|
+
const selectedMask = getMask(mask, value2);
|
|
65
|
+
const { formatted, raw } = mergeMask(value2, selectedMask);
|
|
66
|
+
return {
|
|
67
|
+
raw,
|
|
68
|
+
formatted
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
[mask]
|
|
72
|
+
);
|
|
73
|
+
const [value, setValue] = useState(
|
|
74
|
+
applyMask(defaultValue?.toString())
|
|
75
|
+
);
|
|
76
|
+
const handleChangeValue = useCallback(
|
|
77
|
+
(formattedValue) => {
|
|
78
|
+
const { raw, formatted } = applyMask(formattedValue?.toString());
|
|
79
|
+
setValue({
|
|
80
|
+
raw,
|
|
81
|
+
formatted
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
[applyMask, setValue]
|
|
85
|
+
);
|
|
86
|
+
return [value, handleChangeValue];
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { getMask, mergeMask, useStringMask };
|
package/dist/esm/index.js
CHANGED
|
@@ -39,11 +39,13 @@ export { useDatePickerInput } from './hooks/useDatePickerInput.js';
|
|
|
39
39
|
export { useDateRangePickerInput } from './hooks/useDateRangePickerInput.js';
|
|
40
40
|
export { useDebouncedState } from './hooks/useDebouncedState.js';
|
|
41
41
|
export { useFloatingLogic } from './hooks/useFloatingLogic.js';
|
|
42
|
+
export { getInternalNumberAndMask, useNumberMask } from './hooks/useNumberMask.js';
|
|
42
43
|
export { useOutsideClickListener } from './hooks/useOutsideClickListener.js';
|
|
43
44
|
export { useRangeCalendar } from './hooks/useRangeCalendar.js';
|
|
44
45
|
export { useSelectGroupedOptions } from './hooks/useSelectGroupedOptions.js';
|
|
45
46
|
export { useSelectOptions } from './hooks/useSelectOptions.js';
|
|
47
|
+
export { getMask, mergeMask, useStringMask } from './hooks/useStringMask.js';
|
|
46
48
|
export { SnackbarSonner } from './service/SnackbarSonner.js';
|
|
47
49
|
export { MenubarProvider, useMenubar } from './provider/MenubarProvider.js';
|
|
48
50
|
export { SnackbarProvider, useSnackbar } from './provider/SnackbarProvider.js';
|
|
49
|
-
export { CurrencyIMask, ExpressionMasks, NumberIMask, PercentageIMask } from './components/Input/masks.js';
|
|
51
|
+
export { BRLMask, CurrencyIMask, ExpressionMasks, Masks, NumberIMask, PercentageIMask, PercentageMask } from './components/Input/masks.js';
|
|
@@ -37,3 +37,27 @@ export declare const PercentageIMask: {
|
|
|
37
37
|
};
|
|
38
38
|
};
|
|
39
39
|
};
|
|
40
|
+
export declare const Masks: {
|
|
41
|
+
CPF: string[];
|
|
42
|
+
CNPJ: string[];
|
|
43
|
+
DATE: string[];
|
|
44
|
+
HOUR: string[];
|
|
45
|
+
MONTH_YEAR: string[];
|
|
46
|
+
CEP: string[];
|
|
47
|
+
PHONE: string[];
|
|
48
|
+
PHONE_EXTENDED: string[];
|
|
49
|
+
COMBINED_PHONE: (value: string) => string[];
|
|
50
|
+
COMBINED_CPF_CNPJ: (value: string) => string[];
|
|
51
|
+
};
|
|
52
|
+
export declare const BRLMask: {
|
|
53
|
+
symbol: string;
|
|
54
|
+
separator: string;
|
|
55
|
+
decimal: string;
|
|
56
|
+
precision: number;
|
|
57
|
+
};
|
|
58
|
+
export declare const PercentageMask: {
|
|
59
|
+
symbol: string;
|
|
60
|
+
separator: string;
|
|
61
|
+
decimal: string;
|
|
62
|
+
precision: number;
|
|
63
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { InputBaseVariants } from '@tecsinapse/cortex-core';
|
|
2
|
+
import { CurrencyOptions } from '../../hooks';
|
|
2
3
|
export interface InputPropsBase {
|
|
3
4
|
variants?: InputBaseVariants;
|
|
4
5
|
label?: string;
|
|
@@ -18,14 +19,13 @@ export interface InputRightProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
18
19
|
export interface InputSearchProps extends InputProps {
|
|
19
20
|
bounceTimeout?: number;
|
|
20
21
|
}
|
|
21
|
-
export
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
export interface Mask extends Record<string, any> {
|
|
26
|
-
mask: any;
|
|
22
|
+
export interface MaskValue {
|
|
23
|
+
formatted?: string;
|
|
24
|
+
raw?: string | number;
|
|
27
25
|
}
|
|
28
|
-
export
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
export type MaskType = string | RegExp | Array<RegExp>;
|
|
27
|
+
export interface InputMaskProps extends Omit<InputProps, 'onChange' | 'value'> {
|
|
28
|
+
value?: string | number;
|
|
29
|
+
onChange?: (value: any) => void;
|
|
30
|
+
mask?: (MaskType[] | ((value: string) => MaskType[])) | CurrencyOptions;
|
|
31
31
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface KanbanProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
}
|
|
5
|
+
export declare const Kanban: {
|
|
6
|
+
Root: ({ children, className, ...rest }: KanbanProps) => JSX.Element;
|
|
7
|
+
Header: ({ children, className, ...rest }: KanbanProps) => JSX.Element;
|
|
8
|
+
Body: ({ children, className, ...rest }: KanbanProps) => JSX.Element;
|
|
9
|
+
ContainerList: ({ children, className, ...rest }: KanbanProps) => JSX.Element;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -5,7 +5,9 @@ export * from './useDatePickerInput';
|
|
|
5
5
|
export * from './useDateRangePickerInput';
|
|
6
6
|
export * from './useDebouncedState';
|
|
7
7
|
export * from './useFloatingLogic';
|
|
8
|
+
export * from './useNumberMask';
|
|
8
9
|
export * from './useOutsideClickListener';
|
|
9
10
|
export * from './useRangeCalendar';
|
|
10
11
|
export * from './useSelectGroupedOptions';
|
|
11
12
|
export * from './useSelectOptions';
|
|
13
|
+
export * from './useStringMask';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import currency from 'currency.js';
|
|
2
|
+
import { MaskValue } from '../components';
|
|
3
|
+
export type CurrencyOptions = currency.Options;
|
|
4
|
+
export declare const getInternalNumberAndMask: (value: string | number, options?: CurrencyOptions) => {
|
|
5
|
+
internalNumber: number;
|
|
6
|
+
mergedOptions: CurrencyOptions;
|
|
7
|
+
};
|
|
8
|
+
export declare const useNumberMask: (options?: CurrencyOptions, defaultValue?: string | number) => [MaskValue, (value: string | number) => void];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { MaskType, MaskValue } from '../components';
|
|
2
|
+
export declare const mergeMask: (value: string | undefined, mask: MaskType[]) => MaskValue;
|
|
3
|
+
export declare const getMask: (mask: MaskType[] | ((value: string) => MaskType[]), newValue: string) => MaskType[];
|
|
4
|
+
export declare const useStringMask: (mask: MaskType[] | ((value: string) => MaskType[]), defaultValue?: string | number) => [MaskValue, (text: string | number) => void];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './extractNumbersFromString';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tecsinapse/cortex-react",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"description": "React components based in @tecsinapse/cortex-core",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/esm/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@floating-ui/react": "^0.26.18",
|
|
22
22
|
"@internationalized/date": "*",
|
|
23
|
-
"@tecsinapse/cortex-core": "0.3.
|
|
23
|
+
"@tecsinapse/cortex-core": "0.3.1",
|
|
24
24
|
"clsx": "*",
|
|
25
25
|
"react-aria": "^3.33.1",
|
|
26
26
|
"react-icons": "^5.2.1",
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"react-dom": ">=18.0.0",
|
|
44
44
|
"tailwind": ">=3.3.0"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "9d707d884c57664e25cc921ec038085a52dca55c"
|
|
47
47
|
}
|