import React, { useState } from 'react'; import { useForm } from 'react-hook-form'; import { AppEvents } from '@grafana/data'; import { getAppEvents, getBackendSrv, isFetchError, locationService } from '@grafana/runtime'; import { Box, Button, CollapsableSection, ConfirmModal, Field, LinkButton, Stack, Switch } from '@grafana/ui'; import { FormPrompt } from '../../core/components/FormPrompt/FormPrompt'; import { Page } from '../../core/components/Page/Page'; import { FieldRenderer } from './FieldRenderer'; import { fields, sectionFields } from './fields'; import { SSOProvider, SSOProviderDTO } from './types'; import { dataToDTO, dtoToData } from './utils/data'; const appEvents = getAppEvents(); interface ProviderConfigProps { config?: SSOProvider; isLoading?: boolean; provider: string; } export const ProviderConfigForm = ({ config, provider, isLoading }: ProviderConfigProps) => { const { register, handleSubmit, control, reset, watch, setValue, unregister, formState: { errors, dirtyFields, isSubmitted }, } = useForm({ defaultValues: dataToDTO(config), reValidateMode: 'onSubmit' }); const [isSaving, setIsSaving] = useState(false); const providerFields = fields[provider]; const [submitError, setSubmitError] = useState(false); const dataSubmitted = isSubmitted && !submitError; const sections = sectionFields[provider]; const [resetConfig, setResetConfig] = useState(false); const onSubmit = async (data: SSOProviderDTO) => { setIsSaving(true); setSubmitError(false); const requestData = dtoToData(data, provider); try { await getBackendSrv().put(`/api/v1/sso-settings/${provider}`, { id: config?.id, provider: config?.provider, settings: { ...requestData }, }); appEvents.publish({ type: AppEvents.alertSuccess.name, payload: ['Settings saved'], }); reset(data); // Delay redirect so the form state can update setTimeout(() => { locationService.push(`/admin/authentication`); }, 300); } catch (error) { let message = ''; if (isFetchError(error)) { message = error.data.message; } else if (error instanceof Error) { message = error.message; } appEvents.publish({ type: AppEvents.alertError.name, payload: [message], }); setSubmitError(true); } finally { setIsSaving(false); } }; const onResetConfig = async () => { try { await getBackendSrv().delete(`/api/v1/sso-settings/${provider}`); appEvents.publish({ type: AppEvents.alertSuccess.name, payload: ['Settings reset to defaults'], }); setTimeout(() => { locationService.push(`/admin/authentication`); }); } catch (error) { let message = ''; if (isFetchError(error)) { message = error.data.message; } else if (error instanceof Error) { message = error.message; } appEvents.publish({ type: AppEvents.alertError.name, payload: [message], }); } }; return (
<> { reset(); }} /> {sections ? ( {sections .filter((section) => !section.hidden) .map((section, index) => { return ( {section.fields .filter((field) => (typeof field !== 'string' ? !field.hidden : true)) .map((field) => { return ( ); })} ); })} ) : ( <> {providerFields.map((field) => { return ( ); })} )} Discard {resetConfig && ( Are you sure you want to reset this configuration? After resetting these settings Grafana will use the provider configuration from the system (config file/environment variables) if any. } confirmText="Reset" onDismiss={() => setResetConfig(false)} onConfirm={async () => { await onResetConfig(); setResetConfig(false); }} /> )}
); };