From: Pawel Kowalczyk Date: Tue, 12 Feb 2019 12:13:44 +0000 (+0100) Subject: refs #14785-selection-of-table-content X-Git-Tag: 1.4.0~50 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/70222e9fc05c3ad515ac290e5cbd6302b4f2efc8 refs #14785-selection-of-table-content Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk --- diff --git a/src/components/collection-panel-files/collection-panel-files.tsx b/src/components/collection-panel-files/collection-panel-files.tsx index 028dfb0c..0a443907 100644 --- a/src/components/collection-panel-files/collection-panel-files.tsx +++ b/src/components/collection-panel-files/collection-panel-files.tsx @@ -18,6 +18,7 @@ export interface CollectionPanelFilesProps { onSelectionToggle: (event: React.MouseEvent, item: TreeItem) => void; onCollapseToggle: (id: string, status: TreeItemStatus) => void; onFileClick: (id: string) => void; + currentItemUuid?: string; } type CssRules = 'root' | 'cardSubheader' | 'nameHeader' | 'fileSizeHeader' | 'uploadIcon' | 'button'; diff --git a/src/components/data-explorer/data-explorer.tsx b/src/components/data-explorer/data-explorer.tsx index 878f47ff..2e3e1a34 100644 --- a/src/components/data-explorer/data-explorer.tsx +++ b/src/components/data-explorer/data-explorer.tsx @@ -6,7 +6,7 @@ import * as React from 'react'; import { Grid, Paper, Toolbar, StyleRulesCallback, withStyles, WithStyles, TablePagination, IconButton, Tooltip, Button } from '@material-ui/core'; import { ColumnSelector } from "~/components/column-selector/column-selector"; import { DataTable, DataColumns, DataTableFetchMode } from "~/components/data-table/data-table"; -import { DataColumn, SortDirection } from "~/components/data-table/data-column"; +import { DataColumn } from "~/components/data-table/data-column"; import { SearchInput } from '~/components/search-input/search-input'; import { ArvadosTheme } from "~/common/custom-theme"; import { createTree } from '~/models/tree'; @@ -51,6 +51,7 @@ interface DataExplorerDataProps { actions?: React.ReactNode; hideSearchInput?: boolean; paperKey?: string; + currentItemUuid: string; } interface DataExplorerActionProps { @@ -83,7 +84,7 @@ export const DataExplorer = withStyles(styles)( rowsPerPage, rowsPerPageOptions, onColumnToggle, searchValue, onSearch, items, itemsAvailable, onRowClick, onRowDoubleClick, classes, dataTableDefaultView, hideColumnSelector, actions, paperProps, hideSearchInput, - paperKey, fetchMode + paperKey, fetchMode, currentItemUuid } = this.props; return {(!hideColumnSelector || !hideSearchInput) && @@ -109,7 +110,9 @@ export const DataExplorer = withStyles(styles)( onSortToggle={onSortToggle} extractKey={extractKey} working={working} - defaultView={dataTableDefaultView} /> + defaultView={dataTableDefaultView} + currentItemUuid={currentItemUuid} + currentRoute={paperKey} /> {fetchMode === DataTableFetchMode.PAGINATED ? { extractKey?: (item: T) => React.Key; working?: boolean; defaultView?: React.ReactNode; + currentItemUuid?: string; + currentRoute?: string; } type CssRules = "tableBody" | "root" | "content" | "noItemsInfo" | 'tableCell'; @@ -112,14 +114,15 @@ export const DataTable = withStyles(styles)( ; } - renderBodyRow = (item: T, index: number) => { - const { onRowClick, onRowDoubleClick, extractKey, classes } = this.props; + renderBodyRow = (item: any, index: number) => { + const { onRowClick, onRowDoubleClick, extractKey, classes, currentItemUuid } = this.props; return onRowClick && onRowClick(event, item)} onContextMenu={this.handleRowContextMenu(item)} - onDoubleClick={event => onRowDoubleClick && onRowDoubleClick(event, item)}> + onDoubleClick={event => onRowDoubleClick && onRowDoubleClick(event, item)} + selected={item === currentItemUuid}> {this.mapVisibleColumns((column, index) => ( {column.render(item)} diff --git a/src/components/file-tree/file-tree.tsx b/src/components/file-tree/file-tree.tsx index 4f581a6c..ad7ac73e 100644 --- a/src/components/file-tree/file-tree.tsx +++ b/src/components/file-tree/file-tree.tsx @@ -13,6 +13,7 @@ export interface FileTreeProps { onSelectionToggle: (event: React.MouseEvent, item: TreeItem) => void; onCollapseToggle: (id: string, status: TreeItemStatus) => void; onFileClick: (id: string) => void; + currentItemUuid?: string; } export class FileTree extends React.Component { @@ -25,7 +26,8 @@ export class FileTree extends React.Component { onContextMenu={this.handleContextMenu} toggleItemActive={this.handleToggleActive} toggleItemOpen={this.handleToggle} - toggleItemSelection={this.handleSelectionChange} />; + toggleItemSelection={this.handleSelectionChange} + currentItemUuid={this.props.currentItemUuid} />; } handleContextMenu = (event: React.MouseEvent, item: TreeItem) => { diff --git a/src/components/tree/tree.tsx b/src/components/tree/tree.tsx index 5b070b70..826884aa 100644 --- a/src/components/tree/tree.tsx +++ b/src/components/tree/tree.tsx @@ -83,6 +83,7 @@ export interface TreeItem { export interface TreeProps { disableRipple?: boolean; + currentItemUuid?: string; items?: Array>; level?: number; onContextMenu: (event: React.MouseEvent, item: TreeItem) => void; @@ -99,7 +100,7 @@ export const Tree = withStyles(styles)( class Component extends React.Component & WithStyles, {}> { render(): ReactElement { const level = this.props.level ? this.props.level : 0; - const { classes, render, toggleItemOpen, items, toggleItemActive, onContextMenu, disableRipple } = this.props; + const { classes, render, toggleItemOpen, items, toggleItemActive, onContextMenu, disableRipple, currentItemUuid } = this.props; const { list, listItem, loader, toggableIconContainer, renderContainer } = classes; const isCheckboxVisible = typeof this.props.showSelection === 'function' ? this.props.showSelection @@ -110,13 +111,14 @@ export const Tree = withStyles(styles)( return {items && items.map((it: TreeItem, idx: number) =>
- toggleItemActive(event, it)} + selected={isCheckboxVisible(it) && it.id === currentItemUuid} onContextMenu={this.handleRowContextMenu(it)}> {it.status === TreeItemStatus.PENDING ? : null} @@ -126,7 +128,7 @@ export const Tree = withStyles(styles)( {this.getProperArrowAnimation(it.status, it.items!)} - { isCheckboxVisible(it) && + {isCheckboxVisible(it) && { let prevState: CollectionPanelFilesState; let prevTree: Array>; - return (state: RootState): Pick => { + return (state: RootState): Pick => { if (prevState !== state.collectionPanelFiles) { prevState = state.collectionPanelFiles; prevTree = getNodeChildrenIds('')(state.collectionPanelFiles) .map(collectionItemToTreeItem(state.collectionPanelFiles)); } return { - items: prevTree + items: prevTree, + currentItemUuid: state.detailsPanel.resourceUuid }; }; }; diff --git a/src/views-components/data-explorer/data-explorer.tsx b/src/views-components/data-explorer/data-explorer.tsx index 8c95355f..ed4bffd6 100644 --- a/src/views-components/data-explorer/data-explorer.tsx +++ b/src/views-components/data-explorer/data-explorer.tsx @@ -24,7 +24,8 @@ const mapStateToProps = (state: RootState, { id }: Props) => { const progress = state.progressIndicator.find(p => p.id === id); const working = progress && progress.working; const currentRoute = state.router.location ? state.router.location.pathname : ''; - return { ...getDataExplorer(state.dataExplorer, id), working, paperKey: currentRoute }; + const currentItemUuid = currentRoute === '/workflows' ? state.properties.workflowPanelDetailsUuid : state.detailsPanel.resourceUuid; + return { ...getDataExplorer(state.dataExplorer, id), working, paperKey: currentRoute, currentItemUuid }; }; const mapDispatchToProps = () => {