Skip to content

Commit 5089147

Browse files
fix: [M3-9566, 7066] - Disable action menu buttons for Database with tooltip text and enable Delete Cluster for read/write grant user (linode#11890)
* fix: [M3-9566] - Disable action menu for Database with tootip text * Added changeset: Disable action menu for `Database` with tooltip text * enable delete cluster button with read/write access user * disable suspend button * Update changeset description
1 parent d9ced52 commit 5089147

File tree

4 files changed

+43
-8
lines changed

4 files changed

+43
-8
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/manager": Fixed
3+
---
4+
5+
Disable action menu for `Database` with tooltip text and enable `Delete Cluster` for `read/write` grant users ([#11890](https://github.com/linode/manager/pull/11890))

packages/manager/src/features/Account/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ export type ActionType =
1818
| 'rebuild'
1919
| 'rescue'
2020
| 'resize'
21+
| 'resume'
22+
| 'suspend'
2123
| 'view';
2224

2325
interface GetRestrictedResourceText {

packages/manager/src/features/Databases/DatabaseDetail/DatabaseSettings/DatabaseSettings.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useProfile } from '@linode/queries';
12
import { Divider, Paper, Stack, Typography } from '@linode/ui';
23
import * as React from 'react';
34

@@ -16,7 +17,6 @@ import {
1617
isDefaultDatabase,
1718
useIsDatabasesEnabled,
1819
} from 'src/features/Databases/utilities';
19-
import { useProfile } from '@linode/queries';
2020

2121
import AccessControls from '../AccessControls';
2222
import DatabaseSettingsDeleteClusterDialog from './DatabaseSettingsDeleteClusterDialog';
@@ -148,7 +148,7 @@ export const DatabaseSettings: React.FC<Props> = (props) => {
148148
<DatabaseSettingsMenuItem
149149
buttonText="Delete Cluster"
150150
descriptiveText={deleteClusterCopy}
151-
disabled={Boolean(profile?.restricted)}
151+
disabled={disabled}
152152
onClick={onDeleteCluster}
153153
sectionTitle="Delete the Cluster"
154154
/>

packages/manager/src/features/Databases/DatabaseLanding/DatabaseActionMenu.tsx

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import * as React from 'react';
33
import { useHistory } from 'react-router-dom';
44

55
import { ActionMenu } from 'src/components/ActionMenu/ActionMenu';
6+
import { getRestrictedResourceText } from 'src/features/Account/utils';
7+
import { useIsResourceRestricted } from 'src/hooks/useIsResourceRestricted';
68
import { useResumeDatabaseMutation } from 'src/queries/databases/databases';
79
import { getAPIErrorOrDefault } from 'src/utilities/errorUtils';
810

911
import { useIsDatabasesEnabled } from '../utilities';
1012

1113
import type { DatabaseStatus, Engine } from '@linode/api-v4';
1214
import type { Action } from 'src/components/ActionMenu/ActionMenu';
15+
import type { ActionType } from 'src/features/Account/utils';
1316

1417
interface Props {
1518
databaseEngine: Engine;
@@ -63,48 +66,73 @@ export const DatabaseActionMenu = (props: Props) => {
6366
}
6467
};
6568

69+
const isDatabaseReadOnly = useIsResourceRestricted({
70+
grantLevel: 'read_only',
71+
grantType: 'database',
72+
id: databaseId,
73+
});
74+
75+
const getTooltipText = (action: ActionType) => {
76+
return isDatabaseReadOnly
77+
? getRestrictedResourceText({
78+
action,
79+
isSingular: true,
80+
resourceType: 'Databases',
81+
})
82+
: undefined;
83+
};
84+
6685
const actions: Action[] = [
6786
{
68-
disabled: isDatabaseNotRunning || isDatabaseSuspended,
87+
disabled:
88+
isDatabaseNotRunning || isDatabaseSuspended || isDatabaseReadOnly,
6989
onClick: handlers.handleManageAccessControls,
7090
title: 'Manage Access Controls',
91+
tooltip: getTooltipText('edit'),
7192
},
7293
{
73-
disabled: isDatabaseNotRunning || isDatabaseSuspended,
94+
disabled:
95+
isDatabaseNotRunning || isDatabaseSuspended || isDatabaseReadOnly,
7496
onClick: handlers.handleResetPassword,
7597
title: 'Reset Root Password',
98+
tooltip: getTooltipText('edit'),
7699
},
77100
{
78-
disabled: isDatabaseNotRunning || isDatabaseSuspended,
101+
disabled:
102+
isDatabaseNotRunning || isDatabaseSuspended || isDatabaseReadOnly,
79103
onClick: () => {
80104
history.push({
81105
pathname: `/databases/${databaseEngine}/${databaseId}/resize`,
82106
});
83107
},
84108
title: 'Resize',
109+
tooltip: getTooltipText('resize'),
85110
},
86111
{
87-
disabled: isDatabaseNotRunning,
112+
disabled: isDatabaseNotRunning || isDatabaseReadOnly,
88113
onClick: handlers.handleDelete,
89114
title: 'Delete',
115+
tooltip: getTooltipText('delete'),
90116
},
91117
];
92118

93119
if (isDatabasesV2GA) {
94120
actions.unshift({
95-
disabled: databaseStatus !== 'active',
121+
disabled: databaseStatus !== 'active' || isDatabaseReadOnly,
96122
onClick: () => {
97123
handlers.handleSuspend();
98124
},
99125
title: 'Suspend',
126+
tooltip: getTooltipText('suspend'),
100127
});
101128

102129
actions.splice(4, 0, {
103-
disabled: !isDatabaseSuspended,
130+
disabled: !isDatabaseSuspended || isDatabaseReadOnly,
104131
onClick: () => {
105132
handleResume();
106133
},
107134
title: 'Resume',
135+
tooltip: getTooltipText('resume'),
108136
});
109137
}
110138

0 commit comments

Comments
 (0)