@snack-uikit/fields 0.31.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 (134) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +179 -147
  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/FieldSlider/FieldSlider.d.ts +1 -1
  11. package/dist/cjs/components/FieldText/FieldText.d.ts +1 -1
  12. package/dist/cjs/components/FieldTextArea/FieldTextArea.d.ts +1 -1
  13. package/dist/cjs/components/FieldTime/FieldTime.d.ts +30 -0
  14. package/dist/cjs/components/FieldTime/FieldTime.js +298 -0
  15. package/dist/cjs/components/FieldTime/index.d.ts +1 -0
  16. package/dist/cjs/components/{FieldDate/hooks → FieldTime}/index.js +1 -1
  17. package/dist/cjs/components/FieldTime/styles.module.css +27 -0
  18. package/dist/cjs/components/index.d.ts +6 -5
  19. package/dist/cjs/components/index.js +6 -5
  20. package/dist/cjs/constants/dateFields.d.ts +24 -0
  21. package/dist/cjs/constants/dateFields.js +152 -0
  22. package/dist/cjs/constants/index.d.ts +2 -0
  23. package/dist/cjs/constants/index.js +26 -0
  24. package/dist/cjs/hooks/dateHandlers/index.d.ts +3 -0
  25. package/dist/cjs/hooks/dateHandlers/index.js +27 -0
  26. package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.d.ts +13 -5
  27. package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.js +49 -34
  28. package/dist/cjs/hooks/dateHandlers/useDateFieldHelpersForMode.d.ts +18 -0
  29. package/dist/cjs/hooks/dateHandlers/useDateFieldHelpersForMode.js +113 -0
  30. package/dist/cjs/hooks/index.d.ts +1 -0
  31. package/dist/cjs/hooks/index.js +1 -0
  32. package/dist/cjs/hooks/useCopyButton.js +1 -1
  33. package/dist/cjs/{types.d.ts → types/allFields.d.ts} +1 -1
  34. package/dist/cjs/types/dateFields.d.ts +11 -0
  35. package/dist/cjs/types/index.d.ts +2 -0
  36. package/dist/cjs/types/index.js +26 -0
  37. package/dist/cjs/utils/dateFields.d.ts +10 -0
  38. package/dist/cjs/utils/dateFields.js +71 -0
  39. package/dist/esm/components/FieldDate/FieldDate.d.ts +15 -24
  40. package/dist/esm/components/FieldDate/FieldDate.js +39 -31
  41. package/dist/esm/components/FieldDate/index.d.ts +0 -1
  42. package/dist/esm/components/FieldDate/index.js +0 -1
  43. package/dist/esm/components/FieldSecure/FieldSecure.d.ts +1 -1
  44. package/dist/esm/components/FieldSelect/hooks.d.ts +2 -2
  45. package/dist/esm/components/FieldSelect/hooks.js +9 -3
  46. package/dist/esm/components/FieldSlider/FieldSlider.d.ts +1 -1
  47. package/dist/esm/components/FieldText/FieldText.d.ts +1 -1
  48. package/dist/esm/components/FieldTextArea/FieldTextArea.d.ts +1 -1
  49. package/dist/esm/components/FieldTime/FieldTime.d.ts +30 -0
  50. package/dist/esm/components/FieldTime/FieldTime.js +161 -0
  51. package/dist/esm/components/FieldTime/index.d.ts +1 -0
  52. package/dist/esm/components/FieldTime/index.js +1 -0
  53. package/dist/esm/components/FieldTime/styles.module.css +27 -0
  54. package/dist/esm/components/index.d.ts +6 -5
  55. package/dist/esm/components/index.js +6 -5
  56. package/dist/esm/constants/dateFields.d.ts +24 -0
  57. package/dist/esm/constants/dateFields.js +103 -0
  58. package/dist/esm/constants/index.d.ts +2 -0
  59. package/dist/esm/constants/index.js +2 -0
  60. package/dist/esm/hooks/dateHandlers/index.d.ts +3 -0
  61. package/dist/esm/hooks/dateHandlers/index.js +3 -0
  62. package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.d.ts +13 -5
  63. package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.js +48 -35
  64. package/dist/esm/hooks/dateHandlers/useDateFieldHelpersForMode.d.ts +18 -0
  65. package/dist/esm/hooks/dateHandlers/useDateFieldHelpersForMode.js +95 -0
  66. package/dist/esm/hooks/index.d.ts +1 -0
  67. package/dist/esm/hooks/index.js +1 -0
  68. package/dist/esm/hooks/useCopyButton.js +1 -1
  69. package/dist/esm/{types.d.ts → types/allFields.d.ts} +1 -1
  70. package/dist/esm/types/dateFields.d.ts +11 -0
  71. package/dist/esm/types/index.d.ts +2 -0
  72. package/dist/esm/types/index.js +2 -0
  73. package/dist/esm/utils/dateFields.d.ts +10 -0
  74. package/dist/esm/utils/dateFields.js +59 -0
  75. package/package.json +10 -10
  76. package/src/components/FieldDate/FieldDate.tsx +72 -52
  77. package/src/components/FieldDate/index.ts +0 -1
  78. package/src/components/FieldSelect/hooks.ts +15 -3
  79. package/src/components/FieldTime/FieldTime.tsx +350 -0
  80. package/src/components/FieldTime/index.ts +1 -0
  81. package/src/components/FieldTime/styles.module.scss +41 -0
  82. package/src/components/index.ts +6 -5
  83. package/src/constants/dateFields.ts +127 -0
  84. package/src/constants/index.ts +2 -0
  85. package/src/hooks/dateHandlers/index.ts +3 -0
  86. package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useDateField.ts +93 -47
  87. package/src/hooks/dateHandlers/useDateFieldHelpersForMode.ts +145 -0
  88. package/src/hooks/index.ts +1 -0
  89. package/src/hooks/useCopyButton.tsx +1 -1
  90. package/src/{types.ts → types/allFields.ts} +1 -1
  91. package/src/types/dateFields.ts +14 -0
  92. package/src/types/index.ts +2 -0
  93. package/src/utils/dateFields.ts +75 -0
  94. package/dist/cjs/components/FieldDate/constants.d.ts +0 -10
  95. package/dist/cjs/components/FieldDate/constants.js +0 -49
  96. package/dist/cjs/components/FieldDate/hooks/index.d.ts +0 -1
  97. package/dist/cjs/components/FieldDate/hooks/useDateFieldHelpers.d.ts +0 -10
  98. package/dist/cjs/components/FieldDate/hooks/useDateFieldHelpers.js +0 -82
  99. package/dist/cjs/components/FieldDate/types.d.ts +0 -6
  100. package/dist/cjs/components/FieldDate/utils.d.ts +0 -9
  101. package/dist/cjs/components/FieldDate/utils.js +0 -56
  102. package/dist/esm/components/FieldDate/constants.d.ts +0 -10
  103. package/dist/esm/components/FieldDate/constants.js +0 -28
  104. package/dist/esm/components/FieldDate/hooks/index.d.ts +0 -1
  105. package/dist/esm/components/FieldDate/hooks/index.js +0 -1
  106. package/dist/esm/components/FieldDate/hooks/useDateFieldHelpers.d.ts +0 -10
  107. package/dist/esm/components/FieldDate/hooks/useDateFieldHelpers.js +0 -66
  108. package/dist/esm/components/FieldDate/types.d.ts +0 -6
  109. package/dist/esm/components/FieldDate/utils.d.ts +0 -9
  110. package/dist/esm/components/FieldDate/utils.js +0 -43
  111. package/src/components/FieldDate/constants.ts +0 -33
  112. package/src/components/FieldDate/hooks/index.ts +0 -1
  113. package/src/components/FieldDate/hooks/useDateFieldHelpers.ts +0 -96
  114. package/src/components/FieldDate/types.ts +0 -6
  115. package/src/components/FieldDate/utils.ts +0 -49
  116. /package/dist/cjs/{constants.d.ts → constants/allFields.d.ts} +0 -0
  117. /package/dist/cjs/{constants.js → constants/allFields.js} +0 -0
  118. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.d.ts +0 -0
  119. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.js +0 -0
  120. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.d.ts +0 -0
  121. /package/dist/cjs/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.js +0 -0
  122. /package/dist/cjs/{components/FieldDate/types.js → types/allFields.js} +0 -0
  123. /package/dist/cjs/{types.js → types/dateFields.js} +0 -0
  124. /package/dist/esm/{constants.d.ts → constants/allFields.d.ts} +0 -0
  125. /package/dist/esm/{constants.js → constants/allFields.js} +0 -0
  126. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.d.ts +0 -0
  127. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.js +0 -0
  128. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.d.ts +0 -0
  129. /package/dist/esm/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.js +0 -0
  130. /package/dist/esm/{components/FieldDate/types.js → types/allFields.js} +0 -0
  131. /package/dist/esm/{types.js → types/dateFields.js} +0 -0
  132. /package/src/{constants.ts → constants/allFields.ts} +0 -0
  133. /package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useFocusHandlers.ts +0 -0
  134. /package/src/{components/FieldDate/hooks → hooks/dateHandlers}/useHandlers.ts +0 -0
