@grafana/ui
Version:
Grafana Components Library
1 lines • 20 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\nexport interface DropzoneFile {\n file: File;\n id: string;\n error: DOMException | null;\n progress?: number;\n abortUpload?: () => void;\n retryUpload?: () => void;\n}\n\nexport function FileDropzone({ options, children, readAs, onLoad, fileListRenderer, onFileRemove }: 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()} />\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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"}