D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
usr
/
share
/
grafana
/
public
/
app
/
features
/
alerting
/
unified
/
components
/
receivers
/
Filename :
GlobalConfigForm.tsx
back
Copy
import React from 'react'; import { useForm, FormProvider } from 'react-hook-form'; import { Alert, Button, HorizontalGroup, LinkButton } from '@grafana/ui'; import { useCleanup } from 'app/core/hooks/useCleanup'; import { AlertManagerCortexConfig } from 'app/plugins/datasource/alertmanager/types'; import { useDispatch } from 'app/types'; import { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector'; import { updateAlertManagerConfigAction } from '../../state/actions'; import { globalConfigOptions } from '../../utils/cloud-alertmanager-notifier-types'; import { isVanillaPrometheusAlertManagerDataSource } from '../../utils/datasource'; import { makeAMLink } from '../../utils/misc'; import { omitEmptyValues } from '../../utils/receiver-form'; import { initialAsyncRequestState } from '../../utils/redux'; import { OptionField } from './form/fields/OptionField'; interface Props { config: AlertManagerCortexConfig; alertManagerSourceName: string; } type FormValues = Record<string, unknown>; const defaultValues: FormValues = { smtp_require_tls: true, } as const; export const GlobalConfigForm = ({ config, alertManagerSourceName }: Props) => { const dispatch = useDispatch(); useCleanup((state) => (state.unifiedAlerting.saveAMConfig = initialAsyncRequestState)); const { loading, error } = useUnifiedAlertingSelector((state) => state.saveAMConfig); const readOnly = isVanillaPrometheusAlertManagerDataSource(alertManagerSourceName); const formAPI = useForm<FormValues>({ // making a copy here beacuse react-hook-form will mutate these, and break if the object is frozen. for real. defaultValues: JSON.parse( JSON.stringify({ ...defaultValues, ...(config.alertmanager_config.global ?? {}), }) ), }); const { handleSubmit, formState: { errors }, } = formAPI; const onSubmitCallback = (values: FormValues) => { dispatch( updateAlertManagerConfigAction({ newConfig: { ...config, alertmanager_config: { ...config.alertmanager_config, global: omitEmptyValues(values), }, }, oldConfig: config, alertManagerSourceName, successMessage: 'Global config updated.', redirectPath: makeAMLink('/alerting/notifications', alertManagerSourceName), }) ); }; return ( <FormProvider {...formAPI}> <form onSubmit={handleSubmit(onSubmitCallback)}> {error && ( <Alert severity="error" title="Error saving receiver"> {error.message || String(error)} </Alert> )} {globalConfigOptions.map((option) => ( <OptionField readOnly={readOnly} defaultValue={defaultValues[option.propertyName]} key={option.propertyName} option={option} error={errors[option.propertyName]} pathPrefix={''} /> ))} <div> <HorizontalGroup> {!readOnly && ( <> {loading && ( <Button disabled={true} icon="fa fa-spinner" variant="primary"> Saving... </Button> )} {!loading && <Button type="submit">Save global config</Button>} </> )} <LinkButton disabled={loading} fill="outline" variant="secondary" href={makeAMLink('alerting/notifications', alertManagerSourceName)} > Cancel </LinkButton> </HorizontalGroup> </div> </form> </FormProvider> ); };