UNPKG

6.36 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _regenerator = require('babel-runtime/regenerator');
8
9var _regenerator2 = _interopRequireDefault(_regenerator);
10
11var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
12
13var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
14
15var _extends2 = require('babel-runtime/helpers/extends');
16
17var _extends3 = _interopRequireDefault(_extends2);
18
19var _vdux = require('vdux');
20
21var _serializeForm = require('@f/serialize-form');
22
23var _serializeForm2 = _interopRequireDefault(_serializeForm);
24
25var _identity = require('@f/identity');
26
27var _identity2 = _interopRequireDefault(_identity);
28
29var _vduxUi = require('vdux-ui');
30
31var _noop = require('@f/noop');
32
33var _noop2 = _interopRequireDefault(_noop);
34
35function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
36
37var _marked = [poss].map(_regenerator2.default.mark);
38
39var defaultValidate = function defaultValidate() {
40 return { valid: true };
41};
42var defaultTransformError = _identity2.default;
43
44exports.default = (0, _vdux.component)({
45 render: function render(_ref) {
46 var props = _ref.props;
47 var children = _ref.children;
48 var actions = _ref.actions;
49
50
51 return (0, _vdux.element)(
52 _vduxUi.Base,
53 (0, _extends3.default)({ tag: 'form', novalidate: true }, props, { onSubmit: [(0, _vdux.decodeNode)(actions.handleSubmit), _vdux.preventDefault, _vdux.stopPropagation], onChange: (0, _vdux.decodeNode)(actions.handleChange) }),
54 children
55 );
56 },
57
58
59 controller: {
60 handleChange: function handleChange(_ref2, _ref3) {
61 var props = _ref2.props;
62 var name = _ref3.name;
63 var form = _ref3.form;
64 var _props$cast = props.cast;
65 var cast = _props$cast === undefined ? _identity2.default : _props$cast;
66 var _props$validate = props.validate;
67 var validate = _props$validate === undefined ? defaultValidate : _props$validate;
68
69 var model = cast((0, _serializeForm2.default)(form));
70
71 var _validate = validate(model, name);
72
73 var valid = _validate.valid;
74 var errors = _validate.errors;
75
76
77 if (!valid) invalidate(form, errors, name);
78 },
79 handleSubmit: _regenerator2.default.mark(function handleSubmit(_ref4, form) {
80 var props = _ref4.props;
81
82 var _props$onSubmit, onSubmit, _props$onSuccess, onSuccess, _props$onFailure, onFailure, _props$validate2, validate, _props$cast2, cast, _props$transformError, transformError, _props$loading, loading, model, _validate2, valid, errors, _ref5, _ref6, result, err, newErr;
83
84 return _regenerator2.default.wrap(function handleSubmit$(_context) {
85 while (1) {
86 switch (_context.prev = _context.next) {
87 case 0:
88 _props$onSubmit = props.onSubmit;
89 onSubmit = _props$onSubmit === undefined ? _noop2.default : _props$onSubmit;
90 _props$onSuccess = props.onSuccess;
91 onSuccess = _props$onSuccess === undefined ? _noop2.default : _props$onSuccess;
92 _props$onFailure = props.onFailure;
93 onFailure = _props$onFailure === undefined ? _noop2.default : _props$onFailure;
94 _props$validate2 = props.validate;
95 validate = _props$validate2 === undefined ? defaultValidate : _props$validate2;
96 _props$cast2 = props.cast;
97 cast = _props$cast2 === undefined ? _identity2.default : _props$cast2;
98 _props$transformError = props.transformError;
99 transformError = _props$transformError === undefined ? defaultTransformError : _props$transformError;
100 _props$loading = props.loading;
101 loading = _props$loading === undefined ? false : _props$loading;
102 model = cast((0, _serializeForm2.default)(form));
103 _validate2 = validate(model);
104 valid = _validate2.valid;
105 errors = _validate2.errors;
106
107
108 if (!valid) invalidate(form, errors);
109
110 if (!(!loading && valid)) {
111 _context.next = 35;
112 break;
113 }
114
115 _context.next = 22;
116 return poss(onSubmit(model));
117
118 case 22:
119 _ref5 = _context.sent;
120 _ref6 = (0, _slicedToArray3.default)(_ref5, 2);
121 result = _ref6[0];
122 err = _ref6[1];
123
124 if (!err) {
125 _context.next = 33;
126 break;
127 }
128
129 _context.next = 29;
130 return onFailure(err);
131
132 case 29:
133 newErr = transformError(err);
134
135 if (newErr) invalidate(form, newErr);
136 _context.next = 35;
137 break;
138
139 case 33:
140 _context.next = 35;
141 return onSuccess(result);
142
143 case 35:
144 case 'end':
145 return _context.stop();
146 }
147 }
148 }, handleSubmit, this);
149 })
150 },
151
152 setTransformError: function setTransformError(transformError) {
153 defaultTransformError = transformError;
154 }
155});
156
157
158function dotsToBrackets(str) {
159 return str.split('.').map(function (part, idx) {
160 return idx === 0 ? part : '[' + part + ']';
161 }).join('');
162}
163
164function poss(gen) {
165 return _regenerator2.default.wrap(function poss$(_context2) {
166 while (1) {
167 switch (_context2.prev = _context2.next) {
168 case 0:
169 _context2.prev = 0;
170 _context2.next = 3;
171 return gen;
172
173 case 3:
174 _context2.t0 = _context2.sent;
175 return _context2.abrupt('return', [_context2.t0, null]);
176
177 case 7:
178 _context2.prev = 7;
179 _context2.t1 = _context2['catch'](0);
180 return _context2.abrupt('return', [null, _context2.t1]);
181
182 case 10:
183 case 'end':
184 return _context2.stop();
185 }
186 }
187 }, _marked[0], this, [[0, 7]]);
188}
189
190function invalidate(form, errors, name) {
191 if (name) {
192 errors = errors.filter(function (_ref7) {
193 var field = _ref7.field;
194 return field === name;
195 });
196 }
197
198 errors.forEach(function (_ref8) {
199 var field = _ref8.field;
200 var message = _ref8.message;
201
202 var ctrl = form.querySelector('[name="' + dotsToBrackets(field) + '"]');
203
204 if (ctrl) {
205 ctrl.setCustomValidity(message);
206 ctrl.checkValidity();
207 }
208 });
209}
\No newline at end of file