X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/d6a65f155ca546aea3a777e73076c2c80f2c88cc..4ea2ff188ec745966387ce8bbe14880bfeede863:/src/components/tree/tree.tsx diff --git a/src/components/tree/tree.tsx b/src/components/tree/tree.tsx index 6b127530..c64a7221 100644 --- a/src/components/tree/tree.tsx +++ b/src/components/tree/tree.tsx @@ -60,7 +60,8 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ width: theme.spacing.unit * 3, height: theme.spacing.unit * 3, margin: `0 ${theme.spacing.unit}px`, - color: theme.palette.grey["500"] + padding: 0, + color: theme.palette.grey["500"], } }); @@ -81,15 +82,17 @@ export interface TreeItem { } export interface TreeProps { + disableRipple?: boolean; items?: Array>; - render: (item: TreeItem, level?: number) => ReactElement<{}>; - toggleItemOpen: (id: string, status: TreeItemStatus) => void; - toggleItemActive: (id: string, status: TreeItemStatus) => void; level?: number; onContextMenu: (event: React.MouseEvent, item: TreeItem) => void; - showSelection?: boolean; - onSelectionChange?: (event: React.MouseEvent, item: TreeItem) => void; - disableRipple?: boolean; + render: (item: TreeItem, level?: number) => ReactElement<{}>; + showSelection?: boolean | ((item: TreeItem) => boolean); + levelIndentation?: number; + itemRightPadding?: number; + toggleItemActive: (event: React.MouseEvent, item: TreeItem) => void; + toggleItemOpen: (event: React.MouseEvent, item: TreeItem) => void; + toggleItemSelection?: (event: React.MouseEvent, item: TreeItem) => void; } export const Tree = withStyles(styles)( @@ -98,22 +101,32 @@ export const Tree = withStyles(styles)( const level = this.props.level ? this.props.level : 0; const { classes, render, toggleItemOpen, items, toggleItemActive, onContextMenu, disableRipple } = this.props; const { list, listItem, loader, toggableIconContainer, renderContainer } = classes; + const isCheckboxVisible = typeof this.props.showSelection === 'function' + ? this.props.showSelection + : () => this.props.showSelection ? true : false; + + const { levelIndentation = 20, itemRightPadding = 20 } = this.props; + return {items && items.map((it: TreeItem, idx: number) =>
- toggleItemActive(it.id, it.status)} + onClick={event => toggleItemActive(event, it)} onContextMenu={this.handleRowContextMenu(it)}> {it.status === TreeItemStatus.PENDING ? : null} - this.props.toggleItemOpen(it.id, it.status)} + {this.getProperArrowAnimation(it.status, it.items!)} - {this.props.showSelection && + { isCheckboxVisible(it) && + toggleItemSelection={this.props.toggleItemSelection} /> }
)}
; } getProperArrowAnimation = (status: string, items: Array>) => { - return status === TreeItemStatus.PENDING || (status === TreeItemStatus.LOADED && !items) || (status === TreeItemStatus.LOADED && items && items.length === 0) ? : ; + return this.isSidePanelIconNotNeeded(status, items) ? : ; + } + + isSidePanelIconNotNeeded = (status: string, items: Array>) => { + return status === TreeItemStatus.PENDING || + (status === TreeItemStatus.LOADED && !items) || + (status === TreeItemStatus.LOADED && items && items.length === 0); } getToggableIconClassNames = (isOpen?: boolean, isActive?: boolean) => { @@ -158,12 +177,18 @@ export const Tree = withStyles(styles)( this.props.onContextMenu(event, item) handleCheckboxChange = (item: TreeItem) => { - const { onSelectionChange } = this.props; - return onSelectionChange + const { toggleItemSelection } = this.props; + return toggleItemSelection ? (event: React.MouseEvent) => { - onSelectionChange(event, item); + event.stopPropagation(); + toggleItemSelection(event, item); } : undefined; } + + handleToggleItemOpen = (item: TreeItem) => (event: React.MouseEvent) => { + event.stopPropagation(); + this.props.toggleItemOpen(event, item); + } } );