defaultvalue in input
authorPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Mon, 20 Aug 2018 13:10:46 +0000 (15:10 +0200)
committerPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Mon, 20 Aug 2018 13:10:46 +0000 (15:10 +0200)
Feature #13988

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

15 files changed:
1  2 
src/components/make-a-copy/make-a-copy.tsx
src/components/tree/tree.tsx
src/index.tsx
src/store/project-tree-picker/project-tree-picker-actions.ts
src/store/tree-picker/tree-picker-actions.ts
src/store/tree-picker/tree-picker-reducer.ts
src/validators/validators.tsx
src/views-components/context-menu/action-sets/collection-action-set.ts
src/views-components/context-menu/action-sets/collection-resource-action-set.ts
src/views-components/context-menu/action-sets/project-action-set.ts
src/views-components/create-collection-dialog-with-selected/create-collection-dialog-with-selected.tsx
src/views-components/make-a-copy-dialog/make-a-copy-dialog.tsx
src/views-components/move-to-dialog/move-to-dialog.tsx
src/views-components/project-tree-picker/project-tree-picker.tsx
src/views/workbench/workbench.tsx

index 58fd803188fc5de6bccb0538a37fa635196709bb,0000000000000000000000000000000000000000..98be8ef9efed061549dc959a338e06fbe11cded7
mode 100644,000000..100644
--- /dev/null
@@@ -1,50 -1,0 +1,57 @@@
- export const MakeACopyDialog = (props: WithDialogProps<string> & InjectedFormProps<{ name: string }>) =>
 +// Copyright (C) The Arvados Authors. All rights reserved.
 +//
 +// SPDX-License-Identifier: AGPL-3.0
 +import * as React from "react";
 +import { Field, InjectedFormProps, WrappedFieldProps } from "redux-form";
 +import { Dialog, DialogTitle, DialogContent, DialogActions, Button, CircularProgress } from "@material-ui/core";
 +import { WithDialogProps } from "~/store/dialog/with-dialog";
 +import { ProjectTreePicker } from "~/views-components/project-tree-picker/project-tree-picker";
 +import { MAKE_A_COPY_VALIDATION, COPY_NAME_VALIDATION } from "~/validators/validators";
 +import { TextField } from '~/components/text-field/text-field';
-                     name="copyName"
++
++export  interface CopyFormData {
++    name: string;
++    projectUuid: string;
++    uuid: string;
++}
++
++export const MakeACopyDialog = (props: WithDialogProps<string> & InjectedFormProps<CopyFormData>) =>
 +    <form>
 +        <Dialog open={props.open}
 +            disableBackdropClick={true}
 +            disableEscapeKeyDown={true}>
 +            <DialogTitle>Make a copy</DialogTitle>
 +            <DialogContent>
 +                <Field
++                    name="name"
 +                    component={TextField}
 +                    validate={COPY_NAME_VALIDATION}
 +                    label="Enter a new name for the copy" />
 +                <Field
 +                    name="projectUuid"
 +                    component={Picker}
 +                    validate={MAKE_A_COPY_VALIDATION} />
 +            </DialogContent>
 +            <DialogActions>
 +                <Button
 +                    variant='flat'
 +                    color='primary'
 +                    disabled={props.submitting}
 +                    onClick={props.closeDialog}>
 +                    Cancel
 +                    </Button>
 +                <Button
 +                    variant='contained'
 +                    color='primary'
 +                    type='submit'
 +                    onClick={props.handleSubmit}
 +                    disabled={props.pristine || props.invalid || props.submitting}>
 +                    {props.submitting ? <CircularProgress size={20} /> : 'Copy'}
 +                </Button>
 +            </DialogActions>
 +        </Dialog>
 +    </form>;
 +const Picker = (props: WrappedFieldProps) =>
 +    <div style={{ width: '400px', height: '144px', display: 'flex', flexDirection: 'column' }}>
 +        <ProjectTreePicker onChange={projectUuid => props.input.onChange(projectUuid)} />
 +    </div>; 
