@appbuckets/react-ui
Version:
Just Another React UI Framework
215 lines (208 loc) • 5.96 kB
JavaScript
'use strict';
var tslib = require('tslib');
var React = require('react');
var clsx = require('clsx');
var reactUiCore = require('@appbuckets/react-ui-core');
require('../BucketTheme/BucketTheme.js');
var BucketContext = require('../BucketTheme/BucketContext.js');
var Button = require('../Button/Button.js');
var Popup = require('../Popup/Popup.js');
var Menu = require('../Menu/Menu.js');
function _interopDefaultLegacy(e) {
return e && typeof e === 'object' && 'default' in e ? e : { default: e };
}
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(
n,
k,
d.get
? d
: {
enumerable: true,
get: function () {
return e[k];
},
}
);
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/ _interopNamespace(React);
var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx);
/* --------
* Component Render
* -------- */
var DropdownMenu = function (receivedProps) {
var _a;
var props = BucketContext.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 = tslib.__rest(props, [
'as',
'basic',
'children',
'className',
'closeOnItemClicked',
'content',
'defaultOpen',
'inverted',
'items',
'onClose',
'onItemClick',
'onOpen',
'openOn',
'open',
'position',
'trigger',
]);
var ElementType = reactUiCore.useElementType(
DropdownMenu,
receivedProps,
props
);
var _b = tslib.__read(
reactUiCore.useAutoControlledValue(false, {
defaultProp: userDefinedDefaultOpen,
prop: userDefinedOpen,
}),
2
),
open = _b[0],
trySetOpen = _b[1];
var classes = clsx__default['default'](open && 'open', 'dropdown', className);
// ----
// Handlers
// ----
var handleMenuOpen = function (e) {
if (typeof onOpen === 'function') {
onOpen(e, tslib.__assign(tslib.__assign({}, props), { open: true }));
}
trySetOpen(true);
};
var handleMenuClose = function (e) {
if (typeof onClose === 'function') {
onClose(e, tslib.__assign(tslib.__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__namespace.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__namespace.createElement(
Menu,
tslib.__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';
module.exports = DropdownMenu;