@@ -0,0 +1,75 @@
1
+ import { SLOT_ORDER, SlotKey, SLOTS } from '../constants';
2
+ import { Mode, NoSecondsMode, TimeMode } from '../types';
3
+
4
+ export function getSlotKeyFromIndexHandler(mode: Mode | TimeMode | NoSecondsMode) {
5
+ return (index: number | null): SlotKey | undefined => {
6
+ if (index !== null) {
7
+ for (const key in SLOTS[mode]) {
8
+ if (index >= SLOTS[mode][key].start && index <= SLOTS[mode][key].end) {
9
+ return key as SlotKey;
10
+ }
11
+ }
12
+ }
13
+
14
+ return undefined;
15
+ };
16
+ }
17
+
18
+ export function getNextSlotKeyHandler(mode: Mode | TimeMode | NoSecondsMode) {
19
+ const order = SLOT_ORDER[mode];
20
+
21
+ return (slotKey: SlotKey | undefined) => {
22
+ const defaultIndex = order.length - 1;
23
+ const defaultSLot = order[defaultIndex];
24
+ const currentIndex = order.indexOf(slotKey as SlotKey);
25
+ return currentIndex === -1 || currentIndex === defaultIndex ? defaultSLot : order[currentIndex + 1];
26
+ };
27
+ }
28
+
29
+ export function getPrevSlotKeyHandler(mode: Mode | TimeMode | NoSecondsMode) {
30
+ const order = SLOT_ORDER[mode];
31
+
32
+ return (slotKey: SlotKey | undefined) => {
33
+ const defaultIndex = 0;
34
+ const defaultSLot = order[defaultIndex];
35
+ const currentIndex = order.indexOf(slotKey as SlotKey);
36
+ return currentIndex === -1 || currentIndex === defaultIndex ? defaultSLot : order[currentIndex - 1];
37
+ };
38
+ }
39
+
40
+ const DATE_STUB = new Date();
41
+
42
+ /**
43
+ * Преобразует строковое значение поля FieldDate в тип Date
44
+ * @function helper
45
+ */
46
+ export function parseDate(value: string) {
47
+ if (!value) {
48
+ return undefined;
49
+ }
50
+
51
+ const splittedValue = value.split(', ');
52
+ const date = splittedValue[0];
53
+ let time = splittedValue[1];
54
+
55
+ let [day, month, year] = date.split('.').map(Number);
56
+ month -= 1;
57
+
58
+ if (date.includes(':')) {
59
+ time = date;
60
+ }
61
+
62
+ if (time) {
63
+ if (isNaN(year) || isNaN(month) || isNaN(day)) {
64
+ year = DATE_STUB.getFullYear();
65
+ month = DATE_STUB.getMonth();
66
+ day = DATE_STUB.getDay();
67
+ }
68
+
69
+ const [hours = 0, minutes = 0, seconds = 0] = time.split(':').map(str => Number(str) ?? 0);
70
+
71
+ return new Date(year, month, day, hours, minutes, seconds);
72
+ }
73
+
74
+ return new Date(year, month, day);
75
+ }
@@ -1,10 +0,0 @@
1
- import { Slot } from './types';
2
- export declare enum SlotKey {
3
- Day = "D",
4
- Month = "M",
5
- Year = "Y"
6
- }
7
- export declare const MASK: Record<string, string>;
8
- export declare const DEFAULT_LOCALE: Intl.Locale;
9
- export declare const SLOTS: Record<SlotKey | string, Slot>;
10
- export declare const SLOTS_PLACEHOLDER: Record<string, Record<string, string>>;
@@ -1,49 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.SLOTS_PLACEHOLDER = exports.SLOTS = exports.DEFAULT_LOCALE = exports.MASK = exports.SlotKey = void 0;
7
- var SlotKey;
8
- (function (SlotKey) {
9
- SlotKey["Day"] = "D";
10
- SlotKey["Month"] = "M";
11
- SlotKey["Year"] = "Y";
12
- })(SlotKey || (exports.SlotKey = SlotKey = {}));
13
- exports.MASK = {
14
- 'ru-RU': 'ДД.ММ.ГГГГ',
15
- 'en-US': 'DD.MM.YYYY'
16
- };
17
- exports.DEFAULT_LOCALE = new Intl.Locale('ru-RU');
18
- exports.SLOTS = {
19
- [SlotKey.Day]: {
20
- start: 0,
21
- end: 2,
22
- max: 31,
23
- min: 1
24
- },
25
- [SlotKey.Month]: {
26
- start: 3,
27
- end: 5,
28
- max: 12,
29
- min: 1
30
- },
31
- [SlotKey.Year]: {
32
- start: 6,
33
- end: 10,
34
- max: 2100,
35
- min: 1900
36
- }
37
- };
38
- exports.SLOTS_PLACEHOLDER = {
39
- 'ru-RU': {
40
- [SlotKey.Day]: 'ДД',
41
- [SlotKey.Month]: 'ММ',
42
- [SlotKey.Year]: 'ГГГГ'
43
- },
44
- 'en-US': {
45
- [SlotKey.Day]: 'DD',
46
- [SlotKey.Month]: 'MM',
47
- [SlotKey.Year]: 'YYYY'
48
- }
49
- };
@@ -1 +0,0 @@
1
- export * from './useDateField';
@@ -1,10 +0,0 @@
1
- import { RefObject } from 'react';
2
- export declare function useDateFieldHelpers(inputRef: RefObject<HTMLInputElement>): {
3
- isAllSelected: () => boolean;
4
- isValidInput: () => boolean;
5
- tryToCompleteInput: () => boolean;
6
- getSlot: (slotKey: string) => string;
7
- updateSlot: (slotKey: string, slotValue: number | string) => void;
8
- setFocus: (slotKey: string) => void;
9
- isLikeDate: () => boolean;
10
- };
@@ -1,82 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useDateFieldHelpers = useDateFieldHelpers;
7
- const react_1 = require("react");
8
- const constants_1 = require("../constants");
9
- function useDateFieldHelpers(inputRef) {
10
- const setFocus = (0, react_1.useCallback)(slotKey => {
11
- if (inputRef.current) {
12
- const {
13
- start,
14
- end
15
- } = constants_1.SLOTS[slotKey];
16
- inputRef.current.setSelectionRange(start, end);
17
- }
18
- }, [inputRef]);
19
- const isAllSelected = (0, react_1.useCallback)(() => {
20
- var _a, _b, _c;
21
- 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;
22
- }, [inputRef]);
23
- const getSlot = (0, react_1.useCallback)(slotKey => {
24
- if (inputRef.current) {
25
- return inputRef.current.value.slice(constants_1.SLOTS[slotKey].start, constants_1.SLOTS[slotKey].end);
26
- }
27
- return '';
28
- }, [inputRef]);
29
- const isLikeDate = (0, react_1.useCallback)(() => {
30
- if (inputRef.current) {
31
- return Object.keys(constants_1.SLOTS).every(slotKey => getSlot(slotKey) && Number.isInteger(Number(getSlot(slotKey))));
32
- }
33
- return false;
34
- }, [getSlot, inputRef]);
35
- const isValidInput = (0, react_1.useCallback)(() => {
36
- const day = parseInt(getSlot(constants_1.SlotKey.Day), 10);
37
- const month = parseInt(getSlot(constants_1.SlotKey.Month), 10);
38
- const year = parseInt(getSlot(constants_1.SlotKey.Year), 10);
39
- if (!month || !day) {
40
- return true;
41
- }
42
- const date = new Date(year || /* високосный год = */2020, month - 1, day);
43
- return date.getDate() === day;
44
- }, [getSlot]);
45
- const tryToCompleteInput = (0, react_1.useCallback)(() => {
46
- var _a;
47
- const day = parseInt(getSlot(constants_1.SlotKey.Day), 10);
48
- const month = parseInt(getSlot(constants_1.SlotKey.Month), 10);
49
- const year = parseInt(getSlot(constants_1.SlotKey.Year), 10);
50
- const {
51
- min,
52
- max
53
- } = constants_1.SLOTS[constants_1.SlotKey.Year];
54
- const isCompleted = Boolean(day && month && year >= min && year <= max);
55
- if (isCompleted && inputRef.current) {
56
- const lastPosition = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.value.length;
57
- inputRef.current.selectionStart = lastPosition;
58
- inputRef.current.selectionEnd = lastPosition;
59
- }
60
- return isCompleted;
61
- }, [getSlot, inputRef]);
62
- const updateSlot = (0, react_1.useCallback)((slotKey, slotValue) => {
63
- if (inputRef.current) {
64
- const {
65
- start,
66
- end,
67
- max
68
- } = constants_1.SLOTS[slotKey];
69
- inputRef.current.value = inputRef.current.value.slice(0, start) + slotValue.toString().padStart(max.toString().length, '0') + inputRef.current.value.slice(end);
70
- setFocus(slotKey);
71
- }
72
- }, [inputRef, setFocus]);
73
- return {
74
- isAllSelected,
75
- isValidInput,
76
- tryToCompleteInput,
77
- getSlot,
78
- updateSlot,
79
- setFocus,
80
- isLikeDate
81
- };
82
- }
@@ -1,6 +0,0 @@
1
- export type Slot = {
2
- start: number;
3
- end: number;
4
- max: number;
5
- min: number;
6
- };
@@ -1,9 +0,0 @@
1
- import { SlotKey } from './constants';
2
- export declare function getSlotKey(index: number | null): string | null;
3
- export declare function getNextSlotKey(slotKey: string | null): SlotKey.Month | SlotKey.Year;
4
- export declare function getPrevSlotKey(slotKey: string | null): SlotKey.Day | SlotKey.Month;
5
- /**
6
- * Преобразует строковое значение поля FieldDate в тип Date
7
- * @function helper
8
- */
9
- export declare function parseDate(date: string): Date;
@@ -1,56 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getSlotKey = getSlotKey;
7
- exports.getNextSlotKey = getNextSlotKey;
8
- exports.getPrevSlotKey = getPrevSlotKey;
9
- exports.parseDate = parseDate;
10
- const constants_1 = require("./constants");
11
- function getSlotKey(index) {
12
- if (index !== null) {
13
- for (const key in constants_1.SLOTS) {
14
- if (index >= constants_1.SLOTS[key].start && index <= constants_1.SLOTS[key].end) {
15
- return key;
16
- }
17
- }
18
- }
19
- return null;
20
- }
21
- function getNextSlotKey(slotKey) {
22
- switch (slotKey) {
23
- case constants_1.SlotKey.Day:
24
- {
25
- return constants_1.SlotKey.Month;
26
- }
27
- case constants_1.SlotKey.Month:
28
- case constants_1.SlotKey.Year:
29
- default:
30
- {
31
- return constants_1.SlotKey.Year;
32
- }
33
- }
34
- }
35
- function getPrevSlotKey(slotKey) {
36
- switch (slotKey) {
37
- case constants_1.SlotKey.Year:
38
- {
39
- return constants_1.SlotKey.Month;
40
- }
41
- case constants_1.SlotKey.Month:
42
- case constants_1.SlotKey.Day:
43
- default:
44
- {
45
- return constants_1.SlotKey.Day;
46
- }
47
- }
48
- }
49
- /**
50
- * Преобразует строковое значение поля FieldDate в тип Date
51
- * @function helper
52
- */
53
- function parseDate(date) {
54
- const values = date.split('.');
55
- return new Date(Number(values[2]), Number(values[1]) - 1, Number(values[0]));
56
- }
@@ -1,10 +0,0 @@
1
- import { Slot } from './types';
2
- export declare enum SlotKey {
3
- Day = "D",
4
- Month = "M",
5
- Year = "Y"
6
- }
7
- export declare const MASK: Record<string, string>;
8
- export declare const DEFAULT_LOCALE: Intl.Locale;
9
- export declare const SLOTS: Record<SlotKey | string, Slot>;
10
- export declare const SLOTS_PLACEHOLDER: Record<string, Record<string, string>>;
@@ -1,28 +0,0 @@
1
- export var SlotKey;
2
- (function (SlotKey) {
3
- SlotKey["Day"] = "D";
4
- SlotKey["Month"] = "M";
5
- SlotKey["Year"] = "Y";
6
- })(SlotKey || (SlotKey = {}));
7
- export const MASK = {
8
- 'ru-RU': 'ДД.ММ.ГГГГ',
9
- 'en-US': 'DD.MM.YYYY',
10
- };
11
- export const DEFAULT_LOCALE = new Intl.Locale('ru-RU');
12
- export const SLOTS = {
13
- [SlotKey.Day]: { start: 0, end: 2, max: 31, min: 1 },
14
- [SlotKey.Month]: { start: 3, end: 5, max: 12, min: 1 },
15
- [SlotKey.Year]: { start: 6, end: 10, max: 2100, min: 1900 },
16
- };
17
- export const SLOTS_PLACEHOLDER = {
18
- 'ru-RU': {
19
- [SlotKey.Day]: 'ДД',
20
- [SlotKey.Month]: 'ММ',
21
- [SlotKey.Year]: 'ГГГГ',
22
- },
23
- 'en-US': {
24
- [SlotKey.Day]: 'DD',
25
- [SlotKey.Month]: 'MM',
26
- [SlotKey.Year]: 'YYYY',
27
- },
28
- };
@@ -1 +0,0 @@
1
- export * from './useDateField';
@@ -1 +0,0 @@
1
- export * from './useDateField';
@@ -1,10 +0,0 @@
1
- import { RefObject } from 'react';
2
- export declare function useDateFieldHelpers(inputRef: RefObject<HTMLInputElement>): {
3
- isAllSelected: () => boolean;
4
- isValidInput: () => boolean;
5
- tryToCompleteInput: () => boolean;
6
- getSlot: (slotKey: string) => string;
7
- updateSlot: (slotKey: string, slotValue: number | string) => void;
8
- setFocus: (slotKey: string) => void;
9
- isLikeDate: () => boolean;
10
- };
@@ -1,66 +0,0 @@
1
- import { useCallback } from 'react';
2
- import { SlotKey, SLOTS } from '../constants';
3
- export function useDateFieldHelpers(inputRef) {
4
- const setFocus = useCallback((slotKey) => {
5
- if (inputRef.current) {
6
- const { start, end } = SLOTS[slotKey];
7
- inputRef.current.setSelectionRange(start, end);
8
- }
9
- }, [inputRef]);
10
- const isAllSelected = useCallback(() => { var _a, _b, _c; 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; }, [inputRef]);
11
- const getSlot = useCallback((slotKey) => {
12
- if (inputRef.current) {
13
- return inputRef.current.value.slice(SLOTS[slotKey].start, SLOTS[slotKey].end);
14
- }
15
- return '';
16
- }, [inputRef]);
17
- const isLikeDate = useCallback(() => {
18
- if (inputRef.current) {
19
- return Object.keys(SLOTS).every(slotKey => getSlot(slotKey) && Number.isInteger(Number(getSlot(slotKey))));
20
- }
21
- return false;
22
- }, [getSlot, inputRef]);
23
- const isValidInput = useCallback(() => {
24
- const day = parseInt(getSlot(SlotKey.Day), 10);
25
- const month = parseInt(getSlot(SlotKey.Month), 10);
26
- const year = parseInt(getSlot(SlotKey.Year), 10);
27
- if (!month || !day) {
28
- return true;
29
- }
30
- const date = new Date(year || /* високосный год = */ 2020, month - 1, day);
31
- return date.getDate() === day;
32
- }, [getSlot]);
33
- const tryToCompleteInput = useCallback(() => {
34
- var _a;
35
- const day = parseInt(getSlot(SlotKey.Day), 10);
36
- const month = parseInt(getSlot(SlotKey.Month), 10);
37
- const year = parseInt(getSlot(SlotKey.Year), 10);
38
- const { min, max } = SLOTS[SlotKey.Year];
39
- const isCompleted = Boolean(day && month && year >= min && year <= max);
40
- if (isCompleted && inputRef.current) {
41
- const lastPosition = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.value.length;
42
- inputRef.current.selectionStart = lastPosition;
43
- inputRef.current.selectionEnd = lastPosition;
44
- }
45
- return isCompleted;
46
- }, [getSlot, inputRef]);
47
- const updateSlot = useCallback((slotKey, slotValue) => {
48
- if (inputRef.current) {
49
- const { start, end, max } = SLOTS[slotKey];
50
- inputRef.current.value =
51
- inputRef.current.value.slice(0, start) +
52
- slotValue.toString().padStart(max.toString().length, '0') +
53
- inputRef.current.value.slice(end);
54
- setFocus(slotKey);
55
- }
56
- }, [inputRef, setFocus]);
57
- return {
58
- isAllSelected,
59
- isValidInput,
60
- tryToCompleteInput,
61
- getSlot,
62
- updateSlot,
63
- setFocus,
64
- isLikeDate,
65
- };
66
- }
@@ -1,6 +0,0 @@
1
- export type Slot = {
2
- start: number;
3
- end: number;
4
- max: number;
5
- min: number;
6
- };
@@ -1,9 +0,0 @@
1
- import { SlotKey } from './constants';
2
- export declare function getSlotKey(index: number | null): string | null;
3
- export declare function getNextSlotKey(slotKey: string | null): SlotKey.Month | SlotKey.Year;
4
- export declare function getPrevSlotKey(slotKey: string | null): SlotKey.Day | SlotKey.Month;
5
- /**
6
- * Преобразует строковое значение поля FieldDate в тип Date
7
- * @function helper
8
- */
9
- export declare function parseDate(date: string): Date;
@@ -1,43 +0,0 @@
1
- import { SlotKey, SLOTS } from './constants';
2
- export function getSlotKey(index) {
3
- if (index !== null) {
4
- for (const key in SLOTS) {
5
- if (index >= SLOTS[key].start && index <= SLOTS[key].end) {
6
- return key;
7
- }
8
- }
9
- }
10
- return null;
11
- }
12
- export function getNextSlotKey(slotKey) {
13
- switch (slotKey) {
14
- case SlotKey.Day: {
15
- return SlotKey.Month;
16
- }
17
- case SlotKey.Month:
18
- case SlotKey.Year:
19
- default: {
20
- return SlotKey.Year;
21
- }
22
- }
23
- }
24
- export function getPrevSlotKey(slotKey) {
25
- switch (slotKey) {
26
- case SlotKey.Year: {
27
- return SlotKey.Month;
28
- }
29
- case SlotKey.Month:
30
- case SlotKey.Day:
31
- default: {
32
- return SlotKey.Day;
33
- }
34
- }
35
- }
36
- /**
37
- * Преобразует строковое значение поля FieldDate в тип Date
38
- * @function helper
39
- */
40
- export function parseDate(date) {
41
- const values = date.split('.');
42
- return new Date(Number(values[2]), Number(values[1]) - 1, Number(values[0]));
43
- }
@@ -1,33 +0,0 @@
1
- import { Slot } from './types';
2
-
3
- export enum SlotKey {
4
- Day = 'D',
5
- Month = 'M',
6
- Year = 'Y',
7
- }
8
-
9
- export const MASK: Record<string, string> = {
10
- 'ru-RU': 'ДД.ММ.ГГГГ',
11
- 'en-US': 'DD.MM.YYYY',
12
- };
13
-
14
- export const DEFAULT_LOCALE = new Intl.Locale('ru-RU');
15
-
16
- export const SLOTS: Record<SlotKey | string, Slot> = {
17
- [SlotKey.Day]: { start: 0, end: 2, max: 31, min: 1 },
18
- [SlotKey.Month]: { start: 3, end: 5, max: 12, min: 1 },
19
- [SlotKey.Year]: { start: 6, end: 10, max: 2100, min: 1900 },
20
- } as const;
21
-
22
- export const SLOTS_PLACEHOLDER: Record<string, Record<string, string>> = {
23
- 'ru-RU': {
24
- [SlotKey.Day]: 'ДД',
25
- [SlotKey.Month]: 'ММ',
26
- [SlotKey.Year]: 'ГГГГ',
27
- },
28
- 'en-US': {
29
- [SlotKey.Day]: 'DD',
30
- [SlotKey.Month]: 'MM',
31
- [SlotKey.Year]: 'YYYY',
32
- },
33
- };
@@ -1 +0,0 @@
1
- export * from './useDateField';
@@ -1,96 +0,0 @@
1
- import { RefObject, useCallback } from 'react';
2
-
3
- import { SlotKey, SLOTS } from '../constants';
4
-
5
- export function useDateFieldHelpers(inputRef: RefObject<HTMLInputElement>) {
6
- const setFocus = useCallback(
7
- (slotKey: string) => {
8
- if (inputRef.current) {
9
- const { start, end } = SLOTS[slotKey];
10
-
11
- inputRef.current.setSelectionRange(start, end);
12
- }
13
- },
14
- [inputRef],
15
- );
16
-
17
- const isAllSelected = useCallback(
18
- () => inputRef.current?.value.length === inputRef.current?.selectionEnd && inputRef.current?.selectionStart === 0,
19
- [inputRef],
20
- );
21
-
22
- const getSlot = useCallback(
23
- (slotKey: string) => {
24
- if (inputRef.current) {
25
- return inputRef.current.value.slice(SLOTS[slotKey].start, SLOTS[slotKey].end);
26
- }
27
-
28
- return '';
29
- },
30
- [inputRef],
31
- );
32
-
33
- const isLikeDate = useCallback(() => {
34
- if (inputRef.current) {
35
- return Object.keys(SLOTS).every(slotKey => getSlot(slotKey) && Number.isInteger(Number(getSlot(slotKey))));
36
- }
37
- return false;
38
- }, [getSlot, inputRef]);
39
-
40
- const isValidInput = useCallback((): boolean => {
41
- const day = parseInt(getSlot(SlotKey.Day), 10);
42
- const month = parseInt(getSlot(SlotKey.Month), 10);
43
- const year = parseInt(getSlot(SlotKey.Year), 10);
44
-
45
- if (!month || !day) {
46
- return true;
47
- }
48
-
49
- const date = new Date(year || /* високосный год = */ 2020, month - 1, day);
50
-
51
- return date.getDate() === day;
52
- }, [getSlot]);
53
-
54
- const tryToCompleteInput = useCallback((): boolean => {
55
- const day = parseInt(getSlot(SlotKey.Day), 10);
56
- const month = parseInt(getSlot(SlotKey.Month), 10);
57
- const year = parseInt(getSlot(SlotKey.Year), 10);
58
-
59
- const { min, max } = SLOTS[SlotKey.Year];
60
-
61
- const isCompleted = Boolean(day && month && year >= min && year <= max);
62
-
63
- if (isCompleted && inputRef.current) {
64
- const lastPosition = inputRef.current?.value.length;
65
- inputRef.current.selectionStart = lastPosition;
66
- inputRef.current.selectionEnd = lastPosition;
67
- }
68
-
69
- return isCompleted;
70
- }, [getSlot, inputRef]);
71
-
72
- const updateSlot = useCallback(
73
- (slotKey: string, slotValue: number | string) => {
74
- if (inputRef.current) {
75
- const { start, end, max } = SLOTS[slotKey];
76
-
77
- inputRef.current.value =
78
- inputRef.current.value.slice(0, start) +
79
- slotValue.toString().padStart(max.toString().length, '0') +
80
- inputRef.current.value.slice(end);
81
- setFocus(slotKey);
82
- }
83
- },
84
- [inputRef, setFocus],
85
- );
86
-
87
- return {
88
- isAllSelected,
89
- isValidInput,
90
- tryToCompleteInput,
91
- getSlot,
92
- updateSlot,
93
- setFocus,
94
- isLikeDate,
95
- };
96
- }
@@ -1,6 +0,0 @@
1
- export type Slot = {
2
- start: number;
3
- end: number;
4
- max: number;
5
- min: number;
6
- };