UNPKG

react-foundation-components

Version:

Foundation Sites components built with the power of React and CSS Modules

258 lines (203 loc) 8.68 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Accordion = exports.AccordionItem = undefined; var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _bind = require('classnames/bind'); var _bind2 = _interopRequireDefault(_bind); var _uncontrollable = require('uncontrollable'); var _uncontrollable2 = _interopRequireDefault(_uncontrollable); var _includes = require('lodash/includes'); var _includes2 = _interopRequireDefault(_includes); var _noop = require('lodash/noop'); var _noop2 = _interopRequireDefault(_noop); var _isBlank = require('underscore.string/isBlank'); var _isBlank2 = _interopRequireDefault(_isBlank); var _collapse = require('../collapse'); var _styles = require('./_styles.scss'); var _styles2 = _interopRequireDefault(_styles); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var cxStyles = _bind2.default.bind(_styles2.default); var AccordionItemControlled = function AccordionItemControlled(_ref) { var active = _ref.active, children = _ref.children, className = _ref.className, contentClassName = _ref.contentClassName, contentStyle = _ref.contentStyle, eventKey = _ref.eventKey, id = _ref.id, onClick = _ref.onClick, onSelect = _ref.onSelect, onToggle = _ref.onToggle, title = _ref.title, titleClassName = _ref.titleClassName, titleStyle = _ref.titleStyle, restProps = (0, _objectWithoutProperties3.default)(_ref, ['active', 'children', 'className', 'contentClassName', 'contentStyle', 'eventKey', 'id', 'onClick', 'onSelect', 'onToggle', 'title', 'titleClassName', 'titleStyle']); var classNames = (0, _classnames2.default)(className, cxStyles('accordion-item', { 'is-active': active })); var titleClassNames = (0, _classnames2.default)(titleClassName, cxStyles('accordion-title')); var contentClassNames = (0, _classnames2.default)(contentClassName, cxStyles('accordion-content')); var titleId = null; var contentId = null; if (!(0, _isBlank2.default)(id)) { titleId = id + 'Title'; contentId = id + 'Content'; } var onTitleClick = function onTitleClick() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var event = args[0]; event.preventDefault(); if (onClick) { onClick.apply(undefined, args); } if (onToggle) { onToggle.apply(undefined, [!active].concat(args)); } if (onSelect) { onSelect.apply(undefined, [eventKey].concat(args)); } }; return _react2.default.createElement( 'li', (0, _extends3.default)({}, restProps, { className: classNames, id: id }), _react2.default.createElement( 'a', { 'aria-controls': contentId, 'aria-expanded': active, 'aria-selected': active, className: titleClassNames, href: '#', id: titleId, onClick: onTitleClick, role: 'tab', style: titleStyle }, title ), _react2.default.createElement( _collapse.Collapse, { 'in': active }, _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { 'aria-hidden': !active, 'aria-labelledby': titleId, className: contentClassNames, id: contentId, role: 'tabpanel', style: (0, _extends3.default)({}, contentStyle, { display: 'block' }) }, children ) ) ) ); }; AccordionItemControlled.propTypes = { active: _propTypes2.default.bool, children: _propTypes2.default.node, className: _propTypes2.default.string, contentClassName: _propTypes2.default.string, contentStyle: _propTypes2.default.object, eventKey: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]), id: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]), onClick: _propTypes2.default.func, onSelect: _propTypes2.default.func, onToggle: _propTypes2.default.func, title: _propTypes2.default.node, titleClassName: _propTypes2.default.string, titleStyle: _propTypes2.default.object }; var AccordionItem = exports.AccordionItem = (0, _uncontrollable2.default)(AccordionItemControlled, { active: 'onToggle' }); AccordionItem.displayName = 'AccordionItem'; var AccordionControlled = function AccordionControlled(_ref2) { var allowAllClosed = _ref2.allowAllClosed, children = _ref2.children, className = _ref2.className, multiExpand = _ref2.multiExpand, _ref2$activeKey = _ref2.activeKey, maybeActiveKey = _ref2$activeKey === undefined ? multiExpand ? [] : null : _ref2$activeKey, onSelect = _ref2.onSelect, restProps = (0, _objectWithoutProperties3.default)(_ref2, ['allowAllClosed', 'children', 'className', 'multiExpand', 'activeKey', 'onSelect']); var activeKey = maybeActiveKey; if (!allowAllClosed && (multiExpand && activeKey.length === 0 || (0, _isBlank2.default)(activeKey))) { var childArray = _react.Children.toArray(children).filter(function (child) { return (0, _react.isValidElement)(child) && !(0, _isBlank2.default)(child.props.eventKey); }); if (childArray.length >= 1) { var firstKey = childArray[0].props.eventKey; activeKey = multiExpand ? [firstKey] : firstKey; } } var onChildSelect = function onChildSelect(eventKey) { for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } if (multiExpand) { if ((0, _includes2.default)(activeKey, eventKey)) { var filtered = activeKey.filter(function (item) { return item !== eventKey; }); if (!allowAllClosed && filtered.length === 0) { onSelect.apply(undefined, [[eventKey]].concat(args)); } else { onSelect.apply(undefined, [filtered].concat(args)); } } else { onSelect.apply(undefined, [[].concat((0, _toConsumableArray3.default)(activeKey), [eventKey])].concat(args)); } } else { if (allowAllClosed && activeKey === eventKey) { onSelect.apply(undefined, [null].concat(args)); } else { onSelect.apply(undefined, [eventKey].concat(args)); } } }; var classNames = (0, _classnames2.default)(className, cxStyles('accordion')); var clonedChildren = _react.Children.map(children, function (child) { if ((0, _react.isValidElement)(child)) { return (0, _react.cloneElement)(child, { active: multiExpand ? (0, _includes2.default)(activeKey, child.props.eventKey) : activeKey === child.props.eventKey, onSelect: onChildSelect, onToggle: _noop2.default }); } return child; }); return _react2.default.createElement( 'ul', (0, _extends3.default)({}, restProps, { className: classNames, role: 'tablist' }), clonedChildren ); }; AccordionControlled.propTypes = { activeKey: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.arrayOf(_propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]))]), allowAllClosed: _propTypes2.default.bool, children: _propTypes2.default.node, className: _propTypes2.default.string, defaultActiveKey: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.arrayOf(_propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]))]), multiExpand: _propTypes2.default.bool, onSelect: _propTypes2.default.func }; var Accordion = exports.Accordion = (0, _uncontrollable2.default)(AccordionControlled, { activeKey: 'onSelect' }); Accordion.displayName = 'Accordion'; Accordion.Item = AccordionItem; exports.default = Accordion;