import { ReactNode } from "react";
import { AdminMenu } from "views-components/main-app-bar/admin-menu";
import { pluginConfig } from 'plugins';
-import { CollapseLeftPanelTrigger } from 'views-components/side-panel/side-panel'
type CssRules = 'toolbar' | 'link';
},
toolbar: {
height: '56px',
- paddingLeft: '0'
}
});
uuidPrefix: string;
siteBanner: string;
sidePanelIsCollapsed: boolean;
- toggleSidePanel: (collapsedState:boolean) => void
}
export type MainAppBarProps = MainAppBarDataProps & WithStyles<CssRules>;
(props: MainAppBarProps) => {
return <AppBar position="absolute">
<Toolbar className={props.classes.toolbar}>
- <CollapseLeftPanelTrigger sidePanelIsCollapsed={props.sidePanelIsCollapsed}
- toggleSidePanel={props.toggleSidePanel}
- />
<Grid container justify="space-between">
{pluginConfig.appBarLeft || <Grid container item xs={3} direction="column" justify="center">
<Typography variant='h6' color="inherit" noWrap>
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import React from 'react';
+import { Tooltip, IconButton } from '@material-ui/core';
+import { connect } from 'react-redux';
+import { toggleSidePanel } from "store/side-panel/side-panel-action";
+import { RootState } from 'store/store';
+
+type collapseButtonProps = {
+ isCollapsed: boolean;
+ toggleSidePanel: (collapsedState: boolean) => void
+}
+
+export const COLLAPSE_ICON_SIZE = 20
+
+const SidePanelToggle = (props: collapseButtonProps) =>{
+const collapseButtonIconStyles = {
+ root: {
+ width: `${COLLAPSE_ICON_SIZE}px`,
+ padding: '10px'
+ },
+ icon: {
+ }
+}
+
+
+ return <Tooltip disableFocusListener title="Toggle Side Panel">
+ <IconButton style={collapseButtonIconStyles.root} onClick={()=>{props.toggleSidePanel(props.isCollapsed)}}>
+ <div style={collapseButtonIconStyles.icon}>{props.isCollapsed ? '>' : '<'}</div>
+ </IconButton>
+ </Tooltip>
+ };
+
+const mapStateToProps = (state: RootState) => {
+ return {
+ isCollapsed: state.sidePanel.collapsedState
+ }
+}
+
+ const mapDispatchToProps = (dispatch) => {
+ return {
+ toggleSidePanel: (collapsedState)=>{
+ return dispatch(toggleSidePanel(collapsedState))
+ }
+ }
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(SidePanelToggle)
\ No newline at end of file
export interface SidePanelTreeProps {
onItemActivation: (id: string) => void;
sidePanelProgress?: boolean;
+ isCollapsed?: boolean
}
type SidePanelTreeActionProps = Pick<TreePickerProps<ProjectResource | string>, 'onContextMenu' | 'toggleItemActive' | 'toggleItemOpen' | 'toggleItemSelection'>;
import { SidePanelButton } from 'views-components/side-panel-button/side-panel-button';
import { RootState } from 'store/store';
import MenuIcon from "@material-ui/icons/Menu";
+import SidePanelToggle from 'views-components/side-panel-toggle/side-panel-toggle';
const DRAWER_WIDTH = 240;
}
});
-const mapStateToProps = ({ router }: RootState) => ({
+const mapStateToProps = ({ router, sidePanel }: RootState) => ({
currentRoute: router.location ? router.location.pathname : '',
+ isCollapsed: sidePanel.collapsedState
});
export const SidePanel = withStyles(styles)(
connect(mapStateToProps, mapDispatchToProps)(
({ classes, ...props }: WithStyles<CssRules> & SidePanelTreeProps & { currentRoute: string }) =>
<Grid item xs>
- <SidePanelButton key={props.currentRoute} />
- <SidePanelTree {...props} />
+ {props.isCollapsed ? <SidePanelToggle /> :
+ <>
+ <Grid style={{display: 'flex', justifyContent: 'space-between', flexWrap: 'wrap-reverse'}}>
+ <SidePanelButton key={props.currentRoute} />
+ <SidePanelToggle/>
+ </Grid>
+ <SidePanelTree {...props} />
+ </>}
</Grid>
));
-
-type collapseButtonIconProps = {
- sidePanelIsCollapsed: boolean;
- toggleSidePanel: (collapsedState: boolean) => void
-}
-
-const collapseButtonIconStyles = {
- menuIcon: {
- height: '4rem',
- width: '4rem',
- paddingBottom: '0.25rem'
- }
-}
-
-export const CollapseLeftPanelTrigger = (props: collapseButtonIconProps) =>{
- return <Tooltip disableFocusListener title="Toggle Side Panel">
- <IconButton onClick={()=>{props.toggleSidePanel(props.sidePanelIsCollapsed)}}>
- <MenuIcon style={collapseButtonIconStyles.menuIcon} aria-label="Toggle Side Panel" />
- </IconButton>
- </Tooltip>
- };
\ No newline at end of file
uuidPrefix={uuidPrefix}
siteBanner={siteBanner}
sidePanelIsCollapsed={sidePanelIsCollapsed}
- toggleSidePanel={toggleSidePanel}
>
{working
? <LinearProgress color="secondary" data-cy="linear-progress" />
import { WebDavS3InfoDialog } from 'views-components/webdav-s3-dialog/webdav-s3-dialog';
import { pluginConfig } from 'plugins';
import { ElementListReducer } from 'common/plugintypes';
+import { COLLAPSE_ICON_SIZE } from 'views-components/side-panel-toggle/side-panel-toggle'
type CssRules = 'root' | 'container' | 'splitter' | 'asidePanel' | 'contentWrapper' | 'content';
},
splitter: {
'& > .layout-splitter': {
- width: '2px'
+ width: '2px',
+ },
+ '& > .layout-splitter-disabled': {
+ pointerEvents: 'none',
+ cursor: 'pointer'
}
},
asidePanel: {
const applyCollapsedState = (isCollapsed) => {
const rightPanel: Element = document.getElementsByClassName('layout-pane')[1]
+ const totalWidth: number = document.getElementsByClassName('splitter-layout')[0]?.clientWidth
+ const rightPanelExpandedWidth = ((totalWidth-COLLAPSE_ICON_SIZE)) / (totalWidth/100)
if(rightPanel) {
- rightPanel.setAttribute('style', `width: ${isCollapsed ? 100 : getSplitterInitialSize()}%`)
+ rightPanel.setAttribute('style', `width: ${isCollapsed ? rightPanelExpandedWidth : getSplitterInitialSize()}%`)
}
+ const splitter = document.getElementsByClassName('layout-splitter')[0]
+ isCollapsed ? splitter?.classList.add('layout-splitter-disabled') : splitter?.classList.remove('layout-splitter-disabled')
+
}
export const WorkbenchPanel =
withStyles(styles)((props: WorkbenchPanelProps) =>{
+
+ //panel size will not scale automatically on window resize, so we do it manually
+ window.addEventListener('resize', ()=>applyCollapsedState(props.sidePanelIsCollapsed))
applyCollapsedState(props.sidePanelIsCollapsed)
+
return <Grid container item xs className={props.classes.root}>
{props.sessionIdleTimeout > 0 && <AutoLogout />}
<Grid container item xs className={props.classes.container}>