Skip to content

Commit e02e902

Browse files
committed
FE: Move cluster and connetors under kafka connect
1 parent 9f37767 commit e02e902

File tree

22 files changed

+288
-161
lines changed

22 files changed

+288
-161
lines changed

frontend/src/components/ClusterPage/ClusterPage.tsx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import useAppParams from 'lib/hooks/useAppParams';
44
import { ClusterFeaturesEnum } from 'generated-sources';
55
import {
66
clusterBrokerRelativePath,
7-
clusterConnectorsRelativePath,
8-
clusterConnectsRelativePath,
97
clusterConsumerGroupsRelativePath,
108
clusterKsqlDbRelativePath,
119
ClusterNameRoute,
@@ -14,20 +12,23 @@ import {
1412
clusterConfigRelativePath,
1513
getNonExactPath,
1614
clusterAclRelativePath,
17-
kafkaConnectsPaths,
15+
kafkaConnectRelativePath,
16+
clusterConnectorNewRelativePath,
17+
clusterConnectConnectorRelativePath,
1818
} from 'lib/paths';
1919
import ClusterContext from 'components/contexts/ClusterContext';
2020
import PageLoader from 'components/common/PageLoader/PageLoader';
2121
import { useClusters } from 'lib/hooks/api/clusters';
2222
import { GlobalSettingsContext } from 'components/contexts/GlobalSettingsContext';
23+
import New from 'components/Connect/New/New';
24+
import SuspenseQueryComponent from 'components/common/SuspenseQueryComponent/SuspenseQueryComponent';
25+
import DetailsPage from 'components/Connect/Details/DetailsPage';
2326

2427
const Brokers = React.lazy(() => import('components/Brokers/Brokers'));
2528
const Topics = React.lazy(() => import('components/Topics/Topics'));
2629
const Schemas = React.lazy(() => import('components/Schemas/Schemas'));
27-
const Connect = React.lazy(() => import('components/Connect/Connect'));
28-
const KafkaConnectClusters = React.lazy(
29-
() => import('components/KafkaConnectClustersPage/KafkaConnectClustersPage')
30-
);
30+
const KafkaConnect = React.lazy(() => import('components/Connect/Connect'));
31+
3132
const KsqlDb = React.lazy(() => import('components/KsqlDb/KsqlDb'));
3233
const ClusterConfigPage = React.lazy(
3334
() => import('components/ClusterPage/ClusterConfigPage')
@@ -86,22 +87,29 @@ const ClusterPage: React.FC = () => {
8687
element={<Schemas />}
8788
/>
8889
)}
90+
{contextValue.hasKafkaConnectConfigured && (
91+
<Route path={clusterConnectorNewRelativePath} element={<New />} />
92+
)}
8993
{contextValue.hasKafkaConnectConfigured && (
9094
<Route
91-
path={getNonExactPath(clusterConnectsRelativePath)}
92-
element={<Connect />}
95+
path={getNonExactPath(clusterConnectConnectorRelativePath)}
96+
element={
97+
<SuspenseQueryComponent>
98+
<DetailsPage />
99+
</SuspenseQueryComponent>
100+
}
93101
/>
94102
)}
95103
{contextValue.hasKafkaConnectConfigured && (
96104
<Route
97-
path={getNonExactPath(kafkaConnectsPaths)}
98-
element={<KafkaConnectClusters />}
105+
path={getNonExactPath(kafkaConnectRelativePath)}
106+
element={<KafkaConnect />}
99107
/>
100108
)}
101109
{contextValue.hasKafkaConnectConfigured && (
102110
<Route
103-
path={getNonExactPath(clusterConnectorsRelativePath)}
104-
element={<Connect />}
111+
path={getNonExactPath(kafkaConnectRelativePath)}
112+
element={<KafkaConnect />}
105113
/>
106114
)}
107115
{contextValue.hasKsqlDbConfigured && (
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import React from 'react';
2-
import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading';
32
import { Connect } from 'generated-sources';
43

54
import List from './ui/List/List';
6-
import Statistics from './ui/Statistics/Statistics';
5+
import ClustersStatistics from './ui/Statistics/Statistics';
76

87
const connects: Connect[] = [
98
{
@@ -24,11 +23,10 @@ const connects: Connect[] = [
2423

2524
const KafkaConnectClustersPage = () => {
2625
return (
27-
<div>
28-
<ResourcePageHeading text="Kafka connect clusters" />
29-
<Statistics connects={connects} />
26+
<>
27+
<ClustersStatistics connects={connects} />
3028
<List connects={connects} />
31-
</div>
29+
</>
3230
);
3331
};
3432

frontend/src/components/KafkaConnectClustersPage/ui/List/Cells/TasksCell.tsx renamed to frontend/src/components/Connect/Clusters/ui/List/Cells/TasksCell.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ const TasksCell = ({ connect }: Props) => {
88
const failedCount = connect.failedTasksCount ?? 0;
99
const text = `${count - failedCount}/${count}`;
1010

11+
if (!count) {
12+
return null;
13+
}
14+
1115
if (failedCount > 0) {
1216
return (
1317
<AlertBadge>
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
11
import React, { useMemo } from 'react';
22
import { Connect } from 'generated-sources';
3+
import * as Statistics from 'components/common/Statistics';
34

4-
import * as S from './Statistics.styled';
55
import { computeStatistic } from './models/computeStatistics';
6-
import Statistic from './Statistic/Statistic';
76

8-
type Props = { connects: Connect[] };
9-
const Statistics = ({ connects }: Props) => {
7+
type Props = { connects: Connect[]; isLoading: boolean };
8+
const ClustersStatistics = ({ connects, isLoading }: Props) => {
109
const statistic = useMemo(() => {
1110
return computeStatistic(connects);
1211
}, [connects]);
1312
return (
14-
<S.Container>
15-
<Statistic title="Clusters" count={statistic.clustersCount} />
16-
<Statistic
13+
<Statistics.Container>
14+
<Statistics.Item
15+
title="Clusters"
16+
count={statistic.clustersCount}
17+
isLoading={isLoading}
18+
/>
19+
<Statistics.Item
1720
title="Connectors"
1821
count={statistic.connectorsCount}
1922
warningCount={statistic.failedConnectorsCount}
23+
isLoading={isLoading}
2024
/>
21-
<Statistic
25+
<Statistics.Item
2226
title="Tasks"
2327
count={statistic.tasksCount}
2428
warningCount={statistic.failedTasksCount}
29+
isLoading={isLoading}
2530
/>
26-
</S.Container>
31+
</Statistics.Container>
2732
);
2833
};
2934

30-
export default Statistics;
35+
export default ClustersStatistics;

frontend/src/components/Connect/Connect.tsx

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,69 @@
11
import React from 'react';
2-
import { Navigate, Routes, Route } from 'react-router-dom';
2+
import { Navigate, Routes, Route, NavLink } from 'react-router-dom';
33
import {
44
RouteParams,
55
clusterConnectConnectorRelativePath,
66
clusterConnectConnectorsRelativePath,
77
clusterConnectorNewRelativePath,
88
getNonExactPath,
99
clusterConnectorsPath,
10+
ClusterNameRoute,
11+
kafkaConnectClustersPath,
12+
kafkaConnectClustersRelativePath,
13+
clusterConnectorsRelativePath,
1014
} from 'lib/paths';
1115
import useAppParams from 'lib/hooks/useAppParams';
1216
import SuspenseQueryComponent from 'components/common/SuspenseQueryComponent/SuspenseQueryComponent';
17+
import Navbar from 'components/common/Navigation/Navbar.styled';
18+
import Clusters from 'components/Connect/Clusters/Clusters';
1319

14-
import ListPage from './List/ListPage';
15-
import New from './New/New';
1620
import DetailsPage from './Details/DetailsPage';
21+
import New from './New/New';
22+
import Connectors from './List/ListPage';
23+
import Header from './Header/Header';
1724

1825
const Connect: React.FC = () => {
26+
const { clusterName } = useAppParams<ClusterNameRoute>();
27+
28+
return (
29+
<>
30+
<Header />
31+
<Navbar role="navigation">
32+
<NavLink
33+
to={kafkaConnectClustersPath(clusterName)}
34+
className={({ isActive }) => (isActive ? 'is-active' : '')}
35+
end
36+
>
37+
Clusters
38+
</NavLink>
39+
<NavLink
40+
to={clusterConnectorsPath(clusterName)}
41+
className={({ isActive }) => (isActive ? 'is-active' : '')}
42+
end
43+
>
44+
Connectors
45+
</NavLink>
46+
</Navbar>
47+
<Routes>
48+
<Route
49+
index
50+
element={
51+
<Navigate to={kafkaConnectClustersPath(clusterName)} replace />
52+
}
53+
/>
54+
<Route path={kafkaConnectClustersRelativePath} element={<Clusters />} />
55+
<Route path={clusterConnectorsRelativePath} element={<Connectors />} />
56+
</Routes>
57+
</>
58+
);
59+
};
60+
61+
const ConnectOld: React.FC = () => {
1962
const { clusterName } = useAppParams();
2063

2164
return (
2265
<Routes>
23-
<Route index element={<ListPage />} />
66+
<Route index element={<Connectors />} />
2467
<Route path={clusterConnectorNewRelativePath} element={<New />} />
2568
<Route
2669
path={getNonExactPath(clusterConnectConnectorRelativePath)}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { ActionButton } from 'components/common/ActionComponent';
2+
import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading';
3+
import Tooltip from 'components/common/Tooltip/Tooltip';
4+
import ClusterContext from 'components/contexts/ClusterContext';
5+
import { ResourceType, Action } from 'generated-sources';
6+
import { useConnects } from 'lib/hooks/api/kafkaConnect';
7+
import useAppParams from 'lib/hooks/useAppParams';
8+
import { clusterConnectorNewPath, ClusterNameRoute } from 'lib/paths';
9+
import React from 'react';
10+
11+
const Header = () => {
12+
const { isReadOnly } = React.useContext(ClusterContext);
13+
const { clusterName } = useAppParams<ClusterNameRoute>();
14+
const { data: connects = [] } = useConnects(clusterName);
15+
return (
16+
<ResourcePageHeading text="Kafka Connect">
17+
{!isReadOnly && (
18+
<Tooltip
19+
value={
20+
<ActionButton
21+
buttonType="primary"
22+
buttonSize="M"
23+
disabled={!connects.length}
24+
to={`${clusterConnectorNewPath(clusterName)}`}
25+
permission={{
26+
resource: ResourceType.CONNECT,
27+
action: Action.CREATE,
28+
}}
29+
>
30+
Create Connector
31+
</ActionButton>
32+
}
33+
showTooltip={!connects.length}
34+
content="No Connects available"
35+
placement="left"
36+
/>
37+
)}
38+
</ResourcePageHeading>
39+
);
40+
};
41+
42+
export default Header;

0 commit comments

Comments
 (0)