Plugins_http_serialize.js
import {
empty,
isObject
} from '../../Utils/Utils.js'
/**
* Clase para serializar valores para envió [Fetch]{@link module:Plugins.HTTP.fetch}
* @namespace Serialize
* @memberOf module:Plugins.HTTP
* @class
*/
export class Serialize {
/**
* Serializa los datos
* @memberOf module:Plugins.HTTP.Serialize
* @param {(Object|Array)} param Grupo de parámetros a serializar
* @param {String} space separador de la cadena por defecto & para URL
* @return {String} cadena serializada
*/
stringify(param, space = '&') {
var _this = this
return Object.keys(param)
.map((key) => {
if (isObject(param[key]) || Array.isArray(param[key])) {
return `${encodeURIComponent(key)}[]=${new Serialize().stringify(param[key], space)}`
} else {
return `${encodeURIComponent(key)}=${encodeURIComponent(param[key])}`
}
})
.join(space)
}
/**
* Deserializa una cadena serializada
* @memberOf module:Plugins.HTTP.Serialize
* @param {String} param cadena serializada
* @param {String} space Divisor de cadena para cortar
* @return {Object} Objeto deserializado
*/
parse(param, space = '&') {
let obj = {}
param.split(space)
.forEach((query) => {
let param = query.split('=')
let key = decodeURIComponent(param[0])
let value = decodeURIComponent(param[1])
if (key.indexOf('[]') > -1) {
obj[key.replace('[]', '')] = this.parse(value)
} else {
obj[key] = value
}
})
return obj
}
}
/**
* Serializa un formulario
* @function
* @memberOf module:Plugins.HTTP.Serialize
* @public
* @param {HTMLFromElement} form El formulario
* @throws {Error} If form !== HTMLFromElement
* @return {String} Cadena serializada o vació si hay errores
*/
export const SerializeToForm = function SerializeToForm(form) {
if (empty(form)) {
return ''
}
if (form.nodeName !== 'FORM') {
throw new Error(form, 'is not element HTMLFormElement')
return ''
}
let e = form.elements,
l = e.length,
p = {}
for (let i = 0; i < l; i++) {
let field = e[i],
name = field.name || field.id
if (!empty(name) && !field.disabled) {
switch (field.nodeName) {
case 'INPUT':
switch (field.type.toLowerCase()) {
case 'checkbox':
case 'radio':
if (field.checked) {
p[name] = field.value
}
break
case 'file':
let data = new FormData()
for (let k = 0; k < field.files.length; k++) {
data.append(name, field.files[k])
}
p[name] = data
break
default:
p[name] = field.value
break
}
break
case 'TEXTAREA':
p[name] = field.value
break
case 'SELECT':
switch (field.type) {
case 'select-one':
p[name] = field.value
break
case 'select-multiple':
let o = field.options
for (let j = 0; j < o.length; j++) {
if (o.selected) {
if (!Array.isArray(p[name])) {
p[name] = []
}
p[name].push(o.value)
}
}
break
}
}
}
}
return new Serialize().stringify(p)
}
export default Serialize