@snack-uikit/list 0.11.0 → 0.11.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.
Files changed (125) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +22 -61
  3. package/dist/components/Items/AccordionItem/AccordionItem.d.ts +4 -2
  4. package/dist/components/Items/AccordionItem/AccordionItem.js +18 -16
  5. package/dist/components/Items/BaseItem/BaseItem.d.ts +8 -4
  6. package/dist/components/Items/BaseItem/BaseItem.js +20 -14
  7. package/dist/components/Items/BaseItem/styles.module.css +20 -119
  8. package/dist/components/Items/GroupItem/GroupItem.d.ts +5 -1
  9. package/dist/components/Items/GroupItem/GroupItem.js +1 -3
  10. package/dist/components/Items/GroupSelectItem/GroupSelectItem.d.ts +4 -0
  11. package/dist/components/Items/GroupSelectItem/GroupSelectItem.js +18 -0
  12. package/dist/components/Items/GroupSelectItem/index.d.ts +1 -0
  13. package/dist/components/Items/GroupSelectItem/index.js +1 -0
  14. package/dist/components/Items/NextListItem/NextListItem.d.ts +6 -2
  15. package/dist/components/Items/NextListItem/NextListItem.js +55 -45
  16. package/dist/components/Items/NextListItem/constants.d.ts +2 -0
  17. package/dist/components/Items/NextListItem/constants.js +10 -0
  18. package/dist/components/Items/PinGroupItem/PinGroupItem.js +7 -3
  19. package/dist/components/Items/PinGroupItem/styles.module.css +26 -14
  20. package/dist/components/Items/SearchItem/SearchItem.d.ts +3 -1
  21. package/dist/components/Items/SearchItem/SearchItem.js +5 -8
  22. package/dist/components/Items/hooks.d.ts +11 -10
  23. package/dist/components/Items/hooks.js +64 -46
  24. package/dist/components/Items/index.d.ts +1 -5
  25. package/dist/components/Items/index.js +1 -5
  26. package/dist/components/Items/styles.module.css +33 -26
  27. package/dist/components/Items/types.d.ts +68 -34
  28. package/dist/components/Items/utils.d.ts +34 -16
  29. package/dist/components/Items/utils.js +135 -37
  30. package/dist/components/Lists/Droplist/DropList.d.ts +1 -1
  31. package/dist/components/Lists/Droplist/DropList.js +78 -50
  32. package/dist/components/Lists/List/List.d.ts +5 -9
  33. package/dist/components/Lists/List/List.js +61 -54
  34. package/dist/components/Lists/ListPrivate/ListPrivate.d.ts +6 -20
  35. package/dist/components/Lists/ListPrivate/ListPrivate.js +9 -8
  36. package/dist/components/Lists/ListPrivate/styles.module.css +1 -0
  37. package/dist/components/Lists/contexts/CollapseProvider.d.ts +13 -1
  38. package/dist/components/Lists/contexts/CollapseProvider.js +2 -0
  39. package/dist/components/Lists/contexts/FocusListProvider.d.ts +9 -0
  40. package/dist/components/Lists/contexts/FocusListProvider.js +5 -0
  41. package/dist/components/Lists/contexts/NewListProvider.d.ts +32 -0
  42. package/dist/components/Lists/contexts/{ListProvider.js → NewListProvider.js} +10 -5
  43. package/dist/components/Lists/contexts/SelectionProvider.d.ts +25 -15
  44. package/dist/components/Lists/contexts/SelectionProvider.js +17 -13
  45. package/dist/components/Lists/contexts/index.d.ts +3 -2
  46. package/dist/components/Lists/contexts/index.js +3 -2
  47. package/dist/components/Lists/hooks.d.ts +10 -12
  48. package/dist/components/Lists/hooks.js +73 -40
  49. package/dist/components/Lists/index.d.ts +2 -1
  50. package/dist/components/Lists/index.js +1 -0
  51. package/dist/components/Lists/types.d.ts +12 -14
  52. package/dist/components/index.d.ts +2 -2
  53. package/dist/components/index.js +1 -1
  54. package/dist/helperComponents/ItemContent/ItemContent.d.ts +15 -0
  55. package/dist/helperComponents/ItemContent/ItemContent.js +23 -0
  56. package/dist/helperComponents/ItemContent/index.d.ts +1 -0
  57. package/dist/helperComponents/ItemContent/index.js +1 -0
  58. package/dist/helperComponents/ItemContent/styles.module.css +117 -0
  59. package/dist/helperComponents/ListEmptyState/ListEmptyState.d.ts +2 -2
  60. package/dist/helperComponents/ListEmptyState/ListEmptyState.js +13 -4
  61. package/dist/helperComponents/Separator/Separator.d.ts +8 -2
  62. package/dist/helperComponents/Separator/Separator.js +22 -2
  63. package/dist/helperComponents/Separator/constants.d.ts +2 -0
  64. package/dist/helperComponents/Separator/constants.js +5 -0
  65. package/dist/helperComponents/Separator/styles.module.css +20 -1
  66. package/dist/helperComponents/index.d.ts +1 -0
  67. package/dist/helperComponents/index.js +1 -0
  68. package/dist/index.d.ts +2 -2
  69. package/dist/index.js +2 -2
  70. package/dist/types.d.ts +1 -1
  71. package/package.json +13 -18
  72. package/src/components/Items/AccordionItem/AccordionItem.tsx +24 -20
  73. package/src/components/Items/BaseItem/BaseItem.tsx +91 -82
  74. package/src/components/Items/BaseItem/styles.module.scss +19 -77
  75. package/src/components/Items/GroupItem/GroupItem.tsx +5 -5
  76. package/src/components/Items/GroupSelectItem/GroupSelectItem.tsx +44 -0
  77. package/src/components/Items/GroupSelectItem/index.ts +1 -0
  78. package/src/components/Items/NextListItem/NextListItem.tsx +88 -85
  79. package/src/components/Items/NextListItem/constants.ts +12 -0
  80. package/src/components/Items/PinGroupItem/PinGroupItem.tsx +14 -4
  81. package/src/components/Items/PinGroupItem/styles.module.scss +14 -14
  82. package/src/components/Items/SearchItem/SearchItem.tsx +6 -8
  83. package/src/components/Items/hooks.tsx +86 -66
  84. package/src/components/Items/index.ts +1 -5
  85. package/src/components/Items/styles.module.scss +36 -25
  86. package/src/components/Items/types.ts +91 -42
  87. package/src/components/Items/utils.ts +199 -52
  88. package/src/components/Lists/Droplist/DropList.tsx +155 -98
  89. package/src/components/Lists/List/List.tsx +129 -104
  90. package/src/components/Lists/ListPrivate/ListPrivate.tsx +19 -20
  91. package/src/components/Lists/ListPrivate/styles.module.scss +1 -0
  92. package/src/components/Lists/contexts/CollapseProvider.tsx +22 -0
  93. package/src/components/Lists/contexts/FocusListProvider.tsx +15 -0
  94. package/src/components/Lists/contexts/NewListProvider.tsx +54 -0
  95. package/src/components/Lists/contexts/SelectionProvider.tsx +56 -39
  96. package/src/components/Lists/contexts/index.ts +3 -2
  97. package/src/components/Lists/hooks.ts +124 -75
  98. package/src/components/Lists/index.ts +2 -2
  99. package/src/components/Lists/types.ts +20 -24
  100. package/src/components/index.ts +17 -2
  101. package/src/helperComponents/ItemContent/ItemContent.tsx +63 -0
  102. package/src/helperComponents/ItemContent/index.ts +1 -0
  103. package/src/helperComponents/ItemContent/styles.module.scss +78 -0
  104. package/src/helperComponents/ListEmptyState/ListEmptyState.tsx +26 -12
  105. package/src/helperComponents/Separator/Separator.tsx +49 -3
  106. package/src/helperComponents/Separator/constants.ts +7 -0
  107. package/src/helperComponents/Separator/styles.module.scss +41 -1
  108. package/src/helperComponents/index.ts +1 -0
  109. package/src/index.ts +4 -2
  110. package/src/types.ts +1 -1
  111. package/dist/components/Items/NextListItem/hooks.d.ts +0 -19
  112. package/dist/components/Items/NextListItem/hooks.js +0 -80
  113. package/dist/components/Lists/contexts/ListProvider.d.ts +0 -17
  114. package/dist/components/Lists/contexts/ParentListProvider.d.ts +0 -18
  115. package/dist/components/Lists/contexts/ParentListProvider.js +0 -12
  116. package/dist/hooks.d.ts +0 -5
  117. package/dist/hooks.js +0 -15
  118. package/dist/utils.d.ts +0 -30
  119. package/dist/utils.js +0 -115
  120. package/src/components/Items/NextListItem/hooks.ts +0 -105
  121. package/src/components/Lists/contexts/CollapseProvider.ts +0 -9
  122. package/src/components/Lists/contexts/ListProvider.tsx +0 -28
  123. package/src/components/Lists/contexts/ParentListProvider.tsx +0 -35
  124. package/src/hooks.ts +0 -27
  125. package/src/utils.ts +0 -175
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,9 +0,0 @@
1
- import { createContext, useContext } from 'react';
2
-
3
- export type CollapseContextType = {
4
- level?: number;
5
- };
6
-
7
- export const CollapseContext = createContext<CollapseContextType>({});
8
-
9
- export const useCollapseContext = () => useContext(CollapseContext);
@@ -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
- }