mui-nested-menu
Version:
Infinitely deep nested menu items for MUI 5.
67 lines (66 loc) • 2.66 kB
TypeScript
import { SxProps } from "@mui/system/styleFunctionSx/styleFunctionSx";
import { MenuItemProps } from "@mui/material/MenuItem";
import React, { RefObject, ElementType, HTMLAttributes, ReactNode, RefAttributes, ForwardRefExoticComponent } from "react";
import { MenuProps } from "@mui/material/Menu";
import { ButtonProps } from "@mui/material/Button";
export interface MenuItemData {
uid?: string;
label?: string;
leftIcon?: React.ReactNode;
rightIcon?: React.ReactNode;
callback?: (event: React.MouseEvent<HTMLElement>, item: MenuItemData) => void;
items?: MenuItemData[];
disabled?: boolean;
sx?: SxProps;
delay?: number;
}
type IconMenuItemProps = {
MenuItemProps?: MenuItemProps;
className?: string;
disabled?: boolean;
label?: string;
renderLabel?: () => React.ReactNode;
leftIcon?: React.ReactNode;
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
ref?: RefObject<HTMLLIElement>;
rightIcon?: React.ReactNode;
sx?: SxProps;
};
export const IconMenuItem: React.ForwardRefExoticComponent<Omit<IconMenuItemProps, "ref"> & React.RefAttributes<HTMLLIElement>>;
export type NestedMenuItemProps = Omit<MenuItemProps, 'button'> & {
parentMenuOpen: boolean;
component?: ElementType;
label?: string;
renderLabel?: () => ReactNode;
rightIcon?: ReactNode;
leftIcon?: ReactNode;
children?: ReactNode;
className?: string;
tabIndex?: number;
disabled?: boolean;
ContainerProps?: HTMLAttributes<HTMLElement> & RefAttributes<HTMLElement | null>;
MenuProps?: Partial<Omit<MenuProps, 'children'>>;
button?: true | undefined;
delay?: number;
};
export const NestedMenuItem: ForwardRefExoticComponent<Omit<NestedMenuItemProps, "ref"> & RefAttributes<HTMLLIElement | null>>;
export interface nestedMenuItemsFromObjectProps {
menuItemsData: MenuItemData[];
isOpen: boolean;
handleClose: () => void;
}
export function nestedMenuItemsFromObject({ menuItemsData: items, isOpen, handleClose, }: nestedMenuItemsFromObjectProps): JSX.Element[];
export type ContextMenuProps = {
children?: ReactNode;
menuItems?: ReactNode[];
menuItemsData?: MenuItemData[];
};
export const ContextMenu: ForwardRefExoticComponent<ContextMenuProps & RefAttributes<HTMLDivElement>>;
interface NestedDropdownProps {
children?: React.ReactNode;
menuItemsData?: MenuItemData;
onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
ButtonProps?: Partial<ButtonProps>;
MenuProps?: Partial<MenuProps>;
}
export const NestedDropdown: ForwardRefExoticComponent<NestedDropdownProps & RefAttributes<HTMLDivElement | null>>;