1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _stringify = require("babel-runtime/core-js/json/stringify");
|
8 |
|
9 | var _stringify2 = _interopRequireDefault(_stringify);
|
10 |
|
11 | var _extends2 = require("babel-runtime/helpers/extends");
|
12 |
|
13 | var _extends3 = _interopRequireDefault(_extends2);
|
14 |
|
15 | var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties");
|
16 |
|
17 | var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
|
18 |
|
19 | var _slicedToArray2 = require("babel-runtime/helpers/slicedToArray");
|
20 |
|
21 | var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
|
22 |
|
23 | var _toConsumableArray2 = require("babel-runtime/helpers/toConsumableArray");
|
24 |
|
25 | var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
|
26 |
|
27 | var _react = require("react");
|
28 |
|
29 | var _react2 = _interopRequireDefault(_react);
|
30 |
|
31 | var _styledComponents = require("styled-components");
|
32 |
|
33 | var _CheckboxV = require("./CheckboxV2");
|
34 |
|
35 | var _CheckboxV2 = _interopRequireDefault(_CheckboxV);
|
36 |
|
37 | var _RadioButton = require("./RadioButton");
|
38 |
|
39 | var _RadioButton2 = _interopRequireDefault(_RadioButton);
|
40 |
|
41 | var _StyledMultipleChoice = require("./StyledMultipleChoice");
|
42 |
|
43 | var _helperFunctions = require("./helperFunctions");
|
44 |
|
45 | var _ = require(".");
|
46 |
|
47 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
48 |
|
49 | var defaultRenderCurrentOption = function defaultRenderCurrentOption(_ref) {
|
50 | var label = _ref.label;
|
51 |
|
52 | if (typeof label === "string") {
|
53 | return label;
|
54 | } else {
|
55 | var flattened = (0, _helperFunctions.flatten)(label);
|
56 | return flattened.join(", ");
|
57 | }
|
58 | };
|
59 |
|
60 | var MultipleChoice = function MultipleChoice(props) {
|
61 | var _props$buttonType = props.buttonType,
|
62 | buttonType = _props$buttonType === undefined ? "checkbox" : _props$buttonType,
|
63 | _props$renderIconMedi = props.renderIconMediaMin,
|
64 | renderIconMediaMin = _props$renderIconMedi === undefined ? 0 : _props$renderIconMedi,
|
65 | _props$alwaysOn = props.alwaysOn,
|
66 | alwaysOn = _props$alwaysOn === undefined ? false : _props$alwaysOn,
|
67 | _props$mutuallyExclus = props.mutuallyExclusive,
|
68 | mutuallyExclusive = _props$mutuallyExclus === undefined ? false : _props$mutuallyExclus,
|
69 | _props$iconSize = props.iconSize,
|
70 | iconSize = _props$iconSize === undefined ? 4 : _props$iconSize,
|
71 | footnote = props.footnote,
|
72 | options = props.options,
|
73 | _props$onChange = props.onChange,
|
74 | onChange = _props$onChange === undefined ? function (x) {
|
75 | return null;
|
76 | } : _props$onChange,
|
77 | _props$renderCurrentO = props.renderCurrentOption,
|
78 | renderCurrentOption = _props$renderCurrentO === undefined ? defaultRenderCurrentOption : _props$renderCurrentO,
|
79 | _props$sortingFunctio = props.sortingFunction,
|
80 | sortingFunction = _props$sortingFunctio === undefined ? function () {
|
81 | return 0;
|
82 | } : _props$sortingFunctio,
|
83 | _props$initialOptions = props.initialOptions,
|
84 | initialOptions = _props$initialOptions === undefined ? [] : _props$initialOptions,
|
85 | error = props.error;
|
86 |
|
87 |
|
88 | function init(initialOptions) {
|
89 | return { currentOptions: initialOptions };
|
90 | }
|
91 |
|
92 | var reducer = function reducer(_ref2, action) {
|
93 | var currentOptions = _ref2.currentOptions;
|
94 |
|
95 | var updatedState = {};
|
96 | switch (action.type) {
|
97 | case "add":
|
98 | if (sortingFunction) {
|
99 | updatedState = {
|
100 | currentOptions: [].concat((0, _toConsumableArray3.default)(currentOptions), [action.payload.option]).sort(sortingFunction)
|
101 | };
|
102 | } else {
|
103 | updatedState = {
|
104 | currentOptions: [].concat((0, _toConsumableArray3.default)(currentOptions), [action.payload.option])
|
105 | };
|
106 | }
|
107 | break;
|
108 | case "remove":
|
109 | updatedState = {
|
110 | currentOptions: currentOptions.filter(function (currentOption) {
|
111 | return currentOption.value !== action.payload.option.value;
|
112 | })
|
113 | };
|
114 | break;
|
115 | case "clear":
|
116 | updatedState = init(action.payload.options);
|
117 | break;
|
118 | default:
|
119 | throw new Error();
|
120 | }
|
121 | onChange(updatedState.currentOptions);
|
122 | return updatedState;
|
123 | };
|
124 |
|
125 | var _useReducer = (0, _react.useReducer)(reducer, initialOptions, init),
|
126 | _useReducer2 = (0, _slicedToArray3.default)(_useReducer, 2),
|
127 | currentOptions = _useReducer2[0].currentOptions,
|
128 | dispatch = _useReducer2[1];
|
129 |
|
130 | var isActive = function isActive(option) {
|
131 | return currentOptions.some(function (currentOption) {
|
132 | return currentOption.value === option.value;
|
133 | });
|
134 | };
|
135 |
|
136 | var getChildProps = function getChildProps() {
|
137 | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
138 |
|
139 | var className = _ref3.className,
|
140 | style = _ref3.style,
|
141 | _onClick = _ref3.onClick,
|
142 | option = _ref3.option,
|
143 | props = (0, _objectWithoutProperties3.default)(_ref3, ["className", "style", "onClick", "option"]);
|
144 |
|
145 | var optionIsActive = isActive(option);
|
146 | var handleClassName = (0, _helperFunctions.advancedMulti)({
|
147 | unflattenedBases: [className, "multiplechoice__option"],
|
148 | flipVars: [[optionIsActive, "active", "inactive"]]
|
149 | });
|
150 | return (0, _extends3.default)({
|
151 | onClick: function onClick(e) {
|
152 | for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
153 | args[_key - 1] = arguments[_key];
|
154 | }
|
155 |
|
156 | e.stopPropagation();
|
157 | e.nativeEvent.stopImmediatePropagation();
|
158 | if (isActive(option)) {
|
159 | if (!alwaysOn) {
|
160 | dispatch({ type: "remove", payload: { option: option } });
|
161 | }
|
162 | } else {
|
163 | if (!mutuallyExclusive) {
|
164 | dispatch({ type: "add", payload: { option: option } });
|
165 | } else {
|
166 | dispatch({ type: "clear", payload: { options: [] } });
|
167 | dispatch({ type: "add", payload: { option: option } });
|
168 | }
|
169 | }
|
170 | _onClick && _onClick.apply(undefined, [e].concat(args));
|
171 | },
|
172 | className: handleClassName,
|
173 | style: style
|
174 | }, props);
|
175 | };
|
176 |
|
177 |
|
178 | return _react2.default.createElement(
|
179 | _StyledMultipleChoice.CONTAINER,
|
180 | null,
|
181 | (0, _stringify2.default)(props.currentOptions),
|
182 | options.map(function (option) {
|
183 | var checkboxProps = {
|
184 | disabled: true,
|
185 | className: "input",
|
186 | id: option.value,
|
187 | checked: isActive(option),
|
188 | onChange: function onChange(e) {}
|
189 | };
|
190 | var triggerProps = (0, _extends3.default)({
|
191 | padding: buttonType === "checkbox" ? "0 2.4rem 0" : "0.75rem 2.5rem",
|
192 | margin: buttonType === "checkbox" ? "0 -2.4rem 0" : "0 -2.5rem 0",
|
193 |
|
194 | isOn: isActive(option),
|
195 | buttonType: buttonType
|
196 | }, getChildProps({ option: option }));
|
197 | return _react2.default.createElement(
|
198 | _StyledMultipleChoice.OPTION,
|
199 | {
|
200 | key: option.value,
|
201 | style: {
|
202 | margin: buttonType !== "checkbox" ? "" : "0 0 0.75rem 0"
|
203 | }
|
204 | },
|
205 | typeof option.label === "string" ? buttonType === "checkbox" ? _react2.default.createElement(
|
206 | _StyledMultipleChoice.CHECKBOX_TRIGGER,
|
207 | (0, _extends3.default)({}, triggerProps),
|
208 | _react2.default.createElement(
|
209 | _StyledMultipleChoice.CHECKBOX_CONTAINER,
|
210 | null,
|
211 | _react2.default.createElement(_CheckboxV2.default, (0, _extends3.default)({}, checkboxProps))
|
212 | ),
|
213 | _react2.default.createElement(
|
214 | _StyledMultipleChoice.LABEL,
|
215 | null,
|
216 | option.label
|
217 | )
|
218 | ) : _react2.default.createElement(
|
219 | _StyledMultipleChoice.RADIO_TRIGGER,
|
220 | (0, _extends3.default)({}, triggerProps),
|
221 | _react2.default.createElement(
|
222 | _StyledMultipleChoice.CHECKBOX_CONTAINER,
|
223 | null,
|
224 | _react2.default.createElement(_RadioButton2.default, (0, _extends3.default)({}, checkboxProps))
|
225 | ),
|
226 | _react2.default.createElement(
|
227 | _StyledMultipleChoice.LABEL,
|
228 | null,
|
229 | option.label
|
230 | )
|
231 | ) : _react2.default.createElement(
|
232 | _StyledMultipleChoice.CHECKBOX_TRIGGER,
|
233 | (0, _extends3.default)({}, triggerProps),
|
234 | _react2.default.createElement(
|
235 | _StyledMultipleChoice.CHECKBOX_CONTAINER,
|
236 | null,
|
237 | buttonType === "checkbox" ? _react2.default.createElement(_CheckboxV2.default, (0, _extends3.default)({}, checkboxProps)) : _react2.default.createElement(_RadioButton2.default, (0, _extends3.default)({}, checkboxProps))
|
238 | ),
|
239 | _react2.default.createElement(
|
240 | _StyledMultipleChoice.LABEL,
|
241 | null,
|
242 | option.label.map(function (row, i) {
|
243 | return _react2.default.createElement(
|
244 | _StyledMultipleChoice.ROW,
|
245 | { iconSize: iconSize, key: i, isOn: isActive(option) },
|
246 | row.map(function (sublabel, j) {
|
247 | var renderFootnote = function renderFootnote() {
|
248 | if (footnote && footnote[0][0] === i && footnote[0][1] === j) {
|
249 | return _react2.default.createElement(
|
250 | _StyledMultipleChoice.FOOTNOTE_SIGN,
|
251 | null,
|
252 | footnote[1]
|
253 | );
|
254 | }
|
255 | };
|
256 | return _react2.default.createElement(
|
257 | _StyledMultipleChoice.SUBLABEL,
|
258 | { key: j },
|
259 | typeof sublabel === "string" ? sublabel : sublabel(),
|
260 | renderFootnote()
|
261 | );
|
262 | })
|
263 | );
|
264 | })
|
265 | )
|
266 | ),
|
267 | option.subcontent && _react2.default.createElement(
|
268 | _.RTGTransition,
|
269 | { in: isActive(option), transitionType: "dropdown" },
|
270 | function (_ref4) {
|
271 | var style = _ref4.style;
|
272 | return _react2.default.createElement(
|
273 | _StyledMultipleChoice.CONTENT,
|
274 | { style: style },
|
275 | option.subcontent()
|
276 | );
|
277 | }
|
278 | )
|
279 | );
|
280 | })
|
281 | );
|
282 | };
|
283 |
|
284 | exports.default = MultipleChoice; |
\ | No newline at end of file |