diff --git a/packages/manager/.changeset/pr-13043-added-1761922908861.md b/packages/manager/.changeset/pr-13043-added-1761922908861.md new file mode 100644 index 00000000000..faac2e7fd6c --- /dev/null +++ b/packages/manager/.changeset/pr-13043-added-1761922908861.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Added +--- + +IAM: add a permission check for delete nodebalancer drawer ([#13043](https://github.com/linode/manager/pull/13043)) diff --git a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx index fbd4a2875e6..710fa0e4116 100644 --- a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx +++ b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx @@ -22,6 +22,15 @@ const queryMocks = vi.hoisted(() => ({ useMatch: vi.fn(() => ({})), useNavigate: vi.fn(() => navigate), usePreferences: vi.fn().mockReturnValue({}), + userPermissions: vi.fn(() => ({ + data: { + delete_nodebalancer: true, + }, + })), +})); + +vi.mock('src/features/IAM/hooks/usePermissions', () => ({ + usePermissions: queryMocks.userPermissions, })); vi.mock('@linode/queries', async () => { @@ -77,4 +86,26 @@ describe('NodeBalancerDeleteDialog', () => { await userEvent.click(getByText('Cancel')); expect(navigate).toHaveBeenCalled(); }); + + it('enables inputs and buttons if there is a delete_nodebalancer permissions', () => { + const { getByTestId } = renderWithTheme( + + ); + + expect(getByTestId('textfield-input')).toBeEnabled(); + }); + + it('disables inputs and buttons if no delete_nodebalancer permission', () => { + queryMocks.userPermissions.mockReturnValue({ + data: { + delete_nodebalancer: false, + }, + }); + const { getByTestId } = renderWithTheme( + + ); + + expect(getByTestId('confirm')).toBeDisabled(); + expect(getByTestId('textfield-input')).toBeDisabled(); + }); }); diff --git a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx index f2b81b3076a..f95623429ab 100644 --- a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx +++ b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx @@ -5,6 +5,9 @@ import * as React from 'react'; import { TypeToConfirmDialog } from 'src/components/TypeToConfirmDialog/TypeToConfirmDialog'; +import { getRestrictedResourceText } from '../Account/utils'; +import { usePermissions } from '../IAM/hooks/usePermissions'; + import type { APIError, NodeBalancer } from '@linode/api-v4'; interface Props { @@ -28,6 +31,12 @@ export const NodeBalancerDeleteDialog = ({ selectedNodeBalancer?.id ?? -1 ); + const { data: permissions } = usePermissions( + 'nodebalancer', + ['delete_nodebalancer'], + selectedNodeBalancer?.id, + open + ); const label = selectedNodeBalancer?.label; const onDelete = async () => { @@ -37,6 +46,8 @@ export const NodeBalancerDeleteDialog = ({ return ( + {!permissions.delete_nodebalancer && ( + + )} Deleting this NodeBalancer is permanent and can’t be undone.