diff --git a/km-console/packages/config-manager-fe/src/pages/UserManage/RoleTabContent.tsx b/km-console/packages/config-manager-fe/src/pages/UserManage/RoleTabContent.tsx index eb0b82e9a..d50c77cfd 100644 --- a/km-console/packages/config-manager-fe/src/pages/UserManage/RoleTabContent.tsx +++ b/km-console/packages/config-manager-fe/src/pages/UserManage/RoleTabContent.tsx @@ -96,7 +96,7 @@ const RoleDetailAndUpdate = forwardRef((props, ref): JSX.Element => { arr.push(permissions[i].id); } }); - formData.permissionIdList = formData.permissionIdList.flat(); + formData.permissionIdList = formData.permissionIdList.flat().filter((item) => item !== undefined); setConfirmLoading(true); request(api.editRole, { method: type === RoleOperate.Add ? 'POST' : 'PUT', @@ -250,7 +250,7 @@ const RoleDetailAndUpdate = forwardRef((props, ref): JSX.Element => { (0); + const forceRefresh: () => void = useCallback(() => { + setRefresh((x) => x + 1); + }, []); + + return [refreshKey, forceRefresh]; +} diff --git a/km-console/packages/layout-clusters-fe/src/pages/Connect/AddConnector.tsx b/km-console/packages/layout-clusters-fe/src/pages/Connect/AddConnector.tsx index 8724a0291..ef6a55bdf 100644 --- a/km-console/packages/layout-clusters-fe/src/pages/Connect/AddConnector.tsx +++ b/km-console/packages/layout-clusters-fe/src/pages/Connect/AddConnector.tsx @@ -816,6 +816,8 @@ const StepFormFifth = (props: SubFormProps) => { ) : type.toUpperCase() === 'BOOLEAN' ? ( + ) : type.toUpperCase() === 'PASSWORD' ? ( + ) : ( )} diff --git a/km-console/packages/layout-clusters-fe/src/pages/ConsumerGroup/Detail.tsx b/km-console/packages/layout-clusters-fe/src/pages/ConsumerGroup/Detail.tsx index 34001fa03..f01bee14d 100644 --- a/km-console/packages/layout-clusters-fe/src/pages/ConsumerGroup/Detail.tsx +++ b/km-console/packages/layout-clusters-fe/src/pages/ConsumerGroup/Detail.tsx @@ -1,12 +1,13 @@ import React, { useState, useEffect } from 'react'; import { useParams, useHistory } from 'react-router-dom'; -import { Drawer, ProTable, Utils } from 'knowdesign'; +import { Button, Space, Divider, Drawer, ProTable, Utils } from 'knowdesign'; import { IconFont } from '@knowdesign/icons'; import API from '@src/api/index'; import { defaultPagination, hashDataParse } from '@src/constants/common'; import { getGtoupTopicColumns } from './config'; import { ExpandedRow } from './ExpandedRow'; import ResetOffsetDrawer from './ResetOffsetDrawer'; +import { useForceRefresh } from '@src/components/utils'; const { request } = Utils; export interface MetricLine { @@ -63,6 +64,7 @@ const GroupDetail = (props: any) => { const [openKeys, setOpenKeys] = useState(); const [resetOffsetVisible, setResetOffsetVisible] = useState(false); const [resetOffsetArg, setResetOffsetArg] = useState({}); + const [refreshKey, forceRefresh] = useForceRefresh(); const genData = async ({ pageNo, pageSize, groupName }: any) => { if (urlParams?.clusterId === undefined) return; @@ -160,7 +162,7 @@ const GroupDetail = (props: any) => { // // 获取Consumer列表 表格模式 // getTopicGroupMetric(hashData); // }); - }, [hashDataParse(location.hash).groupName]); + }, [hashDataParse(location.hash).groupName, refreshKey]); return ( { // // // } + extra={ + + void}> + + + + + } > { if (configType === 'custom') { // 1. 自定义权限 + // TODO: 需要和后端联调 const { resourceType, resourcePatternType, aclPermissionType, aclOperation, aclClientHost } = formData; submitData.push({ clusterId, @@ -281,6 +282,42 @@ const AddDrawer = forwardRef((_, ref) => { {({ getFieldValue }) => { + const SelectFormItems = (props: { type: string }) => { + const { type } = props; + return ( + ({ + validator: (rule: any, value: string) => { + if (!value) { + return Promise.reject(`${type}Name 不能为空`); + } + if (type === 'topic' && getFieldValue(`${type}PatternType`) === ACL_PATTERN_TYPE['Literal']) { + return Utils.request(api.getTopicMetadata(clusterId as any, value)).then((res: any) => { + return res?.exist ? Promise.resolve() : Promise.reject('该 Topic 不存在'); + }); + } + return Promise.resolve(); + }, + }), + ]} + > + { + if (option?.value.includes(value)) { + return true; + } + return false; + }} + options={type === 'topic' ? topicMetaData : groupMetaData} + placeholder={`请输入 ${type}Name`} + /> + + ); + }; const PatternTypeFormItems = (props: { type: string }) => { const { type } = props; const UpperCaseType = type[0].toUpperCase() + type.slice(1); @@ -388,6 +425,27 @@ const AddDrawer = forwardRef((_, ref) => { }))} /> + + {({ getFieldValue }) => { + const type = getFieldValue('resourceType'); + if (type === ACL_RESOURCE_TYPE['Cluster'] || type === ACL_RESOURCE_TYPE['TransactionalId']) { + //TODO需要和后端获取集群和事务接口联调 + return ( + + + + ); + } else if (type === ACL_RESOURCE_TYPE['Topic']) { + return ; + } else if (type === ACL_RESOURCE_TYPE['Group']) { + return ; + } + return null; + }} + {({ getFieldValue }) => { form.resetFields(['aclOperation']); diff --git a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/BrokersDetail.tsx b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/BrokersDetail.tsx index 9b3a12a09..f2bb1713b 100644 --- a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/BrokersDetail.tsx +++ b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/BrokersDetail.tsx @@ -8,6 +8,7 @@ import { useParams } from 'react-router-dom'; import TagsWithHide from '@src/components/TagsWithHide'; import SwitchTab from '@src/components/SwitchTab'; import RenderEmpty from '@src/components/RenderEmpty'; +import { useForceRefresh } from '@src/components/utils'; interface PropsType { hashData: any; @@ -401,11 +402,18 @@ export default (props: PropsType) => { const { hashData } = props; const [showMode, setShowMode] = useState('card'); + const [refreshKey, forceRefresh] = useForceRefresh(); return ( <> -
+
+ void} + > + +
diff --git a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/config.tsx b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/config.tsx index aa1e25d3e..a6cdbc251 100644 --- a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/config.tsx +++ b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/config.tsx @@ -81,7 +81,8 @@ export const getTopicMessagesColmns = () => { title: 'Offset', dataIndex: 'offset', key: 'offset', - render: (t: number) => (t ? t.toLocaleString() : '-'), + sorter: true, + render: (t: number) => (+t ? t.toLocaleString() : '-'), }, { title: 'Timestamp', diff --git a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.less b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.less index f13249ab0..ea8470f81 100644 --- a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.less +++ b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.less @@ -26,6 +26,7 @@ .left { display: flex; + align-items: center; .info-box { display: flex; height: 36px; diff --git a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.tsx b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.tsx index ea009bd44..169f81769 100644 --- a/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.tsx +++ b/km-console/packages/layout-clusters-fe/src/pages/TopicDetail/index.tsx @@ -15,9 +15,21 @@ import Replicator from './Replicator'; import './index.less'; import TopicDetailHealthCheck from '@src/components/CardBar/TopicDetailHealthCheck'; import { hashDataParse } from '@src/constants/common'; +import { useForceRefresh } from '@src/components/utils'; const { TabPane } = Tabs; +const Reload = (props: any) => { + return ( + void} + > + + + ); +}; + const OperationsSlot: any = { // eslint-disable-next-line react/display-name // ['Partitions']: (arg: any) => { @@ -70,17 +82,20 @@ const OperationsSlot: any = { // eslint-disable-next-line react/display-name ['ConsumerGroups']: (arg: any) => { return ( - + <> + + + ); }, }; @@ -94,6 +109,7 @@ const TopicDetail = (props: any) => { const [searchValue, setSearchValue] = useState(''); const [visible, setVisible] = useState(false); const [hashData, setHashData] = useState({}); + const [refreshKey, forceRefresh] = useForceRefresh(); const callback = (key: any) => { setSearchValue(''); @@ -184,7 +200,7 @@ const TopicDetail = (props: any) => { onChange={callback} tabBarExtraContent={ OperationsSlot[positionType] && - OperationsSlot[positionType]({ ...props, setSearchKeywords, setSearchValue, searchValue, positionType }) + OperationsSlot[positionType]({ ...props, setSearchKeywords, setSearchValue, searchValue, positionType, forceRefresh }) } destroyInactiveTabPane > @@ -196,7 +212,7 @@ const TopicDetail = (props: any) => { {positionType === 'ConsumerGroups' && ( - + )}