UNPKG

10.5 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _typeof2 = require('babel-runtime/helpers/typeof');
10
11var _typeof3 = _interopRequireDefault(_typeof2);
12
13var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
14
15var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
16
17var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
18
19var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
20
21var _inherits2 = require('babel-runtime/helpers/inherits');
22
23var _inherits3 = _interopRequireDefault(_inherits2);
24
25var _class, _temp;
26
27var _react = require('react');
28
29var _react2 = _interopRequireDefault(_react);
30
31var _propTypes = require('prop-types');
32
33var _propTypes2 = _interopRequireDefault(_propTypes);
34
35var _classnames2 = require('classnames');
36
37var _classnames3 = _interopRequireDefault(_classnames2);
38
39var _reactLifecyclesCompat = require('react-lifecycles-compat');
40
41var _configProvider = require('../config-provider');
42
43var _configProvider2 = _interopRequireDefault(_configProvider);
44
45var _util = require('../util');
46
47var _radio = require('./radio');
48
49var _radio2 = _interopRequireDefault(_radio);
50
51function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
52
53var pickOthers = _util.obj.pickOthers;
54
55/**
56 * Radio.Group
57 * @order 2
58 */
59
60var RadioGroup = (_temp = _class = function (_Component) {
61 (0, _inherits3.default)(RadioGroup, _Component);
62
63 function RadioGroup(props) {
64 (0, _classCallCheck3.default)(this, RadioGroup);
65
66 var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props));
67
68 var value = '';
69 if ('value' in props) {
70 value = props.value;
71 } else if ('defaultValue' in props) {
72 value = props.defaultValue;
73 }
74
75 _this.state = { value: value };
76 _this.onChange = _this.onChange.bind(_this);
77 return _this;
78 }
79
80 RadioGroup.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {
81 if ('value' in props && props.value !== state.value) {
82 return {
83 value: props.value
84 };
85 }
86
87 return null;
88 };
89
90 RadioGroup.prototype.getChildContext = function getChildContext() {
91 var disabled = this.props.disabled;
92
93
94 return {
95 __group__: true,
96 isButton: this.props.shape === 'button',
97 onChange: this.onChange,
98 selectedValue: this.state.value,
99 disabled: disabled
100 };
101 };
102
103 RadioGroup.prototype.onChange = function onChange(currentValue, e) {
104 if (!('value' in this.props)) {
105 this.setState({ value: currentValue });
106 }
107 if (currentValue !== this.state.value) {
108 this.props.onChange(currentValue, e);
109 }
110 };
111
112 RadioGroup.prototype.render = function render() {
113 var _this2 = this,
114 _classnames;
115
116 var _props = this.props,
117 rtl = _props.rtl,
118 className = _props.className,
119 disabled = _props.disabled,
120 shape = _props.shape,
121 size = _props.size,
122 style = _props.style,
123 prefix = _props.prefix,
124 direction = _props.direction,
125 component = _props.component,
126 isPreview = _props.isPreview,
127 renderPreview = _props.renderPreview;
128
129 var others = pickOthers(Object.keys(RadioGroup.propTypes), this.props);
130
131 if (rtl) {
132 others.dir = 'rtl';
133 }
134
135 var children = void 0;
136 var previewed = {};
137 if (this.props.children) {
138 children = _react2.default.Children.map(this.props.children, function (child, index) {
139 if (!_react2.default.isValidElement(child)) {
140 return child;
141 }
142 var checked = _this2.state.value === child.props.value;
143 if (checked) {
144 previewed.label = child.props.children;
145 previewed.value = child.props.value;
146 }
147 var tabIndex = index === 0 && !_this2.state.value || checked ? 0 : -1;
148 var childrtl = child.props.rtl === undefined ? rtl : child.props.rtl;
149 if (child.type && child.type.displayName === 'Config(Radio)') {
150 return _react2.default.cloneElement(child, {
151 checked: checked,
152 tabIndex: tabIndex,
153 rtl: childrtl
154 });
155 }
156 return _react2.default.cloneElement(child, {
157 checked: checked,
158 rtl: childrtl
159 });
160 });
161 } else {
162 children = this.props.dataSource.map(function (item, index) {
163 var option = item;
164 if ((typeof item === 'undefined' ? 'undefined' : (0, _typeof3.default)(item)) !== 'object') {
165 option = {
166 label: item,
167 value: item,
168 disabled: disabled
169 };
170 }
171 var checked = _this2.state.value === option.value;
172 if (checked) {
173 previewed.label = option.label;
174 previewed.value = option.value;
175 }
176 return _react2.default.createElement(_radio2.default, {
177 key: index,
178 tabIndex: index === 0 && !_this2.state.value || checked ? 0 : -1,
179 value: option.value,
180 checked: checked,
181 label: option.label,
182 disabled: disabled || option.disabled
183 });
184 });
185 }
186 if (isPreview) {
187 var previewCls = (0, _classnames3.default)(className, prefix + 'form-preview');
188
189 if ('renderPreview' in this.props) {
190 return _react2.default.createElement(
191 'div',
192 (0, _extends3.default)({}, others, { className: previewCls }),
193 renderPreview(previewed, this.props)
194 );
195 }
196
197 return _react2.default.createElement(
198 'p',
199 (0, _extends3.default)({}, others, { className: previewCls }),
200 previewed.label
201 );
202 }
203
204 var isButtonShape = shape === 'button';
205
206 var cls = (0, _classnames3.default)((_classnames = {}, _classnames[prefix + 'radio-group'] = true, _classnames[prefix + 'radio-group-' + direction] = !isButtonShape, _classnames[prefix + 'radio-button'] = isButtonShape, _classnames[prefix + 'radio-button-' + size] = isButtonShape, _classnames[className] = !!className, _classnames.disabled = disabled, _classnames));
207
208 var TagName = component;
209 return _react2.default.createElement(
210 TagName,
211 (0, _extends3.default)({}, others, { 'aria-disabled': disabled, role: 'radiogroup', className: cls, style: style }),
212 children
213 );
214 };
215
216 return RadioGroup;
217}(_react.Component), _class.propTypes = (0, _extends3.default)({}, _configProvider2.default.propTypes, {
218 /**
219 * 样式类名的品牌前缀
220 */
221 prefix: _propTypes2.default.string,
222 /**
223 * 自定义类名
224 */
225 className: _propTypes2.default.string,
226 /**
227 * 自定义内敛样式
228 */
229 style: _propTypes2.default.object,
230 /**
231 * name
232 */
233 name: _propTypes2.default.string,
234 /**
235 * radio group的选中项的值
236 */
237 value: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.bool]),
238 /**
239 * radio group的默认值
240 */
241 defaultValue: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.bool]),
242 /**
243 * 设置标签类型
244 */
245 component: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
246 /**
247 * 选中值改变时的事件
248 * @param {String/Number} value 选中项的值
249 * @param {Event} e Dom 事件对象
250 */
251 onChange: _propTypes2.default.func,
252 /**
253 * 表示radio被禁用
254 */
255 disabled: _propTypes2.default.bool,
256 /**
257 * 可以设置成 button 展示形状
258 * @enumdesc 按钮状
259 */
260 shape: _propTypes2.default.oneOf(['normal', 'button']),
261 /**
262 * 与 `shape` 属性配套使用,shape设为button时有效
263 * @enumdesc 大, 中, 小
264 */
265 size: _propTypes2.default.oneOf(['large', 'medium', 'small']),
266 /**
267 * 可选项列表, 数据项可为 String 或者 Object, 如 `['apple', 'pear', 'orange']` `[{label: 'apply', value: 'apple'}]`
268 */
269 dataSource: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.string), _propTypes2.default.arrayOf(_propTypes2.default.object)]),
270 /**
271 * 通过子元素方式设置内部radio
272 */
273 children: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.element), _propTypes2.default.element]),
274
275 /**
276 * 子项目的排列方式
277 * - hoz: 水平排列 (default)
278 * - ver: 垂直排列
279 */
280 direction: _propTypes2.default.oneOf(['hoz', 'ver']),
281 /**
282 * 是否为预览态
283 */
284 isPreview: _propTypes2.default.bool,
285 /**
286 * 预览态模式下渲染的内容
287 * @param {Object} previewed 预览值:{label: "", value: ""}
288 * @param {Object} props 所有传入的参数
289 * @returns {reactNode} Element 渲染内容
290 */
291 renderPreview: _propTypes2.default.func
292}), _class.defaultProps = {
293 dataSource: [],
294 size: 'medium',
295 onChange: function onChange() {},
296 prefix: 'next-',
297 component: 'div',
298 direction: 'hoz',
299 isPreview: false
300}, _class.childContextTypes = {
301 onChange: _propTypes2.default.func,
302 __group__: _propTypes2.default.bool,
303 isButton: _propTypes2.default.bool,
304 selectedValue: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.bool]),
305 disabled: _propTypes2.default.bool
306}, _temp);
307RadioGroup.displayName = 'RadioGroup';
308exports.default = (0, _reactLifecyclesCompat.polyfill)(RadioGroup);
309module.exports = exports['default'];
\No newline at end of file