@snack-uikit/list 0.33.4 → 0.33.5-preview-620fd545.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/dist/cjs/components/Items/AccordionItem/AccordionItem.js +6 -2
- package/dist/cjs/components/Items/BaseItem/BaseItem.d.ts +3 -2
- package/dist/cjs/components/Items/BaseItem/BaseItem.js +11 -2
- package/dist/cjs/components/Lists/Droplist/DropList.js +2 -1
- package/dist/cjs/components/Lists/List/List.js +2 -1
- package/dist/cjs/components/Lists/contexts/CollapseProvider.d.ts +7 -0
- package/dist/esm/components/Items/AccordionItem/AccordionItem.js +5 -3
- package/dist/esm/components/Items/BaseItem/BaseItem.d.ts +3 -2
- package/dist/esm/components/Items/BaseItem/BaseItem.js +10 -3
- package/dist/esm/components/Lists/Droplist/DropList.js +1 -0
- package/dist/esm/components/Lists/List/List.js +1 -0
- package/dist/esm/components/Lists/contexts/CollapseProvider.d.ts +7 -0
- package/package.json +2 -2
- package/src/components/Items/AccordionItem/AccordionItem.tsx +4 -2
- package/src/components/Items/BaseItem/BaseItem.tsx +21 -3
- package/src/components/Lists/Droplist/DropList.tsx +1 -0
- package/src/components/Lists/List/List.tsx +1 -0
- package/src/components/Lists/contexts/CollapseProvider.tsx +7 -0
|
@@ -31,7 +31,10 @@ function AccordionItem(_a) {
|
|
|
31
31
|
const _ref2 = (0, contexts_1.useCollapseContext)(),
|
|
32
32
|
_ref2$openCollapseIte = _ref2.openCollapseItems,
|
|
33
33
|
openCollapseItems = _ref2$openCollapseIte === void 0 ? [] : _ref2$openCollapseIte,
|
|
34
|
-
toggleOpenCollapseItem = _ref2.toggleOpenCollapseItem
|
|
34
|
+
toggleOpenCollapseItem = _ref2.toggleOpenCollapseItem,
|
|
35
|
+
_ref2$toggleOn = _ref2.toggleOn,
|
|
36
|
+
toggleOn = _ref2$toggleOn === void 0 ? 'item' : _ref2$toggleOn;
|
|
37
|
+
const isIconTrigger = toggleOn === 'expandIcon';
|
|
35
38
|
const _ref3 = (0, contexts_1.useSelectionContext)(),
|
|
36
39
|
value = _ref3.value,
|
|
37
40
|
isSelectionSingle = _ref3.isSelectionSingle,
|
|
@@ -53,7 +56,7 @@ function AccordionItem(_a) {
|
|
|
53
56
|
const itemsJSX = (0, hooks_1.useRenderItems)(items);
|
|
54
57
|
const handleItemClick = e => {
|
|
55
58
|
var _a;
|
|
56
|
-
toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '');
|
|
59
|
+
if (!isIconTrigger) toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '');
|
|
57
60
|
(_a = option.onClick) === null || _a === void 0 ? void 0 : _a.call(option, e);
|
|
58
61
|
};
|
|
59
62
|
return (0, jsx_runtime_1.jsx)(helperComponents_1.CollapseBlockPrivate, {
|
|
@@ -61,6 +64,7 @@ function AccordionItem(_a) {
|
|
|
61
64
|
id: id,
|
|
62
65
|
disabled: disabled,
|
|
63
66
|
expandIcon: isOpen ? (0, jsx_runtime_1.jsx)(icons_1.ChevronUpSVG, {}) : (0, jsx_runtime_1.jsx)(icons_1.ChevronDownSVG, {}),
|
|
67
|
+
onExpandIconClick: isIconTrigger ? () => toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '') : undefined,
|
|
64
68
|
onClick: handleItemClick,
|
|
65
69
|
isParentNode: true,
|
|
66
70
|
onOpenNestedList: handleKeyDown,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KeyboardEvent, ReactNode } from 'react';
|
|
1
|
+
import { KeyboardEvent, MouseEvent, ReactNode } from 'react';
|
|
2
2
|
import { FlattenBaseItem } from '../types';
|
|
3
3
|
type AllBaseItemProps = FlattenBaseItem & {
|
|
4
4
|
expandIcon?: ReactNode;
|
|
@@ -7,6 +7,7 @@ type AllBaseItemProps = FlattenBaseItem & {
|
|
|
7
7
|
onSelect?(): void;
|
|
8
8
|
isParentNode?: boolean;
|
|
9
9
|
onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
|
|
10
|
+
onExpandIconClick?(e: MouseEvent<HTMLElement>): void;
|
|
10
11
|
};
|
|
11
|
-
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
12
|
+
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onExpandIconClick, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
12
13
|
export {};
|
|
@@ -47,11 +47,12 @@ function BaseItem(_a) {
|
|
|
47
47
|
checkedProp = _a.checked,
|
|
48
48
|
onSelect = _a.onSelect,
|
|
49
49
|
onOpenNestedList = _a.onOpenNestedList,
|
|
50
|
+
onExpandIconClick = _a.onExpandIconClick,
|
|
50
51
|
isParentNode = _a.isParentNode,
|
|
51
52
|
className = _a.className,
|
|
52
53
|
inactive = _a.inactive,
|
|
53
54
|
itemWrapRender = _a.itemWrapRender,
|
|
54
|
-
rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "isParentNode", "className", "inactive", "itemWrapRender"]);
|
|
55
|
+
rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "onExpandIconClick", "isParentNode", "className", "inactive", "itemWrapRender"]);
|
|
55
56
|
const interactive = !inactive;
|
|
56
57
|
const _ref = (0, contexts_1.useNewListContext)(),
|
|
57
58
|
_ref$size = _ref.size,
|
|
@@ -188,8 +189,16 @@ function BaseItem(_a) {
|
|
|
188
189
|
checked: isChecked,
|
|
189
190
|
"data-test-id": 'list__base-item-switch',
|
|
190
191
|
showIcon: showSwitchIcon
|
|
191
|
-
}), !switchProp && expandIcon &&
|
|
192
|
+
}), !switchProp && expandIcon &&
|
|
193
|
+
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
194
|
+
(0, jsx_runtime_1.jsx)("span", {
|
|
192
195
|
className: styles_module_scss_2.default.expandableIcon,
|
|
196
|
+
"data-test-id": 'list__base-item-expand-icon',
|
|
197
|
+
onClick: onExpandIconClick && (e => {
|
|
198
|
+
e.preventDefault();
|
|
199
|
+
e.stopPropagation();
|
|
200
|
+
onExpandIconClick(e);
|
|
201
|
+
}),
|
|
193
202
|
children: expandIcon
|
|
194
203
|
})]
|
|
195
204
|
})
|
|
@@ -222,7 +222,8 @@ function Droplist(_a) {
|
|
|
222
222
|
children: (0, jsx_runtime_1.jsx)(contexts_1.CollapseContext.Provider, {
|
|
223
223
|
value: {
|
|
224
224
|
openCollapseItems,
|
|
225
|
-
toggleOpenCollapseItem
|
|
225
|
+
toggleOpenCollapseItem,
|
|
226
|
+
toggleOn: collapse.toggleOn
|
|
226
227
|
},
|
|
227
228
|
children: (0, jsx_runtime_1.jsx)(contexts_1.FocusListContext.Provider, {
|
|
228
229
|
value: {
|
|
@@ -176,7 +176,8 @@ exports.List = (0, react_1.forwardRef)((_a, ref) => {
|
|
|
176
176
|
children: (0, jsx_runtime_1.jsx)(contexts_1.CollapseContext.Provider, {
|
|
177
177
|
value: {
|
|
178
178
|
openCollapseItems,
|
|
179
|
-
toggleOpenCollapseItem
|
|
179
|
+
toggleOpenCollapseItem,
|
|
180
|
+
toggleOn: collapse.toggleOn
|
|
180
181
|
},
|
|
181
182
|
children: (0, jsx_runtime_1.jsx)(contexts_1.FocusListContext.Provider, {
|
|
182
183
|
value: {
|
|
@@ -7,6 +7,7 @@ export declare const useCollapseLevelContext: () => CollapseLevelContextType;
|
|
|
7
7
|
export type CollapseContextType = {
|
|
8
8
|
openCollapseItems?: ItemId[];
|
|
9
9
|
toggleOpenCollapseItem?(id: ItemId): void;
|
|
10
|
+
toggleOn?: 'item' | 'expandIcon';
|
|
10
11
|
};
|
|
11
12
|
export declare const CollapseContext: import("react").Context<CollapseContextType>;
|
|
12
13
|
export declare const useCollapseContext: () => CollapseContextType;
|
|
@@ -14,4 +15,10 @@ export type CollapseState = {
|
|
|
14
15
|
value?: ItemId[];
|
|
15
16
|
onChange?(value?: ItemId[]): void;
|
|
16
17
|
defaultValue?: ItemId[];
|
|
18
|
+
/**
|
|
19
|
+
* Что переключает раскрытие вложенного списка:
|
|
20
|
+
* * `item` - клик по всей строке (по умолчанию),
|
|
21
|
+
* * `expandIcon` - только клик по шеврону.
|
|
22
|
+
*/
|
|
23
|
+
toggleOn?: 'item' | 'expandIcon';
|
|
17
24
|
};
|
|
@@ -19,7 +19,8 @@ import { useGroupItemSelection, useRenderItems } from '../hooks';
|
|
|
19
19
|
export function AccordionItem(_a) {
|
|
20
20
|
var { id, disabled, allChildIds, items } = _a, option = __rest(_a, ["id", "disabled", "allChildIds", "items"]);
|
|
21
21
|
const { level = 0 } = useCollapseLevelContext();
|
|
22
|
-
const { openCollapseItems = [], toggleOpenCollapseItem } = useCollapseContext();
|
|
22
|
+
const { openCollapseItems = [], toggleOpenCollapseItem, toggleOn = 'item' } = useCollapseContext();
|
|
23
|
+
const isIconTrigger = toggleOn === 'expandIcon';
|
|
23
24
|
const { value, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
|
|
24
25
|
const { indeterminate, handleOnSelect, checked: checkedProp, } = useGroupItemSelection({
|
|
25
26
|
items,
|
|
@@ -36,8 +37,9 @@ export function AccordionItem(_a) {
|
|
|
36
37
|
const itemsJSX = useRenderItems(items);
|
|
37
38
|
const handleItemClick = (e) => {
|
|
38
39
|
var _a;
|
|
39
|
-
|
|
40
|
+
if (!isIconTrigger)
|
|
41
|
+
toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '');
|
|
40
42
|
(_a = option.onClick) === null || _a === void 0 ? void 0 : _a.call(option, e);
|
|
41
43
|
};
|
|
42
|
-
return (_jsx(CollapseBlockPrivate, { header: _jsx(BaseItem, Object.assign({}, option, { id: id, disabled: disabled, expandIcon: isOpen ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), onClick: handleItemClick, isParentNode: true, onOpenNestedList: handleKeyDown, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined })), expanded: isOpen, "data-test-id": `list__accordion-item-${id}`, children: _jsx(CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
|
|
44
|
+
return (_jsx(CollapseBlockPrivate, { header: _jsx(BaseItem, Object.assign({}, option, { id: id, disabled: disabled, expandIcon: isOpen ? _jsx(ChevronUpSVG, {}) : _jsx(ChevronDownSVG, {}), onExpandIconClick: isIconTrigger ? () => toggleOpenCollapseItem === null || toggleOpenCollapseItem === void 0 ? void 0 : toggleOpenCollapseItem(id !== null && id !== void 0 ? id : '') : undefined, onClick: handleItemClick, isParentNode: true, onOpenNestedList: handleKeyDown, checked: checked, indeterminate: indeterminate, onSelect: !disabled ? handleOnSelect : undefined })), expanded: isOpen, "data-test-id": `list__accordion-item-${id}`, children: _jsx(CollapseLevelContext.Provider, { value: { level: level + 1 }, children: itemsJSX }) }));
|
|
43
45
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KeyboardEvent, ReactNode } from 'react';
|
|
1
|
+
import { KeyboardEvent, MouseEvent, ReactNode } from 'react';
|
|
2
2
|
import { FlattenBaseItem } from '../types';
|
|
3
3
|
type AllBaseItemProps = FlattenBaseItem & {
|
|
4
4
|
expandIcon?: ReactNode;
|
|
@@ -7,6 +7,7 @@ type AllBaseItemProps = FlattenBaseItem & {
|
|
|
7
7
|
onSelect?(): void;
|
|
8
8
|
isParentNode?: boolean;
|
|
9
9
|
onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
|
|
10
|
+
onExpandIconClick?(e: MouseEvent<HTMLElement>): void;
|
|
10
11
|
};
|
|
11
|
-
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
12
|
+
export declare function BaseItem({ beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onExpandIconClick, isParentNode, className, inactive, itemWrapRender, ...rest }: AllBaseItemProps): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
12
13
|
export {};
|
|
@@ -21,13 +21,13 @@ import { CHECKBOX_SIZE_MAP } from './constants';
|
|
|
21
21
|
import styles from './styles.module.css';
|
|
22
22
|
export function BaseItem(_a) {
|
|
23
23
|
var _b;
|
|
24
|
-
var { beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, isParentNode, className, inactive, itemWrapRender } = _a, rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "isParentNode", "className", "inactive", "itemWrapRender"]);
|
|
24
|
+
var { beforeContent, afterContent, content, onClick, onMouseDown, id, expandIcon, disabled, open, itemRef, switch: switchProp, showSwitchIcon, onKeyDown, onFocus, indeterminate, checked: checkedProp, onSelect, onOpenNestedList, onExpandIconClick, isParentNode, className, inactive, itemWrapRender } = _a, rest = __rest(_a, ["beforeContent", "afterContent", "content", "onClick", "onMouseDown", "id", "expandIcon", "disabled", "open", "itemRef", "switch", "showSwitchIcon", "onKeyDown", "onFocus", "indeterminate", "checked", "onSelect", "onOpenNestedList", "onExpandIconClick", "isParentNode", "className", "inactive", "itemWrapRender"]);
|
|
25
25
|
const interactive = !inactive;
|
|
26
26
|
const { size = 's', marker, contentRender, firstItemId, focusFlattenItems } = useNewListContext();
|
|
27
27
|
const { level = 0 } = useCollapseLevelContext();
|
|
28
28
|
const { closeDroplist, closeDroplistOnItemClick } = useOpenListContext();
|
|
29
29
|
const { value, onChange, mode, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
|
|
30
|
-
const isChecked = isSelectionSingle ?
|
|
30
|
+
const isChecked = isSelectionSingle ? checkedProp !== null && checkedProp !== void 0 ? checkedProp : value === id : checkedProp !== null && checkedProp !== void 0 ? checkedProp : value === null || value === void 0 ? void 0 : value.includes(id !== null && id !== void 0 ? id : '');
|
|
31
31
|
const handleChange = () => {
|
|
32
32
|
onChange === null || onChange === void 0 ? void 0 : onChange(id);
|
|
33
33
|
};
|
|
@@ -86,7 +86,14 @@ export function BaseItem(_a) {
|
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
88
|
const props = extractSupportProps(rest);
|
|
89
|
-
const itemJSX = (_jsx("div", { className: cn(commonStyles.itemWrapper, styles.innerWrapper, className), "data-inactive": inactive || undefined, "data-disabled": disabled || undefined, "data-variant": mode || undefined, "data-checked": (isParentNode && isChecked) || (!isParentNode && isChecked && !switchProp) || undefined, children: _jsxs("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || 'list__base-item_' + id, ref: itemRef, className: cn(commonStyles.listItem, styles.droplistItem), "data-size": size, onClick: handleItemClick, onMouseDown: handleItemMouseDown, tabIndex: firstItemId && id === focusFlattenItems[firstItemId].originalId ? 0 : -1, "data-non-pointer": inactive && !onClick, "data-variant": mode || undefined, "data-open": open || undefined, onKeyDown: handleItemKeyDown, onFocus: handleItemFocus, style: { '--level': level }, "data-level-one": level === 1 || undefined, "data-level-more-one": level > 1 || undefined, "data-checked": (isParentNode && (indeterminate || isChecked)) || (isChecked && !switchProp) || undefined, children: [!switchProp && isSelectionSingle && marker && !isParentNode && interactive && (_jsx("div", { className: styles.markerContainer, "data-test-id": 'list__base-item-marker' })), !switchProp && isSelectionMultiple && interactive && (_jsx("div", { className: styles.checkbox, children: _jsx(Checkbox, { size: CHECKBOX_SIZE_MAP[size !== null && size !== void 0 ? size : 's'], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": 'list__base-item-checkbox', onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && _jsx("div", { className: styles.beforeContent, children: beforeContent }), content && isContentItem(content) ? ((
|
|
89
|
+
const itemJSX = (_jsx("div", { className: cn(commonStyles.itemWrapper, styles.innerWrapper, className), "data-inactive": inactive || undefined, "data-disabled": disabled || undefined, "data-variant": mode || undefined, "data-checked": (isParentNode && isChecked) || (!isParentNode && isChecked && !switchProp) || undefined, children: _jsxs("li", { "data-type": 'outside', role: 'menuitem', "data-test-id": props['data-test-id'] || 'list__base-item_' + id, ref: itemRef, className: cn(commonStyles.listItem, styles.droplistItem), "data-size": size, onClick: handleItemClick, onMouseDown: handleItemMouseDown, tabIndex: firstItemId && id === focusFlattenItems[firstItemId].originalId ? 0 : -1, "data-non-pointer": inactive && !onClick, "data-variant": mode || undefined, "data-open": open || undefined, onKeyDown: handleItemKeyDown, onFocus: handleItemFocus, style: { '--level': level }, "data-level-one": level === 1 || undefined, "data-level-more-one": level > 1 || undefined, "data-checked": (isParentNode && (indeterminate || isChecked)) || (isChecked && !switchProp) || undefined, children: [!switchProp && isSelectionSingle && marker && !isParentNode && interactive && (_jsx("div", { className: styles.markerContainer, "data-test-id": 'list__base-item-marker' })), !switchProp && isSelectionMultiple && interactive && (_jsx("div", { className: styles.checkbox, children: _jsx(Checkbox, { size: CHECKBOX_SIZE_MAP[size !== null && size !== void 0 ? size : 's'], disabled: disabled, tabIndex: -1, onChange: isParentNode ? handleCheckboxChange : undefined, checked: isChecked, "data-test-id": 'list__base-item-checkbox', onClick: handleCheckboxClick, indeterminate: indeterminate }) })), beforeContent && _jsx("div", { className: styles.beforeContent, children: beforeContent }), content && isContentItem(content) ? ((_b = contentRender === null || contentRender === void 0 ? void 0 : contentRender({ id, content, disabled })) !== null && _b !== void 0 ? _b : _jsx(ItemContent, Object.assign({ disabled: disabled }, content))) : (_jsxs("div", { className: styles.content, children: [" ", content, " "] })), afterContent, switchProp && interactive && (_jsx(Switch, { disabled: disabled, checked: isChecked, "data-test-id": 'list__base-item-switch', showIcon: showSwitchIcon })), !switchProp && expandIcon && (
|
|
90
|
+
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
91
|
+
_jsx("span", { className: styles.expandableIcon, "data-test-id": 'list__base-item-expand-icon', onClick: onExpandIconClick &&
|
|
92
|
+
(e => {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
e.stopPropagation();
|
|
95
|
+
onExpandIconClick(e);
|
|
96
|
+
}), children: expandIcon }))] }) }));
|
|
90
97
|
if (!itemWrapRender) {
|
|
91
98
|
return itemJSX;
|
|
92
99
|
}
|
|
@@ -131,6 +131,7 @@ export function Droplist(_a) {
|
|
|
131
131
|
return (_jsx(NewListContextProvider, { flattenItems: flattenItems, focusFlattenItems: focusFlattenItems, contentRender: contentRender, size: size, marker: marker, firstItemId: firstItemId, virtualized: virtualized, children: _jsx(SelectionProvider, Object.assign({}, selection, { children: _jsx(CollapseContext.Provider, { value: {
|
|
132
132
|
openCollapseItems,
|
|
133
133
|
toggleOpenCollapseItem,
|
|
134
|
+
toggleOn: collapse.toggleOn,
|
|
134
135
|
}, children: _jsx(FocusListContext.Provider, { value: {
|
|
135
136
|
activeItemId,
|
|
136
137
|
handleListKeyDownFactory,
|
|
@@ -102,6 +102,7 @@ export const List = forwardRef((_a, ref) => {
|
|
|
102
102
|
return (_jsx(NewListContextProvider, { flattenItems: flattenItems, focusFlattenItems: focusFlattenItems, contentRender: contentRender, size: size, marker: marker, firstItemId: firstItemId, virtualized: props.virtualized, children: _jsx(SelectionProvider, Object.assign({}, selection, { children: _jsx(CollapseContext.Provider, { value: {
|
|
103
103
|
openCollapseItems,
|
|
104
104
|
toggleOpenCollapseItem,
|
|
105
|
+
toggleOn: collapse.toggleOn,
|
|
105
106
|
}, children: _jsx(FocusListContext.Provider, { value: {
|
|
106
107
|
activeItemId,
|
|
107
108
|
handleListKeyDownFactory,
|
|
@@ -7,6 +7,7 @@ export declare const useCollapseLevelContext: () => CollapseLevelContextType;
|
|
|
7
7
|
export type CollapseContextType = {
|
|
8
8
|
openCollapseItems?: ItemId[];
|
|
9
9
|
toggleOpenCollapseItem?(id: ItemId): void;
|
|
10
|
+
toggleOn?: 'item' | 'expandIcon';
|
|
10
11
|
};
|
|
11
12
|
export declare const CollapseContext: import("react").Context<CollapseContextType>;
|
|
12
13
|
export declare const useCollapseContext: () => CollapseContextType;
|
|
@@ -14,4 +15,10 @@ export type CollapseState = {
|
|
|
14
15
|
value?: ItemId[];
|
|
15
16
|
onChange?(value?: ItemId[]): void;
|
|
16
17
|
defaultValue?: ItemId[];
|
|
18
|
+
/**
|
|
19
|
+
* Что переключает раскрытие вложенного списка:
|
|
20
|
+
* * `item` - клик по всей строке (по умолчанию),
|
|
21
|
+
* * `expandIcon` - только клик по шеврону.
|
|
22
|
+
*/
|
|
23
|
+
toggleOn?: 'item' | 'expandIcon';
|
|
17
24
|
};
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "List",
|
|
7
|
-
"version": "0.33.
|
|
7
|
+
"version": "0.33.5-preview-620fd545.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"@snack-uikit/locale": "*"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "a0ea1647ffd8d5a1b3e980901ed6842844927ac1"
|
|
58
58
|
}
|
|
@@ -17,7 +17,8 @@ type AccordionItemProps = Omit<FlattenAccordionItem, 'type>'> & CommonFlattenPro
|
|
|
17
17
|
|
|
18
18
|
export function AccordionItem({ id, disabled, allChildIds, items, ...option }: AccordionItemProps) {
|
|
19
19
|
const { level = 0 } = useCollapseLevelContext();
|
|
20
|
-
const { openCollapseItems = [], toggleOpenCollapseItem } = useCollapseContext();
|
|
20
|
+
const { openCollapseItems = [], toggleOpenCollapseItem, toggleOn = 'item' } = useCollapseContext();
|
|
21
|
+
const isIconTrigger = toggleOn === 'expandIcon';
|
|
21
22
|
|
|
22
23
|
const { value, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
|
|
23
24
|
|
|
@@ -46,7 +47,7 @@ export function AccordionItem({ id, disabled, allChildIds, items, ...option }: A
|
|
|
46
47
|
const itemsJSX = useRenderItems(items);
|
|
47
48
|
|
|
48
49
|
const handleItemClick = (e: MouseEvent<HTMLElement>) => {
|
|
49
|
-
toggleOpenCollapseItem?.(id ?? '');
|
|
50
|
+
if (!isIconTrigger) toggleOpenCollapseItem?.(id ?? '');
|
|
50
51
|
option.onClick?.(e);
|
|
51
52
|
};
|
|
52
53
|
|
|
@@ -58,6 +59,7 @@ export function AccordionItem({ id, disabled, allChildIds, items, ...option }: A
|
|
|
58
59
|
id={id}
|
|
59
60
|
disabled={disabled}
|
|
60
61
|
expandIcon={isOpen ? <ChevronUpSVG /> : <ChevronDownSVG />}
|
|
62
|
+
onExpandIconClick={isIconTrigger ? () => toggleOpenCollapseItem?.(id ?? '') : undefined}
|
|
61
63
|
onClick={handleItemClick}
|
|
62
64
|
isParentNode
|
|
63
65
|
onOpenNestedList={handleKeyDown}
|
|
@@ -24,6 +24,7 @@ type AllBaseItemProps = FlattenBaseItem & {
|
|
|
24
24
|
onSelect?(): void;
|
|
25
25
|
isParentNode?: boolean;
|
|
26
26
|
onOpenNestedList?(e?: KeyboardEvent<HTMLElement>): void;
|
|
27
|
+
onExpandIconClick?(e: MouseEvent<HTMLElement>): void;
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
export function BaseItem({
|
|
@@ -45,6 +46,7 @@ export function BaseItem({
|
|
|
45
46
|
checked: checkedProp,
|
|
46
47
|
onSelect,
|
|
47
48
|
onOpenNestedList,
|
|
49
|
+
onExpandIconClick,
|
|
48
50
|
isParentNode,
|
|
49
51
|
className,
|
|
50
52
|
inactive,
|
|
@@ -58,7 +60,7 @@ export function BaseItem({
|
|
|
58
60
|
const { closeDroplist, closeDroplistOnItemClick } = useOpenListContext();
|
|
59
61
|
const { value, onChange, mode, isSelectionSingle, isSelectionMultiple } = useSelectionContext();
|
|
60
62
|
|
|
61
|
-
const isChecked = isSelectionSingle ?
|
|
63
|
+
const isChecked = isSelectionSingle ? checkedProp ?? value === id : checkedProp ?? value?.includes(id ?? '');
|
|
62
64
|
|
|
63
65
|
const handleChange = () => {
|
|
64
66
|
onChange?.(id);
|
|
@@ -182,7 +184,7 @@ export function BaseItem({
|
|
|
182
184
|
|
|
183
185
|
{beforeContent && <div className={styles.beforeContent}>{beforeContent}</div>}
|
|
184
186
|
{content && isContentItem(content) ? (
|
|
185
|
-
|
|
187
|
+
contentRender?.({ id, content, disabled }) ?? <ItemContent disabled={disabled} {...content} />
|
|
186
188
|
) : (
|
|
187
189
|
<div className={styles.content}> {content} </div>
|
|
188
190
|
)}
|
|
@@ -197,7 +199,23 @@ export function BaseItem({
|
|
|
197
199
|
/>
|
|
198
200
|
)}
|
|
199
201
|
|
|
200
|
-
{!switchProp && expandIcon &&
|
|
202
|
+
{!switchProp && expandIcon && (
|
|
203
|
+
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
204
|
+
<span
|
|
205
|
+
className={styles.expandableIcon}
|
|
206
|
+
data-test-id='list__base-item-expand-icon'
|
|
207
|
+
onClick={
|
|
208
|
+
onExpandIconClick &&
|
|
209
|
+
(e => {
|
|
210
|
+
e.preventDefault();
|
|
211
|
+
e.stopPropagation();
|
|
212
|
+
onExpandIconClick(e);
|
|
213
|
+
})
|
|
214
|
+
}
|
|
215
|
+
>
|
|
216
|
+
{expandIcon}
|
|
217
|
+
</span>
|
|
218
|
+
)}
|
|
201
219
|
</li>
|
|
202
220
|
</div>
|
|
203
221
|
);
|
|
@@ -11,6 +11,7 @@ export const useCollapseLevelContext = () => useContext(CollapseLevelContext);
|
|
|
11
11
|
export type CollapseContextType = {
|
|
12
12
|
openCollapseItems?: ItemId[];
|
|
13
13
|
toggleOpenCollapseItem?(id: ItemId): void;
|
|
14
|
+
toggleOn?: 'item' | 'expandIcon';
|
|
14
15
|
};
|
|
15
16
|
export const CollapseContext = createContext<CollapseContextType>({});
|
|
16
17
|
export const useCollapseContext = () => useContext(CollapseContext);
|
|
@@ -19,4 +20,10 @@ export type CollapseState = {
|
|
|
19
20
|
value?: ItemId[];
|
|
20
21
|
onChange?(value?: ItemId[]): void;
|
|
21
22
|
defaultValue?: ItemId[];
|
|
23
|
+
/**
|
|
24
|
+
* Что переключает раскрытие вложенного списка:
|
|
25
|
+
* * `item` - клик по всей строке (по умолчанию),
|
|
26
|
+
* * `expandIcon` - только клик по шеврону.
|
|
27
|
+
*/
|
|
28
|
+
toggleOn?: 'item' | 'expandIcon';
|
|
22
29
|
};
|