Skip to content

Instantly share code, notes, and snippets.

@jwill9999
Created June 7, 2018 18:31
Show Gist options
  • Save jwill9999/a169256d17b8b598574942888f469540 to your computer and use it in GitHub Desktop.
Save jwill9999/a169256d17b8b598574942888f469540 to your computer and use it in GitHub Desktop.
bind form data JavaScript
// Bind the forms
app.bindForms = function(){
if(document.querySelector("form")){
var allForms = document.querySelectorAll("form");
for(var i = 0; i < allForms.length; i++){
allForms[i].addEventListener("submit", function(e){
// Stop it from submitting
e.preventDefault();
var formId = this.id;
var path = this.action;
var method = this.method.toUpperCase();
// Hide the error message (if it's currently shown due to a previous error)
document.querySelector("#"+formId+" .formError").style.display = 'none';
// Hide the success message (if it's currently shown due to a previous error)
if(document.querySelector("#"+formId+" .formSuccess")){
document.querySelector("#"+formId+" .formSuccess").style.display = 'none';
}
// Turn the inputs into a payload
var payload = {};
var elements = this.elements;
for(var i = 0; i < elements.length; i++){
if(elements[i].type !== 'submit'){
// Determine class of element and set value accordingly
var classOfElement = typeof(elements[i].classList.value) == 'string' && elements[i].classList.value.length > 0 ? elements[i].classList.value : '';
var valueOfElement = elements[i].type == 'checkbox' && classOfElement.indexOf('multiselect') == -1 ? elements[i].checked : classOfElement.indexOf('intval') == -1 ? elements[i].value : parseInt(elements[i].value);
var elementIsChecked = elements[i].checked;
// Override the method of the form if the input's name is _method
var nameOfElement = elements[i].name;
if(nameOfElement == '_method'){
method = valueOfElement;
} else {
// Create an payload field named "method" if the elements name is actually httpmethod
if(nameOfElement == 'httpmethod'){
nameOfElement = 'method';
}
// Create an payload field named "id" if the elements name is actually uid
if(nameOfElement == 'uid'){
nameOfElement = 'id';
}
// If the element has the class "multiselect" add its value(s) as array elements
if(classOfElement.indexOf('multiselect') > -1){
if(elementIsChecked){
payload[nameOfElement] = typeof(payload[nameOfElement]) == 'object' && payload[nameOfElement] instanceof Array ? payload[nameOfElement] : [];
payload[nameOfElement].push(valueOfElement);
}
} else {
payload[nameOfElement] = valueOfElement;
}
}
}
}
// If the method is DELETE, the payload should be a queryStringObject instead
var queryStringObject = method == 'DELETE' ? payload : {};
// Call the API
app.client.request(undefined,path,method,queryStringObject,payload,function(statusCode,responsePayload){
// Display an error on the form if needed
if(statusCode !== 200){
if(statusCode == 403){
// log the user out
app.logUserOut();
} else {
// Try to get the error from the api, or set a default error message
var error = typeof(responsePayload.Error) == 'string' ? responsePayload.Error : 'An error has occured, please try again';
// Set the formError field with the error text
document.querySelector("#"+formId+" .formError").innerHTML = error;
// Show (unhide) the form error field on the form
document.querySelector("#"+formId+" .formError").style.display = 'block';
}
} else {
// If successful, send to form response processor
app.formResponseProcessor(formId,payload,responsePayload);
}
});
});
}
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment