X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/be2f555375b863b5171cebe6375acb4c0267e818..f53d651573ef8c358cbdf38c7a56c6aed8178b61:/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 09fdd678..ccb18c8f 100644 --- a/src/views-components/collection-panel-files/collection-panel-files.ts +++ b/src/views-components/collection-panel-files/collection-panel-files.ts @@ -3,34 +3,39 @@ // 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 { CollectionPanelItem, CollectionPanelFilesState } 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 { 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 { 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, getNodeChildrenIds, getNode } from "~/models/tree"; +import { CollectionFileType } from "~/models/collection-file"; +import { openContextMenu } from '~/store/context-menu/context-menu-actions'; +import { openUploadCollectionFilesDialog } from '~/store/collections/collection-upload-actions'; -const mapStateToProps = () => { - let lastState: CollectionPanelFilesState; - let lastTree: Array>; +const memoizedMapStateToProps = () => { + let prevState: CollectionPanelFilesState; + let prevTree: Array>; return (state: RootState): Pick => { - if (lastState !== state.collectionPanelFiles) { - lastState = state.collectionPanelFiles; - lastTree = state.collectionPanelFiles - .filter(item => item.parentId === '') + if (prevState !== state.collectionPanelFiles) { + prevState = state.collectionPanelFiles; + prevTree = getNodeChildrenIds('')(state.collectionPanelFiles) .map(collectionItemToTreeItem(state.collectionPanelFiles)); } return { - items: lastTree + items: prevTree }; }; }; -const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ +const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ + onUploadDataClick: () => { + dispatch(openUploadCollectionFilesDialog()); + }, onCollapseToggle: (id) => { dispatch(collectionPanelFilesAction.TOGGLE_COLLECTION_FILE_COLLAPSE({ id })); }, @@ -38,36 +43,41 @@ const mapDispatchToProps = (dispatch: Dispatch): Pick { - 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 } - })); + dispatch(openContextMenu(event, { kind: ContextMenuKind.COLLECTION_FILES_ITEM, name: item.data.name, uuid: item.id })); + }, + onOptionsMenuOpen: (event) => { + dispatch(openContextMenu(event, { kind: ContextMenuKind.COLLECTION_FILES, name: '', uuid: '' })); }, - onOptionsMenuOpen: (event) => - dispatch(contextMenuActions.OPEN_CONTEXT_MENU({ - position: { x: event.clientX, y: event.clientY }, - resource: { kind: ContextMenuKind.COLLECTION_FILES, name: '', uuid: '' } - })) }); -export const CollectionPanelFiles = connect(mapStateToProps(), mapDispatchToProps)(Component); +export const CollectionPanelFiles = connect(memoizedMapStateToProps(), mapDispatchToProps)(Component); -const collectionItemToTreeItem = (items: CollectionPanelItem[]) => (item: CollectionPanelItem): TreeItem => { - return { - active: false, - data: { - name: item.name, - size: item.type === 'file' ? item.size : undefined, - type: item.type - }, - id: item.id, - items: items - .filter(i => i.parentId === item.id) - .map(collectionItemToTreeItem(items)), - open: item.type === 'directory' ? !item.collapsed : false, - selected: item.selected, - status: TreeItemStatus.LOADED +const collectionItemToTreeItem = (tree: Tree) => + (id: string): TreeItem => { + const node = getNode(id)(tree) || { + id: '', + children: [], + parent: '', + value: { + name: 'Invalid node', + type: CollectionFileType.DIRECTORY, + 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 + }, + id: node.id, + items: getNodeChildrenIds(node.id)(tree) + .map(collectionItemToTreeItem(tree)), + open: node.value.type === CollectionFileType.DIRECTORY ? !node.value.collapsed : false, + selected: node.value.selected, + status: TreeItemStatus.LOADED + }; }; -};