Skip to content

Commit 21c7126

Browse files
feat(Tenants): add onEditDB to uiFactory, add edit button (#2305)
1 parent cf05081 commit 21c7126

File tree

4 files changed

+80
-46
lines changed

4 files changed

+80
-46
lines changed

src/containers/Tenants/Tenants.tsx

Lines changed: 67 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22

3-
import {CirclePlus, TrashBin} from '@gravity-ui/icons';
3+
import {CirclePlus, Pencil, TrashBin} from '@gravity-ui/icons';
44
import type {Column} from '@gravity-ui/react-data-table';
55
import DataTable from '@gravity-ui/react-data-table';
66
import type {DropdownMenuItem} from '@gravity-ui/uikit';
@@ -18,6 +18,7 @@ import {TenantNameWrapper} from '../../components/TenantNameWrapper/TenantNameWr
1818
import {
1919
useCreateDatabaseFeatureAvailable,
2020
useDeleteDatabaseFeatureAvailable,
21+
useEditDatabaseFeatureAvailable,
2122
} from '../../store/reducers/capabilities/hooks';
2223
import {
2324
ProblemFilterValues,
@@ -70,6 +71,7 @@ export const Tenants = ({additionalTenantsProps}: TenantsProps) => {
7071

7172
const isCreateDBAvailable =
7273
useCreateDatabaseFeatureAvailable() && uiFactory.onCreateDB !== undefined;
74+
const isEditDBAvailable = useEditDatabaseFeatureAvailable() && uiFactory.onEditDB !== undefined;
7375
const isDeleteDBAvailable =
7476
useDeleteDatabaseFeatureAvailable() && uiFactory.onDeleteDB !== undefined;
7577

@@ -238,51 +240,14 @@ export const Tenants = ({additionalTenantsProps}: TenantsProps) => {
238240
},
239241
];
240242

241-
if (isDeleteDBAvailable) {
242-
columns.push({
243-
name: 'actions',
244-
header: '',
245-
width: 40,
246-
resizeable: false,
247-
align: DataTable.CENTER,
248-
render: ({row}) => {
249-
const databaseId = row.UserAttributes?.database_id;
250-
const databaseName = row.Name;
251-
252-
let menuItems: (DropdownMenuItem | DropdownMenuItem[])[] = [];
253-
254-
if (clusterName && databaseName && databaseId) {
255-
menuItems = [
256-
{
257-
text: i18n('remove'),
258-
iconStart: <TrashBin />,
259-
action: () => {
260-
uiFactory.onDeleteDB?.({
261-
clusterName,
262-
databaseId,
263-
databaseName,
264-
});
265-
},
266-
className: b('remove-db'),
267-
},
268-
];
269-
}
270-
271-
if (!menuItems.length) {
272-
return null;
273-
}
274-
return (
275-
<DropdownMenu
276-
defaultSwitcherProps={{
277-
view: 'flat',
278-
size: 's',
279-
pin: 'brick-brick',
280-
}}
281-
items={menuItems}
282-
/>
283-
);
284-
},
243+
if (clusterName && (isDeleteDBAvailable || isEditDBAvailable)) {
244+
const actionsColumn = getDBActionsColumn({
245+
clusterName,
246+
isDeleteDBAvailable,
247+
isEditDBAvailable,
285248
});
249+
250+
columns.push(actionsColumn);
286251
}
287252

288253
if (filteredTenants.length === 0 && problemFilter !== ProblemFilterValues.ALL) {
@@ -314,3 +279,60 @@ export const Tenants = ({additionalTenantsProps}: TenantsProps) => {
314279
</div>
315280
);
316281
};
282+
283+
function getDBActionsColumn({
284+
clusterName,
285+
isEditDBAvailable,
286+
isDeleteDBAvailable,
287+
}: {
288+
clusterName: string;
289+
isEditDBAvailable?: boolean;
290+
isDeleteDBAvailable?: boolean;
291+
}) {
292+
return {
293+
name: 'actions',
294+
header: '',
295+
width: 40,
296+
resizeable: false,
297+
align: DataTable.CENTER,
298+
render: ({row}) => {
299+
const menuItems: (DropdownMenuItem | DropdownMenuItem[])[] = [];
300+
301+
const databaseId = row.UserAttributes?.database_id;
302+
const databaseName = row.Name;
303+
304+
if (clusterName && isEditDBAvailable) {
305+
menuItems.push({
306+
text: i18n('edit'),
307+
iconStart: <Pencil />,
308+
action: () => {
309+
uiFactory.onEditDB?.({
310+
clusterName,
311+
databaseData: row,
312+
});
313+
},
314+
});
315+
}
316+
if (clusterName && isDeleteDBAvailable && databaseName && databaseId) {
317+
menuItems.push({
318+
text: i18n('remove'),
319+
iconStart: <TrashBin />,
320+
action: () => {
321+
uiFactory.onDeleteDB?.({
322+
clusterName,
323+
databaseId,
324+
databaseName,
325+
});
326+
},
327+
className: b('remove-db'),
328+
});
329+
}
330+
331+
if (!menuItems.length) {
332+
return null;
333+
}
334+
335+
return <DropdownMenu items={menuItems} />;
336+
},
337+
} satisfies Column<PreparedTenant>;
338+
}

src/containers/Tenants/i18n/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"create-database": "Create database",
3-
"remove": "Remove"
3+
"remove": "Remove",
4+
"edit": "Edit"
45
}

src/store/reducers/capabilities/hooks.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ export const useCreateDatabaseFeatureAvailable = () => {
116116
return useGetMetaFeatureVersion('/meta/create_database') >= 1;
117117
};
118118

119+
export const useEditDatabaseFeatureAvailable = () => {
120+
return useGetMetaFeatureVersion('/meta/update_database') >= 1;
121+
};
122+
119123
export const useDeleteDatabaseFeatureAvailable = () => {
120124
return useGetMetaFeatureVersion('/meta/delete_database') >= 1;
121125
};

src/uiFactory/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import type {PreparedTenant} from '../store/reducers/tenants/types';
12
import type {GetLogsLink} from '../utils/logs';
23
import type {GetMonitoringClusterLink, GetMonitoringLink} from '../utils/monitoring';
34

45
export interface UIFactory {
56
onCreateDB?: HandleCreateDB;
7+
onEditDB?: HandleEditDB;
68
onDeleteDB?: HandleDeleteDB;
79

810
getLogsLink?: GetLogsLink;
@@ -12,6 +14,11 @@ export interface UIFactory {
1214

1315
export type HandleCreateDB = (params: {clusterName: string}) => Promise<boolean>;
1416

17+
export type HandleEditDB = (params: {
18+
clusterName: string;
19+
databaseData: PreparedTenant;
20+
}) => Promise<boolean>;
21+
1522
export type HandleDeleteDB = (params: {
1623
clusterName: string;
1724
databaseName: string;

0 commit comments

Comments
 (0)