UNPKG

3.78 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};
40
41/**
42 * Form component
43 */
44
45function render(_ref) {
46 var props = _ref.props;
47 var children = _ref.children;
48 var _props$onSubmit = props.onSubmit;
49 var onSubmit = _props$onSubmit === undefined ? _noop2.default : _props$onSubmit;
50 var _props$validate = props.validate;
51 var validate = _props$validate === undefined ? defaultValidate : _props$validate;
52 var _props$cast = props.cast;
53 var cast = _props$cast === undefined ? _identity2.default : _props$cast;
54 var _props$loading = props.loading;
55 var loading = _props$loading === undefined ? false : _props$loading;
56
57 var rest = _objectWithoutProperties(props, ['onSubmit', 'validate', 'cast', 'loading']);
58
59 return (0, _element2.default)(
60 _vduxUi.Base,
61 _extends({ tag: 'form', novalidate: true, onSubmit: handleSubmit, onChange: handleChange }, rest),
62 children
63 );
64
65 function handleSubmit(e) {
66 e.preventDefault();
67
68 var form = e.target;
69 var model = cast((0, _serializeForm2.default)(form));
70 var valid = checkValidity(form, model);
71
72 if (!loading && valid) {
73 return onSubmit(model, function (res, err) {
74 return err && invalidate(form, err);
75 });
76 }
77 }
78
79 function handleChange(e) {
80 var _e$target = e.target;
81 var name = _e$target.name;
82 var form = _e$target.form;
83
84 checkValidity(form, cast((0, _serializeForm2.default)(form)), name);
85 }
86
87 function checkValidity(form, model, name) {
88 var _validate = validate(model, name);
89
90 var valid = _validate.valid;
91 var errors = _validate.errors;
92
93
94 if (!valid) {
95 invalidate(form, errors, name);
96 }
97
98 return valid;
99 }
100
101 function invalidate(form, errors, name) {
102 if (name) {
103 errors = errors.filter(function (_ref2) {
104 var field = _ref2.field;
105 return field === name;
106 });
107 }
108
109 errors.forEach(function (_ref3) {
110 var field = _ref3.field;
111 var message = _ref3.message;
112
113 var ctrl = form.querySelector('[name="' + field + '"]');
114
115 if (ctrl) {
116 ctrl.setCustomValidity(message);
117 ctrl.checkValidity();
118 }
119 });
120 }
121}
122
123/**
124 * Exports
125 */
126
127exports.default = {
128 render: render
129};
\No newline at end of file