X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/25f990e6caeaeb9515231e9fda8d1f07be3f2b42..d8f669aadc5f3d7241395abd6aa764406079d7d3:/src/components/file-upload/file-upload.tsx diff --git a/src/components/file-upload/file-upload.tsx b/src/components/file-upload/file-upload.tsx index 41054df4..579746a6 100644 --- a/src/components/file-upload/file-upload.tsx +++ b/src/components/file-upload/file-upload.tsx @@ -2,24 +2,25 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from 'react'; -import * as classnames from 'classnames'; +import React from 'react'; +import classnames from 'classnames'; import { Grid, StyleRulesCallback, Table, TableBody, TableCell, TableHead, TableRow, Typography, - WithStyles + WithStyles, + IconButton } from '@material-ui/core'; import { withStyles } from '@material-ui/core'; import Dropzone from 'react-dropzone'; -import { CloudUploadIcon } from "../icon/icon"; -import { formatFileSize, formatProgress, formatUploadSpeed } from "~/common/formatters"; -import { UploadFile } from '~/store/file-uploader/file-uploader-actions'; +import { CloudUploadIcon, RemoveIcon } from "../icon/icon"; +import { formatFileSize, formatProgress, formatUploadSpeed } from "common/formatters"; +import { UploadFile } from 'store/file-uploader/file-uploader-actions'; type CssRules = "root" | "dropzone" | "dropzoneWrapper" | "container" | "uploadIcon" | "dropzoneBorder" | "dropzoneBorderLeft" | "dropzoneBorderRight" | "dropzoneBorderTop" | "dropzoneBorderBottom" - | "dropzoneBorderHorzActive" | "dropzoneBorderVertActive"; + | "dropzoneBorderHorzActive" | "dropzoneBorderVertActive" | "deleteButton" | "deleteButtonDisabled" | "deleteIcon"; const styles: StyleRulesCallback = theme => ({ root: { @@ -81,6 +82,15 @@ const styles: StyleRulesCallback = theme => ({ }, uploadIcon: { verticalAlign: "middle" + }, + deleteButton: { + cursor: "pointer" + }, + deleteButtonDisabled: { + cursor: "not-allowed" + }, + deleteIcon: { + marginLeft: "-6px" } }); @@ -88,6 +98,7 @@ interface FileUploadPropsData { files: UploadFile[]; disabled: boolean; onDrop: (files: File[]) => void; + onDelete: (file: UploadFile) => void; } interface FileUploadState { @@ -104,13 +115,22 @@ export const FileUpload = withStyles(styles)( focused: false }; } + onDelete = (event: React.MouseEvent, file: UploadFile): void => { + const { onDelete, disabled } = this.props; + + event.stopPropagation(); + + if (!disabled) { + onDelete(file); + } + } render() { const { classes, onDrop, disabled, files } = this.props; return
-
-
-
-
+
+
+
+
onDrop(files)} onClick={() => { @@ -120,6 +140,7 @@ export const FileUpload = withStyles(styles)( inputs[0].focus(); } }} + data-cy="drag-and-drop" disabled={disabled} inputProps={{ onFocus: () => { @@ -132,11 +153,11 @@ export const FileUpload = withStyles(styles)( focused: false }); } - }}> + }}> {files.length === 0 && - + Drag and drop data or click to browse @@ -149,6 +170,7 @@ export const FileUpload = withStyles(styles)( File size Upload speed Upload progress + Delete @@ -158,6 +180,15 @@ export const FileUpload = withStyles(styles)( {formatFileSize(f.file.size)} {formatUploadSpeed(f.prevLoaded, f.loaded, f.prevTime, f.currentTime)} {formatProgress(f.loaded, f.total)} + + ) => this.onDelete(event, f)} + className={disabled ? classnames(classes.deleteButtonDisabled, classes.deleteIcon) : classnames(classes.deleteButton, classes.deleteIcon)} + > + + + )}