+ ))}
+
+
+
+ );
+};
+
+export default DeleteConsumerModal;
diff --git a/frontend-new/src/components/topic/ConsumerResetOffsetDialog.jsx b/frontend-new/src/components/topic/ConsumerResetOffsetDialog.jsx
new file mode 100644
index 0000000..e5056d4
--- /dev/null
+++ b/frontend-new/src/components/topic/ConsumerResetOffsetDialog.jsx
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Button, DatePicker, Form, Modal, Select } from "antd";
+import React, { useEffect, useState } from "react";
+
+const ConsumerResetOffsetDialog = ({ visible, onClose, topic, allConsumerGroupList, handleResetOffset, t }) => {
+ const [form] = Form.useForm();
+ const [selectedConsumerGroup, setSelectedConsumerGroup] = useState([]);
+ const [selectedTime, setSelectedTime] = useState(null);
+
+ useEffect(() => {
+ if (!visible) {
+ setSelectedConsumerGroup([]);
+ setSelectedTime(null);
+ form.resetFields();
+ }
+ }, [visible, form]);
+
+ const handleResetButtonClick = () => {
+ handleResetOffset(selectedConsumerGroup, selectedTime ? selectedTime.valueOf() : null);
+ };
+
+ return (
+
+ {t.RESET}
+ ,
+ ,
+ ]}
+ >
+
+
+
+
+
+
+
+ );
+};
+
+export default ConsumerResetOffsetDialog;
diff --git a/frontend-new/src/components/topic/ConsumerViewDialog.jsx b/frontend-new/src/components/topic/ConsumerViewDialog.jsx
new file mode 100644
index 0000000..304628a
--- /dev/null
+++ b/frontend-new/src/components/topic/ConsumerViewDialog.jsx
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import moment from "moment/moment";
+import {Button, Modal, Table} from "antd";
+import React from "react";
+
+const ConsumerViewDialog = ({ visible, onClose, topic, consumerData, consumerGroupCount, t }) => {
+ const columns = [
+ { title: t.BROKER, dataIndex: 'brokerName', key: 'brokerName', align: 'center' },
+ { title: t.QUEUE, dataIndex: 'queueId', key: 'queueId', align: 'center' },
+ { title: t.CONSUMER_CLIENT, dataIndex: 'clientInfo', key: 'clientInfo', align: 'center' },
+ { title: t.BROKER_OFFSET, dataIndex: 'brokerOffset', key: 'brokerOffset', align: 'center' },
+ { title: t.CONSUMER_OFFSET, dataIndex: 'consumerOffset', key: 'consumerOffset', align: 'center' },
+ {
+ title: t.DIFF_TOTAL,
+ dataIndex: 'diffTotal',
+ key: 'diffTotal',
+ align: 'center',
+ render: (_, record) => record.brokerOffset - record.consumerOffset,
+ },
+ {
+ title: t.LAST_TIME_STAMP,
+ dataIndex: 'lastTimestamp',
+ key: 'lastTimestamp',
+ align: 'center',
+ render: (text) => moment(text).format('YYYY-MM-DD HH:mm:ss'),
+ },
+ ];
+
+ return (
+
+ {t.CLOSE}
+ ,
+ ]}
+ >
+ {consumerGroupCount === 0 ? (
+
`${record.brokerName}-${record.queueId}-${index}`}
+ size="small"
+ />
+
+ ))
+ )}
+
+ );
+};
+
+export default ConsumerViewDialog;
diff --git a/frontend-new/src/components/topic/ResetOffsetResultDialog.jsx b/frontend-new/src/components/topic/ResetOffsetResultDialog.jsx
new file mode 100644
index 0000000..4984773
--- /dev/null
+++ b/frontend-new/src/components/topic/ResetOffsetResultDialog.jsx
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {Button, Modal, Table} from "antd";
+import React from "react";
+
+const ResetOffsetResultDialog = ({ visible, onClose, result, t }) => {
+ return (
+
+ {t.CLOSE}
+ ,
+ ]}
+ >
+ {result && Object.entries(result).map(([groupName, groupData]) => (
+
+
+ {groupData.rollbackStatsList === null ? (
+
You Should Check It Yourself
+ ) : (
+
({ key: index, item }))}
+ columns={[{ dataIndex: 'item', key: 'item' }]}
+ pagination={false}
+ rowKey="key"
+ size="small"
+ bordered
+ showHeader={false}
+ />
+ )}
+
+ ))}
+
+ );
+};
+
+export default ResetOffsetResultDialog;
diff --git a/frontend-new/src/components/topic/RouterViewDialog.jsx b/frontend-new/src/components/topic/RouterViewDialog.jsx
new file mode 100644
index 0000000..aebb899
--- /dev/null
+++ b/frontend-new/src/components/topic/RouterViewDialog.jsx
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Button, Modal, Table } from "antd";
+import React from "react";
+
+const RouterViewDialog = ({ visible, onClose, topic, routeData, t }) => {
+ const brokerColumns = [
+ {
+ title: 'Broker',
+ dataIndex: 'brokerName',
+ key: 'brokerName',
+ },
+ {
+ title: 'Broker Addrs',
+ key: 'brokerAddrs',
+ render: (_, record) => (
+
+
+ );
+};
+
+export default RouterViewDialog;
diff --git a/frontend-new/src/components/topic/SendResultDialog.jsx b/frontend-new/src/components/topic/SendResultDialog.jsx
new file mode 100644
index 0000000..6dd3208
--- /dev/null
+++ b/frontend-new/src/components/topic/SendResultDialog.jsx
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {Button, Form, Modal, Table} from "antd";
+import React from "react";
+
+const SendResultDialog = ({ visible, onClose, result, t }) => {
+ return (
+
+ {t.CLOSE}
+ ,
+ ]}
+ >
+