@cloud-ru/ds-uikit-product-header 1.5.2-preview-b174c2b1.0 → 1.5.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 +4 -0
- package/README.md +91 -91
- package/dist/cjs/components/HeaderButton/HeaderButton.d.ts +0 -1
- package/dist/cjs/components/HeaderLayout/HeaderLayout.d.ts +0 -6
- package/dist/cjs/components/Logo/Logo.d.ts +0 -7
- package/dist/cjs/components/MainMenu/MainMenu.js +6 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/Content.d.ts +0 -6
- package/dist/cjs/components/MainMenu/helperComponents/Content/Content.js +11 -35
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.d.ts +0 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -23
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +10 -38
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -7
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +0 -2
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +4 -6
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.d.ts +0 -1
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -9
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +12 -17
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -8
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +18 -24
- package/dist/cjs/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +0 -17
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
- package/dist/cjs/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/Favorites.js +33 -15
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.d.ts +1 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.js +2 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.d.ts +19 -0
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.js +30 -0
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.d.ts +1 -7
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.js +2 -4
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/index.d.ts +1 -2
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/index.js +1 -2
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesDnd.d.ts +25 -0
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.js → useFavoritesDnd.js} +22 -21
- package/dist/cjs/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +0 -2
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
- package/dist/cjs/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +5 -0
- package/dist/cjs/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +0 -3
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +6 -5
- package/dist/cjs/components/MainMenu/helperComponents/MenuMobile/styles.module.css +7 -0
- package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
- package/dist/cjs/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -30
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +21 -30
- package/dist/cjs/components/MainMenu/helperComponents/ServiceCard/styles.module.css +1 -6
- package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -6
- package/dist/cjs/components/MainMenu/hooks/useMainMenuDnd.js +6 -4
- package/dist/cjs/components/MainMenu/hooks/useMenuItems.js +7 -12
- package/dist/cjs/components/MainMenu/types.d.ts +1 -31
- package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
- package/dist/cjs/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -21
- package/dist/cjs/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
- package/dist/cjs/components/MainMenu/utils/flatLinksGroups.js +0 -5
- package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
- package/dist/cjs/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
- package/dist/cjs/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +0 -2
- package/dist/cjs/components/UserMenu/UserMenu.d.ts +0 -13
- package/dist/cjs/components/UserMenu/types.d.ts +0 -7
- package/dist/cjs/style.css +13 -39
- package/dist/esm/components/HeaderButton/HeaderButton.d.ts +0 -1
- package/dist/esm/components/HeaderLayout/HeaderLayout.d.ts +0 -6
- package/dist/esm/components/Logo/Logo.d.ts +0 -7
- package/dist/esm/components/MainMenu/MainMenu.js +7 -10
- package/dist/esm/components/MainMenu/helperComponents/Content/Content.d.ts +0 -6
- package/dist/esm/components/MainMenu/helperComponents/Content/Content.js +13 -37
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.d.ts +0 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.d.ts +4 -23
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.js +9 -37
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.d.ts +4 -7
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.js +4 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.d.ts +0 -2
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.d.ts +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.js +3 -5
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.d.ts +0 -1
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.d.ts +4 -9
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.js +13 -18
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.d.ts +3 -8
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.js +19 -25
- package/dist/esm/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.css +0 -17
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js +2 -4
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.d.ts +4 -4
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.js +3 -3
- package/dist/esm/components/MainMenu/helperComponents/Content/styles.module.css +0 -16
- package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.d.ts +4 -4
- package/dist/esm/components/MainMenu/helperComponents/Favorites/Favorites.js +35 -17
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.d.ts +1 -4
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.js +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.d.ts +19 -0
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.js +24 -0
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.d.ts +1 -7
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.js +1 -3
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/index.d.ts +1 -2
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/index.js +1 -2
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesDnd.d.ts +25 -0
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.js → useFavoritesDnd.js} +22 -21
- package/dist/esm/components/MainMenu/helperComponents/MenuBottom/MenuBottom.d.ts +0 -2
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.js +7 -7
- package/dist/esm/components/MainMenu/helperComponents/MenuDesktop/styles.module.css +5 -0
- package/dist/esm/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.d.ts +0 -3
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/MenuMobile.js +6 -5
- package/dist/esm/components/MainMenu/helperComponents/MenuMobile/styles.module.css +7 -0
- package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.d.ts +1 -1
- package/dist/esm/components/MainMenu/helperComponents/MountAnimation/MountAnimation.js +1 -4
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.d.ts +6 -30
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/ServiceCard.js +20 -30
- package/dist/esm/components/MainMenu/helperComponents/ServiceCard/styles.module.css +1 -6
- package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.d.ts +4 -6
- package/dist/esm/components/MainMenu/hooks/useMainMenuDnd.js +8 -6
- package/dist/esm/components/MainMenu/hooks/useMenuItems.js +8 -13
- package/dist/esm/components/MainMenu/types.d.ts +1 -31
- package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.d.ts +0 -5
- package/dist/esm/components/MainMenu/utils/filterLinksGroupsFuzzy.js +7 -20
- package/dist/esm/components/MainMenu/utils/flatLinksGroups.d.ts +0 -2
- package/dist/esm/components/MainMenu/utils/flatLinksGroups.js +0 -4
- package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.d.ts +2 -2
- package/dist/esm/components/MainMenu/utils/resolveInnerLinksByIds.js +4 -2
- package/dist/esm/components/PathBreadcrumbs/PathBreadcrumbs.d.ts +0 -2
- package/dist/esm/components/UserMenu/UserMenu.d.ts +0 -13
- package/dist/esm/components/UserMenu/types.d.ts +0 -7
- package/dist/esm/style.css +13 -39
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +28 -28
- package/src/components/HeaderButton/HeaderButton.tsx +0 -1
- package/src/components/HeaderLayout/HeaderLayout.tsx +0 -6
- package/src/components/Logo/Logo.tsx +0 -7
- package/src/components/MainMenu/MainMenu.tsx +6 -11
- package/src/components/MainMenu/helperComponents/Content/Content.tsx +59 -104
- package/src/components/MainMenu/helperComponents/Content/helperComponents/ContentToolbar/ContentToolbar.tsx +0 -9
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/SortableGroup.tsx +47 -106
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupCards.tsx +30 -20
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupDragHandle.tsx +0 -2
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupHeader.tsx +6 -11
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SortableGroupSkeleton.tsx +0 -1
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategory.tsx +87 -72
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/components/SubCategory/SubCategoryTitle.tsx +48 -65
- package/src/components/MainMenu/helperComponents/Content/helperComponents/SortableGroup/styles.module.scss +0 -27
- package/src/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.ts +2 -4
- package/src/components/MainMenu/helperComponents/Content/hooks/useSegmentDnd.tsx +7 -8
- package/src/components/MainMenu/helperComponents/Content/styles.module.scss +0 -19
- package/src/components/MainMenu/helperComponents/Favorites/Favorites.tsx +82 -43
- package/src/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.tsx +1 -6
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.tsx +78 -0
- package/src/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.tsx +1 -8
- package/src/components/MainMenu/helperComponents/Favorites/components/index.ts +1 -2
- package/src/components/MainMenu/helperComponents/Favorites/hooks/{useFavoritesReorder.tsx → useFavoritesDnd.tsx} +30 -32
- package/src/components/MainMenu/helperComponents/MenuBottom/MenuBottom.tsx +0 -2
- package/src/components/MainMenu/helperComponents/MenuDesktop/MenuDesktop.tsx +11 -17
- package/src/components/MainMenu/helperComponents/MenuDesktop/styles.module.scss +6 -0
- package/src/components/MainMenu/helperComponents/MenuHeaderBrand/MenuHeaderBrand.tsx +0 -3
- package/src/components/MainMenu/helperComponents/MenuMobile/MenuMobile.tsx +10 -7
- package/src/components/MainMenu/helperComponents/MenuMobile/styles.module.scss +7 -0
- package/src/components/MainMenu/helperComponents/MountAnimation/MountAnimation.tsx +1 -5
- package/src/components/MainMenu/helperComponents/ServiceCard/ServiceCard.tsx +41 -92
- package/src/components/MainMenu/helperComponents/ServiceCard/styles.module.scss +1 -7
- package/src/components/MainMenu/hooks/useMainMenuDnd.tsx +12 -9
- package/src/components/MainMenu/hooks/useMenuItems.tsx +10 -34
- package/src/components/MainMenu/types.ts +1 -31
- package/src/components/MainMenu/utils/filterLinksGroupsFuzzy.ts +8 -29
- package/src/components/MainMenu/utils/flatLinksGroups.ts +0 -5
- package/src/components/MainMenu/utils/resolveInnerLinksByIds.ts +6 -3
- package/src/components/PathBreadcrumbs/PathBreadcrumbs.tsx +0 -2
- package/src/components/UserMenu/UserMenu.tsx +0 -13
- package/src/components/UserMenu/types.ts +0 -7
- package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
- package/dist/cjs/components/MainMenu/helperComponents/Content/cardsContext.js +0 -17
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
- package/dist/cjs/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -39
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.d.ts +0 -35
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.js +0 -27
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesList.d.ts +0 -21
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesList.js +0 -31
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.d.ts +0 -28
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.js +0 -20
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.d.ts +0 -24
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.js +0 -36
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/RecentList.d.ts +0 -24
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/components/RecentList.js +0 -30
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.d.ts +0 -16
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.js +0 -28
- package/dist/cjs/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesReorder.d.ts +0 -30
- package/dist/cjs/utils/noop.d.ts +0 -1
- package/dist/cjs/utils/noop.js +0 -5
- package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.d.ts +0 -20
- package/dist/esm/components/MainMenu/helperComponents/Content/cardsContext.js +0 -13
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.d.ts +0 -12
- package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.js +0 -35
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.d.ts +0 -35
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.js +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesList.d.ts +0 -21
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesList.js +0 -25
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.d.ts +0 -28
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.js +0 -17
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.d.ts +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.js +0 -30
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/RecentList.d.ts +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/components/RecentList.js +0 -24
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.d.ts +0 -16
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.js +0 -25
- package/dist/esm/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesReorder.d.ts +0 -30
- package/dist/esm/utils/noop.d.ts +0 -1
- package/dist/esm/utils/noop.js +0 -1
- package/src/components/MainMenu/helperComponents/Content/cardsContext.ts +0 -36
- package/src/components/MainMenu/helperComponents/Content/hooks/useProgressiveCount.ts +0 -46
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesDesktop.tsx +0 -71
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesList.tsx +0 -59
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesMobile.tsx +0 -60
- package/src/components/MainMenu/helperComponents/Favorites/components/FavoritesReorderList.tsx +0 -75
- package/src/components/MainMenu/helperComponents/Favorites/components/RecentList.tsx +0 -62
- package/src/components/MainMenu/helperComponents/Favorites/hooks/useFavoritesAutoSwitch.ts +0 -32
- package/src/utils/noop.ts +0 -1
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Accordion } from '@cloud-ru/ds-accordion';
|
|
3
|
-
import {
|
|
4
|
-
import { noop } from '../../../../../../../../utils/noop.js';
|
|
3
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
5
4
|
import { getNestedServiceGroupId, getSubCategoryId } from '../../../../../../utils/innerLink.js';
|
|
6
|
-
import {
|
|
7
|
-
import { useCardsContext } from '../../../../cardsContext.js';
|
|
5
|
+
import { DraggableServiceCard } from '../../../../../ServiceCard/index.js';
|
|
8
6
|
import { TEST_IDS } from '../../../../constants.js';
|
|
9
7
|
import baseGroupStyles from '../../styles.module.css';
|
|
10
8
|
import styles from './styles.module.css';
|
|
11
9
|
import { SubCategoryTitle } from './SubCategoryTitle.js';
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const { isMobile, showDescription, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick } = useCardsContext();
|
|
15
|
-
const cardFavoriteChange = favoriteIds ? onFavoriteChange : undefined;
|
|
16
|
-
return (_jsx("div", { className: baseGroupStyles.groupBody, "data-subcategory-body": variant === 'expanded' ? 'expanded' : true, "data-mobile": isMobile || undefined, children: items.map(nestedService => (_jsx(GridServiceCard, { groupId: nestedGroupId, service: nestedService, isFavorite: favoriteIds?.has(nestedService.id), onFavoriteChange: cardFavoriteChange, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragEnabled: dragEnabled }, nestedGroupId + nestedService.id))) }));
|
|
17
|
-
});
|
|
18
|
-
function SubCategoryBase({ groupId, service, groupFavoritesEnabled }) {
|
|
10
|
+
const noop = () => { };
|
|
11
|
+
export function SubCategory({ groupId, service, showDescription, isMobile, dragDisabled, favorite, onServiceClick, groupFavoritesEnabled, }) {
|
|
19
12
|
const subcategoryId = getSubCategoryId(groupId, service.id);
|
|
20
13
|
const nestedGroupId = getNestedServiceGroupId(groupId, service.id);
|
|
21
14
|
const nestedItems = useMemo(() => service.items?.filter(item => !item.hidden) ?? [], [service.items]);
|
|
@@ -29,17 +22,19 @@ function SubCategoryBase({ groupId, service, groupFavoritesEnabled }) {
|
|
|
29
22
|
setIsExpanded(isExpanded ? undefined : subcategoryId);
|
|
30
23
|
}
|
|
31
24
|
}, [isExpanded, subcategoryId, isExpandableEnabled]);
|
|
32
|
-
const expandable = useMemo(() => ({ value: Boolean(isExpanded), onClick: handleExpandedChange }), [isExpanded, handleExpandedChange]);
|
|
33
|
-
const testId = `${TEST_IDS.subcategory}-${service.id}`;
|
|
34
|
-
const title = (_jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: viewMode === 'group-title-only' ? TITLE_ONLY_EXPANDABLE : expandable, groupFavoritesEnabled: groupFavoritesEnabled }));
|
|
35
25
|
// 'group-title-only' — только заголовок подкатегории, без раскрываемого тела и кнопки
|
|
36
26
|
// переключения: карточка ведёт себя как обычная ссылка (см. isSubCategoryCard в utils/innerLink).
|
|
37
27
|
if (viewMode === 'group-title-only') {
|
|
38
|
-
return (_jsx("div", { className: styles.subcategory, "data-title-only": true, "data-test-id":
|
|
28
|
+
return (_jsx("div", { className: styles.subcategory, "data-title-only": true, "data-test-id": `${TEST_IDS.subcategory}-${service.id}`, children: _jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: { value: true, onClick: noop }, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }) }));
|
|
39
29
|
}
|
|
40
30
|
if (viewMode === 'expanded') {
|
|
41
|
-
return (_jsxs("div", { className: styles.subcategory, "data-test-id":
|
|
31
|
+
return (_jsxs("div", { className: styles.subcategory, "data-test-id": `${TEST_IDS.subcategory}-${service.id}`, children: [_jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: {
|
|
32
|
+
value: Boolean(isExpanded),
|
|
33
|
+
onClick: handleExpandedChange,
|
|
34
|
+
}, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }), _jsx("div", { className: baseGroupStyles.groupBody, "data-subcategory-body": 'expanded', "data-mobile": isMobile || undefined, children: nestedItems.map(nestedService => (_jsx(DraggableServiceCard, { groupId: nestedGroupId, service: nestedService, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: dragDisabled }, nestedGroupId + nestedService.id))) })] }));
|
|
42
35
|
}
|
|
43
|
-
return (_jsx("div", { className: styles.subcategory, "data-test-id":
|
|
36
|
+
return (_jsx("div", { className: styles.subcategory, "data-test-id": `${TEST_IDS.subcategory}-${service.id}`, children: _jsx(Accordion, { selectionMode: 'single', expanded: isExpanded, onExpandedChange: handleExpandedChange, children: _jsx(Accordion.CollapseBlockTertiary, { id: subcategoryId, showChevron: false, className: styles.subcategoryAccordion, afterTitle: _jsx(SubCategoryTitle, { groupId: groupId, service: service, expandable: {
|
|
37
|
+
value: Boolean(isExpanded),
|
|
38
|
+
onClick: handleExpandedChange,
|
|
39
|
+
}, showDescription: showDescription, isMobile: isMobile, dragDisabled: dragDisabled, favorite: groupFavoritesEnabled ? favorite : undefined, onServiceClick: onServiceClick }), children: _jsx("div", { className: baseGroupStyles.groupBody, "data-subcategory-body": true, "data-mobile": isMobile || undefined, children: nestedItems.map(nestedService => (_jsx(DraggableServiceCard, { groupId: nestedGroupId, service: nestedService, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescription, dragDisabled: dragDisabled }, nestedGroupId + nestedService.id))) }) }) }) }));
|
|
44
40
|
}
|
|
45
|
-
export const SubCategory = memo(SubCategoryBase);
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DraggableServiceCardProps } from '../../../../../ServiceCard/index.js';
|
|
2
2
|
export type SubCategoryTitleProps = {
|
|
3
|
-
/** Id группы-предка. */
|
|
4
3
|
groupId: string;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} & Pick<GridServiceCardProps, 'expandable' | 'service'>;
|
|
8
|
-
declare function SubCategoryTitleBase({ groupId, service, groupFavoritesEnabled, expandable }: SubCategoryTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
export declare const SubCategoryTitle: import("react").MemoExoticComponent<typeof SubCategoryTitleBase>;
|
|
10
|
-
export {};
|
|
4
|
+
} & Pick<DraggableServiceCardProps, 'expandable' | 'service' | 'onServiceClick' | 'favorite' | 'showDescription' | 'isMobile' | 'dragDisabled'>;
|
|
5
|
+
export declare function SubCategoryTitle({ groupId, service, showDescription: showDescriptionProp, isMobile, dragDisabled, favorite, onServiceClick, expandable, }: SubCategoryTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -3,62 +3,56 @@ import { Typography } from '@cloud-ru/ds-typography';
|
|
|
3
3
|
import { CardActionsSurface, createCardActionsKeyDownHandler } from '@cloud-ru/ds-uikit-product-card-predefined';
|
|
4
4
|
import { TitleClickable } from '@cloud-ru/ds-uikit-product-title-clickable';
|
|
5
5
|
import { stopEventPropagation } from '@cloud-ru/ds-utils';
|
|
6
|
-
import {
|
|
6
|
+
import { useRef } from 'react';
|
|
7
7
|
import { getLinkEmblem } from '../../../../../../utils/index.js';
|
|
8
|
-
import {
|
|
9
|
-
import { useCardsContext } from '../../../../cardsContext.js';
|
|
8
|
+
import { DraggableServiceCard } from '../../../../../ServiceCard/index.js';
|
|
10
9
|
import { TEST_IDS } from '../../../../constants.js';
|
|
11
10
|
import styles from './styles.module.css';
|
|
12
|
-
function
|
|
13
|
-
const { isMobile, showDescription: showDescriptionProp, dragEnabled, favoriteIds, onFavoriteChange, onServiceClick, } = useCardsContext();
|
|
11
|
+
export function SubCategoryTitle({ groupId, service, showDescription: showDescriptionProp, isMobile, dragDisabled, favorite, onServiceClick, expandable, }) {
|
|
14
12
|
const titleRef = useRef(null);
|
|
15
13
|
const tooltipTriggerRef = useRef(null);
|
|
16
14
|
const favoriteRef = useRef(null);
|
|
17
|
-
const
|
|
18
|
-
const handleServiceClick = useCallback((event) => {
|
|
15
|
+
const handleServiceClick = (event) => {
|
|
19
16
|
stopEventPropagation(event);
|
|
20
17
|
onServiceClick?.(service, event);
|
|
21
|
-
}
|
|
22
|
-
const titleTestId = `${TEST_IDS.subcategoryTitle}-${id}`;
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const handleKeyDown = useMemo(() => createCardActionsKeyDownHandler({
|
|
18
|
+
};
|
|
19
|
+
const titleTestId = `${TEST_IDS.subcategoryTitle}-${service.id}`;
|
|
20
|
+
const isFavorite = Boolean(favorite?.value.includes(service.id));
|
|
21
|
+
const showDescription = showDescriptionProp && Boolean(service.description);
|
|
22
|
+
const hasTooltip = !showDescription && service.description;
|
|
23
|
+
const handleKeyDown = createCardActionsKeyDownHandler({
|
|
28
24
|
cardRef: titleRef,
|
|
29
25
|
items: [
|
|
30
26
|
hasTooltip ? { ref: tooltipTriggerRef } : null,
|
|
31
|
-
|
|
27
|
+
favorite
|
|
32
28
|
? {
|
|
33
29
|
ref: favoriteRef,
|
|
34
|
-
onActivate: () =>
|
|
30
|
+
onActivate: () => favorite.onChange(service.id)(!isFavorite),
|
|
35
31
|
}
|
|
36
32
|
: null,
|
|
37
33
|
],
|
|
38
|
-
})
|
|
39
|
-
const emblem = useMemo(() => getLinkEmblem({ icon }), [icon]);
|
|
34
|
+
});
|
|
40
35
|
if (expandable?.value) {
|
|
41
|
-
return (_jsxs("div", { className: styles.subcategoryTitle, "data-mobile": isMobile || undefined, children: [_jsxs("div", { className: styles.subcategoryTitleRow, onKeyDown: handleKeyDown, children: [_jsx(TitleClickable, { as: 'a', href: service.href, onClick: handleServiceClick, innerRef: titleRef, title: service.label, icon:
|
|
36
|
+
return (_jsxs("div", { className: styles.subcategoryTitle, "data-mobile": isMobile || undefined, children: [_jsxs("div", { className: styles.subcategoryTitleRow, onKeyDown: handleKeyDown, children: [_jsx(TitleClickable, { as: 'a', href: service.href, onClick: handleServiceClick, innerRef: titleRef, title: service.label, icon: getLinkEmblem(service), className: styles.subcategoryTitleClickable, "data-test-id": titleTestId }), _jsx(CardActionsSurface, { className: styles.subcategoryTitleActions, actionsVisibility: 'always', actionsSize: isMobile ? 's' : 'm', tooltip: hasTooltip
|
|
42
37
|
? {
|
|
43
|
-
tip: description,
|
|
38
|
+
tip: service.description,
|
|
44
39
|
buttonRef: tooltipTriggerRef,
|
|
45
40
|
trigger: isMobile ? 'click' : 'hoverAndFocusVisible',
|
|
46
41
|
'data-test-id': `${titleTestId}-tooltip`,
|
|
47
42
|
}
|
|
48
|
-
: undefined, favorite:
|
|
43
|
+
: undefined, favorite: favorite
|
|
49
44
|
? {
|
|
50
45
|
enabled: true,
|
|
51
46
|
checked: isFavorite,
|
|
52
|
-
onChange: (
|
|
47
|
+
onChange: favorite.onChange(service.id),
|
|
53
48
|
buttonRef: favoriteRef,
|
|
54
49
|
'data-test-id': `${titleTestId}-favorite`,
|
|
55
50
|
}
|
|
56
|
-
: undefined })] }), showDescription && (_jsx(Typography, { as: 'p', variant: 'body', size: 's', className: styles.subcategoryDescription, "data-test-id": `${titleTestId}-description`, children: description }))] }));
|
|
51
|
+
: undefined })] }), showDescription && (_jsx(Typography, { as: 'p', variant: 'body', size: 's', className: styles.subcategoryDescription, "data-test-id": `${titleTestId}-description`, children: service.description }))] }));
|
|
57
52
|
}
|
|
58
53
|
return (
|
|
59
54
|
// Карточка — ссылка `<a>`: клик по ней бы долетал до `onClick={toggleOpen}` заголовка
|
|
60
55
|
// родительского CollapseBlockTertiary (см. TODO там) и лишний раз переключал аккордеон.
|
|
61
56
|
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
62
|
-
_jsx("div", { className: styles.subcategoryTitleDraggable, onPointerDown: stopEventPropagation, onClick: stopEventPropagation, children: _jsx(
|
|
57
|
+
_jsx("div", { className: styles.subcategoryTitleDraggable, onPointerDown: stopEventPropagation, onClick: stopEventPropagation, children: _jsx(DraggableServiceCard, { groupId: groupId, service: service, favorite: favorite, isMobile: isMobile, onServiceClick: onServiceClick, showDescription: showDescriptionProp, dragDisabled: dragDisabled, expandable: expandable }) }));
|
|
63
58
|
}
|
|
64
|
-
export const SubCategoryTitle = memo(SubCategoryTitleBase);
|
|
@@ -46,8 +46,6 @@
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
.group{
|
|
49
|
-
content-visibility:auto;
|
|
50
|
-
contain-intrinsic-size:auto var(--sn-primitive-dimension-128, 128px);
|
|
51
49
|
position:relative;
|
|
52
50
|
overflow-x:clip;
|
|
53
51
|
display:flex;
|
|
@@ -58,14 +56,6 @@
|
|
|
58
56
|
border-radius:var(--sn-density-radius-2xs, var(--sn-platform-comfort-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
59
57
|
background-color:var(--sn-theme-color-neutral-background1Level, var(--sn-brand-color-neutral-95, var(--sn-brand-palette-gray-95, #fdfdfd)));
|
|
60
58
|
}
|
|
61
|
-
.group[data-appear]{
|
|
62
|
-
animation:group-appear 0.24s cubic-bezier(0.4, 0, 0.2, 1) backwards;
|
|
63
|
-
}
|
|
64
|
-
@media (prefers-reduced-motion: reduce){
|
|
65
|
-
.group[data-appear]{
|
|
66
|
-
animation:none;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
59
|
.group[data-drag-preview]{
|
|
70
60
|
cursor:grabbing;
|
|
71
61
|
}
|
|
@@ -243,11 +233,4 @@
|
|
|
243
233
|
|
|
244
234
|
.skeletonService{
|
|
245
235
|
padding:var(--sn-primitive-dimension-4, 4px);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
@keyframes group-appear{
|
|
249
|
-
from{
|
|
250
|
-
transform:translate(calc(-1 * var(--sn-primitive-dimension-12, 12px)), var(--sn-primitive-dimension-4, 4px));
|
|
251
|
-
opacity:0;
|
|
252
|
-
}
|
|
253
236
|
}
|
package/dist/esm/components/MainMenu/helperComponents/Content/hooks/useContentSegmentsSortable.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { arrayMove } from '@dnd-kit/sortable';
|
|
2
2
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
function mergeIdsPreservingOrder(prevIds, nextIds) {
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const kept = prevIds.filter(id => nextIdSet.has(id));
|
|
7
|
-
const added = nextIds.filter(id => !prevIdSet.has(id));
|
|
4
|
+
const kept = prevIds.filter(id => nextIds.includes(id));
|
|
5
|
+
const added = nextIds.filter(id => !prevIds.includes(id));
|
|
8
6
|
if (added.length === 0 && kept.length === prevIds.length) {
|
|
9
7
|
return prevIds;
|
|
10
8
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { DragEndEvent } from '@dnd-kit/core';
|
|
2
|
-
import { LinksGroup } from '../../../types.js';
|
|
3
|
-
import { CardsContextValue } from '../cardsContext.js';
|
|
2
|
+
import { FavoriteProps, LinksGroup } from '../../../types.js';
|
|
4
3
|
type UseSegmentDndProps = {
|
|
5
4
|
visibleGroups: LinksGroup[];
|
|
6
5
|
expandedIds: string[];
|
|
7
6
|
onSortableDragEnd(event: DragEndEvent): void;
|
|
8
7
|
showDescription: boolean;
|
|
9
8
|
showGroupsColors?: boolean;
|
|
10
|
-
|
|
9
|
+
favorite?: FavoriteProps;
|
|
10
|
+
};
|
|
11
11
|
/**
|
|
12
12
|
* DnD групп внутри активного сегмента: drag overlay группы поверх `useContentSegmentsSortable`.
|
|
13
13
|
* Сервис-драг (карточка → избранное) сюда не попадает — фильтруется через `isServiceDragId`.
|
|
14
14
|
*/
|
|
15
|
-
export declare function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors,
|
|
15
|
+
export declare function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favorite, }: UseSegmentDndProps): void;
|
|
16
16
|
export {};
|
|
@@ -8,16 +8,16 @@ import { SortableGroupDragPreview } from '../helperComponents/SortableGroup/inde
|
|
|
8
8
|
* DnD групп внутри активного сегмента: drag overlay группы поверх `useContentSegmentsSortable`.
|
|
9
9
|
* Сервис-драг (карточка → избранное) сюда не попадает — фильтруется через `isServiceDragId`.
|
|
10
10
|
*/
|
|
11
|
-
export function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors,
|
|
11
|
+
export function useSegmentDnd({ visibleGroups, expandedIds, onSortableDragEnd, showDescription, showGroupsColors, favorite, }) {
|
|
12
12
|
const { setGroupDragOverlay } = useMainMenuDndOverlay();
|
|
13
13
|
const handleDragStart = useCallback(({ active }) => {
|
|
14
14
|
if (!isServiceDragId(active.id)) {
|
|
15
15
|
const activeGroup = visibleGroups.find(({ id }) => id === String(active.id));
|
|
16
16
|
if (activeGroup) {
|
|
17
|
-
setGroupDragOverlay(_jsx(SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: resolveGroupBlockColor(activeGroup.blockColor, showGroupsColors), showDescription: showDescription,
|
|
17
|
+
setGroupDragOverlay(_jsx(SortableGroupDragPreview, { id: activeGroup.id, label: activeGroup.label, items: activeGroup.items, isExpanded: expandedIds.includes(activeGroup.id), blockColor: resolveGroupBlockColor(activeGroup.blockColor, showGroupsColors), showDescription: showDescription, favorite: activeGroup.favoritesEnabled ? favorite : undefined, highlight: activeGroup.highlight }));
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
}, [expandedIds,
|
|
20
|
+
}, [expandedIds, favorite, setGroupDragOverlay, showDescription, showGroupsColors, visibleGroups]);
|
|
21
21
|
const handleDragEnd = useCallback((event) => {
|
|
22
22
|
setGroupDragOverlay(null);
|
|
23
23
|
if (isServiceDragId(event.active.id)) {
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
.content{
|
|
2
|
-
display:flex;
|
|
3
|
-
flex-direction:column;
|
|
4
|
-
gap:var(--sn-primitive-dimension-4, 4px);
|
|
5
|
-
width:100%;
|
|
6
|
-
min-width:0;
|
|
7
|
-
}
|
|
8
|
-
.content[data-mobile]{
|
|
9
|
-
gap:var(--sn-primitive-dimension-8, 8px);
|
|
10
|
-
}
|
|
11
1
|
.content[data-empty]{
|
|
12
2
|
height:100%;
|
|
13
3
|
}
|
|
@@ -15,12 +5,6 @@
|
|
|
15
5
|
flex:1 1 auto;
|
|
16
6
|
}
|
|
17
7
|
|
|
18
|
-
.top{
|
|
19
|
-
display:flex;
|
|
20
|
-
flex-direction:column;
|
|
21
|
-
gap:inherit;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
8
|
.noData{
|
|
25
9
|
flex:1 1 auto;
|
|
26
10
|
place-self:center center;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { FavoriteProps,
|
|
1
|
+
import { FavoriteProps, LinksGroup } from '../../types.js';
|
|
2
2
|
export type FavoritesProps = {
|
|
3
3
|
/** Список избранных сервисов */
|
|
4
4
|
favorite: FavoriteProps;
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/** Группы сервисов для разрешения id в карточки */
|
|
6
|
+
allServiceGroups: LinksGroup[];
|
|
7
7
|
/** CSS-класс строки заголовка (segment + кнопка настроек) */
|
|
8
8
|
headerClassName?: string;
|
|
9
9
|
/** Флаг мобильной раскладки */
|
|
10
10
|
isMobile?: boolean;
|
|
11
11
|
};
|
|
12
|
-
export declare function Favorites({ favorite,
|
|
12
|
+
export declare function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }: FavoritesProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -2,16 +2,19 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Button } from '@cloud-ru/ds-button';
|
|
3
3
|
import { KebabSVG } from '@cloud-ru/ds-icons/interface/system';
|
|
4
4
|
import { Droplist } from '@cloud-ru/ds-list';
|
|
5
|
+
import { Scroll } from '@cloud-ru/ds-scroll';
|
|
5
6
|
import { SegmentControl, WIDTH } from '@cloud-ru/ds-segment-control';
|
|
6
|
-
import {
|
|
7
|
+
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
|
|
8
|
+
import { useValueControl } from '@cloud-ru/ds-utils';
|
|
7
9
|
import cn from 'classnames';
|
|
8
10
|
import { useMemo } from 'react';
|
|
9
11
|
import { headerLocale } from '../../../../locale/index.js';
|
|
10
12
|
import { resolveInnerLinksByIds } from '../../utils/index.js';
|
|
11
|
-
import {
|
|
13
|
+
import { EmptyState, FavoritesItemsSkeleton, FavoritesSortable } from './components/index.js';
|
|
12
14
|
import { FAVORITES_SEGMENT, FAVORITES_TEST_IDS } from './constants.js';
|
|
13
15
|
import styles from './styles.module.css';
|
|
14
|
-
|
|
16
|
+
import { getCommonCardProps } from './utils.js';
|
|
17
|
+
export function Favorites({ favorite, allServiceGroups, headerClassName, isMobile }) {
|
|
15
18
|
const { t } = headerLocale.useTranslations();
|
|
16
19
|
const loading = favorite.loading;
|
|
17
20
|
const [segment, setSegment] = useValueControl({
|
|
@@ -23,23 +26,38 @@ export function Favorites({ favorite, servicesById, headerClassName, isMobile })
|
|
|
23
26
|
{ value: FAVORITES_SEGMENT.Favorites, label: t('favorite.title'), disabled: loading },
|
|
24
27
|
{ value: FAVORITES_SEGMENT.Recent, label: t('recent.title'), disabled: loading },
|
|
25
28
|
], [t, loading]);
|
|
26
|
-
const favoriteItems = useMemo(() => resolveInnerLinksByIds(favorite.value,
|
|
27
|
-
const recentItems = useMemo(() => resolveInnerLinksByIds(favorite.recentServices ?? [],
|
|
29
|
+
const favoriteItems = useMemo(() => resolveInnerLinksByIds(favorite.value, allServiceGroups), [favorite.value, allServiceGroups]);
|
|
30
|
+
const recentItems = useMemo(() => resolveInnerLinksByIds(favorite.recentServices ?? [], allServiceGroups), [favorite.recentServices, allServiceGroups]);
|
|
28
31
|
const resolvedSegment = segment ?? FAVORITES_SEGMENT.Favorites;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const handleRecentServiceClick =
|
|
32
|
+
const isFavoritesSegment = resolvedSegment === FAVORITES_SEGMENT.Favorites;
|
|
33
|
+
const isEmpty = (isFavoritesSegment ? favoriteItems : recentItems).length === 0;
|
|
34
|
+
const handleRecentServiceClick = (service) => (event) => {
|
|
32
35
|
favorite.onRecentServiceClick?.(service.id, event);
|
|
33
36
|
service.onClick(event);
|
|
34
|
-
}
|
|
35
|
-
const handleFavoriteServiceClick =
|
|
37
|
+
};
|
|
38
|
+
const handleFavoriteServiceClick = (service) => (event) => {
|
|
36
39
|
favorite.onFavoriteServiceClick?.(service.id, event);
|
|
37
40
|
service.onClick(event);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
};
|
|
42
|
+
const recentCards = recentItems.map(service => (_jsx(CardServiceLight, { as: 'a', className: styles.card, actionsVisibility: isMobile ? 'always' : 'hover', favorite: {
|
|
43
|
+
enabled: true,
|
|
44
|
+
checked: favorite.value.includes(service.id),
|
|
45
|
+
onChange: favorite.onChange(service.id),
|
|
46
|
+
}, ...getCommonCardProps(service, handleRecentServiceClick(service)) }, service.id)));
|
|
47
|
+
const content = (() => {
|
|
48
|
+
if (loading) {
|
|
49
|
+
return _jsx(FavoritesItemsSkeleton, {});
|
|
50
|
+
}
|
|
51
|
+
/* Drag&drop реордер и приём карточек из сетки — только на desktop (требует
|
|
52
|
+
<DndContext>-предка). На mobile нет reorder-жеста, добавление/удаление
|
|
53
|
+
избранного идёт через звёздочку на карточке. */
|
|
54
|
+
return isMobile ? (_jsx("div", { className: styles.listScroll, children: _jsx(Scroll, { className: styles.listScrollInner, "data-mobile": isMobile || undefined, overflow: { x: 'hidden' }, children: _jsxs("div", { className: styles.list, "data-test-id": FAVORITES_TEST_IDS.list, children: [isEmpty && _jsx(EmptyState, { isFavoritesSegment: isFavoritesSegment, isMobile: true }), !isEmpty &&
|
|
55
|
+
isFavoritesSegment &&
|
|
56
|
+
favoriteItems.map(service => (_jsx(CardServiceLight, { as: 'a', className: styles.card, actionsVisibility: 'always', favorite: {
|
|
57
|
+
enabled: true,
|
|
58
|
+
checked: true,
|
|
59
|
+
onChange: favorite.onChange(service.id),
|
|
60
|
+
}, ...getCommonCardProps(service, handleFavoriteServiceClick(service)) }, service.id))), !isEmpty && !isFavoritesSegment && recentCards] }) }) })) : (_jsx(FavoritesSortable, { favorite: favorite, favoriteItems: favoriteItems, segment: resolvedSegment, setSegment: setSegment, isEmpty: isEmpty, recentCards: recentCards, onFavoriteServiceClick: handleFavoriteServiceClick }));
|
|
61
|
+
})();
|
|
62
|
+
return (_jsxs("div", { className: styles.root, "data-test-id": FAVORITES_TEST_IDS.root, children: [_jsxs("div", { className: cn(styles.header, headerClassName), "data-test-id": FAVORITES_TEST_IDS.header, children: [_jsx(SegmentControl, { size: 'm', width: WIDTH.Full, value: loading ? undefined : segment, onChange: setSegment, className: styles.segmentControl, "data-test-id": FAVORITES_TEST_IDS.segmentControl, items: segmentControlItems }), favorite.actions && (_jsx(Droplist, { size: 'm', ...favorite.actions, closeDroplistOnItemClick: true, children: _jsx(Button, { view: 'function', size: 'm', appearance: 'neutral', icon: _jsx(KebabSVG, { size: 24 }), "data-test-id": FAVORITES_TEST_IDS.settingsButton, disabled: loading }) }))] }), content] }));
|
|
45
63
|
}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
type EmptyStateProps = {
|
|
2
|
-
/** Пустое состояние сегмента «Избранное» (иначе — «Недавнее»). */
|
|
3
2
|
isFavoritesSegment: boolean;
|
|
4
|
-
/** Мобильная раскладка. */
|
|
5
3
|
isMobile?: boolean;
|
|
6
4
|
};
|
|
7
|
-
declare function
|
|
8
|
-
export declare const EmptyState: import("react").MemoExoticComponent<typeof EmptyStateBase>;
|
|
5
|
+
export declare function EmptyState({ isFavoritesSegment, isMobile }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
|
|
9
6
|
export {};
|
package/dist/esm/components/MainMenu/helperComponents/Favorites/components/EmptyState/EmptyState.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Typography } from '@cloud-ru/ds-typography';
|
|
3
|
-
import { memo } from 'react';
|
|
4
3
|
import { headerLocale } from '../../../../../../locale/index.js';
|
|
5
4
|
import { FAVORITES_TEST_IDS } from '../../constants.js';
|
|
6
5
|
import { EmptyFavoriteSVG } from './EmptyFavoriteSVG.js';
|
|
7
6
|
import { EmptyRecentSVG } from './EmptyRecentSVG.js';
|
|
8
7
|
import styles from './styles.module.css';
|
|
9
|
-
function
|
|
8
|
+
export function EmptyState({ isFavoritesSegment, isMobile }) {
|
|
10
9
|
const { t } = headerLocale.useTranslations();
|
|
11
10
|
return (_jsx("div", { className: styles.emptyState, "data-test-id": FAVORITES_TEST_IDS.emptyState, children: isFavoritesSegment ? (_jsxs(_Fragment, { children: [_jsx(EmptyFavoriteSVG, { className: styles.emptyIcon }), _jsx(Typography, { variant: 'body', size: 's', className: styles.emptyText, children: isMobile ? t('favorite.emptyMobile') : t('favorite.emptyDesktop') })] })) : (_jsxs(_Fragment, { children: [_jsx(EmptyRecentSVG, { className: styles.emptyIcon }), _jsx(Typography, { variant: 'body', size: 's', className: styles.emptyText, children: t('recent.empty') })] })) }));
|
|
12
11
|
}
|
|
13
|
-
export const EmptyState = memo(EmptyStateBase);
|
package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MouseEvent, ReactNode } from 'react';
|
|
2
|
+
import { FavoriteProps, InnerLink } from '../../../types.js';
|
|
3
|
+
import { FavoritesSegment } from '../constants.js';
|
|
4
|
+
type FavoritesSortableProps = {
|
|
5
|
+
favorite: FavoriteProps;
|
|
6
|
+
favoriteItems: InnerLink[];
|
|
7
|
+
segment: FavoritesSegment;
|
|
8
|
+
setSegment(segment: FavoritesSegment): void;
|
|
9
|
+
isEmpty: boolean;
|
|
10
|
+
recentCards: ReactNode;
|
|
11
|
+
onFavoriteServiceClick(service: InnerLink): (event: MouseEvent<HTMLElement>) => void;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Desktop-обёртка тела списка: реордер drag&drop + приём карточек из общей
|
|
15
|
+
* сетки. Требует `<DndContext>`-предка, поэтому `useFavoritesDnd` вызывается
|
|
16
|
+
* только здесь — на mobile этот компонент не рендерится вовсе (см. `Favorites`).
|
|
17
|
+
*/
|
|
18
|
+
export declare function FavoritesSortable({ favorite, favoriteItems, segment, setSegment, isEmpty, recentCards, onFavoriteServiceClick, }: FavoritesSortableProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
package/dist/esm/components/MainMenu/helperComponents/Favorites/components/FavoritesSortable.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';
|
|
3
|
+
import { DropTarget } from '@cloud-ru/ds-drag-and-drop';
|
|
4
|
+
import { Scroll } from '@cloud-ru/ds-scroll';
|
|
5
|
+
import { FAVORITES_SEGMENT, FAVORITES_TEST_IDS } from '../constants.js';
|
|
6
|
+
import { useFavoritesDnd } from '../hooks/useFavoritesDnd.js';
|
|
7
|
+
import styles from '../styles.module.css';
|
|
8
|
+
import { getCommonCardProps } from '../utils.js';
|
|
9
|
+
import { EmptyState } from './EmptyState/index.js';
|
|
10
|
+
import { SortableFavoriteCard } from './SortableFavoriteCard.js';
|
|
11
|
+
/**
|
|
12
|
+
* Desktop-обёртка тела списка: реордер drag&drop + приём карточек из общей
|
|
13
|
+
* сетки. Требует `<DndContext>`-предка, поэтому `useFavoritesDnd` вызывается
|
|
14
|
+
* только здесь — на mobile этот компонент не рендерится вовсе (см. `Favorites`).
|
|
15
|
+
*/
|
|
16
|
+
export function FavoritesSortable({ favorite, favoriteItems, segment, setSegment, isEmpty, recentCards, onFavoriteServiceClick, }) {
|
|
17
|
+
const isFavoritesSegment = segment === FAVORITES_SEGMENT.Favorites;
|
|
18
|
+
const { setNodeRef, listEndRef, favoriteSortableIds, insertIndex, isInsertingToEnd, showDropOver, showInsertNew } = useFavoritesDnd({ favorite, favoriteItems, segment, setSegment });
|
|
19
|
+
return (_jsxs("div", { className: styles.listScroll, "data-insert-new": showInsertNew, children: [_jsx(DropTarget, { active: Boolean(showDropOver), className: styles.dropTarget, "aria-hidden": true }), _jsx(Scroll, { className: styles.listScrollInner, overflow: { x: 'hidden' }, children: _jsxs("div", { ref: setNodeRef, className: styles.list, "data-test-id": FAVORITES_TEST_IDS.list, children: [isEmpty && _jsx(EmptyState, { isFavoritesSegment: isFavoritesSegment }), !isEmpty && isFavoritesSegment && (_jsxs(SortableContext, { items: favoriteSortableIds, strategy: verticalListSortingStrategy, children: [favoriteItems.map((service, index) => (_jsx(SortableFavoriteCard, { serviceId: service.id, showInsertIndicatorBefore: insertIndex === index, showInsertIndicatorAfter: isInsertingToEnd && index === favoriteItems.length - 1, isFirst: index === 0, favorite: {
|
|
20
|
+
enabled: true,
|
|
21
|
+
checked: true,
|
|
22
|
+
onChange: favorite.onChange(service.id),
|
|
23
|
+
}, ...getCommonCardProps(service, onFavoriteServiceClick(service)) }, service.id))), _jsx("div", { ref: listEndRef, className: styles.listEnd, "aria-hidden": true })] })), !isEmpty && !isFavoritesSegment && recentCards] }) })] }));
|
|
24
|
+
}
|
package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.d.ts
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import { CardServiceLightProps } from '@cloud-ru/ds-uikit-product-card-predefined';
|
|
2
2
|
export type SortableFavoriteCardProps = {
|
|
3
|
-
/** Id сервиса (используется для drag-идентификатора карточки). */
|
|
4
3
|
serviceId: string;
|
|
5
|
-
/** Показывать индикатор вставки перед карточкой (drag поверх избранного). */
|
|
6
4
|
showInsertIndicatorBefore?: boolean;
|
|
7
|
-
/** Показывать индикатор вставки после карточки (drag поверх избранного). */
|
|
8
5
|
showInsertIndicatorAfter?: boolean;
|
|
9
|
-
/** Карточка первая в списке — влияет на позиционирование индикатора вставки. */
|
|
10
6
|
isFirst?: boolean;
|
|
11
7
|
} & Pick<CardServiceLightProps<'a'>, 'href' | 'className' | 'tabIndex' | 'title' | 'onClick' | 'icon' | 'promoTag' | 'tooltip' | 'favorite' | 'expandable' | 'data-test-id'>;
|
|
12
|
-
declare function
|
|
13
|
-
export declare const SortableFavoriteCard: import("react").MemoExoticComponent<typeof SortableFavoriteCardBase>;
|
|
14
|
-
export {};
|
|
8
|
+
export declare function SortableFavoriteCard({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }: SortableFavoriteCardProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/esm/components/MainMenu/helperComponents/Favorites/components/SortableFavoriteCard.js
CHANGED
|
@@ -3,10 +3,9 @@ import { useSortable } from '@dnd-kit/sortable';
|
|
|
3
3
|
import { CSS } from '@dnd-kit/utilities';
|
|
4
4
|
import { DRAG_MODE, DragGhost, DropIndicator, PLACEMENT } from '@cloud-ru/ds-drag-and-drop';
|
|
5
5
|
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
|
|
6
|
-
import { memo } from 'react';
|
|
7
6
|
import { getServiceFavoriteDragId } from '../../../utils/dnd/index.js';
|
|
8
7
|
import styles from '../styles.module.css';
|
|
9
|
-
function
|
|
8
|
+
export function SortableFavoriteCard({ serviceId, className, showInsertIndicatorBefore, showInsertIndicatorAfter, isFirst, ...cardProps }) {
|
|
10
9
|
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
11
10
|
id: getServiceFavoriteDragId(serviceId),
|
|
12
11
|
});
|
|
@@ -21,4 +20,3 @@ function SortableFavoriteCardBase({ serviceId, className, showInsertIndicatorBef
|
|
|
21
20
|
const { tabIndex, ...restAttributes } = attributes ?? {};
|
|
22
21
|
return (_jsxs(DragGhost, { innerRef: setNodeRef, style: style, className: styles.sortableCard, dragging: isDragging, mode: DRAG_MODE.Dynamic, ...listeners, ...restAttributes, children: [showInsertIndicatorBefore && _jsx(DropIndicator, { placement: PLACEMENT.Before, atEdge: isFirst }), _jsx(CardServiceLight, { as: 'a', ...cardProps, className: className ?? styles.card, tabIndex: tabIndex }), showInsertIndicatorAfter && _jsx(DropIndicator, { placement: PLACEMENT.After, atEdge: true })] }));
|
|
23
22
|
}
|
|
24
|
-
export const SortableFavoriteCard = memo(SortableFavoriteCardBase);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FavoriteProps, InnerLink } from '../../../types.js';
|
|
2
|
+
import { FavoritesSegment } from '../constants.js';
|
|
3
|
+
type UseFavoritesDndParams = {
|
|
4
|
+
favorite: FavoriteProps;
|
|
5
|
+
favoriteItems: InnerLink[];
|
|
6
|
+
segment: FavoritesSegment;
|
|
7
|
+
setSegment(segment: FavoritesSegment): void;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Оркестрирует drag&drop избранного: приём карточек сервисов из общей сетки
|
|
11
|
+
* (droppable), реордер внутри списка (insert-индикатор) и drag-превью.
|
|
12
|
+
*
|
|
13
|
+
* Требует `<DndContext>`-предка (см. `MainMenuDndContext`) — доступно только
|
|
14
|
+
* на desktop-раскладке, на mobile избранное рендерится без drag&drop.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useFavoritesDnd({ favorite, favoriteItems, segment, setSegment }: UseFavoritesDndParams): {
|
|
17
|
+
setNodeRef: (element: HTMLElement | null) => void;
|
|
18
|
+
listEndRef: import("react").RefObject<HTMLDivElement>;
|
|
19
|
+
favoriteSortableIds: string[];
|
|
20
|
+
insertIndex: number | null;
|
|
21
|
+
isInsertingToEnd: boolean;
|
|
22
|
+
showDropOver: true | undefined;
|
|
23
|
+
showInsertNew: true | undefined;
|
|
24
|
+
};
|
|
25
|
+
export {};
|