X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/98237b19875f6437fa1e01845ad9c911d886cf04..e4c3defe5d79926d86f49ba83cfe3125261481cb:/src/views/workbench/workbench.tsx diff --git a/src/views/workbench/workbench.tsx b/src/views/workbench/workbench.tsx index 80a85f1aef..160e12f840 100644 --- a/src/views/workbench/workbench.tsx +++ b/src/views/workbench/workbench.tsx @@ -18,8 +18,9 @@ import { TreeItem } from "../../components/tree/tree"; import { getTreePath } from '../../store/project/project-reducer'; import { sidePanelActions } from '../../store/side-panel/side-panel-action'; import { SidePanel, SidePanelItem } from '../../components/side-panel/side-panel'; -import { ItemMode, setFavoriteItem, setProjectItem } from "../../store/navigation/navigation-action"; +import { ItemMode, setProjectItem } from "../../store/navigation/navigation-action"; import { projectActions } from "../../store/project/project-action"; +import { collectionCreateActions } from '../../store/collections/creator/collection-creator-action'; import { ProjectPanel } from "../project-panel/project-panel"; import { DetailsPanel } from '../../views-components/details-panel/details-panel'; import { ArvadosTheme } from '../../common/custom-theme'; @@ -28,12 +29,18 @@ import { authService } from '../../services/services'; import { detailsPanelActions, loadDetails } from "../../store/details-panel/details-panel-action"; import { contextMenuActions } from "../../store/context-menu/context-menu-actions"; -import { sidePanelData, SidePanelIdentifiers } from '../../store/side-panel/side-panel-reducer'; +import { SidePanelIdentifiers } from '../../store/side-panel/side-panel-reducer'; import { ProjectResource } from '../../models/project'; import { ResourceKind } from '../../models/resource'; import { ContextMenu, ContextMenuKind } from "../../views-components/context-menu/context-menu"; -import { FavoritePanel } from "../favorite-panel/favorite-panel"; +import { FavoritePanel, FAVORITE_PANEL_ID } from "../favorite-panel/favorite-panel"; import { CurrentTokenDialog } from '../../views-components/current-token-dialog/current-token-dialog'; +import { dataExplorerActions } from '../../store/data-explorer/data-explorer-action'; +import { Snackbar } from '../../views-components/snackbar/snackbar'; +import { CreateCollectionDialog } from '../../views-components/create-collection-dialog/create-collection-dialog'; +import { CollectionPanel } from '../collection-panel/collection-panel'; +import { loadCollection } from '../../store/collection-panel/collection-panel-action'; +import { getCollectionUrl } from '../../models/collection'; const drawerWidth = 240; const appBarHeight = 100; @@ -188,7 +195,7 @@ export const Workbench = withStyles(styles)( onContextMenu={(event) => this.openContextMenu(event, { uuid: authService.getUuid() || "", name: "", - kind: ContextMenuKind.RootProject + kind: ContextMenuKind.ROOT_PROJECT })}> this.openContextMenu(event, { uuid: item.data.uuid, name: item.data.name, - kind: ContextMenuKind.Project + kind: ContextMenuKind.PROJECT })} toggleActive={itemId => { this.props.dispatch(setProjectItem(itemId, ItemMode.ACTIVE)); - this.props.dispatch(loadDetails(itemId, ResourceKind.Project)); - this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.Projects)); + this.props.dispatch(loadDetails(itemId, ResourceKind.PROJECT)); + this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.PROJECTS)); }} /> } @@ -210,63 +217,95 @@ export const Workbench = withStyles(styles)( + {user && } + - + ); } + renderCollectionPanel = (props: RouteComponentProps<{ id: string }>) => this.props.dispatch(loadCollection(collectionId, ResourceKind.COLLECTION))} + onContextMenu={(event, item) => { + this.openContextMenu(event, { + uuid: item.uuid, + name: item.name, + kind: ContextMenuKind.COLLECTION + }); + }} + {...props} /> + renderProjectPanel = (props: RouteComponentProps<{ id: string }>) => this.props.dispatch(setProjectItem(itemId, ItemMode.ACTIVE))} onContextMenu={(event, item) => { - const kind = item.kind === ResourceKind.Project ? ContextMenuKind.Project : ContextMenuKind.Resource; + + const kind = item.kind === ResourceKind.PROJECT ? ContextMenuKind.PROJECT : ContextMenuKind.RESOURCE; this.openContextMenu(event, { uuid: item.uuid, name: item.name, kind }); }} - onDialogOpen={this.handleCreationDialogOpen} + onProjectCreationDialogOpen={this.handleProjectCreationDialogOpen} + onCollectionCreationDialogOpen={this.handleCollectionCreationDialogOpen} onItemClick={item => { this.props.dispatch(loadDetails(item.uuid, item.kind as ResourceKind)); }} onItemDoubleClick={item => { - this.props.dispatch(setProjectItem(item.uuid, ItemMode.ACTIVE)); - this.props.dispatch(loadDetails(item.uuid, ResourceKind.Project)); + switch (item.kind) { + case ResourceKind.COLLECTION: + this.props.dispatch(loadCollection(item.uuid, item.kind as ResourceKind)); + this.props.dispatch(push(getCollectionUrl(item.uuid))); + default: + this.props.dispatch(setProjectItem(item.uuid, ItemMode.ACTIVE)); + this.props.dispatch(loadDetails(item.uuid, item.kind as ResourceKind)); + } + }} {...props} /> renderFavoritePanel = (props: RouteComponentProps<{ id: string }>) => this.props.dispatch(setFavoriteItem(itemId, ItemMode.ACTIVE))} + onItemRouteChange={() => this.props.dispatch(dataExplorerActions.REQUEST_ITEMS({ id: FAVORITE_PANEL_ID }))} onContextMenu={(event, item) => { + const kind = item.kind === ResourceKind.PROJECT ? ContextMenuKind.PROJECT : ContextMenuKind.RESOURCE; this.openContextMenu(event, { uuid: item.uuid, name: item.name, - kind: ContextMenuKind.Favorite, + kind, }); }} - onDialogOpen={this.handleCreationDialogOpen} + onDialogOpen={this.handleProjectCreationDialogOpen} onItemClick={item => { this.props.dispatch(loadDetails(item.uuid, item.kind as ResourceKind)); }} onItemDoubleClick={item => { - this.props.dispatch(setFavoriteItem(item.uuid, ItemMode.ACTIVE)); - this.props.dispatch(loadDetails(item.uuid, ResourceKind.Project)); + switch (item.kind) { + case ResourceKind.COLLECTION: + this.props.dispatch(loadCollection(item.uuid, item.kind as ResourceKind)); + this.props.dispatch(push(getCollectionUrl(item.uuid))); + default: + this.props.dispatch(loadDetails(item.uuid, ResourceKind.PROJECT)); + this.props.dispatch(setProjectItem(item.uuid, ItemMode.ACTIVE)); + this.props.dispatch(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.PROJECTS)); + } + }} {...props} /> mainAppBarActions: MainAppBarActionProps = { onBreadcrumbClick: ({ itemId }: NavBreadcrumb) => { this.props.dispatch(setProjectItem(itemId, ItemMode.BOTH)); - this.props.dispatch(loadDetails(itemId, ResourceKind.Project)); + this.props.dispatch(loadDetails(itemId, ResourceKind.PROJECT)); }, onSearch: searchText => { this.setState({ searchText }); @@ -280,7 +319,7 @@ export const Workbench = withStyles(styles)( this.openContextMenu(event, { uuid: breadcrumb.itemId, name: breadcrumb.label, - kind: ContextMenuKind.Project + kind: ContextMenuKind.PROJECT }); } }; @@ -298,10 +337,14 @@ export const Workbench = withStyles(styles)( } } - handleCreationDialogOpen = (itemUuid: string) => { + handleProjectCreationDialogOpen = (itemUuid: string) => { this.props.dispatch(projectActions.OPEN_PROJECT_CREATOR({ ownerUuid: itemUuid })); } + handleCollectionCreationDialogOpen = (itemUuid: string) => { + this.props.dispatch(collectionCreateActions.OPEN_COLLECTION_CREATOR({ ownerUuid: itemUuid })); + } + openContextMenu = (event: React.MouseEvent, resource: { name: string; uuid: string; kind: ContextMenuKind; }) => { event.preventDefault(); this.props.dispatch(