+
+
+
+
+ }
+ >
+
+
+ option.topicName.indexOf(inputValue) > -1}
+ targetKeys={selectTopicList}
+ onChange={topicChange}
+ render={(item) => item.title}
+ titles={['待选Topic', '已选Topic']}
+ customHeader
+ showSelectedCount
+ locale={{ itemUnit: '', itemsUnit: '' }}
+ suffix={}
+ />
+
+
+ 选择目标集群
+
+
+
+ >
+ }
+ rules={[{ required: true, message: '请选择目标集群' }]}
+ >
+
+
+ {
+ if (!value || !value.length) {
+ return Promise.reject('请选择Topic复制范围');
+ } else if (value.indexOf('syncData') === -1) {
+ return Promise.reject('Topic复制范围必须选择[数据]');
+ } else {
+ return Promise.resolve();
+ }
+ },
+ },
+ ]}
+ initialValue={['syncData']}
+ >
+
+ {mirrorScopeOptions.map((option) => {
+ return option.disabled ? (
+
+
+ {option.label}
+
+
+ ) : (
+
+ {option.label}
+
+ );
+ })}
+
+
+
+
+
+ );
+};
diff --git a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/Replicator.tsx b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/Replicator.tsx
new file mode 100644
index 00000000..89e27479
--- /dev/null
+++ b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/Replicator.tsx
@@ -0,0 +1,173 @@
+import React, { useState, useEffect } from 'react';
+import { AppContainer, ProTable, Utils, Tag, Modal, Tooltip } from 'knowdesign';
+import Api from '@src/api';
+import { useParams } from 'react-router-dom';
+import { getDataUnit } from '@src/constants/chartConfig';
+import message from '@src/components/Message';
+import { ClustersPermissionMap } from '../CommonConfig';
+import { ControlStatusMap } from '../CommonRoute';
+const { request } = Utils;
+
+const getColmns = (arg: any) => {
+ const formattedBytes = (v: number) => {
+ const [unit, size] = getDataUnit['Memory'](v);
+ return `${(v / size).toFixed(2)}${unit}/s`;
+ };
+ const tagEle = (
+