diff --git a/public/app/features/provisioning/ConfigForm.tsx b/public/app/features/provisioning/ConfigForm.tsx index a4bd4fc085d..065d6e036d9 100644 --- a/public/app/features/provisioning/ConfigForm.tsx +++ b/public/app/features/provisioning/ConfigForm.tsx @@ -14,6 +14,7 @@ import { TextLink, ControlledCollapse, FieldSet, + Stack, } from '@grafana/ui'; import { FormPrompt } from 'app/core/components/FormPrompt/FormPrompt'; import { FolderPicker } from 'app/core/components/Select/FolderPicker'; @@ -65,7 +66,7 @@ export function ConfigForm({ data }: ConfigFormProps) { } = useForm({ defaultValues: getDefaultValues(data?.spec) }); const [tokenConfigured, setTokenConfigured] = useState(Boolean(data?.metadata?.name)); const navigate = useNavigate(); - const watchType = watch('type'); + const type = watch('type'); useEffect(() => { if (request.isSuccess) { @@ -115,7 +116,7 @@ export function ConfigForm({ data }: ConfigFormProps) { > - {watchType === 'github' && ( + {type === 'github' && ( <>

@@ -173,13 +174,13 @@ export function ConfigForm({ data }: ConfigFormProps) { )} - {watchType === 'local' && ( + {type === 'local' && ( )} - {watchType === 's3' && ( + {type === 's3' && ( <> @@ -209,7 +210,9 @@ export function ConfigForm({ data }: ConfigFormProps) { - + + + ); } diff --git a/public/app/features/provisioning/ImportFromRepository.tsx b/public/app/features/provisioning/ImportFromRepository.tsx new file mode 100644 index 00000000000..03559ae1c5b --- /dev/null +++ b/public/app/features/provisioning/ImportFromRepository.tsx @@ -0,0 +1,72 @@ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom-v5-compat'; +import { useAsync } from 'react-use'; + +import { AppEvents } from '@grafana/data'; +import { config, getAppEvents, getBackendSrv } from '@grafana/runtime'; +import { Button, ConfirmModal } from '@grafana/ui'; + +import { Loader } from '../plugins/admin/components/Loader'; + +import { useCreateRepositoryImportMutation, useListRepositoryQuery } from './api'; + +interface Props { + name?: string; + folder?: string; +} + +export function ImportFromRepository({ name, folder }: Props) { + const query = useListRepositoryQuery(); + const [importResource, importQuery] = useCreateRepositoryImportMutation(); + const [isModalOpen, setIsModalOpen] = useState(false); + const navigate = useNavigate(); + + // TODO generate endpoints for this + const { value } = useAsync(async () => { + return getBackendSrv().get(`/apis/folder.grafana.app/v0alpha1/namespaces/${config.namespace}/folders/${folder}`); + }); + + useEffect(() => { + const appEvents = getAppEvents(); + if (importQuery.isSuccess) { + appEvents.publish({ + type: AppEvents.alertSuccess.name, + payload: ['Resources imported'], + }); + // TODO the URL will be different based on the type of resource imported + navigate(`/dashboards${folder ? `/f/${folder}` : ''}`); + } else if (importQuery.isError) { + appEvents.publish({ + type: AppEvents.alertError.name, + payload: ['Error importing resources', importQuery.error], + }); + } + }, [folder, importQuery.error, importQuery.isError, importQuery.isSuccess, navigate]); + + const onClick = () => { + if (!name) { + return; + } + + importResource({ name, ref: 'main' }); + }; + + if (query.isLoading) { + return ; + } + return ( + <> + + setIsModalOpen(false)} + /> + + ); +} diff --git a/public/app/features/provisioning/RepositoryListPage.tsx b/public/app/features/provisioning/RepositoryListPage.tsx index ae91a358631..7dfe14f235f 100644 --- a/public/app/features/provisioning/RepositoryListPage.tsx +++ b/public/app/features/provisioning/RepositoryListPage.tsx @@ -7,6 +7,7 @@ import { Page } from 'app/core/components/Page/Page'; import { Resource } from '../apiserver/types'; import { DeleteRepositoryButton } from './DeleteRepositoryButton'; +import { ImportFromRepository } from './ImportFromRepository'; import { RepositorySpec } from './api/types'; import { NEW_URL, PROVISIONING_URL } from './constants'; import { useRepositoryList } from './hooks'; @@ -63,6 +64,7 @@ function RepositoryListPageContent({ items }: { items?: Array Edit + diff --git a/public/app/features/provisioning/api/endpoints.ts b/public/app/features/provisioning/api/endpoints.ts index 9f7416b0d5f..e7cb07bc6d5 100644 --- a/public/app/features/provisioning/api/endpoints.ts +++ b/public/app/features/provisioning/api/endpoints.ts @@ -20,17 +20,17 @@ const injectedRtkApi = api.injectEndpoints({ query: () => ({ url: BASE_PATH }), providesTags: ['RepositoryList'], }), - getRepository: build.query({ - query: ({ name }) => ({ url: `${BASE_PATH}/${name}` }), - }), createRepository: build.mutation({ - query: (resource) => ({ + query: (body) => ({ url: BASE_PATH, method: 'POST', - body: resource, + body, }), invalidatesTags: ['RepositoryList'], }), + getRepository: build.query({ + query: ({ name }) => ({ url: `${BASE_PATH}/${name}` }), + }), updateRepository: build.mutation({ query: ({ name, body }) => ({ url: `${BASE_PATH}/${name}`, @@ -54,11 +54,6 @@ const injectedRtkApi = api.injectEndpoints({ }), invalidatesTags: ['RepositoryList'], }), - getRepositoryExport: build.query({ - query: ({ name }) => ({ - url: `${BASE_PATH}/${name}/export`, - }), - }), createRepositoryExport: build.mutation({ query: ({ name }) => ({ url: `${BASE_PATH}/${name}/export`, @@ -94,7 +89,6 @@ const injectedRtkApi = api.injectEndpoints({ query: ({ name, path, ref, message }) => ({ url: `${BASE_PATH}/${name}/files/${path}`, method: 'DELETE', - params: { ref, message }, }), }), getRepositoryHello: build.query({ @@ -103,6 +97,13 @@ const injectedRtkApi = api.injectEndpoints({ params: { whom }, }), }), + createRepositoryImport: build.mutation({ + query: ({ name, ref }) => ({ + url: `${BASE_PATH}/${name}/import`, + method: 'POST', + params: { ref }, + }), + }), getRepositoryStatus: build.query({ query: ({ name }) => ({ url: `${BASE_PATH}/${name}/status`, @@ -147,13 +148,13 @@ export const { useUpdateRepositoryMutation, useDeleteRepositoryMutation, usePatchRepositoryMutation, - useGetRepositoryExportQuery, useCreateRepositoryExportMutation, useGetRepositoryFilesQuery, useUpdateRepositoryFilesMutation, useCreateRepositoryFilesMutation, useDeleteRepositoryFilesMutation, useGetRepositoryHelloQuery, + useCreateRepositoryImportMutation, useGetRepositoryStatusQuery, useUpdateRepositoryStatusMutation, usePatchRepositoryStatusMutation,