import React, { FC, useCallback } from 'react'; import { Button, Field, FieldArray, Input, InputControl, Label, TextArea, useStyles } from '@grafana/ui'; import { GrafanaTheme } from '@grafana/data'; import { css, cx } from '@emotion/css'; import { useFormContext } from 'react-hook-form'; import { RuleFormValues } from '../../types/rule-form'; import { AnnotationKeyInput } from './AnnotationKeyInput'; const AnnotationsField: FC = () => { const styles = useStyles(getStyles); const { control, register, watch, formState: { errors }, } = useFormContext(); const annotations = watch('annotations') as RuleFormValues['annotations']; const existingKeys = useCallback( (index: number): string[] => annotations.filter((_, idx: number) => idx !== index).map(({ key }) => key), [annotations] ); return ( <> {({ fields, append, remove }) => { return (
{fields.map((field, index) => { const isUrl = annotations[index]?.key?.toLocaleLowerCase().endsWith('url'); const ValueInputComponent = isUrl ? Input : TextArea; return (
( )} control={control} rules={{ required: { value: !!annotations[index]?.value, message: 'Required.' } }} />
); })}
); }}
); }; const getStyles = (theme: GrafanaTheme) => ({ annotationValueInput: css` width: 426px; `, textarea: css` height: 76px; `, addAnnotationsButton: css` flex-grow: 0; align-self: flex-start; margin-left: 148px; `, flexColumn: css` display: flex; flex-direction: column; `, field: css` margin-bottom: ${theme.spacing.xs}; `, flexRow: css` display: flex; flex-direction: row; justify-content: flex-start; `, flexRowItemMargin: css` margin-left: ${theme.spacing.xs}; `, }); export default AnnotationsField;