Skip to content

Commit 1bb3cd5

Browse files
authored
Merge branch 'kafbat:main' into main
2 parents a73ca2f + bcb9d18 commit 1bb3cd5

File tree

20 files changed

+150
-68
lines changed

20 files changed

+150
-68
lines changed

api/src/main/java/io/kafbat/ui/controller/ConsumerGroupsController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ public Mono<ResponseEntity<ConsumerGroupsPageResponseDTO>> getConsumerGroupsPage
143143
Optional.ofNullable(page).filter(i -> i > 0).orElse(1),
144144
Optional.ofNullable(perPage).filter(i -> i > 0).orElse(defaultConsumerGroupsPageSize),
145145
search,
146+
fts,
146147
Optional.ofNullable(orderBy).orElse(ConsumerGroupOrderingDTO.NAME),
147148
Optional.ofNullable(sortOrderDto).orElse(SortOrderDTO.ASC)
148149
)

api/src/main/java/io/kafbat/ui/service/ConsumerGroupService.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,12 @@ public Mono<ConsumerGroupsPage> getConsumerGroupsPage(
152152
int pageNum,
153153
int perPage,
154154
@Nullable String search,
155+
Boolean fts,
155156
ConsumerGroupOrderingDTO orderBy,
156157
SortOrderDTO sortOrderDto) {
157158
return adminClientService.get(cluster).flatMap(ac ->
158159
ac.listConsumerGroups()
159-
.map(listing -> filterGroups(listing, search)
160+
.map(listing -> filterGroups(listing, search, fts)
160161
)
161162
.flatMapIterable(lst -> lst)
162163
.filterWhen(cg -> accessControlService.isConsumerGroupAccessible(cg.groupId(), cluster.getName()))
@@ -169,9 +170,11 @@ public Mono<ConsumerGroupsPage> getConsumerGroupsPage(
169170
(allGroups.size() / perPage) + (allGroups.size() % perPage == 0 ? 0 : 1))))));
170171
}
171172

