+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import * as React from 'react';
-import { FileUpload } from "~/components/file-upload/file-upload";
-import { Dialog, DialogTitle, DialogContent, DialogActions } from '@material-ui/core/';
-import { Button, CircularProgress } from '@material-ui/core';
-import { WithDialogProps } from '~/store/dialog/with-dialog';
-import { UploadFile } from '~/store/file-uploader/file-uploader-actions';
-
-export interface FilesUploadDialogProps {
- files: UploadFile[];
- uploading: boolean;
- onSubmit: () => void;
- onChange: (files: File[]) => void;
- onDelete: (files: File[]) => void;
-}
-
-export const FilesUploadDialog = (props: FilesUploadDialogProps & WithDialogProps<{}>) =>
- <Dialog open={props.open}
- disableBackdropClick={true}
- disableEscapeKeyDown={true}
- fullWidth={true}
- maxWidth='sm'>
- <DialogTitle>Upload data</DialogTitle>
- <DialogContent>
- <FileUpload
- files={props.files}
- disabled={props.uploading}
- onDrop={props.onChange}
- onDelete={props.onDelete}
- />
- </DialogContent>
- <DialogActions>
- <Button
- variant='text'
- color='primary'
- disabled={props.uploading}
- onClick={props.closeDialog}>
- Cancel
- </Button>
- <Button
- variant='contained'
- color='primary'
- type='submit'
- onClick={props.onSubmit}
- disabled={props.uploading}>
- {props.uploading
- ? <CircularProgress size={20} />
- : 'Upload data'}
- </Button>
- </DialogActions>
- </Dialog>;
files: UploadFile[];
disabled: boolean;
onDrop: (files: File[]) => void;
- onDelete: (files: File[]) => void;
+ onDelete: (file: UploadFile) => void;
}
interface FileUploadState {
focused: false
};
}
- onDelete = (event: React.MouseEvent<HTMLTableCellElement>, file: any): void => {
+ onDelete = (event: React.MouseEvent<HTMLTableCellElement>, file: UploadFile): void => {
const { onDelete, disabled } = this.props;
event.stopPropagation();
if (!disabled) {
- onDelete([file]);
+ onDelete(file);
}
}
render() {
const { classes, onDrop, disabled, files } = this.props;
return <div className={"file-upload-dropzone " + classes.dropzoneWrapper}>
- <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderLeft, { [classes.dropzoneBorderHorzActive]: this.state.focused })}/>
- <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderRight, { [classes.dropzoneBorderHorzActive]: this.state.focused })}/>
- <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderTop, { [classes.dropzoneBorderVertActive]: this.state.focused })}/>
- <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderBottom, { [classes.dropzoneBorderVertActive]: this.state.focused })}/>
+ <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderLeft, { [classes.dropzoneBorderHorzActive]: this.state.focused })} />
+ <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderRight, { [classes.dropzoneBorderHorzActive]: this.state.focused })} />
+ <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderTop, { [classes.dropzoneBorderVertActive]: this.state.focused })} />
+ <div className={classnames(classes.dropzoneBorder, classes.dropzoneBorderBottom, { [classes.dropzoneBorderVertActive]: this.state.focused })} />
<Dropzone className={classes.dropzone}
onDrop={files => onDrop(files)}
onClick={() => {
focused: false
});
}
- }}>
+ }}>
{files.length === 0 &&
<Grid container justify="center" alignItems="center" className={classes.container}>
<Grid item component={"span"}>
<TableCell>{formatUploadSpeed(f.prevLoaded, f.loaded, f.prevTime, f.currentTime)}</TableCell>
<TableCell>{formatProgress(f.loaded, f.total)}</TableCell>
<TableCell>
- <IconButton
+ <IconButton
aria-label="Remove"
- onClick={(event: React.MouseEvent<HTMLTableCellElement>) => this.onDelete(event, f)}
+ onClick={(event: React.MouseEvent<HTMLTableCellElement>) => this.onDelete(event, f)}
className={disabled ? classnames(classes.deleteButtonDisabled, classes.deleteIcon) : classnames(classes.deleteButton, classes.deleteIcon)}
>
<RemoveIcon />
</IconButton>
</TableCell>
- </TableRow>
+ </TableRow>
)}
</TableBody>
</Table>
currentTime: number;
}
-export interface FileWithId extends File {
- id: number;
-}
-
export const fileUploaderActions = unionize({
CLEAR_UPLOAD: ofType(),
SET_UPLOAD_FILES: ofType<File[]>(),
UPDATE_UPLOAD_FILES: ofType<File[]>(),
SET_UPLOAD_PROGRESS: ofType<{ fileId: number, loaded: number, total: number, currentTime: number }>(),
START_UPLOAD: ofType(),
- DELETE_UPLOAD_FILE: ofType<FileWithId[]>(),
+ DELETE_UPLOAD_FILE: ofType<UploadFile>(),
});
export type FileUploaderAction = UnionOf<typeof fileUploaderActions>;
return uniqUpdatedState;
},
- DELETE_UPLOAD_FILE: files => {
- const idToDelete: number = files[0].id;
- const updatedState = state.filter( file => file.id !== idToDelete);
+ DELETE_UPLOAD_FILE: file => {
+ const idToDelete: number = file.id;
+ const updatedState = state.filter(file => file.id !== idToDelete);
return updatedState;
},
import { RootState } from '~/store/store';
import { FileUploadProps } from '../../components/file-upload/file-upload';
import { Dispatch } from 'redux';
-import { fileUploaderActions, getFileUploaderState, FileWithId } from '~/store/file-uploader/file-uploader-actions';
+import { fileUploaderActions, getFileUploaderState } from '~/store/file-uploader/file-uploader-actions';
import { WrappedFieldProps } from 'redux-form';
import { Typography } from '@material-ui/core';
onDrop(files);
}
},
- onDelete: files => dispatch(fileUploaderActions.DELETE_UPLOAD_FILE(files as FileWithId[])),
+ onDelete: file => dispatch(fileUploaderActions.DELETE_UPLOAD_FILE(file)),
});
export const FileUploader = connect(mapStateToProps, mapDispatchToProps)(FileUpload);