@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.
- package/CHANGELOG.md +19 -0
- package/LICENSE +21 -21
- package/cjs/components/Autocomplete/Autocomplete.md +7 -7
- package/cjs/components/Button/Button.d.ts +1 -1
- package/cjs/components/Button/Button.js +4 -3
- package/cjs/components/Button/Button.js.map +1 -1
- package/cjs/components/Button/Button.styles.d.ts +1 -0
- package/cjs/components/Button/Button.styles.js +38 -28
- package/cjs/components/Button/Button.styles.js.map +1 -1
- package/cjs/components/CurrencyInput/CurrencyInput.md +24 -24
- package/cjs/components/CurrencyLabel/CurrencyLabel.md +23 -23
- package/cjs/components/DateInput/DateInput.md +106 -106
- package/cjs/components/DatePicker/DatePicker.md +307 -307
- package/cjs/components/DropdownMenu/DropdownMenu.d.ts +2 -2
- package/cjs/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/cjs/components/FxInput/FxInput.md +16 -16
- package/cjs/components/Gapped/Gapped.md +43 -43
- package/cjs/components/Group/Group.md +18 -18
- package/cjs/components/Hint/Hint.d.ts +2 -1
- package/cjs/components/Hint/Hint.js +0 -16
- package/cjs/components/Hint/Hint.js.map +1 -1
- package/cjs/components/Input/Input.md +13 -13
- package/cjs/components/Kebab/Kebab.d.ts +2 -2
- package/cjs/components/Kebab/Kebab.js.map +1 -1
- package/cjs/components/MenuItem/MenuItem.d.ts +1 -1
- package/cjs/components/MenuItem/MenuItem.js +1 -4
- package/cjs/components/MenuItem/MenuItem.js.map +1 -1
- package/cjs/components/Paging/Paging.md +43 -43
- package/cjs/components/PasswordInput/PasswordInput.md +9 -9
- package/cjs/components/RadioGroup/RadioGroup.md +43 -43
- package/cjs/components/ScrollContainer/ScrollBar.js +4 -2
- package/cjs/components/ScrollContainer/ScrollBar.js.map +1 -1
- package/cjs/components/ScrollContainer/ScrollContainer.js +2 -1
- package/cjs/components/ScrollContainer/ScrollContainer.js.map +1 -1
- package/cjs/components/ScrollContainer/ScrollContainer.styles.d.ts +1 -0
- package/cjs/components/ScrollContainer/ScrollContainer.styles.js +12 -8
- package/cjs/components/ScrollContainer/ScrollContainer.styles.js.map +1 -1
- package/cjs/components/Select/Select.js +2 -1
- package/cjs/components/Select/Select.js.map +1 -1
- package/cjs/components/SidePage/SidePage.d.ts +1 -0
- package/cjs/components/SidePage/SidePage.js +14 -1
- package/cjs/components/SidePage/SidePage.js.map +1 -1
- package/cjs/components/Spinner/Spinner.d.ts +8 -0
- package/cjs/components/Spinner/Spinner.js +21 -3
- package/cjs/components/Spinner/Spinner.js.map +1 -1
- package/cjs/components/Spinner/Spinner.md +1 -0
- package/cjs/components/Spinner/Spinner.styles.d.ts +2 -1
- package/cjs/components/Spinner/Spinner.styles.js +13 -10
- package/cjs/components/Spinner/Spinner.styles.js.map +1 -1
- package/cjs/components/Switcher/Switcher.styles.js +4 -2
- package/cjs/components/Switcher/Switcher.styles.js.map +1 -1
- package/cjs/components/Tabs/Tabs.md +36 -36
- package/cjs/components/Textarea/Textarea.md +25 -25
- package/cjs/components/Token/Token.md +112 -112
- package/cjs/components/TokenInput/TokenInput.md +79 -79
- package/cjs/components/Tooltip/Tooltip.d.ts +8 -21
- package/cjs/components/Tooltip/Tooltip.js +14 -27
- package/cjs/components/Tooltip/Tooltip.js.map +1 -1
- package/cjs/components/TooltipMenu/TooltipMenu.d.ts +2 -2
- package/cjs/components/TooltipMenu/TooltipMenu.js.map +1 -1
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +2 -1
- package/cjs/index.js.map +1 -1
- package/cjs/internal/DropdownContainer/DropdownContainer.js +10 -2
- package/cjs/internal/DropdownContainer/DropdownContainer.js.map +1 -1
- package/cjs/internal/DropdownContainer/DropdownContainer.styles.d.ts +3 -0
- package/cjs/internal/DropdownContainer/DropdownContainer.styles.js +9 -0
- package/cjs/internal/DropdownContainer/DropdownContainer.styles.js.map +1 -0
- package/cjs/internal/Menu/Menu.d.ts +2 -0
- package/cjs/internal/Menu/Menu.js +26 -2
- package/cjs/internal/Menu/Menu.js.map +1 -1
- package/cjs/internal/Menu/Menu.styles.d.ts +3 -0
- package/cjs/internal/Menu/Menu.styles.js +22 -3
- package/cjs/internal/Menu/Menu.styles.js.map +1 -1
- package/cjs/internal/Popup/Popup.d.ts +5 -4
- package/cjs/internal/Popup/Popup.js +13 -24
- package/cjs/internal/Popup/Popup.js.map +1 -1
- package/cjs/internal/Popup/PopupHelper.d.ts +2 -2
- package/cjs/internal/Popup/PopupHelper.js.map +1 -1
- package/cjs/internal/Popup/types.d.ts +1 -0
- package/cjs/internal/Popup/types.js +1 -0
- package/cjs/internal/Popup/types.js.map +1 -0
- package/cjs/internal/PopupMenu/PopupMenu.d.ts +3 -3
- package/cjs/internal/PopupMenu/PopupMenu.js +17 -3
- package/cjs/internal/PopupMenu/PopupMenu.js.map +1 -1
- package/cjs/internal/PopupMenu/validatePositions.d.ts +2 -2
- package/cjs/internal/PopupMenu/validatePositions.js +2 -4
- package/cjs/internal/PopupMenu/validatePositions.js.map +1 -1
- package/cjs/internal/ThemeShowcase/ThemeShowcase.md +13 -13
- package/cjs/internal/icons/SpinnerIcon.d.ts +4 -1
- package/cjs/internal/icons/SpinnerIcon.js +5 -2
- package/cjs/internal/icons/SpinnerIcon.js.map +1 -1
- package/cjs/lib/ModalStack.js +16 -17
- package/cjs/lib/ModalStack.js.map +1 -1
- package/cjs/lib/theming/AnimationKeyframes.js +1 -1
- package/cjs/lib/theming/AnimationKeyframes.js.map +1 -1
- package/cjs/lib/theming/useTheme.d.ts +1 -0
- package/cjs/lib/theming/useTheme.js +7 -0
- package/cjs/lib/theming/useTheme.js.map +1 -0
- package/cjs/lib/utils.d.ts +32 -0
- package/cjs/lib/utils.js +62 -2
- package/cjs/lib/utils.js.map +1 -1
- package/cjs/typings/html-props.d.ts +123 -0
- package/components/Autocomplete/Autocomplete.md +7 -7
- package/components/Button/Button/Button.js +3 -7
- package/components/Button/Button/Button.js.map +1 -1
- package/components/Button/Button.d.ts +1 -1
- package/components/Button/Button.styles/Button.styles.js +31 -28
- package/components/Button/Button.styles/Button.styles.js.map +1 -1
- package/components/Button/Button.styles.d.ts +1 -0
- package/components/CurrencyInput/CurrencyInput.md +24 -24
- package/components/CurrencyLabel/CurrencyLabel.md +23 -23
- package/components/DateInput/DateInput.md +106 -106
- package/components/DatePicker/DatePicker.md +307 -307
- package/components/DropdownMenu/DropdownMenu/DropdownMenu.js.map +1 -1
- package/components/DropdownMenu/DropdownMenu.d.ts +2 -2
- package/components/FxInput/FxInput.md +16 -16
- package/components/Gapped/Gapped.md +43 -43
- package/components/Group/Group.md +18 -18
- package/components/Hint/Hint/Hint.js.map +1 -1
- package/components/Hint/Hint.d.ts +2 -1
- package/components/Input/Input.md +13 -13
- package/components/Kebab/Kebab/Kebab.js.map +1 -1
- package/components/Kebab/Kebab.d.ts +2 -2
- package/components/MenuItem/MenuItem/MenuItem.js +2 -7
- package/components/MenuItem/MenuItem/MenuItem.js.map +1 -1
- package/components/MenuItem/MenuItem.d.ts +1 -1
- package/components/Paging/Paging.md +43 -43
- package/components/PasswordInput/PasswordInput.md +9 -9
- package/components/RadioGroup/RadioGroup.md +43 -43
- package/components/ScrollContainer/ScrollBar/ScrollBar.js +6 -2
- package/components/ScrollContainer/ScrollBar/ScrollBar.js.map +1 -1
- package/components/ScrollContainer/ScrollContainer/ScrollContainer.js +2 -1
- package/components/ScrollContainer/ScrollContainer/ScrollContainer.js.map +1 -1
- package/components/ScrollContainer/ScrollContainer.styles/ScrollContainer.styles.js +11 -8
- package/components/ScrollContainer/ScrollContainer.styles/ScrollContainer.styles.js.map +1 -1
- package/components/ScrollContainer/ScrollContainer.styles.d.ts +1 -0
- package/components/Select/Select/Select.js +2 -1
- package/components/Select/Select/Select.js.map +1 -1
- package/components/SidePage/SidePage/SidePage.js +19 -0
- package/components/SidePage/SidePage/SidePage.js.map +1 -1
- package/components/SidePage/SidePage.d.ts +1 -0
- package/components/Spinner/Spinner/Spinner.js +6 -3
- package/components/Spinner/Spinner/Spinner.js.map +1 -1
- package/components/Spinner/Spinner.d.ts +8 -0
- package/components/Spinner/Spinner.md +1 -0
- package/components/Spinner/Spinner.styles/Spinner.styles.js +12 -9
- package/components/Spinner/Spinner.styles/Spinner.styles.js.map +1 -1
- package/components/Spinner/Spinner.styles.d.ts +2 -1
- package/components/Switcher/Switcher.styles/Switcher.styles.js +3 -1
- package/components/Switcher/Switcher.styles/Switcher.styles.js.map +1 -1
- package/components/Tabs/Tabs.md +36 -36
- package/components/Textarea/Textarea.md +25 -25
- package/components/Token/Token.md +112 -112
- package/components/TokenInput/TokenInput.md +79 -79
- package/components/Tooltip/Tooltip/Tooltip.js +2 -2
- package/components/Tooltip/Tooltip/Tooltip.js.map +1 -1
- package/components/Tooltip/Tooltip.d.ts +8 -21
- package/components/TooltipMenu/TooltipMenu/TooltipMenu.js.map +1 -1
- package/components/TooltipMenu/TooltipMenu.d.ts +2 -2
- package/index.d.ts +1 -0
- package/index.js +2 -1
- package/index.js.map +1 -1
- package/internal/DropdownContainer/DropdownContainer/DropdownContainer.js +6 -1
- package/internal/DropdownContainer/DropdownContainer/DropdownContainer.js.map +1 -1
- package/internal/DropdownContainer/DropdownContainer.styles/DropdownContainer.styles.js +10 -0
- package/internal/DropdownContainer/DropdownContainer.styles/DropdownContainer.styles.js.map +1 -0
- package/internal/DropdownContainer/DropdownContainer.styles/package.json +6 -0
- package/internal/DropdownContainer/DropdownContainer.styles.d.ts +3 -0
- package/internal/Menu/Menu/Menu.js +14 -5
- package/internal/Menu/Menu/Menu.js.map +1 -1
- package/internal/Menu/Menu.d.ts +2 -0
- package/internal/Menu/Menu.styles/Menu.styles.js +12 -3
- package/internal/Menu/Menu.styles/Menu.styles.js.map +1 -1
- package/internal/Menu/Menu.styles.d.ts +3 -0
- package/internal/Popup/Popup/Popup.js +3 -2
- package/internal/Popup/Popup/Popup.js.map +1 -1
- package/internal/Popup/Popup.d.ts +5 -4
- package/internal/Popup/PopupHelper/PopupHelper.js.map +1 -1
- package/internal/Popup/PopupHelper.d.ts +2 -2
- package/internal/Popup/types/package.json +6 -0
- package/internal/Popup/types/types.js +0 -0
- package/internal/Popup/types/types.js.map +1 -0
- package/internal/Popup/types.d.ts +1 -0
- package/internal/PopupMenu/PopupMenu/PopupMenu.js +3 -3
- package/internal/PopupMenu/PopupMenu/PopupMenu.js.map +1 -1
- package/internal/PopupMenu/PopupMenu.d.ts +3 -3
- package/internal/PopupMenu/validatePositions/validatePositions.js +2 -2
- package/internal/PopupMenu/validatePositions/validatePositions.js.map +1 -1
- package/internal/PopupMenu/validatePositions.d.ts +2 -2
- package/internal/ThemeShowcase/ThemeShowcase.md +13 -13
- package/internal/icons/SpinnerIcon/SpinnerIcon.js +5 -2
- package/internal/icons/SpinnerIcon/SpinnerIcon.js.map +1 -1
- package/internal/icons/SpinnerIcon.d.ts +4 -1
- package/lib/ModalStack/ModalStack.js +9 -13
- package/lib/ModalStack/ModalStack.js.map +1 -1
- package/lib/theming/AnimationKeyframes/AnimationKeyframes.js +1 -1
- package/lib/theming/AnimationKeyframes/AnimationKeyframes.js.map +1 -1
- package/lib/theming/useTheme/package.json +6 -0
- package/lib/theming/useTheme/useTheme.js +5 -0
- package/lib/theming/useTheme/useTheme.js.map +1 -0
- package/lib/theming/useTheme.d.ts +1 -0
- package/lib/utils/utils.js +66 -0
- package/lib/utils/utils.js.map +1 -1
- package/lib/utils.d.ts +32 -0
- package/package.json +5 -5
- package/typings/html-props.d.ts +123 -0
- package/cjs/internal/PopupMenu/PopupMenuPositions.d.ts +0 -2
- package/cjs/internal/PopupMenu/PopupMenuPositions.js +0 -15
- package/cjs/internal/PopupMenu/PopupMenuPositions.js.map +0 -1
- package/internal/PopupMenu/PopupMenuPositions/PopupMenuPositions.js +0 -1
- package/internal/PopupMenu/PopupMenuPositions/PopupMenuPositions.js.map +0 -1
- package/internal/PopupMenu/PopupMenuPositions/package.json +0 -6
- 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 {
|
|
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":"2JAAA,OAAOA,KAAP,MAAkB,OAAlB;;AAEA,SAASC,YAAT,QAA6B,gCAA7B;AACA,SAASC,YAAT,QAA6B,gCAA7B;;AAEA,SAASC,SAAT,QAA0C,0BAA1C;AACA,SAASC,eAAT,EAA0BC,SAA1B,QAA2C,8BAA3C;;AAEA,SAASC,aAAT,QAA2C,8BAA3C;AACA,SAASC,QAAT,QAAuC,oBAAvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,OAJA;AACA;AACA,GAEA,IAAaC,YAAb,GADCD,QACD;;;;;;;;;AAWE,wBAAYE,KAAZ,EAAsC;AACpC,wCAAMA,KAAN,UADoC,MAH9BC,SAG8B,GAHG,IAGH,OAF9BC,WAE8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsD/BC,IAAAA,IAtD+B,GAsDxB,YAAY;AACxB,UAAI,MAAKF,SAAT,EAAoB;AAClB,cAAKA,SAAL,CAAeE,IAAf;AACD;AACF,KA1DqC;;AA4D/BC,IAAAA,KA5D+B,GA4DvB,YAAY;AACzB,UAAI,MAAKH,SAAT,EAAoB;AAClB,cAAKA,SAAL,CAAeG,KAAf;AACD;AACF,KAhEqC;;AAkE9BC,IAAAA,YAlE8B,GAkEf,UAACC,GAAD,UAA+B,MAAKL,SAAL,GAAiBK,GAAhD,EAlEe;;AAoE9BC,IAAAA,qBApE8B,GAoEN,UAACC,WAAD,EAA0B;AACxD,UAAIA,WAAW,IAAI,MAAKR,KAAL,CAAWS,MAA9B,EAAsC;AACpC,cAAKT,KAAL,CAAWS,MAAX;AACA;AACD;;AAED,UAAI,CAACD,WAAD,IAAgB,MAAKR,KAAL,CAAWU,OAA/B,EAAwC;AACtC,cAAKV,KAAL,CAAWU,OAAX;AACA;AACD;AACF,KA9EqC,CAGpC,IAAI,CAACV,KAAK,CAACW,OAAP,IAAkB,CAAChB,eAAvB,EAAwC,CACtC,MAAM,IAAIiB,KAAJ,CAAU,+BAAV,CAAN,CACD,CALmC,aAMrC,CAjBH,2CAmBSC,MAnBT,GAmBE,kBAAgB,mBACd,oBACE,oBAAC,YAAD,CAAc,QAAd,QACG,UAACC,KAAD,EAAW,CACV,oBACE,oBAAC,YAAD,CAAc,QAAd,IACE,KAAK,EAAErB,YAAY,CAACsB,MAAb,CACL,EACEC,WAAW,EAAE,KADf,EADK,EAILF,KAJK,CADT,IAQG,MAAI,CAACG,UAAL,EARH,CADF,CAYD,CAdH,CADF,CAkBD,CAtCH,QAwCSA,UAxCT,GAwCE,sBAAoB,CAClB,IAAI,CAAC,KAAKjB,KAAL,CAAWW,OAAhB,EAAyB,CACvB,OAAO,IAAP,CACD,CACD,oBACE,oBAAC,aAAD,aAAe,WAAW,EAAE,KAAKT,WAAjC,IAAkD,KAAKF,KAAvD,gBACE,oBAAC,SAAD,IACE,GAAG,EAAE,KAAKK,YADZ,EAEE,OAAO,EAAE,KAAKL,KAAL,CAAWW,OAFtB,EAGE,aAAa,EAAE,KAAKX,KAAL,CAAWkB,aAH5B,EAIE,SAAS,EAAE,KAAKlB,KAAL,CAAWmB,SAJxB,EAKE,iBAAiB,EAAE,KAAKZ,qBAL1B,EAME,WAAW,EAAE,KANf,EAOE,SAAS,EAAE,KAAKP,KAAL,CAAWoB,SAPxB,EAQE,iBAAiB,EAAE,KAAKpB,KAAL,CAAWqB,iBARhC,EASE,MAAM,EAAE,KAAKrB,KAAL,CAAWsB,MATrB,EAUE,MAAM,EAAE,KAAKtB,KAAL,CAAWuB,MAVrB,EAWE,KAAK,EAAE,KAAKvB,KAAL,CAAWwB,KAXpB,IAaG,KAAKxB,KAAL,CAAWyB,QAbd,CADF,CADF,CAmBD,CA/DH,uBAAkClC,KAAK,CAACmC,SAAxC,WACgBC,mBADhB,GACsC,cADtC,UAGgBC,YAHhB,GAG+B,EAC3BP,iBAAiB,EAAEzB,SADQ,EAE3BwB,SAAS,EAAE,CAAC,aAAD,EAAgB,cAAhB,EAAgC,UAAhC,EAA4C,WAA5C,CAFgB,EAH/B","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"]}
|