diff --git a/dist/js/FormHandler.esm.bundle.js b/dist/js/FormHandler.esm.bundle.js index 897860e..6e31573 100644 --- a/dist/js/FormHandler.esm.bundle.js +++ b/dist/js/FormHandler.esm.bundle.js @@ -1474,8 +1474,11 @@ function () { message: options.notice.message || defaultConfig.notices.message, classNames: Object.assign({}, this.opts.classNames.notices, options.notice.classNames) }; - this.makeField(name, fieldOptions); - this.makeNotice(name, noticeOptions); + this.opts.fields[name] = Object.assign({}, fieldOptions, { + notice: noticeOptions + }); + this.makeField(name, this.opts.fields[name]); + this.makeNotice(name, this.opts.fields[name].notice); return this.fields[name].node; } }, { @@ -1491,12 +1494,13 @@ function () { // also turns on toggleClassNames var name = this.getFieldNameBy(field); - if (field.validation) { + if (this.fields[name].validation) { var validation = Validator.validate(this.fields[name].validatorOptions); this.fields[name].submitted = true; this.setFieldState(name, validation.valid); } + this.form.setState(); return this.fields[name].node; } }, { diff --git a/dist/js/FormHandler.js b/dist/js/FormHandler.js index 6bdb3ee..84b19ef 100644 --- a/dist/js/FormHandler.js +++ b/dist/js/FormHandler.js @@ -1480,8 +1480,11 @@ message: options.notice.message || defaultConfig.notices.message, classNames: Object.assign({}, this.opts.classNames.notices, options.notice.classNames) }; - this.makeField(name, fieldOptions); - this.makeNotice(name, noticeOptions); + this.opts.fields[name] = Object.assign({}, fieldOptions, { + notice: noticeOptions + }); + this.makeField(name, this.opts.fields[name]); + this.makeNotice(name, this.opts.fields[name].notice); return this.fields[name].node; } }, { @@ -1497,12 +1500,13 @@ // also turns on toggleClassNames var name = this.getFieldNameBy(field); - if (field.validation) { + if (this.fields[name].validation) { var validation = Validator.validate(this.fields[name].validatorOptions); this.fields[name].submitted = true; this.setFieldState(name, validation.valid); } + this.form.setState(); return this.fields[name].node; } }, { diff --git a/dist/js/FormHandler.min.js b/dist/js/FormHandler.min.js index c472510..ca16d55 100644 --- a/dist/js/FormHandler.min.js +++ b/dist/js/FormHandler.min.js @@ -9,5 +9,5 @@ * * Released on: August 26, 2018 */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.FormHandler=e()}(this,function(){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var s=0;s()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i.test(t.value),message:"Must be a valid email address"}},isPhone:function(t,e,s){var i=t.value.trim().length,n=/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g.test(t.value),a="Must be a valid phone number";return e&&s&&(i()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i.test(t.value),message:"Must be a valid email address"}},isPhone:function(t,e,s){var i=t.value.trim().length,n=/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g.test(t.value),a="Must be a valid phone number";return e&&s&&(i max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (min && !max) {\n if (checked < min) {\n valid = false;\n message = \"At least \".concat(min, \" \").concat(min === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && max) {\n if (!checked) {\n message = \"Minimum 1, maximum \".concat(max, \" checkboxes must be selected\");\n }\n\n if (checked > max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && !max && !checked) {\n valid = false;\n message = 'At least one checkbox must be selected';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isRadioChecked: function isRadioChecked(node) {\n var valid = Array.from(node).some(function (el) {\n return el.checked === true;\n });\n var message = 'Please select one of the buttons';\n return {\n valid: valid,\n message: message\n };\n },\n isSelected: function isSelected(node) {\n var valid = Array.from(node.options).filter(function (el) {\n return el.value.length > 0;\n }).some(function (el) {\n return el.selected === true;\n });\n var message = 'Please select one of the options';\n return {\n valid: valid,\n message: message\n };\n },\n isName: function isName(node, min, max) {\n var pattern = /^[a-zA-Z]+$/;\n var valid = pattern.test(node.value);\n var message = 'Must contain only letters';\n\n var _node$value$trim = node.value.trim(),\n length = _node$value$trim.length;\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 letter but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && !max && !length) {\n valid = false;\n message = 'Must contain at least one letter';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isEmail: function isEmail(node) {\n var pattern = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\n var valid = pattern.test(node.value);\n var message = 'Must be a valid email address';\n return {\n valid: valid,\n message: message\n };\n },\n isPhone: function isPhone(node, min, max) {\n var pattern = /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g;\n\n var _node$value$trim2 = node.value.trim(),\n length = _node$value$trim2.length;\n\n var valid = pattern.test(node.value);\n var message = 'Must be a valid phone number';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 digit but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isNonEmpty: function isNonEmpty(node, min, max) {\n var _node$value$trim3 = node.value.trim(),\n length = _node$value$trim3.length;\n\n var valid = length > 0;\n var message = 'Must contain at least one character';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 character but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n }\n });\n\n var HTML_SELECT_ELEMENT = 'HTMLSelectElement';\n var INPUT = 'input';\n var LOAD = 'load';\n var UNDEFINED = 'undefined';\n var SUCCESS = 'success';\n var ERROR = 'error';\n var OBJECT = 'object';\n var FORM = 'form';\n var CLICK = 'click';\n var DIV = 'div';\n var READY_STATE_CHANGE = 'readystatechange';\n var XHR = 'xhr';\n var FETCH = 'fetch';\n var AFTER = 'after';\n var BEFORE = 'before';\n var STRING = 'string';\n var CHECKBOX = 'checkbox';\n var RADIO = 'radio';\n var SELECT = 'select-one';\n var NODE_LIST = 'NodeList';\n var COLOR = 'color';\n\n var Form =\n /*#__PURE__*/\n function () {\n function Form(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Form);\n\n this.node = opts.node;\n this.submit = opts.submit;\n this.classNames = opts.classNames;\n this.fields = opts.fields;\n this.listener = opts.listener;\n this.valid = null;\n this.submitted = false;\n this.sent = null;\n this.callback = opts.callback;\n this.submit.addEventListener(CLICK, this.listener);\n }\n\n _createClass(Form, [{\n key: \"setState\",\n value: function setState() {\n var validity = this.fieldsValidity;\n this.callback(this.node, this.valid, validity);\n this.valid = validity;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.clear();\n });\n this.callback(this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }, {\n key: \"fieldsValidity\",\n get: function get() {\n var validness = new Set(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n if (field.validation) {\n validness.add(field.valid);\n }\n });\n return !validness.has(false);\n }\n }]);\n\n return Form;\n }();\n\n var Field =\n /*#__PURE__*/\n function () {\n function Field(_ref) {\n var node = _ref.node,\n validation = _ref.validation,\n min = _ref.min,\n max = _ref.max,\n send = _ref.send,\n classNames = _ref.classNames,\n callback = _ref.callback;\n\n _classCallCheck(this, Field);\n\n this.node = node;\n this.type = this.node.constructor.name;\n this.name = this.type === NODE_LIST ? this.node[0].name : this.node.name;\n this.validation = validation;\n this.send = send;\n this.min = min;\n this.max = max;\n this.classNames = classNames;\n this.valid = null;\n this.submitted = false;\n this.callback = callback;\n }\n\n _createClass(Field, [{\n key: \"setState\",\n value: function setState(valid) {\n this.callback(this.validation, this.name, this.node, this.valid, valid);\n this.valid = valid;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"setFieldSubmitted\",\n value: function setFieldSubmitted(value) {\n this.submitted = value;\n }\n }, {\n key: \"on\",\n value: function on(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.addEventListener(type, listener);\n });\n } else {\n this.node.addEventListener(type, listener);\n }\n }\n }, {\n key: \"off\",\n value: function off(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.removeEventListener(type, listener);\n });\n } else {\n this.node.removeEventListener(type, listener);\n }\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }, {\n key: \"validatorOptions\",\n get: function get() {\n return {\n type: this.validation,\n node: this.node,\n min: this.min,\n max: this.max\n };\n }\n }]);\n\n return Field;\n }();\n\n var Input =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Input, _Field);\n\n function Input(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Input);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Input).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Input, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Input;\n }(Field);\n\n var Radio =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Radio, _Field);\n\n function Radio(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Radio);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Radio).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Radio, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n var _this = this;\n\n if (this.valid) {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isValid);\n });\n } else {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isNotValid);\n });\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n var _this2 = this;\n\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n // eslint-disable-next-line no-param-reassign\n el.checked = false;\n });\n }\n }]);\n\n return Radio;\n }(Field);\n\n var Select =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Select, _Field);\n\n function Select(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Select);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Select).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Select, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.remove(this.classNames.isNotValid);\n Array.from(this.node.options).forEach(function (el) {\n el.selected = false;\n });\n }\n }]);\n\n return Select;\n }(Field);\n\n var Color =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Color, _Field);\n\n function Color(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Color);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Color).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Color, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '#000000';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Color;\n }(Field);\n\n var Notice =\n /*#__PURE__*/\n function () {\n function Notice(_ref) {\n var form = _ref.form,\n message = _ref.message,\n classNames = _ref.classNames,\n appendTo = _ref.appendTo,\n nextToField = _ref.nextToField,\n parent = _ref.parent;\n\n _classCallCheck(this, Notice);\n\n this.form = form;\n this.message = message;\n this.classNames = classNames;\n this.appendTo = appendTo;\n this.nextToField = nextToField;\n this.parent = parent;\n this.node = null;\n this.mount();\n }\n\n _createClass(Notice, [{\n key: \"mount\",\n value: function mount() {\n this.node = document.createElement(DIV);\n this.node.classList.add(this.classNames.block);\n this.node.classList.add(this.classNames.hidden);\n\n if (this.appendTo) {\n this.parent.appendChild(this.node);\n } else {\n if (this.nextToField === BEFORE) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[0];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent);\n }\n\n if (this.nextToField === AFTER) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[this.parent.length - 1];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent.nextElementSibling);\n }\n }\n }\n }, {\n key: \"show\",\n value: function show() {\n this.node.classList.remove(this.classNames.hidden);\n this.node.classList.add(this.classNames.visible);\n this.node.innerText = this.message;\n }\n }, {\n key: \"hide\",\n value: function hide() {\n this.node.classList.remove(this.classNames.visible);\n this.node.classList.add(this.classNames.hidden);\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }]);\n\n return Notice;\n }();\n\n var Sender =\n /*#__PURE__*/\n function () {\n function Sender(_ref) {\n var type = _ref.type,\n url = _ref.url,\n method = _ref.method,\n data = _ref.data,\n fields = _ref.fields,\n form = _ref.form,\n callbacks = _ref.callbacks;\n\n _classCallCheck(this, Sender);\n\n this.type = type;\n this.url = url;\n this.method = method;\n this.data = data();\n this.fields = fields;\n this.form = form;\n this.callbacks = callbacks;\n }\n\n _createClass(Sender, [{\n key: \"makeData\",\n value: function makeData() {\n var _this = this;\n\n var data = new FormData(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.data).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n value = _ref3[1];\n\n // eslint-disable-next-line no-useless-return\n if (!_this.fields[name].send) return;\n data.append(name, value);\n });\n return data;\n }\n }, {\n key: \"sendRequest\",\n value: function sendRequest(data) {\n var _this2 = this;\n\n if (this.type === XHR) {\n var xhr = new XMLHttpRequest();\n xhr.open(this.method, this.url, true);\n xhr.addEventListener(READY_STATE_CHANGE, function (ev) {\n if (ev.target.readyState === 4) {\n if (ev.target.status >= 200 && ev.target.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(ev.target.status, \", Text: \").concat(ev.target.statusText));\n }\n }\n });\n xhr.send(data);\n }\n\n if (this.type === FETCH) {\n fetch(this.url, {\n method: this.method,\n body: data\n }).then(function (response) {\n if (response.status >= 200 && response.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(response.status, \", Text: \").concat(response.statusText));\n }\n });\n }\n }\n }]);\n\n return Sender;\n }();\n\n var FormHandler =\n /*#__PURE__*/\n function () {\n // TODO: Переименовать опцию appendTo => appendTo\n function FormHandler(_ref) {\n var _this = this;\n\n var args = _extends({}, _ref);\n\n _classCallCheck(this, FormHandler);\n\n _defineProperty(this, \"setFormStateFromResponse\", function (result) {\n if (result === SUCCESS) {\n _this.notices.form.message = _this.opts.form.notice.successMessage;\n _this.form.sent = true;\n\n if (_this.opts.sender.clearFormOnSuccess) {\n _this.form.clear();\n }\n }\n\n if (result === ERROR) {\n _this.notices.form.message = _this.opts.form.notice.errorMessage;\n _this.form.sent = false;\n }\n\n _this.notices.form.show();\n });\n\n _defineProperty(this, \"inputHandler\", function (ev) {\n var name = ev.target.name;\n var validation = Validator.validate(_this.fields[name].validatorOptions);\n\n if (_this.fields[name].validation) {\n _this.setFieldState(name, validation.valid, validation.message); // eslint-disable-next-line valid-typeof\n\n\n if (_typeof(validation.valid) !== OBJECT) {\n _this.form.setState();\n }\n }\n });\n\n _defineProperty(this, \"submitHandler\", function (ev) {\n ev.preventDefault();\n var fieldNodes = [];\n var delayForNotice = _this.opts.form.delayForNotice; // eslint-disable-next-line no-unused-vars\n\n Object.entries(_this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.setFieldSubmitted(true);\n fieldNodes.push(field.node);\n });\n\n _this.callbacks.onSubmit(_this.form.node, fieldNodes);\n\n _this.validateForm();\n\n _this.notices.form.message = _this.opts.form.notice.message;\n\n if (_this.form.valid) {\n _this.notices.form.hide();\n\n if (_this.opts.sender.send) {\n var options = {\n type: _this.opts.sender.type,\n url: _this.form.node.action,\n method: _this.form.node.method,\n data: _this.getFieldsAndValues,\n fields: _this.fields,\n form: _this.form.node,\n callbacks: {\n setFormState: _this.setFormStateFromResponse,\n onSend: _this.callbacks.onSend\n }\n };\n var sender = new Sender(options);\n sender.sendRequest(sender.makeData());\n setTimeout(function () {\n _this.notices.form.hide();\n }, 2000);\n }\n } else {\n _this.notices.form.show();\n\n if (delayForNotice) {\n setTimeout(function () {\n _this.notices.form.hide();\n }, delayForNotice);\n }\n }\n });\n\n _defineProperty(this, \"getFieldsAndValues\", function () {\n var data = {};\n Object.entries(_this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n var type = field.node.constructor.name;\n\n if (type === NODE_LIST) {\n // Radio/Checkbox\n var inputType = field.node[0].type;\n\n if (inputType === CHECKBOX) {\n data[name] = [];\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name].push(node.value);\n }\n });\n }\n\n if (inputType === RADIO) {\n data[name] = '';\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name] = node.value;\n }\n });\n }\n } else if (type === HTML_SELECT_ELEMENT) {\n // Select\n data[name] = field.node.options[field.node.options.selectedIndex].value;\n } else {\n // Others\n data[name] = field.node.value;\n }\n });\n return data;\n });\n\n this.opts = args;\n this.fields = {};\n this.notices = {};\n this.form = null;\n this.validator = new Validator(this.opts.customValidations);\n this.callbacks = {};\n this.init();\n }\n\n _createClass(FormHandler, [{\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n this.complementOptions().makeForm();\n Object.entries(this.opts.fields).forEach(function (_ref6) {\n var _ref7 = _slicedToArray(_ref6, 2),\n name = _ref7[0],\n field = _ref7[1];\n\n _this2.makeField(name, field);\n\n if (field.validation) {\n var validation = Validator.validate(_this2.fields[name].validatorOptions);\n\n _this2.makeNotice(name, field.notice);\n\n _this2.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.setState();\n return this;\n }\n }, {\n key: \"complementOptions\",\n value: function complementOptions() {\n var _this3 = this;\n\n // Add lacks classNames and merge.\n this.opts.classNames = this.opts.classNames ? Object.assign({}, defaultConfig.classNames, this.opts.classNames) : defaultConfig.classNames;\n this.opts.classNames.form = Object.assign({}, defaultConfig.classNames.form, this.opts.classNames.form);\n this.opts.classNames.fields = Object.assign({}, defaultConfig.classNames.fields, this.opts.classNames.fields);\n this.opts.classNames.notices = Object.assign({}, defaultConfig.classNames.notices, this.opts.classNames.notices); // Add lacks form options and merge.\n\n this.opts.form = this.opts.form ? Object.assign({}, defaultConfig.form, this.opts.form) : defaultConfig.form;\n this.opts.form.notice = Object.assign({}, defaultConfig.form.notice, this.opts.form.notice);\n this.opts.form.notice.classNames = Object.assign({}, this.opts.classNames.notice, this.opts.form.notice.classNames); // Add lacks notices options and merge\n\n this.opts.notices = Object.assign({}, defaultConfig.notices, this.opts.notices); // Add lacks fields options and merge\n // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.opts.fields).forEach(function (_ref8) {\n var _ref9 = _slicedToArray(_ref8, 2),\n name = _ref9[0],\n obj = _ref9[1];\n\n _this3.opts.fields[name] = Object.assign({}, defaultConfig.fields, _this3.opts.fields[name]);\n _this3.opts.fields[name].classNames = _this3.opts.fields[name].classNames ? Object.assign({}, _this3.opts.classNames.fields, _this3.opts.fields[name].classNames) : _this3.opts.classNames.fields;\n _this3.opts.fields[name].notice = Object.assign({}, _this3.opts.notices, _this3.opts.fields[name].notice);\n _this3.opts.fields[name].notice.classNames = Object.assign({}, _this3.opts.classNames.notices, _this3.opts.fields[name].notice.classNames);\n });\n this.opts.sender = this.opts.sender ? Object.assign({}, defaultConfig.sender, this.opts.sender) : defaultConfig.sender;\n this.callbacks = this.opts.callbacks ? Object.assign({}, defaultConfig.callbacks, this.opts.callbacks) : defaultConfig.callbacks;\n return this;\n }\n }, {\n key: \"makeForm\",\n value: function makeForm() {\n var options = {\n fields: this.fields,\n classNames: this.opts.classNames.form,\n node: document.querySelector(this.opts.form.block),\n submit: document.querySelector(this.opts.form.submit),\n listener: this.submitHandler,\n callback: this.callbacks.onFormChangeState\n };\n this.form = new Form(options);\n this.makeNotice(FORM, this.opts.form.notice);\n return this;\n }\n }, {\n key: \"makeField\",\n value: function makeField(name, field) {\n var node = this.form.node.querySelector(\"[name=\".concat(name, \"]\"));\n var _node = node,\n type = _node.type;\n var options = {\n node: node,\n validation: field.validation,\n min: field.min,\n max: field.max,\n send: field.send,\n classNames: field.classNames,\n callback: this.callbacks.onFieldChangeState\n };\n\n if (type === RADIO || type === CHECKBOX) {\n node = this.form.node.querySelectorAll(\"[name=\".concat(name, \"]\"));\n options.node = node;\n this.fields[name] = new Radio(options);\n } else if (type === SELECT) {\n this.fields[name] = new Select(options);\n } else if (type === COLOR) {\n this.fields[name] = new Color(options);\n } else {\n this.fields[name] = new Input(options);\n }\n\n this.fields[name].on(INPUT, this.inputHandler);\n return this;\n }\n }, {\n key: \"makeNotice\",\n value: function makeNotice(name, notice) {\n var message = this.fields[name] ? Validator.validate(this.fields[name].validatorOptions).message : false;\n var parent = notice.nextToField ? this.fields[name].node : document.querySelector(notice.appendTo);\n var options = {\n form: this.form.node,\n classNames: notice.classNames,\n appendTo: notice.appendTo,\n message: notice.message || message,\n nextToField: notice.nextToField,\n parent: parent\n };\n this.notices[name] = new Notice(options);\n return this;\n }\n }, {\n key: \"setFieldStateFromResponse\",\n value: function setFieldStateFromResponse(response, property, name, message) {\n var _this4 = this;\n\n // eslint-disable-next-line valid-typeof\n if (_typeof(response.then) !== UNDEFINED) {\n response.then(function (data) {\n return data.json();\n }).then(function (json) {\n _this4.setFieldState(name, !!json[property], message);\n\n _this4.form.setState();\n });\n } else {\n response.addEventListener(LOAD, function (ev) {\n _this4.setFieldState(name, !!JSON.parse(ev.target.response)[property], message);\n\n _this4.form.setState();\n });\n }\n }\n }, {\n key: \"setFieldState\",\n value: function setFieldState(name, valid) {\n var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.notices[name].message;\n var submitted = this.fields[name].submitted; // eslint-disable-next-line valid-typeof\n\n if (_typeof(valid) === OBJECT) {\n this.setFieldStateFromResponse(valid.response, valid.property, name, message);\n } else {\n this.fields[name].setState(valid);\n }\n\n this.notices[name].message = this.opts.fields[name].notice.message || message;\n\n if (!valid && submitted) {\n this.notices[name].show();\n } else {\n this.notices[name].hide();\n }\n\n return this;\n }\n }, {\n key: \"getFieldNameBy\",\n value: function getFieldNameBy(field) {\n // return field name get by NodeList/Selector(.className)\n var type = _typeof(field);\n\n var name = field.name;\n var node = this.form.node;\n var fieldName;\n\n if (type === OBJECT) {\n fieldName = name;\n }\n\n if (type === STRING) {\n var isSelector = /\\./.test(field);\n\n if (isSelector) {\n fieldName = node.querySelector(field).name;\n } else {\n fieldName = field;\n }\n }\n\n return fieldName;\n }\n }, {\n key: \"isFieldValid\",\n value: function isFieldValid(field) {\n return this.fields[this.getFieldNameBy(field)].valid;\n }\n }, {\n key: \"getFieldValue\",\n value: function getFieldValue(field) {\n return this.fields[this.getFieldNameBy(field)].node.value;\n }\n }, {\n key: \"isFormValid\",\n value: function isFormValid() {\n return this.form.valid;\n }\n }, {\n key: \"isFormSubmitted\",\n value: function isFormSubmitted() {\n return this.form.submitted;\n }\n }, {\n key: \"isFormSent\",\n value: function isFormSent() {\n return this.form.sent;\n }\n }, {\n key: \"clearForm\",\n value: function clearForm() {\n this.form.clear();\n }\n }, {\n key: \"clearField\",\n value: function clearField(field) {\n // Also clears classNames and field of instance like valid, submitted\n this.fields[this.getFieldNameBy(field)].clear();\n this.form.setState();\n }\n }, {\n key: \"getField\",\n value: function getField(field) {\n // Returns a field node\n return this.fields[this.getFieldNameBy(field)].node;\n }\n }, {\n key: \"addField\",\n value: function addField(field, _ref10) {\n var opts = _extends({}, _ref10);\n\n var options = opts;\n options.notice = options.notice ? options.notice : {};\n var name = this.getFieldNameBy(field);\n var fieldOptions = {\n validation: options.validation,\n min: options.min || defaultConfig.fields.min,\n max: options.max || defaultConfig.fields.max,\n send: options.send || defaultConfig.fields.send,\n classNames: Object.assign({}, this.opts.classNames.fields, options.classNames)\n };\n var noticeOptions = {\n appendTo: options.notice.appendTo || defaultConfig.notices.appendTo,\n nextToField: options.notice.nextToField || defaultConfig.notices.nextToField,\n message: options.notice.message || defaultConfig.notices.message,\n classNames: Object.assign({}, this.opts.classNames.notices, options.notice.classNames)\n };\n this.makeField(name, fieldOptions);\n this.makeNotice(name, noticeOptions);\n return this.fields[name].node;\n }\n }, {\n key: \"removeField\",\n value: function removeField(field) {\n var name = this.getFieldNameBy(field);\n this.fields[name].remove();\n this.notices[name].remove();\n }\n }, {\n key: \"validateField\",\n value: function validateField(field) {\n // also turns on toggleClassNames\n var name = this.getFieldNameBy(field);\n\n if (field.validation) {\n var validation = Validator.validate(this.fields[name].validatorOptions);\n this.fields[name].submitted = true;\n this.setFieldState(name, validation.valid);\n }\n\n return this.fields[name].node;\n }\n }, {\n key: \"validateForm\",\n value: function validateForm() {\n var _this5 = this;\n\n // also turns on toggleClassNames\n Object.entries(this.fields).forEach(function (_ref11) {\n var _ref12 = _slicedToArray(_ref11, 2),\n name = _ref12[0],\n field = _ref12[1];\n\n if (field.validation) {\n var validation = Validator.validate(field.validatorOptions);\n field.setFieldSubmitted(true);\n\n _this5.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.submitted = true;\n this.form.setState();\n return this.form.node;\n }\n }]);\n\n return FormHandler;\n }();\n\n return FormHandler;\n\n})));\n"]} \ No newline at end of file +{"version":3,"sources":["formhandler.js"],"names":["global","factory","exports","module","define","amd","FormHandler","this","_typeof","obj","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","_defineProperty","value","_extends","assign","arguments","source","hasOwnProperty","call","apply","_inherits","subClass","superClass","create","_setPrototypeOf","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","p","_construct","Parent","args","Class","Reflect","construct","sham","Proxy","Date","toString","e","isNativeReflectConstruct","a","push","Function","bind","_wrapNativeSuper","_cache","Map","undefined","has","get","set","Wrapper","_possibleConstructorReturn","self","ReferenceError","_assertThisInitialized","_slicedToArray","arr","Array","isArray","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","next","done","err","_iterableToArrayLimit","_nonIterableRest","defaultConfig","form","block","submit","delayForNotice","notice","appendTo","message","successMessage","errorMessage","classNames","hidden","visible","fields","min","max","send","notices","nextToField","isValid","isNotValid","sender","type","clearFormOnSuccess","callbacks","onFieldChangeState","onFormChangeState","onSubmit","onSend","FormHandlerError","_Error","Error","Validator","custom","addCustomValidations","entries","forEach","_ref","_ref2","validations","_ref3","node","validation","concat","isCheckboxChecked","valid","checked","el","isRadioChecked","from","some","isSelected","options","filter","selected","isName","test","trim","isEmail","isPhone","isNonEmpty","SUCCESS","ERROR","OBJECT","CHECKBOX","RADIO","NODE_LIST","Form","opts","listener","submitted","sent","callback","addEventListener","validity","fieldsValidity","toggleClassNames","classList","remove","add","clear","validness","Set","_ref4","_ref5","field","Field","name","removeEventListener","Input","_Field","Radio","_this","_this2","Select","Color","Notice","parent","mount","document","createElement","appendChild","parentElement","insertBefore","nextElementSibling","innerText","Sender","url","method","data","FormData","append","xhr","XMLHttpRequest","open","ev","readyState","status","setFormState","statusText","fetch","body","then","response","result","show","validate","validatorOptions","setFieldState","setState","preventDefault","fieldNodes","setFieldSubmitted","validateForm","hide","action","getFieldsAndValues","setFormStateFromResponse","sendRequest","makeData","setTimeout","inputType","selectedIndex","validator","customValidations","init","complementOptions","makeForm","_ref6","_ref7","makeField","makeNotice","_this3","_ref8","_ref9","querySelector","submitHandler","querySelectorAll","on","inputHandler","property","_this4","json","JSON","parse","setFieldStateFromResponse","fieldName","getFieldNameBy","_ref10","fieldOptions","noticeOptions","_this5","_ref11","_ref12"],"mappings":"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","file":"formhandler.min.js","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.FormHandler = factory());\n}(this, (function () { 'use strict';\n\n function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n\n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null) return null;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n }\n\n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n\n var defaultConfig = {\n form: {\n block: '.formhandler',\n submit: '.formhandler__submit',\n delayForNotice: 3000,\n notice: {\n appendTo: '.formhandler__notices',\n message: 'This form seems to be invalid',\n successMessage: 'Form was successfully sent',\n errorMessage: 'Oops, something went wrong',\n classNames: {\n block: 'formhandler__notice-form',\n hidden: 'formhandler__notice-form--hidden',\n visible: 'formhandler__notice-form--visible'\n }\n }\n },\n fields: {\n min: false,\n max: false,\n send: true\n },\n notices: {\n appendTo: false,\n nextToField: 'before',\n message: false\n },\n classNames: {\n notices: {\n block: 'formhandler__notice',\n hidden: 'formhandler__notice--hidden',\n visible: 'formhandler__notice--visible'\n },\n form: {\n isValid: 'formhandler--is-valid',\n isNotValid: 'formhandler--is-not-valid'\n },\n fields: {\n isValid: 'formhandler__field--is-valid',\n isNotValid: 'formhandler__field--is-not-valid'\n }\n },\n sender: {\n send: false,\n type: 'xhr',\n clearFormOnSuccess: true\n },\n callbacks: {\n onFieldChangeState: function onFieldChangeState() {},\n onFormChangeState: function onFormChangeState() {},\n onSubmit: function onSubmit() {},\n onSend: function onSend() {}\n }\n };\n\n /* eslint-disable no-useless-constructor */\n var FormHandlerError =\n /*#__PURE__*/\n function (_Error) {\n _inherits(FormHandlerError, _Error);\n\n function FormHandlerError(props) {\n _classCallCheck(this, FormHandlerError);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(FormHandlerError).call(this, props));\n }\n\n return FormHandlerError;\n }(_wrapNativeSuper(Error));\n\n var Validator =\n /*#__PURE__*/\n function () {\n function Validator(custom) {\n _classCallCheck(this, Validator);\n\n this.custom = custom;\n\n if (this.custom) {\n this.addCustomValidations();\n }\n }\n\n _createClass(Validator, [{\n key: \"addCustomValidations\",\n value: function addCustomValidations() {\n Object.entries(this.custom).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n type = _ref2[0],\n obj = _ref2[1];\n\n Validator.validations[type] = obj;\n });\n return this;\n }\n }], [{\n key: \"validate\",\n value: function validate(_ref3) {\n var type = _ref3.type,\n node = _ref3.node,\n min = _ref3.min,\n max = _ref3.max;\n if (!type) return;\n var validation = Validator.validations[type];\n\n if (!validation) {\n throw new FormHandlerError(\"No handler to validate type \".concat(type));\n } // eslint-disable-next-line consistent-return\n\n\n return validation(node, min, max);\n }\n }]);\n\n return Validator;\n }();\n\n _defineProperty(Validator, \"validations\", {\n isCheckboxChecked: function isCheckboxChecked(node, min, max) {\n var message = 'At least one checkbox must be selected';\n var valid = true;\n var checked = 0;\n node.forEach(function (el) {\n if (el.checked) checked += 1;\n });\n\n if (min && max) {\n if (checked < min) {\n valid = false;\n message = \"Minimum \".concat(min, \", maximum \").concat(max, \" checkboxes must be selected\");\n }\n\n if (checked > max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (min && !max) {\n if (checked < min) {\n valid = false;\n message = \"At least \".concat(min, \" \").concat(min === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && max) {\n if (!checked) {\n message = \"Minimum 1, maximum \".concat(max, \" checkboxes must be selected\");\n }\n\n if (checked > max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && !max && !checked) {\n valid = false;\n message = 'At least one checkbox must be selected';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isRadioChecked: function isRadioChecked(node) {\n var valid = Array.from(node).some(function (el) {\n return el.checked === true;\n });\n var message = 'Please select one of the buttons';\n return {\n valid: valid,\n message: message\n };\n },\n isSelected: function isSelected(node) {\n var valid = Array.from(node.options).filter(function (el) {\n return el.value.length > 0;\n }).some(function (el) {\n return el.selected === true;\n });\n var message = 'Please select one of the options';\n return {\n valid: valid,\n message: message\n };\n },\n isName: function isName(node, min, max) {\n var pattern = /^[a-zA-Z]+$/;\n var valid = pattern.test(node.value);\n var message = 'Must contain only letters';\n\n var _node$value$trim = node.value.trim(),\n length = _node$value$trim.length;\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 letter but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && !max && !length) {\n valid = false;\n message = 'Must contain at least one letter';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isEmail: function isEmail(node) {\n var pattern = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\n var valid = pattern.test(node.value);\n var message = 'Must be a valid email address';\n return {\n valid: valid,\n message: message\n };\n },\n isPhone: function isPhone(node, min, max) {\n var pattern = /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g;\n\n var _node$value$trim2 = node.value.trim(),\n length = _node$value$trim2.length;\n\n var valid = pattern.test(node.value);\n var message = 'Must be a valid phone number';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 digit but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isNonEmpty: function isNonEmpty(node, min, max) {\n var _node$value$trim3 = node.value.trim(),\n length = _node$value$trim3.length;\n\n var valid = length > 0;\n var message = 'Must contain at least one character';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 character but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n }\n });\n\n var HTML_SELECT_ELEMENT = 'HTMLSelectElement';\n var INPUT = 'input';\n var LOAD = 'load';\n var UNDEFINED = 'undefined';\n var SUCCESS = 'success';\n var ERROR = 'error';\n var OBJECT = 'object';\n var FORM = 'form';\n var CLICK = 'click';\n var DIV = 'div';\n var READY_STATE_CHANGE = 'readystatechange';\n var XHR = 'xhr';\n var FETCH = 'fetch';\n var AFTER = 'after';\n var BEFORE = 'before';\n var STRING = 'string';\n var CHECKBOX = 'checkbox';\n var RADIO = 'radio';\n var SELECT = 'select-one';\n var NODE_LIST = 'NodeList';\n var COLOR = 'color';\n\n var Form =\n /*#__PURE__*/\n function () {\n function Form(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Form);\n\n this.node = opts.node;\n this.submit = opts.submit;\n this.classNames = opts.classNames;\n this.fields = opts.fields;\n this.listener = opts.listener;\n this.valid = null;\n this.submitted = false;\n this.sent = null;\n this.callback = opts.callback;\n this.submit.addEventListener(CLICK, this.listener);\n }\n\n _createClass(Form, [{\n key: \"setState\",\n value: function setState() {\n var validity = this.fieldsValidity;\n this.callback(this.node, this.valid, validity);\n this.valid = validity;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.clear();\n });\n this.callback(this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }, {\n key: \"fieldsValidity\",\n get: function get() {\n var validness = new Set(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n if (field.validation) {\n validness.add(field.valid);\n }\n });\n return !validness.has(false);\n }\n }]);\n\n return Form;\n }();\n\n var Field =\n /*#__PURE__*/\n function () {\n function Field(_ref) {\n var node = _ref.node,\n validation = _ref.validation,\n min = _ref.min,\n max = _ref.max,\n send = _ref.send,\n classNames = _ref.classNames,\n callback = _ref.callback;\n\n _classCallCheck(this, Field);\n\n this.node = node;\n this.type = this.node.constructor.name;\n this.name = this.type === NODE_LIST ? this.node[0].name : this.node.name;\n this.validation = validation;\n this.send = send;\n this.min = min;\n this.max = max;\n this.classNames = classNames;\n this.valid = null;\n this.submitted = false;\n this.callback = callback;\n }\n\n _createClass(Field, [{\n key: \"setState\",\n value: function setState(valid) {\n this.callback(this.validation, this.name, this.node, this.valid, valid);\n this.valid = valid;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"setFieldSubmitted\",\n value: function setFieldSubmitted(value) {\n this.submitted = value;\n }\n }, {\n key: \"on\",\n value: function on(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.addEventListener(type, listener);\n });\n } else {\n this.node.addEventListener(type, listener);\n }\n }\n }, {\n key: \"off\",\n value: function off(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.removeEventListener(type, listener);\n });\n } else {\n this.node.removeEventListener(type, listener);\n }\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }, {\n key: \"validatorOptions\",\n get: function get() {\n return {\n type: this.validation,\n node: this.node,\n min: this.min,\n max: this.max\n };\n }\n }]);\n\n return Field;\n }();\n\n var Input =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Input, _Field);\n\n function Input(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Input);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Input).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Input, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Input;\n }(Field);\n\n var Radio =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Radio, _Field);\n\n function Radio(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Radio);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Radio).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Radio, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n var _this = this;\n\n if (this.valid) {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isValid);\n });\n } else {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isNotValid);\n });\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n var _this2 = this;\n\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n // eslint-disable-next-line no-param-reassign\n el.checked = false;\n });\n }\n }]);\n\n return Radio;\n }(Field);\n\n var Select =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Select, _Field);\n\n function Select(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Select);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Select).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Select, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.remove(this.classNames.isNotValid);\n Array.from(this.node.options).forEach(function (el) {\n el.selected = false;\n });\n }\n }]);\n\n return Select;\n }(Field);\n\n var Color =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Color, _Field);\n\n function Color(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Color);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Color).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Color, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '#000000';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Color;\n }(Field);\n\n var Notice =\n /*#__PURE__*/\n function () {\n function Notice(_ref) {\n var form = _ref.form,\n message = _ref.message,\n classNames = _ref.classNames,\n appendTo = _ref.appendTo,\n nextToField = _ref.nextToField,\n parent = _ref.parent;\n\n _classCallCheck(this, Notice);\n\n this.form = form;\n this.message = message;\n this.classNames = classNames;\n this.appendTo = appendTo;\n this.nextToField = nextToField;\n this.parent = parent;\n this.node = null;\n this.mount();\n }\n\n _createClass(Notice, [{\n key: \"mount\",\n value: function mount() {\n this.node = document.createElement(DIV);\n this.node.classList.add(this.classNames.block);\n this.node.classList.add(this.classNames.hidden);\n\n if (this.appendTo) {\n this.parent.appendChild(this.node);\n } else {\n if (this.nextToField === BEFORE) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[0];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent);\n }\n\n if (this.nextToField === AFTER) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[this.parent.length - 1];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent.nextElementSibling);\n }\n }\n }\n }, {\n key: \"show\",\n value: function show() {\n this.node.classList.remove(this.classNames.hidden);\n this.node.classList.add(this.classNames.visible);\n this.node.innerText = this.message;\n }\n }, {\n key: \"hide\",\n value: function hide() {\n this.node.classList.remove(this.classNames.visible);\n this.node.classList.add(this.classNames.hidden);\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }]);\n\n return Notice;\n }();\n\n var Sender =\n /*#__PURE__*/\n function () {\n function Sender(_ref) {\n var type = _ref.type,\n url = _ref.url,\n method = _ref.method,\n data = _ref.data,\n fields = _ref.fields,\n form = _ref.form,\n callbacks = _ref.callbacks;\n\n _classCallCheck(this, Sender);\n\n this.type = type;\n this.url = url;\n this.method = method;\n this.data = data();\n this.fields = fields;\n this.form = form;\n this.callbacks = callbacks;\n }\n\n _createClass(Sender, [{\n key: \"makeData\",\n value: function makeData() {\n var _this = this;\n\n var data = new FormData(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.data).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n value = _ref3[1];\n\n // eslint-disable-next-line no-useless-return\n if (!_this.fields[name].send) return;\n data.append(name, value);\n });\n return data;\n }\n }, {\n key: \"sendRequest\",\n value: function sendRequest(data) {\n var _this2 = this;\n\n if (this.type === XHR) {\n var xhr = new XMLHttpRequest();\n xhr.open(this.method, this.url, true);\n xhr.addEventListener(READY_STATE_CHANGE, function (ev) {\n if (ev.target.readyState === 4) {\n if (ev.target.status >= 200 && ev.target.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(ev.target.status, \", Text: \").concat(ev.target.statusText));\n }\n }\n });\n xhr.send(data);\n }\n\n if (this.type === FETCH) {\n fetch(this.url, {\n method: this.method,\n body: data\n }).then(function (response) {\n if (response.status >= 200 && response.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(response.status, \", Text: \").concat(response.statusText));\n }\n });\n }\n }\n }]);\n\n return Sender;\n }();\n\n var FormHandler =\n /*#__PURE__*/\n function () {\n // TODO: Переименовать опцию appendTo => appendTo\n function FormHandler(_ref) {\n var _this = this;\n\n var args = _extends({}, _ref);\n\n _classCallCheck(this, FormHandler);\n\n _defineProperty(this, \"setFormStateFromResponse\", function (result) {\n if (result === SUCCESS) {\n _this.notices.form.message = _this.opts.form.notice.successMessage;\n _this.form.sent = true;\n\n if (_this.opts.sender.clearFormOnSuccess) {\n _this.form.clear();\n }\n }\n\n if (result === ERROR) {\n _this.notices.form.message = _this.opts.form.notice.errorMessage;\n _this.form.sent = false;\n }\n\n _this.notices.form.show();\n });\n\n _defineProperty(this, \"inputHandler\", function (ev) {\n var name = ev.target.name;\n var validation = Validator.validate(_this.fields[name].validatorOptions);\n\n if (_this.fields[name].validation) {\n _this.setFieldState(name, validation.valid, validation.message); // eslint-disable-next-line valid-typeof\n\n\n if (_typeof(validation.valid) !== OBJECT) {\n _this.form.setState();\n }\n }\n });\n\n _defineProperty(this, \"submitHandler\", function (ev) {\n ev.preventDefault();\n var fieldNodes = [];\n var delayForNotice = _this.opts.form.delayForNotice; // eslint-disable-next-line no-unused-vars\n\n Object.entries(_this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.setFieldSubmitted(true);\n fieldNodes.push(field.node);\n });\n\n _this.callbacks.onSubmit(_this.form.node, fieldNodes);\n\n _this.validateForm();\n\n _this.notices.form.message = _this.opts.form.notice.message;\n\n if (_this.form.valid) {\n _this.notices.form.hide();\n\n if (_this.opts.sender.send) {\n var options = {\n type: _this.opts.sender.type,\n url: _this.form.node.action,\n method: _this.form.node.method,\n data: _this.getFieldsAndValues,\n fields: _this.fields,\n form: _this.form.node,\n callbacks: {\n setFormState: _this.setFormStateFromResponse,\n onSend: _this.callbacks.onSend\n }\n };\n var sender = new Sender(options);\n sender.sendRequest(sender.makeData());\n setTimeout(function () {\n _this.notices.form.hide();\n }, 2000);\n }\n } else {\n _this.notices.form.show();\n\n if (delayForNotice) {\n setTimeout(function () {\n _this.notices.form.hide();\n }, delayForNotice);\n }\n }\n });\n\n _defineProperty(this, \"getFieldsAndValues\", function () {\n var data = {};\n Object.entries(_this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n var type = field.node.constructor.name;\n\n if (type === NODE_LIST) {\n // Radio/Checkbox\n var inputType = field.node[0].type;\n\n if (inputType === CHECKBOX) {\n data[name] = [];\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name].push(node.value);\n }\n });\n }\n\n if (inputType === RADIO) {\n data[name] = '';\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name] = node.value;\n }\n });\n }\n } else if (type === HTML_SELECT_ELEMENT) {\n // Select\n data[name] = field.node.options[field.node.options.selectedIndex].value;\n } else {\n // Others\n data[name] = field.node.value;\n }\n });\n return data;\n });\n\n this.opts = args;\n this.fields = {};\n this.notices = {};\n this.form = null;\n this.validator = new Validator(this.opts.customValidations);\n this.callbacks = {};\n this.init();\n }\n\n _createClass(FormHandler, [{\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n this.complementOptions().makeForm();\n Object.entries(this.opts.fields).forEach(function (_ref6) {\n var _ref7 = _slicedToArray(_ref6, 2),\n name = _ref7[0],\n field = _ref7[1];\n\n _this2.makeField(name, field);\n\n if (field.validation) {\n var validation = Validator.validate(_this2.fields[name].validatorOptions);\n\n _this2.makeNotice(name, field.notice);\n\n _this2.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.setState();\n return this;\n }\n }, {\n key: \"complementOptions\",\n value: function complementOptions() {\n var _this3 = this;\n\n // Add lacks classNames and merge.\n this.opts.classNames = this.opts.classNames ? Object.assign({}, defaultConfig.classNames, this.opts.classNames) : defaultConfig.classNames;\n this.opts.classNames.form = Object.assign({}, defaultConfig.classNames.form, this.opts.classNames.form);\n this.opts.classNames.fields = Object.assign({}, defaultConfig.classNames.fields, this.opts.classNames.fields);\n this.opts.classNames.notices = Object.assign({}, defaultConfig.classNames.notices, this.opts.classNames.notices); // Add lacks form options and merge.\n\n this.opts.form = this.opts.form ? Object.assign({}, defaultConfig.form, this.opts.form) : defaultConfig.form;\n this.opts.form.notice = Object.assign({}, defaultConfig.form.notice, this.opts.form.notice);\n this.opts.form.notice.classNames = Object.assign({}, this.opts.classNames.notice, this.opts.form.notice.classNames); // Add lacks notices options and merge\n\n this.opts.notices = Object.assign({}, defaultConfig.notices, this.opts.notices); // Add lacks fields options and merge\n // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.opts.fields).forEach(function (_ref8) {\n var _ref9 = _slicedToArray(_ref8, 2),\n name = _ref9[0],\n obj = _ref9[1];\n\n _this3.opts.fields[name] = Object.assign({}, defaultConfig.fields, _this3.opts.fields[name]);\n _this3.opts.fields[name].classNames = _this3.opts.fields[name].classNames ? Object.assign({}, _this3.opts.classNames.fields, _this3.opts.fields[name].classNames) : _this3.opts.classNames.fields;\n _this3.opts.fields[name].notice = Object.assign({}, _this3.opts.notices, _this3.opts.fields[name].notice);\n _this3.opts.fields[name].notice.classNames = Object.assign({}, _this3.opts.classNames.notices, _this3.opts.fields[name].notice.classNames);\n });\n this.opts.sender = this.opts.sender ? Object.assign({}, defaultConfig.sender, this.opts.sender) : defaultConfig.sender;\n this.callbacks = this.opts.callbacks ? Object.assign({}, defaultConfig.callbacks, this.opts.callbacks) : defaultConfig.callbacks;\n return this;\n }\n }, {\n key: \"makeForm\",\n value: function makeForm() {\n var options = {\n fields: this.fields,\n classNames: this.opts.classNames.form,\n node: document.querySelector(this.opts.form.block),\n submit: document.querySelector(this.opts.form.submit),\n listener: this.submitHandler,\n callback: this.callbacks.onFormChangeState\n };\n this.form = new Form(options);\n this.makeNotice(FORM, this.opts.form.notice);\n return this;\n }\n }, {\n key: \"makeField\",\n value: function makeField(name, field) {\n var node = this.form.node.querySelector(\"[name=\".concat(name, \"]\"));\n var _node = node,\n type = _node.type;\n var options = {\n node: node,\n validation: field.validation,\n min: field.min,\n max: field.max,\n send: field.send,\n classNames: field.classNames,\n callback: this.callbacks.onFieldChangeState\n };\n\n if (type === RADIO || type === CHECKBOX) {\n node = this.form.node.querySelectorAll(\"[name=\".concat(name, \"]\"));\n options.node = node;\n this.fields[name] = new Radio(options);\n } else if (type === SELECT) {\n this.fields[name] = new Select(options);\n } else if (type === COLOR) {\n this.fields[name] = new Color(options);\n } else {\n this.fields[name] = new Input(options);\n }\n\n this.fields[name].on(INPUT, this.inputHandler);\n return this;\n }\n }, {\n key: \"makeNotice\",\n value: function makeNotice(name, notice) {\n var message = this.fields[name] ? Validator.validate(this.fields[name].validatorOptions).message : false;\n var parent = notice.nextToField ? this.fields[name].node : document.querySelector(notice.appendTo);\n var options = {\n form: this.form.node,\n classNames: notice.classNames,\n appendTo: notice.appendTo,\n message: notice.message || message,\n nextToField: notice.nextToField,\n parent: parent\n };\n this.notices[name] = new Notice(options);\n return this;\n }\n }, {\n key: \"setFieldStateFromResponse\",\n value: function setFieldStateFromResponse(response, property, name, message) {\n var _this4 = this;\n\n // eslint-disable-next-line valid-typeof\n if (_typeof(response.then) !== UNDEFINED) {\n response.then(function (data) {\n return data.json();\n }).then(function (json) {\n _this4.setFieldState(name, !!json[property], message);\n\n _this4.form.setState();\n });\n } else {\n response.addEventListener(LOAD, function (ev) {\n _this4.setFieldState(name, !!JSON.parse(ev.target.response)[property], message);\n\n _this4.form.setState();\n });\n }\n }\n }, {\n key: \"setFieldState\",\n value: function setFieldState(name, valid) {\n var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.notices[name].message;\n var submitted = this.fields[name].submitted; // eslint-disable-next-line valid-typeof\n\n if (_typeof(valid) === OBJECT) {\n this.setFieldStateFromResponse(valid.response, valid.property, name, message);\n } else {\n this.fields[name].setState(valid);\n }\n\n this.notices[name].message = this.opts.fields[name].notice.message || message;\n\n if (!valid && submitted) {\n this.notices[name].show();\n } else {\n this.notices[name].hide();\n }\n\n return this;\n }\n }, {\n key: \"getFieldNameBy\",\n value: function getFieldNameBy(field) {\n // return field name get by NodeList/Selector(.className)\n var type = _typeof(field);\n\n var name = field.name;\n var node = this.form.node;\n var fieldName;\n\n if (type === OBJECT) {\n fieldName = name;\n }\n\n if (type === STRING) {\n var isSelector = /\\./.test(field);\n\n if (isSelector) {\n fieldName = node.querySelector(field).name;\n } else {\n fieldName = field;\n }\n }\n\n return fieldName;\n }\n }, {\n key: \"isFieldValid\",\n value: function isFieldValid(field) {\n return this.fields[this.getFieldNameBy(field)].valid;\n }\n }, {\n key: \"getFieldValue\",\n value: function getFieldValue(field) {\n return this.fields[this.getFieldNameBy(field)].node.value;\n }\n }, {\n key: \"isFormValid\",\n value: function isFormValid() {\n return this.form.valid;\n }\n }, {\n key: \"isFormSubmitted\",\n value: function isFormSubmitted() {\n return this.form.submitted;\n }\n }, {\n key: \"isFormSent\",\n value: function isFormSent() {\n return this.form.sent;\n }\n }, {\n key: \"clearForm\",\n value: function clearForm() {\n this.form.clear();\n }\n }, {\n key: \"clearField\",\n value: function clearField(field) {\n // Also clears classNames and field of instance like valid, submitted\n this.fields[this.getFieldNameBy(field)].clear();\n this.form.setState();\n }\n }, {\n key: \"getField\",\n value: function getField(field) {\n // Returns a field node\n return this.fields[this.getFieldNameBy(field)].node;\n }\n }, {\n key: \"addField\",\n value: function addField(field, _ref10) {\n var opts = _extends({}, _ref10);\n\n var options = opts;\n options.notice = options.notice ? options.notice : {};\n var name = this.getFieldNameBy(field);\n var fieldOptions = {\n validation: options.validation,\n min: options.min || defaultConfig.fields.min,\n max: options.max || defaultConfig.fields.max,\n send: options.send || defaultConfig.fields.send,\n classNames: Object.assign({}, this.opts.classNames.fields, options.classNames)\n };\n var noticeOptions = {\n appendTo: options.notice.appendTo || defaultConfig.notices.appendTo,\n nextToField: options.notice.nextToField || defaultConfig.notices.nextToField,\n message: options.notice.message || defaultConfig.notices.message,\n classNames: Object.assign({}, this.opts.classNames.notices, options.notice.classNames)\n };\n this.opts.fields[name] = Object.assign({}, fieldOptions, {\n notice: noticeOptions\n });\n this.makeField(name, this.opts.fields[name]);\n this.makeNotice(name, this.opts.fields[name].notice);\n return this.fields[name].node;\n }\n }, {\n key: \"removeField\",\n value: function removeField(field) {\n var name = this.getFieldNameBy(field);\n this.fields[name].remove();\n this.notices[name].remove();\n }\n }, {\n key: \"validateField\",\n value: function validateField(field) {\n // also turns on toggleClassNames\n var name = this.getFieldNameBy(field);\n\n if (this.fields[name].validation) {\n var validation = Validator.validate(this.fields[name].validatorOptions);\n this.fields[name].submitted = true;\n this.setFieldState(name, validation.valid);\n }\n\n this.form.setState();\n return this.fields[name].node;\n }\n }, {\n key: \"validateForm\",\n value: function validateForm() {\n var _this5 = this;\n\n // also turns on toggleClassNames\n Object.entries(this.fields).forEach(function (_ref11) {\n var _ref12 = _slicedToArray(_ref11, 2),\n name = _ref12[0],\n field = _ref12[1];\n\n if (field.validation) {\n var validation = Validator.validate(field.validatorOptions);\n field.setFieldSubmitted(true);\n\n _this5.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.submitted = true;\n this.form.setState();\n return this.form.node;\n }\n }]);\n\n return FormHandler;\n }();\n\n return FormHandler;\n\n})));\n"]} \ No newline at end of file