From 7f43101ac0bb5d2cde882dc9dea471e56e083874 Mon Sep 17 00:00:00 2001 From: LZS911 <932177767@qq.com> Date: Mon, 24 Feb 2025 17:12:29 +0800 Subject: [PATCH] [feature](RuleTemplate): add permission check for global rule template --- .../RuleTemplateList/index.test.tsx | 17 ++++++ .../RuleTemplate/RuleTemplateList/index.tsx | 56 ++++++++++++++----- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.test.tsx b/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.test.tsx index 9645f78f4..d678ced4f 100644 --- a/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.test.tsx +++ b/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.test.tsx @@ -18,6 +18,7 @@ import { ModalName } from '../../../data/ModalName'; import { useDispatch, useSelector } from 'react-redux'; import { SystemRole } from '@actiontech/shared/lib/enum'; import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi'; +import { mockUsePermission } from '@actiontech/shared/lib/testUtil/mockHook/mockUsePermission'; jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), @@ -182,4 +183,20 @@ describe('sqle/RuleTemplate/List', () => { expect(screen.getByText('克隆规则模板')).toBeInTheDocument(); expect(screen.getByText('导出规则模板')).toBeInTheDocument(); }); + + it('should not render public rule template list when user in not admin', async () => { + mockUseCurrentUser({ + ...mockCurrentUserReturn, + userRoles: { + ...mockCurrentUserReturn.userRoles, + [SystemRole.admin]: false, + [SystemRole.globalManager]: false, + [SystemRole.globalViewing]: false + } + }); + customRender(); + + await act(async () => jest.advanceTimersByTime(3000)); + expect(screen.queryByText('公共规则模板')).not.toBeInTheDocument(); + }); }); diff --git a/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.tsx b/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.tsx index ce32f3d98..c149967a4 100644 --- a/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.tsx +++ b/packages/sqle/src/page/RuleTemplate/RuleTemplateList/index.tsx @@ -1,9 +1,19 @@ import { useTranslation } from 'react-i18next'; import { Space } from 'antd'; -import { PageHeader, EmptyBox, SegmentedTabs } from '@actiontech/shared'; +import { + PageHeader, + EmptyBox, + SegmentedTabs, + SegmentedTabsProps +} from '@actiontech/shared'; import { TableRefreshButton } from '@actiontech/shared/lib/components/ActiontechTable'; -import { useState } from 'react'; -import { useCurrentProject } from '@actiontech/shared/lib/features'; +import { useMemo, useState } from 'react'; +import { + PERMISSIONS, + PermissionsConstantType, + useCurrentProject, + usePermission +} from '@actiontech/shared/lib/features'; import { EnumTemplateType } from './index.type'; import ProjectTable from './ProjectTable'; import EventEmitter from '../../../utils/EventEmitter'; @@ -26,6 +36,33 @@ const RuleTemplateList = () => { const [activeKey, setActiveKey] = useState(EnumTemplateType.project); + const { checkPagePermission } = usePermission(); + + const tabItems = useMemo(() => { + const items: Array< + SegmentedTabsProps['items'][0] & { permission?: PermissionsConstantType } + > = [ + { + label: t('ruleTemplate.ruleTemplateTitle.project'), + value: EnumTemplateType.project, + children: + }, + { + label: t('ruleTemplate.ruleTemplateTitle.common'), + value: EnumTemplateType.common, + children: , + permission: PERMISSIONS.PAGES.SQLE.RULE_MANAGEMENT + } + ]; + + return items.filter((item) => { + if (item.permission === undefined) { + return true; + } + return checkPagePermission(item.permission); + }); + }, [checkPagePermission, t]); + return ( <> { - }, - { - label: t('ruleTemplate.ruleTemplateTitle.common'), - value: EnumTemplateType.common, - children: - } - ]} + items={tabItems} />