woocommerce/assets/js/admin/meta-boxes-product-variatio...

1081 lines
33 KiB
JavaScript
Raw Normal View History

/* global wp, woocommerce_admin_meta_boxes_variations, woocommerce_admin, accounting */
2017-10-31 19:27:57 +00:00
jQuery( function( $ ) {
2017-10-13 12:23:26 +00:00
'use strict';
2017-10-31 19:27:57 +00:00
/**
* Variations actions
*/
var wc_meta_boxes_product_variations_actions = {
2013-08-06 10:41:20 +00:00
/**
* Initialize variations actions
*/
init: function() {
$( '#variable_product_options' )
.on( 'change', 'input.variable_is_downloadable', this.variable_is_downloadable )
.on( 'change', 'input.variable_is_virtual', this.variable_is_virtual )
.on( 'change', 'input.variable_manage_stock', this.variable_manage_stock )
.on( 'click', 'button.notice-dismiss', this.notice_dismiss )
.on( 'click', 'h3 .sort', this.set_menu_order )
.on( 'reload', this.reload );
2013-08-06 10:41:20 +00:00
$( 'input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock' ).change();
2015-07-07 01:50:35 +00:00
$( '#woocommerce-product-data' ).on( 'woocommerce_variations_loaded', this.variations_loaded );
$( document.body ).on( 'woocommerce_variations_added', this.variation_added );
},
/**
* Reload UI
*
* @param {Object} event
* @param {Int} qty
*/
reload: function() {
wc_meta_boxes_product_variations_ajax.load_variations( 1 );
wc_meta_boxes_product_variations_pagenav.set_paginav( 0 );
},
/**
* Check if variation is downloadable and show/hide elements
*/
variable_is_downloadable: function() {
$( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_downloadable' ).hide();
if ( $( this ).is( ':checked' ) ) {
$( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_downloadable' ).show();
}
},
/**
* Check if variation is virtual and show/hide elements
*/
variable_is_virtual: function() {
$( this ).closest( '.woocommerce_variation' ).find( '.hide_if_variation_virtual' ).show();
if ( $( this ).is( ':checked' ) ) {
$( this ).closest( '.woocommerce_variation' ).find( '.hide_if_variation_virtual' ).hide();
}
},
2013-08-06 10:41:20 +00:00
/**
* Check if variation manage stock and show/hide elements
*/
variable_manage_stock: function() {
$( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_manage_stock' ).hide();
2019-03-18 12:56:49 +00:00
$( this ).closest( '.woocommerce_variation' ).find( '.variable_stock_status' ).show();
if ( $( this ).is( ':checked' ) ) {
$( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_manage_stock' ).show();
2019-03-18 12:56:49 +00:00
$( this ).closest( '.woocommerce_variation' ).find( '.variable_stock_status' ).hide();
}
// Parent level.
if ( $( 'input#_manage_stock:checked' ).length ) {
$( this ).closest( '.woocommerce_variation' ).find( '.variable_stock_status' ).hide();
}
2015-07-07 01:50:35 +00:00
},
/**
* Notice dismiss
*/
notice_dismiss: function() {
$( this ).closest( 'div.notice' ).remove();
},
2015-07-07 01:50:35 +00:00
/**
* Run actions when variations is loaded
*
* @param {Object} event
* @param {Int} needsUpdate
2015-07-07 01:50:35 +00:00
*/
variations_loaded: function( event, needsUpdate ) {
needsUpdate = needsUpdate || false;
var wrapper = $( '#woocommerce-product-data' );
if ( ! needsUpdate ) {
// Show/hide downloadable, virtual and stock fields
$( 'input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock', wrapper ).change();
2015-07-08 18:05:52 +00:00
// Open sale schedule fields when have some sale price date
$( '.woocommerce_variation', wrapper ).each( function( index, el ) {
var $el = $( el ),
date_from = $( '.sale_price_dates_from', $el ).val(),
date_to = $( '.sale_price_dates_to', $el ).val();
if ( '' !== date_from || '' !== date_to ) {
$( 'a.sale_schedule', $el ).click();
}
});
2015-07-08 18:05:52 +00:00
// Remove variation-needs-update classes
$( '.woocommerce_variations .variation-needs-update', wrapper ).removeClass( 'variation-needs-update' );
2015-07-08 18:05:52 +00:00
// Disable cancel and save buttons
$( 'button.cancel-variation-changes, button.save-variation-changes', wrapper ).attr( 'disabled', 'disabled' );
}
2015-07-08 18:05:52 +00:00
// Init TipTip
$( '#tiptip_holder' ).removeAttr( 'style' );
$( '#tiptip_arrow' ).removeAttr( 'style' );
$( '.woocommerce_variations .tips, .woocommerce_variations .help_tip, .woocommerce_variations .woocommerce-help-tip', wrapper )
.tipTip({
'attribute': 'data-tip',
'fadeIn': 50,
'fadeOut': 50,
'delay': 200
});
// Datepicker fields
2017-02-22 10:31:20 +00:00
$( '.sale_price_dates_fields', wrapper ).find( 'input' ).datepicker({
defaultDate: '',
dateFormat: 'yy-mm-dd',
numberOfMonths: 1,
showButtonPanel: true,
onSelect: function() {
2017-02-22 10:31:20 +00:00
var option = $( this ).is( '.sale_price_dates_from' ) ? 'minDate' : 'maxDate',
dates = $( this ).closest( '.sale_price_dates_fields' ).find( 'input' ),
date = $( this ).datepicker( 'getDate' );
2017-02-22 10:31:20 +00:00
dates.not( this ).datepicker( 'option', option, date );
$( this ).change();
}
2015-07-08 18:05:52 +00:00
});
2015-07-08 18:31:39 +00:00
// Allow sorting
$( '.woocommerce_variations', wrapper ).sortable({
items: '.woocommerce_variation',
cursor: 'move',
axis: 'y',
handle: '.sort',
scrollSensitivity: 40,
forcePlaceholderSize: true,
helper: 'clone',
opacity: 0.65,
stop: function() {
wc_meta_boxes_product_variations_actions.variation_row_indexes();
}
});
2015-07-08 18:31:39 +00:00
$( document.body ).trigger( 'wc-enhanced-select-init' );
},
/**
* Run actions when added a variation
*
* @param {Object} event
* @param {Int} qty
*/
variation_added: function( event, qty ) {
if ( 1 === qty ) {
wc_meta_boxes_product_variations_actions.variations_loaded( null, true );
}
},
/**
* Lets the user manually input menu order to move items around pages
*/
set_menu_order: function( event ) {
event.preventDefault();
var $menu_order = $( this ).closest( '.woocommerce_variation' ).find('.variation_menu_order');
var value = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_enter_menu_order, $menu_order.val() );
if ( value != null ) {
// Set value, save changes and reload view
$menu_order.val( parseInt( value, 10 ) ).change();
wc_meta_boxes_product_variations_ajax.save_variations();
}
},
/**
* Set menu order
*/
variation_row_indexes: function() {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
current_page = parseInt( wrapper.attr( 'data-page' ), 10 ),
offset = parseInt( ( current_page - 1 ) * woocommerce_admin_meta_boxes_variations.variations_per_page, 10 );
$( '.woocommerce_variations .woocommerce_variation' ).each( function ( index, el ) {
$( '.variation_menu_order', el )
.val( parseInt( $( el )
.index( '.woocommerce_variations .woocommerce_variation' ), 10 ) + 1 + offset )
.change();
});
}
};
/**
* Variations media actions
*/
var wc_meta_boxes_product_variations_media = {
/**
* wp.media frame object
*
* @type {Object}
*/
variable_image_frame: null,
/**
* Variation image ID
*
* @type {Int}
*/
setting_variation_image_id: null,
2013-08-06 10:41:20 +00:00
/**
* Variation image object
*
* @type {Object}
*/
setting_variation_image: null,
2013-08-06 10:41:20 +00:00
/**
* wp.media post ID
*
* @type {Int}
*/
wp_media_post_id: wp.media.model.settings.post.id,
2013-08-06 10:41:20 +00:00
/**
* Initialize media actions
*/
init: function() {
$( '#variable_product_options' ).on( 'click', '.upload_image_button', this.add_image );
$( 'a.add_media' ).on( 'click', this.restore_wp_media_post_id );
},
2013-08-06 10:41:20 +00:00
/**
* Added new image
*
* @param {Object} event
*/
add_image: function( event ) {
var $button = $( this ),
post_id = $button.attr( 'rel' ),
$parent = $button.closest( '.upload_image' );
2013-08-06 10:41:20 +00:00
wc_meta_boxes_product_variations_media.setting_variation_image = $parent;
wc_meta_boxes_product_variations_media.setting_variation_image_id = post_id;
2013-08-06 10:41:20 +00:00
event.preventDefault();
2013-08-06 10:41:20 +00:00
if ( $button.is( '.remove' ) ) {
2013-08-06 10:41:20 +00:00
$( '.upload_image_id', wc_meta_boxes_product_variations_media.setting_variation_image ).val( '' ).change();
wc_meta_boxes_product_variations_media.setting_variation_image.find( 'img' ).eq( 0 )
.attr( 'src', woocommerce_admin_meta_boxes_variations.woocommerce_placeholder_img_src );
wc_meta_boxes_product_variations_media.setting_variation_image.find( '.upload_image_button' ).removeClass( 'remove' );
2013-08-06 10:41:20 +00:00
} else {
// If the media frame already exists, reopen it.
if ( wc_meta_boxes_product_variations_media.variable_image_frame ) {
wc_meta_boxes_product_variations_media.variable_image_frame.uploader.uploader
.param( 'post_id', wc_meta_boxes_product_variations_media.setting_variation_image_id );
wc_meta_boxes_product_variations_media.variable_image_frame.open();
return;
} else {
wp.media.model.settings.post.id = wc_meta_boxes_product_variations_media.setting_variation_image_id;
}
2013-08-06 10:41:20 +00:00
// Create the media frame.
wc_meta_boxes_product_variations_media.variable_image_frame = wp.media.frames.variable_image = wp.media({
// Set the title of the modal.
title: woocommerce_admin_meta_boxes_variations.i18n_choose_image,
button: {
text: woocommerce_admin_meta_boxes_variations.i18n_set_image
},
states: [
new wp.media.controller.Library({
title: woocommerce_admin_meta_boxes_variations.i18n_choose_image,
filterable: 'all'
})
]
});
2013-08-06 10:41:20 +00:00
// When an image is selected, run a callback.
wc_meta_boxes_product_variations_media.variable_image_frame.on( 'select', function () {
2013-08-06 10:41:20 +00:00
var attachment = wc_meta_boxes_product_variations_media.variable_image_frame.state()
.get( 'selection' ).first().toJSON(),
url = attachment.sizes && attachment.sizes.thumbnail ? attachment.sizes.thumbnail.url : attachment.url;
2013-08-06 10:41:20 +00:00
$( '.upload_image_id', wc_meta_boxes_product_variations_media.setting_variation_image ).val( attachment.id ).change();
wc_meta_boxes_product_variations_media.setting_variation_image.find( '.upload_image_button' ).addClass( 'remove' );
wc_meta_boxes_product_variations_media.setting_variation_image.find( 'img' ).eq( 0 ).attr( 'src', url );
2013-08-06 10:41:20 +00:00
wp.media.model.settings.post.id = wc_meta_boxes_product_variations_media.wp_media_post_id;
});
2013-08-06 10:41:20 +00:00
// Finally, open the modal.
wc_meta_boxes_product_variations_media.variable_image_frame.open();
}
},
/**
* Restore wp.media post ID.
*/
restore_wp_media_post_id: function() {
wp.media.model.settings.post.id = wc_meta_boxes_product_variations_media.wp_media_post_id;
}
};
2013-08-06 10:41:20 +00:00
/**
2015-07-06 01:00:38 +00:00
* Product variations metabox ajax methods
*/
2015-07-06 01:00:38 +00:00
var wc_meta_boxes_product_variations_ajax = {
/**
* Initialize variations ajax methods
*/
init: function() {
$( 'li.variations_tab a' ).on( 'click', this.initial_load );
$( '#variable_product_options' )
.on( 'click', 'button.save-variation-changes', this.save_variations )
.on( 'click', 'button.cancel-variation-changes', this.cancel_variations )
.on( 'click', '.remove_variation', this.remove_variation )
.on( 'click','.downloadable_files a.delete', this.input_changed );
2015-07-09 01:50:32 +00:00
$( document.body )
.on( 'change', '#variable_product_options .woocommerce_variations :input', this.input_changed )
.on( 'change', '.variations-defaults select', this.defaults_changed );
var postForm = $( 'form#post' );
postForm.on( 'submit', this.save_on_submit );
$( 'input:submit', postForm ).bind( 'click keypress', function() {
postForm.data( 'callerid', this.id );
});
2015-07-07 01:50:35 +00:00
2015-07-10 23:04:16 +00:00
$( '.wc-metaboxes-wrapper' ).on( 'click', 'a.do_variation_action', this.do_variation_action );
},
/**
* Check if have some changes before leave the page
*
* @return {Bool}
*/
check_for_changes: function() {
var need_update = $( '#variable_product_options' ).find( '.woocommerce_variations .variation-needs-update' );
if ( 0 < need_update.length ) {
if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_edited_variations ) ) {
wc_meta_boxes_product_variations_ajax.save_changes();
} else {
need_update.removeClass( 'variation-needs-update' );
return false;
}
}
return true;
},
/**
* Block edit screen
*/
block: function() {
$( '#woocommerce-product-data' ).block({
message: null,
overlayCSS: {
background: '#fff',
opacity: 0.6
}
});
},
/**
* Unblock edit screen
*/
unblock: function() {
$( '#woocommerce-product-data' ).unblock();
},
/**
* Initial load variations
*
* @return {Bool}
*/
initial_load: function() {
if ( 0 === $( '#variable_product_options' ).find( '.woocommerce_variations .woocommerce_variation' ).length ) {
wc_meta_boxes_product_variations_pagenav.go_to_page();
}
},
/**
* Load variations via Ajax
*
* @param {Int} page (default: 1)
* @param {Int} per_page (default: 10)
*/
load_variations: function( page, per_page ) {
page = page || 1;
2015-07-06 01:00:38 +00:00
per_page = per_page || woocommerce_admin_meta_boxes_variations.variations_per_page;
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' );
wc_meta_boxes_product_variations_ajax.block();
$.ajax({
url: woocommerce_admin_meta_boxes_variations.ajax_url,
data: {
action: 'woocommerce_load_variations',
security: woocommerce_admin_meta_boxes_variations.load_variations_nonce,
product_id: woocommerce_admin_meta_boxes_variations.post_id,
attributes: wrapper.data( 'attributes' ),
page: page,
per_page: per_page
},
type: 'POST',
success: function( response ) {
wrapper.empty().append( response ).attr( 'data-page', page );
2015-07-06 01:00:38 +00:00
2015-07-07 01:50:35 +00:00
$( '#woocommerce-product-data' ).trigger( 'woocommerce_variations_loaded' );
wc_meta_boxes_product_variations_ajax.unblock();
}
});
},
2015-07-08 16:55:29 +00:00
/**
* Ger variations fields and convert to object
*
* @param {Object} fields
2015-07-08 16:55:29 +00:00
*
* @return {Object}
2015-07-08 16:55:29 +00:00
*/
get_variations_fields: function( fields ) {
var data = $( ':input', fields ).serializeJSON();
2020-01-31 08:23:28 +00:00
2015-07-09 01:50:32 +00:00
$( '.variations-defaults select' ).each( function( index, element ) {
var select = $( element );
data[ select.attr( 'name' ) ] = select.val();
});
2015-07-08 16:55:29 +00:00
return data;
},
/**
* Save variations changes
*
* @param {Function} callback Called once saving is complete
*/
save_changes: function( callback ) {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
2015-07-08 16:55:29 +00:00
need_update = $( '.variation-needs-update', wrapper ),
data = {};
// Save only with products need update.
if ( 0 < need_update.length ) {
wc_meta_boxes_product_variations_ajax.block();
Save product type before saving variations WooCommerce prior to WC 2.4 saved the product type before any variations were saved because WC_Meta_Box_Product_Data::save_variations() was called by WC_Meta_Box_Product_Data::save(). However, in WC 2.4 the variations are saved independently of other data about the containing variable product, including product type. Because the product type hasn't been saved yet, extensions that need to save their own variation level meta data can't know when saving variations if the product is of the type they want to act on. They also can't check `$_POST` to find out when saving variations, because 'product-type' isn't passed to that as it's variable level meta data, not variation level meta data. This patch passes the product type along with the variation level meta data when saving variations. It then uses that to save the product type if the variable product has not yet been saved (and therefore the product type has never been stored, which means calling get_product() would instantiate a 'simple' product, as that is the default product type). This can lead to fatal errors if callbacks expect the product type to be variable and attempt to call methods that only exist on those product types, like variable_product_sync(). It will also update the product type if it was previously saved but has since changed. This prevents fatal errors like that mentioned above but caused by switching from one product type, like a simple product, to another, like a variable product.
2015-07-31 18:42:21 +00:00
data = wc_meta_boxes_product_variations_ajax.get_variations_fields( need_update );
data.action = 'woocommerce_save_variations';
data.security = woocommerce_admin_meta_boxes_variations.save_variations_nonce;
data.product_id = woocommerce_admin_meta_boxes_variations.post_id;
data['product-type'] = $( '#product-type' ).val();
2015-07-08 16:55:29 +00:00
$.ajax({
url: woocommerce_admin_meta_boxes_variations.ajax_url,
2015-07-08 16:55:29 +00:00
data: data,
type: 'POST',
2015-07-27 17:16:52 +00:00
success: function( response ) {
// Allow change page, delete and add new variations
need_update.removeClass( 'variation-needs-update' );
$( 'button.cancel-variation-changes, button.save-variation-changes' ).attr( 'disabled', 'disabled' );
$( '#woocommerce-product-data' ).trigger( 'woocommerce_variations_saved' );
if ( typeof callback === 'function' ) {
2015-07-27 17:16:52 +00:00
callback( response );
}
wc_meta_boxes_product_variations_ajax.unblock();
}
});
}
},
/**
* Save variations
*
* @return {Bool}
*/
save_variations: function() {
$( '#variable_product_options' ).trigger( 'woocommerce_variations_save_variations_button' );
2015-07-27 17:16:52 +00:00
wc_meta_boxes_product_variations_ajax.save_changes( function( error ) {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
2015-07-27 17:16:52 +00:00
current = wrapper.attr( 'data-page' );
$( '#variable_product_options' ).find( '#woocommerce_errors' ).remove();
2015-07-27 17:16:52 +00:00
if ( error ) {
wrapper.before( error );
}
$( '.variations-defaults select' ).each( function() {
$( this ).attr( 'data-current', $( this ).val() );
});
wc_meta_boxes_product_variations_pagenav.go_to_page( current );
});
return false;
},
/**
* Save on post form submit
*/
save_on_submit: function( e ) {
var need_update = $( '#variable_product_options' ).find( '.woocommerce_variations .variation-needs-update' );
if ( 0 < need_update.length ) {
e.preventDefault();
$( '#variable_product_options' ).trigger( 'woocommerce_variations_save_variations_on_submit' );
wc_meta_boxes_product_variations_ajax.save_changes( wc_meta_boxes_product_variations_ajax.save_on_submit_done );
}
},
/**
* After saved, continue with form submission
*/
save_on_submit_done: function() {
var postForm = $( 'form#post' ),
callerid = postForm.data( 'callerid' );
if ( 'publish' === callerid ) {
postForm.append('<input type="hidden" name="publish" value="1" />').submit();
} else {
postForm.append('<input type="hidden" name="save-post" value="1" />').submit();
}
},
/**
* Discart changes.
*
* @return {Bool}
*/
cancel_variations: function() {
var current = parseInt( $( '#variable_product_options' ).find( '.woocommerce_variations' ).attr( 'data-page' ), 10 );
$( '#variable_product_options' ).find( '.woocommerce_variations .variation-needs-update' )
.removeClass( 'variation-needs-update' );
$( '.variations-defaults select' ).each( function() {
$( this ).val( $( this ).attr( 'data-current' ) );
});
wc_meta_boxes_product_variations_pagenav.go_to_page( current );
return false;
},
/**
* Add variation
*
* @return {Bool}
*/
add_variation: function() {
wc_meta_boxes_product_variations_ajax.block();
var data = {
action: 'woocommerce_add_variation',
post_id: woocommerce_admin_meta_boxes_variations.post_id,
2016-03-01 13:08:25 +00:00
loop: $( '.woocommerce_variation' ).length,
security: woocommerce_admin_meta_boxes_variations.add_variation_nonce
};
$.post( woocommerce_admin_meta_boxes_variations.ajax_url, data, function( response ) {
var variation = $( response );
variation.addClass( 'variation-needs-update' );
$( '.woocommerce-notice-invalid-variation' ).remove();
$( '#variable_product_options' ).find( '.woocommerce_variations' ).prepend( variation );
$( 'button.cancel-variation-changes, button.save-variation-changes' ).removeAttr( 'disabled' );
$( '#variable_product_options' ).trigger( 'woocommerce_variations_added', 1 );
wc_meta_boxes_product_variations_ajax.unblock();
});
return false;
},
/**
* Remove variation
*
* @return {Bool}
*/
remove_variation: function() {
wc_meta_boxes_product_variations_ajax.check_for_changes();
if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_remove_variation ) ) {
var variation = $( this ).attr( 'rel' ),
variation_ids = [],
data = {
action: 'woocommerce_remove_variations'
};
wc_meta_boxes_product_variations_ajax.block();
if ( 0 < variation ) {
variation_ids.push( variation );
data.variation_ids = variation_ids;
data.security = woocommerce_admin_meta_boxes_variations.delete_variations_nonce;
$.post( woocommerce_admin_meta_boxes_variations.ajax_url, data, function() {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
current_page = parseInt( wrapper.attr( 'data-page' ), 10 ),
total_pages = Math.ceil( (
parseInt( wrapper.attr( 'data-total' ), 10 ) - 1
) / woocommerce_admin_meta_boxes_variations.variations_per_page ),
page = 1;
$( '#woocommerce-product-data' ).trigger( 'woocommerce_variations_removed' );
if ( current_page === total_pages || current_page <= total_pages ) {
page = current_page;
} else if ( current_page > total_pages && 0 !== total_pages ) {
page = total_pages;
}
wc_meta_boxes_product_variations_pagenav.go_to_page( page, -1 );
});
} else {
wc_meta_boxes_product_variations_ajax.unblock();
}
}
return false;
},
/**
* Link all variations (or at least try :p)
*
* @return {Bool}
*/
link_all_variations: function() {
wc_meta_boxes_product_variations_ajax.check_for_changes();
if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_link_all_variations ) ) {
wc_meta_boxes_product_variations_ajax.block();
var data = {
action: 'woocommerce_link_all_variations',
post_id: woocommerce_admin_meta_boxes_variations.post_id,
security: woocommerce_admin_meta_boxes_variations.link_variation_nonce
};
$.post( woocommerce_admin_meta_boxes_variations.ajax_url, data, function( response ) {
var count = parseInt( response, 10 );
if ( 1 === count ) {
window.alert( count + ' ' + woocommerce_admin_meta_boxes_variations.i18n_variation_added );
} else if ( 0 === count || count > 1 ) {
window.alert( count + ' ' + woocommerce_admin_meta_boxes_variations.i18n_variations_added );
} else {
window.alert( woocommerce_admin_meta_boxes_variations.i18n_no_variations_added );
}
if ( count > 0 ) {
wc_meta_boxes_product_variations_pagenav.go_to_page( 1, count );
$( '#variable_product_options' ).trigger( 'woocommerce_variations_added', count );
} else {
wc_meta_boxes_product_variations_ajax.unblock();
}
});
}
return false;
},
/**
* Add new class when have changes in some input
*/
input_changed: function() {
2015-07-09 01:50:32 +00:00
$( this )
.closest( '.woocommerce_variation' )
.addClass( 'variation-needs-update' );
$( 'button.cancel-variation-changes, button.save-variation-changes' ).removeAttr( 'disabled' );
$( '#variable_product_options' ).trigger( 'woocommerce_variations_input_changed' );
2015-07-09 01:50:32 +00:00
},
/**
* Added new .variation-needs-update class when defaults is changed
*/
defaults_changed: function() {
$( this )
.closest( '#variable_product_options' )
.find( '.woocommerce_variation:first' )
.addClass( 'variation-needs-update' );
$( 'button.cancel-variation-changes, button.save-variation-changes' ).removeAttr( 'disabled' );
$( '#variable_product_options' ).trigger( 'woocommerce_variations_defaults_changed' );
2015-07-07 01:50:35 +00:00
},
/**
2015-07-10 23:04:16 +00:00
* Actions
2015-07-07 01:50:35 +00:00
*/
2015-07-10 23:04:16 +00:00
do_variation_action: function() {
var do_variation_action = $( 'select.variation_actions' ).val(),
2015-07-07 01:50:35 +00:00
data = {},
changes = 0,
2015-07-07 01:50:35 +00:00
value;
2015-07-10 23:04:16 +00:00
switch ( do_variation_action ) {
case 'add_variation' :
wc_meta_boxes_product_variations_ajax.add_variation();
return;
case 'link_all_variations' :
wc_meta_boxes_product_variations_ajax.link_all_variations();
return;
2015-07-07 01:50:35 +00:00
case 'delete_all' :
if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_delete_all_variations ) ) {
if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_last_warning ) ) {
data.allowed = true;
changes = parseInt( $( '#variable_product_options' ).find( '.woocommerce_variations' )
.attr( 'data-total' ), 10 ) * -1;
2015-07-07 01:50:35 +00:00
}
}
break;
2015-07-07 01:50:35 +00:00
case 'variable_regular_price_increase' :
case 'variable_regular_price_decrease' :
case 'variable_sale_price_increase' :
case 'variable_sale_price_decrease' :
value = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_enter_a_value_fixed_or_percent );
if ( value != null ) {
if ( value.indexOf( '%' ) >= 0 ) {
data.value = accounting.unformat( value.replace( /\%/, '' ), woocommerce_admin.mon_decimal_point ) + '%';
} else {
data.value = accounting.unformat( value, woocommerce_admin.mon_decimal_point );
}
} else {
return;
}
break;
2015-07-07 01:50:35 +00:00
case 'variable_regular_price' :
case 'variable_sale_price' :
case 'variable_stock' :
case 'variable_weight' :
case 'variable_length' :
case 'variable_width' :
case 'variable_height' :
case 'variable_download_limit' :
case 'variable_download_expiry' :
value = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_enter_a_value );
if ( value != null ) {
data.value = value;
} else {
return;
2015-07-07 01:50:35 +00:00
}
break;
2015-07-07 01:50:35 +00:00
case 'variable_sale_schedule' :
data.date_from = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_start );
data.date_to = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_end );
if ( null === data.date_from ) {
data.date_from = false;
}
if ( null === data.date_to ) {
data.date_to = false;
}
if ( false === data.date_to && false === data.date_from ) {
return;
}
break;
2015-07-07 01:50:35 +00:00
default :
2015-07-10 23:04:16 +00:00
$( 'select.variation_actions' ).trigger( do_variation_action );
data = $( 'select.variation_actions' ).triggerHandler( do_variation_action + '_ajax_data', data );
break;
}
if ( 'delete_all' === do_variation_action && data.allowed ) {
$( '#variable_product_options' ).find( '.variation-needs-update' ).removeClass( 'variation-needs-update' );
} else {
wc_meta_boxes_product_variations_ajax.check_for_changes();
2015-07-07 01:50:35 +00:00
}
wc_meta_boxes_product_variations_ajax.block();
$.ajax({
url: woocommerce_admin_meta_boxes_variations.ajax_url,
data: {
action: 'woocommerce_bulk_edit_variations',
security: woocommerce_admin_meta_boxes_variations.bulk_edit_variations_nonce,
product_id: woocommerce_admin_meta_boxes_variations.post_id,
product_type: $( '#product-type' ).val(),
bulk_action: do_variation_action,
data: data
2015-07-07 01:50:35 +00:00
},
type: 'POST',
success: function() {
wc_meta_boxes_product_variations_pagenav.go_to_page( 1, changes );
2015-07-07 01:50:35 +00:00
}
});
}
};
2015-07-06 01:00:38 +00:00
/**
* Product variations pagenav
*/
var wc_meta_boxes_product_variations_pagenav = {
/**
* Initialize products variations meta box
*/
init: function() {
$( document.body )
.on( 'woocommerce_variations_added', this.update_single_quantity )
.on( 'change', '.variations-pagenav .page-selector', this.page_selector )
.on( 'click', '.variations-pagenav .first-page', this.first_page )
.on( 'click', '.variations-pagenav .prev-page', this.prev_page )
.on( 'click', '.variations-pagenav .next-page', this.next_page )
.on( 'click', '.variations-pagenav .last-page', this.last_page );
},
/**
* Set variations count
*
* @param {Int} qty
*
* @return {Int}
*/
update_variations_count: function( qty ) {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
total = parseInt( wrapper.attr( 'data-total' ), 10 ) + qty,
displaying_num = $( '.variations-pagenav .displaying-num' );
// Set the new total of variations
wrapper.attr( 'data-total', total );
if ( 1 === total ) {
displaying_num.text( woocommerce_admin_meta_boxes_variations.i18n_variation_count_single.replace( '%qty%', total ) );
} else {
displaying_num.text( woocommerce_admin_meta_boxes_variations.i18n_variation_count_plural.replace( '%qty%', total ) );
}
return total;
},
/**
* Update variations quantity when add a new variation
*
* @param {Object} event
* @param {Int} qty
*/
update_single_quantity: function( event, qty ) {
if ( 1 === qty ) {
var page_nav = $( '.variations-pagenav' );
wc_meta_boxes_product_variations_pagenav.update_variations_count( qty );
if ( page_nav.is( ':hidden' ) ) {
2015-07-10 23:04:16 +00:00
$( 'option, optgroup', '.variation_actions' ).show();
$( '.variation_actions' ).val( 'add_variation' );
$( '#variable_product_options' ).find( '.toolbar' ).show();
page_nav.show();
$( '.pagination-links', page_nav ).hide();
}
}
},
/**
* Set the pagenav fields
*
* @param {Int} qty
*/
set_paginav: function( qty ) {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
new_qty = wc_meta_boxes_product_variations_pagenav.update_variations_count( qty ),
toolbar = $( '#variable_product_options' ).find( '.toolbar' ),
2015-07-10 23:04:16 +00:00
variation_action = $( '.variation_actions' ),
page_nav = $( '.variations-pagenav' ),
displaying_links = $( '.pagination-links', page_nav ),
total_pages = Math.ceil( new_qty / woocommerce_admin_meta_boxes_variations.variations_per_page ),
options = '';
// Set the new total of pages
wrapper.attr( 'data-total_pages', total_pages );
$( '.total-pages', page_nav ).text( total_pages );
// Set the new pagenav options
for ( var i = 1; i <= total_pages; i++ ) {
options += '<option value="' + i + '">' + i + '</option>';
}
$( '.page-selector', page_nav ).empty().html( options );
// Show/hide pagenav
if ( 0 === new_qty ) {
toolbar.not( '.toolbar-top, .toolbar-buttons' ).hide();
page_nav.hide();
2015-07-10 23:04:16 +00:00
$( 'option, optgroup', variation_action ).hide();
$( '.variation_actions' ).val( 'add_variation' );
$( 'option[data-global="true"]', variation_action ).show();
} else {
toolbar.show();
page_nav.show();
2015-07-10 23:04:16 +00:00
$( 'option, optgroup', variation_action ).show();
$( '.variation_actions' ).val( 'add_variation' );
// Show/hide links
if ( 1 === total_pages ) {
displaying_links.hide();
} else {
displaying_links.show();
}
}
2015-07-06 01:00:38 +00:00
},
/**
* Check button if enabled and if don't have changes
*
* @return {Bool}
*/
check_is_enabled: function( current ) {
return ! $( current ).hasClass( 'disabled' );
},
/**
* Change "disabled" class on pagenav
*/
change_classes: function( selected, total ) {
var first_page = $( '.variations-pagenav .first-page' ),
prev_page = $( '.variations-pagenav .prev-page' ),
next_page = $( '.variations-pagenav .next-page' ),
last_page = $( '.variations-pagenav .last-page' );
2015-07-06 01:00:38 +00:00
if ( 1 === selected ) {
first_page.addClass( 'disabled' );
prev_page.addClass( 'disabled' );
2015-07-06 01:00:38 +00:00
} else {
first_page.removeClass( 'disabled' );
prev_page.removeClass( 'disabled' );
2015-07-06 01:00:38 +00:00
}
if ( total === selected ) {
next_page.addClass( 'disabled' );
last_page.addClass( 'disabled' );
2015-07-06 01:00:38 +00:00
} else {
next_page.removeClass( 'disabled' );
last_page.removeClass( 'disabled' );
2015-07-06 01:00:38 +00:00
}
},
/**
* Set page
*/
set_page: function( page ) {
$( '.variations-pagenav .page-selector' ).val( page ).first().change();
},
/**
* Navigate on variations pages
*
* @param {Int} page
* @param {Int} qty
*/
go_to_page: function( page, qty ) {
page = page || 1;
qty = qty || 0;
wc_meta_boxes_product_variations_pagenav.set_paginav( qty );
wc_meta_boxes_product_variations_pagenav.set_page( page );
},
/**
* Paginav pagination selector
*/
page_selector: function() {
var selected = parseInt( $( this ).val(), 10 ),
wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' );
2015-07-06 01:00:38 +00:00
$( '.variations-pagenav .page-selector' ).val( selected );
wc_meta_boxes_product_variations_ajax.check_for_changes();
wc_meta_boxes_product_variations_pagenav.change_classes( selected, parseInt( wrapper.attr( 'data-total_pages' ), 10 ) );
wc_meta_boxes_product_variations_ajax.load_variations( selected );
2015-07-06 01:00:38 +00:00
},
/**
* Go to first page
*
* @return {Bool}
2015-07-06 01:00:38 +00:00
*/
first_page: function() {
if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) {
wc_meta_boxes_product_variations_pagenav.set_page( 1 );
2015-07-06 01:00:38 +00:00
}
return false;
},
/**
* Go to previous page
*
* @return {Bool}
2015-07-06 01:00:38 +00:00
*/
prev_page: function() {
if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
2015-07-07 23:34:54 +00:00
prev_page = parseInt( wrapper.attr( 'data-page' ), 10 ) - 1,
2015-07-06 01:00:38 +00:00
new_page = ( 0 < prev_page ) ? prev_page : 1;
wc_meta_boxes_product_variations_pagenav.set_page( new_page );
2015-07-06 01:00:38 +00:00
}
return false;
},
/**
* Go to next page
*
* @return {Bool}
2015-07-06 01:00:38 +00:00
*/
next_page: function() {
if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) {
var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ),
2015-07-07 23:34:54 +00:00
total_pages = parseInt( wrapper.attr( 'data-total_pages' ), 10 ),
next_page = parseInt( wrapper.attr( 'data-page' ), 10 ) + 1,
2015-07-06 01:00:38 +00:00
new_page = ( total_pages >= next_page ) ? next_page : total_pages;
wc_meta_boxes_product_variations_pagenav.set_page( new_page );
2015-07-06 01:00:38 +00:00
}
return false;
},
/**
* Go to last page
*
* @return {Bool}
2015-07-06 01:00:38 +00:00
*/
last_page: function() {
if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) {
var last_page = $( '#variable_product_options' ).find( '.woocommerce_variations' ).attr( 'data-total_pages' );
2015-07-06 01:00:38 +00:00
wc_meta_boxes_product_variations_pagenav.set_page( last_page );
2015-07-06 01:00:38 +00:00
}
return false;
}
};
wc_meta_boxes_product_variations_actions.init();
wc_meta_boxes_product_variations_media.init();
2015-07-06 01:00:38 +00:00
wc_meta_boxes_product_variations_ajax.init();
wc_meta_boxes_product_variations_pagenav.init();
2017-10-31 19:27:57 +00:00
});