UNPKG

4.62 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports.default = void 0;
7
8var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends"));
9
10var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutPropertiesLoose"));
11
12var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inheritsLoose"));
13
14var _propTypes = _interopRequireDefault(require("prop-types"));
15
16var _react = _interopRequireDefault(require("react"));
17
18var _invariant = _interopRequireDefault(require("invariant"));
19
20var _uncontrollable = _interopRequireDefault(require("uncontrollable"));
21
22var _createChainedFunction = _interopRequireDefault(require("./utils/createChainedFunction"));
23
24var _ValidComponentChildren = _interopRequireDefault(require("./utils/ValidComponentChildren"));
25
26var _ButtonGroup = _interopRequireDefault(require("./ButtonGroup"));
27
28var _ToggleButton = _interopRequireDefault(require("./ToggleButton"));
29
30var propTypes = {
31 /**
32 * An HTML `<input>` name for each child button.
33 *
34 * __Required if `type` is set to `'radio'`__
35 */
36 name: _propTypes.default.string,
37
38 /**
39 * The value, or array of values, of the active (pressed) buttons
40 *
41 * @controllable onChange
42 */
43 value: _propTypes.default.any,
44
45 /**
46 * Callback fired when a button is pressed, depending on whether the `type`
47 * is `'radio'` or `'checkbox'`, `onChange` will be called with the value or
48 * array of active values
49 *
50 * @controllable values
51 */
52 onChange: _propTypes.default.func,
53
54 /**
55 * The input `type` of the rendered buttons, determines the toggle behavior
56 * of the buttons
57 */
58 type: _propTypes.default.oneOf(['checkbox', 'radio']).isRequired
59};
60var defaultProps = {
61 type: 'radio'
62};
63
64var ToggleButtonGroup =
65/*#__PURE__*/
66function (_React$Component) {
67 (0, _inheritsLoose2.default)(ToggleButtonGroup, _React$Component);
68
69 function ToggleButtonGroup() {
70 return _React$Component.apply(this, arguments) || this;
71 }
72
73 var _proto = ToggleButtonGroup.prototype;
74
75 _proto.getValues = function getValues() {
76 var value = this.props.value;
77 return value == null ? [] : [].concat(value);
78 };
79
80 _proto.handleToggle = function handleToggle(value) {
81 var _this$props = this.props,
82 type = _this$props.type,
83 onChange = _this$props.onChange;
84 var values = this.getValues();
85 var isActive = values.indexOf(value) !== -1;
86
87 if (type === 'radio') {
88 if (!isActive) {
89 onChange(value);
90 }
91
92 return;
93 }
94
95 if (isActive) {
96 onChange(values.filter(function (n) {
97 return n !== value;
98 }));
99 } else {
100 onChange(values.concat([value]));
101 }
102 };
103
104 _proto.render = function render() {
105 var _this = this;
106
107 var _this$props2 = this.props,
108 children = _this$props2.children,
109 type = _this$props2.type,
110 name = _this$props2.name,
111 props = (0, _objectWithoutPropertiesLoose2.default)(_this$props2, ["children", "type", "name"]);
112 var values = this.getValues();
113 !(type !== 'radio' || !!name) ? process.env.NODE_ENV !== "production" ? (0, _invariant.default)(false, 'A `name` is required to group the toggle buttons when the `type` ' + 'is set to "radio"') : invariant(false) : void 0;
114 delete props.onChange;
115 delete props.value; // the data attribute is required b/c twbs css uses it in the selector
116
117 return _react.default.createElement(_ButtonGroup.default, (0, _extends2.default)({}, props, {
118 "data-toggle": "buttons"
119 }), _ValidComponentChildren.default.map(children, function (child) {
120 var _child$props = child.props,
121 value = _child$props.value,
122 onChange = _child$props.onChange;
123
124 var handler = function handler() {
125 return _this.handleToggle(value);
126 };
127
128 return _react.default.cloneElement(child, {
129 type: type,
130 name: child.name || name,
131 checked: values.indexOf(value) !== -1,
132 onChange: (0, _createChainedFunction.default)(onChange, handler)
133 });
134 }));
135 };
136
137 return ToggleButtonGroup;
138}(_react.default.Component);
139
140ToggleButtonGroup.propTypes = propTypes;
141ToggleButtonGroup.defaultProps = defaultProps;
142var UncontrolledToggleButtonGroup = (0, _uncontrollable.default)(ToggleButtonGroup, {
143 value: 'onChange'
144});
145UncontrolledToggleButtonGroup.Button = _ToggleButton.default;
146var _default = UncontrolledToggleButtonGroup;
147exports.default = _default;
148module.exports = exports["default"];
\No newline at end of file