@skbkontur/side-menu 1.12.7 → 1.12.9-any-level.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +0 -9
- package/SideMenuDataTids.d.ts +1 -0
- package/SideMenuDataTids.js +1 -0
- package/hooks/useAnimateOnMount.js +3 -2
- package/lib/theming/ThemeHelpers.js +14 -3
- package/lib/utils/scripts.d.ts +1 -10
- package/lib/utils/scripts.js +0 -75
- package/package.json +2 -2
- package/src/Navigation.d.ts +47 -0
- package/src/Navigation.js +146 -0
- package/src/SideMenu/SideMenu.js +44 -31
- package/src/SideMenu/SideMenu.styles.d.ts +1 -0
- package/src/SideMenu/SideMenu.styles.js +5 -2
- package/src/SideMenuBody/SideMenuBody.js +7 -9
- package/src/SideMenuContext.d.ts +2 -7
- package/src/SideMenuDropdown/SideMenuDropdown.d.ts +1 -3
- package/src/SideMenuDropdown/SideMenuDropdown.js +1 -1
- package/src/SideMenuFooter/SideMenuFooter.js +3 -11
- package/src/SideMenuHeader/SideMenuHeader.js +3 -2
- package/src/SideMenuSubItem/SideMenuSubItem.js +3 -16
- package/src/SideMenuSubLink/SideMenuSubLink.js +4 -17
- package/src/Tree.d.ts +17 -0
- package/src/Tree.js +133 -0
- package/src/internal/BackButton.d.ts +0 -1
- package/src/internal/BackButton.js +3 -15
- package/src/internal/ClickableElement.d.ts +1 -5
- package/src/internal/ClickableElement.js +45 -44
- package/src/internal/InnerSubMenu.d.ts +1 -1
- package/src/internal/InnerSubMenu.js +10 -19
- package/src/internal/ItemContent/Caption.d.ts +2 -1
- package/src/internal/ItemContent/Caption.js +6 -5
- package/src/internal/ItemContent/ItemContent.d.ts +3 -1
- package/src/internal/ItemContent/ItemContent.js +6 -4
- package/src/internal/NestedMenu.d.ts +2 -2
- package/src/internal/NestedMenu.js +6 -16
- package/src/internal/SeparatedSubMenu.d.ts +2 -3
- package/src/internal/SeparatedSubMenu.js +9 -37
- package/src/internal/SideMenuLogotype.js +3 -3
- package/src/internal/SubMenu.d.ts +1 -4
- package/src/internal/SubMenu.js +8 -10
- package/hooks/useActiveState.d.ts +0 -1
- package/hooks/useActiveState.js +0 -12
- package/hooks/useOpenedState.d.ts +0 -2
- package/hooks/useOpenedState.js +0 -14
- package/hooks/useOpenedSubElementState.d.ts +0 -1
- package/hooks/useOpenedSubElementState.js +0 -12
- package/src/internal/InnerBody.d.ts +0 -14
- package/src/internal/InnerBody.js +0 -108
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.12.9](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.8...@skbkontur/side-menu@1.12.9) (2024-06-07)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @skbkontur/side-menu
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [1.12.8](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.7...@skbkontur/side-menu@1.12.8) (2024-06-05)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @skbkontur/side-menu
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
6
22
|
## [1.12.7](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.6...@skbkontur/side-menu@1.12.7) (2024-05-20)
|
|
7
23
|
|
|
8
24
|
**Note:** Version bump only for package @skbkontur/side-menu
|
package/README.md
CHANGED
|
@@ -328,15 +328,6 @@ const items = [
|
|
|
328
328
|
</div>
|
|
329
329
|
```
|
|
330
330
|
|
|
331
|
-
Если не хочется передавать свой `id`, то для ручного управления можно воспользоваться автоматически сгенерированными айдишниками. А также комбинировать свои `id` с автоматически сгенерированными.
|
|
332
|
-
|
|
333
|
-
Автоматическая генерация айдишников происходит по следующей схеме:
|
|
334
|
-
элементы меню первого уровня получают `id` равный `body-x`, где `x` - индекс элемента.
|
|
335
|
-
Элементы меню следующих уровней добавляют свой индекс: `body-x-y`.
|
|
336
|
-
|
|
337
|
-
Например, в пункте `Документы к подписанию` передан проп `id='documents'`, а также есть автоматически сгенерированный `id='body-0'`. Управлять можно по любому из них.
|
|
338
|
-
|
|
339
|
-
|
|
340
331
|
```jsx harmony
|
|
341
332
|
import { useState } from 'react';
|
|
342
333
|
import { getKonturAvatarUrl } from '@skbkontur/react-ui-addons';
|
package/SideMenuDataTids.d.ts
CHANGED
package/SideMenuDataTids.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { __read } from "tslib";
|
|
1
2
|
import { useEffect, useState } from 'react';
|
|
2
3
|
export function useAnimateOnMount(isMounted, delayTime, mountStyles, unmountStyles) {
|
|
3
|
-
var _a = useState(isMounted ? mountStyles : unmountStyles), style = _a[0], setStyle = _a[1];
|
|
4
|
-
var _b = useState(isMounted), shouldShowComponent = _b[0], setShouldShowComponent = _b[1];
|
|
4
|
+
var _a = __read(useState(isMounted ? mountStyles : unmountStyles), 2), style = _a[0], setStyle = _a[1];
|
|
5
|
+
var _b = __read(useState(isMounted), 2), shouldShowComponent = _b[0], setShouldShowComponent = _b[1];
|
|
5
6
|
useEffect(function () {
|
|
6
7
|
var timeoutId;
|
|
7
8
|
if (isMounted) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { __values } from "tslib";
|
|
1
2
|
import { isFunction } from '@skbkontur/react-ui/lib/utils';
|
|
2
3
|
import { memo } from '../utils/memo';
|
|
3
4
|
import { SideMenuThemeInternal, isSideMenuTheme, markAsSideMenuTheme } from '../../internal/themes/SideMenuTheme';
|
|
@@ -12,6 +13,7 @@ import { SideMenuThemeInternal, isSideMenuTheme, markAsSideMenuTheme } from '../
|
|
|
12
13
|
* and using ReactUI's ThemeContext.Provider for overriding them.
|
|
13
14
|
*/
|
|
14
15
|
export var createSideMenuTheme = function (theme) {
|
|
16
|
+
var e_1, _a;
|
|
15
17
|
if (isSideMenuTheme(theme))
|
|
16
18
|
return theme;
|
|
17
19
|
var sideMenuTheme = Object.create(theme, Object.assign(Object.getOwnPropertyDescriptors(SideMenuThemeInternal), {}));
|
|
@@ -28,9 +30,18 @@ export var createSideMenuTheme = function (theme) {
|
|
|
28
30
|
},
|
|
29
31
|
});
|
|
30
32
|
};
|
|
31
|
-
|
|
32
|
-
var
|
|
33
|
-
|
|
33
|
+
try {
|
|
34
|
+
for (var _b = __values(Object.keys(sideMenuTheme)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
35
|
+
var key = _c.value;
|
|
36
|
+
_loop_1(key);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
40
|
+
finally {
|
|
41
|
+
try {
|
|
42
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
43
|
+
}
|
|
44
|
+
finally { if (e_1) throw e_1.error; }
|
|
34
45
|
}
|
|
35
46
|
return markAsSideMenuTheme(sideMenuTheme);
|
|
36
47
|
};
|
package/lib/utils/scripts.d.ts
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import { FlattedArrayElementType } from '../../src/internal/InnerBody';
|
|
3
|
-
export declare const getItemId: (prefix: 'body' | 'footer', id: string | number) => string;
|
|
4
|
-
export declare const isClickableSubElement: (element: string) => boolean;
|
|
5
|
-
export declare const isClickableElement: (element: string) => boolean;
|
|
6
|
-
export declare const getAllParents: (id: string, flattedArrayOfAllElements: FlattedArrayElementType[]) => string[];
|
|
7
|
-
export declare const getChildrenIdArray: (childrenArray: FlattedArrayElementType[], id: string, isIdGenerated?: boolean) => string[];
|
|
8
|
-
export declare const getElementsChildren: (element: ReactElement, levelIndex: string) => FlattedArrayElementType[];
|
|
9
|
-
export declare const isParentOpened: (id: string | undefined, generatedId: string | undefined, openedParents: string[] | undefined) => boolean | "" | undefined;
|
|
10
|
-
export declare const isElementActive: (id: string | undefined, activeMenuItem: string | undefined | null) => boolean;
|
|
1
|
+
import React from 'react';
|
|
11
2
|
export declare const isBrowser: boolean;
|
|
12
3
|
export declare const isTouchDevice: () => boolean;
|
|
13
4
|
export declare const isKonturIcon: (icon: React.ReactElement) => boolean;
|
package/lib/utils/scripts.js
CHANGED
|
@@ -1,78 +1,3 @@
|
|
|
1
|
-
import React, { isValidElement } from 'react';
|
|
2
|
-
import { isNonNullable } from '@skbkontur/react-ui/lib/utils';
|
|
3
|
-
export var getItemId = function (prefix, id) {
|
|
4
|
-
return prefix + "-" + id;
|
|
5
|
-
};
|
|
6
|
-
var SideMenuClickableSubElements = ['SideMenuSubItem', 'SideMenuSubLink'];
|
|
7
|
-
export var isClickableSubElement = function (element) {
|
|
8
|
-
return SideMenuClickableSubElements.includes(element);
|
|
9
|
-
};
|
|
10
|
-
var SideMenuClickableElements = ['SideMenuItem', 'SideMenuLink'];
|
|
11
|
-
export var isClickableElement = function (element) {
|
|
12
|
-
return SideMenuClickableElements.includes(element);
|
|
13
|
-
};
|
|
14
|
-
export var getAllParents = function (id, flattedArrayOfAllElements) {
|
|
15
|
-
var parentsArray = [];
|
|
16
|
-
var element = flattedArrayOfAllElements.find(function (element) { return element.id === id || element.generatedId === id; });
|
|
17
|
-
if (element && element.id && isNonNullable(element.parentId)) {
|
|
18
|
-
parentsArray.push(element.parentId);
|
|
19
|
-
parentsArray.push.apply(parentsArray, getAllParents(element.parentId, flattedArrayOfAllElements));
|
|
20
|
-
}
|
|
21
|
-
else if (element && isNonNullable(element.generatedParentId)) {
|
|
22
|
-
parentsArray.push(element.generatedParentId);
|
|
23
|
-
parentsArray.push.apply(parentsArray, getAllParents(element.generatedParentId, flattedArrayOfAllElements));
|
|
24
|
-
}
|
|
25
|
-
return parentsArray;
|
|
26
|
-
};
|
|
27
|
-
export var getChildrenIdArray = function (childrenArray, id, isIdGenerated) {
|
|
28
|
-
if (isIdGenerated === void 0) { isIdGenerated = false; }
|
|
29
|
-
var parentId = isIdGenerated ? 'generatedParentId' : 'parentId';
|
|
30
|
-
var childId = isIdGenerated ? 'generatedId' : 'id';
|
|
31
|
-
return childrenArray.filter(function (el) { return el[parentId] === id; }).map(function (el) { return el[childId]; });
|
|
32
|
-
};
|
|
33
|
-
export var getElementsChildren = function (element, levelIndex) {
|
|
34
|
-
var childrenArray = [];
|
|
35
|
-
if (element.props.children) {
|
|
36
|
-
var childLevelIndex_1 = 0;
|
|
37
|
-
React.Children.map(element.props.children, function (child) {
|
|
38
|
-
var _a, _b;
|
|
39
|
-
var isClickableComponent =
|
|
40
|
-
// @ts-expect-error: accessing private property
|
|
41
|
-
isClickableElement((_a = child === null || child === void 0 ? void 0 : child.type) === null || _a === void 0 ? void 0 : _a.__KONTUR_REACT_UI__) ||
|
|
42
|
-
// @ts-expect-error: accessing private property
|
|
43
|
-
isClickableSubElement((_b = child === null || child === void 0 ? void 0 : child.type) === null || _b === void 0 ? void 0 : _b.__KONTUR_REACT_UI__);
|
|
44
|
-
if (isValidElement(child) && isClickableComponent) {
|
|
45
|
-
var id = child.props.id;
|
|
46
|
-
var generatedId = levelIndex + "-" + childLevelIndex_1;
|
|
47
|
-
var subChildrenArray = getElementsChildren(child, levelIndex + "-" + childLevelIndex_1);
|
|
48
|
-
var childrenIdArray = getChildrenIdArray(subChildrenArray, id);
|
|
49
|
-
var generatedChildrenIdArray = getChildrenIdArray(subChildrenArray, generatedId, true);
|
|
50
|
-
childrenArray.push({
|
|
51
|
-
id: id || child.props.href,
|
|
52
|
-
generatedId: generatedId,
|
|
53
|
-
parentId: element.props.id || element.props.href,
|
|
54
|
-
generatedParentId: "" + levelIndex,
|
|
55
|
-
childrenId: childrenIdArray,
|
|
56
|
-
generatedChildrenId: generatedChildrenIdArray,
|
|
57
|
-
});
|
|
58
|
-
childrenArray.push.apply(childrenArray, subChildrenArray);
|
|
59
|
-
childLevelIndex_1++;
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
return childrenArray;
|
|
64
|
-
};
|
|
65
|
-
export var isParentOpened = function (id, generatedId, openedParents) {
|
|
66
|
-
if (!openedParents || (openedParents === null || openedParents === void 0 ? void 0 : openedParents.length) === 0) {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
var idIsOpened = id && openedParents.includes(id);
|
|
70
|
-
var generatedIdIsOpened = generatedId && openedParents.includes(generatedId);
|
|
71
|
-
return idIsOpened || generatedIdIsOpened;
|
|
72
|
-
};
|
|
73
|
-
export var isElementActive = function (id, activeMenuItem) {
|
|
74
|
-
return !!id && !!activeMenuItem && id === activeMenuItem;
|
|
75
|
-
};
|
|
76
1
|
export var isBrowser = typeof window !== 'undefined';
|
|
77
2
|
export var isTouchDevice = function () {
|
|
78
3
|
return isBrowser && ('ontouchstart' in window || navigator.maxTouchPoints > 0);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skbkontur/side-menu",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.9-any-level.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@skbkontur/icons": "^1.10.0",
|
|
26
|
-
"@skbkontur/react-ui-addons": "^4.11.
|
|
26
|
+
"@skbkontur/react-ui-addons": "^4.11.2",
|
|
27
27
|
"tslib": "^1"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
import { Tree, TreeNode } from './Tree';
|
|
3
|
+
export interface NavigableElement {
|
|
4
|
+
setIsActive: (value: boolean) => void;
|
|
5
|
+
setIsOpened: (value: boolean) => void;
|
|
6
|
+
setIsNestedSubMenu: (value: boolean) => void;
|
|
7
|
+
setHasSubIcons: (value: boolean) => void;
|
|
8
|
+
setIsFirstLevelParentOfActiveMenuItem: (value: boolean) => void;
|
|
9
|
+
isSubMenu?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface MenuNavigationOptions {
|
|
12
|
+
root: RefObject<HTMLDivElement> | null;
|
|
13
|
+
activeMenuItem?: string;
|
|
14
|
+
setActiveMenuItem: (id: string) => void;
|
|
15
|
+
isSeparatedMenu: boolean;
|
|
16
|
+
isSeparatedMenuShown: boolean;
|
|
17
|
+
setIsSeparatedMenuShown: (value: boolean) => void;
|
|
18
|
+
isOpened?: boolean;
|
|
19
|
+
isDesktopQuery?: boolean;
|
|
20
|
+
isMobile?: boolean;
|
|
21
|
+
isCollapsable?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare class MenuNavigation {
|
|
24
|
+
private readonly root;
|
|
25
|
+
navigationTree: Tree | null;
|
|
26
|
+
activeMenuItem?: string;
|
|
27
|
+
isSeparatedMenuShown?: boolean;
|
|
28
|
+
setIsSeparatedMenuShown?: (value: boolean) => void;
|
|
29
|
+
private readonly setActiveMenuItem?;
|
|
30
|
+
private readonly isSeparatedMenu;
|
|
31
|
+
activeMenuItemTreeNode?: TreeNode;
|
|
32
|
+
private readonly isOpened?;
|
|
33
|
+
private readonly isDesktop?;
|
|
34
|
+
private readonly isMobile?;
|
|
35
|
+
private readonly isCollapsable?;
|
|
36
|
+
constructor(options: MenuNavigationOptions);
|
|
37
|
+
updateNavigationTree(): void;
|
|
38
|
+
addValue(id: string, value: NavigableElement): void;
|
|
39
|
+
switchActiveMenuItem(id?: string, isButton?: boolean): void;
|
|
40
|
+
private setActiveFirstLevelMenuItemInSeparatedMenu;
|
|
41
|
+
private setHighlightedFirstLevelMenuItemInMinimizedInnerMenu;
|
|
42
|
+
private openMenuItems;
|
|
43
|
+
private openAllParents;
|
|
44
|
+
private getParentId;
|
|
45
|
+
private switchVisibilityOfSeparatedMenu;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { __read, __spread } from "tslib";
|
|
2
|
+
import { SideMenuDataTids } from '../SideMenuDataTids';
|
|
3
|
+
import { Tree } from './Tree';
|
|
4
|
+
var MENU_ROOT_ID = 'menu-root-id';
|
|
5
|
+
var MenuNavigation = /** @class */ (function () {
|
|
6
|
+
function MenuNavigation(options) {
|
|
7
|
+
this.navigationTree = null;
|
|
8
|
+
this.navigationTree = new Tree(MENU_ROOT_ID);
|
|
9
|
+
this.activeMenuItemTreeNode = this.navigationTree.find(options.activeMenuItem);
|
|
10
|
+
this.root = options.root;
|
|
11
|
+
this.activeMenuItem = options.activeMenuItem;
|
|
12
|
+
this.setActiveMenuItem = options.setActiveMenuItem;
|
|
13
|
+
this.isSeparatedMenu = options.isSeparatedMenu;
|
|
14
|
+
this.isSeparatedMenuShown = options.isSeparatedMenuShown;
|
|
15
|
+
this.setIsSeparatedMenuShown = options.setIsSeparatedMenuShown;
|
|
16
|
+
this.isOpened = options.isOpened;
|
|
17
|
+
this.isDesktop = options.isDesktopQuery;
|
|
18
|
+
this.isMobile = options.isMobile;
|
|
19
|
+
this.isCollapsable = options.isCollapsable;
|
|
20
|
+
}
|
|
21
|
+
MenuNavigation.prototype.updateNavigationTree = function () {
|
|
22
|
+
var _this = this;
|
|
23
|
+
var _a;
|
|
24
|
+
if ((_a = this.root) === null || _a === void 0 ? void 0 : _a.current) {
|
|
25
|
+
var menuItems = Array.from(this.root.current.querySelectorAll("[data-tid=\"SideMenu__clickableElement\"]")).filter(function (item) { return !item.querySelector('button[data-tid="SideMenu__backButton"]'); });
|
|
26
|
+
menuItems.forEach(function (menuItem) {
|
|
27
|
+
var _a, _b, _c;
|
|
28
|
+
var id = menuItem.getAttribute('data-navigation-id');
|
|
29
|
+
var parentId = _this.getParentId(menuItem);
|
|
30
|
+
var oldValue = (_b = (_a = _this.navigationTree) === null || _a === void 0 ? void 0 : _a.find(id)) === null || _b === void 0 ? void 0 : _b.value;
|
|
31
|
+
(_c = _this.navigationTree) === null || _c === void 0 ? void 0 : _c.insert(parentId, id, oldValue);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
MenuNavigation.prototype.addValue = function (id, value) {
|
|
36
|
+
var _a, _b, _c;
|
|
37
|
+
this.updateNavigationTree();
|
|
38
|
+
var foundTreeNode = (_a = this.navigationTree) === null || _a === void 0 ? void 0 : _a.find(id);
|
|
39
|
+
if (foundTreeNode) {
|
|
40
|
+
foundTreeNode.value = value;
|
|
41
|
+
}
|
|
42
|
+
if ((foundTreeNode === null || foundTreeNode === void 0 ? void 0 : foundTreeNode.parent) && foundTreeNode.parent.parent && foundTreeNode.parent.parent.id !== MENU_ROOT_ID) {
|
|
43
|
+
(_b = foundTreeNode.value) === null || _b === void 0 ? void 0 : _b.setIsNestedSubMenu(true);
|
|
44
|
+
}
|
|
45
|
+
if (this.isSeparatedMenu && (foundTreeNode === null || foundTreeNode === void 0 ? void 0 : foundTreeNode.hasChildren)) {
|
|
46
|
+
(_c = foundTreeNode.value) === null || _c === void 0 ? void 0 : _c.setHasSubIcons(true);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
MenuNavigation.prototype.switchActiveMenuItem = function (id, isButton) {
|
|
50
|
+
var _a, _b, _c, _d;
|
|
51
|
+
!isButton &&
|
|
52
|
+
__spread((_a = this.navigationTree) === null || _a === void 0 ? void 0 : _a.preOrderTraversal()).map(function (x) {
|
|
53
|
+
var _a;
|
|
54
|
+
(_a = x.value) === null || _a === void 0 ? void 0 : _a.setIsActive(false);
|
|
55
|
+
});
|
|
56
|
+
var foundTreeNode = (_b = this.navigationTree) === null || _b === void 0 ? void 0 : _b.find(id);
|
|
57
|
+
if (foundTreeNode) {
|
|
58
|
+
if (!isButton) {
|
|
59
|
+
this.activeMenuItem = foundTreeNode.id;
|
|
60
|
+
this.activeMenuItemTreeNode = foundTreeNode;
|
|
61
|
+
(_c = this.setActiveMenuItem) === null || _c === void 0 ? void 0 : _c.call(this, foundTreeNode.id);
|
|
62
|
+
this.isSeparatedMenu && this.setActiveFirstLevelMenuItemInSeparatedMenu(foundTreeNode);
|
|
63
|
+
this.setHighlightedFirstLevelMenuItemInMinimizedInnerMenu(foundTreeNode);
|
|
64
|
+
(_d = foundTreeNode.value) === null || _d === void 0 ? void 0 : _d.setIsActive(true);
|
|
65
|
+
}
|
|
66
|
+
this.isSeparatedMenu && this.switchVisibilityOfSeparatedMenu();
|
|
67
|
+
this.openMenuItems(foundTreeNode);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
MenuNavigation.prototype.setActiveFirstLevelMenuItemInSeparatedMenu = function (treeNode) {
|
|
71
|
+
var _a;
|
|
72
|
+
var parentTreeNode = treeNode.parent;
|
|
73
|
+
while (parentTreeNode) {
|
|
74
|
+
var foundNode = parentTreeNode.parent;
|
|
75
|
+
if ((foundNode === null || foundNode === void 0 ? void 0 : foundNode.id) === MENU_ROOT_ID) {
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
parentTreeNode = foundNode;
|
|
79
|
+
}
|
|
80
|
+
(_a = parentTreeNode === null || parentTreeNode === void 0 ? void 0 : parentTreeNode.value) === null || _a === void 0 ? void 0 : _a.setIsFirstLevelParentOfActiveMenuItem(true);
|
|
81
|
+
};
|
|
82
|
+
MenuNavigation.prototype.setHighlightedFirstLevelMenuItemInMinimizedInnerMenu = function (treeNode) {
|
|
83
|
+
var _a, _b;
|
|
84
|
+
__spread((_a = this.navigationTree) === null || _a === void 0 ? void 0 : _a.preOrderTraversal()).map(function (x) {
|
|
85
|
+
var _a;
|
|
86
|
+
(_a = x.value) === null || _a === void 0 ? void 0 : _a.setIsFirstLevelParentOfActiveMenuItem(false);
|
|
87
|
+
});
|
|
88
|
+
var parentTreeNode = treeNode.parent;
|
|
89
|
+
while (parentTreeNode) {
|
|
90
|
+
var foundNode = parentTreeNode.parent;
|
|
91
|
+
if ((foundNode === null || foundNode === void 0 ? void 0 : foundNode.id) === MENU_ROOT_ID) {
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
parentTreeNode = foundNode;
|
|
95
|
+
}
|
|
96
|
+
(_b = parentTreeNode === null || parentTreeNode === void 0 ? void 0 : parentTreeNode.value) === null || _b === void 0 ? void 0 : _b.setIsFirstLevelParentOfActiveMenuItem(true);
|
|
97
|
+
};
|
|
98
|
+
MenuNavigation.prototype.openMenuItems = function (treeNode) {
|
|
99
|
+
var _a, _b, _c;
|
|
100
|
+
!((_a = treeNode.value) === null || _a === void 0 ? void 0 : _a.isSubMenu) && __spread((_b = this.navigationTree) === null || _b === void 0 ? void 0 : _b.preOrderTraversal()).map(function (x) { var _a; return (_a = x.value) === null || _a === void 0 ? void 0 : _a.setIsOpened(false); });
|
|
101
|
+
if (treeNode.children.length > 0) {
|
|
102
|
+
(_c = treeNode.value) === null || _c === void 0 ? void 0 : _c.setIsOpened(true);
|
|
103
|
+
}
|
|
104
|
+
this.openAllParents(treeNode);
|
|
105
|
+
};
|
|
106
|
+
MenuNavigation.prototype.openAllParents = function (treeNode) {
|
|
107
|
+
var _a;
|
|
108
|
+
var parentTreeNode = treeNode.parent;
|
|
109
|
+
while (parentTreeNode && parentTreeNode.id !== MENU_ROOT_ID) {
|
|
110
|
+
(_a = parentTreeNode.value) === null || _a === void 0 ? void 0 : _a.setIsOpened(true);
|
|
111
|
+
parentTreeNode = parentTreeNode.parent;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
MenuNavigation.prototype.getParentId = function (menuItem) {
|
|
115
|
+
var _a, _b, _c;
|
|
116
|
+
var parentElement;
|
|
117
|
+
var clickableElementSelector = "[data-tid=" + SideMenuDataTids.clickableElement + "]";
|
|
118
|
+
var separatedMenuSelector = "[data-tid=" + SideMenuDataTids.separatedSubMenu + "]";
|
|
119
|
+
parentElement = (_a = menuItem.parentElement) === null || _a === void 0 ? void 0 : _a.closest(clickableElementSelector);
|
|
120
|
+
if (!parentElement) {
|
|
121
|
+
var separatedMenu = menuItem.closest(separatedMenuSelector);
|
|
122
|
+
if (separatedMenu) {
|
|
123
|
+
var firstLevelMenuId = separatedMenu.getAttribute('data-parent-navigation-id');
|
|
124
|
+
parentElement = (_c = (_b = this.root) === null || _b === void 0 ? void 0 : _b.current) === null || _c === void 0 ? void 0 : _c.querySelector("[data-navigation-id=\"" + firstLevelMenuId + "\"]");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return (parentElement === null || parentElement === void 0 ? void 0 : parentElement.getAttribute('data-navigation-id')) || MENU_ROOT_ID;
|
|
128
|
+
};
|
|
129
|
+
MenuNavigation.prototype.switchVisibilityOfSeparatedMenu = function () {
|
|
130
|
+
var _a, _b, _c, _d, _e;
|
|
131
|
+
if (!this.isSeparatedMenu)
|
|
132
|
+
return;
|
|
133
|
+
var activeItemHasParent = (_b = (_a = this.activeMenuItemTreeNode) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.isSubMenu;
|
|
134
|
+
var activeMenuItemHasChildren = (_c = this.activeMenuItemTreeNode) === null || _c === void 0 ? void 0 : _c.hasChildren;
|
|
135
|
+
var isActive = activeItemHasParent || activeMenuItemHasChildren || false;
|
|
136
|
+
var isMinimizedInWideDesktop = !this.isOpened && this.isDesktop && !this.isCollapsable;
|
|
137
|
+
if (this.isMobile && !activeItemHasParent && this.isSeparatedMenuShown) {
|
|
138
|
+
this.isSeparatedMenuShown = false;
|
|
139
|
+
return (_d = this.setIsSeparatedMenuShown) === null || _d === void 0 ? void 0 : _d.call(this, false);
|
|
140
|
+
}
|
|
141
|
+
this.isSeparatedMenuShown = isActive && !isMinimizedInWideDesktop;
|
|
142
|
+
(_e = this.setIsSeparatedMenuShown) === null || _e === void 0 ? void 0 : _e.call(this, this.isSeparatedMenuShown);
|
|
143
|
+
};
|
|
144
|
+
return MenuNavigation;
|
|
145
|
+
}());
|
|
146
|
+
export { MenuNavigation };
|
package/src/SideMenu/SideMenu.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __assign, __rest } from "tslib";
|
|
1
|
+
import { __assign, __read, __rest } from "tslib";
|
|
2
2
|
import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
|
|
4
4
|
import { isIE11 } from '@skbkontur/react-ui/lib/client';
|
|
@@ -27,15 +27,18 @@ import { ZIndex } from '@skbkontur/react-ui/internal/ZIndex';
|
|
|
27
27
|
import { useAnimateOnMount } from '../../hooks/useAnimateOnMount';
|
|
28
28
|
import { getSideMenuTheme } from '../../lib/theming/ThemeHelpers';
|
|
29
29
|
import { mergeRefs } from '@skbkontur/react-ui/lib/utils';
|
|
30
|
+
import { MenuNavigation } from '../Navigation';
|
|
30
31
|
export var transitionDuration = 300; //ms
|
|
31
32
|
export var burgerTransitionDuration = (transitionDuration * 2) / 3;
|
|
32
33
|
var SideMenuInner = forwardRef(function (_a, ref) {
|
|
33
34
|
var _b, _c, _d, _e;
|
|
34
|
-
var
|
|
35
|
+
var _f;
|
|
36
|
+
var children = _a.children, value = _a.value, onValueChange = _a.onValueChange, _g = _a.size, size = _g === void 0 ? 'small' : _g, _h = _a.isSeparatedMenu, isSeparatedMenu = _h === void 0 ? false : _h, className = _a.className, _j = _a.disableSwipe, disableSwipe = _j === void 0 ? false : _j, _k = _a.disableCollapsing, disableCollapsing = _k === void 0 ? false : _k, desktopMediaQuery = _a.desktopMediaQuery, narrowDesktopMediaQuery = _a.narrowDesktopMediaQuery, tabletMediaQuery = _a.tabletMediaQuery, mobileMediaQuery = _a.mobileMediaQuery, _l = _a.hideScrollBar, hideScrollBar = _l === void 0 ? undefined : _l, _m = _a.showScrollBar, showScrollBar = _m === void 0 ? 'hover' : _m, isOpen = _a.isOpen, onOpen = _a.onOpen, onClose = _a.onClose, rest = __rest(_a, ["children", "value", "onValueChange", "size", "isSeparatedMenu", "className", "disableSwipe", "disableCollapsing", "desktopMediaQuery", "narrowDesktopMediaQuery", "tabletMediaQuery", "mobileMediaQuery", "hideScrollBar", "showScrollBar", "isOpen", "onOpen", "onClose"]);
|
|
35
37
|
var transitionTimer = useRef(null);
|
|
36
38
|
var sideMenuRef = useRef(null);
|
|
37
39
|
var contentWrapperRef = useRef(null);
|
|
38
40
|
var scrollContainerRef = useRef(null);
|
|
41
|
+
var navigation = useRef(null);
|
|
39
42
|
var theme = getSideMenuTheme(useContext(ThemeContext));
|
|
40
43
|
var customMediaQueries = {
|
|
41
44
|
isMobileQuery: mobileMediaQuery || theme.sideMenuMobileMediaQuery,
|
|
@@ -43,31 +46,49 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
43
46
|
isNarrowDesktopQuery: narrowDesktopMediaQuery || theme.sideMenuNarrowDesktopMediaQuery,
|
|
44
47
|
isDesktopQuery: desktopMediaQuery || theme.sideMenuDesktopMediaQuery,
|
|
45
48
|
};
|
|
46
|
-
var
|
|
49
|
+
var _o = useResponsiveLayout({
|
|
47
50
|
customMediaQueries: customMediaQueries,
|
|
48
|
-
}), isMobileQuery =
|
|
51
|
+
}), isMobileQuery = _o.isMobileQuery, isTabletQuery = _o.isTabletQuery, isNarrowDesktopQuery = _o.isNarrowDesktopQuery, isDesktopQuery = _o.isDesktopQuery;
|
|
49
52
|
var isNarrowDesktop = isNarrowDesktopQuery && !isDesktopQuery;
|
|
50
53
|
var isTablet = isTabletQuery && !isNarrowDesktopQuery;
|
|
51
54
|
var isMobile = isMobileQuery && !isTabletQuery;
|
|
52
55
|
var isTabletOrMobile = isTablet || isMobile;
|
|
53
56
|
var isTouchScreen = isTouchDevice() || isMobile || isTablet;
|
|
54
57
|
var manual = isOpen !== undefined;
|
|
55
|
-
var
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var
|
|
60
|
-
var
|
|
61
|
-
var
|
|
62
|
-
var
|
|
63
|
-
var
|
|
64
|
-
var
|
|
65
|
-
var
|
|
66
|
-
var
|
|
67
|
-
var
|
|
58
|
+
var _p = __read(useState(isDesktopQuery), 2), isOpened = _p[0], setIsOpened = _p[1];
|
|
59
|
+
var _q = __read(useState(false), 2), isBeingTransitioned = _q[0], setIsBeingTransitioned = _q[1];
|
|
60
|
+
var _r = __read(useState(value), 2), activeMenuItem = _r[0], setActiveMenuItem = _r[1];
|
|
61
|
+
var _s = __read(useState(null), 2), clickedButton = _s[0], setClickedButton = _s[1];
|
|
62
|
+
var _t = __read(useState(false), 2), isSeparatedMenuShown = _t[0], setIsSeparatedMenuShown = _t[1];
|
|
63
|
+
var _u = __read(useState(true), 2), isMouseOutside = _u[0], setIsMouseOutside = _u[1];
|
|
64
|
+
var _v = __read(useState('top'), 2), scrollState = _v[0], setScrollState = _v[1];
|
|
65
|
+
var _w = __read(useState(false), 2), hasScrollBar = _w[0], setHasScrollBar = _w[1];
|
|
66
|
+
var _x = __read(useState(0), 2), mousePositionX = _x[0], setMousePositionX = _x[1];
|
|
67
|
+
var _y = __read(useState(0), 2), headerHeight = _y[0], setHeaderHeight = _y[1];
|
|
68
|
+
var _z = __read(useState(isNarrowDesktop), 2), isCollapsable = _z[0], setIsCollapsable = _z[1];
|
|
69
|
+
var _0 = __read(useState(0), 2), leftPosition = _0[0], setLeftPosition = _0[1];
|
|
70
|
+
var _1 = __read(useState(false), 2), isHovered = _1[0], setIsHovered = _1[1];
|
|
71
|
+
var switchActiveMenuItem = function (id) {
|
|
72
|
+
if (id !== value) {
|
|
73
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
|
|
74
|
+
setActiveMenuItem(id);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
68
77
|
useEffect(function () {
|
|
69
78
|
var _a;
|
|
70
79
|
setLeftPosition(((_a = sideMenuRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0);
|
|
80
|
+
navigation.current = new MenuNavigation({
|
|
81
|
+
root: sideMenuRef,
|
|
82
|
+
activeMenuItem: activeMenuItem,
|
|
83
|
+
setActiveMenuItem: switchActiveMenuItem,
|
|
84
|
+
isSeparatedMenu: isSeparatedMenu,
|
|
85
|
+
isSeparatedMenuShown: isSeparatedMenuShown,
|
|
86
|
+
setIsSeparatedMenuShown: setIsSeparatedMenuShown,
|
|
87
|
+
isOpened: isOpened,
|
|
88
|
+
isDesktopQuery: isDesktopQuery,
|
|
89
|
+
isMobile: isMobile,
|
|
90
|
+
isCollapsable: isCollapsable,
|
|
91
|
+
});
|
|
71
92
|
return function () {
|
|
72
93
|
if (transitionTimer.current) {
|
|
73
94
|
clearTimeout(transitionTimer.current);
|
|
@@ -108,8 +129,9 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
108
129
|
isNarrowDesktop && setIsCollapsable(true);
|
|
109
130
|
}, [isNarrowDesktop, isDesktopQuery, isTablet, isMobile]);
|
|
110
131
|
useEffect(function () {
|
|
111
|
-
|
|
112
|
-
|
|
132
|
+
var _a;
|
|
133
|
+
(_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchActiveMenuItem(value);
|
|
134
|
+
}, [value, (_f = navigation.current) === null || _f === void 0 ? void 0 : _f.navigationTree]);
|
|
113
135
|
useEffect(function () {
|
|
114
136
|
handleIsOpened(isOpen, manual);
|
|
115
137
|
}, [isOpen]);
|
|
@@ -157,12 +179,6 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
157
179
|
}
|
|
158
180
|
setMousePositionX(relativeXCoordinate);
|
|
159
181
|
};
|
|
160
|
-
var switchActiveMenuItem = function (id) {
|
|
161
|
-
if (id !== value) {
|
|
162
|
-
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
|
|
163
|
-
setActiveMenuItem(id);
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
182
|
var showMenu = function (newIsShown) {
|
|
167
183
|
if (!isTabletOrMobile)
|
|
168
184
|
return;
|
|
@@ -178,11 +194,11 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
178
194
|
}
|
|
179
195
|
};
|
|
180
196
|
var isSideMenuOverContent = (isCollapsable || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
|
|
181
|
-
var
|
|
197
|
+
var _2 = __read(useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
|
|
182
198
|
opacity: DEFAULT_THEME.sidePageBackingBgOpacity,
|
|
183
199
|
}, {
|
|
184
200
|
opacity: 0,
|
|
185
|
-
}), shouldShowBackdrop =
|
|
201
|
+
}), 2), shouldShowBackdrop = _2[0], backdropStyle = _2[1];
|
|
186
202
|
var isSideMenuOverflowing = (isTabletOrMobile || isCollapsable) && isOpened;
|
|
187
203
|
var setScrollBar = function () {
|
|
188
204
|
var isSeparatedMenuShownInMobile = isMobile && isSeparatedMenuShown;
|
|
@@ -208,8 +224,6 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
208
224
|
isBeingTransitioned: isBeingTransitioned,
|
|
209
225
|
isSeparatedMenu: isSeparatedMenu,
|
|
210
226
|
size: size,
|
|
211
|
-
activeMenuItem: activeMenuItem,
|
|
212
|
-
switchActiveMenuItem: switchActiveMenuItem,
|
|
213
227
|
clickedButton: clickedButton,
|
|
214
228
|
setClickedButton: setClickedButton,
|
|
215
229
|
isDesktop: isDesktopQuery,
|
|
@@ -217,8 +231,6 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
217
231
|
isTablet: isTablet,
|
|
218
232
|
isMobile: isMobile,
|
|
219
233
|
isTouchScreen: isTouchScreen,
|
|
220
|
-
isSeparatedMenuShown: isSeparatedMenuShown,
|
|
221
|
-
setIsSeparatedMenuShown: setIsSeparatedMenuShown,
|
|
222
234
|
setIsMouseOutside: setIsMouseOutside,
|
|
223
235
|
scrollState: scrollState,
|
|
224
236
|
setScrollState: setScrollState,
|
|
@@ -229,6 +241,7 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
229
241
|
hideScrollBar: hideScrollBar,
|
|
230
242
|
showScrollBar: showScrollBar,
|
|
231
243
|
sideMenuRef: sideMenuRef,
|
|
244
|
+
navigation: navigation.current,
|
|
232
245
|
} },
|
|
233
246
|
(isOpened || isBeingTransitioned) && isTabletOrMobile && React.createElement("div", { style: { height: headerHeight } }),
|
|
234
247
|
React.createElement(ZIndex, { priority: isSideMenuOverflowing ? 8 : 0, className: cx((_b = {},
|
|
@@ -64,11 +64,14 @@ var styles = {
|
|
|
64
64
|
list: function () {
|
|
65
65
|
return css(templateObject_20 || (templateObject_20 = __makeTemplateObject(["\n list-style: none;\n padding: 0;\n margin: 0;\n "], ["\n list-style: none;\n padding: 0;\n margin: 0;\n "])));
|
|
66
66
|
},
|
|
67
|
+
hidden: function () {
|
|
68
|
+
return css(templateObject_21 || (templateObject_21 = __makeTemplateObject(["\n display: none;\n "], ["\n display: none;\n "])));
|
|
69
|
+
},
|
|
67
70
|
};
|
|
68
71
|
export var customStyles = {
|
|
69
72
|
rootForTabletsOrMobiles: function (headerHeight) {
|
|
70
|
-
return css(
|
|
73
|
+
return css(templateObject_22 || (templateObject_22 = __makeTemplateObject(["\n height: ", "px;\n top: 0;\n transition: height ", "ms ease-out;\n "], ["\n height: ", "px;\n top: 0;\n transition: height ", "ms ease-out;\n "])), headerHeight, burgerTransitionDuration);
|
|
71
74
|
},
|
|
72
75
|
};
|
|
73
76
|
export var jsStylesForSideMenu = memoizeStyle(styles);
|
|
74
|
-
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19, templateObject_20, templateObject_21;
|
|
77
|
+
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19, templateObject_20, templateObject_21, templateObject_22;
|
|
@@ -3,22 +3,20 @@ import React, { forwardRef, useContext } from 'react';
|
|
|
3
3
|
import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
|
|
4
4
|
import { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext';
|
|
5
5
|
import { jsStyles } from './SideMenuBody.styles';
|
|
6
|
-
import { InnerBody } from '../internal/InnerBody';
|
|
7
6
|
import { SideMenuContext } from '../SideMenuContext';
|
|
8
7
|
import { getSideMenuTheme } from '../../lib/theming/ThemeHelpers';
|
|
9
8
|
import { jsStylesForSideMenu } from '../SideMenu/SideMenu.styles';
|
|
10
9
|
var SideMenuBodyInner = forwardRef(function (_a, ref) {
|
|
11
|
-
var _b;
|
|
10
|
+
var _b, _c;
|
|
12
11
|
var className = _a.className, children = _a.children, rest = __rest(_a, ["className", "children"]);
|
|
13
12
|
var context = useContext(SideMenuContext);
|
|
14
13
|
var theme = getSideMenuTheme(useContext(ThemeContext));
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return null;
|
|
14
|
+
return (React.createElement("div", { ref: ref, className: cx((_b = {},
|
|
15
|
+
_b[jsStyles.root(theme)] = true,
|
|
16
|
+
_b[jsStylesForSideMenu.hidden()] = !context.isOpened && (context.isMobile || context.isTablet),
|
|
17
|
+
_b)) },
|
|
18
|
+
React.createElement("nav", null,
|
|
19
|
+
React.createElement("ul", __assign({ className: cx((_c = {}, _c[jsStylesForSideMenu.list()] = true, _c[jsStyles.wrapper(theme)] = true, _c)) }, rest), children))));
|
|
22
20
|
});
|
|
23
21
|
SideMenuBodyInner.displayName = 'SideMenuBody';
|
|
24
22
|
/**
|