Skip to content

Commit 19fee45

Browse files
author
Leshe4ka
committed
navigation to brokers page through cluster menu
1 parent f2fabd3 commit 19fee45

File tree

3 files changed

+66
-29
lines changed

3 files changed

+66
-29
lines changed

frontend/src/components/Nav/ClusterMenu/ClusterMenu.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
clusterTopicsPath,
1515
kafkaConnectPath,
1616
} from 'lib/paths';
17-
import { useLocation } from 'react-router-dom';
17+
import { useLocation, useNavigate } from 'react-router-dom';
1818
import { useLocalStorage } from 'lib/hooks/useLocalStorage';
1919
import { ClusterColorKey } from 'theme/theme';
2020
import useScrollIntoView from 'lib/hooks/useScrollIntoView';
@@ -34,8 +34,10 @@ const ClusterMenu: FC<ClusterMenuProps> = ({
3434
}) => {
3535
const hasFeatureConfigured = (key: ClusterFeaturesEnum) =>
3636
features?.includes(key);
37+
3738
const [isOpen, setIsOpen] = useState(!!opened);
3839
const location = useLocation();
40+
const navigate = useNavigate();
3941
const [colorKey, setColorKey] = useLocalStorage<ClusterColorKey>(
4042
`clusterColor-${name}`,
4143
'transparent'
@@ -47,13 +49,25 @@ const ClusterMenu: FC<ClusterMenuProps> = ({
4749

4850
const { ref } = useScrollIntoView<HTMLUListElement>(opened);
4951

52+
const handleClusterNameClick = () => {
53+
if (!isOpen) {
54+
setIsOpen(true);
55+
}
56+
navigate(clusterBrokersPath(name));
57+
};
58+
59+
const handleToggleMenu = () => {
60+
setIsOpen((prev) => !prev);
61+
};
62+
5063
return (
5164
<S.ClusterList role="menu" $colorKey={colorKey} ref={ref}>
5265
<MenuTab
5366
title={name}
5467
status={status}
5568
isOpen={isOpen}
56-
toggleClusterMenu={() => setIsOpen((prev) => !prev)}
69+
toggleClusterMenu={handleToggleMenu}
70+
onClusterNameClick={handleClusterNameClick}
5771
setColorKey={setColorKey}
5872
isActive={opened}
5973
/>

frontend/src/components/Nav/Menu/MenuTab.tsx

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,55 @@ export interface MenuTabProps {
1010
status: ServerStatus;
1111
isOpen: boolean;
1212
toggleClusterMenu: () => void;
13+
onClusterNameClick: () => void;
1314
setColorKey: Dispatch<SetStateAction<ClusterColorKey>>;
1415
isActive?: boolean;
1516
}
1617

1718
const MenuTab: FC<MenuTabProps> = ({
1819
title,
1920
toggleClusterMenu,
21+
onClusterNameClick,
2022
status,
2123
isOpen,
2224
setColorKey,
2325
isActive = false,
24-
}) => (
25-
<S.MenuItem
26-
$variant="primary"
27-
onClick={toggleClusterMenu}
28-
$isActive={isActive}
29-
>
30-
<S.ContentWrapper>
31-
<S.StatusIconWrapper>
32-
<S.StatusIcon status={status} aria-label="status">
33-
<title>{status}</title>
34-
</S.StatusIcon>
35-
</S.StatusIconWrapper>
36-
37-
<S.Title title={title}>{title}</S.Title>
38-
</S.ContentWrapper>
39-
40-
<S.ActionsWrapper>
41-
<S.ColorPickerWrapper>
42-
<MenuColorPicker setColorKey={setColorKey} />
43-
</S.ColorPickerWrapper>
44-
45-
<S.ChevronWrapper>
46-
<S.ChevronIcon $isOpen={isOpen} />
47-
</S.ChevronWrapper>
48-
</S.ActionsWrapper>
49-
</S.MenuItem>
50-
);
26+
}) => {
27+
const handleNameClick = (e: React.MouseEvent) => {
28+
e.stopPropagation();
29+
onClusterNameClick();
30+
};
31+
32+
const handleChevronClick = (e: React.MouseEvent) => {
33+
e.stopPropagation();
34+
toggleClusterMenu();
35+
};
36+
37+
return (
38+
<S.MenuItem $variant="primary" $isActive={isActive}>
39+
<S.ContentWrapper onClick={handleNameClick} style={{ cursor: 'pointer' }}>
40+
<S.StatusIconWrapper>
41+
<S.StatusIcon status={status} aria-label="status">
42+
<title>{status}</title>
43+
</S.StatusIcon>
44+
</S.StatusIconWrapper>
45+
46+
<S.Title title={title}>{title}</S.Title>
47+
</S.ContentWrapper>
48+
49+
<S.ActionsWrapper>
50+
<S.ColorPickerWrapper>
51+
<MenuColorPicker setColorKey={setColorKey} />
52+
</S.ColorPickerWrapper>
53+
54+
<S.ChevronClickArea onClick={handleChevronClick}>
55+
<S.ChevronWrapper>
56+
<S.ChevronIcon $isOpen={isOpen} />
57+
</S.ChevronWrapper>
58+
</S.ChevronClickArea>
59+
</S.ActionsWrapper>
60+
</S.MenuItem>
61+
);
62+
};
5163

5264
export default MenuTab;

frontend/src/components/Nav/Menu/styled.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export const ContentWrapper = styled.div`
5050
display: flex;
5151
align-items: center;
5252
column-gap: 4px;
53+
width: 100%;
5354
`;
5455

5556
export const Title = styled.div`
@@ -85,6 +86,16 @@ export const StatusIcon = styled.circle.attrs({
8586
`;
8687
});
8788

89+
export const ChevronClickArea = styled.div`
90+
display: flex;
91+
align-items: center;
92+
justify-content: center;
93+
cursor: pointer;
94+
padding: 4px 6px;
95+
margin: -4px -6px;
96+
border-radius: 4px;
97+
`;
98+
8899
export const ChevronWrapper = styled.svg.attrs({
89100
viewBox: '0 0 10 6',
90101
xmlns: 'http://www.w3.org/2000/svg',

0 commit comments

Comments
 (0)