UNPKG

5.39 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 _serializeForm = require('@f/serialize-form');
10
11var _serializeForm2 = _interopRequireDefault(_serializeForm);
12
13var _identity = require('@f/identity');
14
15var _identity2 = _interopRequireDefault(_identity);
16
17var _element = require('vdux/element');
18
19var _element2 = _interopRequireDefault(_element);
20
21var _vduxUi = require('vdux-ui');
22
23var _noop = require('@f/noop');
24
25var _noop2 = _interopRequireDefault(_noop);
26
27function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: 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 * Imports
31 */
32
33/**
34 * Constants
35 */
36
37var defaultValidate = function defaultValidate() {
38 return { valid: true };
39};
40var defaultTransformError = _identity2.default;
41
42/**
43 * Form component
44 */
45
46function render(_ref) {
47 var _marked = [handleSubmit].map(regeneratorRuntime.mark);
48
49 var props = _ref.props;
50 var children = _ref.children;
51 var _props$onSubmit = props.onSubmit;
52 var onSubmit = _props$onSubmit === undefined ? _noop2.default : _props$onSubmit;
53 var _props$onSuccess = props.onSuccess;
54 var onSuccess = _props$onSuccess === undefined ? _noop2.default : _props$onSuccess;
55 var _props$onFailure = props.onFailure;
56 var onFailure = _props$onFailure === undefined ? _noop2.default : _props$onFailure;
57 var _props$validate = props.validate;
58 var validate = _props$validate === undefined ? defaultValidate : _props$validate;
59 var _props$cast = props.cast;
60 var cast = _props$cast === undefined ? _identity2.default : _props$cast;
61 var _props$transformError = props.transformError;
62 var transformError = _props$transformError === undefined ? defaultTransformError : _props$transformError;
63 var _props$loading = props.loading;
64 var loading = _props$loading === undefined ? false : _props$loading;
65
66 var rest = _objectWithoutProperties(props, ['onSubmit', 'onSuccess', 'onFailure', 'validate', 'cast', 'transformError', 'loading']);
67
68 return (0, _element2.default)(
69 _vduxUi.Base,
70 _extends({ tag: 'form', novalidate: true, onSubmit: handleSubmit, onChange: handleChange }, rest),
71 children
72 );
73
74 function handleSubmit(e) {
75 var form, model, valid, result, newErr;
76 return regeneratorRuntime.wrap(function handleSubmit$(_context) {
77 while (1) {
78 switch (_context.prev = _context.next) {
79 case 0:
80 e.preventDefault();
81
82 form = e.target;
83 model = cast((0, _serializeForm2.default)(form));
84 valid = checkValidity(form, model);
85
86 if (!(!loading && valid)) {
87 _context.next = 19;
88 break;
89 }
90
91 _context.prev = 5;
92 _context.next = 8;
93 return onSubmit(model);
94
95 case 8:
96 result = _context.sent;
97 _context.next = 11;
98 return onSuccess(result);
99
100 case 11:
101 _context.next = 19;
102 break;
103
104 case 13:
105 _context.prev = 13;
106 _context.t0 = _context['catch'](5);
107 _context.next = 17;
108 return onFailure(_context.t0);
109
110 case 17:
111 newErr = transformError(_context.t0);
112
113 if (newErr) invalidate(form, newErr);
114
115 case 19:
116 case 'end':
117 return _context.stop();
118 }
119 }
120 }, _marked[0], this, [[5, 13]]);
121 }
122
123 function handleChange(e) {
124 var _e$target = e.target;
125 var name = _e$target.name;
126 var form = _e$target.form;
127
128 checkValidity(form, cast((0, _serializeForm2.default)(form)), name);
129 }
130
131 function checkValidity(form, model, name) {
132 var _validate = validate(model, name);
133
134 var valid = _validate.valid;
135 var errors = _validate.errors;
136
137
138 if (!valid) {
139 invalidate(form, errors, name);
140 }
141
142 return valid;
143 }
144
145 function invalidate(form, errors, name) {
146 if (name) {
147 errors = errors.filter(function (_ref2) {
148 var field = _ref2.field;
149 return field === name;
150 });
151 }
152
153 errors.forEach(function (_ref3) {
154 var field = _ref3.field;
155 var message = _ref3.message;
156
157 var ctrl = form.querySelector('[name="' + field + '"]');
158
159 if (ctrl) {
160 ctrl.setCustomValidity(message);
161 ctrl.checkValidity();
162 }
163 });
164 }
165}
166
167function setTransformError(transformError) {
168 defaultTransformError = transformError;
169}
170
171/**
172 * Exports
173 */
174
175exports.default = {
176 render: render,
177 setTransformError: setTransformError
178};
\No newline at end of file