From 3e79ccabe943083fd9f124f1378329efdfd9fb1d Mon Sep 17 00:00:00 2001 From: Alex Khomenko Date: Fri, 22 Aug 2025 13:20:03 +0300 Subject: [PATCH] Provisioning: Add option to keep resources when deleting repository (#109955) * Provisioning: Add option to keep deleted repository resources * Use existing repository * Update confirm modal * Update text --- .../Repository/DeleteRepositoryButton.tsx | 110 ++++++++++++++---- .../Repository/RepositoryActions.tsx | 2 +- .../Repository/RepositoryCard.tsx | 4 - public/locales/en-US/grafana.json | 10 +- 4 files changed, 96 insertions(+), 30 deletions(-) diff --git a/public/app/features/provisioning/Repository/DeleteRepositoryButton.tsx b/public/app/features/provisioning/Repository/DeleteRepositoryButton.tsx index a49803bf147..d5e81b22c16 100644 --- a/public/app/features/provisioning/Repository/DeleteRepositoryButton.tsx +++ b/public/app/features/provisioning/Repository/DeleteRepositoryButton.tsx @@ -1,50 +1,116 @@ import { useCallback, useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom-v5-compat'; -import { t } from '@grafana/i18n'; -import { ConfirmModal, IconButton } from '@grafana/ui'; -import { useDeleteRepositoryMutation } from 'app/api/clients/provisioning/v0alpha1'; +import { t, Trans } from '@grafana/i18n'; +import { Button, ConfirmModal, Dropdown, Icon, Menu, Stack } from '@grafana/ui'; +import { + Repository, + useDeleteRepositoryMutation, + useReplaceRepositoryMutation, +} from 'app/api/clients/provisioning/v0alpha1'; + +type DeleteAction = 'remove-resources' | 'keep-resources'; interface Props { name: string; + repository: Repository; redirectTo?: string; } -export function DeleteRepositoryButton({ name, redirectTo }: Props) { - const [deleteRepository, request] = useDeleteRepositoryMutation(); +export function DeleteRepositoryButton({ name, repository, redirectTo }: Props) { + const [deleteRepository, deleteRequest] = useDeleteRepositoryMutation(); + const [replaceRepository, replaceRequest] = useReplaceRepositoryMutation(); const [showModal, setShowModal] = useState(false); + const [selectedAction, setSelectedAction] = useState('remove-resources'); const navigate = useNavigate(); useEffect(() => { - if (request.isSuccess) { + if (deleteRequest.isSuccess) { setShowModal(false); if (redirectTo) { navigate(redirectTo); } } - }, [request.isSuccess, redirectTo, navigate]); + }, [deleteRequest.isSuccess, redirectTo, navigate]); - const onConfirm = useCallback(() => { + const onConfirm = useCallback(async () => { + if (selectedAction === 'keep-resources' && repository) { + const updatedRepository = { + ...repository, + metadata: { + ...repository.metadata, + finalizers: ['cleanup', 'release-orphan-resources'], + }, + }; + await replaceRepository({ name, repository: updatedRepository }); + } deleteRepository({ name }); - }, [deleteRepository, name]); + }, [deleteRepository, replaceRepository, name, selectedAction, repository]); + + const getConfirmationMessage = () => { + if (selectedAction === 'remove-resources') { + return t( + 'provisioning.delete-repository-button.confirm-delete-with-resources', + 'Are you sure you want to delete the repository configuration and all its resources?' + ); + } + return t( + 'provisioning.delete-repository-button.confirm-delete-keep-resources', + 'Are you sure you want to delete the repository configuration but keep its resources?' + ); + }; + + const getModalTitle = () => { + if (selectedAction === 'remove-resources') { + return t( + 'provisioning.delete-repository-button.title-delete-repository-and-resources', + 'Delete repository configuration and resources' + ); + } + return t( + 'provisioning.delete-repository-button.title-delete-repository-only', + 'Delete repository configuration only' + ); + }; + + const isLoading = deleteRequest.isLoading || replaceRequest.isLoading; return ( <> - { - setShowModal(true); - }} - /> + + { + setSelectedAction('remove-resources'); + setShowModal(true); + }} + /> + { + setSelectedAction('keep-resources'); + setShowModal(true); + }} + /> + + } + > + + setShowModal(false)} diff --git a/public/app/features/provisioning/Repository/RepositoryActions.tsx b/public/app/features/provisioning/Repository/RepositoryActions.tsx index 1eb7ffd0649..0f0edc5780c 100644 --- a/public/app/features/provisioning/Repository/RepositoryActions.tsx +++ b/public/app/features/provisioning/Repository/RepositoryActions.tsx @@ -37,7 +37,7 @@ export function RepositoryActions({ repository }: RepositoryActionsProps) { Settings - + ); } diff --git a/public/app/features/provisioning/Repository/RepositoryCard.tsx b/public/app/features/provisioning/Repository/RepositoryCard.tsx index 3336559458e..545777b9f4f 100644 --- a/public/app/features/provisioning/Repository/RepositoryCard.tsx +++ b/public/app/features/provisioning/Repository/RepositoryCard.tsx @@ -9,7 +9,6 @@ import { StatusBadge } from '../Shared/StatusBadge'; import { PROVISIONING_URL } from '../constants'; import { getIsReadOnlyWorkflows } from '../utils/repository'; -import { DeleteRepositoryButton } from './DeleteRepositoryButton'; import { SyncRepository } from './SyncRepository'; interface Props { @@ -109,9 +108,6 @@ export function RepositoryCard({ repository }: Props) { - - - ); } diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 2aeee5d542a..e628b21db30 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -11254,11 +11254,15 @@ }, "delete-repository-button": { "button-delete": "Delete", - "confirm-delete-repository": "Are you sure you want to delete the repository config?", + "confirm-delete-keep-resources": "Are you sure you want to delete the repository configuration but keep its resources?", + "confirm-delete-with-resources": "Are you sure you want to delete the repository configuration and all its resources?", + "delete": "Delete", + "delete-and-keep-resources": "Delete and keep resources", + "delete-and-remove-resources": "Delete and remove resources (default)", "error-repository-delete": "Failed to delete repository", "success-repository-deleted": "Repository settings queued for deletion", - "title-delete-repository": "Delete repository config", - "tooltip-delete-this-repository": "Delete this repository" + "title-delete-repository-and-resources": "Delete repository configuration and resources", + "title-delete-repository-only": "Delete repository configuration only" }, "edit-repository-page": { "back-to-repositories": "Back to repositories",