@grafana/ui
Version:
Grafana Components Library
1 lines • 20.6 kB
Source Map (JSON)
{"version":3,"file":"FileDropzone.mjs","sources":["../../../../src/components/FileDropzone/FileDropzone.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { isString, uniqueId } from 'lodash';\nimport { ReactNode, useCallback, useState } from 'react';\nimport { Accept, DropEvent, DropzoneOptions, FileError, FileRejection, useDropzone, ErrorCode } from 'react-dropzone';\n\nimport { formattedValueToString, getValueFormat, GrafanaTheme2 } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { Alert } from '../Alert/Alert';\nimport { Icon } from '../Icon/Icon';\n\nimport { FileListItem } from './FileListItem';\n\ntype BackwardsCompatibleDropzoneOptions = Omit<DropzoneOptions, 'accept'> & {\n // For backward compatibility we are still allowing the old `string | string[]` format for adding accepted file types (format changed in v13.0.0)\n accept?: string | string[] | Accept;\n};\n\nexport interface FileDropzoneProps {\n /**\n * Use the children property to have custom dropzone view.\n */\n children?: ReactNode;\n /**\n * Use this property to override the default behaviour for the react-dropzone options.\n * @default {\n * maxSize: Infinity,\n * minSize: 0,\n * multiple: true,\n * useFsAccessApi: false,\n * maxFiles: 0,\n * }\n */\n options?: BackwardsCompatibleDropzoneOptions;\n /**\n * Use this to change the FileReader's read.\n */\n readAs?: 'readAsArrayBuffer' | 'readAsText' | 'readAsBinaryString' | 'readAsDataURL';\n /**\n * Use the onLoad function to get the result from FileReader.\n */\n onLoad?: (result: string | ArrayBuffer | null) => void;\n /**\n * The fileListRenderer property can be used to overwrite the list of files. To not to show\n * any list return null in the function.\n */\n fileListRenderer?: (file: DropzoneFile, removeFile: (file: DropzoneFile) => void) => ReactNode;\n onFileRemove?: (file: DropzoneFile) => void;\n /**\n * Optional id attribute for the underlying input element\n * Use to link a label to the input for accessibility\n */\n id?: string;\n}\n\nexport interface DropzoneFile {\n file: File;\n id: string;\n error: DOMException | null;\n progress?: number;\n abortUpload?: () => void;\n retryUpload?: () => void;\n}\n\n/**\n * A dropzone component to use for file uploads.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/inputs-filedropzone--docs\n */\nexport function FileDropzone({\n options,\n children,\n readAs,\n onLoad,\n fileListRenderer,\n onFileRemove,\n id,\n}: FileDropzoneProps) {\n const [files, setFiles] = useState<DropzoneFile[]>([]);\n const [fileErrors, setErrorMessages] = useState<FileError[]>([]);\n\n const formattedSize = getValueFormat('decbytes')(options?.maxSize ? options?.maxSize : 0);\n\n const setFileProperty = useCallback(\n (customFile: DropzoneFile, action: (customFileToModify: DropzoneFile) => void) => {\n setFiles((oldFiles) => {\n return oldFiles.map((oldFile) => {\n if (oldFile.id === customFile.id) {\n action(oldFile);\n return oldFile;\n }\n return oldFile;\n });\n });\n },\n []\n );\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[], event: DropEvent) => {\n let customFiles = acceptedFiles.map(mapToCustomFile);\n if (options?.multiple === false) {\n setFiles(customFiles);\n } else {\n setFiles((oldFiles) => [...oldFiles, ...customFiles]);\n }\n\n setErrors(rejectedFiles);\n\n if (options?.onDrop) {\n options.onDrop(acceptedFiles, rejectedFiles, event);\n } else {\n for (const customFile of customFiles) {\n const reader = new FileReader();\n\n const read = () => {\n if (readAs) {\n reader[readAs](customFile.file);\n } else {\n reader.readAsText(customFile.file);\n }\n };\n\n // Set abort FileReader\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.abortUpload = () => {\n reader.abort();\n };\n fileToModify.retryUpload = () => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.error = null;\n fileToModify.progress = undefined;\n });\n read();\n };\n });\n\n reader.onabort = () => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.error = new DOMException('Aborted');\n });\n };\n\n reader.onprogress = (event) => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.progress = event.loaded;\n });\n };\n\n reader.onload = () => {\n onLoad?.(reader.result);\n };\n\n reader.onerror = () => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.error = reader.error;\n });\n };\n\n read();\n }\n }\n },\n [onLoad, options, readAs, setFileProperty]\n );\n\n const removeFile = (file: DropzoneFile) => {\n const newFiles = files.filter((f) => file.id !== f.id);\n setFiles(newFiles);\n onFileRemove?.(file);\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n ...options,\n useFsAccessApi: false,\n onDrop,\n accept: transformAcceptToNewFormat(options?.accept),\n });\n const theme = useTheme2();\n const styles = getStyles(theme, isDragActive);\n const fileList = files.map((file) => {\n if (fileListRenderer) {\n return fileListRenderer(file, removeFile);\n }\n return <FileListItem key={file.id} file={file} removeFile={removeFile} />;\n });\n\n const setErrors = (rejectedFiles: FileRejection[]) => {\n let errors: FileError[] = [];\n rejectedFiles.map((rejectedFile) => {\n rejectedFile.errors.map((newError) => {\n if (\n errors.findIndex((presentError) => {\n return presentError.code === newError.code && presentError.message === newError.message;\n }) === -1\n ) {\n errors.push(newError);\n }\n });\n });\n\n setErrorMessages(errors);\n };\n\n const renderErrorMessages = (errors: FileError[]) => {\n const size = formattedValueToString(formattedSize);\n return (\n <div className={styles.errorAlert}>\n <Alert\n title={t('grafana-ui.file-dropzone.error-title', 'Upload failed')}\n severity=\"error\"\n onRemove={clearAlert}\n >\n {errors.map((error) => {\n switch (error.code) {\n case ErrorCode.FileTooLarge:\n return (\n <div key={error.message + error.code}>\n <Trans i18nKey=\"grafana-ui.file-dropzone.file-too-large\">File is larger than {{ size }}</Trans>\n </div>\n );\n default:\n return <div key={error.message + error.code}>{error.message}</div>;\n }\n })}\n </Alert>\n </div>\n );\n };\n\n const clearAlert = () => {\n setErrorMessages([]);\n };\n\n return (\n <div className={styles.container}>\n <div data-testid=\"dropzone\" {...getRootProps({ className: styles.dropzone })}>\n <input {...getInputProps()} id={id} />\n {children ?? <FileDropzoneDefaultChildren primaryText={getPrimaryText(files, options)} />}\n </div>\n {fileErrors.length > 0 && renderErrorMessages(fileErrors)}\n <small className={cx(styles.small, styles.acceptContainer)}>\n {options?.maxSize && `Max file size: ${formattedValueToString(formattedSize)}`}\n {options?.maxSize && options?.accept && <span className={styles.acceptSeparator}>{'|'}</span>}\n {options?.accept && getAcceptedFileTypeText(options.accept)}\n </small>\n {fileList}\n </div>\n );\n}\n\nexport function getMimeTypeByExtension(ext: string) {\n if (['txt', 'json', 'csv', 'xls', 'yml'].some((e) => ext.match(e))) {\n return 'text/plain';\n }\n\n return 'application/octet-stream';\n}\n\nexport function transformAcceptToNewFormat(accept?: string | string[] | Accept): Accept | undefined {\n if (isString(accept)) {\n return {\n [getMimeTypeByExtension(accept)]: [accept],\n };\n }\n\n if (Array.isArray(accept)) {\n return accept.reduce((prev: Record<string, string[]>, current) => {\n const mime = getMimeTypeByExtension(current);\n\n prev[mime] = prev[mime] ? [...prev[mime], current] : [current];\n\n return prev;\n }, {});\n }\n\n return accept;\n}\n\nexport function FileDropzoneDefaultChildren({ primaryText = 'Drop file here or click to upload', secondaryText = '' }) {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <div className={cx(styles.defaultDropZone)} data-testid=\"file-drop-zone-default-children\">\n <Icon className={cx(styles.icon)} name=\"upload\" size=\"xl\" />\n <h6 className={cx(styles.primaryText)}>{primaryText}</h6>\n <small className={styles.small}>{secondaryText}</small>\n </div>\n );\n}\n\nfunction getPrimaryText(files: DropzoneFile[], options?: BackwardsCompatibleDropzoneOptions) {\n if (options?.multiple === undefined || options?.multiple) {\n return 'Upload file';\n }\n return files.length ? 'Replace file' : 'Upload file';\n}\n\nfunction getAcceptedFileTypeText(accept: string | string[] | Accept) {\n if (isString(accept)) {\n return `Accepted file type: ${accept}`;\n }\n\n if (Array.isArray(accept)) {\n return `Accepted file types: ${accept.join(', ')}`;\n }\n\n // react-dropzone has updated the type of the \"accept\" parameter since v13.0.0:\n // https://github.com/react-dropzone/react-dropzone/blob/master/src/index.js#L95\n return `Accepted file types: ${Object.values(accept).flat().join(', ')}`;\n}\n\nfunction mapToCustomFile(file: File): DropzoneFile {\n return {\n id: uniqueId('file'),\n file,\n error: null,\n };\n}\n\nfunction getStyles(theme: GrafanaTheme2, isDragActive?: boolean) {\n return {\n container: css({\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n padding: theme.spacing(2),\n borderRadius: theme.shape.radius.default,\n border: `1px dashed ${theme.colors.border.strong}`,\n backgroundColor: isDragActive ? theme.colors.background.secondary : theme.colors.background.primary,\n cursor: 'pointer',\n alignItems: 'center',\n justifyContent: 'center',\n }),\n dropzone: css({\n height: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n }),\n defaultDropZone: css({\n textAlign: 'center',\n }),\n icon: css({\n marginBottom: theme.spacing(1),\n }),\n primaryText: css({\n marginBottom: theme.spacing(1),\n }),\n acceptContainer: css({\n textAlign: 'center',\n margin: 0,\n }),\n acceptSeparator: css({\n margin: `0 ${theme.spacing(1)}`,\n }),\n small: css({\n color: theme.colors.text.secondary,\n }),\n errorAlert: css({\n paddingTop: '10px',\n }),\n };\n}\n"],"names":["fileToModify","event"],"mappings":"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"}