X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/232eac919b067a3783348eab549c9fc555b80abd..d8a3b5fdd6f606800e9b321acb3fca10c5183cb9:/src/views-components/collection-panel-files/collection-panel-files.ts diff --git a/src/views-components/collection-panel-files/collection-panel-files.ts b/src/views-components/collection-panel-files/collection-panel-files.ts index 0009fc0d..eb16eb6c 100644 --- a/src/views-components/collection-panel-files/collection-panel-files.ts +++ b/src/views-components/collection-panel-files/collection-panel-files.ts @@ -3,54 +3,75 @@ // SPDX-License-Identifier: AGPL-3.0 import { connect } from "react-redux"; -import { CollectionPanelFiles as Component, CollectionPanelFilesProps } from "../../components/collection-panel-files/collection-panel-files"; -import { RootState } from "../../store/store"; -import { TreeItemStatus, TreeItem } from "../../components/tree/tree"; -import { CollectionPanelFilesState, CollectionPanelDirectory, CollectionPanelFile } from "../../store/collection-panel/collection-panel-files/collection-panel-files-state"; -import { FileTreeData } from "../../components/file-tree/file-tree-data"; +import { + CollectionPanelFiles as Component, + CollectionPanelFilesProps +} from "~/components/collection-panel-files/collection-panel-files"; +import { RootState } from "~/store/store"; +import { TreeItem, TreeItemStatus } from "~/components/tree/tree"; +import { + CollectionPanelDirectory, + CollectionPanelFile, + CollectionPanelFilesState +} from "~/store/collection-panel/collection-panel-files/collection-panel-files-state"; +import { FileTreeData } from "~/components/file-tree/file-tree-data"; import { Dispatch } from "redux"; -import { collectionPanelFilesAction } from "../../store/collection-panel/collection-panel-files/collection-panel-files-actions"; -import { contextMenuActions } from "../../store/context-menu/context-menu-actions"; +import { collectionPanelFilesAction } from "~/store/collection-panel/collection-panel-files/collection-panel-files-actions"; import { ContextMenuKind } from "../context-menu/context-menu"; -import { Tree, getNodeChildren, getNode } from "../../models/tree"; -import { CollectionFileType } from "../../models/collection-file"; +import { getNode, getNodeChildrenIds, Tree, TreeNode, initTreeNode } from "~/models/tree"; +import { CollectionFileType, createCollectionDirectory } from "~/models/collection-file"; +import { openContextMenu, openCollectionFilesContextMenu } from '~/store/context-menu/context-menu-actions'; +import { openUploadCollectionFilesDialog } from '~/store/collections/collection-upload-actions'; +import { ResourceKind } from "~/models/resource"; +import { openDetailsPanel } from '~/store/details-panel/details-panel-action'; const memoizedMapStateToProps = () => { let prevState: CollectionPanelFilesState; let prevTree: Array>; - return (state: RootState): Pick => { + return (state: RootState): Pick => { if (prevState !== state.collectionPanelFiles) { prevState = state.collectionPanelFiles; - prevTree = getNodeChildren('')(state.collectionPanelFiles) + prevTree = getNodeChildrenIds('')(state.collectionPanelFiles) .map(collectionItemToTreeItem(state.collectionPanelFiles)); } return { - items: prevTree + items: prevTree, + currentItemUuid: state.detailsPanel.resourceUuid }; }; }; -const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ - onUploadDataClick: () => { return; }, +const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ + onUploadDataClick: () => { + dispatch(openUploadCollectionFilesDialog()); + }, onCollapseToggle: (id) => { dispatch(collectionPanelFilesAction.TOGGLE_COLLECTION_FILE_COLLAPSE({ id })); }, onSelectionToggle: (event, item) => { dispatch(collectionPanelFilesAction.TOGGLE_COLLECTION_FILE_SELECTION({ id: item.id })); }, - onItemMenuOpen: (event, item) => { - event.preventDefault(); - dispatch(contextMenuActions.OPEN_CONTEXT_MENU({ - position: { x: event.clientX, y: event.clientY }, - resource: { kind: ContextMenuKind.COLLECTION_FILES_ITEM, name: item.data.name, uuid: item.id } - })); + onItemMenuOpen: (event, item, isWritable) => { + dispatch(openContextMenu( + event, + { + menuKind: isWritable + ? ContextMenuKind.COLLECTION_FILES_ITEM + : ContextMenuKind.READONLY_COLLECTION_FILES_ITEM, + kind: ResourceKind.COLLECTION, + name: item.data.name, + uuid: item.id, + ownerUuid: '' + } + )); + }, + onOptionsMenuOpen: (event, isWritable) => { + dispatch(openCollectionFilesContextMenu(event, isWritable)); + }, + onFileClick: (id) => { + dispatch(openDetailsPanel(id)); }, - onOptionsMenuOpen: (event) => - dispatch(contextMenuActions.OPEN_CONTEXT_MENU({ - position: { x: event.clientX, y: event.clientY }, - resource: { kind: ContextMenuKind.COLLECTION_FILES, name: '', uuid: '' } - })) }); @@ -58,26 +79,25 @@ export const CollectionPanelFiles = connect(memoizedMapStateToProps(), mapDispat const collectionItemToTreeItem = (tree: Tree) => (id: string): TreeItem => { - const node = getNode(id)(tree) || { + const node: TreeNode = getNode(id)(tree) || initTreeNode({ id: '', - children: [], parent: '', value: { - name: 'Invalid node', - type: CollectionFileType.DIRECTORY, + ...createCollectionDirectory({ name: 'Invalid file' }), selected: false, collapsed: true } - }; + }); return { active: false, data: { name: node.value.name, size: node.value.type === CollectionFileType.FILE ? node.value.size : undefined, - type: node.value.type + type: node.value.type, + url: node.value.url, }, id: node.id, - items: getNodeChildren(node.id)(tree) + items: getNodeChildrenIds(node.id)(tree) .map(collectionItemToTreeItem(tree)), open: node.value.type === CollectionFileType.DIRECTORY ? !node.value.collapsed : false, selected: node.value.selected,