UNPKG

@syncfusion/react-splitbuttons

Version:

A package of feature-rich Pure React components such as DropDownButton, SplitButton, ProgressButton and ButtonGroup.

58 lines (57 loc) 3 kB
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import { useState, useRef, forwardRef, useImperativeHandle, useEffect } from 'react'; import { Button, IconPosition } from '@syncfusion/react-buttons'; import { preRender, useProviderContext } from '@syncfusion/react-base'; import { DropDownButton } from '../dropdown-button/dropdown-button'; /** * The SplitButton component provides a combination of a default button action and a dropdown menu, enabling users to quickly access additional options or actions in a compact interface. * * ```typescript * <SplitButton items={menuItems} icon={profileIcon} iconPosition={IconPosition.Right}>Default Action</SplitButton> * ``` */ export const SplitButton = forwardRef((props, ref) => { const { className = '', icon, iconPosition = IconPosition.Left, items = [], popupWidth = 'auto', disabled = false, target, lazyOpen = false, children, itemTemplate, color, variant, size, onOpen, onClose, onSelect, ...domProps } = props; const buttonRef = useRef(null); const dropDownRef = useRef(null); const wrapperRef = useRef(null); const [targetElement, setTargetElement] = useState(null); const { dir } = useProviderContext(); useEffect(() => { if (wrapperRef.current) { setTargetElement(wrapperRef); } }, []); const publicAPI = { iconPosition, icon, target, popupWidth, items, lazyOpen, itemTemplate, color, variant, size }; useEffect(() => { preRender('splitButton'); }, []); useImperativeHandle(ref, () => ({ ...publicAPI, toggle: () => { if (dropDownRef.current && dropDownRef.current.toggle) { dropDownRef.current.toggle(); } }, element: buttonRef.current?.element }), [publicAPI]); const wrapperClassName = [ 'sf-split-btn-wrapper', variant ? `sf-${variant.toLowerCase()}` : '', className, dir === 'rtl' ? 'sf-rtl' : '' ].filter(Boolean).join(' '); return (_jsx(_Fragment, { children: _jsxs("div", { ref: wrapperRef, className: wrapperClassName, children: [_jsx(Button, { ref: buttonRef, className: `${className} ${(dir === 'rtl') ? 'sf-rtl' : ''} sf-control sf-lib sf-btn sf-split-btn sf-keyboard`, icon: icon, color: color, variant: variant, size: size, iconPosition: iconPosition, disabled: disabled, ...domProps, children: children }), _jsx(DropDownButton, { ref: dropDownRef, relateTo: targetElement?.current, target: target || targetElement || undefined, className: `${className} ${(dir === 'rtl') ? 'sf-rtl' : ''} sf-icon-btn sf-control sf-dropdown-btn sf-lib sf-btn`, items: items, color: color, variant: variant, size: size, itemTemplate: itemTemplate, disabled: disabled, popupWidth: popupWidth, lazyOpen: lazyOpen, onOpen: onOpen, onClose: onClose, onSelect: onSelect })] }) })); }); export default SplitButton;