@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 +1 @@
1
- {"version":3,"sources":["DropdownMenu.tsx"],"names":["React","ThemeContext","ThemeFactory","PopupMenu","isProductionEnv","isTestEnv","CommonWrapper","rootNode","DropdownMenu","props","popupMenu","setRootNode","open","close","refPopupMenu","ref","handleChangeMenuState","menuVisible","onOpen","onClose","caption","Error","render","theme","create","popupMargin","renderMain","menuMaxHeight","menuWidth","positions","disableAnimations","header","footer","width","children","Component","__KONTUR_REACT_UI__","defaultProps"],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { ThemeFactory } from '../../lib/theming/ThemeFactory';\nimport { Nullable } from '../../typings/utility-types';\nimport { PopupMenu, PopupMenuProps } from '../../internal/PopupMenu';\nimport { isProductionEnv, isTestEnv } from '../../lib/currentEnvironment';\nimport { PopupPosition } from '../../internal/Popup';\nimport { CommonWrapper, CommonProps } from '../../internal/CommonWrapper';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\n\nexport interface DropdownMenuProps extends CommonProps {\n /** Максимальная высота меню */\n menuMaxHeight?: React.CSSProperties['maxWidth'];\n /** Ширина меню */\n menuWidth?: React.CSSProperties['width'];\n /** Ширина caption */\n width?: React.CSSProperties['width'];\n\n /**\n * Элемент или функция возвращающая элемент,\n * если передана, используется вместо `caption`,\n * в таком случае управлять открытием и закрытием меню\n * придется в этой функции\n */\n caption: PopupMenuProps['caption'];\n\n /**\n * Произвольный элемент, который будет отрендерен в шапке меню.\n *\n * _Примечание_: контрол [`MenuHeader`](#/Components/MenuHeader) передаётся только в `children` меню-контролов. Не стоит передавать `MenuHeader` в `header`.\n */\n header?: React.ReactNode;\n /**\n * Произвольный элемент, который будет отрендерен в подвале меню.\n *\n * Перед элементом переданным в `footer` будет отрендерен [`MenuSeparator`](#/Components/MenuSeparator).\n */\n footer?: React.ReactNode;\n /**\n * Список позиций доступных для расположения выпадашки относительно `caption`.\n *\n * Если во всех позициях выпадашка вылезает за пределы `viewport`, будет использована первая из этого списка.\n *\n * **Возможные значения**: `top left`, `top center`, `top right`, `right top`, `right middle`, `right bottom`, `bottom left`, `bottom center`, `bottom right`, `left top`, `left middle`, `left bottom`\n * @default ['bottom left', 'bottom right', 'top left', 'top right']\n */\n positions?: PopupPosition[];\n\n onOpen?: () => void;\n onClose?: () => void;\n\n /**\n * Не показывать анимацию\n */\n disableAnimations: boolean;\n}\n\n/**\n * Меню, раскрывающееся по клику на переданный в `caption` элемент\n */\n@rootNode\nexport class DropdownMenu extends React.Component<DropdownMenuProps> {\n public static __KONTUR_REACT_UI__ = 'DropdownMenu';\n\n public static defaultProps = {\n disableAnimations: isTestEnv,\n positions: ['bottom left', 'bottom right', 'top left', 'top right'],\n };\n\n private popupMenu: Nullable<PopupMenu> = null;\n private setRootNode!: TSetRootNode;\n\n constructor(props: DropdownMenuProps) {\n super(props);\n\n if (!props.caption && !isProductionEnv) {\n throw new Error('Prop \"caption\" is required!!!');\n }\n }\n\n public render() {\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n return (\n <ThemeContext.Provider\n value={ThemeFactory.create(\n {\n popupMargin: '0px',\n },\n theme,\n )}\n >\n {this.renderMain()}\n </ThemeContext.Provider>\n );\n }}\n </ThemeContext.Consumer>\n );\n }\n\n public renderMain() {\n if (!this.props.caption) {\n return null;\n }\n return (\n <CommonWrapper rootNodeRef={this.setRootNode} {...this.props}>\n <PopupMenu\n ref={this.refPopupMenu}\n caption={this.props.caption}\n menuMaxHeight={this.props.menuMaxHeight}\n menuWidth={this.props.menuWidth}\n onChangeMenuState={this.handleChangeMenuState}\n popupHasPin={false}\n positions={this.props.positions}\n disableAnimations={this.props.disableAnimations}\n header={this.props.header}\n footer={this.props.footer}\n width={this.props.width}\n >\n {this.props.children}\n </PopupMenu>\n </CommonWrapper>\n );\n }\n\n public open = (): void => {\n if (this.popupMenu) {\n this.popupMenu.open();\n }\n };\n\n public close = (): void => {\n if (this.popupMenu) {\n this.popupMenu.close();\n }\n };\n\n private refPopupMenu = (ref: Nullable<PopupMenu>) => (this.popupMenu = ref);\n\n private handleChangeMenuState = (menuVisible: boolean) => {\n if (menuVisible && this.props.onOpen) {\n this.props.onOpen();\n return;\n }\n\n if (!menuVisible && this.props.onClose) {\n this.props.onClose();\n return;\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["DropdownMenu.tsx"],"names":["React","ThemeContext","ThemeFactory","PopupMenu","isProductionEnv","isTestEnv","CommonWrapper","rootNode","DropdownMenu","props","popupMenu","setRootNode","open","close","refPopupMenu","ref","handleChangeMenuState","menuVisible","onOpen","onClose","caption","Error","render","theme","create","popupMargin","renderMain","menuMaxHeight","menuWidth","positions","disableAnimations","header","footer","width","children","Component","__KONTUR_REACT_UI__","defaultProps"],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\nimport { ThemeFactory } from '../../lib/theming/ThemeFactory';\nimport { Nullable } from '../../typings/utility-types';\nimport { PopupMenu, PopupMenuProps } from '../../internal/PopupMenu';\nimport { isProductionEnv, isTestEnv } from '../../lib/currentEnvironment';\nimport { PopupPositionsType } from '../../internal/Popup';\nimport { CommonWrapper, CommonProps } from '../../internal/CommonWrapper';\nimport { rootNode, TSetRootNode } from '../../lib/rootNode';\n\nexport interface DropdownMenuProps extends CommonProps {\n /** Максимальная высота меню */\n menuMaxHeight?: React.CSSProperties['maxWidth'];\n /** Ширина меню */\n menuWidth?: React.CSSProperties['width'];\n /** Ширина caption */\n width?: React.CSSProperties['width'];\n\n /**\n * Элемент или функция возвращающая элемент,\n * если передана, используется вместо `caption`,\n * в таком случае управлять открытием и закрытием меню\n * придется в этой функции\n */\n caption: PopupMenuProps['caption'];\n\n /**\n * Произвольный элемент, который будет отрендерен в шапке меню.\n *\n * _Примечание_: контрол [`MenuHeader`](#/Components/MenuHeader) передаётся только в `children` меню-контролов. Не стоит передавать `MenuHeader` в `header`.\n */\n header?: React.ReactNode;\n /**\n * Произвольный элемент, который будет отрендерен в подвале меню.\n *\n * Перед элементом переданным в `footer` будет отрендерен [`MenuSeparator`](#/Components/MenuSeparator).\n */\n footer?: React.ReactNode;\n /**\n * Список позиций доступных для расположения выпадашки относительно `caption`.\n *\n * Если во всех позициях выпадашка вылезает за пределы `viewport`, будет использована первая из этого списка.\n *\n * **Возможные значения**: `top left`, `top center`, `top right`, `right top`, `right middle`, `right bottom`, `bottom left`, `bottom center`, `bottom right`, `left top`, `left middle`, `left bottom`\n * @default ['bottom left', 'bottom right', 'top left', 'top right']\n */\n positions?: PopupPositionsType[];\n\n onOpen?: () => void;\n onClose?: () => void;\n\n /**\n * Не показывать анимацию\n */\n disableAnimations: boolean;\n}\n\n/**\n * Меню, раскрывающееся по клику на переданный в `caption` элемент\n */\n@rootNode\nexport class DropdownMenu extends React.Component<DropdownMenuProps> {\n public static __KONTUR_REACT_UI__ = 'DropdownMenu';\n\n public static defaultProps = {\n disableAnimations: isTestEnv,\n positions: ['bottom left', 'bottom right', 'top left', 'top right'],\n };\n\n private popupMenu: Nullable<PopupMenu> = null;\n private setRootNode!: TSetRootNode;\n\n constructor(props: DropdownMenuProps) {\n super(props);\n\n if (!props.caption && !isProductionEnv) {\n throw new Error('Prop \"caption\" is required!!!');\n }\n }\n\n public render() {\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n return (\n <ThemeContext.Provider\n value={ThemeFactory.create(\n {\n popupMargin: '0px',\n },\n theme,\n )}\n >\n {this.renderMain()}\n </ThemeContext.Provider>\n );\n }}\n </ThemeContext.Consumer>\n );\n }\n\n public renderMain() {\n if (!this.props.caption) {\n return null;\n }\n return (\n <CommonWrapper rootNodeRef={this.setRootNode} {...this.props}>\n <PopupMenu\n ref={this.refPopupMenu}\n caption={this.props.caption}\n menuMaxHeight={this.props.menuMaxHeight}\n menuWidth={this.props.menuWidth}\n onChangeMenuState={this.handleChangeMenuState}\n popupHasPin={false}\n positions={this.props.positions}\n disableAnimations={this.props.disableAnimations}\n header={this.props.header}\n footer={this.props.footer}\n width={this.props.width}\n >\n {this.props.children}\n </PopupMenu>\n </CommonWrapper>\n );\n }\n\n public open = (): void => {\n if (this.popupMenu) {\n this.popupMenu.open();\n }\n };\n\n public close = (): void => {\n if (this.popupMenu) {\n this.popupMenu.close();\n }\n };\n\n private refPopupMenu = (ref: Nullable<PopupMenu>) => (this.popupMenu = ref);\n\n private handleChangeMenuState = (menuVisible: boolean) => {\n if (menuVisible && this.props.onOpen) {\n this.props.onOpen();\n return;\n }\n\n if (!menuVisible && this.props.onClose) {\n this.props.onClose();\n return;\n }\n };\n}\n"]}