X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/99d2472afc89ca78a4fef46ac08ce520b3bcf17b..37ebbbd4f05f811582546823738619f1fbb97686:/src/views/workbench/workbench.tsx diff --git a/src/views/workbench/workbench.tsx b/src/views/workbench/workbench.tsx index afd9dfdd..eaf3a2ee 100644 --- a/src/views/workbench/workbench.tsx +++ b/src/views/workbench/workbench.tsx @@ -26,7 +26,7 @@ import projectActions from "../../store/project/project-action"; import ProjectPanel from "../project-panel/project-panel"; import DetailsPanel from '../../views-components/details-panel/details-panel'; import { ArvadosTheme } from '../../common/custom-theme'; -import ContextMenu from "../../views-components/context-menu/context-menu"; +import ContextMenu, { ContextMenuKind } from "../../views-components/context-menu"; import CreateProjectDialog from "../../views-components/create-project-dialog/create-project-dialog"; import { authService } from '../../services/services'; @@ -36,47 +36,6 @@ import { SidePanelIdentifiers } from '../../store/side-panel/side-panel-reducer' import { ProjectResource } from '../../models/project'; import { ResourceKind } from '../../models/resource'; -const drawerWidth = 240; -const appBarHeight = 100; - -type CssRules = 'root' | 'appBar' | 'drawerPaper' | 'content' | 'contentWrapper' | 'toolbar'; - -const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ - root: { - flexGrow: 1, - zIndex: 1, - overflow: 'hidden', - position: 'relative', - display: 'flex', - width: '100vw', - height: '100vh' - }, - appBar: { - zIndex: theme.zIndex.drawer + 1, - position: "absolute", - width: "100%" - }, - drawerPaper: { - position: 'relative', - width: drawerWidth, - display: 'flex', - flexDirection: 'column', - }, - contentWrapper: { - backgroundColor: theme.palette.background.default, - display: "flex", - flexGrow: 1, - minWidth: 0, - paddingTop: appBarHeight - }, - content: { - padding: `${theme.spacing.unit}px ${theme.spacing.unit * 3}px`, - overflowY: "auto", - flexGrow: 1 - }, - toolbar: theme.mixins.toolbar -}); - interface WorkbenchDataProps { projects: Array>; currentProjectId: string; @@ -140,49 +99,6 @@ class Workbench extends React.Component { } }; - mainAppBarActions: MainAppBarActionProps = { - onBreadcrumbClick: ({ itemId }: NavBreadcrumb) => { - this.props.dispatch(setProjectItem(itemId, ItemMode.BOTH)); - this.props.dispatch(loadDetails(itemId, ResourceKind.Project)); - }, - onSearch: searchText => { - this.setState({ searchText }); - this.props.dispatch(push(`/search?q=${searchText}`)); - }, - onMenuItemClick: (menuItem: NavMenuItem) => menuItem.action(), - onDetailsPanelToggle: () => { - this.props.dispatch(detailsPanelActions.TOGGLE_DETAILS_PANEL()); - }, - onContextMenu: (event: React.MouseEvent, breadcrumb: NavBreadcrumb) => { - this.openContextMenu(event, breadcrumb.itemId); - } - }; - - toggleSidePanelOpen = (itemId: string) => { - this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_OPEN(itemId)); - } - - toggleSidePanelActive = (itemId: string) => { - this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(itemId)); - this.props.dispatch(projectActions.RESET_PROJECT_TREE_ACTIVITY(itemId)); - this.props.dispatch(push("/")); - } - - handleCreationDialogOpen = (itemUuid: string) => { - this.props.dispatch(projectActions.OPEN_PROJECT_CREATOR({ ownerUuid: itemUuid })); - } - - - openContextMenu = (event: React.MouseEvent, itemUuid: string) => { - event.preventDefault(); - this.props.dispatch( - contextMenuActions.OPEN_CONTEXT_MENU({ - position: { x: event.clientX, y: event.clientY }, - resource: { uuid: itemUuid, kind: ResourceKind.Project } - }) - ); - } - render() { const path = getTreePath(this.props.projects, this.props.currentProjectId); const breadcrumbs = path.map(item => ({ @@ -213,11 +129,11 @@ class Workbench extends React.Component { toggleOpen={this.toggleSidePanelOpen} toggleActive={this.toggleSidePanelActive} sidePanelItems={this.props.sidePanelItems} - onContextMenu={(event) => this.openContextMenu(event, authService.getUuid() || "")}> + onContextMenu={(event) => this.openContextMenu(event, authService.getUuid() || "", ContextMenuKind.RootProject)}> this.props.dispatch(setProjectItem(itemId, ItemMode.OPEN))} - onContextMenu={(event, item) => this.openContextMenu(event, item.data.uuid)} + onContextMenu={(event, item) => this.openContextMenu(event, item.data.uuid, ContextMenuKind.Project)} toggleActive={itemId => { this.props.dispatch(setProjectItem(itemId, ItemMode.ACTIVE)); this.props.dispatch(loadDetails(itemId, ResourceKind.Project)); @@ -231,7 +147,7 @@ class Workbench extends React.Component { - + { user && } @@ -241,7 +157,7 @@ class Workbench extends React.Component { renderProjectPanel = (props: RouteComponentProps<{ id: string }>) => this.props.dispatch(setProjectItem(itemId, ItemMode.ACTIVE))} - onContextMenu={(event, item) => this.openContextMenu(event, item.uuid)} + onContextMenu={(event, item) => this.openContextMenu(event, item.uuid, ContextMenuKind.Project)} onDialogOpen={this.handleCreationDialogOpen} onItemClick={item => { this.props.dispatch(loadDetails(item.uuid, item.kind as ResourceKind)); @@ -251,8 +167,93 @@ class Workbench extends React.Component { this.props.dispatch(loadDetails(item.uuid, ResourceKind.Project)); }} {...props} /> + + mainAppBarActions: MainAppBarActionProps = { + onBreadcrumbClick: ({ itemId }: NavBreadcrumb) => { + this.props.dispatch(setProjectItem(itemId, ItemMode.BOTH)); + this.props.dispatch(loadDetails(itemId, ResourceKind.Project)); + }, + onSearch: searchText => { + this.setState({ searchText }); + this.props.dispatch(push(`/search?q=${searchText}`)); + }, + onMenuItemClick: (menuItem: NavMenuItem) => menuItem.action(), + onDetailsPanelToggle: () => { + this.props.dispatch(detailsPanelActions.TOGGLE_DETAILS_PANEL()); + }, + onContextMenu: (event: React.MouseEvent, breadcrumb: NavBreadcrumb) => { + this.openContextMenu(event, breadcrumb.itemId, ContextMenuKind.Project); + } + }; + + toggleSidePanelOpen = (itemId: string) => { + this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_OPEN(itemId)); + } + + toggleSidePanelActive = (itemId: string) => { + this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(itemId)); + this.props.dispatch(projectActions.RESET_PROJECT_TREE_ACTIVITY(itemId)); + this.props.dispatch(push("/")); + } + + handleCreationDialogOpen = (itemUuid: string) => { + this.props.dispatch(projectActions.OPEN_PROJECT_CREATOR({ ownerUuid: itemUuid })); + } + + openContextMenu = (event: React.MouseEvent, itemUuid: string, kind: ContextMenuKind) => { + event.preventDefault(); + this.props.dispatch( + contextMenuActions.OPEN_CONTEXT_MENU({ + position: { x: event.clientX, y: event.clientY }, + resource: { uuid: itemUuid, kind } + }) + ); + } + + } +const drawerWidth = 240; +const appBarHeight = 100; + +type CssRules = 'root' | 'appBar' | 'drawerPaper' | 'content' | 'contentWrapper' | 'toolbar'; + +const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ + root: { + flexGrow: 1, + zIndex: 1, + overflow: 'hidden', + position: 'relative', + display: 'flex', + width: '100vw', + height: '100vh' + }, + appBar: { + zIndex: theme.zIndex.drawer + 1, + position: "absolute", + width: "100%" + }, + drawerPaper: { + position: 'relative', + width: drawerWidth, + display: 'flex', + flexDirection: 'column', + }, + contentWrapper: { + backgroundColor: theme.palette.background.default, + display: "flex", + flexGrow: 1, + minWidth: 0, + paddingTop: appBarHeight + }, + content: { + padding: `${theme.spacing.unit}px ${theme.spacing.unit * 3}px`, + overflowY: "auto", + flexGrow: 1 + }, + toolbar: theme.mixins.toolbar +}); + export default connect( (state: RootState) => ({ projects: state.projects.items,