export interface ProjectTreeProps {
projects: Array<TreeItem<Project>>;
- toggleProjectTreeItemOpen: (id: string, status: TreeItemStatus) => void;
- toggleProjectTreeItemActive: (id: string) => void;
+ toggleOpen: (id: string, status: TreeItemStatus) => void;
+ toggleActive: (id: string) => void;
}
class ProjectTree<T> extends React.Component<ProjectTreeProps & WithStyles<CssRules>> {
render(): ReactElement<any> {
- const { classes, projects, toggleProjectTreeItemOpen, toggleProjectTreeItemActive } = this.props;
+ const { classes, projects, toggleOpen, toggleActive } = this.props;
const { active, listItemText, row, treeContainer } = classes;
return (
<div className={treeContainer}>
<Tree items={projects}
- toggleItemOpen={toggleProjectTreeItemOpen}
- toggleItemActive={toggleProjectTreeItemActive}
- render={(project: TreeItem<Project>, level: number) =>
+ toggleItemOpen={toggleOpen}
+ toggleItemActive={toggleActive}
+ render={(project: TreeItem<Project>) =>
<span className={row}>
<ListItemIcon className={project.active ? active : ''}>
<i className="fas fa-folder" />
}
interface SidePanelProps {
- toggleSidePanelOpen: (id: string) => void;
- toggleSidePanelActive: (id: string) => void;
+ toggleOpen: (id: string) => void;
+ toggleActive: (id: string) => void;
sidePanelItems: SidePanelItem[];
}
class SidePanel extends React.Component<SidePanelProps & WithStyles<CssRules>> {
render(): ReactElement<any> {
- const { classes, toggleSidePanelOpen, toggleSidePanelActive, sidePanelItems } = this.props;
+ const { classes, toggleOpen, toggleActive, sidePanelItems } = this.props;
const { listItemText, leftSidePanelContainer, row, list, icon, projectIcon, active, activeArrow, inactiveArrow, arrowTransition, arrowRotate } = classes;
return (
<div className={leftSidePanelContainer}>
<List>
{sidePanelItems.map(it => (
<span key={it.name}>
- <ListItem button className={list} onClick={() => toggleSidePanelActive(it.id)}>
+ <ListItem button className={list} onClick={() => toggleActive(it.id)}>
<span className={row}>
- {it.name === "Projects" ? <i onClick={() => toggleSidePanelOpen(it.id)} className={`${it.active ? activeArrow : inactiveArrow}
+ {it.name === "Projects" ? <i onClick={() => toggleOpen(it.id)} className={`${it.active ? activeArrow : inactiveArrow}
${it.open ? `fas fa-caret-down ${arrowTransition}` : `fas fa-caret-down ${arrowRotate}`}`} /> : null}
<ListItemIcon className={it.active ? active : ''}>
<i className={`${it.icon} ${icon} ${it.name === "Projects" ? projectIcon : ''}`} />
auth: {
user: undefined
},
- sidePanel: sidePanelData
+ sidePanel: []
}, history);
store.dispatch(authActions.INIT());
export type SidePanelState = SidePanelItem[];
const sidePanelReducer = (state: SidePanelState = sidePanelData, action: SidePanelAction) => {
- return actions.match(action, {
- TOGGLE_SIDE_PANEL_ITEM_OPEN: () => {
- const sidePanel = _.cloneDeep(state);
- sidePanel[0].open = !sidePanel[0].open;
- return sidePanel;
- },
- TOGGLE_SIDE_PANEL_ITEM_ACTIVE: itemId => {
- const sidePanel = _.cloneDeep(state);
- resetSidePanelActivity(sidePanel);
- sidePanel.map(it => {
- if (it.id === itemId) {
- it.active = true;
- }
- });
- return sidePanel;
- },
- RESET_SIDE_PANEL_ACTIVITY: () => {
- const sidePanel = _.cloneDeep(state);
- resetSidePanelActivity(sidePanel);
- return sidePanel;
- },
- default: () => state
- });
+ if (state.length === 0) {
+ return sidePanelData;
+ } else {
+ return actions.match(action, {
+ TOGGLE_SIDE_PANEL_ITEM_OPEN: itemId => state.map(it => itemId === it.id && it.open === false ? {...it, open: true} : {...it, open: false}),
+ TOGGLE_SIDE_PANEL_ITEM_ACTIVE: itemId => {
+ const sidePanel = _.cloneDeep(state);
+ resetSidePanelActivity(sidePanel);
+ sidePanel.map(it => {
+ if (it.id === itemId) {
+ it.active = true;
+ }
+ });
+ return sidePanel;
+ },
+ RESET_SIDE_PANEL_ACTIVITY: () => {
+ const sidePanel = _.cloneDeep(state);
+ resetSidePanelActivity(sidePanel);
+ return sidePanel;
+ },
+ default: () => state
+ });
+ }
};
export const sidePanelData = [
}}>
<div className={classes.toolbar} />
<SidePanel
- toggleSidePanelOpen={this.toggleSidePanelOpen}
- toggleSidePanelActive={this.toggleSidePanelActive}
+ toggleOpen={this.toggleSidePanelOpen}
+ toggleActive={this.toggleSidePanelActive}
sidePanelItems={sidePanelItems}>
<ProjectTree
projects={projects}
- toggleProjectTreeItemOpen={this.toggleProjectTreeItemOpen}
- toggleProjectTreeItemActive={this.toggleProjectTreeItemActive} />
+ toggleOpen={this.toggleProjectTreeItemOpen}
+ toggleActive={this.toggleProjectTreeItemActive} />
</SidePanel>
</Drawer>}
<main className={classes.content}>