UNPKG

22.1 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Form = undefined;
7
8var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
9
10var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
11
12var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
13
14var _defineProperty3 = _interopRequireDefault(_defineProperty2);
15
16var _extends4 = require('babel-runtime/helpers/extends');
17
18var _extends5 = _interopRequireDefault(_extends4);
19
20var _keys = require('babel-runtime/core-js/object/keys');
21
22var _keys2 = _interopRequireDefault(_keys);
23
24var _react = require('react');
25
26var _react2 = _interopRequireDefault(_react);
27
28var _Checkbox = require('./Checkbox');
29
30var _Checkbox2 = _interopRequireDefault(_Checkbox);
31
32var _helperFunctions = require('./helperFunctions');
33
34var _recompose = require('recompose');
35
36var _Button = require('./Button');
37
38var _Button2 = _interopRequireDefault(_Button);
39
40var _SelectOne = require('./SelectOne');
41
42var _SelectOne2 = _interopRequireDefault(_SelectOne);
43
44var _SelectMany = require('./SelectMany');
45
46var _SelectMany2 = _interopRequireDefault(_SelectMany);
47
48var _ = require('.');
49
50var _StyledForm = require('./StyledForm');
51
52function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
53
54var signValueLabelMaps = [{
55 value: -1,
56 label: '<'
57}, {
58 value: 0,
59 label: '='
60}, {
61 value: 1,
62 label: '>'
63}];
64
65var sumOf = function sumOf(arrayOfNumbers) {
66 return arrayOfNumbers.reduce(function (acc, v) {
67 acc = acc + v;
68 return acc;
69 });
70};
71
72var Form = function Form(props) {
73 var _props$className = props.className,
74 className = _props$className === undefined ? 'form' : _props$className,
75 style = props.style,
76 values = props.values,
77 touched = props.touched,
78 errors = props.errors,
79 children = props.children,
80 handleChange = props.handleChange,
81 handleSubmit = props.handleSubmit,
82 setFieldValue = props.setFieldValue,
83 setFieldTouched = props.setFieldTouched,
84 isSubmitting = props.isSubmitting;
85
86
87 var getClassName = function getClassName(primary, secondary) {
88 return (0, _helperFunctions.advancedMulti)({
89 unflattenedBase: ['form', className],
90 suffixes: ['__' + primary, '__' + secondary + '__' + primary]
91 });
92 };
93
94 var renderError = function renderError(type) {
95 return errors && errors[type] && touched && touched[type] && _react2.default.createElement(
96 _StyledForm.ERROR,
97 {
98 className: className ? 'form__error ' + className + '__error' : 'form__error'
99 },
100 errors[type]
101 );
102 };
103
104 var renderTextareaInputSocket = function renderTextareaInputSocket(_ref) {
105 var type = _ref.type,
106 label = _ref.label,
107 _ref$required = _ref.required,
108 required = _ref$required === undefined ? true : _ref$required;
109
110 var getLocalClassName = function getLocalClassName(primary) {
111 return getClassName(primary, 'textarea');
112 };
113 var SOCKET = _StyledForm.TEXTAREA.SOCKET,
114 LABEL = _StyledForm.TEXTAREA.LABEL,
115 INPUT = _StyledForm.TEXTAREA.INPUT;
116
117 var onChange = function onChange(e) {
118 return setFieldValue(type, e.target.value);
119 };
120 return _react2.default.createElement(
121 SOCKET,
122 {
123 className: getLocalClassName('socket')
124 },
125 _react2.default.createElement(
126 _react.Fragment,
127 null,
128 _react2.default.createElement(
129 LABEL,
130 {
131 className: getLocalClassName('label')
132 },
133 (0, _helperFunctions.capitalizeEveryWord)(label)
134 ),
135 _react2.default.createElement(INPUT, {
136 className: getLocalClassName('input'),
137 'data-testid': type.toLowerCase() + '-input',
138 id: type,
139 required: required,
140 value: values[type],
141 onChange: onChange
142 }),
143 errors[type] && touched[type] && _react2.default.createElement(
144 _StyledForm.ERROR,
145 null,
146 errors[type]
147 )
148 )
149 );
150 };
151
152 var renderSelectManyWithAdvancedCompositionSocket = function renderSelectManyWithAdvancedCompositionSocket(_ref2) {
153 var _ref2$isSigned = _ref2.isSigned,
154 isSigned = _ref2$isSigned === undefined ? true : _ref2$isSigned,
155 _ref2$isVertical = _ref2.isVertical,
156 isVertical = _ref2$isVertical === undefined ? false : _ref2$isVertical,
157 type = _ref2.type,
158 label = _ref2.label,
159 optionLabels = _ref2.optionLabels,
160 renderTrigger = _ref2.renderTrigger;
161 var OPTIONS = _StyledForm.COMPOSITION.OPTIONS,
162 CURRENT_OPTION = _StyledForm.COMPOSITION.CURRENT_OPTION,
163 RANGE_INPUT = _StyledForm.COMPOSITION.RANGE_INPUT,
164 NUMBER_INPUT = _StyledForm.COMPOSITION.NUMBER_INPUT,
165 HEAD = _StyledForm.COMPOSITION.HEAD,
166 LABEL = _StyledForm.COMPOSITION.LABEL,
167 SOCKET = _StyledForm.COMPOSITION.SOCKET;
168
169 var getLocalClassName = function getLocalClassName(primary) {
170 return getClassName(primary, 'composition');
171 };
172 // Draw currentOptions from labels and current values:
173 var currentOptions = values[type] ? (0, _keys2.default)(values[type]).map(function (compositionID) {
174 var currentOptionLabelMap = optionLabels.find(function (optionLabel) {
175 return optionLabel.value === compositionID;
176 });
177 if (!currentOptionLabelMap) {
178 throw new Error('optionLabels prop lacks one or more of the form values');
179 }
180 return {
181 value: compositionID,
182 label: currentOptionLabelMap.label
183 };
184 }) : [];
185 var getSharedInputProps = function getSharedInputProps(_ref3) {
186 var currentOption = _ref3.currentOption;
187
188 var id = currentOption.value;
189 var value = values[type][id];
190 return {
191 onClick: function onClick(e) {
192 e.stopPropagation();
193 e.nativeEvent.stopImmediatePropagation();
194 },
195 id: id,
196 value: value ? value[0] : 0,
197 onChange: function onChange(v) {
198 var integerValue = parseInt(v.target.value, 10);
199 var integerSign = value ? value[1] : 0;
200 setFieldValue(type, (0, _extends5.default)({}, values[type], (0, _defineProperty3.default)({}, id, [integerValue, integerSign])));
201 }
202 };
203 };
204 var renderSignDropdown = function renderSignDropdown(_ref4) {
205 var option = _ref4.option;
206
207 //signValueLabelMapExists =
208 var id = option.value;
209 var value = values[type][id];
210 return value && _react2.default.createElement(
211 _SelectOne2.default,
212 {
213 renderTrigger: function renderTrigger(_ref5) {
214 var currentOption = _ref5.currentOption,
215 isOn = _ref5.isOn,
216 getTriggerProps = _ref5.getTriggerProps;
217 return _react2.default.createElement(
218 _Button2.default,
219 (0, _extends5.default)({ isOn: isOn }, getTriggerProps()),
220 currentOption ? currentOption.label : optionLabels[0].label
221 );
222 },
223 currentOption: signValueLabelMaps.find(function (signValueLabelMap) {
224 return signValueLabelMap.value === value[1];
225 }),
226 onChange: function onChange(signValueLabelMap) {
227 setFieldValue(type, (0, _extends5.default)({}, values[type], (0, _defineProperty3.default)({}, id, [value[0], signValueLabelMap.value])));
228 },
229 options: signValueLabelMaps
230 },
231 signValueLabelMaps
232 );
233 };
234
235 var renderCurrentOptionLabel = function renderCurrentOptionLabel(_ref6) {
236 var currentOption = _ref6.currentOption;
237
238 return _react2.default.createElement(
239 LABEL,
240 {
241 isVertical: isVertical,
242 className: (0, _helperFunctions.advancedMulti)({
243 unflattenedBases: ['form', '' + className],
244 suffixes: ['__composition__label'],
245 flipVars: [[isVertical, 'vertical', 'horizontal']]
246 })
247 },
248 currentOption.label
249 );
250 };
251 var renderCurrentOptionInputs = function renderCurrentOptionInputs(_ref7) {
252 var currentOption = _ref7.currentOption;
253
254 var renderRangeInput = function renderRangeInput() {
255 return _react2.default.createElement(RANGE_INPUT, (0, _extends5.default)({}, getSharedInputProps({ currentOption: currentOption }), {
256 className: (0, _helperFunctions.advancedMulti)({
257 unflattenedBases: ['form', '' + className],
258 suffixes: ['__input', '__input__range'],
259 flipVars: [[isVertical, 'vertical', 'horizontal']]
260 }),
261 isVertical: isVertical
262 }));
263 };
264 var renderNumberInput = function renderNumberInput() {
265 return _react2.default.createElement(NUMBER_INPUT, (0, _extends5.default)({}, getSharedInputProps({ currentOption: currentOption }), {
266 isVertical: isVertical,
267 className: className + '__composition__input ' + className + '__composition__input__number'
268 }));
269 };
270 var renderEmptyDiv = function renderEmptyDiv(_ref8) {
271 var size = _ref8.size;
272 return _react2.default.createElement('div', { style: { height: size, width: size } });
273 };
274 return _react2.default.createElement(
275 _react.Fragment,
276 null,
277 renderRangeInput(),
278 isSigned ? renderSignDropdown({ option: currentOption }) : renderEmptyDiv({ size: '3rem' }),
279 renderNumberInput()
280 );
281 };
282
283 var renderHead = function renderHead() {
284 return _react2.default.createElement(
285 HEAD,
286 { className: className + '__label ' + className + '__composition__label' },
287 (0, _helperFunctions.capitalizeEveryWord)(label)
288 );
289 };
290 var handleOnChange = function handleOnChange(value) {
291 console.log('onChange', value);
292 setFieldValue(type, value.reduce(function (acc, v) {
293 if ((0, _keys2.default)(values[type]).length === 0) {
294 acc[v.value] = [100, -1];
295 } else if (values[type][v.value]) {
296 acc[v.value] = values[type][v.value];
297 } else {
298 acc[v.value] = [0, 1];
299 }
300 return acc;
301 }, {}));
302 };
303 var handleRenderCurrentOption = function handleRenderCurrentOption(currentOption) {
304 return _react2.default.createElement(
305 CURRENT_OPTION,
306 {
307 isVertical: isVertical,
308 className: (0, _helperFunctions.flippyClass)(isVertical, className + '__composition__currentoption', 'vertical', 'horizontal')
309 },
310 renderCurrentOptionLabel({
311 currentOption: currentOption
312 }),
313 renderCurrentOptionInputs({
314 currentOption: currentOption
315 })
316 );
317 };
318 return _react2.default.createElement(
319 SOCKET,
320 { className: className + '__socket ' + className + '__composition__socket' },
321 label && renderHead(),
322 _react2.default.createElement(
323 _SelectMany2.default,
324 {
325 initialOptions: currentOptions,
326 options: optionLabels,
327 renderTrigger: renderTrigger,
328 onChange: handleOnChange,
329 transitionType: ['dropdown', 'fade'],
330 pivotFrom: 'DOWNRIGHT',
331 renderCurrentOption: handleRenderCurrentOption
332 },
333 function (_ref9) {
334 var getChildProps = _ref9.getChildProps,
335 getChildrenProps = _ref9.getChildrenProps,
336 currentOptions = _ref9.currentOptions;
337 return _react2.default.createElement(
338 OPTIONS,
339 (0, _extends5.default)({}, getChildrenProps({
340 className: className + '__composition__options'
341 })),
342 optionLabels.map(function (optionLabel) {
343 return _react2.default.createElement(
344 _Button2.default,
345 (0, _extends5.default)({
346 colors: 'neutral',
347 isOn: currentOptions.map(function (currentOption) {
348 return currentOption.value;
349 }).includes(optionLabel.value)
350 }, getChildProps({
351 option: optionLabel
352 }), {
353 key: optionLabel.value
354 }),
355 optionLabel.label
356 );
357 })
358 );
359 }
360 )
361 );
362 };
363
364 var renderSelectManySocket = function renderSelectManySocket(_ref10) {
365 var type = _ref10.type,
366 label = _ref10.label,
367 options = _ref10.options,
368 renderTrigger = _ref10.renderTrigger;
369 var SOCKET = _StyledForm.SELECTMANY.SOCKET,
370 LABEL = _StyledForm.SELECTMANY.LABEL,
371 DROPDOWN = _StyledForm.SELECTMANY.DROPDOWN;
372
373 var getLocalClassName = function getLocalClassName(primary) {
374 return getClassName(primary, 'selectmany');
375 };
376 return _react2.default.createElement(
377 SOCKET,
378 { className: getLocalClassName('socket') },
379 _react2.default.createElement(
380 LABEL,
381 { className: getLocalClassName('label') },
382 (0, _helperFunctions.capitalizeEveryWord)(label)
383 ),
384 _react2.default.createElement(
385 _SelectMany2.default,
386 {
387 currentOptions: values[type],
388 options: options,
389 renderTrigger: renderTrigger,
390 onChange: function onChange(value) {
391 setFieldValue(type, value);
392 },
393 transitionType: ['dropdown', 'fade'],
394 pivotFrom: 'DOWNRIGHT'
395 },
396 function (_ref11) {
397 var getChildProps = _ref11.getChildProps,
398 getChildrenProps = _ref11.getChildrenProps;
399 return _react2.default.createElement(
400 DROPDOWN,
401 (0, _extends5.default)({}, getChildrenProps({
402 className: className + '__dropdown',
403 style: { width: '25.5rem' }
404 })),
405 options.map(function (option) {
406 return _react2.default.createElement(
407 _Button2.default,
408 (0, _extends5.default)({}, getChildProps({
409 option: { value: option.value, label: option.label }
410 }), {
411 key: option.value
412 }),
413 option.label
414 );
415 })
416 );
417 }
418 )
419 );
420 };
421
422 var renderSelectOneSocket = function renderSelectOneSocket(_ref12) {
423 var type = _ref12.type,
424 label = _ref12.label,
425 options = _ref12.options;
426 var SOCKET = _StyledForm.SELECTONE.SOCKET,
427 LABEL = _StyledForm.SELECTONE.LABEL,
428 DROPDOWN = _StyledForm.SELECTONE.DROPDOWN;
429
430 var getLocalClassName = function getLocalClassName(primary) {
431 return getClassName(primary, 'selectone');
432 };
433 return _react2.default.createElement(
434 SOCKET,
435 { className: getLocalClassName('socket') },
436 _react2.default.createElement(
437 LABEL,
438 { className: getLocalClassName('label') },
439 (0, _helperFunctions.capitalizeEveryWord)(label)
440 ),
441 _react2.default.createElement(
442 _SelectOne2.default,
443 {
444 renderTrigger: function renderTrigger(_ref13) {
445 var isOn = _ref13.isOn,
446 currentOption = _ref13.currentOption,
447 getTriggerProps = _ref13.getTriggerProps;
448 return _react2.default.createElement(
449 _Button2.default,
450 (0, _extends5.default)({
451 type: 'caretdown',
452 isOn: isOn
453 }, getTriggerProps({
454 className: 'selectone__trigger',
455 style: { border: '1px solid #ccc' }
456 }), {
457 colors: _.buttonStyles.monochrome
458 }),
459 currentOption ? currentOption.label : ''
460 );
461 },
462 options: options,
463 currentOption: values[type],
464 onChange: function onChange(value) {
465 setFieldValue(type, value);
466 },
467 transitionType: ['dropdown', 'fade'],
468 pivotFrom: 'DOWNRIGHT'
469 },
470 function (_ref14) {
471 var getChildProps = _ref14.getChildProps,
472 getChildrenProps = _ref14.getChildrenProps,
473 currentOption = _ref14.currentOption,
474 toggleIsOn = _ref14.toggleIsOn;
475 return _react2.default.createElement(
476 DROPDOWN,
477 (0, _extends5.default)({}, getChildrenProps({ style: { width: '25.5rem' } })),
478 options.map(function (option) {
479 return _react2.default.createElement(
480 _Button2.default,
481 (0, _extends5.default)({}, getChildProps({
482 option: { value: option.value, label: option.label },
483 onClick: toggleIsOn
484 }), {
485 isOn: currentOption.value === option.value,
486 key: option.value
487 }),
488 option.label
489 );
490 })
491 );
492 }
493 )
494 );
495 };
496
497 var renderSubmitButton = function renderSubmitButton() {
498 var _ref15 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
499
500 var label = _ref15.label,
501 props = (0, _objectWithoutProperties3.default)(_ref15, ['label']);
502 return _react2.default.createElement(
503 _Button2.default,
504 (0, _extends5.default)({
505 invert: true,
506 colors: 'surfing',
507 onClick: handleSubmit,
508 dataTestId: 'submit',
509 disabled: isSubmitting,
510 style: { width: '24rem', borderRadius: '.25rem' }
511 }, props),
512 label
513 );
514 };
515
516 var renderTextInputSocket = function renderTextInputSocket(_ref16) {
517 var type = _ref16.type,
518 label = _ref16.label,
519 sublabel = _ref16.sublabel,
520 _ref16$options = _ref16.options,
521 options = _ref16$options === undefined ? { required: true, autoFocus: false, autoComplete: '' } : _ref16$options,
522 props = (0, _objectWithoutProperties3.default)(_ref16, ['type', 'label', 'sublabel', 'options']);
523 var SOCKET = _StyledForm.TEXTINPUT.SOCKET,
524 INPUT = _StyledForm.TEXTINPUT.INPUT,
525 LABEL = _StyledForm.TEXTINPUT.LABEL,
526 SUBLABEL = _StyledForm.TEXTINPUT.SUBLABEL,
527 BAR = _StyledForm.TEXTINPUT.BAR;
528
529 var getLocalClassName = function getLocalClassName(primary) {
530 return getClassName(primary, 'textinput');
531 };
532 return _react2.default.createElement(
533 SOCKET,
534 (0, _extends5.default)({ className: getLocalClassName('socket') }, props),
535 _react2.default.createElement(INPUT, {
536 id: type,
537 className: className + '__socket__input ' + className + '__socket__input__' + type.toLowerCase(),
538 type: 'text',
539 required: options.required ? options.required : true,
540 autoFocus: options.autoFocus ? options.autoFocus : false,
541 value: values[type],
542 autoComplete: options.autoComplete ? options.autoComplete : '',
543 onChange: handleChange,
544 onBlur: function onBlur() {
545 return setFieldTouched(type);
546 }
547 }),
548 _react2.default.createElement(
549 LABEL,
550 { className: getLocalClassName('label') },
551 (0, _helperFunctions.capitalizeEveryWord)(label)
552 ),
553 _react2.default.createElement(BAR, { className: getLocalClassName('bar') }),
554 sublabel && _react2.default.createElement(
555 SUBLABEL,
556 { className: getLocalClassName('sublabel') },
557 sublabel
558 ),
559 renderError(type)
560 );
561 };
562
563 var renderGroup = function renderGroup(_ref17) {
564 var label = _ref17.label,
565 renderChildren = _ref17.renderChildren;
566 var SOCKET = _StyledForm.GROUP.SOCKET,
567 LABEL = _StyledForm.GROUP.LABEL,
568 CHILDREN = _StyledForm.GROUP.CHILDREN;
569
570 var getLocalClassName = function getLocalClassName(primary) {
571 return getClassName(primary, 'group');
572 };
573 return _react2.default.createElement(
574 SOCKET,
575 { className: getLocalClassName('socket') },
576 _react2.default.createElement(
577 LABEL,
578 { className: getLocalClassName('label') },
579 label
580 ),
581 _react2.default.createElement(
582 CHILDREN,
583 { className: getLocalClassName('children') },
584 renderChildren()
585 )
586 );
587 };
588
589 var renderCheckboxSocket = function renderCheckboxSocket(_ref18) {
590 var label = _ref18.label,
591 type = _ref18.type;
592 var SOCKET = _StyledForm.CHECKBOX.SOCKET,
593 LABEL = _StyledForm.CHECKBOX.LABEL,
594 INPUT = _StyledForm.CHECKBOX.INPUT;
595
596 var getLocalClassName = function getLocalClassName(primary) {
597 return getClassName(primary, 'checkbox');
598 };
599 return _react2.default.createElement(
600 SOCKET,
601 { className: getLocalClassName('socket') },
602 _react2.default.createElement(
603 LABEL,
604 { className: getLocalClassName('label') },
605 label
606 ),
607 _react2.default.createElement(INPUT, {
608 className: getLocalClassName('input'),
609 id: type,
610 checked: values[type],
611 onChange: handleChange
612 })
613 );
614 };
615
616 return _react2.default.createElement(
617 _StyledForm.CONTAINER,
618 {
619 onSubmit: handleSubmit,
620 className: className ? className : 'form',
621 style: style
622 },
623 children({
624 renderTextInputSocket: renderTextInputSocket,
625 renderTextareaInputSocket: renderTextareaInputSocket,
626 renderSelectManyWithAdvancedCompositionSocket: renderSelectManyWithAdvancedCompositionSocket,
627 renderSelectOneSocket: renderSelectOneSocket,
628 renderSelectManySocket: renderSelectManySocket,
629 renderCheckboxSocket: renderCheckboxSocket,
630 renderGroup: renderGroup,
631 renderSubmitButton: renderSubmitButton
632 }),
633 _react2.default.createElement('input', { type: 'submit', style: { visibility: 'hidden', height: 0, width: 0 } })
634 );
635};
636
637exports.Form = Form;
638Form.defaultProps = {
639 handleSubmit: function handleSubmit() {
640 return console.log('Form: handleSubmit');
641 },
642 style: {}
643};
644
645var enhance = (0, _recompose.compose)();
646//onlyUpdateForKeys([`values`, `touched`, `errors`, `children`])
647
648exports.default = enhance(Form);
\No newline at end of file