From a5517d72ee0be7af7b45b52f82d269729367f366 Mon Sep 17 00:00:00 2001 From: Alex Khomenko Date: Fri, 19 Sep 2025 16:27:17 +0300 Subject: [PATCH] Provisioning: Disable pull button when job is in progress (#111382) --- .../provisioning/Repository/SyncRepository.tsx | 5 +++-- .../app/features/provisioning/useGetActiveJob.ts | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 public/app/features/provisioning/useGetActiveJob.ts diff --git a/public/app/features/provisioning/Repository/SyncRepository.tsx b/public/app/features/provisioning/Repository/SyncRepository.tsx index 7f4d21d4ee9..bbf4ff01fb4 100644 --- a/public/app/features/provisioning/Repository/SyncRepository.tsx +++ b/public/app/features/provisioning/Repository/SyncRepository.tsx @@ -6,6 +6,7 @@ import { Button, ConfirmModal } from '@grafana/ui'; import { Repository, useCreateRepositoryJobsMutation } from 'app/api/clients/provisioning/v0alpha1'; import { PROVISIONING_URL } from '../constants'; +import { useGetActiveJob } from '../useGetActiveJob'; interface Props { repository: Repository; @@ -15,8 +16,8 @@ export function SyncRepository({ repository }: Props) { const [createJob, jobQuery] = useCreateRepositoryJobsMutation(); const [isModalOpen, setIsModalOpen] = useState(false); const navigate = useNavigate(); - const name = repository.metadata?.name; + const activeJob = useGetActiveJob(name); const onClick = () => { if (!name) { @@ -45,7 +46,7 @@ export function SyncRepository({ repository }: Props) { ? undefined : t('provisioning.sync-repository.tooltip-unhealthy-repository', 'Unable to pull an unhealthy repository') } - disabled={jobQuery.isLoading || !name || !isHealthy} + disabled={jobQuery.isLoading || activeJob?.status?.state === 'working' || !name || !isHealthy} onClick={onClick} > Pull diff --git a/public/app/features/provisioning/useGetActiveJob.ts b/public/app/features/provisioning/useGetActiveJob.ts new file mode 100644 index 00000000000..64e26a4f500 --- /dev/null +++ b/public/app/features/provisioning/useGetActiveJob.ts @@ -0,0 +1,15 @@ +import { skipToken } from '@reduxjs/toolkit/query/react'; + +import { useListJobQuery } from '../../api/clients/provisioning/v0alpha1'; + +export function useGetActiveJob(name?: string) { + const activeQuery = useListJobQuery( + name + ? { + fieldSelector: `metadata.name=${name}`, + watch: true, + } + : skipToken + ); + return activeQuery?.data?.items?.[0]; +}