@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.
Files changed (150) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +184 -152
  3. package/dist/cjs/components/FieldDate/FieldDate.d.ts +15 -24
  4. package/dist/cjs/components/FieldDate/FieldDate.js +53 -41
  5. package/dist/cjs/components/FieldDate/index.d.ts +0 -1
  6. package/dist/cjs/components/FieldDate/index.js +1 -9
  7. package/dist/cjs/components/FieldSecure/FieldSecure.d.ts +1 -1
  8. package/dist/cjs/components/FieldSelect/hooks.d.ts +2 -2
  9. package/dist/cjs/components/FieldSelect/hooks.js +7 -3
  10. package/dist/cjs/components/FieldSelect/styles.module.css +6 -18
  11. package/dist/cjs/components/FieldSlider/FieldSlider.d.ts +1 -1
  12. package/dist/cjs/components/FieldText/FieldText.d.ts +1 -1
  13. package/dist/cjs/components/FieldTextArea/FieldTextArea.d.ts +1 -1
  14. package/dist/cjs/components/FieldTime/FieldTime.d.ts +30 -0
  15. package/dist/cjs/components/FieldTime/FieldTime.js +298 -0
  16. package/dist/cjs/components/FieldTime/index.d.ts +1 -0
  17. package/dist/cjs/components/{FieldDate/hooks → FieldTime}/index.js +1 -1
  18. package/dist/cjs/components/FieldTime/styles.module.css +27 -0
  19. package/dist/cjs/components/index.d.ts +6 -5
  20. package/dist/cjs/components/index.js +6 -5
  21. package/dist/cjs/constants/dateFields.d.ts +24 -0
  22. package/dist/cjs/constants/dateFields.js +152 -0
  23. package/dist/cjs/constants/index.d.ts +2 -0
  24. package/dist/cjs/constants/index.js +26 -0
  25. package/dist/cjs/hooks/dateHandlers/index.d.ts +3 -0
  26. package/dist/cjs/hooks/dateHandlers/index.js +27 -0
  27. package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.d.ts +13 -5
  28. package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.js +49 -34
  29. package/dist/cjs/hooks/dateHandlers/useDateFieldHelpersForMode.d.ts +18 -0
  30. package/dist/cjs/hooks/dateHandlers/useDateFieldHelpersForMode.js +113 -0
  31. package/dist/cjs/hooks/index.d.ts +1 -0
  32. package/dist/cjs/hooks/index.js +1 -0
  33. package/dist/cjs/hooks/useCopyButton.js +1 -1
  34. package/dist/cjs/{types.d.ts → types/allFields.d.ts} +1 -1
  35. package/dist/cjs/types/dateFields.d.ts +11 -0
  36. package/dist/cjs/types/index.d.ts +2 -0
  37. package/dist/cjs/types/index.js +26 -0
  38. package/dist/cjs/utils/dateFields.d.ts +10 -0
  39. package/dist/cjs/utils/dateFields.js +71 -0
  40. package/dist/esm/components/FieldDate/FieldDate.d.ts +15 -24
  41. package/dist/esm/components/FieldDate/FieldDate.js +39 -31
  42. package/dist/esm/components/FieldDate/index.d.ts +0 -1
  43. package/dist/esm/components/FieldDate/index.js +0 -1
  44. package/dist/esm/components/FieldSecure/FieldSecure.d.ts +1 -1
  45. package/dist/esm/components/FieldSelect/hooks.d.ts +2 -2
  46. package/dist/esm/components/FieldSelect/hooks.js +9 -3
  47. package/dist/esm/components/FieldSelect/styles.module.css +6 -18
  48. package/dist/esm/components/FieldSlider/FieldSlider.d.ts +1 -1
  49. package/dist/esm/components/FieldText/FieldText.d.ts +1 -1
  50. package/dist/esm/components/FieldTextArea/FieldTextArea.d.ts +1 -1
  51. package/dist/esm/components/FieldTime/FieldTime.d.ts +30 -0
  52. package/dist/esm/components/FieldTime/FieldTime.js +161 -0
  53. package/dist/esm/components/FieldTime/index.d.ts +1 -0
  54. package/dist/esm/components/FieldTime/index.js +1 -0
  55. package/dist/esm/components/FieldTime/styles.module.css +27 -0
  56. package/dist/esm/components/index.d.ts +6 -5
  57. package/dist/esm/components/index.js +6 -5
  58. package/dist/esm/constants/dateFields.d.ts +24 -0
  59. package/dist/esm/constants/dateFields.js +103 -0
  60. package/dist/esm/constants/index.d.ts +2 -0
  61. package/dist/esm/constants/index.js +2 -0
  62. package/dist/esm/hooks/dateHandlers/index.d.ts +3 -0
  63. package/dist/esm/hooks/dateHandlers/index.js +3 -0
  64. package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.d.ts +13 -5
  65. package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.js +48 -35
  66. package/dist/esm/hooks/dateHandlers/useDateFieldHelpersForMode.d.ts +18 -0
  67. package/dist/esm/hooks/dateHandlers/useDateFieldHelpersForMode.js +95 -0
  68. package/dist/esm/hooks/index.d.ts +1 -0
  69. package/dist/esm/hooks/index.js +1 -0
  70. package/dist/esm/hooks/useCopyButton.js +1 -1
  71. package/dist/esm/{types.d.ts → types/allFields.d.ts} +1 -1
  72. package/dist/esm/types/dateFields.d.ts +11 -0
  73. package/dist/esm/types/index.d.ts +2 -0
  74. package/dist/esm/types/index.js +2 -0
  75. package/dist/esm/utils/dateFields.d.ts +10 -0
  76. package/dist/esm/utils/dateFields.js +59 -0
  77. package/package.json +16 -16
  78. package/src/components/FieldColor/styles.module.scss +9 -10
  79. package/src/components/FieldDate/FieldDate.tsx +72 -52
  80. package/src/components/FieldDate/index.ts +0 -1
  81. package/src/components/FieldDate/styles.module.scss +10 -11
  82. package/src/components/FieldDecorator/styles.module.scss +44 -45
  83. package/src/components/FieldSelect/hooks.ts +15 -3
  84. package/src/components/FieldSelect/styles.module.scss +20 -20
  85. package/src/components/FieldSlider/styles.module.scss +4 -4
  86. package/src/components/FieldTextArea/styles.module.scss +18 -18
  87. package/src/components/FieldTime/FieldTime.tsx +350 -0
  88. package/src/components/FieldTime/index.ts +1 -0
  89. package/src/components/FieldTime/styles.module.scss +41 -0
  90. package/src/components/index.ts +6 -5
  91. package/src/constants/dateFields.ts +127 -0
  92. package/src/constants/index.ts +2 -0
  93. package/src/helperComponents/ButtonCopyValue/styles.module.scss +2 -2
  94. package/src/helperComponents/ButtonField/styles.module.scss +9 -9
  95. package/src/helperComponents/ButtonFieldList/styles.module.scss +2 -2
  96. package/src/helperComponents/ButtonHideValue/styles.module.scss +2 -2
  97. package/src/helperComponents/FieldContainerPrivate/styles.module.scss +24 -26
  98. package/src/helperComponents/TextArea/styles.module.scss +5 -5
  99. package/src/hooks/dateHandlers/index.ts +3 -0
  100. package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.ts +93 -47
  101. package/src/hooks/dateHandlers/useDateFieldHelpersForMode.ts +145 -0
  102. package/src/hooks/index.ts +1 -0
  103. package/src/hooks/styles.module.scss +5 -5
  104. package/src/hooks/useCopyButton.tsx +1 -1
  105. package/src/styles.module.scss +15 -15
  106. package/src/{types.ts → types/allFields.ts} +1 -1
  107. package/src/types/dateFields.ts +14 -0
  108. package/src/types/index.ts +2 -0
  109. package/src/utils/dateFields.ts +75 -0
  110. package/dist/cjs/components/FieldDate/constants.d.ts +0 -10
  111. package/dist/cjs/components/FieldDate/constants.js +0 -49
  112. package/dist/cjs/components/FieldDate/hooks/index.d.ts +0 -1
  113. package/dist/cjs/components/FieldDate/hooks/useDateFieldHelpers.d.ts +0 -10
  114. package/dist/cjs/components/FieldDate/hooks/useDateFieldHelpers.js +0 -82
  115. package/dist/cjs/components/FieldDate/types.d.ts +0 -6
  116. package/dist/cjs/components/FieldDate/utils.d.ts +0 -9
  117. package/dist/cjs/components/FieldDate/utils.js +0 -56
  118. package/dist/esm/components/FieldDate/constants.d.ts +0 -10
  119. package/dist/esm/components/FieldDate/constants.js +0 -28
  120. package/dist/esm/components/FieldDate/hooks/index.d.ts +0 -1
  121. package/dist/esm/components/FieldDate/hooks/index.js +0 -1
  122. package/dist/esm/components/FieldDate/hooks/useDateFieldHelpers.d.ts +0 -10
  123. package/dist/esm/components/FieldDate/hooks/useDateFieldHelpers.js +0 -66
  124. package/dist/esm/components/FieldDate/types.d.ts +0 -6
  125. package/dist/esm/components/FieldDate/utils.d.ts +0 -9
  126. package/dist/esm/components/FieldDate/utils.js +0 -43
  127. package/src/components/FieldDate/constants.ts +0 -33
  128. package/src/components/FieldDate/hooks/index.ts +0 -1
  129. package/src/components/FieldDate/hooks/useDateFieldHelpers.ts +0 -96
  130. package/src/components/FieldDate/types.ts +0 -6
  131. package/src/components/FieldDate/utils.ts +0 -49
  132. /package/dist/cjs/{constants.d.ts → constants/allFields.d.ts} +0 -0
  133. /package/dist/cjs/{constants.js → constants/allFields.js} +0 -0
  134. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.d.ts +0 -0
  135. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.js +0 -0
  136. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.d.ts +0 -0
  137. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.js +0 -0
  138. /package/dist/cjs/{components/FieldDate/types.js → types/allFields.js} +0 -0
  139. /package/dist/cjs/{types.js → types/dateFields.js} +0 -0
  140. /package/dist/esm/{constants.d.ts → constants/allFields.d.ts} +0 -0
  141. /package/dist/esm/{constants.js → constants/allFields.js} +0 -0
  142. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.d.ts +0 -0
  143. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.js +0 -0
  144. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.d.ts +0 -0
  145. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.js +0 -0
  146. /package/dist/esm/{components/FieldDate/types.js → types/allFields.js} +0 -0
  147. /package/dist/esm/{types.js → types/dateFields.js} +0 -0
  148. /package/src/{constants.ts → constants/allFields.ts} +0 -0
  149. /package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.ts +0 -0
  150. /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("../constants");
