wpml-tf-backend-script.js 5.6 KB
/*jshint browser:true, devel:true */
/*global jQuery, wp */
(function($){
    "use strict";

    $(function () {
        var table = $('.js-wpml-tf-feedback-list-table'),
            ajax_action = $('.wpml-tf-feedback-list-page input[name="ajax_action"]').val(),
            ajax_nonce = $('.wpml-tf-feedback-list-page input[name="ajax_nonce"]').val();

        var openFeedbackDetails = function (feedbackId) {
            table.find('#wpml-tf-feedback-' + feedbackId).hide();
            table.find('#wpml-tf-feedback-details-' + feedbackId).show();
        };

        var closeAllFeedbackDetails = function () {
			table.find('.js-wpml-tf-feedback-details').hide();
			table.find('.js-wpml-tf-feedback').show();
		};

		var getFeedbackNode = function(el) {
			return $(el).closest('.js-wpml-tf-feedback-details, .js-wpml-tf-feedback');
		};

		var getFeedbackId = function(el) {
			return getFeedbackNode(el).data('feedback-id');
		};

		var getFeedbackContentUpdate = function(node) {
			var newContentNode = node.find('.js-wpml-tf-edit-feedback'),
				originalContent = node.find('.js-wpml-tf-readonly-feedback').text();

			if ( newContentNode.length && originalContent !== newContentNode.val() ) {
				return newContentNode.val();
			}

			return false;
		};

		var getFeedbackReviewerId = function(node) {
			var reviewerNode = node.find('.js-wpml-tf-reviewer');

			if ( reviewerNode.length ) {
				return parseInt(reviewerNode.val());
			}

			return false;
		};

		var getFeedbackMessage = function(node) {
			var newMessage = node.find('.js-wpml-tf-new-message').val();

			if ( newMessage ) {
				return newMessage;
			}

			return false;
		};

		var submitActionOnFeedback = function(id, action) {
			var currentURL = WPML_core.sanitize( window.location.href ),
				params = {
					nonce: WPML_core.sanitize(table.closest('form').find('input[name="nonce"]').val()),
					bulk_action: action,
					bulk_action2: action,
					feedback_ids: [ id ],
				};

			window.location = currentURL + '&' + $.param(params);
		};

		var sendRequest = function(node, data, reload) {
			var spinner  = node.find('.spinner'),
				error_notification = node.find('.js-wpml-tf-feedback-details-error').empty();

			spinner.addClass('is-active');

			data.action      = ajax_action;
			data.nonce       = ajax_nonce;
			data.feedback_id = getFeedbackId(node);

			wp.ajax.send({
				data: data,
				success:  function (response) {
					if (reload) {
						window.location.href = WPML_core.sanitize(window.location.pathname + window.location.search + window.location.hash);
					} else {
						spinner.removeClass('is-active');
						refreshFeedbackRows(data.feedback_id, response);
					}
				},
				error: function (error_message) {
					spinner.removeClass('is-active');
					error_notification.html(error_message).fadeIn();
				}
			});
		};

		var refreshFeedbackRows = function(feedbackId, data) {
			var summary = $.parseHTML(data.summary_row),
				details = $.parseHTML(data.details_row);

			table.find('#wpml-tf-feedback-' + feedbackId).first().replaceWith(summary);
			table.find('#wpml-tf-feedback-details-' + feedbackId).first().replaceWith(details);
		};

		var attachEvents = function() {
			table.on( 'click', '.js-wpml-tf-open-details', function(e) {
				e.preventDefault();
				closeAllFeedbackDetails();
				openFeedbackDetails(getFeedbackId(this));
			}).on( 'click', '.js-wpml-tf-cancel', function(e) {
				e.preventDefault();
				closeAllFeedbackDetails();
			}).on( 'click', '.js-wpml-tf-enable-translator-note', function(e) {
				e.preventDefault();
				var trigger = $(this);
				trigger.siblings('.js-wpml-tf-translator-note').show();
				trigger.remove();
			}).on( 'click', '.js-wpml-tf-enable-edit-feedback', function(e) {
				e.preventDefault();
				var trigger = $(this);
				trigger.siblings('.js-wpml-tf-readonly-feedback').hide();
				trigger.siblings('.js-wpml-tf-edit-feedback').show();
				trigger.remove();
			}).on( 'click', '.js-wpml-tf-send', function(e) {
				e.preventDefault();

				var node = getFeedbackNode(this),
					data = {
						edit_action: 'update_feedback'
					};

				if (getFeedbackContentUpdate(node)) {
					data.feedback_content = getFeedbackContentUpdate(node);
				}

				if (getFeedbackReviewerId(node)) {
					data.feedback_reviewer_id = getFeedbackReviewerId(node);
				}

				if (getFeedbackMessage(node)) {
					data.message_content = getFeedbackMessage(node);
				}

				data.feedback_status = $(this).val();

				if (node.find('.js-wpml-tf-translation-fixed-checkbox:checked').length > 0) {
					data.feedback_status = 'fixed';
				}

				sendRequest(node, data);
			}).on('click', '.js-wpml-tf-refresh-status', function(e) {
				e.preventDefault();
				var node = getFeedbackNode(this),
					data = {
						edit_action: 'update_feedback',
						feedback_status: 'sent_to_ts_api'
					};

				sendRequest(node, data);
			}).on('click', '.js-wpml-tf-translation-fixed', function(e) {
				e.preventDefault();
				var node = getFeedbackNode(this),
					data = {
						edit_action: 'update_feedback',
						feedback_status: 'fixed'
					};

				sendRequest(node, data);
			}).on('click', '.js-wpml-tf-error-details a', function(e) {
				e.preventDefault();
				$(this).siblings('pre').show();
				$(this).remove();
			}).on('click', '.js-wpml-tf-trash', function(e) {
				e.preventDefault();
				submitActionOnFeedback(getFeedbackId(this), 'trash');
			}).on('click', '.js-wpml-tf-untrash', function(e) {
				e.preventDefault();
				submitActionOnFeedback(getFeedbackId(this), 'untrash');
			}).on('click', '.js-wpml-tf-delete', function(e) {
				e.preventDefault();
				submitActionOnFeedback(getFeedbackId(this), 'delete');
			});
		};

		attachEvents();
	});

})(jQuery);