UNPKG

9.03 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
10
11var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
12
13var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
14
15var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
16
17var _inherits2 = require('babel-runtime/helpers/inherits');
18
19var _inherits3 = _interopRequireDefault(_inherits2);
20
21var _class, _temp;
22
23var _react = require('react');
24
25var _react2 = _interopRequireDefault(_react);
26
27var _propTypes = require('prop-types');
28
29var _propTypes2 = _interopRequireDefault(_propTypes);
30
31var _classnames = require('classnames');
32
33var _classnames2 = _interopRequireDefault(_classnames);
34
35var _reactLifecyclesCompat = require('react-lifecycles-compat');
36
37var _configProvider = require('../config-provider');
38
39var _configProvider2 = _interopRequireDefault(_configProvider);
40
41var _util = require('../util');
42
43var _panel = require('./panel');
44
45var _panel2 = _interopRequireDefault(_panel);
46
47function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
49/** Collapse */
50var Collapse = (_temp = _class = function (_React$Component) {
51 (0, _inherits3.default)(Collapse, _React$Component);
52
53 function Collapse(props) {
54 (0, _classCallCheck3.default)(this, Collapse);
55
56 var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props));
57
58 var expandedKeys = void 0;
59 if ('expandedKeys' in props) {
60 expandedKeys = props.expandedKeys;
61 } else {
62 expandedKeys = props.defaultExpandedKeys;
63 }
64
65 _this.state = {
66 expandedKeys: typeof expandedKeys === 'undefined' ? [] : expandedKeys
67 };
68 return _this;
69 }
70
71 Collapse.getDerivedStateFromProps = function getDerivedStateFromProps(props) {
72 if ('expandedKeys' in props) {
73 return {
74 expandedKeys: typeof props.expandedKeys === 'undefined' ? [] : props.expandedKeys
75 };
76 }
77 return null;
78 };
79
80 Collapse.prototype.onItemClick = function onItemClick(key) {
81 var expandedKeys = this.state.expandedKeys;
82 if (this.props.accordion) {
83 expandedKeys = String(expandedKeys[0]) === String(key) ? [] : [key];
84 } else {
85 expandedKeys = [].concat(expandedKeys);
86 var stringKey = String(key);
87 var index = expandedKeys.findIndex(function (k) {
88 return String(k) === stringKey;
89 });
90 var isExpanded = index > -1;
91 if (isExpanded) {
92 expandedKeys.splice(index, 1);
93 } else {
94 expandedKeys.push(key);
95 }
96 }
97 this.setExpandedKey(expandedKeys);
98 };
99
100 Collapse.prototype.genratePanelId = function genratePanelId(itemId, index) {
101 var collapseId = this.props.id;
102
103 var id = void 0;
104 if (itemId) {
105 // 优先用 item自带的id
106 id = itemId;
107 } else if (collapseId) {
108 // 其次用 collapseId 和 index 生成id
109 id = collapseId + '-panel-' + index;
110 }
111 return id;
112 };
113
114 Collapse.prototype.getProps = function getProps(item, index, key) {
115 var _this2 = this;
116
117 var expandedKeys = this.state.expandedKeys;
118 var title = item.title;
119
120 var disabled = this.props.disabled;
121
122 if (!disabled) {
123 disabled = item.disabled;
124 }
125
126 var isExpanded = false;
127
128 if (this.props.accordion) {
129 isExpanded = String(expandedKeys[0]) === String(key);
130 } else {
131 isExpanded = expandedKeys.some(function (expandedKey) {
132 if (expandedKey === null || expandedKey === undefined || key === null || key === undefined) {
133 return false;
134 }
135
136 if (expandedKey === key || expandedKey.toString() === key.toString()) {
137 return true;
138 }
139 return false;
140 });
141 }
142
143 var id = this.genratePanelId(item.id, index);
144 return {
145 key: key,
146 title: title,
147 isExpanded: isExpanded,
148 disabled: disabled,
149 id: id,
150 onClick: disabled ? null : function () {
151 _this2.onItemClick(key);
152 if ('onClick' in item) {
153 item.onClick(key);
154 }
155 }
156 };
157 };
158
159 Collapse.prototype.getItemsByDataSource = function getItemsByDataSource() {
160 var _this3 = this;
161
162 var props = this.props;
163 var dataSource = props.dataSource;
164 // 是否有dataSource.item传入过key
165
166 var hasKeys = dataSource.some(function (item) {
167 return 'key' in item;
168 });
169
170 return dataSource.map(function (item, index) {
171 // 传入过key就用item.key 没传入则统一使用index为key
172 var key = hasKeys ? item.key : '' + index;
173 return _react2.default.createElement(
174 _panel2.default,
175 (0, _extends3.default)({}, _this3.getProps(item, index, key), { key: key }),
176 item.content
177 );
178 });
179 };
180
181 Collapse.prototype.getItemsByChildren = function getItemsByChildren() {
182 var _this4 = this;
183
184 // 是否有child传入过key
185 var allKeys = _react2.default.Children.map(this.props.children, function (child) {
186 return child && child.key;
187 });
188 var hasKeys = Boolean(allKeys && allKeys.length);
189
190 return _react2.default.Children.map(this.props.children, function (child, index) {
191 if (child && typeof child.type === 'function' && child.type.isNextPanel) {
192 // 传入过key就用child.key 没传入则统一使用index为key
193 var key = hasKeys ? child.key : '' + index;
194 return _react2.default.cloneElement(child, _this4.getProps(child.props, index, key));
195 } else {
196 return child;
197 }
198 });
199 };
200
201 Collapse.prototype.setExpandedKey = function setExpandedKey(expandedKeys) {
202 if (!('expandedKeys' in this.props)) {
203 this.setState({ expandedKeys: expandedKeys });
204 }
205 this.props.onExpand(this.props.accordion ? expandedKeys[0] : expandedKeys);
206 };
207
208 Collapse.prototype.render = function render() {
209 var _classNames;
210
211 var _props = this.props,
212 prefix = _props.prefix,
213 className = _props.className,
214 style = _props.style,
215 disabled = _props.disabled,
216 dataSource = _props.dataSource,
217 id = _props.id,
218 rtl = _props.rtl;
219
220 var collapseClassName = (0, _classnames2.default)((_classNames = {}, _classNames[prefix + 'collapse'] = true, _classNames[prefix + 'collapse-disabled'] = disabled, _classNames[className] = Boolean(className), _classNames));
221
222 var others = _util.obj.pickOthers(Collapse.propTypes, this.props);
223 return _react2.default.createElement(
224 'div',
225 (0, _extends3.default)({
226 id: id,
227 className: collapseClassName,
228 style: style
229 }, others, {
230 role: 'presentation',
231 dir: rtl ? 'rtl' : undefined
232 }),
233 dataSource ? this.getItemsByDataSource() : this.getItemsByChildren()
234 );
235 };
236
237 return Collapse;
238}(_react2.default.Component), _class.propTypes = {
239 /**
240 * 样式前缀
241 */
242 prefix: _propTypes2.default.string,
243 /**
244 * 组件接受行内样式
245 */
246 style: _propTypes2.default.object,
247 /**
248 * 使用数据模型构建
249 */
250 dataSource: _propTypes2.default.array,
251 /**
252 * 默认展开keys
253 */
254 defaultExpandedKeys: _propTypes2.default.array,
255 /**
256 * 受控展开keys
257 */
258 expandedKeys: _propTypes2.default.array,
259 /**
260 * 展开状态发升变化时候的回调
261 */
262 onExpand: _propTypes2.default.func,
263 /**
264 * 所有禁用
265 */
266 disabled: _propTypes2.default.bool,
267 /**
268 * 扩展class
269 */
270 className: _propTypes2.default.string,
271 /**
272 * 手风琴模式,一次只能打开一个
273 */
274 accordion: _propTypes2.default.bool,
275 children: _propTypes2.default.node,
276 id: _propTypes2.default.string,
277 rtl: _propTypes2.default.bool
278}, _class.defaultProps = {
279 accordion: false,
280 prefix: 'next-',
281 onExpand: _util.func.noop
282}, _class.contextTypes = {
283 prefix: _propTypes2.default.string
284}, _temp);
285Collapse.displayName = 'Collapse';
286exports.default = (0, _reactLifecyclesCompat.polyfill)(_configProvider2.default.config(Collapse));
287module.exports = exports['default'];
\No newline at end of file