{"version":3,"file":"Field.cjs","sources":["../../../../src/components/Forms/Field.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { HTMLAttributes } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getChildId } from '../../utils/reactUtils';\n\nimport { FieldValidationMessage } from './FieldValidationMessage';\nimport { Label } from './Label';\n\nexport interface FieldProps extends HTMLAttributes<HTMLDivElement> {\n  /** Form input element, i.e Input or Switch */\n  children: React.ReactElement<Record<string, unknown>>;\n  /** Label for the field */\n  label?: React.ReactNode;\n  /** Description of the field */\n  description?: React.ReactNode;\n  /** Indicates if field is in invalid state */\n  invalid?: boolean;\n  /** Indicates if field is in loading state */\n  loading?: boolean;\n  /** Indicates if field is disabled */\n  disabled?: boolean;\n  /** Indicates if field is required */\n  required?: boolean;\n  /** Error message to display */\n  error?: React.ReactNode;\n  /** Indicates horizontal layout of the field */\n  horizontal?: boolean;\n  /** make validation message overflow horizontally. Prevents pushing out adjacent inline components */\n  validationMessageHorizontalOverflow?: boolean;\n\n  className?: string;\n  /**\n   *  A unique id that associates the label of the Field component with the control with the unique id.\n   *  If the `htmlFor` property is missing the `htmlFor` will be inferred from the `id` or `inputId` property of the first child.\n   *  https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label#attr-for\n   */\n  htmlFor?: string;\n  /** Remove the bottom margin */\n  noMargin?: boolean;\n}\n\n/**\n * Field is the basic component for rendering form elements together with labels and description.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/forms-field--docs\n */\nexport const Field = React.forwardRef<HTMLDivElement, FieldProps>(\n  (\n    {\n      label,\n      description,\n      horizontal,\n      invalid,\n      loading,\n      disabled,\n      required,\n      error,\n      children,\n      className,\n      validationMessageHorizontalOverflow,\n      htmlFor,\n      noMargin,\n      ...otherProps\n    }: FieldProps,\n    ref\n  ) => {\n    const styles = useStyles2(getFieldStyles, noMargin);\n    const inputId = htmlFor ?? getChildId(children);\n\n    const labelElement =\n      typeof label === 'string' ? (\n        <Label htmlFor={inputId} description={description}>\n          {`${label}${required ? ' *' : ''}`}\n        </Label>\n      ) : (\n        label\n      );\n\n    const childProps = deleteUndefinedProps({ invalid, disabled, loading });\n    return (\n      <div className={cx(styles.field, horizontal && styles.fieldHorizontal, className)} {...otherProps}>\n        {labelElement}\n        <div>\n          <div ref={ref}>{React.cloneElement(children, children.type !== React.Fragment ? childProps : undefined)}</div>\n          {invalid && error && !horizontal && (\n            <div\n              className={cx(styles.fieldValidationWrapper, {\n                [styles.validationMessageHorizontalOverflow]: !!validationMessageHorizontalOverflow,\n              })}\n            >\n              <FieldValidationMessage>{error}</FieldValidationMessage>\n            </div>\n          )}\n        </div>\n\n        {invalid && error && horizontal && (\n          <div\n            className={cx(styles.fieldValidationWrapper, styles.fieldValidationWrapperHorizontal, {\n              [styles.validationMessageHorizontalOverflow]: !!validationMessageHorizontalOverflow,\n            })}\n          >\n            <FieldValidationMessage>{error}</FieldValidationMessage>\n          </div>\n        )}\n      </div>\n    );\n  }\n);\n\nField.displayName = 'Field';\n\nfunction deleteUndefinedProps<T extends Object>(obj: T): Partial<T> {\n  for (const key in obj) {\n    if (obj[key] === undefined) {\n      delete obj[key];\n    }\n  }\n\n  return obj;\n}\n\nexport const getFieldStyles = (theme: GrafanaTheme2, noMargin?: boolean) => ({\n  field: css({\n    display: 'flex',\n    flexDirection: 'column',\n    marginBottom: theme.spacing(noMargin ? 0 : 2),\n  }),\n  fieldHorizontal: css({\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    flexWrap: 'wrap',\n  }),\n  fieldValidationWrapper: css({\n    marginTop: theme.spacing(0.5),\n  }),\n  fieldValidationWrapperHorizontal: css({\n    flex: '1 1 100%',\n  }),\n  validationMessageHorizontalOverflow: css({\n    width: 0,\n    overflowX: 'visible',\n\n    '& > *': {\n      whiteSpace: 'nowrap',\n    },\n  }),\n});\n"],"names":["React","useStyles2","getChildId","jsx","Label","jsxs","cx","FieldValidationMessage","css"],"mappings":"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"}