172-
private Collection<ConsumerGroupListing> filterGroups(Collection<ConsumerGroupListing> groups, String search) {
173-
ClustersProperties.ClusterFtsProperties fts = clustersProperties.getFts();
174-
ConsumerGroupFilter filter = new ConsumerGroupFilter(groups, fts.isEnabled(), fts.getConsumers());
173+
private Collection<ConsumerGroupListing> filterGroups(Collection<ConsumerGroupListing> groups, String search,
174+
Boolean useFts) {
175+
ClustersProperties.ClusterFtsProperties ftsProperties = clustersProperties.getFts();
176+
boolean fts = ftsProperties.use(useFts);
177+
ConsumerGroupFilter filter = new ConsumerGroupFilter(groups, fts, ftsProperties.getConsumers());
175178
return filter.find(search);
176179
}
177180

api/src/main/java/io/kafbat/ui/service/index/LuceneTopicsIndex.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.concurrent.locks.ReentrantReadWriteLock;
1616
import java.util.function.Function;
1717
import java.util.stream.Collectors;
18+
import lombok.extern.slf4j.Slf4j;
1819
import org.apache.lucene.analysis.Analyzer;
1920
import org.apache.lucene.document.Document;
2021
import org.apache.lucene.document.Field;
@@ -40,6 +41,7 @@
4041
import org.apache.lucene.store.ByteBuffersDirectory;
4142
import org.apache.lucene.store.Directory;
4243

44+
@Slf4j
4345
public class LuceneTopicsIndex implements TopicsIndex {
4446
public static final String FIELD_NAME_RAW = "name_raw";
4547

@@ -74,9 +76,15 @@ private Directory build(List<InternalTopic> topics) {
7476
doc.add(new LongPoint(FIELD_SIZE, topic.getSegmentSize()));
7577
if (topic.getTopicConfigs() != null && !topic.getTopicConfigs().isEmpty()) {
7678
for (InternalTopicConfig topicConfig : topic.getTopicConfigs()) {
77-
if (topicConfig.getName() != null || topicConfig.getValue() != null) {
79+
final String topicConfigValue = topicConfig.getValue();
80+
if (topicConfigValue != null) {
7881
doc.add(new StringField(FIELD_CONFIG_PREFIX + "_" + topicConfig.getName(), topicConfig.getValue(),
7982
Field.Store.NO));
83+
} else {
84+
log.info(
85+
"Topic configuration item '{}' on internal topic '{}' has an unexpected value of null"
86+
+ "; skipping processing", topicConfig.getName(), topic.getName()
87+
);
8088
}
8189
}
8290
}

api/src/main/resources/logback-spring.xml

Lines changed: 0 additions & 14 deletions
This file was deleted.

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import React from 'react';
1+
import React, { useCallback } from 'react';
22
import { FullConnectorInfo } from 'generated-sources';
33
import Table from 'components/common/NewTable';
44
import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib';
55
import { useQueryPersister } from 'components/common/NewTable/ColumnFilter';
66
import { VisibilityState } from '@tanstack/react-table';
7+
import { useFilteredConnectorsDispatch } from 'components/Connect/model/FilteredConnectorsProvider';
78

89
import { connectorsColumns } from './connectorsColumns/columns';
910

@@ -21,11 +22,16 @@ export const ConnectorsTable = ({
2122
columnSizingPersistKey = 'KafkaConnect',
2223
columnVisibility,
2324
}: ConnectorsTableProps) => {
25+
const dispath = useFilteredConnectorsDispatch();
2426
const filterPersister = useQueryPersister(connectorsColumns);
2527
const columnSizingPersister = useLocalStoragePersister(
2628
columnSizingPersistKey
2729
);
2830

31+
const onFilterRows = useCallback((rows: FullConnectorInfo[]) => {
32+
dispath({ type: 'updated', connectors: rows });
33+
}, []);
34+
2935
return (
3036
<Table
3137
data={connectors}
@@ -37,6 +43,7 @@ export const ConnectorsTable = ({
3743
setRowId={setRowId}
3844
filterPersister={filterPersister}
3945
columnVisibility={columnVisibility}
46+
onFilterRows={onFilterRows}
4047
/>
4148
);
4249
};

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

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
22
import { FullConnectorInfo } from 'generated-sources';
33
import { CellContext } from '@tanstack/react-table';
4-
import { useNavigate } from 'react-router-dom';
54
import { MultiLineTag } from 'components/common/Tag/Tag.styled';
65
import { ClusterNameRoute, clusterTopicPath } from 'lib/paths';
76
import useAppParams from 'lib/hooks/useAppParams';
@@ -13,31 +12,18 @@ const TopicsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
1312
}) => {
1413
const { topics } = row.original;
1514
const { clusterName } = useAppParams<ClusterNameRoute>();
16-
const navigate = useNavigate();
17-
18-
const navigateToTopic = (
19-
e: React.KeyboardEvent | React.MouseEvent,
20-
topic: string
21-
) => {
22-
e.preventDefault();
23-
e.stopPropagation();
24-
navigate(clusterTopicPath(clusterName, topic));
25-
};
2615

2716
return (
2817
<S.TagsWrapper>
29-
{topics?.map((t) => (
30-
<MultiLineTag key={t} color="green">
31-
<span
32-
role="link"
33-
onClick={(e) => navigateToTopic(e, t)}
34-
onKeyDown={(e) => navigateToTopic(e, t)}
35-
tabIndex={0}
36-
>
37-
{t}
38-
</span>
39-
</MultiLineTag>
40-
))}
18+
{topics?.map((t) => {
19+
const href = clusterTopicPath(clusterName, t);
20+
21+
return (
22+
<MultiLineTag key={t} color="green">
23+
<a href={href}>{t}</a>
24+
</MultiLineTag>
25+
);
26+
})}
4127
</S.TagsWrapper>
4228
);
4329
};

frontend/src/components/Connect/List/ConnectorsTable/connectorsColumns/columns.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const connectorsColumns: ColumnDef<FullConnectorInfo, string>[] = [
1919
header: 'Connect',
2020
accessorKey: 'connect',
2121
cell: BreakableTextCell,
22-
filterFn: 'arrIncludesSome',
22+
filterFn: 'includesSome',
2323
meta: { filterVariant: 'multi-select' },
2424
enableResizing: true,
2525
},

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { useSearchParams } from 'react-router-dom';
88
import useFts from 'components/common/Fts/useFts';
99
import Fts from 'components/common/Fts/Fts';
1010
import { FullConnectorInfo } from 'generated-sources';
11+
import { FilteredConnectorsProvider } from 'components/Connect/model/FilteredConnectorsProvider';
1112

1213
import * as S from './ListPage.styled';
1314
import List from './List';
@@ -26,8 +27,8 @@ const ListPage: React.FC = () => {
2627
);
2728

2829
return (
29-
<>
30-
<ConnectorsStatistics connectors={connectors} isLoading={isLoading} />
30+
<FilteredConnectorsProvider>
31+
<ConnectorsStatistics isLoading={isLoading} />
3132
<S.Search hasInput>
3233
<Search
3334
placeholder="Search by Connect Name, Status or Type"
@@ -37,7 +38,7 @@ const ListPage: React.FC = () => {
3738
<Suspense fallback={<PageLoader />}>
3839
<List connectors={connectors} />
3940
</Suspense>
40-
</>
41+
</FilteredConnectorsProvider>
4142
);
4243
};
4344

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import React, { FC, useMemo } from 'react';
22
import * as Statistics from 'components/common/Statistics';
3-
import { FullConnectorInfo } from 'generated-sources';
3+
import { useFilteredConnectors } from 'components/Connect/model/FilteredConnectorsProvider';
44

55
import { computeStatistics } from './models/computeStatistics';
66

77
interface ConnectorsStatisticsProps {
8-
connectors: FullConnectorInfo[];
98
isLoading: boolean;
109
}
11-
const ConnectorsStatistics: FC<ConnectorsStatisticsProps> = ({
12-
connectors,
13-
isLoading,
14-
}) => {
15-
const statistics = useMemo(() => computeStatistics(connectors), [connectors]);
10+
const ConnectorsStatistics: FC<ConnectorsStatisticsProps> = ({ isLoading }) => {
11+
const connectors = useFilteredConnectors();
12+
13+
const statistics = useMemo(() => {
14+
return computeStatistics(connectors);
15+
}, [connectors]);
1616

1717
return (
1818
<Statistics.Container role="group">

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import ConnectorsStatistics from 'components/Connect/List/Statistics/Statistics'
55
import { useConnectors } from 'lib/hooks/api/kafkaConnect';
66
import { connectors } from 'lib/fixtures/kafkaConnect';
77
import { FullConnectorInfo } from 'generated-sources';
8+
import { FilteredConnectorsProvider } from 'components/Connect/model/FilteredConnectorsProvider';
89

910
jest.mock('lib/hooks/api/kafkaConnect');
1011
jest.mock('lib/hooks/useAppParams', () => ({
@@ -25,7 +26,11 @@ describe('Kafka Connect Connectors Statistics', () => {
2526
function renderComponent({ data = [], isLoading }: RenderComponentProps) {
2627
// eslint-disable-next-line @typescript-eslint/no-explicit-any
2728
useConnectorsMock.mockReturnValue({ data, isLoading } as any);
28-
render(<ConnectorsStatistics connectors={data} isLoading={isLoading} />);
29+
render(
30+
<FilteredConnectorsProvider initialData={data}>
31+
<ConnectorsStatistics isLoading={isLoading} />
32+
</FilteredConnectorsProvider>
33+
);
2934
}
3035

3136
describe('when data loading', () => {

0 commit comments

Comments
 (0)