import { useEffect, useState } from 'react'; import { Controller, FieldErrors, UseFormReturn } from 'react-hook-form'; import { selectors } from '@grafana/e2e-selectors'; import { Trans, t } from '@grafana/i18n'; import { ExpressionDatasourceRef } from '@grafana/runtime/internal'; import { Button, Field, FormFieldErrors, FormsOnSubmit, Stack, Input, Legend } from '@grafana/ui'; import { FolderPicker } from 'app/core/components/Select/FolderPicker'; import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker'; import { DashboardInput, DashboardInputs, DataSourceInput, ImportDashboardDTO, LibraryPanelInputState, } from '../state/reducers'; import { validateTitle, validateUid } from '../utils/validation'; import { ImportDashboardLibraryPanelsList } from './ImportDashboardLibraryPanelsList'; interface Props extends Pick, 'register' | 'control' | 'getValues' | 'watch'> { uidReset: boolean; inputs: DashboardInputs; errors: FieldErrors; onCancel: () => void; onUidReset: () => void; onSubmit: FormsOnSubmit; } export const ImportDashboardForm = ({ register, errors, control, getValues, uidReset, inputs, onUidReset, onCancel, onSubmit, watch, }: Props) => { const [isSubmitted, setSubmitted] = useState(false); const watchDataSources = watch('dataSources'); const watchFolder = watch('folder'); /* This useEffect is needed for overwriting a dashboard. It submits the form even if there's validation errors on title or uid. */ useEffect(() => { if (isSubmitted && (errors.title || errors.uid)) { onSubmit(getValues()); } }, [errors, getValues, isSubmitted, onSubmit]); const newLibraryPanels = inputs?.libraryPanels?.filter((i) => i.state === LibraryPanelInputState.New) ?? []; const existingLibraryPanels = inputs?.libraryPanels?.filter((i) => i.state === LibraryPanelInputState.Exists) ?? []; return ( <> Options await validateTitle(v, getValues().folder.uid), })} type="text" data-testid={selectors.components.ImportDashboardForm.name} /> ( onChange({ uid, title })} value={value.uid} /> )} name="folder" control={control} /> <> {!uidReset ? ( await validateUid(v) })} addonAfter={ !uidReset && ( ) } /> ) : ( await validateUid(v) })} /> )} {inputs.dataSources && inputs.dataSources.map((input: DataSourceInput, index: number) => { if (input.pluginId === ExpressionDatasourceRef.type) { return null; } const dataSourceOption = `dataSources.${index}` as const; const current = watchDataSources ?? []; return ( ( )} control={control} rules={{ required: true }} /> ); })} {inputs.constants && inputs.constants.map((input: DashboardInput, index) => { const constantIndex = `constants.${index}` as const; return ( ); })} ); }; function getButtonVariant(errors: FormFieldErrors) { return errors && (errors.title || errors.uid) ? 'destructive' : 'primary'; } function getButtonText(errors: FormFieldErrors) { return errors && (errors.title || errors.uid) ? 'Import (Overwrite)' : 'Import'; }