2014-07-30 18:01:07 +00:00
/*global woocommerce_admin_meta_boxes */
2015-06-03 15:32:40 +00:00
jQuery ( function ( $ ) {
2014-07-08 13:14:29 +00:00
// Scroll to first checked category - https://github.com/scribu/wp-category-checklist-tree/blob/d1c3c1f449e1144542efa17dde84a9f52ade1739/category-checklist-tree.php
2015-06-03 15:32:40 +00:00
$ ( function ( ) {
$ ( '[id$="-all"] > ul.categorychecklist' ) . each ( function ( ) {
var $list = $ ( this ) ;
var $firstChecked = $list . find ( ':checked' ) . first ( ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
if ( ! $firstChecked . length ) {
2014-07-08 13:14:29 +00:00
return ;
2015-06-03 15:32:40 +00:00
}
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
var pos _first = $list . find ( 'input' ) . position ( ) . top ;
2014-07-08 13:14:29 +00:00
var pos _checked = $firstChecked . position ( ) . top ;
2015-06-03 15:32:40 +00:00
$list . closest ( '.tabs-panel' ) . scrollTop ( pos _checked - pos _first + 5 ) ;
2014-07-08 13:14:29 +00:00
} ) ;
} ) ;
2016-06-28 17:38:19 +00:00
// Prevent enter submitting post form.
2015-07-08 18:05:52 +00:00
$ ( '#upsell_product_data' ) . bind ( 'keypress' , function ( e ) {
2015-06-03 15:32:40 +00:00
if ( e . keyCode === 13 ) {
return false ;
}
2014-07-08 13:14:29 +00:00
} ) ;
2016-06-28 17:38:19 +00:00
// Type box.
2015-11-06 15:51:17 +00:00
$ ( '.type_box' ) . appendTo ( '#woocommerce-product-data .hndle span' ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
$ ( function ( ) {
2016-06-28 17:38:19 +00:00
// Prevent inputs in meta box headings opening/closing contents.
2015-11-06 15:51:17 +00:00
$ ( '#woocommerce-product-data' ) . find ( '.hndle' ) . unbind ( 'click.postboxes' ) ;
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
$ ( '#woocommerce-product-data' ) . on ( 'click' , '.hndle' , function ( event ) {
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
// If the user clicks on some form input inside the h3 the box should not be toggled.
2015-06-03 15:32:40 +00:00
if ( $ ( event . target ) . filter ( 'input, option, label, select' ) . length ) {
2014-07-08 13:14:29 +00:00
return ;
2015-06-03 15:32:40 +00:00
}
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
$ ( '#woocommerce-product-data' ) . toggleClass ( 'closed' ) ;
2014-07-08 13:14:29 +00:00
} ) ;
} ) ;
2016-06-28 17:38:19 +00:00
// Catalog Visibility.
$ ( '#catalog-visibility' ) . find ( '.edit-catalog-visibility' ) . click ( function ( ) {
2015-09-07 17:51:10 +00:00
if ( $ ( '#catalog-visibility-select' ) . is ( ':hidden' ) ) {
2015-06-03 15:32:40 +00:00
$ ( '#catalog-visibility-select' ) . slideDown ( 'fast' ) ;
$ ( this ) . hide ( ) ;
2014-07-08 13:14:29 +00:00
}
return false ;
} ) ;
2016-06-28 17:38:19 +00:00
$ ( '#catalog-visibility' ) . find ( '.save-post-visibility' ) . click ( function ( ) {
2015-09-07 17:51:10 +00:00
$ ( '#catalog-visibility-select' ) . slideUp ( 'fast' ) ;
$ ( '#catalog-visibility' ) . find ( '.edit-catalog-visibility' ) . show ( ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
var label = $ ( 'input[name=_visibility]:checked' ) . attr ( 'data-label' ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
if ( $ ( 'input[name=_featured]' ) . is ( ':checked' ) ) {
label = label + ', ' + woocommerce _admin _meta _boxes . featured _label ;
$ ( 'input[name=_featured]' ) . attr ( 'checked' , 'checked' ) ;
2014-07-08 13:14:29 +00:00
}
2015-06-03 15:32:40 +00:00
$ ( '#catalog-visibility-display' ) . text ( label ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2016-06-28 17:38:19 +00:00
$ ( '#catalog-visibility' ) . find ( '.cancel-post-visibility' ) . click ( function ( ) {
2015-06-03 15:32:40 +00:00
$ ( '#catalog-visibility-select' ) . slideUp ( 'fast' ) ;
2015-09-07 17:51:10 +00:00
$ ( '#catalog-visibility' ) . find ( '.edit-catalog-visibility' ) . show ( ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
var current _visibility = $ ( '#current_visibility' ) . val ( ) ;
var current _featured = $ ( '#current_featured' ) . val ( ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
$ ( 'input[name=_visibility]' ) . removeAttr ( 'checked' ) ;
$ ( 'input[name=_visibility][value=' + current _visibility + ']' ) . attr ( 'checked' , 'checked' ) ;
2014-07-08 13:14:29 +00:00
2015-07-08 18:05:52 +00:00
var label = $ ( 'input[name=_visibility]:checked' ) . attr ( 'data-label' ) ;
2014-07-08 13:14:29 +00:00
2015-07-08 18:05:52 +00:00
if ( 'yes' === current _featured ) {
2015-06-03 15:32:40 +00:00
label = label + ', ' + woocommerce _admin _meta _boxes . featured _label ;
$ ( 'input[name=_featured]' ) . attr ( 'checked' , 'checked' ) ;
2014-07-08 13:14:29 +00:00
} else {
2015-06-03 15:32:40 +00:00
$ ( 'input[name=_featured]' ) . removeAttr ( 'checked' ) ;
2014-07-08 13:14:29 +00:00
}
2015-06-03 15:32:40 +00:00
$ ( '#catalog-visibility-display' ) . text ( label ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2017-12-14 04:38:03 +00:00
// Product type specific options.
2016-06-28 17:38:19 +00:00
$ ( 'select#product-type' ) . change ( function ( ) {
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
// Get value.
2014-07-30 18:01:07 +00:00
var select _val = $ ( this ) . val ( ) ;
2014-07-08 13:14:29 +00:00
2014-07-30 18:01:07 +00:00
if ( 'variable' === select _val ) {
$ ( 'input#_manage_stock' ) . change ( ) ;
$ ( 'input#_downloadable' ) . prop ( 'checked' , false ) ;
$ ( 'input#_virtual' ) . removeAttr ( 'checked' ) ;
} else if ( 'grouped' === select _val ) {
$ ( 'input#_downloadable' ) . prop ( 'checked' , false ) ;
$ ( 'input#_virtual' ) . removeAttr ( 'checked' ) ;
} else if ( 'external' === select _val ) {
$ ( 'input#_downloadable' ) . prop ( 'checked' , false ) ;
$ ( 'input#_virtual' ) . removeAttr ( 'checked' ) ;
2014-07-08 13:14:29 +00:00
}
show _and _hide _panels ( ) ;
2015-07-08 18:05:52 +00:00
$ ( 'ul.wc-tabs li:visible' ) . eq ( 0 ) . find ( 'a' ) . click ( ) ;
2014-07-08 13:14:29 +00:00
2015-04-13 15:37:22 +00:00
$ ( document . body ) . trigger ( 'woocommerce-product-type-change' , select _val , $ ( this ) ) ;
2014-07-08 13:14:29 +00:00
} ) . change ( ) ;
2015-06-03 15:32:40 +00:00
$ ( 'input#_downloadable, input#_virtual' ) . change ( function ( ) {
2014-07-08 13:14:29 +00:00
show _and _hide _panels ( ) ;
} ) ;
function show _and _hide _panels ( ) {
2015-06-03 15:32:40 +00:00
var product _type = $ ( 'select#product-type' ) . val ( ) ;
2016-03-01 13:08:25 +00:00
var is _virtual = $ ( 'input#_virtual:checked' ) . length ;
var is _downloadable = $ ( 'input#_downloadable:checked' ) . length ;
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
// Hide/Show all with rules.
2014-07-08 13:14:29 +00:00
var hide _classes = '.hide_if_downloadable, .hide_if_virtual' ;
2016-01-07 06:58:08 +00:00
var show _classes = '.show_if_downloadable, .show_if_virtual' ;
2014-07-08 13:14:29 +00:00
$ . each ( woocommerce _admin _meta _boxes . product _types , function ( index , value ) {
hide _classes = hide _classes + ', .hide_if_' + value ;
show _classes = show _classes + ', .show_if_' + value ;
2016-01-07 06:58:08 +00:00
} ) ;
2014-07-08 13:14:29 +00:00
$ ( hide _classes ) . show ( ) ;
$ ( show _classes ) . hide ( ) ;
2016-06-28 17:38:19 +00:00
// Shows rules.
2014-07-08 13:14:29 +00:00
if ( is _downloadable ) {
2015-06-03 15:32:40 +00:00
$ ( '.show_if_downloadable' ) . show ( ) ;
2014-07-08 13:14:29 +00:00
}
if ( is _virtual ) {
2015-06-03 15:32:40 +00:00
$ ( '.show_if_virtual' ) . show ( ) ;
2014-07-08 13:14:29 +00:00
}
2015-06-03 15:32:40 +00:00
$ ( '.show_if_' + product _type ) . show ( ) ;
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
// Hide rules.
2014-07-08 13:14:29 +00:00
if ( is _downloadable ) {
2015-06-03 15:32:40 +00:00
$ ( '.hide_if_downloadable' ) . hide ( ) ;
2014-07-08 13:14:29 +00:00
}
if ( is _virtual ) {
2015-06-03 15:32:40 +00:00
$ ( '.hide_if_virtual' ) . hide ( ) ;
2014-07-08 13:14:29 +00:00
}
2015-06-03 15:32:40 +00:00
$ ( '.hide_if_' + product _type ) . hide ( ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
$ ( 'input#_manage_stock' ) . change ( ) ;
2016-06-28 10:56:45 +00:00
2016-06-28 17:38:19 +00:00
// Hide empty panels/tabs after display.
2016-06-28 10:56:45 +00:00
$ ( '.woocommerce_options_panel' ) . each ( function ( ) {
var $children = $ ( this ) . children ( '.options_group' ) ;
if ( 0 === $children . length ) {
return ;
}
2016-06-28 17:38:19 +00:00
var $invisble = $children . filter ( function ( ) {
return 'none' === $ ( this ) . css ( 'display' ) ;
} ) ;
2016-06-28 10:56:45 +00:00
2016-06-28 17:38:19 +00:00
// Hide panel.
2016-06-28 10:56:45 +00:00
if ( $invisble . length === $children . length ) {
var $id = $ ( this ) . prop ( 'id' ) ;
$ ( '.product_data_tabs' ) . find ( 'li a[href="#' + $id + '"]' ) . parent ( ) . hide ( ) ;
}
2016-06-28 17:38:19 +00:00
} ) ;
2014-07-08 13:14:29 +00:00
}
2016-06-28 17:38:19 +00:00
// Sale price schedule.
2015-06-03 15:32:40 +00:00
$ ( '.sale_price_dates_fields' ) . each ( function ( ) {
var $these _sale _dates = $ ( this ) ;
2014-07-08 13:14:29 +00:00
var sale _schedule _set = false ;
var $wrap = $these _sale _dates . closest ( 'div, table' ) ;
2015-06-03 15:32:40 +00:00
$these _sale _dates . find ( 'input' ) . each ( function ( ) {
2016-06-28 17:38:19 +00:00
if ( '' !== $ ( this ) . val ( ) ) {
2014-07-08 13:14:29 +00:00
sale _schedule _set = true ;
2015-06-03 15:32:40 +00:00
}
2014-07-08 13:14:29 +00:00
} ) ;
if ( sale _schedule _set ) {
2015-06-03 15:32:40 +00:00
$wrap . find ( '.sale_schedule' ) . hide ( ) ;
$wrap . find ( '.sale_price_dates_fields' ) . show ( ) ;
2014-07-08 13:14:29 +00:00
} else {
2015-06-03 15:32:40 +00:00
$wrap . find ( '.sale_schedule' ) . show ( ) ;
$wrap . find ( '.sale_price_dates_fields' ) . hide ( ) ;
2014-07-08 13:14:29 +00:00
}
} ) ;
2015-06-03 15:32:40 +00:00
$ ( '#woocommerce-product-data' ) . on ( 'click' , '.sale_schedule' , function ( ) {
var $wrap = $ ( this ) . closest ( 'div, table' ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
$ ( this ) . hide ( ) ;
$wrap . find ( '.cancel_sale_schedule' ) . show ( ) ;
$wrap . find ( '.sale_price_dates_fields' ) . show ( ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2015-06-03 15:32:40 +00:00
$ ( '#woocommerce-product-data' ) . on ( 'click' , '.cancel_sale_schedule' , function ( ) {
2015-07-08 18:05:52 +00:00
var $wrap = $ ( this ) . closest ( 'div, table' ) ;
2014-07-08 13:14:29 +00:00
2015-07-08 18:05:52 +00:00
$ ( this ) . hide ( ) ;
2015-06-03 15:32:40 +00:00
$wrap . find ( '.sale_schedule' ) . show ( ) ;
$wrap . find ( '.sale_price_dates_fields' ) . hide ( ) ;
$wrap . find ( '.sale_price_dates_fields' ) . find ( 'input' ) . val ( '' ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2016-06-28 17:38:19 +00:00
// File inputs.
2015-06-03 15:32:40 +00:00
$ ( '#woocommerce-product-data' ) . on ( 'click' , '.downloadable_files a.insert' , function ( ) {
$ ( this ) . closest ( '.downloadable_files' ) . find ( 'tbody' ) . append ( $ ( this ) . data ( 'row' ) ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2015-06-03 15:32:40 +00:00
$ ( '#woocommerce-product-data' ) . on ( 'click' , '.downloadable_files a.delete' , function ( ) {
$ ( this ) . closest ( 'tr' ) . remove ( ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2017-12-14 04:38:03 +00:00
// Stock options.
2015-06-03 15:32:40 +00:00
$ ( 'input#_manage_stock' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( 'div.stock_fields' ) . show ( ) ;
2017-11-15 22:10:06 +00:00
$ ( 'p.stock_status_field' ) . hide ( ) ;
2014-07-08 13:14:29 +00:00
} else {
2017-11-20 18:44:50 +00:00
var product _type = $ ( 'select#product-type' ) . val ( ) ;
2015-06-03 15:32:40 +00:00
$ ( 'div.stock_fields' ) . hide ( ) ;
2017-11-21 22:08:17 +00:00
$ ( 'p.stock_status_field:not( .hide_if_' + product _type + ' )' ) . show ( ) ;
2014-07-08 13:14:29 +00:00
}
} ) . change ( ) ;
2017-12-14 04:38:03 +00:00
// Date picker fields.
2017-08-08 11:44:36 +00:00
function date _picker _select ( datepicker ) {
var option = $ ( datepicker ) . next ( ) . is ( '.hasDatepicker' ) ? 'minDate' : 'maxDate' ,
otherDateField = 'minDate' === option ? $ ( datepicker ) . next ( ) : $ ( datepicker ) . prev ( ) ,
date = $ ( datepicker ) . datepicker ( 'getDate' ) ;
$ ( otherDateField ) . datepicker ( 'option' , option , date ) ;
$ ( datepicker ) . change ( ) ;
}
2015-07-07 10:49:12 +00:00
$ ( '.sale_price_dates_fields' ) . each ( function ( ) {
2017-07-13 10:02:00 +00:00
$ ( this ) . find ( 'input' ) . datepicker ( {
2015-07-07 10:49:12 +00:00
defaultDate : '' ,
dateFormat : 'yy-mm-dd' ,
numberOfMonths : 1 ,
showButtonPanel : true ,
2017-07-13 11:15:58 +00:00
onSelect : function ( ) {
2017-08-08 11:44:36 +00:00
date _picker _select ( $ ( this ) ) ;
2015-07-07 10:49:12 +00:00
}
} ) ;
2017-08-10 15:32:24 +00:00
$ ( this ) . find ( 'input' ) . each ( function ( ) { date _picker _select ( $ ( this ) ) ; } ) ;
2014-07-08 13:14:29 +00:00
} ) ;
2017-12-14 04:38:03 +00:00
// Attribute Tables.
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
// Initial order.
var woocommerce _attribute _items = $ ( '.product_attributes' ) . find ( '.woocommerce_attribute' ) . get ( ) ;
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
woocommerce _attribute _items . sort ( function ( a , b ) {
2015-06-03 15:32:40 +00:00
var compA = parseInt ( $ ( a ) . attr ( 'rel' ) , 10 ) ;
var compB = parseInt ( $ ( b ) . attr ( 'rel' ) , 10 ) ;
2016-06-28 17:38:19 +00:00
return ( compA < compB ) ? - 1 : ( compA > compB ) ? 1 : 0 ;
2015-06-03 15:32:40 +00:00
} ) ;
2016-06-28 17:38:19 +00:00
$ ( woocommerce _attribute _items ) . each ( function ( index , el ) {
$ ( '.product_attributes' ) . append ( el ) ;
2015-06-03 15:32:40 +00:00
} ) ;
2014-07-08 13:14:29 +00:00
function attribute _row _indexes ( ) {
2015-06-03 15:32:40 +00:00
$ ( '.product_attributes .woocommerce_attribute' ) . each ( function ( index , el ) {
$ ( '.attribute_position' , el ) . val ( parseInt ( $ ( el ) . index ( '.product_attributes .woocommerce_attribute' ) , 10 ) ) ;
2014-07-08 13:14:29 +00:00
} ) ;
2015-06-03 15:32:40 +00:00
}
2014-07-08 13:14:29 +00:00
2015-06-03 15:32:40 +00:00
$ ( '.product_attributes .woocommerce_attribute' ) . each ( function ( index , el ) {
if ( $ ( el ) . css ( 'display' ) !== 'none' && $ ( el ) . is ( '.taxonomy' ) ) {
$ ( 'select.attribute_taxonomy' ) . find ( 'option[value="' + $ ( el ) . data ( 'taxonomy' ) + '"]' ) . attr ( 'disabled' , 'disabled' ) ;
2014-11-26 11:35:07 +00:00
}
} ) ;
2016-06-28 17:38:19 +00:00
// Add rows.
2015-06-03 15:53:34 +00:00
$ ( 'button.add_attribute' ) . on ( 'click' , function ( ) {
2016-03-01 13:08:25 +00:00
var size = $ ( '.product_attributes .woocommerce_attribute' ) . length ;
2014-12-22 14:16:12 +00:00
var attribute = $ ( 'select.attribute_taxonomy' ) . val ( ) ;
2016-01-20 11:01:18 +00:00
var $wrapper = $ ( this ) . closest ( '#product_attributes' ) ;
var $attributes = $wrapper . find ( '.product_attributes' ) ;
2014-12-22 14:16:12 +00:00
var product _type = $ ( 'select#product-type' ) . val ( ) ;
var data = {
2015-07-08 18:05:52 +00:00
action : 'woocommerce_add_attribute' ,
taxonomy : attribute ,
i : size ,
security : woocommerce _admin _meta _boxes . add _attribute _nonce
2014-12-22 14:16:12 +00:00
} ;
2014-07-08 13:14:29 +00:00
2015-07-08 18:05:52 +00:00
$wrapper . block ( {
message : null ,
overlayCSS : {
background : '#fff' ,
opacity : 0.6
}
} ) ;
2014-07-08 13:14:29 +00:00
2014-12-22 14:16:12 +00:00
$ . post ( woocommerce _admin _meta _boxes . ajax _url , data , function ( response ) {
2016-01-20 11:01:18 +00:00
$attributes . append ( response ) ;
2014-12-22 14:16:12 +00:00
2016-06-28 17:38:19 +00:00
if ( 'variable' !== product _type ) {
2016-01-20 11:01:18 +00:00
$attributes . find ( '.enable_variation' ) . hide ( ) ;
2014-12-22 14:16:12 +00:00
}
2015-04-13 15:37:22 +00:00
$ ( document . body ) . trigger ( 'wc-enhanced-select-init' ) ;
2018-06-29 11:11:33 +00:00
2014-07-08 13:14:29 +00:00
attribute _row _indexes ( ) ;
2018-06-29 11:11:33 +00:00
$attributes . find ( '.woocommerce_attribute' ) . last ( ) . find ( 'h3' ) . click ( ) ;
2014-12-22 14:16:12 +00:00
$wrapper . unblock ( ) ;
2015-01-20 22:12:55 +00:00
2015-04-13 15:37:22 +00:00
$ ( document . body ) . trigger ( 'woocommerce_added_attribute' ) ;
2014-12-22 14:16:12 +00:00
} ) ;
2014-07-08 13:14:29 +00:00
2014-12-22 14:16:12 +00:00
if ( attribute ) {
$ ( 'select.attribute_taxonomy' ) . find ( 'option[value="' + attribute + '"]' ) . attr ( 'disabled' , 'disabled' ) ;
$ ( 'select.attribute_taxonomy' ) . val ( '' ) ;
2014-07-08 13:14:29 +00:00
}
2014-12-22 14:16:12 +00:00
return false ;
2014-07-08 13:14:29 +00:00
} ) ;
2015-07-08 18:05:52 +00:00
$ ( '.product_attributes' ) . on ( 'blur' , 'input.attribute_name' , function ( ) {
2015-06-03 15:53:34 +00:00
$ ( this ) . closest ( '.woocommerce_attribute' ) . find ( 'strong.attribute_name' ) . text ( $ ( this ) . val ( ) ) ;
2014-07-08 13:14:29 +00:00
} ) ;
2015-06-03 15:53:34 +00:00
$ ( '.product_attributes' ) . on ( 'click' , 'button.select_all_attributes' , function ( ) {
$ ( this ) . closest ( 'td' ) . find ( 'select option' ) . attr ( 'selected' , 'selected' ) ;
$ ( this ) . closest ( 'td' ) . find ( 'select' ) . change ( ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2015-06-03 15:53:34 +00:00
$ ( '.product_attributes' ) . on ( 'click' , 'button.select_no_attributes' , function ( ) {
$ ( this ) . closest ( 'td' ) . find ( 'select option' ) . removeAttr ( 'selected' ) ;
2016-06-28 17:38:19 +00:00
$ ( this ) . closest ( 'td' ) . find ( 'select' ) . change ( ) ;
2014-07-08 13:14:29 +00:00
return false ;
} ) ;
2015-07-08 22:08:07 +00:00
$ ( '.product_attributes' ) . on ( 'click' , '.remove_row' , function ( ) {
2015-07-08 17:48:06 +00:00
if ( window . confirm ( woocommerce _admin _meta _boxes . remove _attribute ) ) {
2015-06-03 15:53:34 +00:00
var $parent = $ ( this ) . parent ( ) . parent ( ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:53:34 +00:00
if ( $parent . is ( '.taxonomy' ) ) {
2016-06-28 17:38:19 +00:00
$parent . find ( 'select, input[type=text]' ) . val ( '' ) ;
2014-07-08 13:14:29 +00:00
$parent . hide ( ) ;
2015-06-03 15:53:34 +00:00
$ ( 'select.attribute_taxonomy' ) . find ( 'option[value="' + $parent . data ( 'taxonomy' ) + '"]' ) . removeAttr ( 'disabled' ) ;
2014-07-08 13:14:29 +00:00
} else {
2016-06-28 17:38:19 +00:00
$parent . find ( 'select, input[type=text]' ) . val ( '' ) ;
2014-07-08 13:14:29 +00:00
$parent . hide ( ) ;
attribute _row _indexes ( ) ;
}
}
return false ;
} ) ;
2016-06-28 17:38:19 +00:00
// Attribute ordering.
2015-06-03 15:53:34 +00:00
$ ( '.product_attributes' ) . sortable ( {
items : '.woocommerce_attribute' ,
cursor : 'move' ,
axis : 'y' ,
2014-07-08 13:14:29 +00:00
handle : 'h3' ,
2015-06-03 15:53:34 +00:00
scrollSensitivity : 40 ,
2014-07-08 13:14:29 +00:00
forcePlaceholderSize : true ,
helper : 'clone' ,
opacity : 0.65 ,
placeholder : 'wc-metabox-sortable-placeholder' ,
2015-06-03 15:53:34 +00:00
start : function ( event , ui ) {
ui . item . css ( 'background-color' , '#f6f6f6' ) ;
2014-07-08 13:14:29 +00:00
} ,
2015-06-03 15:53:34 +00:00
stop : function ( event , ui ) {
ui . item . removeAttr ( 'style' ) ;
2014-07-08 13:14:29 +00:00
attribute _row _indexes ( ) ;
}
} ) ;
2016-06-28 17:38:19 +00:00
// Add a new attribute (via ajax).
2015-06-03 15:53:34 +00:00
$ ( '.product_attributes' ) . on ( 'click' , 'button.add_new_attribute' , function ( ) {
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
$ ( '.product_attributes' ) . block ( {
message : null ,
overlayCSS : {
background : '#fff' ,
opacity : 0.6
}
} ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:53:34 +00:00
var $wrapper = $ ( this ) . closest ( '.woocommerce_attribute' ) ;
var attribute = $wrapper . data ( 'taxonomy' ) ;
2015-07-08 17:48:06 +00:00
var new _attribute _name = window . prompt ( woocommerce _admin _meta _boxes . new _attribute _prompt ) ;
2014-07-08 13:14:29 +00:00
if ( new _attribute _name ) {
var data = {
2015-06-03 15:53:34 +00:00
action : 'woocommerce_add_new_attribute' ,
taxonomy : attribute ,
term : new _attribute _name ,
security : woocommerce _admin _meta _boxes . add _attribute _nonce
2014-07-08 13:14:29 +00:00
} ;
$ . post ( woocommerce _admin _meta _boxes . ajax _url , data , function ( response ) {
if ( response . error ) {
2016-06-28 17:38:19 +00:00
// Error.
2015-07-08 17:48:06 +00:00
window . alert ( response . error ) ;
2014-07-08 13:14:29 +00:00
} else if ( response . slug ) {
2016-06-28 17:38:19 +00:00
// Success.
2017-03-23 11:13:32 +00:00
$wrapper . find ( 'select.attribute_values' ) . append ( '<option value="' + response . term _id + '" selected="selected">' + response . name + '</option>' ) ;
2015-06-03 15:53:34 +00:00
$wrapper . find ( 'select.attribute_values' ) . change ( ) ;
2014-07-08 13:14:29 +00:00
}
2015-06-03 15:53:34 +00:00
$ ( '.product_attributes' ) . unblock ( ) ;
2014-07-08 13:14:29 +00:00
} ) ;
} else {
2015-06-03 15:53:34 +00:00
$ ( '.product_attributes' ) . unblock ( ) ;
2014-07-08 13:14:29 +00:00
}
return false ;
} ) ;
2016-06-28 17:38:19 +00:00
// Save attributes and update variations.
2015-06-03 15:53:34 +00:00
$ ( '.save_attributes' ) . on ( 'click' , function ( ) {
2014-07-08 13:14:29 +00:00
2017-11-17 15:43:14 +00:00
$ ( '.product_attributes' ) . block ( {
2015-07-08 17:48:06 +00:00
message : null ,
overlayCSS : {
background : '#fff' ,
opacity : 0.6
}
} ) ;
2018-09-26 10:25:34 +00:00
var original _data = $ ( '.product_attributes' ) . find ( 'input, select, textarea' ) ;
2014-07-08 13:14:29 +00:00
var data = {
2017-01-05 16:54:47 +00:00
post _id : woocommerce _admin _meta _boxes . post _id ,
product _type : $ ( '#product-type' ) . val ( ) ,
2018-09-26 10:25:34 +00:00
data : original _data . serialize ( ) ,
2017-01-05 16:54:47 +00:00
action : 'woocommerce_save_attributes' ,
security : woocommerce _admin _meta _boxes . save _attributes _nonce
2014-07-08 13:14:29 +00:00
} ;
2017-11-17 15:43:14 +00:00
$ . post ( woocommerce _admin _meta _boxes . ajax _url , data , function ( response ) {
if ( response . error ) {
// Error.
window . alert ( response . error ) ;
} else if ( response . data ) {
// Success.
$ ( '.product_attributes' ) . html ( response . data . html ) ;
$ ( '.product_attributes' ) . unblock ( ) ;
2015-09-04 13:00:39 +00:00
2018-09-26 10:25:34 +00:00
// Make sure the dropdown is not disabled for empty value attributes.
var nr _elements = original _data . length / 6 ;
for ( i = 0 ; i < nr _elements ; i ++ ) {
if ( typeof ( original _data ) != "undefined" && original _data [ i * 6 + 2 ] . value === "" ) {
$ ( 'select.attribute_taxonomy' ) . find ( 'option[value="' + original _data [ i * 6 ] . value + '"]' ) . removeAttr ( 'disabled' ) ;
}
}
2017-11-17 15:43:14 +00:00
// Reload variations panel.
2018-06-27 15:34:28 +00:00
var this _page = window . location . toString ( ) ;
this _page = this _page . replace ( 'post-new.php?' , 'post.php?post=' + woocommerce _admin _meta _boxes . post _id + '&action=edit&' ) ;
$ ( '#variable_product_options' ) . load ( this _page + ' #variable_product_options_inner' , function ( ) {
$ ( '#variable_product_options' ) . trigger ( 'reload' ) ;
} ) ;
2017-11-17 15:43:14 +00:00
}
2014-07-08 13:14:29 +00:00
} ) ;
2014-07-30 18:01:07 +00:00
} ) ;
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
// Uploading files.
2014-07-08 13:14:29 +00:00
var downloadable _file _frame ;
var file _path _field ;
2016-06-28 17:38:19 +00:00
$ ( document . body ) . on ( 'click' , '.upload_file_button' , function ( event ) {
2015-07-08 17:48:06 +00:00
var $el = $ ( this ) ;
2014-07-08 13:14:29 +00:00
2015-06-03 15:53:34 +00:00
file _path _field = $el . closest ( 'tr' ) . find ( 'td.file_url input' ) ;
2014-07-08 13:14:29 +00:00
event . preventDefault ( ) ;
// If the media frame already exists, reopen it.
if ( downloadable _file _frame ) {
downloadable _file _frame . open ( ) ;
return ;
}
var downloadable _file _states = [
// Main states.
new wp . media . controller . Library ( {
library : wp . media . query ( ) ,
multiple : true ,
title : $el . data ( 'choose' ) ,
priority : 20 ,
2015-06-03 15:53:34 +00:00
filterable : 'uploaded'
2014-07-08 13:14:29 +00:00
} )
] ;
// Create the media frame.
downloadable _file _frame = wp . media . frames . downloadable _file = wp . media ( {
// Set the title of the modal.
title : $el . data ( 'choose' ) ,
library : {
type : ''
} ,
button : {
2015-06-03 15:53:34 +00:00
text : $el . data ( 'update' )
2014-07-08 13:14:29 +00:00
} ,
multiple : true ,
2015-06-03 15:53:34 +00:00
states : downloadable _file _states
2014-07-08 13:14:29 +00:00
} ) ;
// When an image is selected, run a callback.
downloadable _file _frame . on ( 'select' , function ( ) {
var file _path = '' ;
2015-06-03 15:53:34 +00:00
var selection = downloadable _file _frame . state ( ) . get ( 'selection' ) ;
2014-07-08 13:14:29 +00:00
selection . map ( function ( attachment ) {
attachment = attachment . toJSON ( ) ;
2015-06-03 15:53:34 +00:00
if ( attachment . url ) {
file _path = attachment . url ;
}
} ) ;
2014-07-08 13:14:29 +00:00
2015-12-14 12:27:03 +00:00
file _path _field . val ( file _path ) . change ( ) ;
2014-07-08 13:14:29 +00:00
} ) ;
2016-06-28 17:38:19 +00:00
// Set post to 0 and set our custom type.
2014-07-08 13:14:29 +00:00
downloadable _file _frame . on ( 'ready' , function ( ) {
downloadable _file _frame . uploader . options . uploader . params = {
type : 'downloadable_product'
} ;
} ) ;
// Finally, open the modal.
downloadable _file _frame . open ( ) ;
} ) ;
2016-06-28 17:38:19 +00:00
// Download ordering.
$ ( '.downloadable_files tbody' ) . sortable ( {
2015-06-03 15:53:34 +00:00
items : 'tr' ,
cursor : 'move' ,
axis : 'y' ,
2014-07-08 13:14:29 +00:00
handle : 'td.sort' ,
2015-06-03 15:53:34 +00:00
scrollSensitivity : 40 ,
2014-07-08 13:14:29 +00:00
forcePlaceholderSize : true ,
helper : 'clone' ,
2015-06-03 15:53:34 +00:00
opacity : 0.65
2014-07-08 13:14:29 +00:00
} ) ;
2016-06-28 17:38:19 +00:00
// Product gallery file uploads.
2014-07-08 13:14:29 +00:00
var product _gallery _frame ;
2015-06-03 15:53:34 +00:00
var $image _gallery _ids = $ ( '#product_image_gallery' ) ;
2015-09-07 17:51:10 +00:00
var $product _images = $ ( '#product_images_container' ) . find ( 'ul.product_images' ) ;
2014-07-08 13:14:29 +00:00
2016-06-28 17:38:19 +00:00
$ ( '.add_product_images' ) . on ( 'click' , 'a' , function ( event ) {
2015-06-03 15:53:34 +00:00
var $el = $ ( this ) ;
2014-07-08 13:14:29 +00:00
event . preventDefault ( ) ;
// If the media frame already exists, reopen it.
if ( product _gallery _frame ) {
product _gallery _frame . open ( ) ;
return ;
}
// Create the media frame.
product _gallery _frame = wp . media . frames . product _gallery = wp . media ( {
// Set the title of the modal.
2015-06-03 15:53:34 +00:00
title : $el . data ( 'choose' ) ,
2014-07-08 13:14:29 +00:00
button : {
2015-06-03 15:53:34 +00:00
text : $el . data ( 'update' )
2014-07-08 13:14:29 +00:00
} ,
2015-06-03 15:53:34 +00:00
states : [
2014-07-08 13:14:29 +00:00
new wp . media . controller . Library ( {
2015-06-03 15:53:34 +00:00
title : $el . data ( 'choose' ) ,
filterable : 'all' ,
multiple : true
2014-07-08 13:14:29 +00:00
} )
]
} ) ;
// When an image is selected, run a callback.
product _gallery _frame . on ( 'select' , function ( ) {
2015-06-03 15:53:34 +00:00
var selection = product _gallery _frame . state ( ) . get ( 'selection' ) ;
2015-07-27 16:57:21 +00:00
var attachment _ids = $image _gallery _ids . val ( ) ;
2014-07-08 13:14:29 +00:00
selection . map ( function ( attachment ) {
attachment = attachment . toJSON ( ) ;
if ( attachment . id ) {
2015-07-27 16:57:21 +00:00
attachment _ids = attachment _ids ? attachment _ids + ',' + attachment . id : attachment . id ;
2015-09-07 10:13:00 +00:00
var attachment _image = attachment . sizes && attachment . sizes . thumbnail ? attachment . sizes . thumbnail . url : attachment . url ;
2015-02-19 14:15:28 +00:00
2015-07-08 18:05:52 +00:00
$product _images . append ( '<li class="image" data-attachment_id="' + attachment . id + '"><img src="' + attachment _image + '" /><ul class="actions"><li><a href="#" class="delete" title="' + $el . data ( 'delete' ) + '">' + $el . data ( 'text' ) + '</a></li></ul></li>' ) ;
2014-07-08 13:14:29 +00:00
}
} ) ;
$image _gallery _ids . val ( attachment _ids ) ;
} ) ;
// Finally, open the modal.
product _gallery _frame . open ( ) ;
} ) ;
2016-06-28 17:38:19 +00:00
// Image ordering.
2014-07-08 13:14:29 +00:00
$product _images . sortable ( {
items : 'li.image' ,
cursor : 'move' ,
2015-06-03 15:53:34 +00:00
scrollSensitivity : 40 ,
2014-07-08 13:14:29 +00:00
forcePlaceholderSize : true ,
forceHelperSize : false ,
helper : 'clone' ,
opacity : 0.65 ,
placeholder : 'wc-metabox-sortable-placeholder' ,
2015-06-03 15:53:34 +00:00
start : function ( event , ui ) {
ui . item . css ( 'background-color' , '#f6f6f6' ) ;
2014-07-08 13:14:29 +00:00
} ,
2015-06-03 15:53:34 +00:00
stop : function ( event , ui ) {
ui . item . removeAttr ( 'style' ) ;
2014-07-08 13:14:29 +00:00
} ,
2015-06-03 15:53:34 +00:00
update : function ( ) {
2014-07-08 13:14:29 +00:00
var attachment _ids = '' ;
2015-09-07 17:51:10 +00:00
$ ( '#product_images_container' ) . find ( 'ul li.image' ) . css ( 'cursor' , 'default' ) . each ( function ( ) {
2016-06-28 17:38:19 +00:00
var attachment _id = $ ( this ) . attr ( 'data-attachment_id' ) ;
2014-07-08 13:14:29 +00:00
attachment _ids = attachment _ids + attachment _id + ',' ;
} ) ;
$image _gallery _ids . val ( attachment _ids ) ;
}
} ) ;
2016-06-28 17:38:19 +00:00
// Remove images.
2015-06-03 15:53:34 +00:00
$ ( '#product_images_container' ) . on ( 'click' , 'a.delete' , function ( ) {
$ ( this ) . closest ( 'li.image' ) . remove ( ) ;
2014-07-08 13:14:29 +00:00
var attachment _ids = '' ;
2015-09-07 17:51:10 +00:00
$ ( '#product_images_container' ) . find ( 'ul li.image' ) . css ( 'cursor' , 'default' ) . each ( function ( ) {
2016-06-28 17:38:19 +00:00
var attachment _id = $ ( this ) . attr ( 'data-attachment_id' ) ;
2014-07-08 13:14:29 +00:00
attachment _ids = attachment _ids + attachment _id + ',' ;
} ) ;
$image _gallery _ids . val ( attachment _ids ) ;
2016-06-28 17:38:19 +00:00
// Remove any lingering tooltips.
2015-01-23 15:45:57 +00:00
$ ( '#tiptip_holder' ) . removeAttr ( 'style' ) ;
$ ( '#tiptip_arrow' ) . removeAttr ( 'style' ) ;
2014-07-08 13:14:29 +00:00
return false ;
2014-07-30 18:01:07 +00:00
} ) ;
} ) ;