index 3e8cf904cfaae2274d1273bb81f1f77048b34c2a,263249588b45f5a5cbcd47caa2b231c2500ca315..6b127530a095a0c8e1ab692462d8f6bf0bff98d9
@@@ -140,6 -140,10 +140,10 @@@ export const Tree = withStyles(styles)
              </List>;
          }
  
 -            return status === TreeItemStatus.PENDING || (status === TreeItemStatus.LOADED && !items) ? <span /> : <SidePanelRightArrowIcon />;
+         getProperArrowAnimation = (status: string, items: Array<TreeItem<T>>) => {
++            return status === TreeItemStatus.PENDING || (status === TreeItemStatus.LOADED && !items) || (status === TreeItemStatus.LOADED && items && items.length === 0) ? <span /> : <SidePanelRightArrowIcon />;
+         }
          getToggableIconClassNames = (isOpen?: boolean, isActive?: boolean) => {
              const { iconOpen, iconClose, active, toggableIcon } = this.props.classes;
              return classnames(toggableIcon, {
diff --cc src/index.tsx
index 443e76f3e62a42597d804aefd779b32b3f65ffa9,fcc02f1e73088f18b2af30d74da1c7c1647ab400..f5b1464eb898010719eb98a10bb3103f483d514f
@@@ -27,6 -27,7 +27,7 @@@ import { collectionFilesActionSet } fro
  import { collectionFilesItemActionSet } from './views-components/context-menu/action-sets/collection-files-item-action-set';
  import { collectionActionSet } from './views-components/context-menu/action-sets/collection-action-set';
  import { collectionResourceActionSet } from './views-components/context-menu/action-sets/collection-resource-action-set';
 -import { initPickerProjectTree } from './views-components/project-tree-picker/project-tree-picker';
++import { initPickerProjectTree } from './store/project-tree-picker/project-tree-picker-actions';
  
  const getBuildNumber = () => "BN-" + (process.env.BUILD_NUMBER || "dev");
  const getGitCommit = () => "GIT-" + (process.env.GIT_COMMIT || "latest").substr(0, 7);
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..86d9a18d88f115930ceaa093aaf061f856bdaea2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,46 @@@
++// Copyright (C) The Arvados Authors. All rights reserved.
++//
++// SPDX-License-Identifier: AGPL-3.0
++
++import { Dispatch } from "redux";
++import { RootState } from "~/store/store";
++import { ServiceRepository } from "~/services/services";
++import { TreePickerId, receiveTreePickerData } from "~/views-components/project-tree-picker/project-tree-picker";
++import { mockProjectResource } from "~/models/test-utils";
++import { treePickerActions } from "~/store/tree-picker/tree-picker-actions";
++
++export const resetPickerProjectTree = () => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
++    dispatch<any>(treePickerActions.RESET_TREE_PICKER({pickerId: TreePickerId.PROJECTS}));
++    dispatch<any>(treePickerActions.RESET_TREE_PICKER({pickerId: TreePickerId.SHARED_WITH_ME}));
++    dispatch<any>(treePickerActions.RESET_TREE_PICKER({pickerId: TreePickerId.FAVORITES}));
++
++    dispatch<any>(initPickerProjectTree());
++};
++
++export const initPickerProjectTree = () => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
++    const uuid = services.authService.getUuid();
++
++    dispatch<any>(getPickerTreeProjects(uuid));
++    dispatch<any>(getSharedWithMeProjectsPickerTree(uuid));
++    dispatch<any>(getFavoritesProjectsPickerTree(uuid));
++};
++
++const getPickerTreeProjects = (uuid: string = '') => {
++    return getProjectsPickerTree(uuid, TreePickerId.PROJECTS);
++};
++
++const getSharedWithMeProjectsPickerTree = (uuid: string = '') => {
++    return getProjectsPickerTree(uuid, TreePickerId.SHARED_WITH_ME);
++};
++
++const getFavoritesProjectsPickerTree = (uuid: string = '') => {
++    return getProjectsPickerTree(uuid, TreePickerId.FAVORITES);
++};
++
++const getProjectsPickerTree = (uuid: string, kind: string) => {
++    return receiveTreePickerData(
++        '',
++        [mockProjectResource({ uuid, name: kind })],
++        kind
++    );
++};
index e3bebe1c858f6e9a6ef7017de35b6162e72a745d,e1e8d5c620325212df2426f57e4a1776e1be6b6f..34f1303717e0097a723c4851af8e94481f4f213d
@@@ -6,10 -7,10 +7,11 @@@ import { default as unionize, ofType, U
  import { TreePickerNode } from "./tree-picker";
  
  export const treePickerActions = unionize({
-     LOAD_TREE_PICKER_NODE: ofType<{ id: string }>(),
-     LOAD_TREE_PICKER_NODE_SUCCESS: ofType<{ id: string, nodes: Array<TreePickerNode> }>(),
-     TOGGLE_TREE_PICKER_NODE_COLLAPSE: ofType<{ id: string }>(),
-     TOGGLE_TREE_PICKER_NODE_SELECT: ofType<{ id: string }>()
+     LOAD_TREE_PICKER_NODE: ofType<{ nodeId: string, pickerId: string }>(),
+     LOAD_TREE_PICKER_NODE_SUCCESS: ofType<{ nodeId: string, nodes: Array<TreePickerNode>, pickerId: string }>(),
+     TOGGLE_TREE_PICKER_NODE_COLLAPSE: ofType<{ nodeId: string, pickerId: string }>(),
 -    TOGGLE_TREE_PICKER_NODE_SELECT: ofType<{ nodeId: string, pickerId: string }>()
++    TOGGLE_TREE_PICKER_NODE_SELECT: ofType<{ nodeId: string, pickerId: string }>(),
++    RESET_TREE_PICKER: ofType<{ pickerId: string }>()
  }, {
          tag: 'type',
          value: 'payload'
index 8d61714cc9f744929587dd7f96f613ba18120f67,6a87fb4c77b17ac3d1ad8c2e898c3468e38c7e85..e7173d22ac73832403cb486c345f41b6f106946b
@@@ -6,21 -6,18 +6,20 @@@ import { createTree, setNodeValueWith, 
  import { TreePicker, TreePickerNode } from "./tree-picker";
  import { treePickerActions, TreePickerAction } from "./tree-picker-actions";
  import { TreeItemStatus } from "~/components/tree/tree";
+ import { compose } from "redux";
  
- export const treePickerReducer = (state: TreePicker = createTree(), action: TreePickerAction) =>
+ export const treePickerReducer = (state: TreePicker = {}, action: TreePickerAction) =>
      treePickerActions.match(action, {
-         LOAD_TREE_PICKER_NODE: ({ id }) =>
-             setNodeValueWith(setPending)(id)(state),
-         LOAD_TREE_PICKER_NODE_SUCCESS: ({ id, nodes }) => {
-             const [newState] = [state]
-                 .map(receiveNodes(nodes)(id))
-                 .map(setNodeValueWith(setLoaded)(id));
-             return newState;
-         },
-         TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ id }) =>
-             setNodeValueWith(toggleCollapse)(id)(state),
-         TOGGLE_TREE_PICKER_NODE_SELECT: ({ id }) =>
-             mapTreeValues(toggleSelect(id))(state),
+         LOAD_TREE_PICKER_NODE: ({ nodeId, pickerId }) =>
+             updateOrCreatePicker(state, pickerId, setNodeValueWith(setPending)(nodeId)),
 -        LOAD_TREE_PICKER_NODE_SUCCESS: ({ nodeId, nodes, pickerId }) => 
 -            updateOrCreatePicker(state, pickerId, compose(receiveNodes(nodes)(nodeId),setNodeValueWith(setLoaded)(nodeId))),
 -        TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ nodeId, pickerId }) => 
++        LOAD_TREE_PICKER_NODE_SUCCESS: ({ nodeId, nodes, pickerId }) =>
++            updateOrCreatePicker(state, pickerId, compose(receiveNodes(nodes)(nodeId), setNodeValueWith(setLoaded)(nodeId))),
++        TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ nodeId, pickerId }) =>
+             updateOrCreatePicker(state, pickerId, setNodeValueWith(toggleCollapse)(nodeId)),
 -        TOGGLE_TREE_PICKER_NODE_SELECT: ({ nodeId, pickerId }) => 
++        TOGGLE_TREE_PICKER_NODE_SELECT: ({ nodeId, pickerId }) =>
+             updateOrCreatePicker(state, pickerId, mapTreeValues(toggleSelect(nodeId))),
++        RESET_TREE_PICKER: ({ pickerId }) => 
++            updateOrCreatePicker(state, pickerId, createTree),
          default: () => state
      });
  
