{"version":3,"file":"FileUpload.cjs","sources":["../../../../src/components/FileUpload/FileUpload.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { FormEvent, useCallback, useState } from 'react';\nimport * as React from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { ComponentSize } from '../../types/size';\nimport { trimFileName } from '../../utils/file';\nimport { getButtonStyles } from '../Button/Button';\nimport { Icon } from '../Icon/Icon';\n\nexport interface Props {\n  /** Callback function to handle uploaded file  */\n  onFileUpload: (event: FormEvent<HTMLInputElement>) => void;\n  /** Accepted file extensions */\n  accept?: string;\n  /** Overwrite or add to style */\n  className?: string;\n  /** Button size */\n  size?: ComponentSize;\n  /** Show the file name */\n  showFileName?: boolean;\n}\n\n/**\n * A button-styled input that triggers file upload popup. Button text and accepted file extensions can be customized via `label` and `accepted` props respectively.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/inputs-fileupload--docs\n */\nexport const FileUpload = ({\n  onFileUpload,\n  className,\n  children = 'Upload file',\n  accept = '*',\n  size = 'md',\n  showFileName,\n}: React.PropsWithChildren<Props>) => {\n  const style = useStyles2(getStyles(size));\n  const [fileName, setFileName] = useState('');\n  const id = uuidv4();\n\n  const onChange = useCallback(\n    (event: FormEvent<HTMLInputElement>) => {\n      const file = event.currentTarget?.files?.[0];\n      if (file) {\n        setFileName(file.name ?? '');\n      }\n      onFileUpload(event);\n    },\n    [onFileUpload]\n  );\n\n  return (\n    <>\n      <input\n        type=\"file\"\n        id={id}\n        className={style.fileUpload}\n        onChange={onChange}\n        multiple={false}\n        accept={accept}\n        data-testid={selectors.components.FileUpload.inputField}\n      />\n      <label htmlFor={id} className={cx(style.labelWrapper, className)}>\n        <Icon name=\"upload\" className={style.icon} />\n        {children}\n      </label>\n\n      {showFileName && fileName && (\n        <span\n          aria-label={t('grafana-ui.file-upload.file-name', 'File name')}\n          className={style.fileName}\n          data-testid={selectors.components.FileUpload.fileNameSpan}\n        >\n          {trimFileName(fileName)}\n        </span>\n      )}\n    </>\n  );\n};\n\nconst getStyles = (size: ComponentSize) => (theme: GrafanaTheme2) => {\n  const buttonStyles = getButtonStyles({ theme, variant: 'primary', size, iconOnly: false });\n  const focusStyle = getFocusStyles(theme);\n\n  return {\n    fileUpload: css({\n      height: '0.1px',\n      opacity: '0',\n      overflow: 'hidden',\n      position: 'absolute',\n      width: '0.1px',\n      zIndex: -1,\n      '&:focus + label': focusStyle,\n      '&:focus-visible + label': focusStyle,\n    }),\n    labelWrapper: buttonStyles.button,\n    icon: buttonStyles.icon,\n    fileName: css({\n      marginLeft: theme.spacing(0.5),\n    }),\n  };\n};\n"],"names":["useStyles2","useState","uuidv4","useCallback","jsxs","Fragment","jsx","selectors","cx","Icon","t","getButtonStyles","getFocusStyles","css"],"mappings":"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"}