Create collection files upload dialog
[arvados-workbench2.git] / src / store / collections / uploader / collection-uploader-actions.ts
index f6b6bfa758b4c4ab5418a9f43912a4f2423b5ccf..bc3a0d130ae13afde76d30b8d49582330b719f05 100644 (file)
@@ -3,6 +3,12 @@
 // SPDX-License-Identifier: AGPL-3.0\r
 \r
 import { default as unionize, ofType, UnionOf } from "unionize";\r
+import { Dispatch } from 'redux';\r
+import { RootState } from '~/store/store';\r
+import { ServiceRepository } from '~/services/services';\r
+import { dialogActions } from '~/store/dialog/dialog-actions';\r
+import { loadCollectionFiles } from '../../collection-panel/collection-panel-files/collection-panel-files-actions';\r
+import { snackbarActions } from "~/store/snackbar/snackbar-actions";\r
 \r
 export interface UploadFile {\r
     id: number;\r
@@ -21,8 +27,40 @@ export const collectionUploaderActions = unionize({
     SET_UPLOAD_PROGRESS: ofType<{ fileId: number, loaded: number, total: number, currentTime: number }>(),\r
     CLEAR_UPLOAD: ofType()\r
 }, {\r
-    tag: 'type',\r
-    value: 'payload'\r
-});\r
+        tag: 'type',\r
+        value: 'payload'\r
+    });\r
 \r
 export type CollectionUploaderAction = UnionOf<typeof collectionUploaderActions>;\r
+\r
+export const uploadCollectionFiles = (collectionUuid: string) =>\r
+    (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {\r
+        dispatch(collectionUploaderActions.START_UPLOAD());\r
+        const files = getState().collections.uploader.map(file => file.file);\r
+        return services.collectionService.uploadFiles(collectionUuid, files,\r
+            (fileId, loaded, total, currentTime) => {\r
+                dispatch(collectionUploaderActions.SET_UPLOAD_PROGRESS({ fileId, loaded, total, currentTime }));\r
+            })\r
+            .then(() => {\r
+                dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
+            });\r
+    };\r
+\r
+export const uploadCurrentCollectionFiles = () =>\r
+    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {\r
+        const currentCollection = getState().collectionPanel.item;\r
+        if (currentCollection) {\r
+            await dispatch<any>(uploadCollectionFiles(currentCollection.uuid));\r
+            dispatch<any>(loadCollectionFiles(currentCollection.uuid));\r
+            dispatch(closeUploadCollectionFilesDialog());\r
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Data has been uploaded.', hideDuration: 2000 }));\r
+        }\r
+    };\r
+\r
+export const UPLOAD_COLLECTION_FILES_DIALOG = 'uploadCollectionFilesDialog';\r
+export const openUploadCollectionFilesDialog = () => (dispatch: Dispatch) => {\r
+    dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
+    dispatch<any>(dialogActions.OPEN_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG, data: {} }));\r
+};\r
+\r
+export const closeUploadCollectionFilesDialog = () => dialogActions.CLOSE_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG });\r