index f9dd354ea52f5bb9bb5dd26567be054b09211ab8,389e8cdfd140cd32b6e372a5bee3c0352680e8f4..106c74da76f054a5dc8af4d615c4f316592fb623
@@@ -15,5 -15,4 +15,7 @@@ export const COLLECTION_NAME_VALIDATIO
  export const COLLECTION_DESCRIPTION_VALIDATION = [maxLength(255)];
  export const COLLECTION_PROJECT_VALIDATION = [require];
  
 -export const MOVE_TO_VALIDATION = [require];
 +export const COPY_NAME_VALIDATION = [require, maxLength(255)];
- export const MAKE_A_COPY_VALIDATION = [require, maxLength(255)];
++export const MAKE_A_COPY_VALIDATION = [require, maxLength(255)];
++
++export const MOVE_TO_VALIDATION = [require];
index e2b579cdef4787d3ef8e5633a7a70791582940f2,9c07fb0551eab71995d7f488f74d1a6292af9128..240590684dc62798c1907dc19ffac2a9f4085644
@@@ -8,7 -8,7 +8,9 @@@ import { toggleFavorite } from "~/store
  import { RenameIcon, ShareIcon, MoveToIcon, CopyIcon, DetailsIcon, ProvenanceGraphIcon, AdvancedIcon, RemoveIcon } from "~/components/icon/icon";
  import { openUpdater } from "~/store/collections/updater/collection-updater-action";
  import { favoritePanelActions } from "~/store/favorite-panel/favorite-panel-action";
