chowa
Version:
UI component library based on React
79 lines (78 loc) • 2.96 kB
JavaScript
/**
* @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;