@appbuckets/react-ui
Version:
Just Another React UI Framework
179 lines (176 loc) • 5.06 kB
JavaScript
import { __rest, __read, __assign } from 'tslib';
import * as React from 'react';
import clsx from 'clsx';
import {
useElementType,
useAutoControlledValue,
} from '@appbuckets/react-ui-core';
import '../BucketTheme/BucketTheme.js';
import { useWithDefaultProps } from '../BucketTheme/BucketContext.js';
import Button from '../Button/Button.js';
import Popup from '../Popup/Popup.js';
import Menu from '../Menu/Menu.js';
/* --------
* Component Render
* -------- */
var DropdownMenu = function (receivedProps) {
var _a;
var props = useWithDefaultProps('dropdownMenu', receivedProps);
props.as;
var basic = props.basic,
children = props.children,
className = props.className,
closeOnItemClicked = props.closeOnItemClicked;
props.content;
var userDefinedDefaultOpen = props.defaultOpen,
inverted = props.inverted,
items = props.items,
onClose = props.onClose,
onItemClick = props.onItemClick,
onOpen = props.onOpen,
openOn = props.openOn,
userDefinedOpen = props.open,
position = props.position,
trigger = props.trigger,
rest = __rest(props, [
'as',
'basic',
'children',
'className',
'closeOnItemClicked',
'content',
'defaultOpen',
'inverted',
'items',
'onClose',
'onItemClick',
'onOpen',
'openOn',
'open',
'position',
'trigger',
]);
var ElementType = useElementType(DropdownMenu, receivedProps, props);
var _b = __read(
useAutoControlledValue(false, {
defaultProp: userDefinedDefaultOpen,
prop: userDefinedOpen,
}),
2
),
open = _b[0],
trySetOpen = _b[1];
var classes = clsx(open && 'open', 'dropdown', className);
// ----
// Handlers
// ----
var handleMenuOpen = function (e) {
if (typeof onOpen === 'function') {
onOpen(e, __assign(__assign({}, props), { open: true }));
}
trySetOpen(true);
};
var handleMenuClose = function (e) {
if (typeof onClose === 'function') {
onClose(e, __assign(__assign({}, props), { open: false }));
}
trySetOpen(false);
};
// ----
// Trigger Element
// ----
var triggerElement =
(_a = Button.create(trigger, {
autoGenerateKey: false,
overrideProps: function (defaultProps) {
return {
onClick: function (event, buttonProps) {
/** Call user defined handler */
if (defaultProps.onClick) {
defaultProps.onClick(event, buttonProps);
}
/** On trigger click toggle menu */
if (open) {
handleMenuClose(event);
} else {
handleMenuOpen(event);
}
},
};
},
})) !== null && _a !== void 0
? _a
: undefined;
// ----
// On Item Click Handlers
// ----
var handleMenuItemClick = function (event, itemProps) {
/** If a user defined handler for click on menu item exists, call it */
if (typeof onItemClick === 'function') {
onItemClick(event, itemProps);
}
/** If the menu must be close on item click, call the handleCloseMenu */
if (closeOnItemClicked) {
handleMenuClose(event);
}
};
// ----
// Component Render
// ----
return React.createElement(Popup, {
className: 'dropdown-container',
portalProps: {
open: open,
closeOnDocumentClick: true,
},
basic: basic,
inverted: inverted,
trigger: triggerElement,
openOn: openOn,
position: position,
onOpen: handleMenuOpen,
onClose: handleMenuClose,
content: React.createElement(
Menu,
__assign({ avoidActive: true, text: true, vertical: true }, rest, {
as: ElementType,
className: classes,
items: items,
onItemClick: handleMenuItemClick,
}),
children
),
// <ElementType {...rest} className={classes}>
// {
// Array.isArray(items)
// ? items.map((item) => (
// MenuItem.create(item, {
// autoGenerateKey: true,
// overrideProps : ({ onClick, ...itemRest }) => ({
// onClick: (e: React.MouseEvent<HTMLElement>, itemProps: MenuItemProps) => {
// /** Call defined itemClick handler */
// if (typeof onItemClick === 'function') {
// onItemClick(e, itemProps);
// }
//
// /** Call menu item click handler */
// if (onClick) {
// onClick(e, itemProps);
// }
//
// /** Check if must close the menu */
// if (closeOnItemClicked) {
// handleMenuClose(e);
// }
// },
// ...itemRest
// })
// })
// ))
// : childrenUtils.isNil(children) ? content : children
// }
// </ElementType>
});
};
DropdownMenu.displayName = 'DropdownMenu';
export { DropdownMenu as default };