diff --git a/src/renderer/components/cluster-manager/clusters-menu.scss b/src/renderer/components/cluster-manager/clusters-menu.scss index 5256209b0a..e170bcf406 100644 --- a/src/renderer/components/cluster-manager/clusters-menu.scss +++ b/src/renderer/components/cluster-manager/clusters-menu.scss @@ -32,7 +32,6 @@ margin-bottom: $margin; .Icon { - margin-bottom: $margin * 1.5; border-radius: $radius; padding: $padding / 3; color: var(--textColorPrimary); diff --git a/src/renderer/components/cluster-manager/clusters-menu.tsx b/src/renderer/components/cluster-manager/clusters-menu.tsx index 03711e41fc..b2c5825e20 100644 --- a/src/renderer/components/cluster-manager/clusters-menu.tsx +++ b/src/renderer/components/cluster-manager/clusters-menu.tsx @@ -118,13 +118,13 @@ export class ClustersMenu extends React.Component {
this.workspaceMenuVisible = true} close={() => this.workspaceMenuVisible = false} toggleEvent="click" + position={{right: "outside", top: "inside"}} > navigate(addClusterURL())} data-test-id="add-cluster-menu-item"> Add Cluster diff --git a/src/renderer/components/menu/menu.scss b/src/renderer/components/menu/menu.scss index e7e4cee7e6..921e91a3e4 100644 --- a/src/renderer/components/menu/menu.scss +++ b/src/renderer/components/menu/menu.scss @@ -9,6 +9,8 @@ border: 1px solid $borderColor; z-index: 101; + // TODO: support predefined positions setup when rendered in document.body + // auto-positioning currently applied inside component on menu open &.portal { left: -1000px; top: -1000px; @@ -22,23 +24,46 @@ } } + // predefined positions without `usePortal` (default) where menu is rendered inside it's parent dom tree. &:not(.portal) { - margin: $margin 0; - &.left { - left: 0; + &-inside { + left: 0; + } + + &-outside { + right: 100%; + } } &.right { - right: 0; + &-inside { + right: 0; + } + + &-outside { + left: 100%; + } } &.top { - bottom: 100%; + &-inside { + top: 0; + } + + &-outside { + bottom: 100%; + } } &.bottom { - top: 100%; + &-inside { + bottom: 0; + } + + &-outside { + top: 100%; + } } } diff --git a/src/renderer/components/menu/menu.tsx b/src/renderer/components/menu/menu.tsx index 5e070698dd..6e3cdfc077 100644 --- a/src/renderer/components/menu/menu.tsx +++ b/src/renderer/components/menu/menu.tsx @@ -9,12 +9,13 @@ import debounce from "lodash/debounce"; export const MenuContext = React.createContext(null); export type MenuContextValue = Menu; +export type MenuPositionSide = "inside" | "outside"; export interface MenuPosition { - left?: boolean; - top?: boolean; - right?: boolean; - bottom?: boolean; + left?: MenuPositionSide; + top?: MenuPositionSide; + right?: MenuPositionSide; + bottom?: MenuPositionSide; } export interface MenuProps { @@ -35,11 +36,16 @@ export interface MenuProps { } interface State { - position?: MenuPosition; + position?: { + left?: boolean; + top?: boolean; + right?: boolean; + bottom?: boolean; + }; } const defaultPropsMenu: Partial = { - position: { right: true, bottom: true }, + position: { left: "inside", bottom: "outside" }, autoFocus: false, usePortal: false, closeOnClickItem: true, @@ -137,7 +143,12 @@ export class Menu extends React.Component { } // setup initial position - const position: MenuPosition = { left: true, bottom: true }; + const position = { + bottom: true, + left: true, + right: false, + top: false, + }; this.elem.style.left = `${left}px`; this.elem.style.top = `${bottom}px`; @@ -248,12 +259,14 @@ export class Menu extends React.Component { } render() { - const { position, id } = this.props; - let { className, usePortal } = this.props; + const { position = {}, id, className } = this.props; + let { usePortal } = this.props; - className = cssNames("Menu", className, this.state.position || position, { - portal: usePortal, - }); + const positionClasses = usePortal + ? this.state.position // auto-corrected position to be visible in viewport + : Object.entries(position).map(entry => entry.join("-")); // positioning relative to parent + + const classNames = cssNames("Menu", className, { portal: usePortal }, positionClasses); let children = this.props.children as ReactElement; @@ -273,7 +286,7 @@ export class Menu extends React.Component { const menu = ( -
    +
      {menuItems}