import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { AppEvents } from '@grafana/data'; import { getAppEvents, getBackendSrv, isFetchError, locationService, reportInteraction } from '@grafana/runtime'; import { Box, Button, CollapsableSection, ConfirmModal, Dropdown, Field, IconButton, LinkButton, Menu, Stack, Switch, } from '@grafana/ui'; import { FormPrompt } from '../../core/components/FormPrompt/FormPrompt'; import { Page } from '../../core/components/Page/Page'; import { FieldRenderer } from './FieldRenderer'; import { 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, getValues, unregister, formState: { errors, dirtyFields, isSubmitted }, } = useForm({ defaultValues: dataToDTO(config), mode: 'onSubmit', reValidateMode: 'onChange' }); const [isSaving, setIsSaving] = useState(false); const [submitError, setSubmitError] = useState(false); const dataSubmitted = isSubmitted && !submitError; const sections = sectionFields[provider]; const [resetConfig, setResetConfig] = useState(false); const additionalActionsMenu = ( { setResetConfig(true); }} /> ); 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 }, }, { showErrorAlert: false, } ); reportInteraction('grafana_authentication_ssosettings_saved', { provider, enabled: requestData.enabled, }); 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); setIsSaving(false); } }; const onResetConfig = async () => { try { await getBackendSrv().delete(`/api/v1/sso-settings/${provider}`, undefined, { showSuccessAlert: false }); reportInteraction('grafana_authentication_ssosettings_removed', { 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], }); } }; const isEnabled = config?.settings.enabled; const onSaveAttempt = (toggleEnabled: boolean) => { reportInteraction('grafana_authentication_ssosettings_save_attempt', { provider, enabled: toggleEnabled ? !isEnabled : isEnabled, }); if (toggleEnabled) { setValue('enabled', !isEnabled); } }; return (
{ reportInteraction('grafana_authentication_ssosettings_abandoned', { provider, }); reset(); }} /> {sections .filter((section) => !section.hidden) .map((section, index) => { return ( {section.fields .filter((field) => (typeof field !== 'string' ? !field.hidden : true)) .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); }} /> )}
); };