@skbkontur/react-ui 4.25.2 → 4.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +41 -13
- package/cjs/components/Autocomplete/Autocomplete.md +76 -3
- package/cjs/components/Button/Button.md +38 -11
- package/cjs/components/Calendar/Calendar.md +40 -0
- package/cjs/components/DropdownMenu/DropdownMenu.md +39 -0
- package/cjs/components/FileUploader/FileUploader.d.ts +2 -0
- package/cjs/components/FileUploader/FileUploader.js +32 -9
- package/cjs/components/FileUploader/FileUploader.js.map +1 -1
- package/cjs/components/FileUploader/FileUploader.md +29 -0
- package/cjs/components/ScrollContainer/ScrollContainer.d.ts +1 -0
- package/cjs/components/ScrollContainer/ScrollContainer.js +6 -0
- package/cjs/components/ScrollContainer/ScrollContainer.js.map +1 -1
- package/cjs/hooks/useDrop.d.ts +1 -1
- package/cjs/hooks/useDrop.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.d.ts +5 -2
- package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.js +16 -3
- package/cjs/internal/FileUploaderControl/FileUploaderControlProvider.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.d.ts +1 -0
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.js +4 -2
- package/cjs/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.js.map +1 -1
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.d.ts +1 -0
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.js +3 -2
- package/cjs/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.js.map +1 -1
- package/cjs/internal/RenderContainer/RenderContainer.d.ts +2 -0
- package/cjs/internal/RenderContainer/RenderContainer.js +6 -3
- package/cjs/internal/RenderContainer/RenderContainer.js.map +1 -1
- package/cjs/internal/RenderContainer/RenderInnerContainer.js +3 -2
- package/cjs/internal/RenderContainer/RenderInnerContainer.js.map +1 -1
- package/cjs/internal/ZIndex/ZIndex.d.ts +7 -3
- package/cjs/internal/ZIndex/ZIndex.js +41 -3
- package/cjs/internal/ZIndex/ZIndex.js.map +1 -1
- package/cjs/lib/listenFocusOutside.js +4 -2
- package/cjs/lib/listenFocusOutside.js.map +1 -1
- package/components/Autocomplete/Autocomplete.md +76 -3
- package/components/Button/Button.md +38 -11
- package/components/Calendar/Calendar.md +40 -0
- package/components/DropdownMenu/DropdownMenu.md +39 -0
- package/components/FileUploader/FileUploader/FileUploader.js +30 -8
- package/components/FileUploader/FileUploader/FileUploader.js.map +1 -1
- package/components/FileUploader/FileUploader.d.ts +2 -0
- package/components/FileUploader/FileUploader.md +29 -0
- package/components/ScrollContainer/ScrollContainer/ScrollContainer.js +5 -0
- package/components/ScrollContainer/ScrollContainer/ScrollContainer.js.map +1 -1
- package/components/ScrollContainer/ScrollContainer.d.ts +1 -0
- package/hooks/useDrop/useDrop.js.map +1 -1
- package/hooks/useDrop.d.ts +1 -1
- package/internal/FileUploaderControl/FileUploaderControlProvider/FileUploaderControlProvider.js +12 -3
- package/internal/FileUploaderControl/FileUploaderControlProvider/FileUploaderControlProvider.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderControlProvider.d.ts +5 -2
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile/FileUploaderFile.js +4 -2
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile/FileUploaderFile.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderFile/FileUploaderFile.d.ts +1 -0
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList/FileUploaderFileList.js +4 -2
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList/FileUploaderFileList.js.map +1 -1
- package/internal/FileUploaderControl/FileUploaderFileList/FileUploaderFileList.d.ts +1 -0
- package/internal/RenderContainer/RenderContainer/RenderContainer.js +3 -1
- package/internal/RenderContainer/RenderContainer/RenderContainer.js.map +1 -1
- package/internal/RenderContainer/RenderContainer.d.ts +2 -0
- package/internal/RenderContainer/RenderInnerContainer/RenderInnerContainer.js +5 -4
- package/internal/RenderContainer/RenderInnerContainer/RenderInnerContainer.js.map +1 -1
- package/internal/ZIndex/ZIndex/ZIndex.js +55 -7
- package/internal/ZIndex/ZIndex/ZIndex.js.map +1 -1
- package/internal/ZIndex/ZIndex.d.ts +7 -3
- package/lib/listenFocusOutside/listenFocusOutside.js +3 -2
- package/lib/listenFocusOutside/listenFocusOutside.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [4.26.0](https://github.com/skbkontur/retail-ui/compare/@skbkontur/react-ui@4.25.2...@skbkontur/react-ui@4.26.0) (2024-08-20)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **FileUploader:** correct event type ([aaf3422](https://github.com/skbkontur/retail-ui/commit/aaf3422a849e3b3fef81d8656031bc66412e06ca))
|
|
12
|
+
* **FileUploader:** work with sync mode ([82a7a3c](https://github.com/skbkontur/retail-ui/commit/82a7a3c5d95d3b132d39a333cec515c3b0d28bfb))
|
|
13
|
+
* **ScrollContainer:** new prop 'scrollRef' ([#3476](https://github.com/skbkontur/retail-ui/issues/3476)) ([d066e35](https://github.com/skbkontur/retail-ui/commit/d066e35d7a4d4c8e273e0b382a475a217b7386fc))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* **FileUploader:** initial state for files ([b735a83](https://github.com/skbkontur/retail-ui/commit/b735a834c4d6736f9d05289ac4b3e4c7f132de43))
|
|
19
|
+
* **ZIndex:** partially support several React roots ([#3478](https://github.com/skbkontur/retail-ui/issues/3478)) ([6c87630](https://github.com/skbkontur/retail-ui/commit/6c87630368219fd3b32d5e5dfc67704f3b29ad99))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
## [4.25.2](https://github.com/skbkontur/retail-ui/compare/@skbkontur/react-ui@4.25.1...@skbkontur/react-ui@4.25.2) (2024-07-16)
|
|
7
26
|
|
|
8
27
|
|
package/README.md
CHANGED
|
@@ -23,16 +23,17 @@ const MyApp = () => (
|
|
|
23
23
|
|
|
24
24
|
### Хотим другой цвет кнопки!
|
|
25
25
|
|
|
26
|
-
Нужно использовать [ThemeContext](https://tech.skbkontur.ru/react-ui/#/Customization/ThemeContext). Список переменных
|
|
26
|
+
Нужно использовать [ThemeContext](https://tech.skbkontur.ru/react-ui/#/Customization/ThemeContext). Список переменных
|
|
27
|
+
можно глянуть в [ThemeShowcase](https://tech.skbkontur.ru/react-ui/#/Customization/ThemeShowcase)
|
|
27
28
|
|
|
28
29
|
### StrictMode
|
|
29
30
|
|
|
30
|
-
Начиная с версий `@skbkontur/react-ui@3.10.0` и `@skbkontur/react-ui-validations@1.7.0`, библиотека поддерживает работу
|
|
31
|
+
Начиная с версий `@skbkontur/react-ui@3.10.0` и `@skbkontur/react-ui-validations@1.7.0`, библиотека поддерживает работу
|
|
32
|
+
в React.StrictMode.
|
|
31
33
|
|
|
32
|
-
Некоторым компонентам библиотеки необходимо иметь доступ до корневой DOM-ноды своих
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
требования к компонентам, передаваемым в Hint, Tooltip, Popup или Tab:
|
|
34
|
+
Некоторым компонентам библиотеки необходимо иметь доступ до корневой DOM-ноды своих children. Ранее для этого
|
|
35
|
+
использовался метод findDomNode, который в StrictMode запрещён. Теперь получение DOM-ноды реализовано в библиотеке через
|
|
36
|
+
ref, из-за чего появились некоторые требования к компонентам, передаваемым в Hint, Tooltip, Popup или Tab:
|
|
36
37
|
|
|
37
38
|
- при передаче функциональных компонентов, они должны использовать `React.ForwardRef`:
|
|
38
39
|
|
|
@@ -46,19 +47,20 @@ const CustomFunctionComponent = React.forwardRef(
|
|
|
46
47
|
export const WithFunctionChildren = () => (
|
|
47
48
|
<React.StrictMode>
|
|
48
49
|
<Hint pos="top" text="Something will never be changed" manual opened>
|
|
49
|
-
<CustomFunctionComponent
|
|
50
|
+
<CustomFunctionComponent/>
|
|
50
51
|
</Hint>
|
|
51
52
|
</React.StrictMode>
|
|
52
53
|
);
|
|
53
54
|
```
|
|
54
55
|
|
|
55
|
-
- при использовании хука `useImperativeHandle`, возвращаемый объект должен реализовывать метод `getRootNode`,
|
|
56
|
+
- при использовании хука `useImperativeHandle`, возвращаемый объект должен реализовывать метод `getRootNode`,
|
|
57
|
+
возвращающий DOM-ноду:
|
|
56
58
|
|
|
57
59
|
```js static
|
|
58
60
|
import { Hint } from '@skbkontur/react-ui';
|
|
59
61
|
|
|
60
62
|
const ImperativeHandleComponent = React.forwardRef(function FN(_, ref) {
|
|
61
|
-
const rootNode = React.useRef<HTMLDivElement>(null);
|
|
63
|
+
const rootNode = React.useRef < HTMLDivElement > (null);
|
|
62
64
|
React.useImperativeHandle(ref, () => ({
|
|
63
65
|
foo: 'bar',
|
|
64
66
|
getRootNode: () => rootNode.current,
|
|
@@ -69,7 +71,7 @@ const ImperativeHandleComponent = React.forwardRef(function FN(_, ref) {
|
|
|
69
71
|
export const WithImperativeHandleChildren = () => (
|
|
70
72
|
<React.StrictMode>
|
|
71
73
|
<Hint pos="top" text="Something will never be changed" manual opened>
|
|
72
|
-
<ImperativeHandleComponent
|
|
74
|
+
<ImperativeHandleComponent/>
|
|
73
75
|
</Hint>
|
|
74
76
|
</React.StrictMode>
|
|
75
77
|
);
|
|
@@ -95,7 +97,7 @@ class CustomClassComponent extends React.Component {
|
|
|
95
97
|
export const WithClassChildren = () => (
|
|
96
98
|
<React.StrictMode>
|
|
97
99
|
<Hint pos="top" text="Something will never be changed" manual opened>
|
|
98
|
-
<CustomClassComponent
|
|
100
|
+
<CustomClassComponent/>
|
|
99
101
|
</Hint>
|
|
100
102
|
</React.StrictMode>
|
|
101
103
|
);
|
|
@@ -107,6 +109,29 @@ export const WithClassChildren = () => (
|
|
|
107
109
|
|
|
108
110
|
## FAQ
|
|
109
111
|
|
|
112
|
+
### Выпадашки и несколько react-рутов
|
|
113
|
+
|
|
114
|
+
Реакт позволяет создавать рут внутри рута. Но контекст между ними не прокидывается. Это вызывает проблемы в работе
|
|
115
|
+
различных выпадашек, типа `Tooltip`, `Select`, `Modal` и других.
|
|
116
|
+
|
|
117
|
+
В версии `4.26.0` появился мехнизм, который решает большинство этих проблем. Если вложенный реакт-рут является виджетом,
|
|
118
|
+
то будет достаточно обновить библиотеку только в нём.
|
|
119
|
+
|
|
120
|
+
Однако, при удалении html-элемента, который был реакт-рутом, его необходимо предварительно явно размонтировать:
|
|
121
|
+
|
|
122
|
+
```tsx static
|
|
123
|
+
React.useLayoutEffect(
|
|
124
|
+
() => () => {
|
|
125
|
+
if (React.version === 17) {
|
|
126
|
+
rootRef.current && ReactDOM.unmountComponentAtNode(rootRef.current);
|
|
127
|
+
} else if (React.version === 18) {
|
|
128
|
+
setTimeout(() => reactRoot.current?.unmount());
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
[],
|
|
132
|
+
);
|
|
133
|
+
```
|
|
134
|
+
|
|
110
135
|
### Отключение анимаций во время тестирования
|
|
111
136
|
|
|
112
137
|
Анимации в компонентах отключаются любой из следующих глобальных переменных:
|
|
@@ -121,11 +146,14 @@ process.env.STORYBOOK_REACT_UI_TEST
|
|
|
121
146
|
|
|
122
147
|
### Прокидывание className и style компонентам
|
|
123
148
|
|
|
124
|
-
Начиная с версии 2.14.0, стало возможным передавать в компоненты свои css-классы для дополнительной стилизации. Однако,
|
|
149
|
+
Начиная с версии 2.14.0, стало возможным передавать в компоненты свои css-классы для дополнительной стилизации. Однако,
|
|
150
|
+
не стоит пользоваться этой возможностью для вмешательства во внутренние стили компонентов. Верстка компонентов может
|
|
151
|
+
быть изменена в любой момент без предупреждения, что приведет к поломке ваших переопределенных стилей.
|
|
125
152
|
|
|
126
153
|
### Мобильная верстка
|
|
127
154
|
|
|
128
|
-
С версии 4.0 многие компоненты умеют адаптироваться под мобильные устройства. Подробнее об управлении этим поведением
|
|
155
|
+
С версии 4.0 многие компоненты умеют адаптироваться под мобильные устройства. Подробнее об управлении этим поведением
|
|
156
|
+
в [MOBILES.md](https://github.com/skbkontur/retail-ui/blob/master/packages/react-ui/MOBILES.md).
|
|
129
157
|
|
|
130
158
|
### Помощь в развитии
|
|
131
159
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
```jsx harmony
|
|
2
|
+
import { Autocomplete } from '@skbkontur/react-ui';
|
|
3
|
+
|
|
2
4
|
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
3
5
|
|
|
4
6
|
const [value, setValue] = React.useState('Kappa');
|
|
@@ -6,9 +8,9 @@ const [value, setValue] = React.useState('Kappa');
|
|
|
6
8
|
<Autocomplete source={items} value={value} onValueChange={setValue} />;
|
|
7
9
|
```
|
|
8
10
|
|
|
9
|
-
Очистить значение в `Autocomplete` можно только с помощью пустой
|
|
11
|
+
Очистить значение в `Autocomplete` можно только с помощью пустой строки.
|
|
10
12
|
```jsx harmony
|
|
11
|
-
import { Button, Group } from '@skbkontur/react-ui';
|
|
13
|
+
import { Autocomplete, Button, Group } from '@skbkontur/react-ui';
|
|
12
14
|
|
|
13
15
|
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
14
16
|
|
|
@@ -22,7 +24,7 @@ const [value, setValue] = React.useState('Kappa');
|
|
|
22
24
|
|
|
23
25
|
У Autocomplete есть 3 стандартных размера.
|
|
24
26
|
```jsx harmony
|
|
25
|
-
import { Gapped } from '@skbkontur/react-ui';
|
|
27
|
+
import { Autocomplete, Gapped } from '@skbkontur/react-ui';
|
|
26
28
|
|
|
27
29
|
const items = ['Маленький', 'Средний', 'Большой'];
|
|
28
30
|
|
|
@@ -36,3 +38,74 @@ const [valueLarge, setValueLarge] = React.useState('Большой');
|
|
|
36
38
|
<Autocomplete source={items} value={valueLarge} onValueChange={setValueLarge} size={'large'} />
|
|
37
39
|
</Gapped>
|
|
38
40
|
```
|
|
41
|
+
|
|
42
|
+
Можно выделять введеное значение при фокусе.
|
|
43
|
+
```jsx harmony
|
|
44
|
+
import { Autocomplete } from '@skbkontur/react-ui';
|
|
45
|
+
|
|
46
|
+
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
47
|
+
|
|
48
|
+
const [value, setValue] = React.useState('');
|
|
49
|
+
|
|
50
|
+
<Autocomplete source={items} value={value} onValueChange={setValue} selectAllOnFocus />
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Расположение иконки слева и справа.
|
|
54
|
+
```jsx harmony
|
|
55
|
+
import { Autocomplete, Gapped } from '@skbkontur/react-ui';
|
|
56
|
+
import { SearchLoupeIcon16Regular } from '@skbkontur/icons/SearchLoupeIcon16Regular';
|
|
57
|
+
|
|
58
|
+
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
59
|
+
|
|
60
|
+
const [valueLeft, setValueLeft] = React.useState('');
|
|
61
|
+
const [valueRight, setValueRight] = React.useState('');
|
|
62
|
+
|
|
63
|
+
<Gapped>
|
|
64
|
+
<Autocomplete source={items} value={valueLeft} onValueChange={setValueLeft} leftIcon={<SearchLoupeIcon16Regular />} />
|
|
65
|
+
<Autocomplete source={items} value={valueRight} onValueChange={setValueRight} rightIcon={<SearchLoupeIcon16Regular />} />
|
|
66
|
+
</Gapped>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Изменение ширины меню.
|
|
70
|
+
```jsx harmony
|
|
71
|
+
import { Autocomplete } from '@skbkontur/react-ui';
|
|
72
|
+
|
|
73
|
+
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
74
|
+
|
|
75
|
+
const [value, setValue] = React.useState('');
|
|
76
|
+
|
|
77
|
+
<Autocomplete source={items} value={value} onValueChange={setValue} menuWidth={'80%'} />
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Расположение выпадающего окна Autocomplete.
|
|
81
|
+
```jsx harmony
|
|
82
|
+
import { Autocomplete } from '@skbkontur/react-ui';
|
|
83
|
+
|
|
84
|
+
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
85
|
+
|
|
86
|
+
const [value, setValue] = React.useState('');
|
|
87
|
+
|
|
88
|
+
<Autocomplete source={items} value={value} onValueChange={setValue} menuPos={'top'} />
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Отрисовка тени у выпадающего меню.
|
|
92
|
+
```jsx harmony
|
|
93
|
+
import { Autocomplete } from '@skbkontur/react-ui';
|
|
94
|
+
|
|
95
|
+
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
96
|
+
|
|
97
|
+
const [value, setValue] = React.useState('');
|
|
98
|
+
|
|
99
|
+
<Autocomplete source={items} value={value} onValueChange={setValue} hasShadow />
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Использование режима прозрачной рамки.
|
|
103
|
+
```jsx harmony
|
|
104
|
+
import { Autocomplete } from '@skbkontur/react-ui';
|
|
105
|
+
|
|
106
|
+
const items = ['Grey Face', 'Grey Space', 'Kappa', 'Keepo', 'Resident Sleeper'];
|
|
107
|
+
|
|
108
|
+
const [value, setValue] = React.useState('Kappa');
|
|
109
|
+
|
|
110
|
+
<Autocomplete source={items} value={value} onValueChange={setValue} borderless />
|
|
111
|
+
```
|
|
@@ -60,15 +60,15 @@ import { XIcon16Regular } from '@skbkontur/icons/XIcon16Regular';
|
|
|
60
60
|
|
|
61
61
|
```jsx harmony
|
|
62
62
|
<div
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
style={{
|
|
64
|
+
display: "flex",
|
|
65
|
+
alignItems: "end",
|
|
66
|
+
gap: '10px',
|
|
67
|
+
}}
|
|
68
|
+
>
|
|
69
|
+
<Button size="small">Маленькая</Button>
|
|
70
|
+
<Button size="medium">Средняя</Button>
|
|
71
|
+
<Button size="large">Большая</Button>
|
|
72
72
|
</div>
|
|
73
73
|
```
|
|
74
74
|
|
|
@@ -133,7 +133,7 @@ const handleClick = () => {
|
|
|
133
133
|
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
Пример кнопки с пропом `theme
|
|
136
|
+
Пример кнопки с пропом `theme`.
|
|
137
137
|
|
|
138
138
|
```jsx harmony
|
|
139
139
|
import { Button, Gapped } from '@skbkontur/react-ui';
|
|
@@ -146,7 +146,7 @@ import { Button, Gapped } from '@skbkontur/react-ui';
|
|
|
146
146
|
```
|
|
147
147
|
|
|
148
148
|
|
|
149
|
-
Пример кастомизации
|
|
149
|
+
Пример кастомизации кнопки-ссылки.
|
|
150
150
|
|
|
151
151
|
```jsx harmony
|
|
152
152
|
import { Toast } from "@skbkontur/react-ui";
|
|
@@ -212,3 +212,30 @@ const renderExampleRow = (title, styles, index) => {
|
|
|
212
212
|
{renderExampleRow('Изменение цвета ссылки', differentColorStyles)}
|
|
213
213
|
</table>
|
|
214
214
|
```
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
Кнопка может быть узкой.
|
|
218
|
+
|
|
219
|
+
```jsx harmony
|
|
220
|
+
import { Button } from '@skbkontur/react-ui';
|
|
221
|
+
|
|
222
|
+
<Button narrow>
|
|
223
|
+
Создать отчет
|
|
224
|
+
</Button>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
У кнопки есть состояния валидации.
|
|
229
|
+
|
|
230
|
+
```jsx harmony
|
|
231
|
+
import { Button, Gapped } from '@skbkontur/react-ui';
|
|
232
|
+
|
|
233
|
+
<Gapped gap={5}>
|
|
234
|
+
<Button warning>
|
|
235
|
+
Warning
|
|
236
|
+
</Button>
|
|
237
|
+
<Button error>
|
|
238
|
+
Error
|
|
239
|
+
</Button>
|
|
240
|
+
</Gapped>
|
|
241
|
+
```
|
|
@@ -106,6 +106,8 @@ const theme = React.useContext(ThemeContext);
|
|
|
106
106
|
|
|
107
107
|
### Кастомный рендер дня
|
|
108
108
|
|
|
109
|
+
Для кастомнизации дней в календаре используется метод `renderDay` и компонент [Calendar.Day](#/Components/Calendar/Calendar.Day)
|
|
110
|
+
|
|
109
111
|
```jsx harmony
|
|
110
112
|
import { Tooltip, Hint, CalendarDay } from '@skbkontur/react-ui';
|
|
111
113
|
|
|
@@ -144,6 +146,44 @@ const renderDay = (props) => {
|
|
|
144
146
|
/>;
|
|
145
147
|
```
|
|
146
148
|
|
|
149
|
+
### Календарь с ценами
|
|
150
|
+
|
|
151
|
+
Пример с кастомизацией темы и кастомным рендером дня
|
|
152
|
+
|
|
153
|
+
```jsx harmony
|
|
154
|
+
import { ThemeContext, ThemeFactory, CalendarDay } from '@skbkontur/react-ui';
|
|
155
|
+
|
|
156
|
+
const theme = React.useContext(ThemeContext);
|
|
157
|
+
|
|
158
|
+
function renderDay(props) {
|
|
159
|
+
const [date, month] = props.date.split('.').map(Number);
|
|
160
|
+
const randomDay = date % 6 === 0 || date % 7 === 0 || date % 8 === 0;
|
|
161
|
+
const randomPrice = Math.round((date / month) * 1000);
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<CalendarDay {...props}>
|
|
165
|
+
<div style={{ fontSize: theme.calendarCellFontSize }}>{date}</div>
|
|
166
|
+
<div style={{ fontSize: '11px', fontFeatureSettings: 'tnum', fontVariantNumeric: 'tabular-nums' }}>
|
|
167
|
+
{randomDay ? <>{randomPrice} ₽</> : <span style={{ color: theme.tokenTextColorDisabled }}>—</span>}
|
|
168
|
+
</div>
|
|
169
|
+
</CalendarDay>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const [value, setValue] = React.useState(null);
|
|
174
|
+
|
|
175
|
+
<ThemeContext.Provider
|
|
176
|
+
value={ThemeFactory.create({
|
|
177
|
+
calendarCellSize: '56px',
|
|
178
|
+
calendarCellLineHeight: '1.5',
|
|
179
|
+
calendarWrapperHeight: '600px',
|
|
180
|
+
calendarCellBorderRadius: '8px'
|
|
181
|
+
}, theme)}
|
|
182
|
+
>
|
|
183
|
+
<Calendar value={value} renderDay={renderDay} onValueChange={setValue} />
|
|
184
|
+
</ThemeContext.Provider>
|
|
185
|
+
```
|
|
186
|
+
|
|
147
187
|
#### Локали по умолчанию
|
|
148
188
|
|
|
149
189
|
```typescript static
|
|
@@ -247,3 +247,42 @@ const hiddenItems = [
|
|
|
247
247
|
</DropdownMenu>
|
|
248
248
|
</Gapped>
|
|
249
249
|
```
|
|
250
|
+
|
|
251
|
+
С использованием фиче-флага menuItemsAtAnyLevel. Mожно использовать различные обертки для пунктов меню.
|
|
252
|
+
|
|
253
|
+
```jsx harmony
|
|
254
|
+
import {
|
|
255
|
+
DropdownMenu,
|
|
256
|
+
Button,
|
|
257
|
+
MenuHeader,
|
|
258
|
+
MenuItem,
|
|
259
|
+
MenuSeparator,
|
|
260
|
+
ReactUIFeatureFlagsContext,
|
|
261
|
+
Gapped
|
|
262
|
+
} from '@skbkontur/react-ui';
|
|
263
|
+
|
|
264
|
+
const groupedMenuItems = (
|
|
265
|
+
<div>
|
|
266
|
+
<MenuItem>MenuItem1</MenuItem>
|
|
267
|
+
<MenuItem>MenuItem2</MenuItem>
|
|
268
|
+
<MenuItem isNotSelectable>Not Selectable</MenuItem>
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
<Gapped>
|
|
273
|
+
<ReactUIFeatureFlagsContext.Provider value={{ menuItemsAtAnyLevel: true }}>
|
|
274
|
+
<DropdownMenu caption={<Button use="primary">Открыть меню</Button>}>
|
|
275
|
+
<>
|
|
276
|
+
<MenuHeader>Заголовок меню</MenuHeader>
|
|
277
|
+
<MenuSeparator />
|
|
278
|
+
<div>
|
|
279
|
+
{groupedMenuItems}
|
|
280
|
+
</div>
|
|
281
|
+
</>
|
|
282
|
+
<MenuItem>MenuItem3</MenuItem>
|
|
283
|
+
</DropdownMenu>
|
|
284
|
+
</ReactUIFeatureFlagsContext.Provider>
|
|
285
|
+
</Gapped>;
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
|
|
@@ -11,6 +11,8 @@ import { SizeProp } from '../../lib/types/props';
|
|
|
11
11
|
export declare type FileUploaderSize = SizeProp;
|
|
12
12
|
declare type FileUploaderOverriddenProps = 'size';
|
|
13
13
|
interface _FileUploaderProps extends CommonProps, Omit<React.InputHTMLAttributes<HTMLInputElement>, FileUploaderOverriddenProps> {
|
|
14
|
+
/** Начальное состояние загруженных файлов */
|
|
15
|
+
initialFiles?: File[];
|
|
14
16
|
/** Состояние ошибки всего контрола */
|
|
15
17
|
error?: boolean;
|
|
16
18
|
/** Состояние предупреждения всего контрола */
|
|
@@ -26,7 +26,7 @@ var _forwardRefAndName = require("../../lib/forwardRefAndName");
|
|
|
26
26
|
var _FocusControlWrapper = require("../../internal/FocusControlWrapper");
|
|
27
27
|
|
|
28
28
|
var _UploadIcon = require("./UploadIcon");
|
|
29
|
-
var _FileUploader2 = require("./FileUploader.styles");var _excluded = ["disabled", "error", "warning", "multiple", "width", "hideFiles", "onBlur", "onFocus", "onChange", "request", "validateBeforeUpload", "onRequestSuccess", "onRequestError", "size", "renderFile"];
|
|
29
|
+
var _FileUploader2 = require("./FileUploader.styles");var _excluded = ["initialFiles", "disabled", "error", "warning", "multiple", "width", "hideFiles", "onBlur", "onFocus", "onChange", "request", "validateBeforeUpload", "onRequestSuccess", "onRequestError", "size", "renderFile"];
|
|
30
30
|
|
|
31
31
|
var stopPropagation = function stopPropagation(e) {return e.stopPropagation();};
|
|
32
32
|
|
|
@@ -80,6 +80,8 @@ var stopPropagation = function stopPropagation(e) {return e.stopPropagation();};
|
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
|
|
83
|
+
|
|
84
|
+
|
|
83
85
|
|
|
84
86
|
|
|
85
87
|
|
|
@@ -97,7 +99,8 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
97
99
|
var _isTheme2022 = (0, _ThemeHelpers.isTheme2022)(theme);
|
|
98
100
|
|
|
99
101
|
var
|
|
100
|
-
|
|
102
|
+
initialFiles =
|
|
103
|
+
|
|
101
104
|
|
|
102
105
|
|
|
103
106
|
|
|
@@ -113,7 +116,7 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
113
116
|
|
|
114
117
|
|
|
115
118
|
|
|
116
|
-
props.disabled,error = props.error,warning = props.warning,_props$multiple = props.multiple,multiple = _props$multiple === void 0 ? false : _props$multiple,_props$width = props.width,width = _props$width === void 0 ? theme.fileUploaderWidth : _props$width,_props$hideFiles = props.hideFiles,hideFiles = _props$hideFiles === void 0 ? false : _props$hideFiles,onBlur = props.onBlur,onFocus = props.onFocus,onChange = props.onChange,request = props.request,validateBeforeUpload = props.validateBeforeUpload,onRequestSuccess = props.onRequestSuccess,onRequestError = props.onRequestError,_props$size = props.size,size = _props$size === void 0 ? 'small' : _props$size,_props$renderFile = props.renderFile,renderFile = _props$renderFile === void 0 ? defaultRenderFile : _props$renderFile,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
|
|
119
|
+
props.initialFiles,disabled = props.disabled,error = props.error,warning = props.warning,_props$multiple = props.multiple,multiple = _props$multiple === void 0 ? false : _props$multiple,_props$width = props.width,width = _props$width === void 0 ? theme.fileUploaderWidth : _props$width,_props$hideFiles = props.hideFiles,hideFiles = _props$hideFiles === void 0 ? false : _props$hideFiles,onBlur = props.onBlur,onFocus = props.onFocus,onChange = props.onChange,request = props.request,validateBeforeUpload = props.validateBeforeUpload,onRequestSuccess = props.onRequestSuccess,onRequestError = props.onRequestError,_props$size = props.size,size = _props$size === void 0 ? 'small' : _props$size,_props$renderFile = props.renderFile,renderFile = _props$renderFile === void 0 ? defaultRenderFile : _props$renderFile,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
|
|
117
120
|
|
|
118
121
|
var _useContext =
|
|
119
122
|
(0, _react.useContext)(_FileUploaderControlContext.FileUploaderControlContext),files = _useContext.files,setFiles = _useContext.setFiles,removeFile = _useContext.removeFile,reset = _useContext.reset,setFileValidationResult = _useContext.setFileValidationResult,isMinLengthReached = _useContext.isMinLengthReached;
|
|
@@ -165,7 +168,7 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
165
168
|
/** common part **/
|
|
166
169
|
var handleChange = (0, _react.useCallback)(
|
|
167
170
|
function (newFiles) {
|
|
168
|
-
if (!newFiles) {
|
|
171
|
+
if (!newFiles || !newFiles.length) {
|
|
169
172
|
return;
|
|
170
173
|
}
|
|
171
174
|
|
|
@@ -255,6 +258,16 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
255
258
|
}
|
|
256
259
|
};
|
|
257
260
|
|
|
261
|
+
var handleRemoveFile = (0, _react.useCallback)(function (fileId) {
|
|
262
|
+
var dataTransfer = new DataTransfer();
|
|
263
|
+
files.
|
|
264
|
+
filter(function (f) {return f.id !== fileId;}).
|
|
265
|
+
forEach(function (file) {
|
|
266
|
+
dataTransfer.items.add(file.originalFile);
|
|
267
|
+
});
|
|
268
|
+
inputRef.current && (inputRef.current.files = dataTransfer.files);
|
|
269
|
+
}, []);
|
|
270
|
+
|
|
258
271
|
var _useState3 = (0, _react.useState)(false),hovered = _useState3[0],setHovered = _useState3[1];
|
|
259
272
|
|
|
260
273
|
var uploadButtonClassNames = (0, _Emotion.cx)(
|
|
@@ -291,6 +304,16 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
291
304
|
setIsLinkVisible(hasOneFileForSingle ? !isMinLengthReached : true);
|
|
292
305
|
}, [isMinLengthReached, hasOneFileForSingle]);
|
|
293
306
|
|
|
307
|
+
(0, _react.useEffect)(function () {
|
|
308
|
+
if (!files || !files.length || !inputRef.current) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
var dataTransfer = new DataTransfer();
|
|
313
|
+
files.forEach(function (file) {return dataTransfer.items.add(file.originalFile);});
|
|
314
|
+
inputRef.current.files = dataTransfer.files;
|
|
315
|
+
}, []);
|
|
316
|
+
|
|
294
317
|
var rootNodeRef = (0, _react.useRef)(null);
|
|
295
318
|
|
|
296
319
|
var iconSizes = {
|
|
@@ -308,7 +331,9 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
308
331
|
style: (0, _useMemoObject.useMemoObject)({ width: width }),
|
|
309
332
|
ref: rootNodeRef },
|
|
310
333
|
|
|
311
|
-
!hideFiles && !isSingleMode && !!files.length && /*#__PURE__*/
|
|
334
|
+
!hideFiles && !isSingleMode && !!files.length && /*#__PURE__*/
|
|
335
|
+
_react.default.createElement(_FileUploaderFileList.FileUploaderFileList, { renderFile: renderFile, size: size, onRemove: handleRemoveFile }), /*#__PURE__*/
|
|
336
|
+
|
|
312
337
|
_react.default.createElement("div", { className: uploadButtonWrapperClassNames }, /*#__PURE__*/
|
|
313
338
|
_react.default.createElement("label", {
|
|
314
339
|
onMouseEnter: function onMouseEnter() {return setHovered(true);},
|
|
@@ -334,7 +359,7 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
334
359
|
|
|
335
360
|
hasOneFileForSingle ? /*#__PURE__*/
|
|
336
361
|
_react.default.createElement("div", { ref: fileDivRef, className: _FileUploader2.jsStyles.singleFile() },
|
|
337
|
-
renderFile(files[0], /*#__PURE__*/_react.default.createElement(_FileUploaderFile.FileUploaderFile, { file: files[0], size: size }))) : /*#__PURE__*/
|
|
362
|
+
renderFile(files[0], /*#__PURE__*/_react.default.createElement(_FileUploaderFile.FileUploaderFile, { file: files[0], size: size, onRemove: handleRemoveFile }))) : /*#__PURE__*/
|
|
338
363
|
|
|
339
364
|
|
|
340
365
|
_react.default.createElement(_react.default.Fragment, null,
|
|
@@ -357,9 +382,7 @@ var _FileUploader = (0, _forwardRefAndName.forwardRefAndName)('FileUploader', fu
|
|
|
357
382
|
onClick: stopPropagation,
|
|
358
383
|
onChange: handleInputChange,
|
|
359
384
|
onFocus: handleFocus,
|
|
360
|
-
onBlur: handleBlur
|
|
361
|
-
// для того, чтобы срабатывало событие change при выборе одного и того же файла подряд
|
|
362
|
-
, value: '' }))))))));
|
|
385
|
+
onBlur: handleBlur }))))))));
|
|
363
386
|
|
|
364
387
|
|
|
365
388
|
|