import React, { FC, useEffect, useState } from 'react'; import { Button, FormAPI, FormsOnSubmit, HorizontalGroup, FormFieldErrors, Input, Field, InputControl, Legend, } from '@grafana/ui'; import { DataSourcePicker } from '@grafana/runtime'; import { FolderPicker } from 'app/core/components/Select/FolderPicker'; import { DashboardInput, DashboardInputs, DataSourceInput, ImportDashboardDTO } from '../state/reducers'; import { validateTitle, validateUid } from '../utils/validation'; interface Props extends Omit, 'formState'> { uidReset: boolean; inputs: DashboardInputs; initialFolderId: number; onCancel: () => void; onUidReset: () => void; onSubmit: FormsOnSubmit; } export const ImportDashboardForm: FC = ({ register, errors, control, getValues, uidReset, inputs, initialFolderId, onUidReset, onCancel, onSubmit, watch, }) => { const [isSubmitted, setSubmitted] = useState(false); const watchDataSources = watch('dataSources'); /* 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({ nest: true }), {} as any); } }, [errors, getValues, isSubmitted, onSubmit]); return ( <> Options await validateTitle(v, getValues().folder.id), })} /> <> {!uidReset ? ( await validateUid(v) })} addonAfter={!uidReset && } /> ) : ( await validateUid(v) })} /> )} {inputs.dataSources && inputs.dataSources.map((input: DataSourceInput, index: number) => { const dataSourceOption = `dataSources[${index}]`; const current = watchDataSources ?? []; return ( ); })} {inputs.constants && inputs.constants.map((input: DashboardInput, index) => { const constantIndex = `constants[${index}]`; 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'; }