UNPKG

chowa

Version:

UI component library based on React

79 lines (78 loc) 2.96 kB
/** * @license chowa v1.1.3 * * Copyright (c) Chowa Techonlogies Co.,Ltd.(http://www.chowa.cn). * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const React = require("react"); const PropTypes = require("prop-types"); const classnames_1 = require("classnames"); const utils_1 = require("../utils"); const collapse_panel_1 = require("./collapse-panel"); class Collapse extends React.PureComponent { constructor(props) { super(props); this.state = { selfActiveIndex: props.defaultActiveIndex || props.activeIndex }; this.accordionUpdate = this.accordionUpdate.bind(this); } componentDidUpdate(preProps) { if (this.props.activeIndex !== preProps.activeIndex && this.state.selfActiveIndex !== this.props.activeIndex) { this.setState({ selfActiveIndex: this.props.activeIndex }); } } accordionUpdate(index, fn) { if (!this.props.accordion) { return; } if (typeof this.preActivePanelStatus === 'function' && this.preActivePanelIndex !== index) { this.preActivePanelStatus(); } this.preActivePanelIndex = index; this.preActivePanelStatus = fn; } render() { const { children, style, bordered, className, arrowPosition, accordion } = this.props; const { selfActiveIndex } = this.state; const componentClass = classnames_1.default({ [utils_1.preClass('collapse')]: true, [utils_1.preClass('collapse-bordered')]: bordered, [className]: utils_1.isExist(className) }); return (React.createElement("section", { style: style, className: componentClass }, React.Children.map(children, (child, key) => { if (child.type !== collapse_panel_1.default) { return null; } const { index, active } = child.props; const panelIndex = index === undefined ? key : index; return React.cloneElement(child, { bordered, index: panelIndex, arrowPosition, active: accordion ? selfActiveIndex === panelIndex : active, accordionUpdate: this.accordionUpdate }); }))); } } Collapse.propTypes = { className: PropTypes.string, style: PropTypes.object, bordered: PropTypes.bool, accordion: PropTypes.bool, arrowPosition: PropTypes.oneOf(['left', 'right']), activeIndex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), defaultActiveIndex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) }; Collapse.defaultProps = { bordered: false, accordion: true, arrowPosition: 'left' }; Collapse.Panel = collapse_panel_1.default; exports.default = Collapse;