From 6305d6daeda5e006190bc7edfee8af81cdd51353 Mon Sep 17 00:00:00 2001 From: Yunwen Zheng Date: Thu, 14 Aug 2025 14:27:06 -0400 Subject: [PATCH] Provision Bulk Action: Add pull request button (#109622) * Provision Bulk Action: pull request link * Add view branch and compare branch button --- .../clients/provisioning/v0alpha1/index.ts | 13 +++++--- .../features/provisioning/Job/JobContent.tsx | 10 +++++- .../Repository/PullRequestButtons.tsx | 31 +++++++++++++++++++ public/locales/en-US/grafana.json | 3 ++ 4 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 public/app/features/provisioning/Repository/PullRequestButtons.tsx diff --git a/public/app/api/clients/provisioning/v0alpha1/index.ts b/public/app/api/clients/provisioning/v0alpha1/index.ts index eb200d83d01..d99727c062c 100644 --- a/public/app/api/clients/provisioning/v0alpha1/index.ts +++ b/public/app/api/clients/provisioning/v0alpha1/index.ts @@ -132,12 +132,17 @@ export const provisioningAPIv0alpha1 = generatedAPI.enhanceEndpoints({ }, }, createRepositoryJobs: { - onQueryStarted: async (_, { queryFulfilled, dispatch }) => { + onQueryStarted: async ({ jobSpec }, { queryFulfilled, dispatch }) => { try { + const showMsg = jobSpec.action === 'pull' || jobSpec.action === 'migrate'; await queryFulfilled; - dispatch( - notifyApp(createSuccessNotification(t('provisioning.sync-repository.success-pull-started', 'Pull started'))) - ); + if (showMsg) { + dispatch( + notifyApp( + createSuccessNotification(t('provisioning.sync-repository.success-pull-started', 'Pull started')) + ) + ); + } } catch (e) { if (e instanceof Error) { dispatch( diff --git a/public/app/features/provisioning/Job/JobContent.tsx b/public/app/features/provisioning/Job/JobContent.tsx index 0e469937b88..9b58c2f8143 100644 --- a/public/app/features/provisioning/Job/JobContent.tsx +++ b/public/app/features/provisioning/Job/JobContent.tsx @@ -4,6 +4,7 @@ import { Trans, t } from '@grafana/i18n'; import { ControlledCollapse, Spinner, Stack, Text } from '@grafana/ui'; import { Job } from 'app/api/clients/provisioning/v0alpha1'; +import { PullRequestButtons } from '../Repository/PullRequestButtons'; import { RepositoryLink } from '../Repository/RepositoryLink'; import ProgressBar from '../Shared/ProgressBar'; import { StepStatusInfo } from '../Wizard/types'; @@ -26,6 +27,7 @@ export function JobContent({ jobType, job, isFinishedJob = false, onStatusChange const { state, message, progress, summary, errors } = job.status; const repoName = job.metadata?.labels?.['provisioning.grafana.app/repository']; + const pullRequestURL = job.status?.url?.newPullRequestURL; // Update step status based on job state useEffect(() => { @@ -95,7 +97,13 @@ export function JobContent({ jobType, job, isFinishedJob = false, onStatusChange )} {state === 'success' ? ( - + + {pullRequestURL ? ( + + ) : ( + + )} + ) : (
{JSON.stringify(job, null, 2)}
diff --git a/public/app/features/provisioning/Repository/PullRequestButtons.tsx b/public/app/features/provisioning/Repository/PullRequestButtons.tsx new file mode 100644 index 00000000000..c7c3101161e --- /dev/null +++ b/public/app/features/provisioning/Repository/PullRequestButtons.tsx @@ -0,0 +1,31 @@ +import { Trans } from '@grafana/i18n'; +import { LinkButton } from '@grafana/ui'; +import { RepositoryUrLs } from 'app/api/clients/provisioning/v0alpha1'; + +interface Props { + jobType?: 'sync' | 'delete' | 'move'; + urls?: RepositoryUrLs; +} +export function PullRequestButtons({ urls, jobType }: Props) { + const pullRequestURL = urls?.newPullRequestURL; + const compareURL = urls?.compareURL; + const branchURL = urls?.sourceURL; + + if (jobType === 'sync') { + return null; + } + + return ( + <> + + View branch + + + Compare branch + + + Open pull request + + + ); +} diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 4a294622625..2cf0531c0d8 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -11470,6 +11470,9 @@ }, "repository-link": { "delete-or-move-job": { + "compare-branch": "Compare branch", + "open-pull-request": "Open pull request", + "view-branch": "View branch", "view-repository": "View repository" }, "grafana-repository-synced": "Your resources are now in your external storage and provisioned into your instance. From now on, your instance and the external storage will be synchronized.",