poll-for-translations.js 5.67 KB
/*global jQuery, ajaxurl, JSON */
"use strict";

var TranslationProxyPolling = {
    init: function (button, icl_ajxloaderimg) {
        var self = this;
        var JSONtext = jQuery('#tp_polling_job').text();
        self.jobs = JSONtext ? JSON.parse(JSONtext) : [];
        jQuery(button).click(self.handleOne);
        self.button = jQuery(button);
        self.icl_ajxloaderimg = jQuery(icl_ajxloaderimg);
        self.icl_ajxloaderimg.hide();
        self.button.after(TranslationProxyPolling.icl_ajxloaderimg);
    },
    jobs: [],
    completed_count: 0,
    cancel_count: 0,
    error_data: [],
    showSpinner: function () {
        if (!TranslationProxyPolling.spinner) {
            TranslationProxyPolling.button.prop('disabled', true);
            TranslationProxyPolling.icl_ajxloaderimg.show();
            TranslationProxyPolling.spinner = true;
        }
    },
    hideSpinner: function () {
        TranslationProxyPolling.button.prop('disabled', false);
        TranslationProxyPolling.icl_ajxloaderimg.hide();
        TranslationProxyPolling.spinner = false;
    },
    handleOne: function () {
        var nonce = jQuery("#_icl_nonce_pickup_t").val();
        var currentJob = TranslationProxyPolling.jobs.length > 0 ? TranslationProxyPolling.jobs.pop() : false;
        if (currentJob) {
            TranslationProxyPolling.showSpinner();
            jQuery.ajax(
                {
                    type: "POST",
                    url: ajaxurl,
                    dataType: 'json',
                    data: {
                        action: 'icl_pickup_translations',
                        _icl_nonce: nonce,
                        job_polled: currentJob,
                        completed_jobs: TranslationProxyPolling.completed_count,
                        cancelled_jobs: TranslationProxyPolling.cancel_count
                    },
                    success: function (response) {
                        if (currentJob && !response.data.job_error) {
                            TranslationProxyPolling.updateCounts(currentJob, response);
                        }
                        var icl_message_div;
                        /** @namespace response.data.completed */
                        if (response.data.completed) {
													icl_message_div = jQuery("#icl_tm_pickup_wrap_completed");
                            icl_message_div.text(response.data.completed);
                            icl_message_div.show();
                        }
                        /** @namespace response.data.cancelled */
                        if (response.data.cancelled) {
                            icl_message_div = jQuery("#icl_tm_pickup_wrap_cancelled");
                            icl_message_div.text(response.data.cancelled);
                            icl_message_div.show();
                        }
                        /** @namespace response.data.submitting */
                        if (response.data.submitting) {
                            icl_message_div = jQuery("#icl_tm_pickup_wrap_submitting");
                            icl_message_div.text(response.data.submitting);
                            icl_message_div.show();
                        }
                        if (TranslationProxyPolling.jobs.length > 0) {
                            TranslationProxyPolling.handleOne();
                        } else {
													TranslationProxyPolling.hideSpinner();
													TranslationProxyPolling.button.attr('disabled', 'disabled');
													TranslationProxyPolling.startReloading(10);
													jQuery.ajax({
																				type:     "POST",
																				url:      ajaxurl,
																				dataType: 'json',
																				data:     {
																					action: 'icl_pickup_translations_complete'
																				}
																			});
												}
                    },
                    error: function () {
                        TranslationProxyPolling.hideSpinner();
                    }
                }
            );
        } else {
            TranslationProxyPolling.hideSpinner();
        }
    },
    updateCounts: function (currentJob, response) {
        if (currentJob.job_state === 'translation_ready' && response.data.completed) {
            TranslationProxyPolling.completed_count += 1;
        }
        if (currentJob.job_state === 'cancelled' && response.data.cancelled) {
            TranslationProxyPolling.completed_count += 1;
        }
    },
    startReloading: function (remaining) {
        if (0 >= remaining) {
            location.reload(true);
        } else {
            TranslationProxyPolling.updatePickupButtonTo('reloading', remaining);
            setTimeout(function () {
                TranslationProxyPolling.startReloading(remaining - 1);
            }, 1000);
        }
    },
    updatePickupButtonTo: function (state, value) {
        var dataAttributePrefix, stateData, sanitizedValue;

        dataAttributePrefix = state;
        if ('undefined' === typeof state) {
            dataAttributePrefix = 'default';
        }

        sanitizedValue = value;
        if ('undefined' === typeof value) {
            sanitizedValue = '';
        }

        stateData = TranslationProxyPolling.button.data(dataAttributePrefix + '-text');

        if ('reloading' === dataAttributePrefix) {
            stateData = TranslationProxyPolling.button.data('reloading-text') + ' ' + sanitizedValue;
        }

        if ('undefined' !== typeof stateData) {
            if (stateData) {
                TranslationProxyPolling.button.data('current-text', stateData);
                TranslationProxyPolling.button.val(stateData);
            } else {
                self.updatePickupButtonTo('default');
            }
        }
    }
};