Skip to content

Instantly share code, notes, and snippets.

@lucasprogamer
Created May 21, 2018 20:03
Show Gist options
  • Save lucasprogamer/492a473f70cd105ce5844c3833eaab26 to your computer and use it in GitHub Desktop.
Save lucasprogamer/492a473f70cd105ce5844c3833eaab26 to your computer and use it in GitHub Desktop.
CF7 Bulma Ajax-loader icon
/**
* when cf7 ajax-loader
* @param {[type]} form [description]
* @return {[type]} [description]
*/
wpcf7.submit = function( form ) {
if ( typeof window.FormData !== 'function' ) {
return;
}
var $form = $( form );
$( '.button.wpcf7-submit', $form ).addClass( 'is-loading' );
$( '[placeholder].placeheld', $form ).each( function( i, n ) {
$( n ).val( '' );
} );
wpcf7.clearResponse( $form );
var formData = new FormData( $form.get( 0 ) );
var detail = {
id: $form.closest( 'div.wpcf7' ).attr( 'id' ),
status: 'init',
inputs: [],
formData: formData
};
$.each( $form.serializeArray(), function( i, field ) {
if ( '_wpcf7' == field.name ) {
detail.contactFormId = field.value;
} else if ( '_wpcf7_version' == field.name ) {
detail.pluginVersion = field.value;
} else if ( '_wpcf7_locale' == field.name ) {
detail.contactFormLocale = field.value;
} else if ( '_wpcf7_unit_tag' == field.name ) {
detail.unitTag = field.value;
} else if ( '_wpcf7_container_post' == field.name ) {
detail.containerPostId = field.value;
} else if ( field.name.match( /^_wpcf7_\w+_free_text_/ ) ) {
var owner = field.name.replace( /^_wpcf7_\w+_free_text_/, '' );
detail.inputs.push( {
name: owner + '-free-text',
value: field.value
} );
} else if ( field.name.match( /^_/ ) ) {
// do nothing
} else {
detail.inputs.push( field );
}
} );
wpcf7.triggerEvent( $form.closest( 'div.wpcf7' ), 'beforesubmit', detail );
var ajaxSuccess = function( data, status, xhr, $form ) {
detail.id = $( data.into ).attr( 'id' );
detail.status = data.status;
detail.apiResponse = data;
var $message = $( '.wpcf7-response-output', $form );
switch ( data.status ) {
case 'validation_failed':
$.each( data.invalidFields, function( i, n ) {
$( n.into, $form ).each( function() {
wpcf7.notValidTip( this, n.message );
$( '.wpcf7-form-control', this ).addClass( 'wpcf7-not-valid' );
$( '[aria-invalid]', this ).attr( 'aria-invalid', 'true' );
} );
} );
$message.addClass( 'wpcf7-validation-errors' );
$form.addClass( 'invalid' );
wpcf7.triggerEvent( data.into, 'invalid', detail );
break;
case 'acceptance_missing':
$message.addClass( 'wpcf7-acceptance-missing' );
$form.addClass( 'unaccepted' );
wpcf7.triggerEvent( data.into, 'unaccepted', detail );
break;
case 'spam':
$message.addClass( 'wpcf7-spam-blocked' );
$form.addClass( 'spam' );
$( '[name="g-recaptcha-response"]', $form ).each( function() {
if ( '' === $( this ).val() ) {
var $recaptcha = $( this ).closest( '.wpcf7-form-control-wrap' );
wpcf7.notValidTip( $recaptcha, wpcf7.recaptcha.messages.empty );
}
} );
wpcf7.triggerEvent( data.into, 'spam', detail );
break;
case 'aborted':
$message.addClass( 'wpcf7-aborted' );
$form.addClass( 'aborted' );
wpcf7.triggerEvent( data.into, 'aborted', detail );
break;
case 'mail_sent':
$message.addClass( 'wpcf7-mail-sent-ok' );
$form.addClass( 'sent' );
wpcf7.triggerEvent( data.into, 'mailsent', detail );
break;
case 'mail_failed':
$message.addClass( 'wpcf7-mail-sent-ng' );
$form.addClass( 'failed' );
wpcf7.triggerEvent( data.into, 'mailfailed', detail );
break;
default:
var customStatusClass = 'custom-'
+ data.status.replace( /[^0-9a-z]+/i, '-' );
$message.addClass( 'wpcf7-' + customStatusClass );
$form.addClass( customStatusClass );
}
wpcf7.refill( $form, data );
wpcf7.triggerEvent( data.into, 'submit', detail );
if ( 'mail_sent' == data.status ) {
$form.each( function() {
this.reset();
} );
}
$form.find( '[placeholder].placeheld' ).each( function( i, n ) {
$( n ).val( $( n ).attr( 'placeholder' ) );
} );
$message.html( '' ).append( data.message ).slideDown( 'fast' );
$message.attr( 'role', 'alert' );
$( '.screen-reader-response', $form.closest( '.wpcf7' ) ).each( function() {
var $response = $( this );
$response.html( '' ).attr( 'role', '' ).append( data.message );
if ( data.invalidFields ) {
var $invalids = $( '<ul></ul>' );
$.each( data.invalidFields, function( i, n ) {
if ( n.idref ) {
var $li = $( '<li></li>' ).append( $( '<a></a>' ).attr( 'href', '#' + n.idref ).append( n.message ) );
} else {
var $li = $( '<li></li>' ).append( n.message );
}
$invalids.append( $li );
} );
$response.append( $invalids );
}
$response.attr( 'role', 'alert' ).focus();
} );
};
$.ajax( {
type: 'POST',
url: wpcf7.apiSettings.getRoute(
'/contact-forms/' + wpcf7.getId( $form ) + '/feedback' ),
data: formData,
dataType: 'json',
processData: false,
contentType: false
} ).done( function( data, status, xhr ) {
ajaxSuccess( data, status, xhr, $form );
$( '.button.wpcf7-submit', $form ).removeClass( 'is-loading' );
} ).fail( function( xhr, status, error ) {
var $e = $( '<div class="ajax-error"></div>' ).text( error.message );
$form.after( $e );
} );
};
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment