UNPKG

glass-app-manager

Version:

Informatica's Glass Framework CLI for bootstrapping

93 lines (78 loc) 2.85 kB
// @flow import * as React from "react"; import classNames from "classnames"; import Popup from "../popup/Popup"; import ReactResizeDetector from "react-resize-detector"; type Props = { /** * Children of Toolbar can be any component such as `Input`, `Button`, `Dropdown` */ children: React.Node, /** * Whether toolbar should align to left (default align to right) */ alignLeft?: boolean, /** * Whether toolbar should be responsive. When toolbar is responsive and available width is less than overflowCutoff, toolbar will become a dropdown. Content in `Toolbar.Overflow` child component will be show in dropdow. */ responsive?: boolean, /** * cutoff width to show toolbar as a dropdown */ overflowCutoff?: number, /** * Additional class selectors to pass to component. */ className?: string, }; export default function Toolbar(props: Props) { const { alignLeft, children, className, overflowCutoff, responsive, ...rest } = props; let overflow: React.Element<any>; let items = []; const filterChild = (child: React.Element<any>) => { if (child.type === Toolbar.Overflow) { overflow = child; } else { items.push(child); } }; const aChildren = React.Children.toArray(children); aChildren.forEach(filterChild); return ( <div className={classNames("toolbar", className, { "align-left": alignLeft })} {...rest}> {responsive ? ( <ReactResizeDetector handleWidth> {width => { if (width > overflowCutoff) { return <div className="toolbar__content">{items}</div>; } return ( <Popup on="click" trigger={<i className="aicon aicon__hamburger" />} content={overflow || items} position="bottom" /> ); }} </ReactResizeDetector> ) : ( <div className="toolbar__content">{items}</div> )} </div> ); } Toolbar.defaultProps = { alignLeft: false, responsive: false, overflowCutoff: 400, }; Toolbar.Separator = () => { return <span className="toolbar__separator" />; }; Toolbar.Overflow = (props: { children: Array<React.Node> | React.Node }) => { return <div>{props.children}</div>; }; Toolbar.displayName = "Toolbar"; Toolbar.Separator.displayName = "ToolbarSeparator"; Toolbar.Overflow.displayName = "ToolbarOverflow";