From: Pawel Kowalczyk Date: Mon, 9 Jul 2018 11:16:05 +0000 (+0200) Subject: context-menu-in-side-panel-and-project-panel X-Git-Tag: 1.2.0~52^2~10 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/7cac459611f4e4d089cedbe13120553f97152509 context-menu-in-side-panel-and-project-panel Feature #13694 Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk --- diff --git a/src/components/side-panel/side-panel.tsx b/src/components/side-panel/side-panel.tsx index f78d2a02..a7783fb2 100644 --- a/src/components/side-panel/side-panel.tsx +++ b/src/components/side-panel/side-panel.tsx @@ -27,8 +27,7 @@ interface SidePanelProps { toggleOpen: (id: string) => void; toggleActive: (id: string) => void; sidePanelItems: SidePanelItem[]; - handleCreationDialogOpen: () => void; - handleCreationDialogClose: () => void; + onContextMenu: (event: React.MouseEvent, item: SidePanelItem) => void; } class SidePanel extends React.Component> { @@ -40,7 +39,7 @@ class SidePanel extends React.Component> { {sidePanelItems.map(it => ( - toggleActive(it.id)}> + toggleActive(it.id)} onContextMenu={this.handleRowContextMenu(it)}> {it.openAble ? toggleOpen(it.id)} className={`${it.active ? activeArrow : inactiveArrow} ${it.open ? `fas fa-caret-down ${arrowTransition}` : `fas fa-caret-down ${arrowRotate}`}`} /> : null} @@ -60,6 +59,11 @@ class SidePanel extends React.Component> { ); } + + handleRowContextMenu = (item: SidePanelItem) => + (event: React.MouseEvent) => + item.openAble ? this.props.onContextMenu(event, item) : null + } type CssRules = 'active' | 'listItemText' | 'row' | 'leftSidePanelContainer' | 'list' | 'icon' | 'projectIconMargin' | diff --git a/src/components/tree/tree.tsx b/src/components/tree/tree.tsx index 2c19a831..8de9bda5 100644 --- a/src/components/tree/tree.tsx +++ b/src/components/tree/tree.tsx @@ -32,25 +32,18 @@ interface TreeProps { toggleItemOpen: (id: string, status: TreeItemStatus) => void; toggleItemActive: (id: string, status: TreeItemStatus) => void; level?: number; + onContextMenu: (event: React.MouseEvent, item: TreeItem) => void; } class Tree extends React.Component & WithStyles, {}> { - renderArrow(status: TreeItemStatus, arrowClass: string, open: boolean, id: string) { - const { arrowTransition, arrowVisibility, arrowRotate } = this.props.classes; - return this.props.toggleItemOpen(id, status)} - className={` - ${arrowClass} - ${status === TreeItemStatus.Pending ? arrowVisibility : ''} - ${open ? `fas fa-caret-down ${arrowTransition}` : `fas fa-caret-down ${arrowRotate}`}`} />; - } render(): ReactElement { const level = this.props.level ? this.props.level : 0; - const { classes, render, toggleItemOpen, items, toggleItemActive } = this.props; + const { classes, render, toggleItemOpen, items, toggleItemActive, onContextMenu } = this.props; const { list, inactiveArrow, activeArrow, loader } = classes; return {items && items.map((it: TreeItem, idx: number) =>
- toggleItemActive(it.id, it.status)}> + toggleItemActive(it.id, it.status)} onContextMenu={this.handleRowContextMenu(it)}> {it.status === TreeItemStatus.Pending ? : null} {it.toggled && it.items && it.items.length === 0 ? null : this.renderArrow(it.status, it.active ? activeArrow : inactiveArrow, it.open, it.id)} {render(it, level)} @@ -62,11 +55,24 @@ class Tree extends React.Component & WithStyles, {}> { render={render} toggleItemOpen={toggleItemOpen} toggleItemActive={toggleItemActive} - level={level + 1} /> + level={level + 1} + onContextMenu={onContextMenu} /> }
)}
; } + renderArrow(status: TreeItemStatus, arrowClass: string, open: boolean, id: string) { + const { arrowTransition, arrowVisibility, arrowRotate } = this.props.classes; + return this.props.toggleItemOpen(id, status)} + className={` + ${arrowClass} + ${status === TreeItemStatus.Pending ? arrowVisibility : ''} + ${open ? `fas fa-caret-down ${arrowTransition}` : `fas fa-caret-down ${arrowRotate}`}`} />; + } + + handleRowContextMenu = (item: TreeItem) => + (event: React.MouseEvent) => + this.props.onContextMenu(event, item) } type CssRules = 'list' | 'activeArrow' | 'inactiveArrow' | 'arrowRotate' | 'arrowTransition' | 'loader' | 'arrowVisibility'; diff --git a/src/views-components/project-tree/project-tree.tsx b/src/views-components/project-tree/project-tree.tsx index d94d3bff..511cbbbc 100644 --- a/src/views-components/project-tree/project-tree.tsx +++ b/src/views-components/project-tree/project-tree.tsx @@ -16,17 +16,17 @@ export interface ProjectTreeProps { projects: Array>; toggleOpen: (id: string, status: TreeItemStatus) => void; toggleActive: (id: string, status: TreeItemStatus) => void; - handleCreationDialogOpen: () => void; - handleCreationDialogClose: () => void; + onContextMenu: (event: React.MouseEvent, item: TreeItem) => void; } class ProjectTree extends React.Component> { render(): ReactElement { - const { classes, projects, toggleOpen, toggleActive } = this.props; + const { classes, projects, toggleOpen, toggleActive, onContextMenu } = this.props; const { active, listItemText, row, treeContainer } = classes; return (
) => diff --git a/src/views/workbench/workbench.tsx b/src/views/workbench/workbench.tsx index 57f08989..257c7c4f 100644 --- a/src/views/workbench/workbench.tsx +++ b/src/views/workbench/workbench.tsx @@ -217,15 +217,12 @@ class Workbench extends React.Component { toggleOpen={this.toggleSidePanelOpen} toggleActive={this.toggleSidePanelActive} sidePanelItems={this.props.sidePanelItems} - handleCreationDialogOpen={this.handleCreationDialogOpen} - handleCreationDialogClose={this.handleCreationDialogClose}> + onContextMenu={this.openContextMenu}> this.props.dispatch(setProjectItem(itemId, ItemMode.OPEN))} toggleActive={itemId => this.props.dispatch(setProjectItem(itemId, ItemMode.ACTIVE))} - handleCreationDialogOpen={this.handleCreationDialogOpen} - handleCreationDialogClose={this.handleCreationDialogClose} - /> + onContextMenu={this.openContextMenu} /> }