diff --git a/public/app/api/clients/provisioning/v0alpha1/index.ts b/public/app/api/clients/provisioning/v0alpha1/index.ts index c92490184b1..eb200d83d01 100644 --- a/public/app/api/clients/provisioning/v0alpha1/index.ts +++ b/public/app/api/clients/provisioning/v0alpha1/index.ts @@ -3,6 +3,8 @@ import { isFetchError } from '@grafana/runtime'; import { notifyApp } from '../../../../core/actions'; import { createSuccessNotification, createErrorNotification } from '../../../../core/copy/appNotification'; +import { PAGE_SIZE } from '../../../../features/browse-dashboards/api/services'; +import { refetchChildren } from '../../../../features/browse-dashboards/state/actions'; import { createOnCacheEntryAdded } from '../utils/createOnCacheEntryAdded'; import { @@ -59,6 +61,12 @@ export const provisioningAPIv0alpha1 = generatedAPI.enhanceEndpoints({ ); } } + // Refetch dashboards and folders after deleting a provisioned repository. + // We need to add timeout to ensure that the deletion is processed before refetching since the deletion is done + // via a background job. + setTimeout(() => { + dispatch(refetchChildren({ parentUID: undefined, pageSize: PAGE_SIZE })); + }, 1000); }, }, deletecollectionRepository: { @@ -84,6 +92,9 @@ export const provisioningAPIv0alpha1 = generatedAPI.enhanceEndpoints({ ); } } + setTimeout(() => { + dispatch(refetchChildren({ parentUID: undefined, pageSize: PAGE_SIZE })); + }, 1000); }, }, createRepositoryTest: { @@ -189,6 +200,8 @@ export const provisioningAPIv0alpha1 = generatedAPI.enhanceEndpoints({ ); } } + // Refetch dashboards and folders after creating/updating a provisioned repository + dispatch(refetchChildren({ parentUID: undefined, pageSize: PAGE_SIZE })); }, }, }, diff --git a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx index 49b4a3c9f53..00dbd0943a3 100644 --- a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx +++ b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx @@ -73,7 +73,7 @@ export function ToolbarActions({ dashboard }: Props) { // Means we are not in settings view, fullscreen panel or edit panel const isShowingDashboard = !editview && !isViewingPanel && !isEditingPanel; const isEditingAndShowingDashboard = isEditing && isShowingDashboard; - const folderRepo = useSelector((state) => selectFolderRepository(state, meta.folderUid)); + const folderRepo = useSelector((state) => selectFolderRepository()(state, meta.folderUid)); const isManaged = Boolean(dashboard.isManagedRepository() || folderRepo); // Internal only; diff --git a/public/app/features/provisioning/Wizard/ProvisioningWizard.test.tsx b/public/app/features/provisioning/Wizard/ProvisioningWizard.test.tsx index 83fc75ddfb9..f9c293137d9 100644 --- a/public/app/features/provisioning/Wizard/ProvisioningWizard.test.tsx +++ b/public/app/features/provisioning/Wizard/ProvisioningWizard.test.tsx @@ -38,6 +38,10 @@ jest.mock('app/api/clients/provisioning/v0alpha1', () => ({ useCreateRepositoryJobsMutation: jest.fn(), })); +jest.mock('app/features/browse-dashboards/api/services', () => ({ + PAGE_SIZE: 20, +})); + const mockUseCreateOrUpdateRepository = useCreateOrUpdateRepository as jest.MockedFunction< typeof useCreateOrUpdateRepository >; diff --git a/public/app/features/provisioning/utils/selectors.ts b/public/app/features/provisioning/utils/selectors.ts index 1e88f0b9530..372d3567e2b 100644 --- a/public/app/features/provisioning/utils/selectors.ts +++ b/public/app/features/provisioning/utils/selectors.ts @@ -1,28 +1,21 @@ import { createSelector } from '@reduxjs/toolkit'; -import { RootState } from 'app/store/configureStore'; - import { Repository, provisioningAPIv0alpha1 as provisioningAPI } from '../../../api/clients/provisioning/v0alpha1'; const emptyRepos: Repository[] = []; -const baseSelector = provisioningAPI.endpoints.listRepository.select({}); +const getBaseSelector = () => provisioningAPI.endpoints.listRepository.select({}); -export const selectAllRepos = createSelector(baseSelector, (result) => result.data?.items || emptyRepos); +export const selectAllRepos = () => createSelector(getBaseSelector(), (result) => result.data?.items || emptyRepos); -export const selectFolderRepository = createSelector( - selectAllRepos, - (_, folderUid?: string) => folderUid, - (repositories: Repository[], folderUid) => { - if (!folderUid) { - return undefined; +export const selectFolderRepository = () => + createSelector( + selectAllRepos(), + (_, folderUid?: string) => folderUid, + (repositories: Repository[], folderUid) => { + if (!folderUid) { + return undefined; + } + return repositories.find((repo: Repository) => repo.metadata?.name === folderUid); } - return repositories.find((repo: Repository) => repo.metadata?.name === folderUid); - } -); - -export const selectRepoByName = createSelector( - selectAllRepos, - (state: RootState, id: string) => id, - (repositories: Repository[], name) => repositories.find((repo: Repository) => repo.metadata?.name === name) -); + );