@snack-uikit/fields 0.30.0 → 0.32.0
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/CHANGELOG.md +33 -0
- package/README.md +184 -152
- package/dist/cjs/components/FieldDate/FieldDate.d.ts +15 -24
- package/dist/cjs/components/FieldDate/FieldDate.js +53 -41
- package/dist/cjs/components/FieldDate/index.d.ts +0 -1
- package/dist/cjs/components/FieldDate/index.js +1 -9
- package/dist/cjs/components/FieldSecure/FieldSecure.d.ts +1 -1
- package/dist/cjs/components/FieldSelect/hooks.d.ts +2 -2
- package/dist/cjs/components/FieldSelect/hooks.js +7 -3
- package/dist/cjs/components/FieldSelect/styles.module.css +6 -18
- package/dist/cjs/components/FieldSlider/FieldSlider.d.ts +1 -1
- package/dist/cjs/components/FieldText/FieldText.d.ts +1 -1
- package/dist/cjs/components/FieldTextArea/FieldTextArea.d.ts +1 -1
- package/dist/cjs/components/FieldTime/FieldTime.d.ts +30 -0
- package/dist/cjs/components/FieldTime/FieldTime.js +298 -0
- package/dist/cjs/components/FieldTime/index.d.ts +1 -0
- package/dist/cjs/components/{FieldDate/hooks → FieldTime}/index.js +1 -1
- package/dist/cjs/components/FieldTime/styles.module.css +27 -0
- package/dist/cjs/components/index.d.ts +6 -5
- package/dist/cjs/components/index.js +6 -5
- package/dist/cjs/constants/dateFields.d.ts +24 -0
- package/dist/cjs/constants/dateFields.js +152 -0
- package/dist/cjs/constants/index.d.ts +2 -0
- package/dist/cjs/constants/index.js +26 -0
- package/dist/cjs/hooks/dateHandlers/index.d.ts +3 -0
- package/dist/cjs/hooks/dateHandlers/index.js +27 -0
- package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.d.ts +13 -5
- package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.js +49 -34
- package/dist/cjs/hooks/dateHandlers/useDateFieldHelpersForMode.d.ts +18 -0
- package/dist/cjs/hooks/dateHandlers/useDateFieldHelpersForMode.js +113 -0
- package/dist/cjs/hooks/index.d.ts +1 -0
- package/dist/cjs/hooks/index.js +1 -0
- package/dist/cjs/hooks/useCopyButton.js +1 -1
- package/dist/cjs/{types.d.ts → types/allFields.d.ts} +1 -1
- package/dist/cjs/types/dateFields.d.ts +11 -0
- package/dist/cjs/types/index.d.ts +2 -0
- package/dist/cjs/types/index.js +26 -0
- package/dist/cjs/utils/dateFields.d.ts +10 -0
- package/dist/cjs/utils/dateFields.js +71 -0
- package/dist/esm/components/FieldDate/FieldDate.d.ts +15 -24
- package/dist/esm/components/FieldDate/FieldDate.js +39 -31
- package/dist/esm/components/FieldDate/index.d.ts +0 -1
- package/dist/esm/components/FieldDate/index.js +0 -1
- package/dist/esm/components/FieldSecure/FieldSecure.d.ts +1 -1
- package/dist/esm/components/FieldSelect/hooks.d.ts +2 -2
- package/dist/esm/components/FieldSelect/hooks.js +9 -3
- package/dist/esm/components/FieldSelect/styles.module.css +6 -18
- package/dist/esm/components/FieldSlider/FieldSlider.d.ts +1 -1
- package/dist/esm/components/FieldText/FieldText.d.ts +1 -1
- package/dist/esm/components/FieldTextArea/FieldTextArea.d.ts +1 -1
- package/dist/esm/components/FieldTime/FieldTime.d.ts +30 -0
- package/dist/esm/components/FieldTime/FieldTime.js +161 -0
- package/dist/esm/components/FieldTime/index.d.ts +1 -0
- package/dist/esm/components/FieldTime/index.js +1 -0
- package/dist/esm/components/FieldTime/styles.module.css +27 -0
- package/dist/esm/components/index.d.ts +6 -5
- package/dist/esm/components/index.js +6 -5
- package/dist/esm/constants/dateFields.d.ts +24 -0
- package/dist/esm/constants/dateFields.js +103 -0
- package/dist/esm/constants/index.d.ts +2 -0
- package/dist/esm/constants/index.js +2 -0
- package/dist/esm/hooks/dateHandlers/index.d.ts +3 -0
- package/dist/esm/hooks/dateHandlers/index.js +3 -0
- package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.d.ts +13 -5
- package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.js +48 -35
- package/dist/esm/hooks/dateHandlers/useDateFieldHelpersForMode.d.ts +18 -0
- package/dist/esm/hooks/dateHandlers/useDateFieldHelpersForMode.js +95 -0
- package/dist/esm/hooks/index.d.ts +1 -0
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/useCopyButton.js +1 -1
- package/dist/esm/{types.d.ts → types/allFields.d.ts} +1 -1
- package/dist/esm/types/dateFields.d.ts +11 -0
- package/dist/esm/types/index.d.ts +2 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/utils/dateFields.d.ts +10 -0
- package/dist/esm/utils/dateFields.js +59 -0
- package/package.json +16 -16
- package/src/components/FieldColor/styles.module.scss +9 -10
- package/src/components/FieldDate/FieldDate.tsx +72 -52
- package/src/components/FieldDate/index.ts +0 -1
- package/src/components/FieldDate/styles.module.scss +10 -11
- package/src/components/FieldDecorator/styles.module.scss +44 -45
- package/src/components/FieldSelect/hooks.ts +15 -3
- package/src/components/FieldSelect/styles.module.scss +20 -20
- package/src/components/FieldSlider/styles.module.scss +4 -4
- package/src/components/FieldTextArea/styles.module.scss +18 -18
- package/src/components/FieldTime/FieldTime.tsx +350 -0
- package/src/components/FieldTime/index.ts +1 -0
- package/src/components/FieldTime/styles.module.scss +41 -0
- package/src/components/index.ts +6 -5
- package/src/constants/dateFields.ts +127 -0
- package/src/constants/index.ts +2 -0
- package/src/helperComponents/ButtonCopyValue/styles.module.scss +2 -2
- package/src/helperComponents/ButtonField/styles.module.scss +9 -9
- package/src/helperComponents/ButtonFieldList/styles.module.scss +2 -2
- package/src/helperComponents/ButtonHideValue/styles.module.scss +2 -2
- package/src/helperComponents/FieldContainerPrivate/styles.module.scss +24 -26
- package/src/helperComponents/TextArea/styles.module.scss +5 -5
- package/src/hooks/dateHandlers/index.ts +3 -0
- package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.ts +93 -47
- package/src/hooks/dateHandlers/useDateFieldHelpersForMode.ts +145 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/styles.module.scss +5 -5
- package/src/hooks/useCopyButton.tsx +1 -1
- package/src/styles.module.scss +15 -15
- package/src/{types.ts → types/allFields.ts} +1 -1
- package/src/types/dateFields.ts +14 -0
- package/src/types/index.ts +2 -0
- package/src/utils/dateFields.ts +75 -0
- package/dist/cjs/components/FieldDate/constants.d.ts +0 -10
- package/dist/cjs/components/FieldDate/constants.js +0 -49
- package/dist/cjs/components/FieldDate/hooks/index.d.ts +0 -1
- package/dist/cjs/components/FieldDate/hooks/useDateFieldHelpers.d.ts +0 -10
- package/dist/cjs/components/FieldDate/hooks/useDateFieldHelpers.js +0 -82
- package/dist/cjs/components/FieldDate/types.d.ts +0 -6
- package/dist/cjs/components/FieldDate/utils.d.ts +0 -9
- package/dist/cjs/components/FieldDate/utils.js +0 -56
- package/dist/esm/components/FieldDate/constants.d.ts +0 -10
- package/dist/esm/components/FieldDate/constants.js +0 -28
- package/dist/esm/components/FieldDate/hooks/index.d.ts +0 -1
- package/dist/esm/components/FieldDate/hooks/index.js +0 -1
- package/dist/esm/components/FieldDate/hooks/useDateFieldHelpers.d.ts +0 -10
- package/dist/esm/components/FieldDate/hooks/useDateFieldHelpers.js +0 -66
- package/dist/esm/components/FieldDate/types.d.ts +0 -6
- package/dist/esm/components/FieldDate/utils.d.ts +0 -9
- package/dist/esm/components/FieldDate/utils.js +0 -43
- package/src/components/FieldDate/constants.ts +0 -33
- package/src/components/FieldDate/hooks/index.ts +0 -1
- package/src/components/FieldDate/hooks/useDateFieldHelpers.ts +0 -96
- package/src/components/FieldDate/types.ts +0 -6
- package/src/components/FieldDate/utils.ts +0 -49
- /package/dist/cjs/{constants.d.ts → constants/allFields.d.ts} +0 -0
- /package/dist/cjs/{constants.js → constants/allFields.js} +0 -0
- /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.d.ts +0 -0
- /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.js +0 -0
- /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.d.ts +0 -0
- /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.js +0 -0
- /package/dist/cjs/{components/FieldDate/types.js → types/allFields.js} +0 -0
- /package/dist/cjs/{types.js → types/dateFields.js} +0 -0
- /package/dist/esm/{constants.d.ts → constants/allFields.d.ts} +0 -0
- /package/dist/esm/{constants.js → constants/allFields.js} +0 -0
- /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.d.ts +0 -0
- /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.js +0 -0
- /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.d.ts +0 -0
- /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.js +0 -0
- /package/dist/esm/{components/FieldDate/types.js → types/allFields.js} +0 -0
- /package/dist/esm/{types.js → types/dateFields.js} +0 -0
- /package/src/{constants.ts → constants/allFields.ts} +0 -0
- /package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.ts +0 -0
- /package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.ts +0 -0
|
@@ -6,91 +6,105 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.useDateField = useDateField;
|
|
7
7
|
const react_1 = require("react");
|
|
8
8
|
const utils_1 = require("@snack-uikit/utils");
|
|
9
|
-
const constants_1 = require("
|
|
10
|
-
const
|
|
11
|
-
const
|
|
9
|
+
const constants_1 = require("../../constants");
|
|
10
|
+
const dateFields_1 = require("../../utils/dateFields");
|
|
11
|
+
const useDateFieldHelpersForMode_1 = require("./useDateFieldHelpersForMode");
|
|
12
12
|
function useDateField(_ref) {
|
|
13
13
|
let {
|
|
14
14
|
inputRef,
|
|
15
15
|
onChange,
|
|
16
16
|
readonly,
|
|
17
17
|
locale = constants_1.DEFAULT_LOCALE,
|
|
18
|
-
setIsOpen
|
|
18
|
+
setIsOpen,
|
|
19
|
+
mode,
|
|
20
|
+
showSeconds
|
|
19
21
|
} = _ref;
|
|
20
22
|
var _a;
|
|
23
|
+
const dateTimeMode = mode === constants_1.MODES.DateTime && !showSeconds ? constants_1.NO_SECONDS_MODE : mode;
|
|
24
|
+
const slotsInfo = constants_1.SLOTS[dateTimeMode];
|
|
25
|
+
const mask = constants_1.MASK[dateTimeMode][locale.baseName] || constants_1.MASK[dateTimeMode][constants_1.DEFAULT_LOCALE.baseName];
|
|
26
|
+
const slotsPlaceholder = constants_1.SLOTS_PLACEHOLDER[dateTimeMode][locale.baseName] || constants_1.SLOTS_PLACEHOLDER[dateTimeMode][constants_1.DEFAULT_LOCALE.baseName];
|
|
27
|
+
const slotOrder = constants_1.SLOT_ORDER[dateTimeMode];
|
|
21
28
|
const {
|
|
29
|
+
getNextSlotKey,
|
|
30
|
+
getPrevSlotKey,
|
|
31
|
+
getSlotKeyFromIndex,
|
|
22
32
|
setFocus,
|
|
23
33
|
updateSlot,
|
|
24
34
|
getSlot,
|
|
25
35
|
isLikeDate,
|
|
26
36
|
isAllSelected,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
} = (0,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
tryToCompleteInput,
|
|
38
|
+
isValidInput
|
|
39
|
+
} = (0, useDateFieldHelpersForMode_1.useDateFieldHelpersForMode)({
|
|
40
|
+
inputRef,
|
|
41
|
+
mode: dateTimeMode
|
|
42
|
+
});
|
|
43
|
+
const focusSlotKey = (0, react_1.useMemo)(() => slotOrder[0], [slotOrder]);
|
|
44
|
+
const focusSlotRef = (0, react_1.useRef)(focusSlotKey);
|
|
33
45
|
const setInputFocus = (0, react_1.useCallback)(focusSlot => {
|
|
34
46
|
if (!inputRef.current || readonly) {
|
|
35
47
|
return;
|
|
36
48
|
}
|
|
37
49
|
if ((0, utils_1.isBrowser)() && document.activeElement !== inputRef.current) {
|
|
38
|
-
focusSlotRef.current = focusSlot ||
|
|
50
|
+
focusSlotRef.current = focusSlot || focusSlotKey;
|
|
39
51
|
inputRef.current.focus();
|
|
40
52
|
return;
|
|
41
53
|
}
|
|
42
54
|
const focusSlotValue = focusSlot || focusSlotRef.current;
|
|
43
|
-
if (isLikeDate() && focusSlotValue ===
|
|
55
|
+
if (isLikeDate() && focusSlotValue === focusSlotKey) {
|
|
44
56
|
return;
|
|
45
57
|
}
|
|
46
58
|
if (!inputRef.current.value) {
|
|
47
59
|
inputRef.current.value = mask;
|
|
48
|
-
setFocus(
|
|
60
|
+
setFocus(focusSlotKey);
|
|
49
61
|
return;
|
|
50
62
|
}
|
|
51
63
|
if (focusSlot !== 'auto') {
|
|
52
64
|
setFocus(focusSlotValue);
|
|
53
65
|
return;
|
|
54
66
|
}
|
|
55
|
-
const slotKey = (
|
|
67
|
+
const slotKey = getSlotKeyFromIndex(inputRef.current.selectionStart);
|
|
56
68
|
if (slotKey) {
|
|
57
69
|
const {
|
|
58
70
|
start,
|
|
59
71
|
end
|
|
60
|
-
} =
|
|
72
|
+
} = slotsInfo[slotKey];
|
|
61
73
|
inputRef.current.setSelectionRange(start, end);
|
|
62
74
|
}
|
|
63
|
-
}, [inputRef, isLikeDate, mask,
|
|
75
|
+
}, [inputRef, readonly, isLikeDate, focusSlotKey, getSlotKeyFromIndex, mask, setFocus, slotsInfo]);
|
|
64
76
|
const handleClick = (0, react_1.useCallback)(() => {
|
|
65
77
|
setInputFocus('auto');
|
|
66
78
|
}, [setInputFocus]);
|
|
67
79
|
const handleChange = () => {
|
|
68
80
|
var _a;
|
|
69
|
-
onChange && isLikeDate() && onChange(((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.value) || '');
|
|
81
|
+
onChange && isLikeDate() && onChange((0, dateFields_1.parseDate)(((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.value) || ''));
|
|
70
82
|
};
|
|
71
83
|
const checkInputAndGoNext = (0, react_1.useCallback)(slotKey => {
|
|
72
|
-
|
|
84
|
+
var _a, _b;
|
|
85
|
+
if (slotKey === slotOrder[slotOrder.length - 1] && tryToCompleteInput()) {
|
|
73
86
|
return;
|
|
74
87
|
}
|
|
75
88
|
if (isValidInput()) {
|
|
76
|
-
setFocus(
|
|
89
|
+
setFocus(getNextSlotKey(slotKey));
|
|
77
90
|
return;
|
|
78
91
|
}
|
|
79
92
|
switch (slotKey) {
|
|
80
93
|
case constants_1.SlotKey.Day:
|
|
81
|
-
updateSlot(constants_1.SlotKey.Month,
|
|
94
|
+
updateSlot(constants_1.SlotKey.Month, (_a = slotsPlaceholder === null || slotsPlaceholder === void 0 ? void 0 : slotsPlaceholder[constants_1.SlotKey.Month]) !== null && _a !== void 0 ? _a : '');
|
|
82
95
|
setFocus(constants_1.SlotKey.Month);
|
|
83
96
|
return;
|
|
84
97
|
case constants_1.SlotKey.Year:
|
|
85
98
|
case constants_1.SlotKey.Month:
|
|
86
|
-
updateSlot(constants_1.SlotKey.Day,
|
|
99
|
+
updateSlot(constants_1.SlotKey.Day, (_b = slotsPlaceholder === null || slotsPlaceholder === void 0 ? void 0 : slotsPlaceholder[constants_1.SlotKey.Day]) !== null && _b !== void 0 ? _b : '');
|
|
87
100
|
setFocus(constants_1.SlotKey.Day);
|
|
88
101
|
return;
|
|
89
102
|
default:
|
|
90
|
-
setFocus(
|
|
103
|
+
setFocus(getNextSlotKey(slotKey));
|
|
91
104
|
}
|
|
92
|
-
}, [tryToCompleteInput, isValidInput, setFocus,
|
|
105
|
+
}, [slotOrder, tryToCompleteInput, isValidInput, setFocus, getNextSlotKey, updateSlot, slotsPlaceholder]);
|
|
93
106
|
const handleKeyDown = (0, react_1.useCallback)(e => {
|
|
107
|
+
var _a;
|
|
94
108
|
if (inputRef.current && !readonly) {
|
|
95
109
|
if (e.key !== 'Tab') {
|
|
96
110
|
e.preventDefault();
|
|
@@ -107,31 +121,31 @@ function useDateField(_ref) {
|
|
|
107
121
|
tryToCompleteInput();
|
|
108
122
|
}
|
|
109
123
|
const clickIndex = inputRef.current.selectionStart;
|
|
110
|
-
const slotKey = (
|
|
124
|
+
const slotKey = getSlotKeyFromIndex(clickIndex);
|
|
111
125
|
if (slotKey) {
|
|
112
126
|
const value = getSlot(slotKey);
|
|
113
127
|
const {
|
|
114
128
|
max
|
|
115
|
-
} =
|
|
129
|
+
} = slotsInfo[slotKey];
|
|
116
130
|
const numberValue = Number(value) || 0;
|
|
117
131
|
if (e.key === 'ArrowRight') {
|
|
118
|
-
if (isAllSelected() || slotKey ===
|
|
132
|
+
if (isAllSelected() || slotKey === slotOrder[slotOrder.length - 1]) {
|
|
119
133
|
inputRef.current.selectionStart = inputRef.current.value.length;
|
|
120
134
|
return;
|
|
121
135
|
}
|
|
122
|
-
setFocus(
|
|
136
|
+
setFocus(getNextSlotKey(slotKey));
|
|
123
137
|
return;
|
|
124
138
|
}
|
|
125
139
|
if (e.key === 'ArrowLeft') {
|
|
126
|
-
setFocus(
|
|
140
|
+
setFocus(getPrevSlotKey(slotKey));
|
|
127
141
|
return;
|
|
128
142
|
}
|
|
129
143
|
if (e.key === 'Backspace') {
|
|
130
144
|
if (isAllSelected()) {
|
|
131
145
|
inputRef.current.value = mask;
|
|
132
|
-
setFocus(
|
|
146
|
+
setFocus(focusSlotKey);
|
|
133
147
|
} else {
|
|
134
|
-
updateSlot(slotKey,
|
|
148
|
+
updateSlot(slotKey, (_a = slotsPlaceholder[slotKey]) !== null && _a !== void 0 ? _a : '');
|
|
135
149
|
}
|
|
136
150
|
}
|
|
137
151
|
if (/^\d+$/.test(e.key)) {
|
|
@@ -164,17 +178,18 @@ function useDateField(_ref) {
|
|
|
164
178
|
}
|
|
165
179
|
}
|
|
166
180
|
}
|
|
167
|
-
|
|
181
|
+
const newDate = (0, dateFields_1.parseDate)(isLikeDate() ? inputRef.current.value : '');
|
|
182
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(newDate);
|
|
168
183
|
}
|
|
169
184
|
}
|
|
170
|
-
}, [
|
|
185
|
+
}, [inputRef, readonly, getSlotKeyFromIndex, setIsOpen, tryToCompleteInput, getSlot, slotsInfo, isLikeDate, onChange, isAllSelected, slotOrder, setFocus, getNextSlotKey, getPrevSlotKey, mask, focusSlotKey, updateSlot, slotsPlaceholder, checkInputAndGoNext]);
|
|
171
186
|
const handleBlur = (0, react_1.useCallback)(() => {
|
|
172
187
|
var _a;
|
|
173
188
|
if (!readonly && ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.value) === mask) {
|
|
174
189
|
inputRef.current.value = '';
|
|
175
190
|
}
|
|
176
|
-
focusSlotRef.current =
|
|
177
|
-
}, [inputRef, mask, readonly]);
|
|
191
|
+
focusSlotRef.current = focusSlotKey;
|
|
192
|
+
}, [inputRef, mask, readonly, focusSlotKey]);
|
|
178
193
|
return {
|
|
179
194
|
handleKeyDown,
|
|
180
195
|
handleChange,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
import { SlotKey } from '../../constants';
|
|
3
|
+
import { Mode, NoSecondsMode, TimeMode } from '../../types';
|
|
4
|
+
export declare function useDateFieldHelpersForMode({ inputRef, mode, }: {
|
|
5
|
+
inputRef: RefObject<HTMLInputElement>;
|
|
6
|
+
mode: Mode | TimeMode | NoSecondsMode;
|
|
7
|
+
}): {
|
|
8
|
+
isAllSelected: () => boolean;
|
|
9
|
+
isValidInput: () => boolean;
|
|
10
|
+
tryToCompleteInput: () => boolean;
|
|
11
|
+
getSlot: (slotKey: string) => string;
|
|
12
|
+
updateSlot: (slotKey: string, slotValue: number | string) => void;
|
|
13
|
+
setFocus: (slotKey: string) => void;
|
|
14
|
+
isLikeDate: () => boolean;
|
|
15
|
+
getNextSlotKey: (slotKey: SlotKey | undefined) => SlotKey;
|
|
16
|
+
getPrevSlotKey: (slotKey: SlotKey | undefined) => SlotKey;
|
|
17
|
+
getSlotKeyFromIndex: (index: number | null) => SlotKey | undefined;
|
|
18
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useDateFieldHelpersForMode = useDateFieldHelpersForMode;
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const constants_1 = require("../../constants");
|
|
9
|
+
const dateFields_1 = require("../../utils/dateFields");
|
|
10
|
+
function useDateFieldHelpersForMode(_ref) {
|
|
11
|
+
let {
|
|
12
|
+
inputRef,
|
|
13
|
+
mode
|
|
14
|
+
} = _ref;
|
|
15
|
+
const setFocus = (0, react_1.useCallback)(slotKey => {
|
|
16
|
+
if (inputRef.current) {
|
|
17
|
+
const {
|
|
18
|
+
start,
|
|
19
|
+
end
|
|
20
|
+
} = constants_1.SLOTS[mode][slotKey];
|
|
21
|
+
inputRef.current.setSelectionRange(start, end);
|
|
22
|
+
}
|
|
23
|
+
}, [mode, inputRef]);
|
|
24
|
+
const isAllSelected = (0, react_1.useCallback)(() => {
|
|
25
|
+
var _a, _b, _c;
|
|
26
|
+
return ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.value.length) === ((_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.selectionEnd) && ((_c = inputRef.current) === null || _c === void 0 ? void 0 : _c.selectionStart) === 0;
|
|
27
|
+
}, [inputRef]);
|
|
28
|
+
const getSlot = (0, react_1.useCallback)(slotKey => {
|
|
29
|
+
if (inputRef.current) {
|
|
30
|
+
return inputRef.current.value.slice(constants_1.SLOTS[mode][slotKey].start, constants_1.SLOTS[mode][slotKey].end);
|
|
31
|
+
}
|
|
32
|
+
return '';
|
|
33
|
+
}, [mode, inputRef]);
|
|
34
|
+
const isLikeDate = (0, react_1.useCallback)(() => {
|
|
35
|
+
if (inputRef.current) {
|
|
36
|
+
return Object.keys(constants_1.SLOTS[mode]).every(slotKey => getSlot(slotKey) && Number.isInteger(Number(getSlot(slotKey))));
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}, [mode, getSlot, inputRef]);
|
|
40
|
+
const isValidInput = (0, react_1.useCallback)(() => {
|
|
41
|
+
const isTimeMode = Object.values(constants_1.TIME_MODES).includes(mode);
|
|
42
|
+
if (isTimeMode) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
const day = parseInt(getSlot(constants_1.SlotKey.Day), 10);
|
|
46
|
+
const month = parseInt(getSlot(constants_1.SlotKey.Month), 10);
|
|
47
|
+
const year = parseInt(getSlot(constants_1.SlotKey.Year), 10);
|
|
48
|
+
if (!month || !day) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
const date = new Date(year || /* високосный год = */2020, month - 1, day);
|
|
52
|
+
return date.getDate() === day;
|
|
53
|
+
}, [getSlot, mode]);
|
|
54
|
+
const tryToCompleteInput = (0, react_1.useCallback)(() => {
|
|
55
|
+
var _a;
|
|
56
|
+
let isCompleted;
|
|
57
|
+
const parsedSlotsData = Object.keys(constants_1.SLOTS[mode]).reduce((res, key) => {
|
|
58
|
+
const slotKey = key;
|
|
59
|
+
res[slotKey] = parseInt(getSlot(slotKey), 10);
|
|
60
|
+
return res;
|
|
61
|
+
}, {});
|
|
62
|
+
const {
|
|
63
|
+
[constants_1.SlotKey.Day]: day,
|
|
64
|
+
[constants_1.SlotKey.Month]: month,
|
|
65
|
+
[constants_1.SlotKey.Year]: year,
|
|
66
|
+
[constants_1.SlotKey.Hours]: hours,
|
|
67
|
+
[constants_1.SlotKey.Minutes]: minutes,
|
|
68
|
+
[constants_1.SlotKey.Seconds]: seconds
|
|
69
|
+
} = parsedSlotsData;
|
|
70
|
+
const yearSlotMeta = constants_1.SLOTS[mode][constants_1.SlotKey.Year];
|
|
71
|
+
const isDateCompleted = Boolean(day && month && year >= (yearSlotMeta === null || yearSlotMeta === void 0 ? void 0 : yearSlotMeta.min) && year <= (yearSlotMeta === null || yearSlotMeta === void 0 ? void 0 : yearSlotMeta.max));
|
|
72
|
+
const isTimeCompleted = [hours, minutes, ...(mode === constants_1.MODES.DateTime || mode === constants_1.TIME_MODES.FullTime ? [seconds] : [])].every(value => value !== undefined);
|
|
73
|
+
if (mode === constants_1.MODES.DateTime || mode === constants_1.NO_SECONDS_MODE) {
|
|
74
|
+
isCompleted = isDateCompleted && isTimeCompleted;
|
|
75
|
+
} else if (mode === constants_1.TIME_MODES.FullTime || mode === constants_1.TIME_MODES.NoSeconds) {
|
|
76
|
+
isCompleted = isTimeCompleted;
|
|
77
|
+
} else {
|
|
78
|
+
isCompleted = isDateCompleted;
|
|
79
|
+
}
|
|
80
|
+
if (isCompleted && inputRef.current) {
|
|
81
|
+
const lastPosition = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.value.length;
|
|
82
|
+
inputRef.current.selectionStart = lastPosition;
|
|
83
|
+
inputRef.current.selectionEnd = lastPosition;
|
|
84
|
+
}
|
|
85
|
+
return isCompleted;
|
|
86
|
+
}, [getSlot, inputRef, mode]);
|
|
87
|
+
const updateSlot = (0, react_1.useCallback)((slotKey, slotValue) => {
|
|
88
|
+
if (inputRef.current) {
|
|
89
|
+
const {
|
|
90
|
+
start,
|
|
91
|
+
end,
|
|
92
|
+
max
|
|
93
|
+
} = constants_1.SLOTS[mode][slotKey];
|
|
94
|
+
inputRef.current.value = inputRef.current.value.slice(0, start) + slotValue.toString().padStart(max.toString().length, '0') + inputRef.current.value.slice(end);
|
|
95
|
+
setFocus(slotKey);
|
|
96
|
+
}
|
|
97
|
+
}, [inputRef, setFocus, mode]);
|
|
98
|
+
const getNextSlotKey = (0, react_1.useMemo)(() => (0, dateFields_1.getNextSlotKeyHandler)(mode), [mode]);
|
|
99
|
+
const getPrevSlotKey = (0, react_1.useMemo)(() => (0, dateFields_1.getPrevSlotKeyHandler)(mode), [mode]);
|
|
100
|
+
const getSlotKeyFromIndex = (0, react_1.useMemo)(() => (0, dateFields_1.getSlotKeyFromIndexHandler)(mode), [mode]);
|
|
101
|
+
return {
|
|
102
|
+
isAllSelected,
|
|
103
|
+
isValidInput,
|
|
104
|
+
tryToCompleteInput,
|
|
105
|
+
getSlot,
|
|
106
|
+
updateSlot,
|
|
107
|
+
setFocus,
|
|
108
|
+
isLikeDate,
|
|
109
|
+
getNextSlotKey,
|
|
110
|
+
getPrevSlotKey,
|
|
111
|
+
getSlotKeyFromIndex
|
|
112
|
+
};
|
|
113
|
+
}
|
package/dist/cjs/hooks/index.js
CHANGED
|
@@ -22,6 +22,7 @@ var __exportStar = void 0 && (void 0).__exportStar || function (m, exports) {
|
|
|
22
22
|
Object.defineProperty(exports, "__esModule", {
|
|
23
23
|
value: true
|
|
24
24
|
});
|
|
25
|
+
__exportStar(require("./dateHandlers"), exports);
|
|
25
26
|
__exportStar(require("./useCopyButton"), exports);
|
|
26
27
|
__exportStar(require("./useHideButton"), exports);
|
|
27
28
|
__exportStar(require("./usePostfix"), exports);
|
|
@@ -26,7 +26,7 @@ function useCopyButton(_ref) {
|
|
|
26
26
|
show: showCopyButton,
|
|
27
27
|
render: props => (0, jsx_runtime_1.jsx)(helperComponents_1.ButtonCopyValue, Object.assign({}, props, {
|
|
28
28
|
size: input_private_1.BUTTON_SIZE_MAP[size],
|
|
29
|
-
valueToCopy: prefix + valueToCopy + postfix,
|
|
29
|
+
valueToCopy: (prefix !== null && prefix !== void 0 ? prefix : '') + valueToCopy + (postfix !== null && postfix !== void 0 ? postfix : ''),
|
|
30
30
|
onValueRequest: onValueRequest,
|
|
31
31
|
disabled: disabled
|
|
32
32
|
}))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { DroplistProps, SelectionSingleState } from '@snack-uikit/list';
|
|
3
3
|
import { ValueOf } from '@snack-uikit/utils';
|
|
4
|
-
import { BUTTON_VARIANT, CONTAINER_VARIANT, VALIDATION_STATE } from '
|
|
4
|
+
import { BUTTON_VARIANT, CONTAINER_VARIANT, VALIDATION_STATE } from '../constants';
|
|
5
5
|
export type ValidationState = ValueOf<typeof VALIDATION_STATE>;
|
|
6
6
|
export type ContainerVariant = ValueOf<typeof CONTAINER_VARIANT>;
|
|
7
7
|
export type ButtonVariant = ValueOf<typeof BUTTON_VARIANT>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ValueOf } from '@snack-uikit/utils';
|
|
2
|
+
import { MODES, NO_SECONDS_MODE, TIME_MODES } from '../constants';
|
|
3
|
+
export type Slot = {
|
|
4
|
+
start: number;
|
|
5
|
+
end: number;
|
|
6
|
+
max: number;
|
|
7
|
+
min: number;
|
|
8
|
+
};
|
|
9
|
+
export type Mode = ValueOf<typeof MODES>;
|
|
10
|
+
export type TimeMode = ValueOf<typeof TIME_MODES>;
|
|
11
|
+
export type NoSecondsMode = typeof NO_SECONDS_MODE;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return m[k];
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
} : function (o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
});
|
|
19
|
+
var __exportStar = void 0 && (void 0).__exportStar || function (m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", {
|
|
23
|
+
value: true
|
|
24
|
+
});
|
|
25
|
+
__exportStar(require("./allFields"), exports);
|
|
26
|
+
__exportStar(require("./dateFields"), exports);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SlotKey } from '../constants';
|
|
2
|
+
import { Mode, NoSecondsMode, TimeMode } from '../types';
|
|
3
|
+
export declare function getSlotKeyFromIndexHandler(mode: Mode | TimeMode | NoSecondsMode): (index: number | null) => SlotKey | undefined;
|
|
4
|
+
export declare function getNextSlotKeyHandler(mode: Mode | TimeMode | NoSecondsMode): (slotKey: SlotKey | undefined) => SlotKey;
|
|
5
|
+
export declare function getPrevSlotKeyHandler(mode: Mode | TimeMode | NoSecondsMode): (slotKey: SlotKey | undefined) => SlotKey;
|
|
6
|
+
/**
|
|
7
|
+
* Преобразует строковое значение поля FieldDate в тип Date
|
|
8
|
+
* @function helper
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseDate(value: string): Date | undefined;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getSlotKeyFromIndexHandler = getSlotKeyFromIndexHandler;
|
|
7
|
+
exports.getNextSlotKeyHandler = getNextSlotKeyHandler;
|
|
8
|
+
exports.getPrevSlotKeyHandler = getPrevSlotKeyHandler;
|
|
9
|
+
exports.parseDate = parseDate;
|
|
10
|
+
const constants_1 = require("../constants");
|
|
11
|
+
function getSlotKeyFromIndexHandler(mode) {
|
|
12
|
+
return index => {
|
|
13
|
+
if (index !== null) {
|
|
14
|
+
for (const key in constants_1.SLOTS[mode]) {
|
|
15
|
+
if (index >= constants_1.SLOTS[mode][key].start && index <= constants_1.SLOTS[mode][key].end) {
|
|
16
|
+
return key;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function getNextSlotKeyHandler(mode) {
|
|
24
|
+
const order = constants_1.SLOT_ORDER[mode];
|
|
25
|
+
return slotKey => {
|
|
26
|
+
const defaultIndex = order.length - 1;
|
|
27
|
+
const defaultSLot = order[defaultIndex];
|
|
28
|
+
const currentIndex = order.indexOf(slotKey);
|
|
29
|
+
return currentIndex === -1 || currentIndex === defaultIndex ? defaultSLot : order[currentIndex + 1];
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function getPrevSlotKeyHandler(mode) {
|
|
33
|
+
const order = constants_1.SLOT_ORDER[mode];
|
|
34
|
+
return slotKey => {
|
|
35
|
+
const defaultIndex = 0;
|
|
36
|
+
const defaultSLot = order[defaultIndex];
|
|
37
|
+
const currentIndex = order.indexOf(slotKey);
|
|
38
|
+
return currentIndex === -1 || currentIndex === defaultIndex ? defaultSLot : order[currentIndex - 1];
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const DATE_STUB = new Date();
|
|
42
|
+
/**
|
|
43
|
+
* Преобразует строковое значение поля FieldDate в тип Date
|
|
44
|
+
* @function helper
|
|
45
|
+
*/
|
|
46
|
+
function parseDate(value) {
|
|
47
|
+
if (!value) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const splittedValue = value.split(', ');
|
|
51
|
+
const date = splittedValue[0];
|
|
52
|
+
let time = splittedValue[1];
|
|
53
|
+
let [day, month, year] = date.split('.').map(Number);
|
|
54
|
+
month -= 1;
|
|
55
|
+
if (date.includes(':')) {
|
|
56
|
+
time = date;
|
|
57
|
+
}
|
|
58
|
+
if (time) {
|
|
59
|
+
if (isNaN(year) || isNaN(month) || isNaN(day)) {
|
|
60
|
+
year = DATE_STUB.getFullYear();
|
|
61
|
+
month = DATE_STUB.getMonth();
|
|
62
|
+
day = DATE_STUB.getDay();
|
|
63
|
+
}
|
|
64
|
+
const [hours = 0, minutes = 0, seconds = 0] = time.split(':').map(str => {
|
|
65
|
+
var _a;
|
|
66
|
+
return (_a = Number(str)) !== null && _a !== void 0 ? _a : 0;
|
|
67
|
+
});
|
|
68
|
+
return new Date(year, month, day, hours, minutes, seconds);
|
|
69
|
+
}
|
|
70
|
+
return new Date(year, month, day);
|
|
71
|
+
}
|
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { CalendarProps } from '@snack-uikit/calendar';
|
|
2
2
|
import { InputPrivateProps } from '@snack-uikit/input-private';
|
|
3
3
|
import { WithSupportProps } from '@snack-uikit/utils';
|
|
4
|
+
import { MODES } from '../../constants';
|
|
5
|
+
import { Mode } from '../../types';
|
|
4
6
|
import { FieldDecoratorProps } from '../FieldDecorator';
|
|
5
|
-
type InputProps = Pick<InputPrivateProps, 'id' | 'name' | '
|
|
7
|
+
type InputProps = Pick<InputPrivateProps, 'id' | 'name' | 'disabled' | 'readonly' | 'onFocus' | 'onBlur'>;
|
|
6
8
|
type WrapperProps = Pick<FieldDecoratorProps, 'className' | 'label' | 'labelTooltip' | 'required' | 'caption' | 'hint' | 'showHintIcon' | 'size' | 'validationState' | 'labelTooltipPlacement' | 'error'>;
|
|
9
|
+
type FieldDateWithSeconds = {
|
|
10
|
+
mode: typeof MODES.DateTime;
|
|
11
|
+
showSeconds?: boolean;
|
|
12
|
+
};
|
|
7
13
|
type FieldDateOwnProps = {
|
|
8
14
|
/** Открыт date-picker */
|
|
9
15
|
open?: boolean;
|
|
10
16
|
/** Колбек открытия пикера */
|
|
11
17
|
onOpenChange?(value: boolean): void;
|
|
18
|
+
/** Значение поля */
|
|
19
|
+
value?: Date;
|
|
12
20
|
/** Колбек смены значения */
|
|
13
|
-
onChange?(value:
|
|
21
|
+
onChange?(value: Date | undefined): void;
|
|
14
22
|
/** Отображение кнопки копирования */
|
|
15
23
|
showCopyButton?: boolean;
|
|
16
24
|
/**
|
|
@@ -18,27 +26,10 @@ type FieldDateOwnProps = {
|
|
|
18
26
|
* @default true
|
|
19
27
|
*/
|
|
20
28
|
showClearButton?: boolean;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
29
|
+
mode: Mode;
|
|
30
|
+
} & Pick<CalendarProps, 'buildCellProps'> & ({
|
|
31
|
+
mode: typeof MODES.Date;
|
|
32
|
+
} | FieldDateWithSeconds);
|
|
24
33
|
export type FieldDateProps = WithSupportProps<FieldDateOwnProps & InputProps & WrapperProps>;
|
|
25
|
-
export declare const FieldDate: import("react").ForwardRefExoticComponent<
|
|
26
|
-
'data-test-id'?: string;
|
|
27
|
-
} & import("react").AriaAttributes & {
|
|
28
|
-
/** Открыт date-picker */
|
|
29
|
-
open?: boolean;
|
|
30
|
-
/** Колбек открытия пикера */
|
|
31
|
-
onOpenChange?(value: boolean): void;
|
|
32
|
-
/** Колбек смены значения */
|
|
33
|
-
onChange?(value: string): void;
|
|
34
|
-
/** Отображение кнопки копирования */
|
|
35
|
-
showCopyButton?: boolean;
|
|
36
|
-
/**
|
|
37
|
-
* Отображение кнопки Очистки поля
|
|
38
|
-
* @default true
|
|
39
|
-
*/
|
|
40
|
-
showClearButton?: boolean;
|
|
41
|
-
/** Текущая локаль календаря */
|
|
42
|
-
locale?: Intl.Locale;
|
|
43
|
-
} & Pick<CalendarProps, "buildCellProps"> & InputProps & WrapperProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
34
|
+
export declare const FieldDate: import("react").ForwardRefExoticComponent<FieldDateProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
44
35
|
export {};
|