@tecsinapse/cortex-react 1.3.0-beta.33 → 1.3.0-beta.35
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 +48 -20
- 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 +49 -21
- 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 +10 -11
- 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
12
|
const InputMask = React.forwardRef(
|
|
8
|
-
({ mask, onChange, value,
|
|
9
|
-
const {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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);
|
|
19
37
|
},
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
});
|
|
38
|
+
[value]
|
|
39
|
+
);
|
|
23
40
|
React.useEffect(() => {
|
|
24
|
-
if (value &&
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
27
56
|
}
|
|
28
|
-
|
|
29
|
-
return /* @__PURE__ */ React.createElement(Root.InputRoot, { ...rest, ref: iMaskRef });
|
|
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
10
|
const InputMask = React__default.forwardRef(
|
|
6
|
-
({ mask, onChange, value,
|
|
7
|
-
const {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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);
|
|
17
35
|
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
36
|
+
[value]
|
|
37
|
+
);
|
|
21
38
|
useEffect(() => {
|
|
22
|
-
if (value &&
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
25
54
|
}
|
|
26
|
-
|
|
27
|
-
return /* @__PURE__ */ React__default.createElement(InputRoot, { ...rest, ref: iMaskRef });
|
|
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,15 +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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
mask: Mask;
|
|
31
|
-
controlled?: boolean;
|
|
22
|
+
export interface MaskValue {
|
|
23
|
+
formatted?: string;
|
|
24
|
+
raw?: string | number;
|
|
25
|
+
}
|
|
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;
|
|
32
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.0-beta.
|
|
3
|
+
"version": "1.3.0-beta.35",
|
|
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-beta.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": "0fefaea56687bb5f672b66677c15bdc0d653cec0"
|
|
47
47
|
}
|