@ozen-ui/kit 0.12.0 → 0.13.1
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/__inner__/cjs/components/DataList/DataList.css +55 -28
- package/__inner__/cjs/components/DataList/DataList.d.ts +2 -2
- package/__inner__/cjs/components/DataList/DataList.js +62 -24
- package/__inner__/cjs/components/DataList/DataListProvider.d.ts +8 -10
- package/__inner__/cjs/components/DataList/DataListProvider.js +0 -2
- package/__inner__/cjs/components/DataList/components/DataListOption.d.ts +5 -18
- package/__inner__/cjs/components/DataList/components/DataListOption.js +14 -22
- package/__inner__/cjs/components/DataList/types.d.ts +19 -12
- package/__inner__/cjs/components/DataList/types.js +5 -0
- package/__inner__/cjs/components/DataList/useDataListNavigation.d.ts +15 -6
- package/__inner__/cjs/components/DataList/useDataListNavigation.js +68 -21
- package/__inner__/cjs/components/FieldControl/FieldControl.css +0 -15
- package/__inner__/cjs/components/Input/Input.css +0 -7
- package/__inner__/cjs/components/Input/Input.js +5 -5
- package/__inner__/cjs/components/Input/types.d.ts +3 -3
- package/__inner__/cjs/components/InputNumber/InputNumber.js +10 -10
- package/__inner__/cjs/components/InputNumber/types.d.ts +2 -0
- package/__inner__/cjs/components/Textarea/types.d.ts +1 -3
- package/__inner__/cjs/hooks/useControlled/useControlled.js +3 -3
- package/__inner__/esm/components/DataList/DataList.css +55 -28
- package/__inner__/esm/components/DataList/DataList.d.ts +2 -2
- package/__inner__/esm/components/DataList/DataList.js +63 -25
- package/__inner__/esm/components/DataList/DataListProvider.d.ts +8 -10
- package/__inner__/esm/components/DataList/DataListProvider.js +0 -2
- package/__inner__/esm/components/DataList/components/DataListOption.d.ts +5 -18
- package/__inner__/esm/components/DataList/components/DataListOption.js +16 -23
- package/__inner__/esm/components/DataList/types.d.ts +19 -12
- package/__inner__/esm/components/DataList/types.js +2 -1
- package/__inner__/esm/components/DataList/useDataListNavigation.d.ts +15 -6
- package/__inner__/esm/components/DataList/useDataListNavigation.js +69 -22
- package/__inner__/esm/components/FieldControl/FieldControl.css +0 -15
- package/__inner__/esm/components/Input/Input.css +0 -7
- package/__inner__/esm/components/Input/Input.js +5 -5
- package/__inner__/esm/components/Input/types.d.ts +3 -3
- package/__inner__/esm/components/InputNumber/InputNumber.js +10 -10
- package/__inner__/esm/components/InputNumber/types.d.ts +2 -0
- package/__inner__/esm/components/Textarea/types.d.ts +1 -3
- package/__inner__/esm/hooks/useControlled/useControlled.js +3 -3
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
.DataList {
|
|
2
|
-
|
|
3
|
-
}
|
|
4
|
-
|
|
1
|
+
.DataList-List {
|
|
2
|
+
--scroll-bar-size: 12px;
|
|
3
|
+
}
|
|
4
|
+
.DataList-List::-webkit-scrollbar {
|
|
5
5
|
inline-size: var(--scroll-bar-size);
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
.DataList-List::-webkit-scrollbar-thumb {
|
|
8
8
|
background-color: var(--color-background-secondary);
|
|
9
9
|
border-radius: calc(var(--scroll-bar-size) / 2);
|
|
10
10
|
border: calc(var(--scroll-bar-size) / 4) solid transparent;
|
|
@@ -12,56 +12,83 @@
|
|
|
12
12
|
border-image: initial;
|
|
13
13
|
min-block-size: 24px;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
.DataList::-webkit-scrollbar-thumb:active {
|
|
15
|
+
.DataList-List::-webkit-scrollbar-thumb:hover,
|
|
16
|
+
.DataList-List::-webkit-scrollbar-thumb:active {
|
|
17
17
|
border: calc(var(--scroll-bar-size) / 4) solid transparent;
|
|
18
18
|
background-clip: padding-box;
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
.DataList-List::-webkit-scrollbar-thumb:hover {
|
|
21
21
|
background-color: var(--color-background-secondary-hover);
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
.DataList-List::-webkit-scrollbar-thumb:active {
|
|
24
24
|
background-color: var(--color-background-secondary-pressed);
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
.DataList-List::-webkit-scrollbar-corner {
|
|
27
27
|
background: transparent;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
max-block-size: 40vb;
|
|
29
|
+
.DataList-List {
|
|
30
|
+
overflow: hidden auto;
|
|
31
|
+
max-block-size: 40vb;
|
|
33
32
|
}
|
|
34
|
-
|
|
35
33
|
.DataList-Option {
|
|
36
34
|
cursor: pointer;
|
|
37
35
|
}
|
|
38
|
-
|
|
39
|
-
.DataList-Option:not(.DataList-Option_disabled).DataList-Option_highlighted {
|
|
40
|
-
background-color: var(--color-background-main-hover);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.DataList-Option:not(.DataList-Option_disabled).DataList-Option_outlined {
|
|
36
|
+
.DataList-Option_focused {
|
|
44
37
|
box-shadow: inset var(--shadow-outline-focused);
|
|
45
38
|
}
|
|
46
|
-
|
|
39
|
+
.DataList-Option_highlighted {
|
|
40
|
+
background-color: var(--color-background-main-hover);
|
|
41
|
+
}
|
|
47
42
|
.DataList-Option_disabled {
|
|
48
43
|
cursor: not-allowed;
|
|
49
44
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
color: var(--color-content-
|
|
45
|
+
.DataList-Option_disabled .ListItemText-TextPrimary,
|
|
46
|
+
.DataList-Option_disabled .ListItemText-TextSecondary {
|
|
47
|
+
color: var(--color-content-tertiary);
|
|
53
48
|
}
|
|
54
|
-
|
|
55
49
|
.DataList-IconWrapper {
|
|
56
50
|
min-inline-size: var(--select-check-icon-size);
|
|
57
51
|
min-block-size: var(--select-check-icon-size);
|
|
58
52
|
display: flex;
|
|
59
53
|
}
|
|
60
|
-
|
|
61
54
|
.DataList-IconWrapper_size_s {
|
|
62
55
|
--select-check-icon-size: 16px;
|
|
63
56
|
}
|
|
64
|
-
|
|
65
57
|
.DataList-IconWrapper_size_m {
|
|
66
58
|
--select-check-icon-size: 24px;
|
|
67
59
|
}
|
|
60
|
+
.DataList_animation-enter {
|
|
61
|
+
opacity: 0;
|
|
62
|
+
transform: translate(0, calc(var(--space-s) * -1));
|
|
63
|
+
pointer-events: none;
|
|
64
|
+
}
|
|
65
|
+
.DataList_animation-enter-active {
|
|
66
|
+
opacity: 1;
|
|
67
|
+
transition:
|
|
68
|
+
opacity var(--transition-default),
|
|
69
|
+
transform var(--transition-default);
|
|
70
|
+
transform: translate(0);
|
|
71
|
+
pointer-events: none;
|
|
72
|
+
}
|
|
73
|
+
.DataList_animation-enter-done {
|
|
74
|
+
opacity: 1;
|
|
75
|
+
transform: translate(0);
|
|
76
|
+
}
|
|
77
|
+
.DataList_animation-exit {
|
|
78
|
+
opacity: 1;
|
|
79
|
+
transform: translate(0);
|
|
80
|
+
pointer-events: none;
|
|
81
|
+
}
|
|
82
|
+
.DataList_animation-exit-active {
|
|
83
|
+
opacity: 0;
|
|
84
|
+
transition:
|
|
85
|
+
opacity var(--transition-default),
|
|
86
|
+
transform var(--transition-default);
|
|
87
|
+
transform: translate(0, calc(var(--space-s) * -1));
|
|
88
|
+
pointer-events: none;
|
|
89
|
+
}
|
|
90
|
+
.DataList_animation-exit-done {
|
|
91
|
+
opacity: 0;
|
|
92
|
+
transform: translate(0, calc(var(--space-s) * -1));
|
|
93
|
+
pointer-events: none;
|
|
94
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import './DataList.css';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DataListComponent } from './index';
|
|
3
3
|
export declare const cnDataList: import("@bem-react/classname").ClassNameFormatter;
|
|
4
|
-
export declare const DataList:
|
|
4
|
+
export declare const DataList: DataListComponent;
|
|
@@ -3,51 +3,89 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DataList = exports.cnDataList = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
require("./DataList.css");
|
|
6
|
-
var react_1 = tslib_1.
|
|
6
|
+
var react_1 = tslib_1.__importDefault(require("react"));
|
|
7
|
+
var useBoolean_1 = require("../../hooks/useBoolean");
|
|
7
8
|
var useControlled_1 = require("../../hooks/useControlled");
|
|
8
9
|
var useEventListener_1 = require("../../hooks/useEventListener");
|
|
9
10
|
var useMultiRef_1 = require("../../hooks/useMultiRef");
|
|
10
11
|
var useThemeProps_1 = require("../../hooks/useThemeProps");
|
|
11
12
|
var classname_1 = require("../../utils/classname");
|
|
12
|
-
var isKey_1 = require("../../utils/isKey");
|
|
13
13
|
var polymorphicComponentWithRef_1 = require("../../utils/polymorphicComponentWithRef");
|
|
14
14
|
var List_1 = require("../List");
|
|
15
15
|
var Popover_1 = require("../Popover");
|
|
16
16
|
var constants_1 = require("./constants");
|
|
17
17
|
var DataListProvider_1 = require("./DataListProvider");
|
|
18
|
+
var index_1 = require("./index");
|
|
18
19
|
var useDataListNavigation_1 = require("./useDataListNavigation");
|
|
19
20
|
exports.cnDataList = (0, classname_1.cn)('DataList');
|
|
20
|
-
|
|
21
|
-
var _a = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'DataList' }), _b = _a.
|
|
22
|
-
|
|
21
|
+
var DataListRender = function (inProps, ref) {
|
|
22
|
+
var _a = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'DataList' }), _b = _a.open, open = _b === void 0 ? constants_1.DATA_LIST_DEFAULT_OPEN : _b, _c = _a.size, size = _c === void 0 ? constants_1.DATA_LIST_DEFAULT_SIZE : _c, _d = _a.as, as = _d === void 0 ? constants_1.DATA_LIST_DEFAULT_TAG : _d, name = _a.name, children = _a.children, anchorRef = _a.anchorRef, selectedProp = _a.selected, defaultSelected = _a.defaultSelected, onClose = _a.onClose, onEnteredProp = _a.onEntered, onExitedProp = _a.onExited, listProps = _a.listProps, other = tslib_1.__rest(_a, ["open", "size", "as", "name", "children", "anchorRef", "selected", "defaultSelected", "onClose", "onEntered", "onExited", "listProps"]);
|
|
23
|
+
// Состояние полностью представленного компонента
|
|
24
|
+
var _e = tslib_1.__read((0, useBoolean_1.useBoolean)(false), 2), opened = _e[0], _f = _e[1], onEntered = _f.on, onExited = _f.off;
|
|
25
|
+
var _g = tslib_1.__read((0, useControlled_1.useControlled)({
|
|
23
26
|
name: 'DataList',
|
|
24
27
|
defaultValue: defaultSelected,
|
|
25
28
|
value: selectedProp,
|
|
26
29
|
state: 'selected',
|
|
27
|
-
}), 2), selected =
|
|
28
|
-
var
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
}), 2), selected = _g[0], setSelected = _g[1];
|
|
31
|
+
var handleSelect = function (event, value) {
|
|
32
|
+
var _a, _b, _c;
|
|
33
|
+
var res;
|
|
34
|
+
var props = tslib_1.__assign(tslib_1.__assign({}, inProps), { selected: selected });
|
|
35
|
+
if ((0, index_1.isMultipleParams)(props)) {
|
|
36
|
+
res = ((_a = props.selected) === null || _a === void 0 ? void 0 : _a.includes(value))
|
|
37
|
+
? props.selected.filter(function (item) { return item !== value; })
|
|
38
|
+
: tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read((selected || [])), false), [value], false);
|
|
39
|
+
(_b = props.onSelect) === null || _b === void 0 ? void 0 : _b.call(props, event, { name: name, value: res });
|
|
40
|
+
}
|
|
41
|
+
if ((0, index_1.isNotMultipleParams)(props)) {
|
|
42
|
+
res = value;
|
|
43
|
+
(_c = props.onSelect) === null || _c === void 0 ? void 0 : _c.call(props, event, { name: name, value: value });
|
|
44
|
+
}
|
|
45
|
+
setSelected(res || '');
|
|
32
46
|
};
|
|
33
|
-
|
|
47
|
+
// Фиксируем последний выбранный элемент в списке, чтобы потом переводить на него scroll в контейнере
|
|
48
|
+
var lastSelectedOption = Array.isArray(selected)
|
|
49
|
+
? selected[selected.length - 1]
|
|
50
|
+
: selected;
|
|
51
|
+
var _h = (0, useDataListNavigation_1.useDataListNavigation)({
|
|
34
52
|
name: name,
|
|
35
|
-
|
|
36
|
-
|
|
53
|
+
active: opened,
|
|
54
|
+
selected: lastSelectedOption,
|
|
55
|
+
onSelect: function (e, selectedItem) {
|
|
56
|
+
handleSelect(e, selectedItem);
|
|
57
|
+
},
|
|
58
|
+
}), onKeyDown = _h.onKeyDown, listRef = _h.ref, navigation = tslib_1.__rest(_h, ["onKeyDown", "ref"]);
|
|
59
|
+
// Назначает элементу контроля события управления списком с клавиатуры
|
|
37
60
|
(0, useEventListener_1.useEventListener)({
|
|
38
61
|
active: open,
|
|
39
62
|
eventName: 'keydown',
|
|
40
63
|
element: anchorRef,
|
|
41
|
-
handler:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
handler: onKeyDown,
|
|
65
|
+
});
|
|
66
|
+
// Закрывает список как только элемент контроля теряет фокус
|
|
67
|
+
(0, useEventListener_1.useEventListener)({
|
|
68
|
+
active: open,
|
|
69
|
+
eventName: 'focusout',
|
|
70
|
+
element: anchorRef,
|
|
71
|
+
handler: function () {
|
|
72
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
47
73
|
},
|
|
48
74
|
});
|
|
49
|
-
return (react_1.default.createElement(Popover_1.Popover, tslib_1.__assign({ as: as, open: open, placement: "bottom-start", disableReturnFocus: true,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
75
|
+
return (react_1.default.createElement(Popover_1.Popover, tslib_1.__assign({ as: as, open: open, placement: "bottom-start", disableReturnFocus: true, disableClickOutside: true, disableEnforceFocus: true, offset: [0, 4], onClose: onClose, anchorRef: anchorRef, transitionProps: {
|
|
76
|
+
classNames: (0, exports.cnDataList)({ animation: true }),
|
|
77
|
+
} }, other, { onEntered: function () {
|
|
78
|
+
onEntered();
|
|
79
|
+
onEnteredProp === null || onEnteredProp === void 0 ? void 0 : onEnteredProp();
|
|
80
|
+
}, onExited: function () {
|
|
81
|
+
onExited();
|
|
82
|
+
onExitedProp === null || onExitedProp === void 0 ? void 0 : onExitedProp();
|
|
83
|
+
}, ref: ref }),
|
|
84
|
+
react_1.default.createElement(DataListProvider_1.DataListContext.Provider, { value: tslib_1.__assign({ selected: selected, size: size }, navigation) },
|
|
85
|
+
react_1.default.createElement(List_1.List, tslib_1.__assign({ as: "ul", size: size }, listProps, { onMouseDown: function (e) {
|
|
86
|
+
var _a;
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
(_a = listProps === null || listProps === void 0 ? void 0 : listProps.onMouseDown) === null || _a === void 0 ? void 0 : _a.call(listProps, e);
|
|
89
|
+
}, ref: (0, useMultiRef_1.useMultiRef)([listRef, listProps === null || listProps === void 0 ? void 0 : listProps.ref]), className: (0, exports.cnDataList)('List', [listProps === null || listProps === void 0 ? void 0 : listProps.className]) }), children))));
|
|
90
|
+
};
|
|
91
|
+
exports.DataList = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)(DataListRender);
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import type { SyntheticEvent, MouseEvent } from 'react';
|
|
2
|
+
import type React from 'react';
|
|
2
3
|
import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
|
|
3
|
-
export type DataListSelectPayload = {
|
|
4
|
-
name?: string;
|
|
5
|
-
value: string;
|
|
6
|
-
};
|
|
7
4
|
export type DataListContextState = {
|
|
8
5
|
'data-list': string;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
selected?: string | string[];
|
|
7
|
+
focused?: string | null;
|
|
8
|
+
highlighted?: string | null;
|
|
12
9
|
size: FormElementSizeVariant;
|
|
10
|
+
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
|
13
11
|
onSelect?: (event: SyntheticEvent, option: string) => void;
|
|
14
|
-
onMouseMove?: (event: MouseEvent<
|
|
15
|
-
onMouseLeave?: (event: MouseEvent<
|
|
12
|
+
onMouseMove?: (event: MouseEvent<HTMLElement>) => void;
|
|
13
|
+
onMouseLeave?: (event: MouseEvent<HTMLElement>) => void;
|
|
16
14
|
};
|
|
17
|
-
export declare const DataListContext:
|
|
15
|
+
export declare const DataListContext: React.Context<DataListContextState>;
|
|
18
16
|
export declare const useDataListContext: () => DataListContextState;
|
|
@@ -5,8 +5,6 @@ var react_1 = require("react");
|
|
|
5
5
|
var constants_1 = require("./constants");
|
|
6
6
|
exports.DataListContext = (0, react_1.createContext)({
|
|
7
7
|
'data-list': '',
|
|
8
|
-
currentItem: null,
|
|
9
|
-
keyboardHighlight: false,
|
|
10
8
|
size: constants_1.DATA_LIST_DEFAULT_SIZE,
|
|
11
9
|
});
|
|
12
10
|
var useDataListContext = function () { return (0, react_1.useContext)(exports.DataListContext); };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { KeyboardEventHandler, MouseEventHandler,
|
|
2
|
+
import type { KeyboardEventHandler, MouseEventHandler, ReactNode, ComponentPropsWithRef } from 'react';
|
|
3
3
|
export type DataListOptionProps = {
|
|
4
4
|
/** Если {true} отображает опцию заблокированной */
|
|
5
5
|
disabled?: boolean;
|
|
6
6
|
/** Значение, если оно отличается от содержимого опции */
|
|
7
|
-
value
|
|
7
|
+
value: string;
|
|
8
8
|
/** Функция обратного вызова обработчик нажатий на клавиатуре */
|
|
9
9
|
onKeyDown?: KeyboardEventHandler<HTMLLIElement>;
|
|
10
10
|
/** Функция обратного вызова обработчик нажатий на клавиатуре */
|
|
@@ -12,19 +12,6 @@ export type DataListOptionProps = {
|
|
|
12
12
|
/** Функция обратного вызова обработчик нажатий на клавиатуре */
|
|
13
13
|
onMouseLeave?: MouseEventHandler<HTMLLIElement>;
|
|
14
14
|
/** Содержимое компонента */
|
|
15
|
-
children:
|
|
16
|
-
} &
|
|
17
|
-
export declare const DataListOption: React.ForwardRefExoticComponent<
|
|
18
|
-
/** Если {true} отображает опцию заблокированной */
|
|
19
|
-
disabled?: boolean | undefined;
|
|
20
|
-
/** Значение, если оно отличается от содержимого опции */
|
|
21
|
-
value?: string | undefined;
|
|
22
|
-
/** Функция обратного вызова обработчик нажатий на клавиатуре */
|
|
23
|
-
onKeyDown?: React.KeyboardEventHandler<HTMLLIElement> | undefined;
|
|
24
|
-
/** Функция обратного вызова обработчик нажатий на клавиатуре */
|
|
25
|
-
onMouseMove?: React.MouseEventHandler<HTMLLIElement> | undefined;
|
|
26
|
-
/** Функция обратного вызова обработчик нажатий на клавиатуре */
|
|
27
|
-
onMouseLeave?: React.MouseEventHandler<HTMLLIElement> | undefined;
|
|
28
|
-
/** Содержимое компонента */
|
|
29
|
-
children: string;
|
|
30
|
-
} & React.HTMLAttributes<HTMLLIElement> & React.RefAttributes<HTMLLIElement>>;
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
} & ComponentPropsWithRef<'li'>;
|
|
17
|
+
export declare const DataListOption: React.ForwardRefExoticComponent<Omit<DataListOptionProps, "ref"> & React.RefAttributes<HTMLLIElement>>;
|
|
@@ -4,45 +4,37 @@ exports.DataListOption = void 0;
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var react_1 = tslib_1.__importStar(require("react"));
|
|
6
6
|
var icons_1 = require("@ozen-ui/icons");
|
|
7
|
-
var useMultiRef_1 = require("../../../hooks/useMultiRef");
|
|
8
7
|
var getIconSizeToFormElement_1 = require("../../../utils/getIconSizeToFormElement");
|
|
9
8
|
var List_1 = require("../../List");
|
|
10
9
|
var constants_1 = require("../constants");
|
|
11
10
|
var DataList_1 = require("../DataList");
|
|
12
11
|
var DataListProvider_1 = require("../DataListProvider");
|
|
13
12
|
exports.DataListOption = (0, react_1.forwardRef)(function (_a, ref) {
|
|
14
|
-
var value = _a.value,
|
|
15
|
-
var
|
|
16
|
-
var _c = (0, DataListProvider_1.useDataListContext)(), size = _c.size, currentItem = _c.currentItem, _d = _c.selected, selected = _d === void 0 ? '' : _d, keyboardHighlight = _c.keyboardHighlight, onSelect = _c.onSelect, onMouseMove = _c.onMouseMove, onMouseLeave = _c.onMouseLeave, dataListName = _c["data-list"];
|
|
13
|
+
var value = _a.value, onMouseMoveProp = _a.onMouseMove, onMouseLeaveProp = _a.onMouseLeave, onClickProp = _a.onClick, _b = _a.disabled, disabled = _b === void 0 ? constants_1.DATA_LIST_OPTION_DEFAULT_DISABLED : _b, label = _a.children, className = _a.className, other = tslib_1.__rest(_a, ["value", "onMouseMove", "onMouseLeave", "onClick", "disabled", "children", "className"]);
|
|
14
|
+
var _c = (0, DataListProvider_1.useDataListContext)(), size = _c.size, _d = _c.selected, selected = _d === void 0 ? [] : _d, focused = _c.focused, highlighted = _c.highlighted, onClick = _c.onClick, onMouseMove = _c.onMouseMove, onMouseLeave = _c.onMouseLeave, dataListName = _c["data-list"];
|
|
17
15
|
var iconSize = (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size);
|
|
18
|
-
var isSelected = (
|
|
19
|
-
|
|
16
|
+
var isSelected = Array.isArray(selected)
|
|
17
|
+
? selected.includes(value)
|
|
18
|
+
: selected === value;
|
|
20
19
|
var handleClick = function (event) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
onSelect === null || onSelect === void 0 ? void 0 : onSelect(event, ((_a = event.currentTarget.dataset) === null || _a === void 0 ? void 0 : _a.value) || '');
|
|
20
|
+
onClickProp === null || onClickProp === void 0 ? void 0 : onClickProp(event);
|
|
21
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
26
22
|
};
|
|
27
23
|
var handleMouseMove = function (event) {
|
|
28
|
-
onMouseMove === null || onMouseMove === void 0 ? void 0 : onMouseMove(event);
|
|
29
24
|
onMouseMoveProp === null || onMouseMoveProp === void 0 ? void 0 : onMouseMoveProp(event);
|
|
25
|
+
onMouseMove === null || onMouseMove === void 0 ? void 0 : onMouseMove(event);
|
|
30
26
|
};
|
|
31
27
|
var handleMouseLeave = function (event) {
|
|
32
28
|
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(event);
|
|
33
29
|
onMouseLeaveProp === null || onMouseLeaveProp === void 0 ? void 0 : onMouseLeaveProp(event);
|
|
34
30
|
};
|
|
35
|
-
|
|
36
|
-
event.preventDefault();
|
|
37
|
-
onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(event);
|
|
38
|
-
};
|
|
39
|
-
return (react_1.default.createElement(List_1.ListItem, { role: "option", ref: (0, useMultiRef_1.useMultiRef)([optionRef, ref]), "data-list": dataListName, "data-value": value || label, "aria-selected": isSelected, "aria-disabled": disabled, onClick: handleClick, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, className: (0, DataList_1.cnDataList)('Option', {
|
|
31
|
+
return (react_1.default.createElement(List_1.ListItem, tslib_1.__assign({ role: "option", "data-list": dataListName, "data-list-value": value, "data-list-disabled": disabled, "aria-selected": isSelected, "aria-disabled": disabled, onClick: handleClick, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, className: (0, DataList_1.cnDataList)('Option', {
|
|
40
32
|
disabled: disabled,
|
|
41
|
-
highlighted: !disabled &&
|
|
42
|
-
|
|
43
|
-
}) },
|
|
44
|
-
react_1.default.createElement(List_1.ListItemText, { className: (0, DataList_1.cnDataList)('Text'
|
|
33
|
+
highlighted: !disabled && highlighted === value,
|
|
34
|
+
focused: !disabled && focused === value,
|
|
35
|
+
}, [className]) }, other, { ref: ref }), typeof label === 'string' ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
36
|
+
react_1.default.createElement(List_1.ListItemText, { className: (0, DataList_1.cnDataList)('Text'), primary: label }),
|
|
45
37
|
react_1.default.createElement("div", { className: (0, DataList_1.cnDataList)('IconWrapper', { size: iconSize }) }, isSelected && (react_1.default.createElement(List_1.ListItemIcon, null,
|
|
46
|
-
react_1.default.createElement(icons_1.TickIcon, { size: iconSize }))))));
|
|
38
|
+
react_1.default.createElement(icons_1.TickIcon, { size: iconSize })))))) : (label)));
|
|
47
39
|
});
|
|
48
40
|
exports.DataListOption.displayName = 'DataListOption';
|
|
@@ -1,33 +1,40 @@
|
|
|
1
|
-
import type { ReactNode,
|
|
1
|
+
import type { ReactNode, ElementType } from 'react';
|
|
2
2
|
import type React from 'react';
|
|
3
3
|
import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
|
|
4
|
-
import type { PolymorphicComponentPropsWithRef } from '../../utils/polymorphicComponentWithRef';
|
|
4
|
+
import type { PolymorphicComponentPropsWithRef, PolymorphicComponentRef } from '../../utils/polymorphicComponentWithRef';
|
|
5
5
|
import type { ListProps } from '../List';
|
|
6
6
|
import type { PopoverBaseProps } from '../Popover';
|
|
7
7
|
import type { DATA_LIST_DEFAULT_TAG } from './constants';
|
|
8
|
-
export type DataListPayload = {
|
|
8
|
+
export type DataListPayload<MULTIPLE extends boolean> = {
|
|
9
9
|
name?: string;
|
|
10
|
-
value: string;
|
|
10
|
+
value: MULTIPLE extends true ? string[] : string;
|
|
11
11
|
};
|
|
12
|
-
export type
|
|
12
|
+
export type DataListSelected<MULTIPLE extends boolean> = (MULTIPLE extends true ? string[] : string) | undefined;
|
|
13
|
+
export type DataListOnSelect<MULTIPLE extends boolean> = (event: React.SyntheticEvent | KeyboardEvent, payload: DataListPayload<MULTIPLE>) => void;
|
|
14
|
+
export type DataListBaseProps<MULTIPLE extends boolean = false> = {
|
|
13
15
|
/** Имя списка */
|
|
14
16
|
name?: string;
|
|
15
17
|
/** Признак по которому компонент будет представлен */
|
|
16
18
|
open?: boolean;
|
|
17
19
|
/** Содержимое компонента */
|
|
18
20
|
children: ReactNode;
|
|
21
|
+
/** Если {true} из списка можно выбрать несколько вариантов */
|
|
22
|
+
multiple?: MULTIPLE;
|
|
19
23
|
/** Дополнительные CSS-классы */
|
|
20
24
|
className?: string;
|
|
21
25
|
/** Размер компонента */
|
|
22
26
|
size?: FormElementSizeVariant;
|
|
23
|
-
/** Выбранная
|
|
24
|
-
selected?:
|
|
27
|
+
/** Выбранная или выбранные опции */
|
|
28
|
+
selected?: DataListSelected<MULTIPLE>;
|
|
25
29
|
/** Выбранная опция по умолчанию */
|
|
26
|
-
defaultSelected?:
|
|
30
|
+
defaultSelected?: DataListSelected<MULTIPLE>;
|
|
27
31
|
/** Функция обратного вызова для выбора значения */
|
|
28
|
-
onSelect?:
|
|
32
|
+
onSelect?: DataListOnSelect<MULTIPLE>;
|
|
29
33
|
/** Свойства компонента List */
|
|
30
34
|
listProps?: ListProps;
|
|
31
|
-
}
|
|
32
|
-
export
|
|
33
|
-
export
|
|
35
|
+
} & Omit<PopoverBaseProps, 'onSelect'>;
|
|
36
|
+
export declare const isMultipleParams: (params: DataListBaseProps<boolean>) => params is DataListBaseProps<true>;
|
|
37
|
+
export declare const isNotMultipleParams: (params: DataListBaseProps<boolean>) => params is DataListBaseProps<false>;
|
|
38
|
+
export type DataListRef = PolymorphicComponentRef<typeof DATA_LIST_DEFAULT_TAG>;
|
|
39
|
+
export type DataListProps<As extends ElementType = typeof DATA_LIST_DEFAULT_TAG, MULTIPLE extends boolean = false> = PolymorphicComponentPropsWithRef<DataListBaseProps<MULTIPLE>, As>;
|
|
40
|
+
export type DataListComponent = <As extends ElementType = typeof DATA_LIST_DEFAULT_TAG, MULTIPLE extends boolean = false>(props: PolymorphicComponentPropsWithRef<DataListBaseProps<MULTIPLE>, As>) => React.ReactElement | null;
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isNotMultipleParams = exports.isMultipleParams = void 0;
|
|
4
|
+
var isMultipleParams = function (params) { return !!params.multiple; };
|
|
5
|
+
exports.isMultipleParams = isMultipleParams;
|
|
6
|
+
var isNotMultipleParams = function (params) { return !params.multiple; };
|
|
7
|
+
exports.isNotMultipleParams = isNotMultipleParams;
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
+
import type React from 'react';
|
|
1
2
|
import type { MouseEvent, RefObject } from 'react';
|
|
3
|
+
type UserListItemValue = string | null;
|
|
2
4
|
export type UseListNavigationProps = {
|
|
3
5
|
name?: string;
|
|
4
|
-
|
|
6
|
+
ref?: RefObject<HTMLElement>;
|
|
7
|
+
selected?: UserListItemValue;
|
|
8
|
+
active?: boolean;
|
|
9
|
+
onSelect?: (e: React.SyntheticEvent | KeyboardEvent, selectedItem: string) => void;
|
|
5
10
|
};
|
|
6
11
|
export type UseListNavigationValue = {
|
|
7
12
|
'data-list': string;
|
|
8
|
-
|
|
9
|
-
|
|
13
|
+
focused?: UserListItemValue;
|
|
14
|
+
highlighted?: UserListItemValue;
|
|
15
|
+
ref?: RefObject<HTMLElement>;
|
|
10
16
|
onKeyDown: (event: KeyboardEvent) => void;
|
|
11
|
-
onMouseMove: (event: MouseEvent<
|
|
12
|
-
onMouseLeave: (event: MouseEvent<
|
|
17
|
+
onMouseMove: (event: MouseEvent<HTMLElement>) => void;
|
|
18
|
+
onMouseLeave: (event: MouseEvent<HTMLElement>) => void;
|
|
19
|
+
onClick: (event: React.MouseEvent<HTMLElement>) => void;
|
|
13
20
|
};
|
|
14
|
-
|
|
21
|
+
/** Навигация по элементам списка без перехвата фокуса с элемента контроля */
|
|
22
|
+
export declare function useDataListNavigation({ name: nameProp, selected, active, onSelect, }?: UseListNavigationProps): UseListNavigationValue;
|
|
23
|
+
export {};
|
|
@@ -3,55 +3,102 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.useDataListNavigation = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var react_1 = require("react");
|
|
6
|
-
var useBoolean_1 = require("../../hooks/useBoolean");
|
|
7
6
|
var useUniqueId_1 = require("../../hooks/useUniqueId");
|
|
8
7
|
var getNextIndex_1 = require("../../utils/getNextIndex");
|
|
9
8
|
var getPrevIndex_1 = require("../../utils/getPrevIndex");
|
|
10
9
|
var isKey_1 = require("../../utils/isKey");
|
|
11
10
|
var scrollContainerToElement_1 = require("../../utils/scrollContainerToElement");
|
|
11
|
+
var getData = function (el, attr) {
|
|
12
|
+
if (!el) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
if ('currentTarget' in el)
|
|
16
|
+
return el.currentTarget.getAttribute("data-list-".concat(attr));
|
|
17
|
+
return el.getAttribute("data-list-".concat(attr));
|
|
18
|
+
};
|
|
19
|
+
/** Навигация по элементам списка без перехвата фокуса с элемента контроля */
|
|
12
20
|
function useDataListNavigation(_a) {
|
|
13
|
-
var _b = _a === void 0 ? {} : _a, nameProp = _b.name,
|
|
21
|
+
var _b = _a === void 0 ? {} : _a, nameProp = _b.name, selected = _b.selected, _c = _b.active, active = _c === void 0 ? false : _c, onSelect = _b.onSelect;
|
|
14
22
|
var name = (0, useUniqueId_1.useUniqueId)(nameProp);
|
|
15
|
-
var
|
|
16
|
-
var _d = tslib_1.__read((0,
|
|
17
|
-
var
|
|
23
|
+
var ref = (0, react_1.useRef)(null);
|
|
24
|
+
var _d = tslib_1.__read((0, react_1.useState)(null), 2), current = _d[0], setCurrent = _d[1];
|
|
25
|
+
var _e = tslib_1.__read((0, react_1.useState)(), 2), focused = _e[0], serFocused = _e[1];
|
|
26
|
+
var _f = tslib_1.__read((0, react_1.useState)(), 2), highlighted = _f[0], setHighlighted = _f[1];
|
|
27
|
+
var currentValue = current || selected;
|
|
28
|
+
var getItemsData = (0, react_1.useCallback)(function () {
|
|
18
29
|
var _a;
|
|
30
|
+
var items = Array.from(((_a = ref === null || ref === void 0 ? void 0 : ref.current) === null || _a === void 0 ? void 0 : _a.querySelectorAll("[data-list=\"".concat(name, "\"]"))) || []).filter(function (item) { return getData(item, 'disabled') !== 'true'; });
|
|
31
|
+
return [
|
|
32
|
+
items,
|
|
33
|
+
items.find(function (item) { return getData(item, 'value') === currentValue; }),
|
|
34
|
+
];
|
|
35
|
+
}, [name, currentValue]);
|
|
36
|
+
(0, react_1.useEffect)(function () {
|
|
37
|
+
if (!active) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
var _a = tslib_1.__read(getItemsData(), 2), selectedItem = _a[1];
|
|
41
|
+
if (ref === null || ref === void 0 ? void 0 : ref.current) {
|
|
42
|
+
(0, scrollContainerToElement_1.scrollContainerToElement)({
|
|
43
|
+
container: ref.current,
|
|
44
|
+
element: selectedItem,
|
|
45
|
+
});
|
|
46
|
+
setCurrent(getData(selectedItem, 'value') || '');
|
|
47
|
+
}
|
|
48
|
+
return function () {
|
|
49
|
+
setCurrent(null);
|
|
50
|
+
serFocused(null);
|
|
51
|
+
setHighlighted(null);
|
|
52
|
+
};
|
|
53
|
+
}, [active]);
|
|
54
|
+
var onClick = function (event) {
|
|
55
|
+
if (getData(event, 'disabled') === 'true') {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
serFocused(null);
|
|
59
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(event, currentValue || '');
|
|
60
|
+
};
|
|
61
|
+
var onKeyDown = function (event) {
|
|
62
|
+
if ((0, isKey_1.isKey)(event, 'Enter')) {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
if (currentValue)
|
|
65
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(event, currentValue);
|
|
66
|
+
}
|
|
19
67
|
if (!(0, isKey_1.isKey)(event, 'ArrowUp') && !(0, isKey_1.isKey)(event, 'ArrowDown')) {
|
|
20
68
|
return;
|
|
21
69
|
}
|
|
22
70
|
event.preventDefault();
|
|
23
|
-
var
|
|
24
|
-
var currentIndex = currentItem
|
|
71
|
+
var _a = tslib_1.__read(getItemsData(), 2), items = _a[0], currentItem = _a[1];
|
|
72
|
+
var currentIndex = !currentItem ? null : items.indexOf(currentItem);
|
|
25
73
|
var isArrowUp = (0, isKey_1.isKey)(event, 'ArrowUp');
|
|
26
74
|
var newIndex = isArrowUp
|
|
27
75
|
? (0, getPrevIndex_1.getPrevIndex)(currentIndex !== null && currentIndex !== void 0 ? currentIndex : 0, items.length)
|
|
28
76
|
: (0, getNextIndex_1.getNextIndex)(currentIndex !== null && currentIndex !== void 0 ? currentIndex : -1, items.length);
|
|
29
77
|
var item = items[newIndex];
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
78
|
+
var newValue = getData(item, 'value');
|
|
79
|
+
setCurrent(newValue);
|
|
80
|
+
serFocused(newValue);
|
|
81
|
+
if (ref === null || ref === void 0 ? void 0 : ref.current) {
|
|
33
82
|
(0, scrollContainerToElement_1.scrollContainerToElement)({
|
|
34
|
-
container:
|
|
83
|
+
container: ref.current,
|
|
35
84
|
element: item,
|
|
36
85
|
});
|
|
37
86
|
}
|
|
38
87
|
};
|
|
39
88
|
var onMouseMove = function (event) {
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
hideKeyboardHighlight();
|
|
89
|
+
if (getData(event, 'disabled') !== 'true')
|
|
90
|
+
setCurrent(getData(event, 'value'));
|
|
91
|
+
setHighlighted(getData(event, 'value'));
|
|
44
92
|
};
|
|
45
93
|
var onMouseLeave = function () {
|
|
46
|
-
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
setCurrentItem(null);
|
|
94
|
+
setHighlighted(null);
|
|
50
95
|
};
|
|
51
96
|
return {
|
|
52
97
|
'data-list': name,
|
|
53
|
-
|
|
54
|
-
|
|
98
|
+
ref: ref,
|
|
99
|
+
focused: focused,
|
|
100
|
+
highlighted: highlighted,
|
|
101
|
+
onClick: onClick,
|
|
55
102
|
onKeyDown: onKeyDown,
|
|
56
103
|
onMouseMove: onMouseMove,
|
|
57
104
|
onMouseLeave: onMouseLeave,
|