UNPKG

10.2 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
8
9var _classnames = require('classnames');
10
11var _classnames2 = _interopRequireDefault(_classnames);
12
13var _react = require('react');
14
15var _react2 = _interopRequireDefault(_react);
16
17var _beeTransition = require('bee-transition');
18
19var _propTypes = require('prop-types');
20
21var _propTypes2 = _interopRequireDefault(_propTypes);
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
24
25function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
26
27function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
28
29function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
30
31function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
32
33function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
34
35function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
36
37var propTypes = {
38 //是否添加折叠
39 collapsible: _propTypes2["default"].bool,
40 onSelect: _propTypes2["default"].func,
41 //头部组件
42 header: _propTypes2["default"].node,
43 headerStyle: _propTypes2["default"].object,
44 id: _propTypes2["default"].oneOfType([_propTypes2["default"].string, _propTypes2["default"].number]),
45 headerContent: _propTypes2["default"].bool,
46 //footer组件
47 footer: _propTypes2["default"].node,
48 footerStyle: _propTypes2["default"].object,
49 //默认是否打开
50 defaultExpanded: _propTypes2["default"].bool,
51 //是否打开
52 expanded: _propTypes2["default"].bool,
53 //每个panel的标记
54 eventKey: _propTypes2["default"].any,
55 headerRole: _propTypes2["default"].string,
56 panelRole: _propTypes2["default"].string,
57 //颜色
58 colors: _propTypes2["default"].oneOf(['primary', 'accent', 'success', 'info', 'warning', 'danger', 'default', 'bordered']),
59
60 // From Collapse.的扩展动画
61 onEnter: _propTypes2["default"].func,
62 onEntering: _propTypes2["default"].func,
63 onEntered: _propTypes2["default"].func,
64 onExit: _propTypes2["default"].func,
65 onExiting: _propTypes2["default"].func,
66 onExited: _propTypes2["default"].func
67};
68
69var defaultProps = {
70 defaultExpanded: false,
71 clsPrefix: "u-panel",
72 colors: "default"
73};
74
75var Panel = function (_React$Component) {
76 _inherits(Panel, _React$Component);
77
78 function Panel(props, context) {
79 _classCallCheck(this, Panel);
80
81 var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
82
83 _this.handleClickTitle = _this.handleClickTitle.bind(_this);
84
85 _this.state = {
86 expanded: _this.props.defaultExpanded
87 };
88 return _this;
89 }
90
91 //头部点击事件
92
93
94 Panel.prototype.handleClickTitle = function handleClickTitle(e) {
95 // 不让事件进入事件池
96 e.persist();
97 e.selected = true;
98
99 if (this.props.onSelect) {
100 this.props.onSelect(this.props.eventKey, e);
101 } else {
102 e.preventDefault();
103 }
104
105 if (e.selected) {
106 this.setState({ expanded: !this.state.expanded });
107 }
108 };
109
110 //渲染panelheader
111
112
113 Panel.prototype.renderHeader = function renderHeader(collapsible, header, id, role, expanded, clsPrefix) {
114 var titleClassName = clsPrefix + '-title';
115
116 if (!collapsible) {
117 if (!_react2["default"].isValidElement(header)) {
118 return header;
119 }
120
121 return (0, _react.cloneElement)(header, {
122 className: (0, _classnames2["default"])(header.props.className, titleClassName)
123 });
124 }
125
126 if (!_react2["default"].isValidElement(header)) {
127 return _react2["default"].createElement(
128 'h4',
129 { role: 'presentation', className: titleClassName },
130 this.renderAnchor(header, id, role, expanded)
131 );
132 }
133 if (this.props.headerContent) {
134 return (0, _react.cloneElement)(header, {
135 className: (0, _classnames2["default"])(header.props.className, titleClassName)
136 });
137 }
138
139 return (0, _react.cloneElement)(header, {
140 className: (0, _classnames2["default"])(header.props.className, titleClassName),
141 children: this.renderAnchor(header.props.children, id, role, expanded)
142 });
143 };
144
145 //如果使用链接,渲染为a标签
146
147
148 Panel.prototype.renderAnchor = function renderAnchor(header, id, role, expanded) {
149 return _react2["default"].createElement(
150 'a',
151 {
152 role: role,
153 href: id && '#' + id,
154 'aria-controls': id,
155 'aria-expanded': expanded,
156 'aria-selected': expanded,
157 className: expanded ? null : 'collapsed'
158 },
159 header
160 );
161 };
162
163 //如果有折叠动画,渲染折叠动画
164
165
166 Panel.prototype.renderCollapsibleBody = function renderCollapsibleBody(id, expanded, role, children, clsPrefix, animationHooks) {
167 return _react2["default"].createElement(
168 _beeTransition.Collapse,
169 _extends({ 'in': expanded }, animationHooks),
170 _react2["default"].createElement(
171 'div',
172 {
173 id: id,
174 role: role,
175 className: clsPrefix + '-collapse',
176 'aria-hidden': !expanded
177 },
178 this.renderBody(children, clsPrefix)
179 )
180 );
181 };
182
183 //渲染panelbody
184
185
186 Panel.prototype.renderBody = function renderBody(rawChildren, clsPrefix) {
187 var children = [];
188 var bodyChildren = [];
189
190 var bodyClassName = clsPrefix + '-body';
191
192 //添加到body的children中
193 function maybeAddBody() {
194 if (!bodyChildren.length) {
195 return;
196 }
197
198 // 给子组件添加key,为了之后触发事件时使用
199 children.push(_react2["default"].createElement(
200 'div',
201 { key: children.length, className: bodyClassName },
202 bodyChildren
203 ));
204
205 bodyChildren = [];
206 }
207
208 //转换为数组,方便复用
209 _react2["default"].Children.toArray(rawChildren).forEach(function (child) {
210 if (_react2["default"].isValidElement(child) && child.props.fill) {
211 maybeAddBody();
212
213 //将标示fill设置为undefined
214 children.push((0, _react.cloneElement)(child, { fill: undefined }));
215
216 return;
217 }
218
219 bodyChildren.push(child);
220 });
221
222 maybeAddBody();
223
224 return children;
225 };
226
227 Panel.prototype.render = function render() {
228 var _props = this.props,
229 collapsible = _props.collapsible,
230 header = _props.header,
231 id = _props.id,
232 footer = _props.footer,
233 propsExpanded = _props.expanded,
234 footerStyle = _props.footerStyle,
235 headerStyle = _props.headerStyle,
236 headerRole = _props.headerRole,
237 panelRole = _props.panelRole,
238 className = _props.className,
239 colors = _props.colors,
240 children = _props.children,
241 onEnter = _props.onEnter,
242 onEntering = _props.onEntering,
243 onEntered = _props.onEntered,
244 clsPrefix = _props.clsPrefix,
245 onExit = _props.onExit,
246 headerContent = _props.headerContent,
247 onExiting = _props.onExiting,
248 onExited = _props.onExited,
249 defaultExpanded = _props.defaultExpanded,
250 eventKey = _props.eventKey,
251 onSelect = _props.onSelect,
252 props = _objectWithoutProperties(_props, ['collapsible', 'header', 'id', 'footer', 'expanded', 'footerStyle', 'headerStyle', 'headerRole', 'panelRole', 'className', 'colors', 'children', 'onEnter', 'onEntering', 'onEntered', 'clsPrefix', 'onExit', 'headerContent', 'onExiting', 'onExited', 'defaultExpanded', 'eventKey', 'onSelect']);
253
254 var expanded = propsExpanded != null ? propsExpanded : this.state.expanded;
255
256 var classes = {};
257 classes['' + clsPrefix] = true;
258 classes[clsPrefix + '-' + colors] = true;
259
260 var headerClass = _defineProperty({}, clsPrefix + '-heading', true);
261
262 return _react2["default"].createElement(
263 'div',
264 _extends({}, props, {
265 className: (0, _classnames2["default"])(className, classes),
266 id: collapsible ? null : id
267 }),
268 header && _react2["default"].createElement(
269 'div',
270 { className: (0, _classnames2["default"])(headerClass), style: headerStyle, onClick: this.handleClickTitle },
271 this.renderHeader(collapsible, header, id, headerRole, expanded, clsPrefix)
272 ),
273 collapsible ? this.renderCollapsibleBody(id, expanded, panelRole, children, clsPrefix, { onEnter: onEnter, onEntering: onEntering, onEntered: onEntered, onExit: onExit, onExiting: onExiting, onExited: onExited }) : this.renderBody(children, clsPrefix),
274 footer && _react2["default"].createElement(
275 'div',
276 { className: clsPrefix + '-footer', style: footerStyle },
277 footer
278 )
279 );
280 };
281
282 return Panel;
283}(_react2["default"].Component);
284
285Panel.propTypes = propTypes;
286Panel.defaultProps = defaultProps;
287
288exports["default"] = Panel;
289module.exports = exports['default'];
\No newline at end of file