UNPKG

6.14 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 children = _ref.children,
48 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 form = _ref3.form;
64 var _props$cast = props.cast,
65 cast = _props$cast === undefined ? _identity2.default : _props$cast,
66 _props$validate = props.validate,
67 validate = _props$validate === undefined ? defaultValidate : _props$validate;
68
69 var model = cast((0, _serializeForm2.default)(form));
70
71 var _validate = validate(model, name),
72 valid = _validate.valid,
73 errors = _validate.errors;
74
75 if (!valid) invalidate(form, errors, name);
76 },
77 handleSubmit: _regenerator2.default.mark(function handleSubmit(_ref4, form) {
78 var props = _ref4.props;
79
80 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;
81
82 return _regenerator2.default.wrap(function handleSubmit$(_context) {
83 while (1) {
84 switch (_context.prev = _context.next) {
85 case 0:
86 _props$onSubmit = props.onSubmit, onSubmit = _props$onSubmit === undefined ? _noop2.default : _props$onSubmit, _props$onSuccess = props.onSuccess, onSuccess = _props$onSuccess === undefined ? _noop2.default : _props$onSuccess, _props$onFailure = props.onFailure, onFailure = _props$onFailure === undefined ? _noop2.default : _props$onFailure, _props$validate2 = props.validate, validate = _props$validate2 === undefined ? defaultValidate : _props$validate2, _props$cast2 = props.cast, cast = _props$cast2 === undefined ? _identity2.default : _props$cast2, _props$transformError = props.transformError, transformError = _props$transformError === undefined ? defaultTransformError : _props$transformError, _props$loading = props.loading, loading = _props$loading === undefined ? false : _props$loading;
87 model = cast((0, _serializeForm2.default)(form));
88 _validate2 = validate(model), valid = _validate2.valid, errors = _validate2.errors;
89
90
91 if (!valid) invalidate(form, errors);
92
93 if (!(!loading && valid)) {
94 _context.next = 20;
95 break;
96 }
97
98 _context.next = 7;
99 return poss(onSubmit(model));
100
101 case 7:
102 _ref5 = _context.sent;
103 _ref6 = (0, _slicedToArray3.default)(_ref5, 2);
104 result = _ref6[0];
105 err = _ref6[1];
106
107 if (!err) {
108 _context.next = 18;
109 break;
110 }
111
112 _context.next = 14;
113 return onFailure(err);
114
115 case 14:
116 newErr = transformError(err);
117
118 if (newErr) invalidate(form, newErr);
119 _context.next = 20;
120 break;
121
122 case 18:
123 _context.next = 20;
124 return onSuccess(result);
125
126 case 20:
127 case 'end':
128 return _context.stop();
129 }
130 }
131 }, handleSubmit, this);
132 })
133 },
134
135 setTransformError: function setTransformError(transformError) {
136 defaultTransformError = transformError;
137 }
138});
139
140
141function dotsToBrackets(str) {
142 return str.split('.').map(function (part, idx) {
143 return idx === 0 ? part : '[' + part + ']';
144 }).join('');
145}
146
147function poss(gen) {
148 return _regenerator2.default.wrap(function poss$(_context2) {
149 while (1) {
150 switch (_context2.prev = _context2.next) {
151 case 0:
152 _context2.prev = 0;
153 _context2.next = 3;
154 return gen;
155
156 case 3:
157 _context2.t0 = _context2.sent;
158 return _context2.abrupt('return', [_context2.t0, null]);
159
160 case 7:
161 _context2.prev = 7;
162 _context2.t1 = _context2['catch'](0);
163 return _context2.abrupt('return', [null, _context2.t1]);
164
165 case 10:
166 case 'end':
167 return _context2.stop();
168 }
169 }
170 }, _marked[0], this, [[0, 7]]);
171}
172
173function invalidate(form, errors, name) {
174 if (name) {
175 errors = errors.filter(function (_ref7) {
176 var field = _ref7.field;
177 return field === name;
178 });
179 }
180
181 errors.forEach(function (_ref8) {
182 var field = _ref8.field,
183 message = _ref8.message;
184
185 var ctrl = form.querySelector('[name="' + dotsToBrackets(field) + '"]');
186
187 if (ctrl) {
188 ctrl.setCustomValidity(message);
189 ctrl.checkValidity();
190 }
191 });
192}
\No newline at end of file