10
- const utils_2 = require("../utils");
11
- const useDateFieldHelpers_1 = require("./useDateFieldHelpers");
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
- isValidInput,
28
- tryToCompleteInput
29
- } = (0, useDateFieldHelpers_1.useDateFieldHelpers)(inputRef);
30
- const focusSlotRef = (0, react_1.useRef)(constants_1.SlotKey.Day);
31
- const mask = (0, react_1.useMemo)(() => constants_1.MASK[locale.baseName] || constants_1.MASK[constants_1.DEFAULT_LOCALE.baseName], [locale]);
32
- const slotsPlaceHolder = (0, react_1.useMemo)(() => constants_1.SLOTS_PLACEHOLDER[locale.baseName] || constants_1.SLOTS_PLACEHOLDER[constants_1.DEFAULT_LOCALE.baseName], [locale.baseName]);
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 || constants_1.SlotKey.Day;
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 === constants_1.SlotKey.Day) {
55
+ if (isLikeDate() && focusSlotValue === focusSlotKey) {
44
56
  return;
45
57
  }
46
58
  if (!inputRef.current.value) {
47
59
  inputRef.current.value = mask;
48
- setFocus(constants_1.SlotKey.Day);
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 = (0, utils_2.getSlotKey)(inputRef.current.selectionStart);
67
+ const slotKey = getSlotKeyFromIndex(inputRef.current.selectionStart);
56
68
  if (slotKey) {
57
69
  const {
58
70
  start,
59
71
  end
60
- } = constants_1.SLOTS[slotKey];
72
+ } = slotsInfo[slotKey];
61
73
  inputRef.current.setSelectionRange(start, end);
62
74
  }
63
- }, [inputRef, isLikeDate, mask, readonly, setFocus]);
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
- if (slotKey === constants_1.SlotKey.Year && tryToCompleteInput()) {
84
+ var _a, _b;
85
+ if (slotKey === slotOrder[slotOrder.length - 1] && tryToCompleteInput()) {
73
86
  return;
74
87
  }
75
88
  if (isValidInput()) {
76
- setFocus((0, utils_2.getNextSlotKey)(slotKey));
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, slotsPlaceHolder[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, slotsPlaceHolder[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((0, utils_2.getNextSlotKey)(slotKey));
103
+ setFocus(getNextSlotKey(slotKey));
91
104
  }
92
- }, [tryToCompleteInput, isValidInput, setFocus, slotsPlaceHolder, updateSlot]);
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 = (0, utils_2.getSlotKey)(clickIndex);
124
+ const slotKey = getSlotKeyFromIndex(clickIndex);
111
125
  if (slotKey) {
112
126
  const value = getSlot(slotKey);
113
127
  const {
114
128
  max
115
- } = constants_1.SLOTS[slotKey];
129
+ } = slotsInfo[slotKey];
116
130
  const numberValue = Number(value) || 0;
117
131
  if (e.key === 'ArrowRight') {
118
- if (isAllSelected() || slotKey === constants_1.SlotKey.Year) {
132
+ if (isAllSelected() || slotKey === slotOrder[slotOrder.length - 1]) {
119
133
  inputRef.current.selectionStart = inputRef.current.value.length;
120
134
  return;
121
135
  }
122
- setFocus((0, utils_2.getNextSlotKey)(slotKey));
136
+ setFocus(getNextSlotKey(slotKey));
123
137
  return;
124
138
  }
125
139
  if (e.key === 'ArrowLeft') {
126
- setFocus((0, utils_2.getPrevSlotKey)(slotKey));
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(constants_1.SlotKey.Day);
146
+ setFocus(focusSlotKey);
133
147
  } else {
134
- updateSlot(slotKey, slotsPlaceHolder[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
- onChange === null || onChange === void 0 ? void 0 : onChange(isLikeDate() ? inputRef.current.value : '');
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
- }, [checkInputAndGoNext, getSlot, inputRef, isAllSelected, isLikeDate, mask, onChange, readonly, setFocus, setIsOpen, slotsPlaceHolder, tryToCompleteInput, updateSlot]);
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 = constants_1.SlotKey.Day;
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
+ }
@@ -1,3 +1,4 @@
1
+ export * from './dateHandlers';
1
2
  export * from './useCopyButton';
2
3
  export * from './useHideButton';
3
4
  export * from './usePostfix';
@@ -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 './constants';
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,2 @@
1
+ export * from './allFields';
2
+ export * from './dateFields';
@@ -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' | 'value' | 'disabled' | 'readonly' | 'onFocus' | 'onBlur'>;
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: string): void;
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
- locale?: Intl.Locale;
23
- } & Pick<CalendarProps, 'buildCellProps'>;
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 {};