Skip to content

Commit fb5577d

Browse files
Leshe4kaLeshe4ka
andauthored
FE: issue #1090 Added Kafka Connect tab to the topic (#1439)
Co-authored-by: Leshe4ka <[email protected]>
1 parent e767cb1 commit fb5577d

File tree

19 files changed

+245
-139
lines changed

19 files changed

+245
-139
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React from 'react';
2+
import { FullConnectorInfo } from 'generated-sources';
3+
import Table from 'components/common/NewTable';
4+
import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib';
5+
import { useQueryPersister } from 'components/common/NewTable/ColumnFilter';
6+
import { VisibilityState } from '@tanstack/react-table';
7+
8+
import { connectorsColumns } from './connectorsColumns/columns';
9+
10+
const setRowId = (originalRow: FullConnectorInfo) =>
11+
`${originalRow.name}-${originalRow.connect}`;
12+
13+
type ConnectorsTableProps = {
14+
connectors: FullConnectorInfo[];
15+
columnSizingPersistKey?: string;
16+
columnVisibility?: VisibilityState;
17+
};
18+
19+
export const ConnectorsTable = ({
20+
connectors,
21+
columnSizingPersistKey = 'KafkaConnect',
22+
columnVisibility,
23+
}: ConnectorsTableProps) => {
24+
const filterPersister = useQueryPersister(connectorsColumns);
25+
const columnSizingPersister = useLocalStoragePersister(
26+
columnSizingPersistKey
27+
);
28+
29+
return (
30+
<Table
31+
data={connectors}
32+
columns={connectorsColumns}
33+
enableSorting
34+
enableColumnResizing
35+
columnSizingPersister={columnSizingPersister}
36+
emptyMessage="No connectors found"
37+
setRowId={setRowId}
38+
filterPersister={filterPersister}
39+
columnVisibility={columnVisibility}
40+
/>
41+
);
42+
};

frontend/src/components/Connect/List/ActionsCell.tsx renamed to frontend/src/components/Connect/List/ConnectorsTable/connectorsColumns/cells/ActionsCell.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
ResourceType,
88
} from 'generated-sources';
99
import { CellContext } from '@tanstack/react-table';
10-
import { ClusterNameRoute } from 'lib/paths';
10+
import { RouteParamsClusterTopic } from 'lib/paths';
1111
import useAppParams from 'lib/hooks/useAppParams';
1212
import { Dropdown } from 'components/common/Dropdown';
1313
import {
@@ -24,7 +24,7 @@ const ActionsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
2424
row,
2525
}) => {
2626
const { connect, name, status } = row.original;
27-
const { clusterName } = useAppParams<ClusterNameRoute>();
27+
const { clusterName, topicName } = useAppParams<RouteParamsClusterTopic>();
2828
const { isReadOnly } = useContext(ClusterContext);
2929
const mutationsNumber = useIsMutating();
3030
const isMutating = mutationsNumber > 0;
@@ -33,16 +33,19 @@ const ActionsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
3333
clusterName,
3434
connectName: connect,
3535
connectorName: name,
36+
topicName,
3637
});
3738
const stateMutation = useUpdateConnectorState({
3839
clusterName,
3940
connectName: connect,
4041
connectorName: name,
42+
topicName,
4143
});
4244
const resetConnectorOffsetsMutation = useResetConnectorOffsets({
4345
clusterName,
4446
connectName: connect,
4547
connectorName: name,
48+
topicName,
4649
});
4750
const handleDelete = () => {
4851
confirm(
@@ -54,7 +57,7 @@ const ActionsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
5457
}
5558
);
5659
};
57-
// const stateMutation = useUpdateConnectorState(routerProps);
60+
5861
const resumeConnectorHandler = () =>
5962
stateMutation.mutateAsync(ConnectorAction.RESUME);
6063
const restartConnectorHandler = () =>

frontend/src/components/Connect/List/TopicsCell.tsx renamed to frontend/src/components/Connect/List/ConnectorsTable/connectorsColumns/cells/TopicsCell.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { MultiLineTag } from 'components/common/Tag/Tag.styled';
66
import { ClusterNameRoute, clusterTopicPath } from 'lib/paths';
77
import useAppParams from 'lib/hooks/useAppParams';
88

9-
import * as S from './List.styled';
9+
import * as S from './TopicsCell.styled';
1010

