X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/9072585569eedc1ed276ade47fe9ca16447aff39..e92207c912aed73a07340b5fb2a9e2cb23e1da5f:/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 e61007a4..e0798086 100644 --- a/src/views-components/collection-panel-files/collection-panel-files.ts +++ b/src/views-components/collection-panel-files/collection-panel-files.ts @@ -3,53 +3,144 @@ // 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 } from "../../components/tree/tree"; +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 { ContextMenuKind } from "../context-menu/context-menu"; +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 mapStateToProps = (state: RootState): Pick => ({ - items: [{ - active: false, - data: { - name: "Directory 1", - type: "directory" - }, - id: "Directory 1", - open: true, - status: TreeItemStatus.LOADED, - items: [{ - active: false, - data: { - name: "Directory 1.1", - type: "directory" - }, - id: "Directory 1.1", - open: false, - status: TreeItemStatus.LOADED, - items: [] - }, { +const memoizedMapStateToProps = () => { + let prevState: CollectionPanelFilesState; + let prevTree: Array>; + + return (state: RootState): Pick => { + if (prevState !== state.collectionPanelFiles) { + prevState = state.collectionPanelFiles; + prevTree = [].concat.apply( + [], getNodeChildrenIds('')(state.collectionPanelFiles) + .map(collectionItemToList(0)(state.collectionPanelFiles))) + .map(nodeToTreeItem); + // prevTree = getNodeChildrenIds('')(state.collectionPanelFiles) + // .map(collectionItemToTreeItem(state.collectionPanelFiles)); + } + return { + items: prevTree, + currentItemUuid: state.detailsPanel.resourceUuid + }; + }; +}; + +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, 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)); + }, +}); + + +export const CollectionPanelFiles = connect(memoizedMapStateToProps(), mapDispatchToProps)(Component); + +export const collectionItemToList = (level: number) => (tree: Tree) => + (id: string): TreeItem[] => { + const node: TreeNode = getNode(id)(tree) || initTreeNode({ + id: '', + parent: '', + value: { + ...createCollectionDirectory({ name: 'Invalid file' }), + selected: false, + collapsed: true + } + }); + const childs = [].concat.apply([], node.children.map(collectionItemToList(level+1)(tree))); + return [ + {...node, level}, + ...childs, + ]; + }; + +const collectionItemToTreeItem = (tree: Tree) => + (id: string): TreeItem => { + const node: TreeNode = getNode(id)(tree) || initTreeNode({ + id: '', + parent: '', + value: { + ...createCollectionDirectory({ name: 'Invalid file' }), + selected: false, + collapsed: true + } + }); + return { active: false, data: { - name: "File 1.1", - type: "file", - size: 20033 + name: node.value.name, + size: node.value.type === CollectionFileType.FILE ? node.value.size : undefined, + type: node.value.type, + url: node.value.url, }, - id: "File 1.1", - open: false, - status: TreeItemStatus.LOADED, - items: [] - }] - }, { + 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 + }; + }; + +const nodeToTreeItem = (node: TreeNode): TreeItem => { + return ({ active: false, data: { - name: "Directory 2", - type: "directory" + name: node.value.name, + size: node.value.type === CollectionFileType.FILE ? node.value.size : undefined, + type: node.value.type, + url: node.value.url, }, - id: "Directory 2", - open: false, - status: TreeItemStatus.LOADED - }] -}); - - -export const CollectionPanelFiles = connect(mapStateToProps)(Component); + id: node.id, + items: [], + open: node.value.type === CollectionFileType.DIRECTORY ? !node.value.collapsed : false, + selected: node.value.selected, + status: TreeItemStatus.LOADED, + level: node.level, + }); +}; \ No newline at end of file