Skip to content

Instantly share code, notes, and snippets.

@philayres
Last active August 29, 2015 14:02
Show Gist options
  • Save philayres/9219aed29ef2651fa2bd to your computer and use it in GitHub Desktop.
Save philayres/9219aed29ef2651fa2bd to your computer and use it in GitHub Desktop.
Alpaca form submit
// This is how I'm creating the alpaca form
_re = {};
_re.utils = {
form_auth_token: function(){
var autht = $('meta[name="csrf-token"]').attr('content');
var authh ='<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token" type="hidden" value="'+autht+'"></div>';
return authh;
}
};
_re.form = function(data){
this.data;
this.form_url = '/someurl';
return this;
};
_re.form.prototype = {
show_form: function(){
var self = this;
var rendered_form;
var data = self.data;
formEl.alpaca({
postRender: function(rendered) {
formEl.append(_re.utils.form_auth_token());
rendered_form = rendered;
self.rendered_form = rendered_form;
self.default_form_rendered(formEl, options, self, rendered_form, view);
},
schema: data.definition.schema,
options: data.definition.options,
data: data.data,
ui: "bootstrap",
});
}
default_form_rendered: function(formEl, options, self, rendered_form, view){
formEl.find('form').on( "submit", function( event ) {
event.preventDefault();
if(!(options && options.prevent_submit))
self.form_submitted(rendered_form);
});
$(document).on('keydown','input, select, checkbox', function(e){
if(e.keyCode === 13)
e.preventDefault();
});
$(document).on('keydown', '.prevent-change', function(ev){
if(ev.keyCode !== 9)
ev.preventDefault();
});
var row = $('.readonly-wizard');
var formElHolder;
var revdir = false;
if(this.current_view === 'wizard')
formElHolder = $('<div class="button-holder"></div>').appendTo(formEl);
else{
formElHolder = $('.alpaca-form-buttons-container');
revdir = true;
}
if(formElHolder.length === 0){
revdir = false;
formElHolder = formEl;
}
_re.utils.view_transpose_data();
$('button:not(.close), input[type="submit"]').addClass('btn btn-default');
$('.alpaca-wizard-nav-bar button').click(function(){
_re.utils.scrollTop();
});
},
form_submitted: function(){
var self = this;
var rendered_form = self.rendered_form;
var s = {
_method: 'PUT',
data: rendered_form.getValue(),
form:{
id: 'some id'
}
};
rendered_form.form.validate(true);
// draw the validation state (top control + all children)
rendered_form.form.renderValidationState(true);
// now display something
$(self.form).find('.re-form-validation-error').remove();
if(rendered_form.form.isFormValid()){
self.pre_send_data_massage(s, self.form_data);
// Prevent jQuery mangling non-string fields
s.data = JSON.stringify(s.data);
if(s.sign) s.sign = JSON.stringify(s.sign);
_re.utils.submitting_form(self.form);
$.ajax({url: self.form_url, data: s, type: 'post'}).done(function(resdata){
_re.utils.done_submitting_form(self.form);
// do something here
}).fail(function(){
self.form_not_saved();
});
}
else
{
self.form.append('<div class="re-form-validation-error alert alert-danger">Check the entries on the form and try again.</div>');
$.scrollTo('.re-form-validation-error', {offset: -400});
_re.view.reset_submit_buttons(self.form);
return false;
}
},
pre_send_data_massage: function(form_data, data){
var dd = data.definition.schema.properties;
var field_options = data.definition.options.fields;
this.massage_nested_fields(form_data.data, field_options, dd);
},
massage_nested_fields: function(field_data, field_options, dd){
for(var fi in dd){
if(dd.hasOwnProperty(fi)){
var f = dd[fi];
if(field_data[fi] || field_data[fi]===''){ // Fields may be 'missing' due to dependencies hiding them
if(f.type === 'object' && field_options[fi]){ // Drill down
this.massage_nested_fields(field_data[fi], field_options[fi].fields, f.properties);
}
else if(f.type === 'boolean'){ // Fix up required booleans
field_data[fi] = !!field_data[fi];
}
else if(f.format === 'date'){ // Set dates to null if they are blank
if(field_data[fi]==='')
field_data[fi] = null;
}
}
}
}
},
save_result: function(form_id, resdata){
if(resdata && resdata.updated_with && resdata.updated_with.id === form_id){
this.form_saved(form_id, resdata);
}else{
this.form_not_saved(form_id, resdata);
}
},
form_saved: function(form_id, resdata){
_re.result_handler(resdata, this);
},
form_not_saved: function(form_id, resdata){
var failure_reason = 'Try again.';
var failure_detail = '';
if(resdata && resdata.failure_reason)
failure_reason = resdata.failure_reason;
if(resdata && resdata.failure_detail)
failure_detail = resdata.failure_detail;
alert("Form not saved. " +failure_reason );
}
};
form = new _re.form(data);
form.show_form();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment