@skbkontur/react-ui 3.10.0 → 3.11.0-select-right

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 (214) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +21 -21
  3. package/cjs/components/Autocomplete/Autocomplete.md +7 -7
  4. package/cjs/components/Button/Button.d.ts +1 -1
  5. package/cjs/components/Button/Button.js +4 -3
  6. package/cjs/components/Button/Button.js.map +1 -1
  7. package/cjs/components/Button/Button.styles.d.ts +1 -0
  8. package/cjs/components/Button/Button.styles.js +38 -28
  9. package/cjs/components/Button/Button.styles.js.map +1 -1
  10. package/cjs/components/CurrencyInput/CurrencyInput.md +24 -24
  11. package/cjs/components/CurrencyLabel/CurrencyLabel.md +23 -23
  12. package/cjs/components/DateInput/DateInput.md +106 -106
  13. package/cjs/components/DatePicker/DatePicker.md +307 -307
  14. package/cjs/components/DropdownMenu/DropdownMenu.d.ts +2 -2
  15. package/cjs/components/DropdownMenu/DropdownMenu.js.map +1 -1
  16. package/cjs/components/FxInput/FxInput.md +16 -16
  17. package/cjs/components/Gapped/Gapped.md +43 -43
  18. package/cjs/components/Group/Group.md +18 -18
  19. package/cjs/components/Hint/Hint.d.ts +2 -1
  20. package/cjs/components/Hint/Hint.js +0 -16
  21. package/cjs/components/Hint/Hint.js.map +1 -1
  22. package/cjs/components/Input/Input.md +13 -13
  23. package/cjs/components/Kebab/Kebab.d.ts +2 -2
  24. package/cjs/components/Kebab/Kebab.js.map +1 -1
  25. package/cjs/components/MenuItem/MenuItem.d.ts +1 -1
  26. package/cjs/components/MenuItem/MenuItem.js +1 -4
  27. package/cjs/components/MenuItem/MenuItem.js.map +1 -1
  28. package/cjs/components/Paging/Paging.md +43 -43
  29. package/cjs/components/PasswordInput/PasswordInput.md +9 -9
  30. package/cjs/components/RadioGroup/RadioGroup.md +43 -43
  31. package/cjs/components/ScrollContainer/ScrollBar.js +4 -2
  32. package/cjs/components/ScrollContainer/ScrollBar.js.map +1 -1
  33. package/cjs/components/ScrollContainer/ScrollContainer.js +2 -1
  34. package/cjs/components/ScrollContainer/ScrollContainer.js.map +1 -1
  35. package/cjs/components/ScrollContainer/ScrollContainer.styles.d.ts +1 -0
  36. package/cjs/components/ScrollContainer/ScrollContainer.styles.js +12 -8
  37. package/cjs/components/ScrollContainer/ScrollContainer.styles.js.map +1 -1
  38. package/cjs/components/Select/Select.js +2 -1
  39. package/cjs/components/Select/Select.js.map +1 -1
  40. package/cjs/components/SidePage/SidePage.d.ts +1 -0
  41. package/cjs/components/SidePage/SidePage.js +14 -1
  42. package/cjs/components/SidePage/SidePage.js.map +1 -1
  43. package/cjs/components/Spinner/Spinner.d.ts +8 -0
  44. package/cjs/components/Spinner/Spinner.js +21 -3
  45. package/cjs/components/Spinner/Spinner.js.map +1 -1
  46. package/cjs/components/Spinner/Spinner.md +1 -0
  47. package/cjs/components/Spinner/Spinner.styles.d.ts +2 -1
  48. package/cjs/components/Spinner/Spinner.styles.js +13 -10
  49. package/cjs/components/Spinner/Spinner.styles.js.map +1 -1
  50. package/cjs/components/Switcher/Switcher.styles.js +4 -2
  51. package/cjs/components/Switcher/Switcher.styles.js.map +1 -1
  52. package/cjs/components/Tabs/Tabs.md +36 -36
  53. package/cjs/components/Textarea/Textarea.md +25 -25
  54. package/cjs/components/Token/Token.md +112 -112
  55. package/cjs/components/TokenInput/TokenInput.md +79 -79
  56. package/cjs/components/Tooltip/Tooltip.d.ts +8 -21
  57. package/cjs/components/Tooltip/Tooltip.js +14 -27
  58. package/cjs/components/Tooltip/Tooltip.js.map +1 -1
  59. package/cjs/components/TooltipMenu/TooltipMenu.d.ts +2 -2
  60. package/cjs/components/TooltipMenu/TooltipMenu.js.map +1 -1
  61. package/cjs/index.d.ts +1 -0
  62. package/cjs/index.js +2 -1
  63. package/cjs/index.js.map +1 -1
  64. package/cjs/internal/DropdownContainer/DropdownContainer.js +10 -2
  65. package/cjs/internal/DropdownContainer/DropdownContainer.js.map +1 -1
  66. package/cjs/internal/DropdownContainer/DropdownContainer.styles.d.ts +3 -0
  67. package/cjs/internal/DropdownContainer/DropdownContainer.styles.js +9 -0
  68. package/cjs/internal/DropdownContainer/DropdownContainer.styles.js.map +1 -0
  69. package/cjs/internal/Menu/Menu.d.ts +2 -0
  70. package/cjs/internal/Menu/Menu.js +26 -2
  71. package/cjs/internal/Menu/Menu.js.map +1 -1
  72. package/cjs/internal/Menu/Menu.styles.d.ts +3 -0
  73. package/cjs/internal/Menu/Menu.styles.js +22 -3
  74. package/cjs/internal/Menu/Menu.styles.js.map +1 -1
  75. package/cjs/internal/Popup/Popup.d.ts +5 -4
  76. package/cjs/internal/Popup/Popup.js +13 -24
  77. package/cjs/internal/Popup/Popup.js.map +1 -1
  78. package/cjs/internal/Popup/PopupHelper.d.ts +2 -2
  79. package/cjs/internal/Popup/PopupHelper.js.map +1 -1
  80. package/cjs/internal/Popup/types.d.ts +1 -0
  81. package/cjs/internal/Popup/types.js +1 -0
  82. package/cjs/internal/Popup/types.js.map +1 -0
  83. package/cjs/internal/PopupMenu/PopupMenu.d.ts +3 -3
  84. package/cjs/internal/PopupMenu/PopupMenu.js +17 -3
  85. package/cjs/internal/PopupMenu/PopupMenu.js.map +1 -1
  86. package/cjs/internal/PopupMenu/validatePositions.d.ts +2 -2
  87. package/cjs/internal/PopupMenu/validatePositions.js +2 -4
  88. package/cjs/internal/PopupMenu/validatePositions.js.map +1 -1
  89. package/cjs/internal/ThemeShowcase/ThemeShowcase.md +13 -13
  90. package/cjs/internal/icons/SpinnerIcon.d.ts +4 -1
  91. package/cjs/internal/icons/SpinnerIcon.js +5 -2
  92. package/cjs/internal/icons/SpinnerIcon.js.map +1 -1
  93. package/cjs/lib/ModalStack.js +16 -17
  94. package/cjs/lib/ModalStack.js.map +1 -1
  95. package/cjs/lib/theming/AnimationKeyframes.js +1 -1
  96. package/cjs/lib/theming/AnimationKeyframes.js.map +1 -1
  97. package/cjs/lib/theming/useTheme.d.ts +1 -0
  98. package/cjs/lib/theming/useTheme.js +7 -0
  99. package/cjs/lib/theming/useTheme.js.map +1 -0
  100. package/cjs/lib/utils.d.ts +32 -0
  101. package/cjs/lib/utils.js +62 -2
  102. package/cjs/lib/utils.js.map +1 -1
  103. package/cjs/typings/html-props.d.ts +123 -0
  104. package/components/Autocomplete/Autocomplete.md +7 -7
  105. package/components/Button/Button/Button.js +3 -7
  106. package/components/Button/Button/Button.js.map +1 -1
  107. package/components/Button/Button.d.ts +1 -1
  108. package/components/Button/Button.styles/Button.styles.js +31 -28
  109. package/components/Button/Button.styles/Button.styles.js.map +1 -1
  110. package/components/Button/Button.styles.d.ts +1 -0
  111. package/components/CurrencyInput/CurrencyInput.md +24 -24
  112. package/components/CurrencyLabel/CurrencyLabel.md +23 -23
  113. package/components/DateInput/DateInput.md +106 -106
  114. package/components/DatePicker/DatePicker.md +307 -307
  115. package/components/DropdownMenu/DropdownMenu/DropdownMenu.js.map +1 -1
  116. package/components/DropdownMenu/DropdownMenu.d.ts +2 -2
  117. package/components/FxInput/FxInput.md +16 -16
  118. package/components/Gapped/Gapped.md +43 -43
  119. package/components/Group/Group.md +18 -18
  120. package/components/Hint/Hint/Hint.js.map +1 -1
  121. package/components/Hint/Hint.d.ts +2 -1
  122. package/components/Input/Input.md +13 -13
  123. package/components/Kebab/Kebab/Kebab.js.map +1 -1
  124. package/components/Kebab/Kebab.d.ts +2 -2
  125. package/components/MenuItem/MenuItem/MenuItem.js +2 -7
  126. package/components/MenuItem/MenuItem/MenuItem.js.map +1 -1
  127. package/components/MenuItem/MenuItem.d.ts +1 -1
  128. package/components/Paging/Paging.md +43 -43
  129. package/components/PasswordInput/PasswordInput.md +9 -9
  130. package/components/RadioGroup/RadioGroup.md +43 -43
  131. package/components/ScrollContainer/ScrollBar/ScrollBar.js +6 -2
  132. package/components/ScrollContainer/ScrollBar/ScrollBar.js.map +1 -1
  133. package/components/ScrollContainer/ScrollContainer/ScrollContainer.js +2 -1
  134. package/components/ScrollContainer/ScrollContainer/ScrollContainer.js.map +1 -1
  135. package/components/ScrollContainer/ScrollContainer.styles/ScrollContainer.styles.js +11 -8
  136. package/components/ScrollContainer/ScrollContainer.styles/ScrollContainer.styles.js.map +1 -1
  137. package/components/ScrollContainer/ScrollContainer.styles.d.ts +1 -0
  138. package/components/Select/Select/Select.js +2 -1
  139. package/components/Select/Select/Select.js.map +1 -1
  140. package/components/SidePage/SidePage/SidePage.js +19 -0
  141. package/components/SidePage/SidePage/SidePage.js.map +1 -1
  142. package/components/SidePage/SidePage.d.ts +1 -0
  143. package/components/Spinner/Spinner/Spinner.js +6 -3
  144. package/components/Spinner/Spinner/Spinner.js.map +1 -1
  145. package/components/Spinner/Spinner.d.ts +8 -0
  146. package/components/Spinner/Spinner.md +1 -0
  147. package/components/Spinner/Spinner.styles/Spinner.styles.js +12 -9
  148. package/components/Spinner/Spinner.styles/Spinner.styles.js.map +1 -1
  149. package/components/Spinner/Spinner.styles.d.ts +2 -1
  150. package/components/Switcher/Switcher.styles/Switcher.styles.js +3 -1
  151. package/components/Switcher/Switcher.styles/Switcher.styles.js.map +1 -1
  152. package/components/Tabs/Tabs.md +36 -36
  153. package/components/Textarea/Textarea.md +25 -25
  154. package/components/Token/Token.md +112 -112
  155. package/components/TokenInput/TokenInput.md +79 -79
  156. package/components/Tooltip/Tooltip/Tooltip.js +2 -2
  157. package/components/Tooltip/Tooltip/Tooltip.js.map +1 -1
  158. package/components/Tooltip/Tooltip.d.ts +8 -21
  159. package/components/TooltipMenu/TooltipMenu/TooltipMenu.js.map +1 -1
  160. package/components/TooltipMenu/TooltipMenu.d.ts +2 -2
  161. package/index.d.ts +1 -0
  162. package/index.js +2 -1
  163. package/index.js.map +1 -1
  164. package/internal/DropdownContainer/DropdownContainer/DropdownContainer.js +6 -1
  165. package/internal/DropdownContainer/DropdownContainer/DropdownContainer.js.map +1 -1
  166. package/internal/DropdownContainer/DropdownContainer.styles/DropdownContainer.styles.js +10 -0
  167. package/internal/DropdownContainer/DropdownContainer.styles/DropdownContainer.styles.js.map +1 -0
  168. package/internal/DropdownContainer/DropdownContainer.styles/package.json +6 -0
  169. package/internal/DropdownContainer/DropdownContainer.styles.d.ts +3 -0
  170. package/internal/Menu/Menu/Menu.js +14 -5
  171. package/internal/Menu/Menu/Menu.js.map +1 -1
  172. package/internal/Menu/Menu.d.ts +2 -0
  173. package/internal/Menu/Menu.styles/Menu.styles.js +12 -3
  174. package/internal/Menu/Menu.styles/Menu.styles.js.map +1 -1
  175. package/internal/Menu/Menu.styles.d.ts +3 -0
  176. package/internal/Popup/Popup/Popup.js +3 -2
  177. package/internal/Popup/Popup/Popup.js.map +1 -1
  178. package/internal/Popup/Popup.d.ts +5 -4
  179. package/internal/Popup/PopupHelper/PopupHelper.js.map +1 -1
  180. package/internal/Popup/PopupHelper.d.ts +2 -2
  181. package/internal/Popup/types/package.json +6 -0
  182. package/internal/Popup/types/types.js +0 -0
  183. package/internal/Popup/types/types.js.map +1 -0
  184. package/internal/Popup/types.d.ts +1 -0
  185. package/internal/PopupMenu/PopupMenu/PopupMenu.js +3 -3
  186. package/internal/PopupMenu/PopupMenu/PopupMenu.js.map +1 -1
  187. package/internal/PopupMenu/PopupMenu.d.ts +3 -3
  188. package/internal/PopupMenu/validatePositions/validatePositions.js +2 -2
  189. package/internal/PopupMenu/validatePositions/validatePositions.js.map +1 -1
  190. package/internal/PopupMenu/validatePositions.d.ts +2 -2
  191. package/internal/ThemeShowcase/ThemeShowcase.md +13 -13
  192. package/internal/icons/SpinnerIcon/SpinnerIcon.js +5 -2
  193. package/internal/icons/SpinnerIcon/SpinnerIcon.js.map +1 -1
  194. package/internal/icons/SpinnerIcon.d.ts +4 -1
  195. package/lib/ModalStack/ModalStack.js +9 -13
  196. package/lib/ModalStack/ModalStack.js.map +1 -1
  197. package/lib/theming/AnimationKeyframes/AnimationKeyframes.js +1 -1
  198. package/lib/theming/AnimationKeyframes/AnimationKeyframes.js.map +1 -1
  199. package/lib/theming/useTheme/package.json +6 -0
  200. package/lib/theming/useTheme/useTheme.js +5 -0
  201. package/lib/theming/useTheme/useTheme.js.map +1 -0
  202. package/lib/theming/useTheme.d.ts +1 -0
  203. package/lib/utils/utils.js +66 -0
  204. package/lib/utils/utils.js.map +1 -1
  205. package/lib/utils.d.ts +32 -0
  206. package/package.json +5 -5
  207. package/typings/html-props.d.ts +123 -0
  208. package/cjs/internal/PopupMenu/PopupMenuPositions.d.ts +0 -2
  209. package/cjs/internal/PopupMenu/PopupMenuPositions.js +0 -15
  210. package/cjs/internal/PopupMenu/PopupMenuPositions.js.map +0 -1
  211. package/internal/PopupMenu/PopupMenuPositions/PopupMenuPositions.js +0 -1
  212. package/internal/PopupMenu/PopupMenuPositions/PopupMenuPositions.js.map +0 -1
  213. package/internal/PopupMenu/PopupMenuPositions/package.json +0 -6
  214. package/internal/PopupMenu/PopupMenuPositions.d.ts +0 -2
@@ -1,307 +1,307 @@
1
- Компонент `DatePicker` принимает в `value` строку формата `dd.mm.yyyy`.
2
- При вводе строки в поле ввода, возвращает строку без маски.
3
-
4
- Имеется статический метод `DatePicker.validate`, который проверяет,
5
- что введенная дата корректна
6
-
7
- ```ts static
8
- DatePicker.validate: (value: string, range?: { minDate?: string; maxDate?: string }) => boolean
9
- ```
10
-
11
- ### Валидация
12
-
13
- Пример с обработкой ошибок, когда пользователь ввел невалидную дату.
14
-
15
- ```jsx harmony
16
- import { Gapped, Tooltip } from '@skbkontur/react-ui';
17
- import { ViewDateInputValidateChecks } from '@skbkontur/react-ui/components/DateInput/ViewDateInputValidateChecks';
18
-
19
- const [value, setValue] = React.useState();
20
- const [error, setError] = React.useState(false);
21
- const [tooltip, setTooltip] = React.useState(false);
22
-
23
- const minDate = '22.12.2012';
24
- const maxDate = '02.05.2018';
25
-
26
- const unvalidate = () => {
27
- setError(false);
28
- setTooltip(false);
29
- };
30
-
31
- const validate = () => {
32
- const errorNew = !!value && !DatePicker.validate(value, { minDate: minDate, maxDate: maxDate });
33
- setError(errorNew);
34
- setTooltip(errorNew);
35
- };
36
-
37
- let removeTooltip = () => setTooltip(false);
38
-
39
- <Gapped gap={10} vertical>
40
- <ViewDateInputValidateChecks value={value} minDate={minDate} maxDate={maxDate} />
41
- <pre>
42
- minDate = {minDate}
43
- <br />
44
- maxDate = {maxDate}
45
- </pre>
46
-
47
- <Tooltip trigger={tooltip ? 'opened' : 'closed'} render={() => 'Невалидная дата'} onCloseClick={removeTooltip}>
48
- <DatePicker
49
- error={error}
50
- value={value}
51
- onValueChange={setValue}
52
- onFocus={unvalidate}
53
- onBlur={validate}
54
- minDate={minDate}
55
- maxDate={maxDate}
56
- enableTodayLink
57
- />
58
- </Tooltip>
59
- </Gapped>;
60
- ```
61
-
62
- ### `isHoliday`
63
-
64
- В компонент можно передать функцию `isHoliday`, которая будет получать день строкой формата `dd.mm.yyyy` и флаг `isWeekend`, и должна вернуть `true` для выходного и `false` для рабочего дня.
65
-
66
- ```jsx harmony
67
- import * as DatePickerHelpers from './DatePickerHelpers';
68
-
69
- const [value, setValue] = React.useState();
70
-
71
- const createRandomHolidays = () => {
72
- const holidays = new Array(10);
73
- const today = new Date();
74
-
75
- for (let index = 0; index < holidays.length; index++) {
76
- const day = new Date(today.setDate(today.getDate() + 1 + index).valueOf());
77
-
78
- const holiday = {
79
- date: day.getDate(),
80
- month: day.getMonth(),
81
- year: day.getFullYear(),
82
- };
83
-
84
- holidays[index] = DatePickerHelpers.formatDate(holiday);
85
- }
86
-
87
- return holidays;
88
- };
89
- const holidays = createRandomHolidays();
90
-
91
- const isHoliday = (day, isWeekend) => {
92
- const today = new Date();
93
- const holiday = {
94
- date: today.getDate(),
95
- month: today.getMonth(),
96
- year: today.getFullYear(),
97
- };
98
-
99
- if (holidays.includes(day)) {
100
- return !isWeekend;
101
- }
102
-
103
- return isWeekend;
104
- };
105
-
106
- <DatePicker isHoliday={isHoliday} value={value} onValueChange={setValue} enableTodayLink />;
107
- ```
108
-
109
- ### Производственный календарь
110
-
111
- Пример обработки производственного календаря от `data.gov.ru`
112
-
113
- <details><summary>`data.gov.ru`</summary>
114
-
115
- Docs:
116
- https://data.gov.ru/api-portala-otkrytyh-dannyh-rf-polnoe-rukovodstvo
117
-
118
- Request:
119
-
120
- ```md
121
- https://data.gov.ru/api/json/dataset/7708660670-proizvcalendar/version/20151123T183036/content?search=2021&access_token=31de6d0b90f51a7aa3ee2d518d50f4e9
122
- ```
123
-
124
- Response:
125
-
126
- ```json
127
- [
128
- {
129
- "Год/Месяц": "2021",
130
- "Январь": "1,2,3,4,5,6,7,8,9,10,16,17,23,24,30,31",
131
- "Февраль": "6,7,13,14,20,21,22*,23,27,28",
132
- "Март": "6,7,8*,13,14,20,21,27,28",
133
- "Апрель": "3,4,10,11,17,18,24,25,30*",
134
- "Май": "1,2,3+,8,9,10+,15,16,22,23,29,30",
135
- "Июнь": "5,6,11*,12,13,14+,19,20,26,27",
136
- "Июль": "3,4,10,11,17,18,24,25,31",
137
- "Август": "1,7,8,14,15,21,22,28,29",
138
- "Сентябрь": "4,5,11,12,18,19,25,26",
139
- "Октябрь": "2,3,9,10,16,17,23,24,30,31",
140
- "Ноябрь": "3*,4,6,7,13,14,20,21,27,28",
141
- "Декабрь": "4,5,11,12,18,19,25,26,31*",
142
- "Всего рабочих дней": "249",
143
- "Всего праздничных и выходных дней": "116",
144
- "Количество рабочих часов при 40-часовой рабочей неделе": "1987",
145
- "Количество рабочих часов при 36-часовой рабочей неделе": "1787.8",
146
- "Количество рабочих часов при 24-часовой рабочей неделе": "1190.2"
147
- }
148
- ]
149
- ```
150
-
151
- </details>
152
-
153
- ```jsx harmony
154
- const today = new Date();
155
- const year = today.getFullYear();
156
- const response = [
157
- {
158
- 'Год/Месяц': '2021',
159
- Январь: '1,2,3,4,5,6,7,8,9,10,16,17,23,24,30,31',
160
- Февраль: '6,7,13,14,20,21,22*,23,27,28',
161
- Март: '6,7,8*,13,14,20,21,27,28',
162
- Апрель: '3,4,10,11,17,18,24,25,30*',
163
- Май: '1,2,3+,8,9,10+,15,16,22,23,29,30',
164
- Июнь: '5,6,11*,12,13,14+,19,20,26,27',
165
- Июль: '3,4,10,11,17,18,24,25,31',
166
- Август: '1,7,8,14,15,21,22,28,29',
167
- Сентябрь: '4,5,11,12,18,19,25,26',
168
- Октябрь: '2,3,9,10,16,17,23,24,30,31',
169
- Ноябрь: '3*,4,6,7,13,14,20,21,27,28',
170
- Декабрь: '4,5,11,12,18,19,25,26,31*',
171
- 'Всего рабочих дней': '249',
172
- 'Всего праздничных и выходных дней': '116',
173
- 'Количество рабочих часов при 40-часовой рабочей неделе': '1987',
174
- 'Количество рабочих часов при 36-часовой рабочей неделе': '1787.8',
175
- 'Количество рабочих часов при 24-часовой рабочей неделе': '1190.2',
176
- },
177
- ];
178
- let result = [];
179
- let holidays = [];
180
-
181
- if (response.length !== 0) {
182
- result = Object.values(
183
- response.length > 1 ? response.find(data => data['Год/Месяц'] === year.toString()) || response[0] : response[0],
184
- ).slice(1, 13);
185
- }
186
- result.forEach((month, index) => {
187
- month
188
- .split(',')
189
- .filter(item => /^\d*$/.test(item))
190
- .forEach(day => {
191
- holidays.push(`${day.padStart(2, 0)}.${(index + 1).toString().padStart(2, 0)}.${year}`);
192
- });
193
- });
194
-
195
- const isHoliday = (date, isWeekend) => holidays.includes(date) || isWeekend;
196
-
197
- <DatePicker isHoliday={isHoliday} onValueChange={() => void 0} enableTodayLink />;
198
- ```
199
-
200
- ### Ручное форматирование даты
201
-
202
- ```jsx harmony
203
- import { DateOrder, DateSeparator, Gapped, LocaleContext, Select, LangCodes } from '@skbkontur/react-ui';
204
-
205
- class DatePickerFormatting extends React.Component {
206
- constructor() {
207
- this.state = {
208
- order: DateOrder.YMD,
209
- separator: 'Dot',
210
- value: '21.12.2012',
211
- };
212
- }
213
-
214
- render() {
215
- return (
216
- <Gapped vertical gap={10}>
217
- <div>
218
- <span style={{ width: '300px', display: 'inline-block' }}>
219
- Порядок компонентов (<tt>DateOrder</tt>)
220
- </span>
221
- <Select
222
- value={this.state.order}
223
- items={Object.keys(DateOrder)}
224
- onValueChange={order => this.setState({ order })}
225
- />
226
- </div>
227
- <div>
228
- <span style={{ width: '300px', display: 'inline-block' }}>
229
- Разделитель (<tt>DateSeparator</tt>)
230
- </span>
231
- <Select
232
- value={this.state.separator}
233
- items={Object.keys(DateSeparator)}
234
- onValueChange={separator => this.setState({ separator })}
235
- />
236
- </div>
237
- <LocaleContext.Provider
238
- value={{
239
- langCode: LangCodes.ru_RU,
240
- locale: {
241
- DatePicker: {
242
- separator: DateSeparator[this.state.separator],
243
- order: this.state.order,
244
- },
245
- },
246
- }}
247
- >
248
- <DatePicker onValueChange={value => this.setState({ value })} value={this.state.value} />
249
- </LocaleContext.Provider>
250
- </Gapped>
251
- );
252
- }
253
- }
254
-
255
- <DatePickerFormatting />;
256
- ```
257
-
258
- #### Локали по умолчанию
259
-
260
- ```typescript static
261
- interface DatePickerLocale {
262
- today?: string;
263
- months?: string[];
264
- order?: DateOrder;
265
- separator?: DateSeparator;
266
- }
267
-
268
- const ru_RU = {
269
- today: 'Сегодня',
270
- months: [
271
- 'Январь',
272
- 'Февраль',
273
- 'Март',
274
- 'Апрель',
275
- 'Май',
276
- 'Июнь',
277
- 'Июль',
278
- 'Август',
279
- 'Сентябрь',
280
- 'Октябрь',
281
- 'Ноябрь',
282
- 'Декабрь',
283
- ],
284
- order: DateOrder.DMY,
285
- separator: DateSeparator.Dot,
286
- };
287
-
288
- const en_GB = {
289
- today: 'Today',
290
- months: [
291
- 'January',
292
- 'February',
293
- 'March',
294
- 'April',
295
- 'May',
296
- 'June',
297
- 'July',
298
- 'August',
299
- 'September',
300
- 'October',
301
- 'November',
302
- 'December',
303
- ],
304
- order: DateOrder.MDY,
305
- separator: DateSeparator.Slash,
306
- };
307
- ```
1
+ Компонент `DatePicker` принимает в `value` строку формата `dd.mm.yyyy`.
2
+ При вводе строки в поле ввода, возвращает строку без маски.
3
+
4
+ Имеется статический метод `DatePicker.validate`, который проверяет,
5
+ что введенная дата корректна
6
+
7
+ ```ts static
8
+ DatePicker.validate: (value: string, range?: { minDate?: string; maxDate?: string }) => boolean
9
+ ```
10
+
11
+ ### Валидация
12
+
13
+ Пример с обработкой ошибок, когда пользователь ввел невалидную дату.
14
+
15
+ ```jsx harmony
16
+ import { Gapped, Tooltip } from '@skbkontur/react-ui';
17
+ import { ViewDateInputValidateChecks } from '@skbkontur/react-ui/components/DateInput/ViewDateInputValidateChecks';
18
+
19
+ const [value, setValue] = React.useState();
20
+ const [error, setError] = React.useState(false);
21
+ const [tooltip, setTooltip] = React.useState(false);
22
+
23
+ const minDate = '22.12.2012';
24
+ const maxDate = '02.05.2018';
25
+
26
+ const unvalidate = () => {
27
+ setError(false);
28
+ setTooltip(false);
29
+ };
30
+
31
+ const validate = () => {
32
+ const errorNew = !!value && !DatePicker.validate(value, { minDate: minDate, maxDate: maxDate });
33
+ setError(errorNew);
34
+ setTooltip(errorNew);
35
+ };
36
+
37
+ let removeTooltip = () => setTooltip(false);
38
+
39
+ <Gapped gap={10} vertical>
40
+ <ViewDateInputValidateChecks value={value} minDate={minDate} maxDate={maxDate} />
41
+ <pre>
42
+ minDate = {minDate}
43
+ <br />
44
+ maxDate = {maxDate}
45
+ </pre>
46
+
47
+ <Tooltip trigger={tooltip ? 'opened' : 'closed'} render={() => 'Невалидная дата'} onCloseClick={removeTooltip}>
48
+ <DatePicker
49
+ error={error}
50
+ value={value}
51
+ onValueChange={setValue}
52
+ onFocus={unvalidate}
53
+ onBlur={validate}
54
+ minDate={minDate}
55
+ maxDate={maxDate}
56
+ enableTodayLink
57
+ />
58
+ </Tooltip>
59
+ </Gapped>;
60
+ ```
61
+
62
+ ### `isHoliday`
63
+
64
+ В компонент можно передать функцию `isHoliday`, которая будет получать день строкой формата `dd.mm.yyyy` и флаг `isWeekend`, и должна вернуть `true` для выходного и `false` для рабочего дня.
65
+
66
+ ```jsx harmony
67
+ import * as DatePickerHelpers from './DatePickerHelpers';
68
+
69
+ const [value, setValue] = React.useState();
70
+
71
+ const createRandomHolidays = () => {
72
+ const holidays = new Array(10);
73
+ const today = new Date();
74
+
75
+ for (let index = 0; index < holidays.length; index++) {
76
+ const day = new Date(today.setDate(today.getDate() + 1 + index).valueOf());
77
+
78
+ const holiday = {
79
+ date: day.getDate(),
80
+ month: day.getMonth(),
81
+ year: day.getFullYear(),
82
+ };
83
+
84
+ holidays[index] = DatePickerHelpers.formatDate(holiday);
85
+ }
86
+
87
+ return holidays;
88
+ };
89
+ const holidays = createRandomHolidays();
90
+
91
+ const isHoliday = (day, isWeekend) => {
92
+ const today = new Date();
93
+ const holiday = {
94
+ date: today.getDate(),
95
+ month: today.getMonth(),
96
+ year: today.getFullYear(),
97
+ };
98
+
99
+ if (holidays.includes(day)) {
100
+ return !isWeekend;
101
+ }
102
+
103
+ return isWeekend;
104
+ };
105
+
106
+ <DatePicker isHoliday={isHoliday} value={value} onValueChange={setValue} enableTodayLink />;
107
+ ```
108
+
109
+ ### Производственный календарь
110
+
111
+ Пример обработки производственного календаря от `data.gov.ru`
112
+
113
+ <details><summary>`data.gov.ru`</summary>
114
+
115
+ Docs:
116
+ https://data.gov.ru/api-portala-otkrytyh-dannyh-rf-polnoe-rukovodstvo
117
+
118
+ Request:
119
+
120
+ ```md
121
+ https://data.gov.ru/api/json/dataset/7708660670-proizvcalendar/version/20151123T183036/content?search=2021&access_token=31de6d0b90f51a7aa3ee2d518d50f4e9
122
+ ```
123
+
124
+ Response:
125
+
126
+ ```json
127
+ [
128
+ {
129
+ "Год/Месяц": "2021",
130
+ "Январь": "1,2,3,4,5,6,7,8,9,10,16,17,23,24,30,31",
131
+ "Февраль": "6,7,13,14,20,21,22*,23,27,28",
132
+ "Март": "6,7,8*,13,14,20,21,27,28",
133
+ "Апрель": "3,4,10,11,17,18,24,25,30*",
134
+ "Май": "1,2,3+,8,9,10+,15,16,22,23,29,30",
135
+ "Июнь": "5,6,11*,12,13,14+,19,20,26,27",
136
+ "Июль": "3,4,10,11,17,18,24,25,31",
137
+ "Август": "1,7,8,14,15,21,22,28,29",
138
+ "Сентябрь": "4,5,11,12,18,19,25,26",
139
+ "Октябрь": "2,3,9,10,16,17,23,24,30,31",
140
+ "Ноябрь": "3*,4,6,7,13,14,20,21,27,28",
141
+ "Декабрь": "4,5,11,12,18,19,25,26,31*",
142
+ "Всего рабочих дней": "249",
143
+ "Всего праздничных и выходных дней": "116",
144
+ "Количество рабочих часов при 40-часовой рабочей неделе": "1987",
145
+ "Количество рабочих часов при 36-часовой рабочей неделе": "1787.8",
146
+ "Количество рабочих часов при 24-часовой рабочей неделе": "1190.2"
147
+ }
148
+ ]
149
+ ```
150
+
151
+ </details>
152
+
153
+ ```jsx harmony
154
+ const today = new Date();
155
+ const year = today.getFullYear();
156
+ const response = [
157
+ {
158
+ 'Год/Месяц': '2021',
159
+ Январь: '1,2,3,4,5,6,7,8,9,10,16,17,23,24,30,31',
160
+ Февраль: '6,7,13,14,20,21,22*,23,27,28',
161
+ Март: '6,7,8*,13,14,20,21,27,28',
162
+ Апрель: '3,4,10,11,17,18,24,25,30*',
163
+ Май: '1,2,3+,8,9,10+,15,16,22,23,29,30',
164
+ Июнь: '5,6,11*,12,13,14+,19,20,26,27',
165
+ Июль: '3,4,10,11,17,18,24,25,31',
166
+ Август: '1,7,8,14,15,21,22,28,29',
167
+ Сентябрь: '4,5,11,12,18,19,25,26',
168
+ Октябрь: '2,3,9,10,16,17,23,24,30,31',
169
+ Ноябрь: '3*,4,6,7,13,14,20,21,27,28',
170
+ Декабрь: '4,5,11,12,18,19,25,26,31*',
171
+ 'Всего рабочих дней': '249',
172
+ 'Всего праздничных и выходных дней': '116',
173
+ 'Количество рабочих часов при 40-часовой рабочей неделе': '1987',
174
+ 'Количество рабочих часов при 36-часовой рабочей неделе': '1787.8',
175
+ 'Количество рабочих часов при 24-часовой рабочей неделе': '1190.2',
176
+ },
177
+ ];
178
+ let result = [];
179
+ let holidays = [];
180
+
181
+ if (response.length !== 0) {
182
+ result = Object.values(
183
+ response.length > 1 ? response.find(data => data['Год/Месяц'] === year.toString()) || response[0] : response[0],
184
+ ).slice(1, 13);
185
+ }
186
+ result.forEach((month, index) => {
187
+ month
188
+ .split(',')
189
+ .filter(item => /^\d*$/.test(item))
190
+ .forEach(day => {
191
+ holidays.push(`${day.padStart(2, 0)}.${(index + 1).toString().padStart(2, 0)}.${year}`);
192
+ });
193
+ });
194
+
195
+ const isHoliday = (date, isWeekend) => holidays.includes(date) || isWeekend;
196
+
197
+ <DatePicker isHoliday={isHoliday} onValueChange={() => void 0} enableTodayLink />;
198
+ ```
199
+
200
+ ### Ручное форматирование даты
201
+
202
+ ```jsx harmony
203
+ import { DateOrder, DateSeparator, Gapped, LocaleContext, Select, LangCodes } from '@skbkontur/react-ui';
204
+
205
+ class DatePickerFormatting extends React.Component {
206
+ constructor() {
207
+ this.state = {
208
+ order: DateOrder.YMD,
209
+ separator: 'Dot',
210
+ value: '21.12.2012',
211
+ };
212
+ }
213
+
214
+ render() {
215
+ return (
216
+ <Gapped vertical gap={10}>
217
+ <div>
218
+ <span style={{ width: '300px', display: 'inline-block' }}>
219
+ Порядок компонентов (<tt>DateOrder</tt>)
220
+ </span>
221
+ <Select
222
+ value={this.state.order}
223
+ items={Object.keys(DateOrder)}
224
+ onValueChange={order => this.setState({ order })}
225
+ />
226
+ </div>
227
+ <div>
228
+ <span style={{ width: '300px', display: 'inline-block' }}>
229
+ Разделитель (<tt>DateSeparator</tt>)
230
+ </span>
231
+ <Select
232
+ value={this.state.separator}
233
+ items={Object.keys(DateSeparator)}
234
+ onValueChange={separator => this.setState({ separator })}
235
+ />
236
+ </div>
237
+ <LocaleContext.Provider
238
+ value={{
239
+ langCode: LangCodes.ru_RU,
240
+ locale: {
241
+ DatePicker: {
242
+ separator: DateSeparator[this.state.separator],
243
+ order: this.state.order,
244
+ },
245
+ },
246
+ }}
247
+ >
248
+ <DatePicker onValueChange={value => this.setState({ value })} value={this.state.value} />
249
+ </LocaleContext.Provider>
250
+ </Gapped>
251
+ );
252
+ }
253
+ }
254
+
255
+ <DatePickerFormatting />;
256
+ ```
257
+
258
+ #### Локали по умолчанию
259
+
260
+ ```typescript static
261
+ interface DatePickerLocale {
262
+ today?: string;
263
+ months?: string[];
264
+ order?: DateOrder;
265
+ separator?: DateSeparator;
266
+ }
267
+
268
+ const ru_RU = {
269
+ today: 'Сегодня',
270
+ months: [
271
+ 'Январь',
272
+ 'Февраль',
273
+ 'Март',
274
+ 'Апрель',
275
+ 'Май',
276
+ 'Июнь',
277
+ 'Июль',
278
+ 'Август',
279
+ 'Сентябрь',
280
+ 'Октябрь',
281
+ 'Ноябрь',
282
+ 'Декабрь',
283
+ ],
284
+ order: DateOrder.DMY,
285
+ separator: DateSeparator.Dot,
286
+ };
287
+
288
+ const en_GB = {
289
+ today: 'Today',
290
+ months: [
291
+ 'January',
292
+ 'February',
293
+ 'March',
294
+ 'April',
295
+ 'May',
296
+ 'June',
297
+ 'July',
298
+ 'August',
299
+ 'September',
300
+ 'October',
301
+ 'November',
302
+ 'December',
303
+ ],
304
+ order: DateOrder.MDY,
305
+ separator: DateSeparator.Slash,
306
+ };
307
+ ```
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { PopupMenuProps } from '../../internal/PopupMenu';
3
- import { PopupPosition } from '../../internal/Popup';
3
+ import { PopupPositionsType } from '../../internal/Popup';
4
4
  import { CommonProps } from '../../internal/CommonWrapper';
5
5
  export interface DropdownMenuProps extends CommonProps {
6
6
  /** Максимальная высота меню */
@@ -36,7 +36,7 @@ export interface DropdownMenuProps extends CommonProps {
36
36
  * **Возможные значения**: `top left`, `top center`, `top right`, `right top`, `right middle`, `right bottom`, `bottom left`, `bottom center`, `bottom right`, `left top`, `left middle`, `left bottom`
37
37
  * @default ['bottom left', 'bottom right', 'top left', 'top right']
38
38
  */
39
- positions?: PopupPosition[];
39
+ positions?: PopupPositionsType[];
40
40
  onOpen?: () => void;
41
41
  onClose?: () => void;
42
42
  /**