- import { openMakeACopyDialog } from "~/views-components/make-a-copy-dialog/make-a-copy-dialog";
++import { openMakeACopyDialog, MAKE_A_COPY_DIALOG } from "~/views-components/make-a-copy-dialog/make-a-copy-dialog";
+ import { openMoveToDialog } from "../../move-to-dialog/move-to-dialog";
++import { reset } from 'redux-form';
  
  export const collectionActionSet: ContextMenuActionSet = [[
      {
      {
          icon: CopyIcon,
          name: "Copy to project",
-         execute: dispatch => dispatch<any>(openMakeACopyDialog())
+         execute: (dispatch, resource) => {
 -            // add code
++            dispatch(reset(MAKE_A_COPY_DIALOG));
++            dispatch<any>(openMakeACopyDialog({name: resource.name, projectUuid: resource.uuid}));
+         }
      },
      {
          icon: DetailsIcon,
index 846e3c92f4089bbe2e1687fb1b783ef861d285cb,337ca2ff95fd261864476a8da72239442e4f718b..ea61d269c686d99ce398d18ee434fc140f08eaa7
@@@ -8,7 -8,7 +8,9 @@@ import { toggleFavorite } from "~/store
  import { RenameIcon, ShareIcon, MoveToIcon, CopyIcon, DetailsIcon, RemoveIcon } from "~/components/icon/icon";
  import { openUpdater } from "~/store/collections/updater/collection-updater-action";
  import { favoritePanelActions } from "~/store/favorite-panel/favorite-panel-action";
- import { openMakeACopyDialog } from "~/views-components/make-a-copy-dialog/make-a-copy-dialog";
 -import { openMoveToDialog } from "../../move-to-dialog/move-to-dialog";
++import { openMakeACopyDialog, MAKE_A_COPY_DIALOG } from "~/views-components/make-a-copy-dialog/make-a-copy-dialog";
++import { openMoveToDialog } from '../../move-to-dialog/move-to-dialog';
++import { reset } from 'redux-form';
  
  export const collectionResourceActionSet: ContextMenuActionSet = [[
      {
      {
          icon: CopyIcon,
          name: "Copy to project",
-         execute: dispatch => dispatch<any>(openMakeACopyDialog())
+         execute: (dispatch, resource) => {
 -            // add code
 -        }
++            dispatch(reset(MAKE_A_COPY_DIALOG));
++            dispatch<any>(openMakeACopyDialog({name: resource.name, projectUuid: resource.uuid}));
++        },
      },
      {
          icon: DetailsIcon,
index 5903d87fb80e3e05993e4cb58a0992d052d0d276,efba457821db1621e1dbe51426a49cc68c155bcc..d4a3fa16e3b3cb636676a223744a97bbcce03ac8
@@@ -6,12 -6,12 +6,13 @@@ import { reset, initialize } from "redu
  
  import { ContextMenuActionSet } from "../context-menu-action-set";
  import { projectActions, PROJECT_FORM_NAME } from "~/store/project/project-action";
- import { NewProjectIcon, RenameIcon, CopyIcon } from "~/components/icon/icon";
 -import { NewProjectIcon, MoveToIcon, RenameIcon } from "~/components/icon/icon";
++import { NewProjectIcon, RenameIcon, CopyIcon, MoveToIcon } from "~/components/icon/icon";
  import { ToggleFavoriteAction } from "../actions/favorite-action";
  import { toggleFavorite } from "~/store/favorites/favorites-actions";
  import { favoritePanelActions } from "~/store/favorite-panel/favorite-panel-action";
+ import { openMoveToDialog } from "../../move-to-dialog/move-to-dialog";
  import { PROJECT_CREATE_DIALOG } from "../../dialog-create/dialog-project-create";
- import { openMakeACopyDialog } from "~/views-components/make-a-copy-dialog/make-a-copy-dialog";
++import { openMakeACopyDialog, MAKE_A_COPY_DIALOG } from "~/views-components/make-a-copy-dialog/make-a-copy-dialog";
  
  export const projectActionSet: ContextMenuActionSet = [[
      {
              });
          }
      },
 -        execute: dispatch => dispatch<any>(openMoveToDialog())
+     {
+         icon: MoveToIcon,
+         name: "Move to",
-         execute: dispatch => dispatch<any>(openMakeACopyDialog())
-     },
++        execute: dispatch => dispatch<any>(openMoveToDialog())       
+     },
 +    {
 +        icon: CopyIcon,
 +        name: "Copy to project",
++        execute: (dispatch, resource) => {
++            dispatch(reset(MAKE_A_COPY_DIALOG));
++            dispatch<any>(openMakeACopyDialog({name: resource.name, projectUuid: resource.uuid}));
++        }
++    }
  ]];
index 46bc724d7704fdaa067640f8a17675774788d4c7,60ce05c7eab6b8040f6517040de9e2779d8d0074..fb5f094b68ffad5e9c458aa60f4d1355b78a46c5
@@@ -7,14 -7,12 +7,14 @@@ import { reduxForm, reset, startSubmit
  import { withDialog } from "~/store/dialog/with-dialog";
  import { dialogActions } from "~/store/dialog/dialog-actions";
  import { DialogCollectionCreateWithSelected } from "../dialog-create/dialog-collection-create-selected";
- import { loadProjectTreePickerProjects } from "../project-tree-picker/project-tree-picker";
++import { resetPickerProjectTree } from "~/store/project-tree-picker/project-tree-picker-actions";
  
  export const DIALOG_COLLECTION_CREATE_WITH_SELECTED = 'dialogCollectionCreateWithSelected';
  
  export const createCollectionWithSelected = () =>
      (dispatch: Dispatch) => {
          dispatch(reset(DIALOG_COLLECTION_CREATE_WITH_SELECTED));
-         dispatch<any>(loadProjectTreePickerProjects(''));
++        dispatch<any>(resetPickerProjectTree());
          dispatch(dialogActions.OPEN_DIALOG({ id: DIALOG_COLLECTION_CREATE_WITH_SELECTED, data: {} }));
      };
  
index 9861173527f93d69dd29394d8506baa52c90f4a4,0000000000000000000000000000000000000000..8dd19d929af6b8d3a2a44a8b38ba8692e6af5b6b
mode 100644,000000..100644
--- /dev/null
@@@ -1,24 -1,0 +1,28 @@@
- import { MakeACopyDialog } from "../../components/make-a-copy/make-a-copy";
- import { reduxForm, startSubmit, stopSubmit } from "redux-form";
 +// Copyright (C) The Arvados Authors. All rights reserved.
 +//
 +// SPDX-License-Identifier: AGPL-3.0
 +import { Dispatch, compose } from "redux";
 +import { withDialog } from "../../store/dialog/with-dialog";
 +import { dialogActions } from "../../store/dialog/dialog-actions";
-  export const MAKE_A_COPY_DIALOG = 'makeACopyDialog';
-  export const openMakeACopyDialog = () =>
++import { MakeACopyDialog, CopyFormData } from "../../components/make-a-copy/make-a-copy";
++import { reduxForm, startSubmit, stopSubmit, initialize } from 'redux-form';
++import { resetPickerProjectTree } from "~/store/project-tree-picker/project-tree-picker-actions";
 +
-  export const MakeACopyToProjectDialog = compose(
++export const MAKE_A_COPY_DIALOG = 'makeACopyDialog';
++export const openMakeACopyDialog = (data: {projectUuid: string, name: string}) =>
 +    (dispatch: Dispatch) => {
++        dispatch<any>(resetPickerProjectTree());
++        const initialData: CopyFormData = {name: "Copy of: " + data.name, projectUuid: '', uuid: data.projectUuid};
++        dispatch<any>(initialize(MAKE_A_COPY_DIALOG, initialData));
 +        dispatch(dialogActions.OPEN_DIALOG({ id: MAKE_A_COPY_DIALOG, data: {} }));
 +    };
++export const MakeACopyToProjectDialog = compose(
 +    withDialog(MAKE_A_COPY_DIALOG),
 +    reduxForm({
 +        form: MAKE_A_COPY_DIALOG,
 +        onSubmit: (data, dispatch) => {
 +            dispatch(startSubmit(MAKE_A_COPY_DIALOG));
 +            setTimeout(() => dispatch(stopSubmit(MAKE_A_COPY_DIALOG, { name: 'Invalid path' })), 2000);
 +        }
 +    })
 +)(MakeACopyDialog);
index 0000000000000000000000000000000000000000,59396625754045f0ac4775f13bfa409b53bcc46d..dbc402b0f4504faa4ee1035679164b4d81ebdc1d
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,27 +1,29 @@@
+ // Copyright (C) The Arvados Authors. All rights reserved.
+ //
+ // SPDX-License-Identifier: AGPL-3.0
+ import { Dispatch, compose } from "redux";
+ import { withDialog } from "../../store/dialog/with-dialog";
+ import { dialogActions } from "../../store/dialog/dialog-actions";
+ import { MoveToDialog } from "../../components/move-to-dialog/move-to-dialog";
+ import { reduxForm, startSubmit, stopSubmit } from "redux-form";
++import { resetPickerProjectTree } from "~/store/project-tree-picker/project-tree-picker-actions";
+ export const MOVE_TO_DIALOG = 'moveToDialog';
+ export const openMoveToDialog = () =>
+     (dispatch: Dispatch) => {
++        dispatch<any>(resetPickerProjectTree());
+         dispatch(dialogActions.OPEN_DIALOG({ id: MOVE_TO_DIALOG, data: {} }));
+     };
+ export const MoveToProjectDialog = compose(
+     withDialog(MOVE_TO_DIALOG),
+     reduxForm({
+         form: MOVE_TO_DIALOG,
+         onSubmit: (data, dispatch) => {
+             dispatch(startSubmit(MOVE_TO_DIALOG));
+             setTimeout(() => dispatch(stopSubmit(MOVE_TO_DIALOG, { name: 'Invalid path' })), 2000);
+         }
+     })
+ )(MoveToDialog);
index 9143c47a2da5efe25b4d983015946706a8487c7f,30acf2a731da415362fc783cc157879e91f73df9..cc27806bbe8e4bf4c19f428567355e3ad51bf414
@@@ -16,18 -16,20 +16,19 @@@ import { createTreePickerNode } from "~
  import { RootState } from "~/store/store";
  import { ServiceRepository } from "~/services/services";
  import { FilterBuilder } from "~/common/api/filter-builder";
 -import { mockProjectResource } from "~/models/test-utils";
  
- type ProjectTreePickerProps = Pick<TreeProps<ProjectResource>, 'toggleItemActive' | 'toggleItemOpen'>;
+ type ProjectTreePickerProps = Pick<TreePickerProps, 'toggleItemActive' | 'toggleItemOpen'>;
  
- const mapDispatchToProps = (dispatch: Dispatch, props: {onChange: (projectUuid: string) => void}): ProjectTreePickerProps => ({
-     toggleItemActive: id => {
-         dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_SELECT({ id }));
-         props.onChange(id);
+ const mapDispatchToProps = (dispatch: Dispatch, props: { onChange: (projectUuid: string) => void }): ProjectTreePickerProps => ({
+     toggleItemActive: (nodeId, status, pickerId) => {
+         getNotSelectedTreePickerKind(pickerId)
+             .forEach(pickerId => dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_SELECT({ nodeId: '', pickerId })));
+         dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_SELECT({ nodeId, pickerId }));
+         props.onChange(nodeId);
      },
-     toggleItemOpen: (id, status) => {
-         status === TreeItemStatus.INITIAL
-             ? dispatch<any>(loadProjectTreePickerProjects(id))
-             : dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_COLLAPSE({ id }));
+     toggleItemOpen: (nodeId, status, pickerId) => {
+         dispatch<any>(toggleItemOpen(nodeId, status, pickerId));
      }
  });
  
@@@ -64,12 -129,44 +128,17 @@@ const renderTreeItem = (item: TreeItem<
          isActive={item.active}
          hasMargin={true} />;
  
  // TODO: move action creator to store directory
const receiveProjectTreePickerData = (id: string, projects: ProjectResource[]) =>
export const receiveTreePickerData = (nodeId: string, projects: ProjectResource[], pickerId: string) =>
      (dispatch: Dispatch) => {
          dispatch(treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({
-             id,
-             nodes: projects.map(project => createTreePickerNode({ id: project.uuid, value: project }))
+             nodeId,
+             nodes: projects.map(project => createTreePickerNode({ nodeId: project.uuid, value: project })),
+             pickerId,
          }));
-         dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_COLLAPSE({ id }));
+         dispatch(treePickerActions.TOGGLE_TREE_PICKER_NODE_COLLAPSE({ nodeId, pickerId }));
      };
 -export const initPickerProjectTree = () => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
 -    const uuid = services.authService.getUuid();
 -
 -    dispatch<any>(getPickerTreeProjects(uuid));
 -    dispatch<any>(getSharedWithMeProjectsPickerTree(uuid));
 -    dispatch<any>(getFavoritesProjectsPickerTree(uuid));
 -};
 -
 -const getPickerTreeProjects = (uuid: string = '') => {
 -    return getProjectsPickerTree(uuid, TreePickerId.PROJECTS);
 -};
 -
 -const getSharedWithMeProjectsPickerTree = (uuid: string = '') => {
 -    return getProjectsPickerTree(uuid, TreePickerId.SHARED_WITH_ME);
 -};
 -
 -const getFavoritesProjectsPickerTree = (uuid: string = '') => {
 -    return getProjectsPickerTree(uuid, TreePickerId.FAVORITES);
 -};
 -
 -const getProjectsPickerTree = (uuid: string, kind: string) => {
 -    return receiveTreePickerData(
 -        '',
 -        [mockProjectResource({ uuid, name: kind })],
 -        kind
 -    );
 -};
index b16d4b255931467e14c2ab3076ad4db8b889c494,3e0ed55ff3d9f605fa20846af70e6de8a570d336..084e9bbc0d720171cc729f550b558eb16ae6cc87
@@@ -244,9 -244,9 +245,10 @@@ export const Workbench = withStyles(sty
                          <CreateProjectDialog />
                          <CreateCollectionDialog />
                          <RenameFileDialog />
+                         <MoveToProjectDialog />
                          <DialogCollectionCreateWithSelectedFile />
                          <FileRemoveDialog />
 +                        <MakeACopyToProjectDialog />
                          <MultipleFilesRemoveDialog />
                          <UpdateCollectionDialog />
                          <UploadCollectionFilesDialog />