form-serialize-js
Version:
Serialize form fields to submit through ajax
94 lines (92 loc) • 2.48 kB
JavaScript
import _toConsumableArray from "reshow-runtime/es/helpers/toConsumableArray";
// @ts-check
import set from "set-object-value";
/**
* @param {any} formParams
*/
var maybeArray = function maybeArray(formParams, _ref) {
var {
name,
value,
arrayMode
} = _ref;
switch (arrayMode) {
case "arrayKeyKeep":
case "arrayKey":
var len = name.length;
if ("[]" === name.substring(len - 2, len)) {
var thisName = arrayMode === "arrayKeyKeep" ? name : name.substring(0, len - 2);
set(formParams, [thisName], value, true);
} else {
formParams[name] = value;
}
break;
case "auto":
if (formParams[name]) {
set(formParams, [name], value, true);
} else {
formParams[name] = value;
}
break;
default:
formParams[name] = value;
break;
}
};
/**
* @param {HTMLFormElement} formEl
* @param {string=} arrayMode
*/
var formSerialize = function formSerialize(formEl, arrayMode) {
arrayMode = null != arrayMode ? arrayMode : "auto";
var formParams = {};
var elements = _toConsumableArray( /**@type any*/formEl.elements);
elements.forEach(function (el) {
var {
name,
value,
type,
checked
} = /**@type any*/el;
var booleanValue = el.getAttribute("data-boolean") ? !!(-1 !== "|0|null|true|false|".indexOf("|" + value.toLowerCase() + "|") ? JSON.parse(value.toLowerCase()) : value) : value;
if (name) {
switch (type.toLowerCase()) {
case "checkbox":
if (checked) {
maybeArray(formParams, {
name,
value: booleanValue,
arrayMode
});
}
break;
case "radio":
if (checked) {
formParams[name] = booleanValue;
}
break;
case "select-multiple":
var options = /**@type NodeListOf<HTMLOptionElement>*/
el.querySelectorAll("option[selected]");
_toConsumableArray( /**@type any*/options).forEach(function (opt) {
var optValue = opt.value || opt.text;
maybeArray(formParams, {
name,
value: optValue,
arrayMode
});
});
break;
default:
maybeArray(formParams, {
name,
value,
arrayMode
});
break;
}
}
});
return formParams;
};
export default formSerialize;