From cd1749f331dee4ad7f5e3876b13ff3990df34ce4 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 16 Mar 2021 21:07:45 +0200 Subject: [PATCH] fix: show and allow to expand crd sub-menus / sidebar refactoring Signed-off-by: Roman --- .../components/layout/sidebar-item.scss | 60 ++++++--------- .../components/layout/sidebar-item.tsx | 73 ++++++++++--------- src/renderer/components/layout/sidebar.scss | 39 ---------- src/renderer/components/layout/sidebar.tsx | 3 +- 4 files changed, 62 insertions(+), 113 deletions(-) diff --git a/src/renderer/components/layout/sidebar-item.scss b/src/renderer/components/layout/sidebar-item.scss index 15a03ca28a..8a06b38d3f 100644 --- a/src/renderer/components/layout/sidebar-item.scss +++ b/src/renderer/components/layout/sidebar-item.scss @@ -7,22 +7,18 @@ width: 100%; user-select: none; - .nav-item { + > .nav-item { + text-decoration: none; padding: $itemSpacing; - border: none; + width: 100%; + height: 100%; + color: inherit; cursor: pointer; - display: grid; - grid-template-columns: 1fr 25px; - a { - grid-row: 2; - grid-column: 1 / span 2; + > .link-text { overflow: hidden; text-overflow: ellipsis; - text-decoration: none; - vertical-align: middle; - flex-grow: 1; - min-width: 100px; + white-space: nowrap; } &.active, &:hover { @@ -32,45 +28,35 @@ .expand-icon { --size: 20px; - grid-row: 2; - grid-column: 2; - pointer-events: none; } } .sub-menu { - border-left: 4px solid transparent; - - &:empty, .compact & { - display: none; - } + $borderSize: 4px; + border-left: $borderSize solid transparent; &.active { border-left-color: $lensBlue; } - a, .SidebarItem { - display: block; - border: none; - text-decoration: none; + > .SidebarItem { color: $textColorPrimary; - font-weight: normal; - padding-left: 40px; // parent icon width - overflow: hidden; - text-overflow: ellipsis; - line-height: 0px; // hidden by default - height: 0px; - opacity: 0; - transition: 125ms line-height ease-out, 200ms 100ms opacity; + padding-left: 30px + $borderSize; + line-height: 22px; - &.visible { - line-height: 28px; - height: auto; - opacity: 1; + .SidebarItem { + padding-left: $padding * 2; // 3rd+ menu level } - &.active, &:hover { - color: $sidebarSubmenuActiveColor; + .nav-item { + &.expandable { + font-weight: 500; + } + + &.active, &:hover { + color: $sidebarSubmenuActiveColor; + background: none; + } } } } diff --git a/src/renderer/components/layout/sidebar-item.tsx b/src/renderer/components/layout/sidebar-item.tsx index 599c333f5a..6b574e265f 100644 --- a/src/renderer/components/layout/sidebar-item.tsx +++ b/src/renderer/components/layout/sidebar-item.tsx @@ -8,6 +8,7 @@ import { NavLink } from "react-router-dom"; import { Icon } from "../icon"; import { TabLayoutRoute } from "./tab-layout"; import { sidebarStorage } from "./sidebar-storage"; +import { isActiveRoute } from "../../navigation"; interface SidebarItemProps { id: string; // Used to save nav item collapse/expand state in local storage @@ -18,7 +19,6 @@ interface SidebarItemProps { isHidden?: boolean; isActive?: boolean; subMenus?: TabLayoutRoute[]; - onToggle?(id: string, meta: { props: SidebarItemProps, event: React.MouseEvent }): void; } @observer @@ -29,63 +29,66 @@ export class SidebarItem extends React.Component { return this.props.id; // unique id, used in storage and integration tests } - get expanded(): boolean { - return Boolean(sidebarStorage.get().expanded[this.id]); - } - get compact(): boolean { return Boolean(sidebarStorage.get().compact); } - toggleExpand = prevDefault((event: React.MouseEvent) => { - sidebarStorage.merge(draft => { - draft.expanded[this.id] = !draft.expanded[this.id]; - }); + get expanded(): boolean { + return Boolean(sidebarStorage.get().expanded[this.id]); + } - this.props.onToggle?.(this.id, { - props: this.props, - event, - }); - }); - - @computed get showSubMenus(): boolean { + @computed get isExpandable(): boolean { const { subMenus, children } = this.props; const hasContent = subMenus?.length > 0 || children; return Boolean(hasContent && !this.compact) /*not available in compact-mode*/; } + toggleExpand = () => { + sidebarStorage.merge(draft => { + draft.expanded[this.id] = !draft.expanded[this.id]; + }); + }; + render() { const { isHidden, isActive, subMenus = [], icon, text, children, url, className } = this.props; if (isHidden) return null; - const { id: testId, expanded, compact, showSubMenus, toggleExpand } = this; - const classNames = cssNames(SidebarItem.displayName, className, { compact }); + const { id, compact, expanded, isExpandable, toggleExpand } = this; + const classNames = cssNames(SidebarItem.displayName, className, { + compact, + }); return ( -
-
- isActive} onClick={showSubMenus ? toggleExpand : undefined}> - {icon} {text} - - {showSubMenus && + + {icon} + {text} + {isExpandable && } -
- {showSubMenus && ( + + {isExpandable && expanded && (
    - {subMenus.map(({ title, url }) => ( - - {title} - - ))} - {React.Children.toArray(children).map((child: React.ReactElement) => { - return React.cloneElement(child, { - className: cssNames(child.props.className, { visible: expanded }), - }); + {subMenus.map(({ url, title, routePath }) => { + const subItemId = `${id}${routePath}`; + + return ( + + ); })} + {children}
)}
diff --git a/src/renderer/components/layout/sidebar.scss b/src/renderer/components/layout/sidebar.scss index cbf4c95415..5d39958c59 100644 --- a/src/renderer/components/layout/sidebar.scss +++ b/src/renderer/components/layout/sidebar.scss @@ -55,50 +55,11 @@ border-radius: 50%; } - .link-text { - flex: 1; - margin-left: $margin; - overflow: hidden; - text-overflow: ellipsis; - } - - > a { - display: flex; - align-items: center; - text-decoration: none; - border: none; - padding: $itemSpacing; - - &.active, &:hover { - background: $lensBlue; - color: $sidebarActiveColor; - } - } - hr { background-color: transparent; } } - .SidebarItem { - &.crd-group { - padding-left: 27px; - font-weight: 500; - - .nav-item { - &:hover { - background: transparent; - } - } - - .sub-menu { - a { - padding-left: $padding * 3; - } - } - } - } - .loading { padding: $padding; text-align: center; diff --git a/src/renderer/components/layout/sidebar.tsx b/src/renderer/components/layout/sidebar.tsx index 94840ffe4e..0e9131193b 100644 --- a/src/renderer/components/layout/sidebar.tsx +++ b/src/renderer/components/layout/sidebar.tsx @@ -62,8 +62,7 @@ export class Sidebar extends React.Component { return (