[ARVADOS-WORKBENCH2] updated: 1.1.4-524-ga06392b
Git user
git at public.curoverse.com
Mon Aug 6 12:46:00 EDT 2018
Summary of changes:
.../confirmation-dialog/confirmation-dialog.tsx | 45 ++++++++++++++++++++++
src/store/dialog/dialog-reducer.ts | 4 +-
src/store/dialog/with-dialog.ts | 4 +-
.../action-sets/collection-files-action-set.ts | 12 +++---
.../collection-files-item-action-set.ts | 8 ++--
.../file-remove-dialog/file-remove-dialog.ts | 38 ++++++++++++++++++
.../multiple-files-remove-dialog.ts | 37 ++++++++++++++++++
src/views/workbench/workbench.tsx | 7 ++--
8 files changed, 138 insertions(+), 17 deletions(-)
create mode 100644 src/components/confirmation-dialog/confirmation-dialog.tsx
create mode 100644 src/views-components/file-remove-dialog/file-remove-dialog.ts
create mode 100644 src/views-components/file-remove-dialog/multiple-files-remove-dialog.ts
via a06392b6e6c0ad1aa9e674b82a068c71ef2fb3a3 (commit)
from c797842bdaa32813315936961c0756cb76ce48a9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit a06392b6e6c0ad1aa9e674b82a068c71ef2fb3a3
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date: Mon Aug 6 18:45:44 2018 +0200
Implement file remove dialogs
Feature #13952
Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
diff --git a/src/components/confirmation-dialog/confirmation-dialog.tsx b/src/components/confirmation-dialog/confirmation-dialog.tsx
new file mode 100644
index 0000000..6e87416
--- /dev/null
+++ b/src/components/confirmation-dialog/confirmation-dialog.tsx
@@ -0,0 +1,45 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from "react";
+import { defaultTo, property } from 'lodash';
+import { Dialog, DialogTitle, DialogContent, DialogActions, Button, Typography, DialogContentText, CircularProgress } from "@material-ui/core";
+import { WithDialogProps } from "../../store/dialog/with-dialog";
+import { TextField } from "../text-field/text-field";
+
+export interface ConfirmationDialogDataProps {
+ title: string;
+ text: string;
+ cancelButtonLabel?: string;
+ confirmButtonLabel?: string;
+}
+
+export interface ConfirmationDialogProps {
+ onConfirm: () => void;
+}
+
+export const ConfirmationDialog = (props: ConfirmationDialogProps & WithDialogProps<ConfirmationDialogDataProps>) =>
+ <Dialog open={props.open}>
+ <DialogTitle>{props.data.title}</DialogTitle>
+ <DialogContent>
+ <DialogContentText>
+ {props.data.text}
+ </DialogContentText>
+ </DialogContent>
+ <DialogActions>
+ <Button
+ variant='flat'
+ color='primary'
+ onClick={props.closeDialog}>
+ {props.data.cancelButtonLabel || 'Cancel'}
+ </Button>
+ <Button
+ variant='contained'
+ color='primary'
+ type='submit'
+ onClick={props.onConfirm}>
+ {props.data.confirmButtonLabel || 'Ok'}
+ </Button>
+ </DialogActions>
+ </Dialog>;
diff --git a/src/store/dialog/dialog-reducer.ts b/src/store/dialog/dialog-reducer.ts
index e49f65d..34d38fd 100644
--- a/src/store/dialog/dialog-reducer.ts
+++ b/src/store/dialog/dialog-reducer.ts
@@ -8,7 +8,7 @@ export type DialogState = Record<string, Dialog>;
export interface Dialog {
open: boolean;
- data?: any;
+ data: any;
}
export const dialogReducer = (state: DialogState = {}, action: DialogAction) =>
@@ -16,7 +16,7 @@ export const dialogReducer = (state: DialogState = {}, action: DialogAction) =>
OPEN_DIALOG: ({ id, data }) => ({ ...state, [id]: { open: true, data } }),
CLOSE_DIALOG: ({ id }) => ({
...state,
- [id]: state[id] ? { ...state[id], open: false } : { open: false } }),
+ [id]: state[id] ? { ...state[id], open: false } : { open: false, data: {} } }),
default: () => state,
});
diff --git a/src/store/dialog/with-dialog.ts b/src/store/dialog/with-dialog.ts
index e42cd5b..d53a79d 100644
--- a/src/store/dialog/with-dialog.ts
+++ b/src/store/dialog/with-dialog.ts
@@ -10,7 +10,7 @@ import { dialogActions } from './dialog-actions';
export type WithDialogStateProps<T> = {
open: boolean;
- data?: T;
+ data: T;
};
export type WithDialogDispatchProps = {
@@ -25,7 +25,7 @@ export const withDialog = (id: string) =>
export const mapStateToProps = (id: string) => <T>(state: { dialog: DialogState }): WithDialogStateProps<T> => {
const dialog = state.dialog[id];
- return dialog ? dialog : { open: false };
+ return dialog ? dialog : { open: false, data: {} };
};
export const mapDispatchToProps = (id: string) => (dispatch: Dispatch): WithDialogDispatchProps => ({
diff --git a/src/views-components/context-menu/action-sets/collection-files-action-set.ts b/src/views-components/context-menu/action-sets/collection-files-action-set.ts
index 9396b9e..9b7bddf 100644
--- a/src/views-components/context-menu/action-sets/collection-files-action-set.ts
+++ b/src/views-components/context-menu/action-sets/collection-files-action-set.ts
@@ -4,7 +4,7 @@
import { ContextMenuActionSet } from "../context-menu-action-set";
import { collectionPanelFilesAction } from "../../../store/collection-panel/collection-panel-files/collection-panel-files-actions";
-import { openRemoveDialog } from "../../remove-dialog/remove-dialog";
+import { openMultipleFilesRemoveDialog } from "../../file-remove-dialog/multiple-files-remove-dialog";
export const collectionFilesActionSet: ContextMenuActionSet = [[{
@@ -12,22 +12,22 @@ export const collectionFilesActionSet: ContextMenuActionSet = [[{
execute: (dispatch) => {
dispatch(collectionPanelFilesAction.SELECT_ALL_COLLECTION_FILES());
}
-},{
+}, {
name: "Unselect all",
execute: (dispatch) => {
dispatch(collectionPanelFilesAction.UNSELECT_ALL_COLLECTION_FILES());
}
-},{
+}, {
name: "Remove selected",
execute: (dispatch, resource) => {
- dispatch(openRemoveDialog('selected files'));
+ dispatch(openMultipleFilesRemoveDialog());
}
-},{
+}, {
name: "Download selected",
execute: (dispatch, resource) => {
return;
}
-},{
+}, {
name: "Create a new collection with selected",
execute: (dispatch, resource) => {
return;
diff --git a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts
index 430eba3..19c9f7c 100644
--- a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts
+++ b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts
@@ -4,8 +4,8 @@
import { ContextMenuActionSet } from "../context-menu-action-set";
import { RenameIcon, DownloadIcon, RemoveIcon } from "../../../components/icon/icon";
-import { openRemoveDialog } from "../../remove-dialog/remove-dialog";
import { openRenameFileDialog } from "../../rename-file-dialog/rename-file-dialog";
+import { openFileRemoveDialog } from "../../file-remove-dialog/file-remove-dialog";
export const collectionFilesItemActionSet: ContextMenuActionSet = [[{
@@ -14,16 +14,16 @@ export const collectionFilesItemActionSet: ContextMenuActionSet = [[{
execute: (dispatch, resource) => {
dispatch(openRenameFileDialog(resource.name));
}
-},{
+}, {
name: "Download",
icon: DownloadIcon,
execute: (dispatch, resource) => {
return;
}
-},{
+}, {
name: "Remove",
icon: RemoveIcon,
execute: (dispatch, resource) => {
- dispatch(openRemoveDialog('selected file'));
+ dispatch(openFileRemoveDialog(resource.uuid));
}
}]];
diff --git a/src/views-components/file-remove-dialog/file-remove-dialog.ts b/src/views-components/file-remove-dialog/file-remove-dialog.ts
new file mode 100644
index 0000000..3678e53
--- /dev/null
+++ b/src/views-components/file-remove-dialog/file-remove-dialog.ts
@@ -0,0 +1,38 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { Dispatch } from "redux";
+import { connect } from "react-redux";
+import { ConfirmationDialog } from "../../components/confirmation-dialog/confirmation-dialog";
+import { withDialog } from "../../store/dialog/with-dialog";
+import { dialogActions } from "../../store/dialog/dialog-actions";
+import { snackbarActions } from "../../store/snackbar/snackbar-actions";
+
+const FILE_REMOVE_DIALOG = 'fileRemoveDialog';
+
+const mapDispatchToProps = (dispatch: Dispatch) => ({
+ onConfirm: () => {
+ // TODO: dispatch action that removes single file
+ dispatch(dialogActions.CLOSE_DIALOG({ id: FILE_REMOVE_DIALOG }));
+ dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removing file...', hideDuration: 2000 }));
+ setTimeout(() => {
+ dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'File removed.', hideDuration: 2000 }));
+ }, 1000);
+ }
+});
+
+export const openFileRemoveDialog = (fileId: string) =>
+ dialogActions.OPEN_DIALOG({
+ id: FILE_REMOVE_DIALOG,
+ data: {
+ title: 'Removing file',
+ text: 'Are you sure you want to remove this file?',
+ confirmButtonLabel: 'Remove',
+ fileId
+ }
+ });
+
+export const [FileRemoveDialog] = [ConfirmationDialog]
+ .map(withDialog(FILE_REMOVE_DIALOG))
+ .map(connect(undefined, mapDispatchToProps));
\ No newline at end of file
diff --git a/src/views-components/file-remove-dialog/multiple-files-remove-dialog.ts b/src/views-components/file-remove-dialog/multiple-files-remove-dialog.ts
new file mode 100644
index 0000000..8810e23
--- /dev/null
+++ b/src/views-components/file-remove-dialog/multiple-files-remove-dialog.ts
@@ -0,0 +1,37 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { Dispatch } from "redux";
+import { connect } from "react-redux";
+import { ConfirmationDialog } from "../../components/confirmation-dialog/confirmation-dialog";
+import { withDialog } from "../../store/dialog/with-dialog";
+import { dialogActions } from "../../store/dialog/dialog-actions";
+import { snackbarActions } from "../../store/snackbar/snackbar-actions";
+
+const MULTIPLE_FILES_REMOVE_DIALOG = 'multipleFilesRemoveDialog';
+
+const mapDispatchToProps = (dispatch: Dispatch) => ({
+ onConfirm: () => {
+ // TODO: dispatch action that removes multiple files
+ dispatch(dialogActions.CLOSE_DIALOG({ id: MULTIPLE_FILES_REMOVE_DIALOG }));
+ dispatch(snackbarActions.OPEN_SNACKBAR({message: 'Removing files...', hideDuration: 2000}));
+ setTimeout(() => {
+ dispatch(snackbarActions.OPEN_SNACKBAR({message: 'Files removed.', hideDuration: 2000}));
+ }, 1000);
+ }
+});
+
+export const openMultipleFilesRemoveDialog = () =>
+ dialogActions.OPEN_DIALOG({
+ id: MULTIPLE_FILES_REMOVE_DIALOG,
+ data: {
+ title: 'Removing files',
+ text: 'Are you sure you want to remove selected files?',
+ confirmButtonLabel: 'Remove'
+ }
+ });
+
+export const [MultipleFilesRemoveDialog] = [ConfirmationDialog]
+ .map(withDialog(MULTIPLE_FILES_REMOVE_DIALOG))
+ .map(connect(undefined, mapDispatchToProps));
\ No newline at end of file
diff --git a/src/views/workbench/workbench.tsx b/src/views/workbench/workbench.tsx
index 34a9fe5..7f6a8c6 100644
--- a/src/views/workbench/workbench.tsx
+++ b/src/views/workbench/workbench.tsx
@@ -34,17 +34,17 @@ import { ResourceKind } from '../../models/resource';
import { ContextMenu, ContextMenuKind } from "../../views-components/context-menu/context-menu";
import { FavoritePanel } from "../favorite-panel/favorite-panel";
import { CurrentTokenDialog } from '../../views-components/current-token-dialog/current-token-dialog';
-import { dataExplorerActions } from '../../store/data-explorer/data-explorer-action';
import { Snackbar } from '../../views-components/snackbar/snackbar';
import { favoritePanelActions } from '../../store/favorite-panel/favorite-panel-action';
import { CreateCollectionDialog } from '../../views-components/create-collection-dialog/create-collection-dialog';
import { CollectionPanel } from '../collection-panel/collection-panel';
import { loadCollection } from '../../store/collection-panel/collection-panel-action';
import { getCollectionUrl } from '../../models/collection';
-import { RemoveDialog } from '../../views-components/remove-dialog/remove-dialog';
import { UpdateCollectionDialog } from '../../views-components/update-collection-dialog/update-collection-dialog.';
import { AuthService } from "../../services/auth-service/auth-service";
import { RenameFileDialog } from '../../views-components/rename-file-dialog/rename-file-dialog';
+import { FileRemoveDialog } from '../../views-components/file-remove-dialog/file-remove-dialog';
+import { MultipleFilesRemoveDialog } from '../../views-components/file-remove-dialog/multiple-files-remove-dialog';
const DRAWER_WITDH = 240;
const APP_BAR_HEIGHT = 100;
@@ -234,8 +234,9 @@ export const Workbench = withStyles(styles)(
<Snackbar />
<CreateProjectDialog />
<CreateCollectionDialog />
- <RemoveDialog />
<RenameFileDialog />
+ <FileRemoveDialog />
+ <MultipleFilesRemoveDialog />
<UpdateCollectionDialog />
<CurrentTokenDialog
currentToken={this.props.currentToken}
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list