Refactor query string building

This commit is contained in:
Robin North
2018-03-01 10:19:35 +00:00
parent ca479618fe
commit 4e805ad8af
2 changed files with 16 additions and 13 deletions

View File

@@ -11,7 +11,8 @@ var formAction = function(el, event) {
// Initialize requestOptions // Initialize requestOptions
options.requestOptions = { options.requestOptions = {
requestUrl: el.getAttribute("action") || window.location.href, requestUrl: el.getAttribute("action") || window.location.href,
requestMethod: el.getAttribute("method") || "GET" requestMethod: el.getAttribute("method") || "GET",
requestParams: []
} }
// create a testable virtual link of the form action // create a testable virtual link of the form action
@@ -44,20 +45,20 @@ var formAction = function(el, event) {
event.preventDefault() event.preventDefault()
var params = []
for (var elementKey in el.elements) { for (var elementKey in el.elements) {
var element = el.elements[elementKey] var element = el.elements[elementKey]
// jscs:disable disallowImplicitTypeConversion // jscs:disable disallowImplicitTypeConversion
if (!!element.name && element.attributes !== undefined && element.tagName.toLowerCase() !== "button") { if (!!element.name && element.attributes !== undefined && element.tagName.toLowerCase() !== "button") {
// jscs:enable disallowImplicitTypeConversion // jscs:enable disallowImplicitTypeConversion
if ((!element.attributes.type || element.attributes.type.value !== "checkbox" && element.attributes.type.value !== "radio") || element.checked) { if ((!element.attributes.type || element.attributes.type.value !== "checkbox" && element.attributes.type.value !== "radio") || element.checked) {
params.push({name: encodeURIComponent(element.name), value: encodeURIComponent(element.value)}) options.requestOptions.requestParams.push({
name: encodeURIComponent(element.name),
value: encodeURIComponent(element.value)
})
} }
} }
} }
options.requestOptions.requestParams = params
el.setAttribute(attrClick, "submit") el.setAttribute(attrClick, "submit")
options.triggerElement = el options.triggerElement = el

View File

@@ -2,6 +2,7 @@ var updateQueryString = require("./util/update-query-string");
module.exports = function(location, options, callback) { module.exports = function(location, options, callback) {
options = options || {} options = options || {}
var queryString
var requestMethod = (options.requestMethod || "GET").toUpperCase() var requestMethod = (options.requestMethod || "GET").toUpperCase()
var requestParams = options.requestParams || null var requestParams = options.requestParams || null
var requestPayload = null var requestPayload = null
@@ -29,22 +30,23 @@ module.exports = function(location, options, callback) {
// Prepare the request payload for forms, if available // Prepare the request payload for forms, if available
if (requestParams && requestParams.length) { if (requestParams && requestParams.length) {
// Build query string
queryString = (requestParams.map(function(param) {return param.name + "=" + param.value})).join("&")
switch (requestMethod) { switch (requestMethod) {
case "GET": case "GET":
// Reset query string to avoid an issue with repeat submissions where checkboxes that were // Reset query string to avoid an issue with repeat submissions where checkboxes that were
// previously checked are incorrectly preserved // previously checked are incorrectly preserved
location = location.split("?")[0] location = location.split("?")[0]
// Build new query string // Append new query string
requestParams.forEach(function(param) { location += "?" + queryString
location = updateQueryString(location, param.name, param.value) break
});
break;
case "POST": case "POST":
// Build payload string // Send query string as request payload
requestPayload = (requestParams.map(function(param) {return param.name + "=" + param.value})).join("&") requestPayload = queryString
break; break
} }
} }