1111
const TopicsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
1212
row,
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { ColumnDef } from '@tanstack/react-table';
2+
import { FullConnectorInfo } from 'generated-sources';
3+
import BreakableTextCell from 'components/common/NewTable/BreakableTextCell';
4+
import { TagCell } from 'components/common/NewTable';
5+
6+
import { KafkaConnectLinkCell } from './cells/KafkaConnectLinkCell';
7+
import TopicsCell from './cells/TopicsCell';
8+
import RunningTasksCell from './cells/RunningTasksCell';
9+
import ActionsCell from './cells/ActionsCell';
10+
11+
export const connectorsColumns: ColumnDef<FullConnectorInfo, string>[] = [
12+
{
13+
header: 'Name',
14+
accessorKey: 'name',
15+
cell: KafkaConnectLinkCell,
16+
enableResizing: true,
17+
},
18+
{
19+
header: 'Connect',
20+
accessorKey: 'connect',
21+
cell: BreakableTextCell,
22+
filterFn: 'arrIncludesSome',
23+
meta: { filterVariant: 'multi-select' },
24+
enableResizing: true,
25+
},
26+
{
27+
header: 'Type',
28+
accessorKey: 'type',
29+
meta: { filterVariant: 'multi-select' },
30+
filterFn: 'arrIncludesSome',
31+
size: 120,
32+
},
33+
{
34+
header: 'Plugin',
35+
accessorKey: 'connectorClass',
36+
cell: BreakableTextCell,
37+
meta: { filterVariant: 'multi-select' },
38+
filterFn: 'arrIncludesSome',
39+
enableResizing: true,
40+
},
41+
{
42+
header: 'Topics',
43+
accessorKey: 'topics',
44+
cell: TopicsCell,
45+
enableColumnFilter: true,
46+
meta: { filterVariant: 'multi-select' },
47+
filterFn: 'arrIncludesSome',
48+
enableResizing: true,
49+
},
50+
{
51+
header: 'Status',
52+
accessorKey: 'status.state',
53+
cell: TagCell,
54+
meta: { filterVariant: 'multi-select' },
55+
filterFn: 'arrIncludesSome',
56+
},
57+
{
58+
id: 'running_task',
59+
header: 'Running Tasks',
60+
cell: RunningTasksCell,
61+
size: 120,
62+
},
63+
{
64+
header: '',
65+
id: 'action',
66+
cell: ActionsCell,
67+
size: 60,
68+
},
69+
];
Lines changed: 3 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,19 @@
11
import React from 'react';
22
import useAppParams from 'lib/hooks/useAppParams';
33
import { ClusterNameRoute } from 'lib/paths';
4-
import Table, { TagCell } from 'components/common/NewTable';
5-
import { FullConnectorInfo } from 'generated-sources';
64
import { useConnectors } from 'lib/hooks/api/kafkaConnect';
7-
import { ColumnDef } from '@tanstack/react-table';
85
import { useSearchParams } from 'react-router-dom';
9-
import { useQueryPersister } from 'components/common/NewTable/ColumnFilter';
10-
import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib';
11-
import BreakableTextCell from 'components/common/NewTable/BreakableTextCell';
12-
13-
import ActionsCell from './ActionsCell';
14-
import TopicsCell from './TopicsCell';
15-
import RunningTasksCell from './RunningTasksCell';
16-
import { KafkaConnectLinkCell } from './KafkaConnectLinkCell';
17-
18-
const kafkaConnectColumns: ColumnDef<FullConnectorInfo, string>[] = [
19-
{
20-
header: 'Name',
21-
accessorKey: 'name',
22-
cell: KafkaConnectLinkCell,
23-
enableResizing: true,
24-
},
25-
{
26-
header: 'Connect',
27-
accessorKey: 'connect',
28-
cell: BreakableTextCell,
29-
filterFn: 'arrIncludesSome',
30-
meta: {
31-
filterVariant: 'multi-select',
32-
},
33-
enableResizing: true,
34-
},
35-
{
36-
header: 'Type',
37-
accessorKey: 'type',
38-
meta: { filterVariant: 'multi-select' },
39-
filterFn: 'arrIncludesSome',
40-
size: 120,
41-
},
42-
{
43-
header: 'Plugin',
44-
accessorKey: 'connectorClass',
45-
cell: BreakableTextCell,
46-
meta: { filterVariant: 'multi-select' },
47-
filterFn: 'arrIncludesSome',
48-
enableResizing: true,
49-
},
50-
{
51-
header: 'Topics',
52-
accessorKey: 'topics',
53-
cell: TopicsCell,
54-
enableColumnFilter: true,
55-
meta: { filterVariant: 'multi-select' },
56-
filterFn: 'arrIncludesSome',
57-
enableResizing: true,
58-
},
59-
{
60-
header: 'Status',
61-
accessorKey: 'status.state',
62-
cell: TagCell,
63-
meta: { filterVariant: 'multi-select' },
64-
filterFn: 'arrIncludesSome',
65-
},
66-
{
67-
id: 'running_task',
68-
header: 'Running Tasks',
69-
cell: RunningTasksCell,
70-
size: 120,
71-
},
72-
{
73-
header: '',
74-
id: 'action',
75-
cell: ActionsCell,
76-
size: 60,
77-
},
78-
];
6+
import { ConnectorsTable } from 'components/Connect/List/ConnectorsTable/ConnectorsTable';
797

