--- /dev/null
+// 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>;
export interface Dialog {
open: boolean;
- data?: any;
+ data: any;
}
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,
});
export type WithDialogStateProps<T> = {
open: boolean;
- data?: T;
+ data: T;
};
export type WithDialogDispatchProps = {
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 => ({
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 = [[{
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;
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 = [[{
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));
}
}]];
--- /dev/null
+// 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
--- /dev/null
+// 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
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;
<Snackbar />
<CreateProjectDialog />
<CreateCollectionDialog />
- <RemoveDialog />
<RenameFileDialog />
+ <FileRemoveDialog />
+ <MultipleFilesRemoveDialog />
<UpdateCollectionDialog />
<CurrentTokenDialog
currentToken={this.props.currentToken}