@snack-uikit/list 0.11.1-preview-5d3667ec.0 → 0.11.2
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 +25 -0
- package/README.md +35 -24
- package/dist/components/Items/AccordionItem/AccordionItem.d.ts +4 -2
- package/dist/components/Items/AccordionItem/AccordionItem.js +18 -16
- package/dist/components/Items/BaseItem/BaseItem.d.ts +8 -4
- package/dist/components/Items/BaseItem/BaseItem.js +20 -14
- package/dist/components/Items/BaseItem/styles.module.css +20 -119
- package/dist/components/Items/GroupItem/GroupItem.d.ts +5 -1
- package/dist/components/Items/GroupItem/GroupItem.js +1 -3
- package/dist/components/Items/GroupSelectItem/GroupSelectItem.d.ts +4 -0
- package/dist/components/Items/GroupSelectItem/GroupSelectItem.js +18 -0
- package/dist/components/Items/GroupSelectItem/index.d.ts +1 -0
- package/dist/components/Items/GroupSelectItem/index.js +1 -0
- package/dist/components/Items/NextListItem/NextListItem.d.ts +6 -2
- package/dist/components/Items/NextListItem/NextListItem.js +55 -45
- package/dist/components/Items/NextListItem/constants.d.ts +2 -0
- package/dist/components/Items/NextListItem/constants.js +10 -0
- package/dist/components/Items/PinGroupItem/PinGroupItem.js +7 -3
- package/dist/components/Items/PinGroupItem/styles.module.css +26 -14
- package/dist/components/Items/SearchItem/SearchItem.d.ts +3 -1
- package/dist/components/Items/SearchItem/SearchItem.js +4 -11
- package/dist/components/Items/hooks.d.ts +11 -10
- package/dist/components/Items/hooks.js +64 -46
- package/dist/components/Items/index.d.ts +1 -5
- package/dist/components/Items/index.js +1 -5
- package/dist/components/Items/styles.module.css +33 -26
- package/dist/components/Items/types.d.ts +68 -34
- package/dist/components/Items/utils.d.ts +34 -16
- package/dist/components/Items/utils.js +135 -37
- package/dist/components/Lists/Droplist/DropList.d.ts +1 -1
- package/dist/components/Lists/Droplist/DropList.js +78 -50
- package/dist/components/Lists/List/List.d.ts +5 -9
- package/dist/components/Lists/List/List.js +61 -54
- package/dist/components/Lists/ListPrivate/ListPrivate.d.ts +6 -20
- package/dist/components/Lists/ListPrivate/ListPrivate.js +9 -8
- package/dist/components/Lists/ListPrivate/styles.module.css +1 -0
- package/dist/components/Lists/contexts/CollapseProvider.d.ts +13 -1
- package/dist/components/Lists/contexts/CollapseProvider.js +2 -0
- package/dist/components/Lists/contexts/FocusListProvider.d.ts +9 -0
- package/dist/components/Lists/contexts/FocusListProvider.js +5 -0
- package/dist/components/Lists/contexts/NewListProvider.d.ts +32 -0
- package/dist/components/Lists/contexts/{ListProvider.js → NewListProvider.js} +10 -5
- package/dist/components/Lists/contexts/SelectionProvider.d.ts +25 -15
- package/dist/components/Lists/contexts/SelectionProvider.js +17 -13
- package/dist/components/Lists/contexts/index.d.ts +3 -2
- package/dist/components/Lists/contexts/index.js +3 -2
- package/dist/components/Lists/hooks.d.ts +10 -12
- package/dist/components/Lists/hooks.js +75 -42
- package/dist/components/Lists/index.d.ts +2 -1
- package/dist/components/Lists/index.js +1 -0
- package/dist/components/Lists/types.d.ts +12 -14
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.js +1 -1
- package/dist/helperComponents/HiddenTabButton/HiddenTabButton.js +1 -1
- package/dist/helperComponents/ItemContent/ItemContent.d.ts +15 -0
- package/dist/helperComponents/ItemContent/ItemContent.js +23 -0
- package/dist/helperComponents/ItemContent/index.d.ts +1 -0
- package/dist/helperComponents/ItemContent/index.js +1 -0
- package/dist/helperComponents/ItemContent/styles.module.css +117 -0
- package/dist/helperComponents/ListEmptyState/ListEmptyState.d.ts +2 -2
- package/dist/helperComponents/ListEmptyState/ListEmptyState.js +13 -4
- package/dist/helperComponents/Separator/Separator.d.ts +8 -2
- package/dist/helperComponents/Separator/Separator.js +22 -2
- package/dist/helperComponents/Separator/constants.d.ts +2 -0
- package/dist/helperComponents/Separator/constants.js +5 -0
- package/dist/helperComponents/Separator/styles.module.css +20 -1
- package/dist/helperComponents/index.d.ts +1 -0
- package/dist/helperComponents/index.js +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/types.d.ts +1 -1
- package/package.json +13 -18
- package/src/components/Items/AccordionItem/AccordionItem.tsx +24 -20
- package/src/components/Items/BaseItem/BaseItem.tsx +91 -82
- package/src/components/Items/BaseItem/styles.module.scss +19 -77
- package/src/components/Items/GroupItem/GroupItem.tsx +5 -5
- package/src/components/Items/GroupSelectItem/GroupSelectItem.tsx +44 -0
- package/src/components/Items/GroupSelectItem/index.ts +1 -0
- package/src/components/Items/NextListItem/NextListItem.tsx +88 -85
- package/src/components/Items/NextListItem/constants.ts +12 -0
- package/src/components/Items/PinGroupItem/PinGroupItem.tsx +14 -4
- package/src/components/Items/PinGroupItem/styles.module.scss +14 -14
- package/src/components/Items/SearchItem/SearchItem.tsx +5 -12
- package/src/components/Items/hooks.tsx +86 -66
- package/src/components/Items/index.ts +1 -5
- package/src/components/Items/styles.module.scss +36 -25
- package/src/components/Items/types.ts +91 -42
- package/src/components/Items/utils.ts +199 -52
- package/src/components/Lists/Droplist/DropList.tsx +155 -98
- package/src/components/Lists/List/List.tsx +129 -104
- package/src/components/Lists/ListPrivate/ListPrivate.tsx +19 -20
- package/src/components/Lists/ListPrivate/styles.module.scss +1 -0
- package/src/components/Lists/contexts/CollapseProvider.tsx +22 -0
- package/src/components/Lists/contexts/FocusListProvider.tsx +15 -0
- package/src/components/Lists/contexts/NewListProvider.tsx +54 -0
- package/src/components/Lists/contexts/SelectionProvider.tsx +56 -39
- package/src/components/Lists/contexts/index.ts +3 -2
- package/src/components/Lists/hooks.ts +125 -76
- package/src/components/Lists/index.ts +2 -2
- package/src/components/Lists/types.ts +20 -24
- package/src/components/index.ts +17 -2
- package/src/helperComponents/HiddenTabButton/HiddenTabButton.tsx +1 -0
- package/src/helperComponents/ItemContent/ItemContent.tsx +63 -0
- package/src/helperComponents/ItemContent/index.ts +1 -0
- package/src/helperComponents/ItemContent/styles.module.scss +78 -0
- package/src/helperComponents/ListEmptyState/ListEmptyState.tsx +26 -12
- package/src/helperComponents/Separator/Separator.tsx +49 -3
- package/src/helperComponents/Separator/constants.ts +7 -0
- package/src/helperComponents/Separator/styles.module.scss +41 -1
- package/src/helperComponents/index.ts +1 -0
- package/src/index.ts +4 -2
- package/src/types.ts +1 -1
- package/dist/components/Items/NextListItem/hooks.d.ts +0 -19
- package/dist/components/Items/NextListItem/hooks.js +0 -80
- package/dist/components/Lists/contexts/ListProvider.d.ts +0 -17
- package/dist/components/Lists/contexts/ParentListProvider.d.ts +0 -18
- package/dist/components/Lists/contexts/ParentListProvider.js +0 -12
- package/dist/hooks.d.ts +0 -5
- package/dist/hooks.js +0 -15
- package/dist/utils.d.ts +0 -30
- package/dist/utils.js +0 -115
- package/src/components/Items/NextListItem/hooks.ts +0 -105
- package/src/components/Lists/contexts/CollapseProvider.ts +0 -9
- package/src/components/Lists/contexts/ListProvider.tsx +0 -28
- package/src/components/Lists/contexts/ParentListProvider.tsx +0 -35
- package/src/hooks.ts +0 -27
- package/src/utils.ts +0 -175
package/dist/utils.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { RefObject } from 'react';
|
|
2
|
-
import { AccordionItemProps, BaseItemProps, ItemProps, NextListItemProps } from './components/Items';
|
|
3
|
-
type WithCollapsedItemsProps = {
|
|
4
|
-
items: ItemProps[];
|
|
5
|
-
openCollapsedItems: Array<number | string>;
|
|
6
|
-
};
|
|
7
|
-
export declare function withCollapsedItems({ items, openCollapsedItems }: WithCollapsedItemsProps): {
|
|
8
|
-
items: ItemProps[];
|
|
9
|
-
itemRefs: RefObject<HTMLElement>[];
|
|
10
|
-
ids: (string | number)[];
|
|
11
|
-
expandedIds: (string | number)[];
|
|
12
|
-
};
|
|
13
|
-
export declare function extractItemRefs(items: ItemProps[]): RefObject<HTMLElement>[];
|
|
14
|
-
/**
|
|
15
|
-
* Функция возвращает массив id дочерних items
|
|
16
|
-
* @function extractItemIds
|
|
17
|
-
*/
|
|
18
|
-
export declare function extractItemIds(items: ItemProps[]): Array<string | number>;
|
|
19
|
-
export declare function extractChildIds({ items }: {
|
|
20
|
-
items: ItemProps[];
|
|
21
|
-
}): Array<string | number>;
|
|
22
|
-
export declare function extractAllChildIds({ items }: {
|
|
23
|
-
items: ItemProps[];
|
|
24
|
-
}): Array<string | number>;
|
|
25
|
-
/**
|
|
26
|
-
* Функция разворачивает массив айтемов в плоский список
|
|
27
|
-
* @function flattenItems
|
|
28
|
-
*/
|
|
29
|
-
export declare function flattenItems(items: ItemProps[]): (BaseItemProps | AccordionItemProps | NextListItemProps)[];
|
|
30
|
-
export {};
|
package/dist/utils.js
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { isAccordionItemProps, isBaseItemProps, isGroupItemProps, isNextListItemProps, } from './components/Items';
|
|
2
|
-
export function withCollapsedItems({ items, openCollapsedItems }) {
|
|
3
|
-
let itemRefs = [];
|
|
4
|
-
let newItems = [];
|
|
5
|
-
let ids = [];
|
|
6
|
-
let expandedIds = [];
|
|
7
|
-
items.forEach(item => {
|
|
8
|
-
var _a;
|
|
9
|
-
if (((isBaseItemProps(item) && !item.inactive) || isNextListItemProps(item) || isAccordionItemProps(item)) &&
|
|
10
|
-
!item.disabled) {
|
|
11
|
-
newItems = newItems.concat([item]);
|
|
12
|
-
ids = ids.concat([(_a = item.id) !== null && _a !== void 0 ? _a : '']);
|
|
13
|
-
if (item.itemRef) {
|
|
14
|
-
itemRefs = itemRefs.concat([item.itemRef]);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
if (isNextListItemProps(item) && item.id && !item.disabled) {
|
|
18
|
-
expandedIds = expandedIds.concat(item.id);
|
|
19
|
-
}
|
|
20
|
-
if (isGroupItemProps(item)) {
|
|
21
|
-
const { itemRefs: nestedItemsRefs, ids: nestedIds } = withCollapsedItems({
|
|
22
|
-
items: item.items,
|
|
23
|
-
openCollapsedItems,
|
|
24
|
-
});
|
|
25
|
-
ids = ids.concat(nestedIds);
|
|
26
|
-
itemRefs = itemRefs.concat(nestedItemsRefs);
|
|
27
|
-
}
|
|
28
|
-
if (isAccordionItemProps(item) && item.id && openCollapsedItems.includes(item.id)) {
|
|
29
|
-
const { itemRefs: nestedItemsRefs, ids: nestedIds, items: nestedItems, expandedIds: nestedExpandedIds, } = withCollapsedItems({
|
|
30
|
-
items: item.items,
|
|
31
|
-
openCollapsedItems,
|
|
32
|
-
});
|
|
33
|
-
ids = ids.concat(nestedIds);
|
|
34
|
-
newItems = newItems.concat(nestedItems);
|
|
35
|
-
itemRefs = itemRefs.concat(nestedItemsRefs);
|
|
36
|
-
expandedIds = expandedIds.concat(nestedExpandedIds);
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
return { items, itemRefs, ids, expandedIds };
|
|
40
|
-
}
|
|
41
|
-
export function extractItemRefs(items) {
|
|
42
|
-
return items.reduce((prev, item) => {
|
|
43
|
-
if (isGroupItemProps(item)) {
|
|
44
|
-
return prev.concat(extractItemRefs(item.items));
|
|
45
|
-
}
|
|
46
|
-
return item.itemRef ? prev.concat([item.itemRef]) : prev;
|
|
47
|
-
}, []);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Функция возвращает массив id дочерних items
|
|
51
|
-
* @function extractItemIds
|
|
52
|
-
*/
|
|
53
|
-
export function extractItemIds(items) {
|
|
54
|
-
return items.reduce((prev, item) => {
|
|
55
|
-
if (isGroupItemProps(item)) {
|
|
56
|
-
return prev.concat(extractItemIds(item.items));
|
|
57
|
-
}
|
|
58
|
-
return item.id ? prev.concat([item.id]) : prev;
|
|
59
|
-
}, []);
|
|
60
|
-
}
|
|
61
|
-
export function extractChildIds({ items }) {
|
|
62
|
-
return items
|
|
63
|
-
.filter(item => isAccordionItemProps(item) ||
|
|
64
|
-
isNextListItemProps(item) ||
|
|
65
|
-
isGroupItemProps(item) ||
|
|
66
|
-
(isBaseItemProps(item) && !item.disabled && !item.inactive))
|
|
67
|
-
.reduce((prev, item) => {
|
|
68
|
-
var _a;
|
|
69
|
-
if (isAccordionItemProps(item) || isNextListItemProps(item)) {
|
|
70
|
-
return prev.concat([(_a = item.id) !== null && _a !== void 0 ? _a : '']).concat(extractChildIds({ items: item.items }));
|
|
71
|
-
}
|
|
72
|
-
if (isGroupItemProps(item)) {
|
|
73
|
-
return prev.concat(extractChildIds({ items: item.items }));
|
|
74
|
-
}
|
|
75
|
-
return item.id && !isGroupItemProps(item) ? prev.concat([item.id]) : prev;
|
|
76
|
-
}, []);
|
|
77
|
-
}
|
|
78
|
-
export function extractAllChildIds({ items }) {
|
|
79
|
-
return items
|
|
80
|
-
.filter(item => isAccordionItemProps(item) ||
|
|
81
|
-
isNextListItemProps(item) ||
|
|
82
|
-
isGroupItemProps(item) ||
|
|
83
|
-
(isBaseItemProps(item) && !item.inactive))
|
|
84
|
-
.reduce((prev, item) => {
|
|
85
|
-
var _a;
|
|
86
|
-
if (isAccordionItemProps(item) || isNextListItemProps(item)) {
|
|
87
|
-
return prev.concat([(_a = item.id) !== null && _a !== void 0 ? _a : '']).concat(extractAllChildIds({ items: item.items }));
|
|
88
|
-
}
|
|
89
|
-
if (isGroupItemProps(item)) {
|
|
90
|
-
return prev.concat(extractAllChildIds({ items: item.items }));
|
|
91
|
-
}
|
|
92
|
-
return item.id && !isGroupItemProps(item) ? prev.concat([item.id]) : prev;
|
|
93
|
-
}, []);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Функция разворачивает массив айтемов в плоский список
|
|
97
|
-
* @function flattenItems
|
|
98
|
-
*/
|
|
99
|
-
export function flattenItems(items) {
|
|
100
|
-
const flattenedItems = [];
|
|
101
|
-
function flatten(item) {
|
|
102
|
-
if (!isGroupItemProps(item)) {
|
|
103
|
-
flattenedItems.push(item);
|
|
104
|
-
}
|
|
105
|
-
if ('items' in item) {
|
|
106
|
-
for (const nestedItem of item.items) {
|
|
107
|
-
flatten(nestedItem);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
for (const item of items) {
|
|
112
|
-
flatten(item);
|
|
113
|
-
}
|
|
114
|
-
return flattenedItems;
|
|
115
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { KeyboardEvent, RefObject, useCallback, useEffect, useState } from 'react';
|
|
2
|
-
|
|
3
|
-
import { useParentListContext } from '../../Lists/contexts';
|
|
4
|
-
|
|
5
|
-
type UseKeyboardNavigationProps = {
|
|
6
|
-
ids: Array<number | string>;
|
|
7
|
-
expandedIds: Array<number | string>;
|
|
8
|
-
itemRefs?: RefObject<HTMLElement>[];
|
|
9
|
-
id?: string | number;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export function useKeyboardNavigation({ ids, expandedIds, itemRefs, id }: UseKeyboardNavigationProps) {
|
|
13
|
-
const { triggerRef, parentResetNestedIndex, parentIds, parentItemRefs, parentOpenNestedIndex } =
|
|
14
|
-
useParentListContext();
|
|
15
|
-
|
|
16
|
-
const [activeFocusIndex, setActiveFocusIndex] = useState<number>(-1);
|
|
17
|
-
const [openNestedIndex, setOpenNestedIndex] = useState<number>(-1);
|
|
18
|
-
const [open, setOpen] = useState<boolean>(false);
|
|
19
|
-
|
|
20
|
-
const handleListKeyDown = (e: KeyboardEvent<HTMLElement>) => {
|
|
21
|
-
switch (e.key) {
|
|
22
|
-
case 'ArrowDown': {
|
|
23
|
-
setActiveFocusIndex(activeIndex => Math.min(activeIndex + 1, ids.length - 1));
|
|
24
|
-
|
|
25
|
-
e.stopPropagation();
|
|
26
|
-
e.preventDefault();
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
case 'ArrowUp': {
|
|
30
|
-
setActiveFocusIndex(activeIndex => Math.max(activeIndex - 1, 0));
|
|
31
|
-
|
|
32
|
-
e.preventDefault();
|
|
33
|
-
e.stopPropagation();
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
case 'ArrowRight': {
|
|
37
|
-
e.stopPropagation();
|
|
38
|
-
e.preventDefault();
|
|
39
|
-
|
|
40
|
-
if (expandedIds.includes(ids[activeFocusIndex])) {
|
|
41
|
-
setOpenNestedIndex(activeFocusIndex);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
case 'ArrowLeft': {
|
|
47
|
-
parentItemRefs?.[parentOpenNestedIndex].current?.focus();
|
|
48
|
-
|
|
49
|
-
parentResetNestedIndex?.();
|
|
50
|
-
setActiveFocusIndex(-1);
|
|
51
|
-
setOpenNestedIndex(-1);
|
|
52
|
-
|
|
53
|
-
setOpen(false);
|
|
54
|
-
|
|
55
|
-
e.stopPropagation();
|
|
56
|
-
e.preventDefault();
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
case 'Tab': {
|
|
61
|
-
triggerRef?.current?.focus();
|
|
62
|
-
parentResetNestedIndex?.();
|
|
63
|
-
setActiveFocusIndex(-1);
|
|
64
|
-
setOpen(false);
|
|
65
|
-
e.preventDefault();
|
|
66
|
-
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
default: {
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
useEffect(() => {
|
|
77
|
-
itemRefs?.[activeFocusIndex]?.current?.focus();
|
|
78
|
-
}, [activeFocusIndex, itemRefs]);
|
|
79
|
-
|
|
80
|
-
useEffect(() => {
|
|
81
|
-
if (parentIds[parentOpenNestedIndex] === id && openNestedIndex === -1) {
|
|
82
|
-
setOpen(true);
|
|
83
|
-
setActiveFocusIndex(activeIndex => (activeIndex === -1 ? 0 : activeIndex));
|
|
84
|
-
}
|
|
85
|
-
}, [id, openNestedIndex, parentIds, parentOpenNestedIndex]);
|
|
86
|
-
|
|
87
|
-
const resetNestedIndex = () => {
|
|
88
|
-
setActiveFocusIndex(openNestedIndex);
|
|
89
|
-
setOpenNestedIndex(-1);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const resetActiveFocusIndex = useCallback(() => setActiveFocusIndex(-1), []);
|
|
93
|
-
|
|
94
|
-
return {
|
|
95
|
-
activeFocusIndex,
|
|
96
|
-
setActiveFocusIndex,
|
|
97
|
-
openNestedIndex,
|
|
98
|
-
setOpenNestedIndex,
|
|
99
|
-
resetNestedIndex,
|
|
100
|
-
resetActiveFocusIndex,
|
|
101
|
-
handleListKeyDown,
|
|
102
|
-
open,
|
|
103
|
-
setOpen,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { createContext, ReactNode, useContext } from 'react';
|
|
2
|
-
|
|
3
|
-
export type ListContextType = {
|
|
4
|
-
/** Размер списка */
|
|
5
|
-
size?: 's' | 'm' | 'l';
|
|
6
|
-
/** Отображать ли маркер у выбранного жлемента списка */
|
|
7
|
-
marker?: boolean;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export type ListContextPrivateType = {
|
|
11
|
-
parent?: 'list' | 'droplist';
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
type Child = {
|
|
15
|
-
children: ReactNode;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export const ListContext = createContext<ListContextType & ListContextPrivateType>({});
|
|
19
|
-
|
|
20
|
-
export const useListContext = () => useContext(ListContext);
|
|
21
|
-
|
|
22
|
-
function extractListProps<T extends ListContextType & ListContextPrivateType>({ size, marker, parent }: T) {
|
|
23
|
-
return { size, marker, parent };
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function ListContextProvider({ children, ...props }: ListContextType & Child & ListContextPrivateType) {
|
|
27
|
-
return <ListContext.Provider value={extractListProps(props)}>{children}</ListContext.Provider>;
|
|
28
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { createContext, RefObject, useContext } from 'react';
|
|
2
|
-
|
|
3
|
-
export type ParentListContextType = {
|
|
4
|
-
parentActiveFocusIndex: number;
|
|
5
|
-
parentSetActiveFocusIndex?(idx: number): void;
|
|
6
|
-
parentResetActiveFocusIndex?(): void;
|
|
7
|
-
|
|
8
|
-
parentIds: Array<string | number>;
|
|
9
|
-
parentExpandedIds: Array<string | number>;
|
|
10
|
-
parentItemRefs: Array<RefObject<HTMLElement>>;
|
|
11
|
-
|
|
12
|
-
parentOpenNestedIndex: number;
|
|
13
|
-
parentResetNestedIndex?(): void;
|
|
14
|
-
|
|
15
|
-
openCollapsedItems?: Array<string | number>;
|
|
16
|
-
toggleOpenCollapsedItems?(id: string | number): void;
|
|
17
|
-
|
|
18
|
-
triggerRef?: RefObject<HTMLElement>;
|
|
19
|
-
parentRef?: RefObject<HTMLElement>;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export const ParentListContext = createContext<ParentListContextType>({
|
|
23
|
-
parentActiveFocusIndex: -1,
|
|
24
|
-
parentOpenNestedIndex: -1,
|
|
25
|
-
|
|
26
|
-
parentIds: [],
|
|
27
|
-
parentExpandedIds: [],
|
|
28
|
-
parentItemRefs: [],
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
export const useParentListContext = () => useContext(ParentListContext);
|
|
32
|
-
|
|
33
|
-
export function ParentListProvider() {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
package/src/hooks.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import FuzzySearch from 'fuzzy-search';
|
|
2
|
-
import { useCallback } from 'react';
|
|
3
|
-
|
|
4
|
-
import { ItemProps } from './components/Items';
|
|
5
|
-
import { flattenItems } from './utils';
|
|
6
|
-
|
|
7
|
-
const DEFAULT_MIN_SEARCH_INPUT_LENGTH = 2;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Нечеткий поиск среди айтемов по полям 'content.option', 'content.caption', 'content.description', 'label'
|
|
11
|
-
*/
|
|
12
|
-
export function useFuzzySearch(items: ItemProps[], minSearchInputLength?: number) {
|
|
13
|
-
return useCallback(
|
|
14
|
-
(search: string) => {
|
|
15
|
-
const searcher = new FuzzySearch(
|
|
16
|
-
flattenItems(items),
|
|
17
|
-
['content.option', 'content.caption', 'content.description', 'label'],
|
|
18
|
-
{},
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
return search.length > (minSearchInputLength ?? DEFAULT_MIN_SEARCH_INPUT_LENGTH)
|
|
22
|
-
? searcher.search(search)
|
|
23
|
-
: items;
|
|
24
|
-
},
|
|
25
|
-
[items, minSearchInputLength],
|
|
26
|
-
);
|
|
27
|
-
}
|
package/src/utils.ts
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { RefObject } from 'react';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
AccordionItemProps,
|
|
5
|
-
BaseItemProps,
|
|
6
|
-
isAccordionItemProps,
|
|
7
|
-
isBaseItemProps,
|
|
8
|
-
isGroupItemProps,
|
|
9
|
-
isNextListItemProps,
|
|
10
|
-
ItemProps,
|
|
11
|
-
NextListItemProps,
|
|
12
|
-
} from './components/Items';
|
|
13
|
-
|
|
14
|
-
type WithCollapsedItemsProps = {
|
|
15
|
-
items: ItemProps[];
|
|
16
|
-
openCollapsedItems: Array<number | string>;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export function withCollapsedItems({ items, openCollapsedItems }: WithCollapsedItemsProps) {
|
|
20
|
-
let itemRefs: RefObject<HTMLElement>[] = [];
|
|
21
|
-
let newItems: ItemProps[] = [];
|
|
22
|
-
let ids: Array<string | number> = [];
|
|
23
|
-
let expandedIds: Array<string | number> = [];
|
|
24
|
-
|
|
25
|
-
items.forEach(item => {
|
|
26
|
-
if (
|
|
27
|
-
((isBaseItemProps(item) && !item.inactive) || isNextListItemProps(item) || isAccordionItemProps(item)) &&
|
|
28
|
-
!item.disabled
|
|
29
|
-
) {
|
|
30
|
-
newItems = newItems.concat([item]);
|
|
31
|
-
ids = ids.concat([item.id ?? '']);
|
|
32
|
-
|
|
33
|
-
if (item.itemRef) {
|
|
34
|
-
itemRefs = itemRefs.concat([item.itemRef]);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (isNextListItemProps(item) && item.id && !item.disabled) {
|
|
39
|
-
expandedIds = expandedIds.concat(item.id);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (isGroupItemProps(item)) {
|
|
43
|
-
const { itemRefs: nestedItemsRefs, ids: nestedIds } = withCollapsedItems({
|
|
44
|
-
items: item.items,
|
|
45
|
-
openCollapsedItems,
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
ids = ids.concat(nestedIds);
|
|
49
|
-
|
|
50
|
-
itemRefs = itemRefs.concat(nestedItemsRefs);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (isAccordionItemProps(item) && item.id && openCollapsedItems.includes(item.id)) {
|
|
54
|
-
const {
|
|
55
|
-
itemRefs: nestedItemsRefs,
|
|
56
|
-
ids: nestedIds,
|
|
57
|
-
items: nestedItems,
|
|
58
|
-
expandedIds: nestedExpandedIds,
|
|
59
|
-
} = withCollapsedItems({
|
|
60
|
-
items: item.items,
|
|
61
|
-
openCollapsedItems,
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
ids = ids.concat(nestedIds);
|
|
65
|
-
newItems = newItems.concat(nestedItems);
|
|
66
|
-
itemRefs = itemRefs.concat(nestedItemsRefs);
|
|
67
|
-
expandedIds = expandedIds.concat(nestedExpandedIds);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
return { items, itemRefs, ids, expandedIds };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export function extractItemRefs(items: ItemProps[]): RefObject<HTMLElement>[] {
|
|
75
|
-
return items.reduce((prev: RefObject<HTMLElement>[], item: ItemProps) => {
|
|
76
|
-
if (isGroupItemProps(item)) {
|
|
77
|
-
return prev.concat(extractItemRefs(item.items));
|
|
78
|
-
}
|
|
79
|
-
return item.itemRef ? prev.concat([item.itemRef]) : prev;
|
|
80
|
-
}, [] as RefObject<HTMLElement>[]);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Функция возвращает массив id дочерних items
|
|
85
|
-
* @function extractItemIds
|
|
86
|
-
*/
|
|
87
|
-
|
|
88
|
-
export function extractItemIds(items: ItemProps[]): Array<string | number> {
|
|
89
|
-
return items.reduce(
|
|
90
|
-
(prev: Array<string | number>, item: ItemProps) => {
|
|
91
|
-
if (isGroupItemProps(item)) {
|
|
92
|
-
return prev.concat(extractItemIds(item.items));
|
|
93
|
-
}
|
|
94
|
-
return item.id ? prev.concat([item.id]) : prev;
|
|
95
|
-
},
|
|
96
|
-
[] as Array<string | number>,
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export function extractChildIds({ items }: { items: ItemProps[] }): Array<string | number> {
|
|
101
|
-
return items
|
|
102
|
-
.filter(
|
|
103
|
-
item =>
|
|
104
|
-
isAccordionItemProps(item) ||
|
|
105
|
-
isNextListItemProps(item) ||
|
|
106
|
-
isGroupItemProps(item) ||
|
|
107
|
-
(isBaseItemProps(item) && !item.disabled && !item.inactive),
|
|
108
|
-
)
|
|
109
|
-
.reduce(
|
|
110
|
-
(prev: Array<string | number>, item: ItemProps) => {
|
|
111
|
-
if (isAccordionItemProps(item) || isNextListItemProps(item)) {
|
|
112
|
-
return prev.concat([item.id ?? '']).concat(extractChildIds({ items: item.items }));
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (isGroupItemProps(item)) {
|
|
116
|
-
return prev.concat(extractChildIds({ items: item.items }));
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return item.id && !isGroupItemProps(item) ? prev.concat([item.id]) : prev;
|
|
120
|
-
},
|
|
121
|
-
[] as Array<string | number>,
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export function extractAllChildIds({ items }: { items: ItemProps[] }): Array<string | number> {
|
|
126
|
-
return items
|
|
127
|
-
.filter(
|
|
128
|
-
item =>
|
|
129
|
-
isAccordionItemProps(item) ||
|
|
130
|
-
isNextListItemProps(item) ||
|
|
131
|
-
isGroupItemProps(item) ||
|
|
132
|
-
(isBaseItemProps(item) && !item.inactive),
|
|
133
|
-
)
|
|
134
|
-
.reduce(
|
|
135
|
-
(prev: Array<string | number>, item: ItemProps) => {
|
|
136
|
-
if (isAccordionItemProps(item) || isNextListItemProps(item)) {
|
|
137
|
-
return prev.concat([item.id ?? '']).concat(extractAllChildIds({ items: item.items }));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (isGroupItemProps(item)) {
|
|
141
|
-
return prev.concat(extractAllChildIds({ items: item.items }));
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return item.id && !isGroupItemProps(item) ? prev.concat([item.id]) : prev;
|
|
145
|
-
},
|
|
146
|
-
[] as Array<string | number>,
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Функция разворачивает массив айтемов в плоский список
|
|
152
|
-
* @function flattenItems
|
|
153
|
-
*/
|
|
154
|
-
|
|
155
|
-
export function flattenItems(items: ItemProps[]): (BaseItemProps | AccordionItemProps | NextListItemProps)[] {
|
|
156
|
-
const flattenedItems: (BaseItemProps | AccordionItemProps | NextListItemProps)[] = [];
|
|
157
|
-
|
|
158
|
-
function flatten(item: ItemProps) {
|
|
159
|
-
if (!isGroupItemProps(item)) {
|
|
160
|
-
flattenedItems.push(item);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if ('items' in item) {
|
|
164
|
-
for (const nestedItem of item.items) {
|
|
165
|
-
flatten(nestedItem);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
for (const item of items) {
|
|
171
|
-
flatten(item);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return flattenedItems;
|
|
175
|
-
}
|