808
const List: React.FC = () => {
819
const { clusterName } = useAppParams<ClusterNameRoute>();
8210
const [searchParams] = useSearchParams();
83-
const { data: connectors } = useConnectors(
11+
const { data: connectors = [] } = useConnectors(
8412
clusterName,
8513
searchParams.get('q') || ''
8614
);
8715

88-
const filterPersister = useQueryPersister(kafkaConnectColumns);
89-
const columnSizingPersister = useLocalStoragePersister('KafkaConnect');
90-
91-
return (
92-
<Table
93-
data={connectors || []}
94-
columns={kafkaConnectColumns}
95-
enableSorting
96-
enableColumnResizing
97-
columnSizingPersister={columnSizingPersister}
98-
emptyMessage="No connectors found"
99-
setRowId={(originalRow) => `${originalRow.name}-${originalRow.connect}`}
100-
filterPersister={filterPersister}
101-
/>
102-
);
16+
return <ConnectorsTable connectors={connectors} />;
10317
};
10418

10519
export default List;
Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,21 @@
11
import React, { Suspense } from 'react';
2-
import useAppParams from 'lib/hooks/useAppParams';
3-
import { ClusterNameRoute } from 'lib/paths';
42
import Search from 'components/common/Search/Search';
53
import PageLoader from 'components/common/PageLoader/PageLoader';
6-
import { useConnectors } from 'lib/hooks/api/kafkaConnect';
74

85
import * as S from './ListPage.styled';
96
import List from './List';
107
import ConnectorsStatistics from './Statistics/Statistics';
118

12-
const ListPage: React.FC = () => {
13-
const { clusterName } = useAppParams<ClusterNameRoute>();
14-
const { data, isLoading } = useConnectors(clusterName);
15-
16-
return (
17-
<>
18-
<ConnectorsStatistics connectors={data ?? []} isLoading={isLoading} />
19-
<S.Search hasInput>
20-
<Search placeholder="Search by Connect Name, Status or Type" />
21-
</S.Search>
22-
<Suspense fallback={<PageLoader />}>
23-
<List />
24-
</Suspense>
25-
</>
26-
);
27-
};
9+
const ListPage: React.FC = () => (
10+
<>
11+
<ConnectorsStatistics />
12+
<S.Search hasInput>
13+
<Search placeholder="Search by Connect Name, Status or Type" />
14+
</S.Search>
15+
<Suspense fallback={<PageLoader />}>
16+
<List />
17+
</Suspense>
18+
</>
19+
);
2820

2921
export default ListPage;

frontend/src/components/Connect/List/Statistics/Statistics.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
import React, { useMemo } from 'react';
22
import * as Statistics from 'components/common/Statistics';
3-
import { FullConnectorInfo } from 'generated-sources';
3+
import useAppParams from 'lib/hooks/useAppParams';
4+
import { ClusterNameRoute } from 'lib/paths';
5+
import { useConnectors } from 'lib/hooks/api/kafkaConnect';
46

57
import { computeStatistics } from './models/computeStatistics';
68

7-
type Props = {
8-
connectors: FullConnectorInfo[];
9-
isLoading: boolean;
10-
};
11-
const ConnectorsStatistics = ({ connectors, isLoading }: Props) => {
12-
const statistics = useMemo(() => {
13-
return computeStatistics(connectors);
14-
}, [connectors]);
9+
const ConnectorsStatistics = () => {
10+
const { clusterName } = useAppParams<ClusterNameRoute>();
11+
const { data: connectors = [], isLoading } = useConnectors(clusterName);
12+
13+
const statistics = useMemo(() => computeStatistics(connectors), [connectors]);
1514

1615
return (
1716
<Statistics.Container role="group">

0 commit comments

Comments
 (0)