Skip to content

Commit 92ce39c

Browse files
committed
feat: add a dropdown button to the topic table on the Consumer Group page for deleting offsets.
1 parent 273e64c commit 92ce39c

File tree

3 files changed

+82
-2
lines changed

3 files changed

+82
-2
lines changed

contract/src/main/resources/swagger/kafbat-ui-api.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,6 +1048,32 @@ paths:
10481048
200:
10491049
description: OK
10501050

1051+
/api/clusters/{clusterName}/consumer-groups/{id}/topics/{topicName}:
1052+
delete:
1053+
tags:
1054+
- Consumer Groups
1055+
summary: delete consumer group offsets
1056+
operationId: deleteConsumerGroupOffsets
1057+
parameters:
1058+
- name: clusterName
1059+
in: path
1060+
required: true
1061+
schema:
1062+
type: string
1063+
- name: id
1064+
in: path
1065+
required: true
1066+
schema:
1067+
type: string
1068+
- name: topicName
1069+
in: path
1070+
required: true
1071+
schema:
1072+
type: string
1073+
responses:
1074+
200:
1075+
description: OK
1076+
10511077
/api/clusters/{clusterName}/schemas:
10521078
post:
10531079
tags:

frontend/src/components/ConsumerGroups/Details/ListItem.tsx

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import React from 'react';
2-
import { ConsumerGroupTopicPartition } from 'generated-sources';
2+
import { Action, ConsumerGroupTopicPartition, ResourceType } from 'generated-sources';
33
import { Link } from 'react-router-dom';
44
import { ClusterName } from 'lib/interfaces/cluster';
5-
import { clusterTopicPath } from 'lib/paths';
5+
import { ClusterGroupParam, clusterTopicPath } from 'lib/paths';
6+
import { useDeleteConsumerGroupOffsetsMutation } from 'lib/hooks/api/consumers';
7+
import useAppParams from 'lib/hooks/useAppParams';
8+
import { Dropdown } from 'components/common/Dropdown';
9+
import { ActionDropdownItem } from 'components/common/ActionComponent';
610
import MessageToggleIcon from 'components/common/Icons/MessageToggleIcon';
711
import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper';
812
import { TableKeyLink } from 'components/common/table/Table/TableKeyLink.styled';
@@ -18,6 +22,8 @@ interface Props {
1822

1923
const ListItem: React.FC<Props> = ({ clusterName, name, consumers }) => {
2024
const [isOpen, setIsOpen] = React.useState(false);
25+
const consumerProps = useAppParams<ClusterGroupParam>();
26+
const deleteOffsetMutation = useDeleteConsumerGroupOffsetsMutation(consumerProps);
2127

2228
const getTotalconsumerLag = () => {
2329
let count = 0;
@@ -27,6 +33,11 @@ const ListItem: React.FC<Props> = ({ clusterName, name, consumers }) => {
2733
return count;
2834
};
2935

36+
const deleteOffsetHandler = (topicName?: string) => {
37+
if (topicName === undefined) return;
38+
deleteOffsetMutation.mutateAsync(topicName);
39+
};
40+
3041
return (
3142
<>
3243
<tr>
@@ -41,6 +52,22 @@ const ListItem: React.FC<Props> = ({ clusterName, name, consumers }) => {
4152
</FlexWrapper>
4253
</td>
4354
<td>{getTotalconsumerLag()}</td>
55+
<td>
56+
<Dropdown>
57+
<ActionDropdownItem
58+
onClick={() => deleteOffsetHandler(name)}
59+
danger
60+
confirm="Are you sure you want to delete offsets from the topic?"
61+
permission={{
62+
resource: ResourceType.CONSUMER,
63+
action: Action.RESET_OFFSETS,
64+
value: consumerProps.consumerGroupID,
65+
}}
66+
>
67+
<span>Delete offsets</span>
68+
</ActionDropdownItem>
69+
</Dropdown>
70+
</td>
4471
</tr>
4572
{isOpen && <TopicContents consumers={consumers} />}
4673
</>

frontend/src/lib/hooks/api/consumers.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,30 @@ export const useResetConsumerGroupOffsetsMutation = ({
9090
}
9191
);
9292
};
93+
94+
export const useDeleteConsumerGroupOffsetsMutation = ({
95+
clusterName,
96+
consumerGroupID,
97+
}: UseConsumerGroupDetailsProps) => {
98+
const queryClient = useQueryClient();
99+
return useMutation(
100+
(topicName: string) =>
101+
api.deleteConsumerGroupOffsets({
102+
clusterName,
103+
id: consumerGroupID,
104+
topicName,
105+
}),
106+
{
107+
onSuccess: (_, topicName) => {
108+
showSuccessAlert({
109+
message: `Consumer ${consumerGroupID} group offsets in topic ${topicName} deleted`,
110+
});
111+
queryClient.invalidateQueries([
112+
'clusters',
113+
clusterName,
114+
'consumerGroups',
115+
]);
116+
},
117+
}
118+
);
119+
};

0 commit comments

Comments
 (0)