// Copyright (C) The Arvados Authors. All rights reserved. // // 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 { 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 { ContextMenuKind } from "../context-menu/context-menu"; const mapStateToProps = () => { let lastState: CollectionPanelFilesState; let lastTree: Array>; return (state: RootState): Pick => { if (lastState !== state.collectionPanelFiles) { lastState = state.collectionPanelFiles; lastTree = state.collectionPanelFiles .filter(item => item.parentId === '') .map(collectionItemToTreeItem(state.collectionPanelFiles)); } return { items: lastTree }; }; }; const mapDispatchToProps = (dispatch: Dispatch): Pick => ({ 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 } })); }, 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); 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 }; };