laipower/wp-content/plugins/easy-digital-downloads/assets/js/admin/orders/order-overview/_refund.js

280 lines
8.7 KiB
JavaScript

import { NumberFormat } from '@easy-digital-downloads/currency';
const number = new NumberFormat();
/* global eddAdminOrderOverview */
// Loads the modal when the refund button is clicked.
$(document.body).on('click', '.edd-refund-order', function (e) {
e.preventDefault();
var link = $(this),
postData = {
action : 'edd_generate_refund_form',
order_id: $('input[name="edd_payment_id"]').val(),
};
$.ajax({
type : 'POST',
data : postData,
url : ajaxurl,
success: function success(data) {
let modal_content = '';
if (data.success) {
modal_content = data.html;
} else {
modal_content = data.message;
}
$('#edd-refund-order-dialog').dialog({
position: { my: 'top center', at: 'center center-25%' },
width : '75%',
modal : true,
resizable: false,
draggable: false,
classes: {
'ui-dialog': 'edd-dialog',
},
closeText: eddAdminOrderOverview.i18n.closeText,
open: function( event, ui ) {
$(this).html( modal_content );
},
close: function( event, ui ) {
$( this ).html( '' );
if ( $( this ).hasClass( 'did-refund' ) ) {
location.reload();
}
}
});
return false;
}
}).fail(function (data) {
$('#edd-refund-order-dialog').dialog({
position: { my: 'top center', at: 'center center-25%' },
width : '75%',
modal : true,
resizable: false,
draggable: false
}).html(data.message);
return false;
});
});
$( document.body ).on( 'click', '.ui-widget-overlay', function ( e ) {
$( '#edd-refund-order-dialog' ).dialog( 'close' );
} );
/**
* Listen for the bulk actions checkbox, since WP doesn't trigger a change on sub-items.
*/
$( document.body ).on( 'change', '#edd-refund-order-dialog #cb-select-all-1', function () {
const itemCheckboxes = $( '.edd-order-item-refund-checkbox' );
const isChecked = $( this ).prop( 'checked' );
itemCheckboxes.each( function() {
$( this ).prop( 'checked', isChecked ).trigger( 'change' );
} );
} );
/**
* Listen for individual checkbox changes.
* When it does, trigger a quantity change.
*/
$( document.body ).on( 'change', '.edd-order-item-refund-checkbox', function () {
const parent = $( this ).parent().parent();
const quantityField = parent.find( '.edd-order-item-refund-quantity' );
if ( quantityField.length ) {
if ( $( this ).prop( 'checked' ) ) {
// Triggering a change on the quantity field handles enabling the inputs.
quantityField.trigger( 'change' );
} else {
// Disable inputs and recalculate total.
parent.find( '.edd-order-item-refund-input' ).prop( 'disabled', true );
recalculateRefundTotal();
}
}
} );
/**
* Handles quantity changes, which includes items in the refund.
*/
$( document.body ).on( 'change', '#edd-refund-order-dialog .edd-order-item-refund-input', function () {
let parent = $( this ).closest( '.refunditem' ),
quantityField = parent.find( '.edd-order-item-refund-quantity' ),
quantity = parseInt( quantityField.val() );
if ( quantity > 0 ) {
parent.addClass( 'refunded' );
} else {
parent.removeClass( 'refunded' );
}
// Only auto calculate subtotal / tax if we've adjusted the quantity.
if ( $( this ).hasClass( 'edd-order-item-refund-quantity' ) ) {
// Enable/disable amount fields.
parent.find( '.edd-order-item-refund-input:not(.edd-order-item-refund-quantity)' ).prop( 'disabled', quantity === 0 );
if ( quantity > 0 ) {
quantityField.prop( 'disabled', false );
}
let subtotalField = parent.find( '.edd-order-item-refund-subtotal' ),
taxField = parent.find( '.edd-order-item-refund-tax' ),
originalSubtotal = number.unformat( subtotalField.data( 'original' ) ),
originalTax = taxField.length ? number.unformat( taxField.data( 'original' ) ) : 0.00,
originalQuantity = parseInt( quantityField.data( 'max' ) ),
calculatedSubtotal = ( originalSubtotal / originalQuantity ) * quantity,
calculatedTax = taxField.length ? ( originalTax / originalQuantity ) * quantity : 0.00;
// Make sure totals don't go over maximums.
if ( calculatedSubtotal > parseFloat( subtotalField.data( 'max' ) ) ) {
calculatedSubtotal = subtotalField.data( 'max' );
}
if ( taxField.length && calculatedTax > parseFloat( taxField.data( 'max' ) ) ) {
calculatedTax = taxField.data( 'max' );
}
// Guess the subtotal and tax for the selected quantity.
subtotalField.val( number.format( calculatedSubtotal ) );
if ( taxField.length ) {
taxField.val( number.format( calculatedTax ) );
}
}
recalculateRefundTotal();
} );
/**
* Calculates all the final refund values.
*/
function recalculateRefundTotal() {
let newSubtotal = 0,
newTax = 0,
newTotal = 0,
canRefund = false,
allInputBoxes = $( '#edd-refund-order-dialog .edd-order-item-refund-input' ),
allReadOnly = $( '#edd-refund-order-dialog .edd-order-item-refund-input.readonly' );
// Set a readonly while we recalculate, to avoid race conditions in the browser.
allInputBoxes.prop( 'readonly', true );
// Loop over all order items.
$( '#edd-refund-order-dialog .edd-order-item-refund-quantity' ).each( function() {
const thisItemQuantity = parseInt( $( this ).val() );
if ( ! thisItemQuantity ) {
return;
}
const thisItemParent = $( this ).closest( '.refunditem' );
const thisItemSelected = thisItemParent.find( '.edd-order-item-refund-checkbox' ).prop( 'checked' );
if ( ! thisItemSelected ) {
thisItemParent.removeClass( 'refunded' );
return;
}
// Values for this item.
let thisItemTax = 0.00;
let thisItemSubtotal = number.unformat( thisItemParent.find( '.edd-order-item-refund-subtotal' ).val() );
if ( thisItemParent.find( '.edd-order-item-refund-tax' ).length ) {
thisItemTax = number.unformat( thisItemParent.find( '.edd-order-item-refund-tax' ).val() );
}
let thisItemTotal = thisItemSubtotal + thisItemTax;
thisItemParent.find( '.column-total span' ).text( number.format( thisItemTotal ) );
// Negate amounts if working with credit.
if ( thisItemParent.data( 'credit' ) ) {
thisItemSubtotal = thisItemSubtotal * -1;
thisItemTax = thisItemTax * -1;
thisItemTotal = thisItemTotal * -1;
}
// Only include order items in the subtotal.
if ( thisItemParent.data( 'orderItem' ) ) {
newSubtotal += thisItemSubtotal;
}
newTax += thisItemTax;
newTotal += thisItemTotal;
} );
if ( parseFloat( newTotal ) > 0 ) {
canRefund = true;
}
$( '#edd-refund-submit-subtotal-amount' ).text( number.format( newSubtotal ) );
$( '#edd-refund-submit-tax-amount' ).text( number.format( newTax ) );
$( '#edd-refund-submit-total-amount' ).text( number.format( newTotal ) );
$( '#edd-submit-refund-submit' ).attr( 'disabled', ! canRefund );
// Remove the readonly.
allInputBoxes.prop( 'readonly', false );
allReadOnly.prop( 'readonly', true );
}
/**
* Process the refund form after the button is clicked.
*/
$(document.body).on( 'click', '#edd-submit-refund-submit', function(e) {
e.preventDefault();
$('.edd-submit-refund-message').removeClass('success').removeClass('fail');
$( this ).removeClass( 'button-primary' ).attr( 'disabled', true ).addClass( 'updating-message' );
$('#edd-submit-refund-status').hide();
const refundForm = $( '#edd-submit-refund-form' );
const refundData = refundForm.serialize();
var postData = {
action: 'edd_process_refund_form',
data: refundData,
order_id: $('input[name="edd_payment_id"]').val()
};
$.ajax({
type : 'POST',
data : postData,
url : ajaxurl,
success: function success(response) {
const message_target = $('.edd-submit-refund-message'),
url_target = $('.edd-submit-refund-url');
if ( response.success ) {
message_target.text(response.data.message).addClass('success');
url_target.attr( 'href', response.data.refund_url ).show();
$( '#edd-submit-refund-status' ).show();
url_target.focus();
$( '#edd-refund-order-dialog' ).addClass( 'did-refund' );
} else {
message_target.html(response.data).addClass('fail');
url_target.hide();
$('#edd-submit-refund-status').show();
$( '#edd-submit-refund-submit' ).attr( 'disabled', false ).removeClass( 'updating-message' ).addClass( 'button-primary' );
}
}
} ).fail( function ( data ) {
const message_target = $('.edd-submit-refund-message'),
url_target = $('.edd-submit-refund-url'),
json = data.responseJSON;
message_target.text( json.data ).addClass( 'fail' );
url_target.hide();
$( '#edd-submit-refund-status' ).show();
$( '#edd-submit-refund-submit' ).attr( 'disabled', false ).removeClass( 'updating-message' ).addClass( 'button-primary' );
return false;
});
});
// Initialize WP toggle behavior for the modal.
$( document.body ).on( 'click', '.refund-items .toggle-row', function () {
$( this ).closest( 'tr' ).toggleClass( 'is-expanded' );
} );