CaffGeek/MBACNationals

View on GitHub
Web.Admin/2014/wordpress/wp-includes/js/wp-util.js

Summary

Maintainability
A
1 hr
Test Coverage
/* global _wpUtilSettings */
window.wp = window.wp || {};

(function ($) {
    // Check for the utility settings.
    var settings = typeof _wpUtilSettings === 'undefined' ? {} : _wpUtilSettings;

    /**
     * wp.template( id )
     *
     * Fetches a template by id.
     *
     * @param  {string} id   A string that corresponds to a DOM element with an id prefixed with "tmpl-".
     *                       For example, "attachment" maps to "tmpl-attachment".
     * @return {function}    A function that lazily-compiles the template requested.
     */
    wp.template = _.memoize(function ( id ) {
        var compiled,
            options = {
                evaluate:    /<#([\s\S]+?)#>/g,
                interpolate: /\{\{\{([\s\S]+?)\}\}\}/g,
                escape:      /\{\{([^\}]+?)\}\}(?!\})/g,
                variable:    'data'
            };

        return function ( data ) {
            compiled = compiled || _.template( $( '#tmpl-' + id ).html(), null, options );
            return compiled( data );
        };
    });

    // wp.ajax
    // ------
    //
    // Tools for sending ajax requests with JSON responses and built in error handling.
    // Mirrors and wraps jQuery's ajax APIs.
    wp.ajax = {
        settings: settings.ajax || {},

        /**
         * wp.ajax.post( [action], [data] )
         *
         * Sends a POST request to WordPress.
         *
         * @param  {string} action The slug of the action to fire in WordPress.
         * @param  {object} data   The data to populate $_POST with.
         * @return {$.promise}     A jQuery promise that represents the request.
         */
        post: function( action, data ) {
            return wp.ajax.send({
                data: _.isObject( action ) ? action : _.extend( data || {}, { action: action })
            });
        },

        /**
         * wp.ajax.send( [action], [options] )
         *
         * Sends a POST request to WordPress.
         *
         * @param  {string} action  The slug of the action to fire in WordPress.
         * @param  {object} options The options passed to jQuery.ajax.
         * @return {$.promise}      A jQuery promise that represents the request.
         */
        send: function( action, options ) {
            if ( _.isObject( action ) ) {
                options = action;
            } else {
                options = options || {};
                options.data = _.extend( options.data || {}, { action: action });
            }

            options = _.defaults( options || {}, {
                type:    'POST',
                url:     wp.ajax.settings.url,
                context: this
            });

            return $.Deferred( function( deferred ) {
                // Transfer success/error callbacks.
                if ( options.success )
                    deferred.done( options.success );
                if ( options.error )
                    deferred.fail( options.error );

                delete options.success;
                delete options.error;

                // Use with PHP's wp_send_json_success() and wp_send_json_error()
                $.ajax( options ).done( function( response ) {
                    // Treat a response of `1` as successful for backwards
                    // compatibility with existing handlers.
                    if ( response === '1' || response === 1 )
                        response = { success: true };

                    if ( _.isObject( response ) && ! _.isUndefined( response.success ) )
                        deferred[ response.success ? 'resolveWith' : 'rejectWith' ]( this, [response.data] );
                    else
                        deferred.rejectWith( this, [response] );
                }).fail( function() {
                    deferred.rejectWith( this, arguments );
                });
            }).promise();
        }
    };

}(jQuery));