@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
@@ -1,9 +1,10 @@
1
+ export * from './FieldColor';
2
+ export * from './FieldDate';
1
3
  export * from './FieldDecorator';
2
- export * from './FieldText';
3
- export * from './FieldTextArea';
4
4
  export * from './FieldSecure';
5
- export * from './FieldDate';
6
5
  export * from './FieldSelect';
7
- export * from './FieldStepper';
8
6
  export * from './FieldSlider';
9
- export * from './FieldColor';
7
+ export * from './FieldStepper';
8
+ export * from './FieldText';
9
+ export * from './FieldTextArea';
10
+ export * from './FieldTime';
@@ -22,12 +22,13 @@ 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("./FieldColor"), exports);
26
+ __exportStar(require("./FieldDate"), exports);
25
27
  __exportStar(require("./FieldDecorator"), exports);
26
- __exportStar(require("./FieldText"), exports);
27
- __exportStar(require("./FieldTextArea"), exports);
28
28
  __exportStar(require("./FieldSecure"), exports);
29
- __exportStar(require("./FieldDate"), exports);
30
29
  __exportStar(require("./FieldSelect"), exports);
31
- __exportStar(require("./FieldStepper"), exports);
32
30
  __exportStar(require("./FieldSlider"), exports);
33
- __exportStar(require("./FieldColor"), exports);
31
+ __exportStar(require("./FieldStepper"), exports);
32
+ __exportStar(require("./FieldText"), exports);
33
+ __exportStar(require("./FieldTextArea"), exports);
34
+ __exportStar(require("./FieldTime"), exports);
@@ -0,0 +1,24 @@
1
+ import { Mode, NoSecondsMode, Slot, TimeMode } from '../types';
2
+ export declare enum SlotKey {
3
+ Day = "D",
4
+ Month = "M",
5
+ Year = "Y",
6
+ Hours = "h",
7
+ Minutes = "m",
8
+ Seconds = "s"
9
+ }
10
+ export declare const MODES: {
11
+ readonly Date: "date";
12
+ readonly DateTime: "date-time";
13
+ };
14
+ export declare const TIME_MODES: {
15
+ readonly FullTime: "full-time";
16
+ readonly NoSeconds: "no-seconds";
17
+ };
18
+ export declare const NO_SECONDS_MODE = "date-time-no-sec";
19
+ export declare const MASK: Record<Mode | TimeMode | NoSecondsMode, Record<string, string>>;
20
+ export declare const DEFAULT_LOCALE: Intl.Locale;
21
+ export declare const SLOTS: Record<Mode | TimeMode | NoSecondsMode, Record<SlotKey | string, Slot>>;
22
+ export type FocusSlot = SlotKey | 'auto';
23
+ export declare const SLOT_ORDER: Record<Mode | TimeMode | NoSecondsMode, SlotKey[]>;
24
+ export declare const SLOTS_PLACEHOLDER: Record<Mode | TimeMode | NoSecondsMode, Record<string, Partial<Record<SlotKey, string>>>>;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SLOTS_PLACEHOLDER = exports.SLOT_ORDER = exports.SLOTS = exports.DEFAULT_LOCALE = exports.MASK = exports.NO_SECONDS_MODE = exports.TIME_MODES = exports.MODES = exports.SlotKey = void 0;
7
+ var SlotKey;
8
+ (function (SlotKey) {
9
+ SlotKey["Day"] = "D";
10
+ SlotKey["Month"] = "M";
11
+ SlotKey["Year"] = "Y";
12
+ SlotKey["Hours"] = "h";
13
+ SlotKey["Minutes"] = "m";
14
+ SlotKey["Seconds"] = "s";
15
+ })(SlotKey || (exports.SlotKey = SlotKey = {}));
16
+ exports.MODES = {
17
+ Date: 'date',
18
+ DateTime: 'date-time'
19
+ };
20
+ exports.TIME_MODES = {
21
+ FullTime: 'full-time',
22
+ NoSeconds: 'no-seconds'
23
+ };
24
+ exports.NO_SECONDS_MODE = 'date-time-no-sec';
25
+ exports.MASK = {
26
+ [exports.MODES.Date]: {
27
+ 'ru-RU': 'ДД.ММ.ГГГГ',
28
+ 'en-US': 'DD.MM.YYYY'
29
+ },
30
+ [exports.MODES.DateTime]: {
31
+ 'ru-RU': 'ДД.ММ.ГГГГ, чч:мм:сс',
32
+ 'en-US': 'DD.MM.YYYY, hh:mm:ss'
33
+ },
34
+ [exports.NO_SECONDS_MODE]: {
35
+ 'ru-RU': 'ДД.ММ.ГГГГ, чч:мм',
36
+ 'en-US': 'DD.MM.YYYY, hh:mm'
37
+ },
38
+ [exports.TIME_MODES.FullTime]: {
39
+ 'ru-RU': 'чч:мм:сс',
40
+ 'en-US': 'hh:mm:ss'
41
+ },
42
+ [exports.TIME_MODES.NoSeconds]: {
43
+ 'ru-RU': 'чч:мм',
44
+ 'en-US': 'hh:mm'
45
+ }
46
+ };
47
+ exports.DEFAULT_LOCALE = new Intl.Locale('ru-RU');
48
+ const DATE_SLOTS = {
49
+ [SlotKey.Day]: {
50
+ start: 0,
51
+ end: 2,
52
+ max: 31,
53
+ min: 1
54
+ },
55
+ [SlotKey.Month]: {
56
+ start: 3,
57
+ end: 5,
58
+ max: 12,
59
+ min: 1
60
+ },
61
+ [SlotKey.Year]: {
62
+ start: 6,
63
+ end: 10,
64
+ max: 2100,
65
+ min: 1900
66
+ }
67
+ };
68
+ const TIME_SLOTS = (shift, showSeconds) => Object.assign({
69
+ [SlotKey.Hours]: {
70
+ start: shift,
71
+ end: shift + 2,
72
+ max: 23,
73
+ min: 0
74
+ },
75
+ [SlotKey.Minutes]: {
76
+ start: shift + 3,
77
+ end: shift + 5,
78
+ max: 59,
79
+ min: 0
80
+ }
81
+ }, showSeconds ? {
82
+ [SlotKey.Seconds]: {
83
+ start: shift + 6,
84
+ end: shift + 8,
85
+ max: 59,
86
+ min: 0
87
+ }
88
+ } : {});
89
+ exports.SLOTS = {
90
+ [exports.MODES.Date]: DATE_SLOTS,
91
+ [exports.MODES.DateTime]: Object.assign(Object.assign({}, DATE_SLOTS), TIME_SLOTS(12, true)),
92
+ [exports.NO_SECONDS_MODE]: Object.assign(Object.assign({}, DATE_SLOTS), TIME_SLOTS(12, false)),
93
+ [exports.TIME_MODES.FullTime]: TIME_SLOTS(0, true),
94
+ [exports.TIME_MODES.NoSeconds]: TIME_SLOTS(0, false)
95
+ };
96
+ exports.SLOT_ORDER = {
97
+ [exports.MODES.Date]: [SlotKey.Day, SlotKey.Month, SlotKey.Year],
98
+ [exports.MODES.DateTime]: [SlotKey.Day, SlotKey.Month, SlotKey.Year, SlotKey.Hours, SlotKey.Minutes, SlotKey.Seconds],
99
+ [exports.NO_SECONDS_MODE]: [SlotKey.Day, SlotKey.Month, SlotKey.Year, SlotKey.Hours, SlotKey.Minutes],
100
+ [exports.TIME_MODES.FullTime]: [SlotKey.Hours, SlotKey.Minutes, SlotKey.Seconds],
101
+ [exports.TIME_MODES.NoSeconds]: [SlotKey.Hours, SlotKey.Minutes]
102
+ };
103
+ const RU_DATE_SLOTS_PLACEHOLDER = {
104
+ [SlotKey.Day]: 'ДД',
105
+ [SlotKey.Month]: 'ММ',
106
+ [SlotKey.Year]: 'ГГГГ'
107
+ };
108
+ const RU_TIME_SLOTS_PLACEHOLDER = {
109
+ [SlotKey.Hours]: 'чч',
110
+ [SlotKey.Minutes]: 'мм',
111
+ [SlotKey.Seconds]: 'сс'
112
+ };
113
+ const EN_DATE_SLOTS_PLACEHOLDER = {
114
+ [SlotKey.Day]: 'DD',
115
+ [SlotKey.Month]: 'MM',
116
+ [SlotKey.Year]: 'YYYY'
117
+ };
118
+ const EN_TIME_SLOTS_PLACEHOLDER = {
119
+ [SlotKey.Hours]: 'hh',
120
+ [SlotKey.Minutes]: 'mm',
121
+ [SlotKey.Seconds]: 'ss'
122
+ };
123
+ exports.SLOTS_PLACEHOLDER = {
124
+ [exports.MODES.Date]: {
125
+ 'ru-RU': RU_DATE_SLOTS_PLACEHOLDER,
126
+ 'en-US': EN_DATE_SLOTS_PLACEHOLDER
127
+ },
128
+ [exports.MODES.DateTime]: {
129
+ 'ru-RU': Object.assign(Object.assign({}, RU_DATE_SLOTS_PLACEHOLDER), RU_TIME_SLOTS_PLACEHOLDER),
130
+ 'en-US': Object.assign(Object.assign({}, EN_DATE_SLOTS_PLACEHOLDER), EN_TIME_SLOTS_PLACEHOLDER)
131
+ },
132
+ [exports.NO_SECONDS_MODE]: {
133
+ 'ru-RU': Object.assign(Object.assign(Object.assign({}, RU_DATE_SLOTS_PLACEHOLDER), RU_TIME_SLOTS_PLACEHOLDER), {
134
+ [SlotKey.Seconds]: undefined
135
+ }),
136
+ 'en-US': Object.assign(Object.assign(Object.assign({}, EN_DATE_SLOTS_PLACEHOLDER), EN_TIME_SLOTS_PLACEHOLDER), {
137
+ [SlotKey.Seconds]: undefined
138
+ })
139
+ },
140
+ [exports.TIME_MODES.FullTime]: {
141
+ 'ru-RU': RU_TIME_SLOTS_PLACEHOLDER,
142
+ 'en-US': EN_TIME_SLOTS_PLACEHOLDER
143
+ },
144
+ [exports.TIME_MODES.NoSeconds]: {
145
+ 'ru-RU': Object.assign(Object.assign({}, RU_TIME_SLOTS_PLACEHOLDER), {
146
+ [SlotKey.Seconds]: undefined
147
+ }),
148
+ 'en-US': Object.assign(Object.assign({}, EN_TIME_SLOTS_PLACEHOLDER), {
149
+ [SlotKey.Seconds]: undefined
150
+ })
151
+ }
152
+ };
@@ -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,3 @@
1
+ export * from './useDateField';
2
+ export * from './useFocusHandlers';
3
+ export * from './useHandlers';
@@ -0,0 +1,27 @@
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("./useDateField"), exports);
26
+ __exportStar(require("./useFocusHandlers"), exports);
27
+ __exportStar(require("./useHandlers"), exports);
@@ -1,14 +1,22 @@
1
1
  import { ChangeEvent, FocusEventHandler, KeyboardEvent, RefObject } from 'react';
2
- import { SlotKey } from '../constants';
3
- type UseDateFieldProps = {
2
+ import { TimePickerProps } from '@snack-uikit/calendar';
3
+ import { FocusSlot } from '../../constants';
4
+ import { Mode, TimeMode } from '../../types';
5
+ type BaseProps = {
4
6
  inputRef: RefObject<HTMLInputElement>;
5
- onChange?(value: string): void;
6
7
  readonly?: boolean;
7
8
  locale?: Intl.Locale;
8
9
  setIsOpen(v: boolean): void;
10
+ showSeconds?: boolean;
9
11
  };
10
- type FocusSlot = SlotKey.Day | SlotKey.Year | 'auto';
11
- export declare function useDateField({ inputRef, onChange, readonly, locale, setIsOpen }: UseDateFieldProps): {
12
+ type UseDateFieldProps = ({
13
+ mode: Mode;
14
+ onChange?(value: Date | undefined): void;
15
+ } & BaseProps) | ({
16
+ mode: TimeMode;
17
+ onChange?: TimePickerProps['onChangeValue'];
18
+ } & BaseProps);
19
+ export declare function useDateField({ inputRef, onChange, readonly, locale, setIsOpen, mode, showSeconds, }: UseDateFieldProps): {
12
20
  handleKeyDown: (e: KeyboardEvent<HTMLInputElement>) => void;
13
21
  handleChange: (value: string, e?: ChangeEvent<HTMLInputElement> | undefined) => void;
14
22
  handleClick: () => void;
@@ -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>;