import * as React from 'react'
import { Menu } from '@planview/pv-icons'
import { DropdownMenu, ListItemDivider } from '@planview/pv-uikit'
import { ToolbarSection } from '.'
import ResizeContext, {
MoreMenuContext,
MoreMenuProvider,
} from '../utils/context'
import { COLLAPSE_BELOW, MoreMenuButton } from '../more-menu'
export type ToolbarSectionRightProps = {
/** content of the section */
children: React.ReactNode | React.ReactNode[]
/** label for the more menu */
moreMenuLabel?: string
}
export type ToolbarSectionWithMenuProps = ToolbarSectionRightProps
const ToolbarSectionRightInner = ({
children,
moreMenuLabel,
}: ToolbarSectionRightProps) => {
const { shouldDisplay } = React.useContext(ResizeContext)
const { registeredItems, customMoreMenu } =
React.useContext(MoreMenuContext)
const dropdownChildren = React.useMemo(
() =>
registeredItems
.filter((c) => shouldDisplay(c.displayOn))
.map((c) => c.child),
[shouldDisplay, registeredItems]
)
const shouldShowMoreMenu = React.useMemo((): boolean => {
if (customMoreMenu) {
return true
}
return !!dropdownChildren.length
}, [dropdownChildren.length, customMoreMenu])
const dropDownContent = React.useMemo(() => {
const centerContent = dropdownChildren
const hasCustomContent = !!customMoreMenu?.children
const divider =
hasCustomContent && centerContent?.length ? (
) : null
if (customMoreMenu?.collapse === COLLAPSE_BELOW) {
return (
<>
{customMoreMenu.children}
{divider}
{centerContent}
>
)
}
return (
<>
{centerContent}
{divider}
{customMoreMenu?.children}
>
)
}, [customMoreMenu, dropdownChildren])
return (
{children}
{shouldShowMoreMenu ? (
(
)
}
activated={props['aria-expanded']}
{...props}
/>
)}
>
{dropDownContent}
) : null}
)
}
/**
* Implementation of the [Toolbar Right Section Specification](https://design.planview.com/components/toolbar/toolbar#right-section)
*
* This component has the ability to move buttons, dropdowns and button-groups inside a more menu depending on the overall width of the toolbar.
*
* _Note: This component was previously named `ToolbarSectionWithMenu`. It has been renamed to improve clarity._
*
* ### Responsive behavior with displayOn
*
* The `ToolbarSectionRight` component introduces the concept of `displayOn` to determine which buttons should collapse
* into the more menu when adapting to smaller screens.
*
* - All buttons will move into the more menu based on their `displayOn` setting, and the current breakpoint.
* Note: the breakpoint is based on the toolbar width, not the full page (if the toolbar is narrower than the page).
*
* ### Usage
*
* Even if you only need content on the right, you must supply a `ToolbarSectionLeft` to have the content render on the right:
*
* ```tsx
* import { ToolbarContainer, ToolbarSectionLeft, ToolbarSectionRight } from '@planview/pv-toolbar'
*
* export const PageToolbar = () => (
*
*
*
* ...
*
*
* )
* ```
*/
export const ToolbarSectionRight = ({
children,
moreMenuLabel,
}: ToolbarSectionRightProps) => (
{children}
)
export const ToolbarSectionWithMenu = ToolbarSectionRight