adding-posibility-to-choose-files-many-times-and-dont-replace-other-files
authorPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Wed, 22 May 2019 10:02:23 +0000 (12:02 +0200)
committerPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Wed, 22 May 2019 10:02:23 +0000 (12:02 +0200)
Feature #15160

Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>

src/store/file-uploader/file-uploader-actions.ts
src/store/file-uploader/file-uploader-reducer.ts
src/views-components/file-uploader/file-uploader.tsx

index 906263fe140d0af10f75fed425c2e53d20d866a5..f4a30a239ddc9e3b2eaf56608a80db362f1f2d7a 100644 (file)
@@ -3,6 +3,8 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { unionize, ofType, UnionOf } from "~/common/unionize";
+import { Dispatch } from "redux";
+import { RootState } from '~/store/store';
 
 export interface UploadFile {
     id: number;
@@ -18,8 +20,13 @@ export interface UploadFile {
 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(),
 });
 
 export type FileUploaderAction = UnionOf<typeof fileUploaderActions>;
+
+export const getFileUploaderState = () => (dispatch: Dispatch, getState: () => RootState) => {
+    return getState().fileUploader;
+};
\ No newline at end of file
index 625306f0c3a50afcb87e8158ddbd7719f9668df2..9ea6313131b1d0e598ad5771cf75b5d370b5b86b 100644 (file)
@@ -3,6 +3,7 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { UploadFile, fileUploaderActions, FileUploaderAction } from "./file-uploader-actions";
+import * as _ from 'lodash';
 
 export type UploaderState = UploadFile[];
 
@@ -20,9 +21,25 @@ export const fileUploaderReducer = (state: UploaderState = initialState, action:
             prevTime: 0,
             currentTime: 0
         })),
+        UPDATE_UPLOAD_FILES: files => {
+            const updateFiles = files.map((f, idx) => ({
+                id: state.length + idx,
+                file: f,
+                prevLoaded: 0,
+                loaded: 0,
+                total: 0,
+                startTime: 0,
+                prevTime: 0,
+                currentTime: 0
+            }));
+            const updatedState = state.concat(updateFiles);
+            const uniqUpdatedState = _.uniqBy(updatedState, 'file.name');
+
+            return uniqUpdatedState;
+        },
         START_UPLOAD: () => {
             const startTime = Date.now();
-            return state.map(f => ({...f, startTime, prevTime: startTime}));
+            return state.map(f => ({ ...f, startTime, prevTime: startTime }));
         },
         SET_UPLOAD_PROGRESS: ({ fileId, loaded, total, currentTime }) =>
             state.map(f => f.id === fileId ? {
index e71a14c5c8763568cdb2b909794ea8e1ed69b576..83808016e60ee76d55430176bdb1705b8f1a9fc9 100644 (file)
@@ -8,7 +8,7 @@ import { connect } from 'react-redux';
 import { RootState } from '~/store/store';
 import { FileUploadProps } from '../../components/file-upload/file-upload';
 import { Dispatch } from 'redux';
-import { fileUploaderActions } 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';
 
@@ -21,9 +21,13 @@ const mapStateToProps = (state: RootState, { disabled }: FileUploaderProps): Pic
 
 const mapDispatchToProps = (dispatch: Dispatch, { onDrop }: FileUploaderProps): Pick<FileUploadProps, 'onDrop'> => ({
     onDrop: files => {
-        if (files.length > 0) {
+        const state = dispatch<any>(getFileUploaderState());
+        if (files.length > 0 && state.length === 0) {
             dispatch(fileUploaderActions.SET_UPLOAD_FILES(files));
             onDrop(files);
+        } else if (files.length > 0 && state.length > 0) {
+            dispatch(fileUploaderActions.UPDATE_UPLOAD_FILES(files));
+            onDrop(files);
         }
     },
 });