UNPKG

rsuite

Version:

A suite of react components

171 lines (156 loc) 6.21 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; import React, { useCallback, useContext } from 'react'; import PropTypes from 'prop-types'; import get from 'lodash/get'; import AngleDownIcon from '@rsuite/icons/legacy/AngleDown'; import Collapse from '../Animation/Collapse'; import { useClassNames, useControlled } from '../utils'; import { PanelGroupContext } from '../PanelGroup'; var Panel = /*#__PURE__*/React.forwardRef(function (props, ref) { var _props$as = props.as, Component = _props$as === void 0 ? 'div' : _props$as, children = props.children, className = props.className, _props$classPrefix = props.classPrefix, classPrefix = _props$classPrefix === void 0 ? 'panel' : _props$classPrefix, bodyFill = props.bodyFill, bordered = props.bordered, collapsibleProp = props.collapsible, defaultExpanded = props.defaultExpanded, eventKey = props.eventKey, expandedProp = props.expanded, header = props.header, headerRoleProp = props.headerRole, _props$panelRole = props.panelRole, panelRole = _props$panelRole === void 0 ? 'region' : _props$panelRole, shaded = props.shaded, id = props.id, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, onSelect = props.onSelect, rest = _objectWithoutPropertiesLoose(props, ["as", "children", "className", "classPrefix", "bodyFill", "bordered", "collapsible", "defaultExpanded", "eventKey", "expanded", "header", "headerRole", "panelRole", "shaded", "id", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "onSelect"]); var _useClassNames = useClassNames(classPrefix), merge = _useClassNames.merge, prefix = _useClassNames.prefix, withClassPrefix = _useClassNames.withClassPrefix; var _ref = useContext(PanelGroupContext) || {}, accordion = _ref.accordion, activeKey = _ref.activeKey, onGroupSelect = _ref.onGroupSelect; var _useControlled = useControlled(expandedProp, defaultExpanded || typeof activeKey !== 'undefined' && activeKey === eventKey), expandedState = _useControlled[0], setExpanded = _useControlled[1]; var collapsible = collapsibleProp; var headerRole = headerRoleProp; var expanded = expandedState; if (accordion) { collapsible = true; headerRole = 'button'; // Collapses all inactive panels. if (typeof activeKey !== 'undefined' && activeKey !== eventKey) { expanded = false; } } var handleSelect = useCallback(function (event) { onSelect === null || onSelect === void 0 ? void 0 : onSelect(eventKey, event); onGroupSelect === null || onGroupSelect === void 0 ? void 0 : onGroupSelect(eventKey, event); setExpanded(!expanded); }, [eventKey, expanded, onGroupSelect, onSelect, setExpanded]); var renderBody = useCallback(function () { var classes = prefix('body', { 'body-fill': bodyFill }); return /*#__PURE__*/React.createElement("div", { role: panelRole, className: classes }, children); }, [bodyFill, children, panelRole, prefix]); var renderCollapsibleBody = function renderCollapsibleBody() { return /*#__PURE__*/React.createElement(Collapse, { in: expanded, onEnter: onEnter, onEntering: onEntering, onEntered: onEntered, onExit: onExit, onExiting: onExiting, onExited: onExited }, function (transitionProps, ref) { var className = transitionProps.className, rest = _objectWithoutPropertiesLoose(transitionProps, ["className"]); return /*#__PURE__*/React.createElement("div", _extends({}, rest, { id: id ? "" + id : null, "aria-expanded": expanded, className: merge(className, prefix('collapse')), ref: ref }), renderBody()); }); }; var renderHeading = function renderHeading() { if (!header) { return null; } var content; if (! /*#__PURE__*/React.isValidElement(header) || Array.isArray(header)) { content = collapsible ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(AngleDownIcon, { rotate: expanded ? 180 : 0 }), /*#__PURE__*/React.createElement("span", { className: prefix('title'), role: "presentation" }, /*#__PURE__*/React.createElement("span", { className: expanded ? undefined : 'collapsed' }, header))) : header; } else { var _className = merge(prefix('title'), get(header, 'props.className')); content = /*#__PURE__*/React.cloneElement(header, { className: _className }); } return /*#__PURE__*/React.createElement("div", { role: headerRole, "aria-controls": collapsible && id ? "" + id : undefined, "aria-expanded": expanded, className: prefix('header'), onClick: collapsible ? handleSelect : undefined, tabIndex: -1 }, content); }; var classes = merge(className, withClassPrefix({ in: expanded, collapsible: collapsible, bordered: bordered, shaded: shaded })); return /*#__PURE__*/React.createElement(Component, _extends({}, rest, { ref: ref, className: classes, id: collapsible ? null : id }), renderHeading(), collapsible ? renderCollapsibleBody() : renderBody()); }); Panel.displayName = 'Panel'; Panel.propTypes = { collapsible: PropTypes.bool, bordered: PropTypes.bool, shaded: PropTypes.bool, bodyFill: PropTypes.bool, header: PropTypes.any, defaultExpanded: PropTypes.bool, expanded: PropTypes.bool, eventKey: PropTypes.any, headerRole: PropTypes.string, panelRole: PropTypes.string, classPrefix: PropTypes.string, children: PropTypes.node, onSelect: PropTypes.func, onEnter: PropTypes.func, onEntering: PropTypes.func, onEntered: PropTypes.func, onExit: PropTypes.func, onExiting: PropTypes.func, onExited: PropTypes.func, className: PropTypes.string }; export default Panel;