/* global jQuery, wpc_postboxes, ajaxurl, wdp_data */ jQuery(document).ready(function ($) { var bulk_adjustment = (function () { var $available_types = wdp_data.bulk_rule; var $rule = null; var init_events = function ($container, $rule) { $rule.find('.wdp_bulk_adjustment_remove').click(function () { destroy($container, $rule); }); $container.find('.bulk-adjustment-type').on('change', function () { update_selectors($container, $rule); }); $container.find('.bulk-qty_based-type').on('change', function () { update_selectors($container, $rule); }); make_select2_products($container.find('[data-field="autocomplete"]')); }; var destroy = function ($container, $rule) { $rule.find('.wdp-btn-add-bulk').show(); $container.hide(); flushInputs($container); $container.find('.wdp-range').remove(); $container.find('.wdp-ranges-empty').show(); // Unconditionally hide all sortable handlers $rule.find(".wdp-drag-handle").hide(); // Hide label with checkbox in role discount $rule.find('.dont-apply-bulk-if-roles-matched-check').hide(); }; var update_selectors = function ($container, $rule) { var $adj_type = $container.find('.bulk-adjustment-type').val(); var $qty_based = $container.find('.bulk-qty_based-type').val(); var $discount_type = $container.find('.bulk-discount-type').val(); var $available_qty_based = get_available_qty_based_types($adj_type); if (!check_qty_based_availability($adj_type, $qty_based)) { $qty_based = Object.keys(get_available_qty_based_types($adj_type))[0]; } $container.find('.bulk-qty_based-type').html(""); $.each($available_qty_based, function ($key, $item) { $container.find('.bulk-qty_based-type').append(make_option($key, $item.label)) }); var $available_discount_types = get_available_discount_types($adj_type, $qty_based); if (!check_discount_type_availability($adj_type, $qty_based, $discount_type)) { $discount_type = Object.keys(get_available_discount_types($adj_type, $qty_based))[0]; } $container.find('.bulk-discount-type').html(""); $.each($available_discount_types, function ($key, $label) { $container.find('.bulk-discount-type').append(make_option($key, $label)) }); $container.find('.bulk-qty_based-type').val($qty_based); $container.find('.bulk-discount-type').val($discount_type); if ($qty_based === 'product_selected_categories') { $container.find('.bulk-selected_categories-type').show(); } else { $container.find('.bulk-selected_categories-type').hide(); } }; var make_option = function ($value, $label, $classes) { if (typeof $classes === 'undefined') { $classes = []; } var option = $(""); option.val($value).text($label); $classes.forEach(function ($class) { option.addClass($class); }); return option; }; var get_available_qty_based_types = function ($adj_type) { return $available_types[$adj_type] }; var check_qty_based_availability = function ($adj_type, $qty_based) { return typeof $available_types[$adj_type][$qty_based] !== 'undefined'; }; var get_available_discount_types = function ($adj_type, $qty_based) { return $available_types[$adj_type][$qty_based].items; }; var check_discount_type_availability = function ($adj_type, $qty_based, $discount_type) { return typeof $available_types[$adj_type][$qty_based].items[$discount_type] !== 'undefined'; }; return { // init: function ($available_types) { // this.$available_types = $available_types; // }, add: function ($container, $data) { $rule = $container.closest('.postbox'); $container.show(); $rule.find('.wdp-btn-add-bulk').hide(); // selector categories $container.find('.bulk-selected_categories-type').hide(); $rule.find('.bulk-adjustment-type').find('option:first-child').prop("selected", "selected"); $rule.find('.bulk-qty_based-type').find('option:first-child').prop("selected", "selected"); $rule.find('.bulk-discount-type').find('option:first-child').prop("selected", "selected"); init_events($container, $rule); update_selectors($container, $rule); if ($data) { $container.find('.bulk-adjustment-type').val($data.type); if ($data.discount_type) { $container.find('.bulk-discount-type').val($data.discount_type); } if ($data.qty_based) { $container.find('.bulk-qty_based-type').val($data.qty_based); } if ($data.selected_categories) { var html = ''; $.each($data.selected_categories, function (i, id) { var title = wdp_data.titles['product_categories'] && wdp_data.titles['product_categories'][id] ? wdp_data.titles['product_categories'][id] : id; html += ''; }); $container.find('.bulk-selected_categories-type select').html(html); } if ($data.ranges) { var $range_button = $container.find('.add-range'); $.each($data.ranges, function (index, item) { add_range($range_button, item); }); } if ($data.table_message) { $container.find('.bulk-table-message').val($data.table_message); } } update_selectors($container, $rule); } } }); // make rule blocks collapsable and sortable wpc_postboxes.add_postbox_toggles( $('#rules-container') ); // update priority field on reorder wpc_postboxes._on_reorder = function() { // make aray of objects [ { id, priority }, ... ] var data = $('#rules-container .postbox').map(function(i, el) { $('.rule-priority', el).val( i ); return { id: $('.rule-id', el).val(), priority: wdp_data.paged && wdp_data.options.rules_per_page ? (wdp_data.paged - 1) * wdp_data.options.rules_per_page + i : i, } }).toArray(); $.post( ajaxurl, { action: 'wdp_ajax', method: 'reorder_rules', items: data }, $.noop, 'json' ); }; // load saved rules if (wdp_data.rules) { var promises = []; wdp_data.rules.forEach( function ( data ) { promises.push( add_rule( data ) ); } ); Promise.all( promises ).then( function ( responses ) { $( "#rules-container" ).removeClass( "loading" ); $( '#no-rules' ).removeClass( "loading" ); $( '.add-rule' ).removeClass( "loading" ); $( "#progress_div" ).hide(); } ).catch( function ( reason ) { console.log( reason ); } ); if ( wdp_data.selected_rule && wdp_data.selected_rule > 0 ) { var $rule = $('#rules-container .rule-id[value="' + wdp_data.selected_rule + '"]').closest('.postbox'); $rule.removeClass('closed'); $('html, body').animate({ scrollTop: $rule.position().top }, 500); } } // create new rule when click 'Add rule' button $('.add-rule').click(function (e) { e.preventDefault(); add_rule(); }); /* Template functions */ function add_rule(data) { window.wdpPreloadRule = true; var template_options = { c: 0, p: (data && data.priority) ? data.priority : get_last_priority(), type: (data && data.type) ? data.type : 'package', }; // prepare template var rule_template = get_template('rule', template_options); var new_rule = $(rule_template); addEventHandlersToRule(new_rule); // add new rule to rules list $('#rules-container').append(new_rule); // for exists rule, apply data if (data) { if (data.additional.disabled_by_plugin) { new_rule.addClass('disabled-by-plugin'); new_rule.find('.wdp-disabled-automatically-prefix').show(); } else { new_rule.find('.wdp-disabled-automatically-prefix').hide(); } setRuleData(new_rule, data); } else { new_rule.find('.wdp-disabled-automatically-prefix').hide(); new_rule.removeClass('closed'); new_rule.addClass('dirty'); } $('#no-rules').hide(); window.wdpPreloadRule = false; } function addEventHandlersToRule(new_rule) { // on change rule title new_rule.find('.wdp-title').on('change input', function () { var $postbox = $(this).closest('.postbox'); var value = $(this).val(); $postbox.find('[data-wdp-title]').text(value); }); // listeners for buttons new_rule.find('.wdp_remove_rule').on('click', function () { if (!confirm(wdp_data.labels.confirm_remove_rule)) return; var $rule = $(this).closest('.postbox'); $rule.addClass('removing'); var rule_id = $rule.find('.rule-id').val(); if(!rule_id) { $rule.remove(); return; } $.post( ajaxurl, { action: 'wdp_ajax', method: 'remove_rule', rule_id: rule_id }, function () { $rule.remove(); }, 'json' ); }); new_rule.find('.wdp_copy_rule').on('click', function () { var temp = new_rule.serialize(); temp = deparam(temp); var cloned_data = temp.rule; cloned_data.id = ''; cloned_data.priority = get_last_priority(); add_rule(cloned_data); }); // ** Buttons in rule // Add condition new_rule.find('.add-condition, .wdp-btn-add-condition').click(function () { add_condition($(this)); }); // Add limit new_rule.find('.add-limit, .wdp-btn-add-limit').click(function () { add_limit($(this)); }); // Add range (bulk) new_rule.find('.add-range').click(function () { add_range($(this)); }); // Add product filter new_rule.find('.add-product-filter, .wdp-btn-add-product-filter').click(function () { add_product_filter(new_rule.find('.wdp-filter-block')); }); // Add product filter for 'Add product adjustment' block new_rule.find('.wdp-btn-add-product-adjustment').click(function () { add_product_adjustment(new_rule.find('.wdp-product-adjustments')); }); // Add bulk adjustment new_rule.find('.wdp-btn-add-bulk').click(function () { add_bulk_adjustment(new_rule.find('.wdp-bulk-adjustments')); // Hide or show all sortable handlers depends on role discounts visibility if ( new_rule.find( ".wdp-role-discounts" ).is( ":hidden" ) ) { new_rule.find( ".wdp-drag-handle" ).hide(); } else { new_rule.find( ".wdp-drag-handle" ).show(); } // Show that label with checkbox when role discount on first position if (new_rule.find( ".wdp-sortable-blocks > div:first-child .dont-apply-bulk-if-roles-matched-check" ).length) { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).show(); } else { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).hide(); } }); // Add cart adjustment new_rule.find('.add-cart-adjustment, .wdp-btn-add-cart-adjustment').click(function () { add_cart_adjustment($(this)); }); // Add cart role discount new_rule.find('.add-role-discount, .wdp-btn-add-role-discount').click(function () { add_role_discount($(this)); if ( new_rule.find( ".wdp-bulk-adjustments" ).is( ":hidden" ) ) { // Hide or show all sortable handlers depends on bulk adjustments visibility new_rule.find( ".wdp-drag-handle" ).hide(); new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).hide(); } else { new_rule.find( ".wdp-drag-handle" ).show(); // Show that label with checkbox only when bulk adjustments is not empty and role discounts on first position if (new_rule.find( ".wdp-sortable-blocks > div:first-child .dont-apply-bulk-if-roles-matched-check" ).length) { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).show(); } else { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).hide(); } } }); // Add product filter for 'Get products' block new_rule.find('.add-filter-get-product, .wdp-btn-add-getproduct').click(function () { add_get_products(new_rule.find('.wdp-get-products')); }); // on save rule new_rule.find('.save-rule').click(function (e) { e.preventDefault(); var $form = $(this).closest('form'); $form.attr('disabled', true); $.post( ajaxurl, $form.serialize(), function (response) { $form.attr('disabled', false); var id = response.data; $form.find('.rule-id').val(id); $form.removeClass('dirty'); $form.removeClass('disabled-by-plugin'); $form.find('.wdp-disabled-automatically-prefix').hide(); }, 'json' ); return false; }); // init flipswitch new_rule.find('[data-role="flipswitch"]').flipswitch(); // update title on some changes new_rule.find('.wdp-adjustments-repeat, .cart-adjustment-type').change(function () { update_rule_title(new_rule); }); new_rule.find('.wdp-field-enabled select').change(function () { update_rule_title(new_rule); if (!window.wdpPreloadRule) { new_rule.find('.save-rule').click(); } }); new_rule.find('.wdp-field-enabled').click(function(event) { event.preventDefault(); return false; }); update_rule_title(new_rule); // make lists inside rule sortable make_sortable(new_rule.find('.wdp-sortable')); new_rule.find( '.wdp-sortable-blocks' ).sortable( { containment: 'parent', items: '.wdp-sortable-block', cursor: 'move', axis: 'y', opacity: 0.65, handle: '.wdp-drag-handle', update: function( event, ui ) { new_rule.trigger( 'change' ); // Show that label with checkbox when role discount on first position if (new_rule.find( ".wdp-sortable-blocks > div:first-child .dont-apply-bulk-if-roles-matched-check" ).length) { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).show(); } else { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).hide(); } } } ); new_rule.on('change', function() { new_rule.addClass('dirty'); }); } function setRuleData(new_rule, data) { new_rule.find('.rule-id').val(data.id); new_rule.find('label.rule-id').text(data.id); new_rule.find('[data-wdp-title]').text(data.title); new_rule.find('.wdp-title').val(data.title); new_rule.find('[data-role="flipswitch"]').val(data.enabled); new_rule.find('[data-role="flipswitch"]').flipswitch('refresh'); new_rule.removeClass('dirty'); if (data.sortable_blocks_priority && data.sortable_blocks_priority.length) { var $sorted_blocks = new_rule.find('.wdp-sortable-blocks'); data.sortable_blocks_priority.forEach( function ( data_item ) { $.each(new_rule.find( 'input.priority_block_name' ), function( el_index, el_item ) { if ( data_item === $(el_item).val() ) { $( el_item ).parent().appendTo( $sorted_blocks ); } } ); } ); } if (data.options) { fill_options(new_rule.find('.wdp-options'), data.options); } if (data.filters) { var $wdp_product_filter = new_rule.find('.wdp-filter-block'); $.each(data.filters, function (i, filter) { add_product_filter($wdp_product_filter, filter); }); } if ( data.additional.conditions_relationship ) { var $radios = new_rule.find( '.wdp-conditions-relationship input:radio' ); $radios.filter( '[value=' + data.additional.conditions_relationship + ']' ).prop( 'checked', true ); } var $btn; if (data.conditions) { $btn = new_rule.find('.wdp-btn-add-condition'); $.each(data.conditions, function (i, condition) { add_condition($btn, condition); }); } if (data.limits) { $btn = new_rule.find('.wdp-btn-add-limit'); $.each(data.limits, function (i, limit) { add_limit($btn, limit); }); } if (data.product_adjustments && data.product_adjustments.type) { if ('total' === data.product_adjustments.type && data.product_adjustments['total']['type']) { add_product_adjustment(new_rule.find('.wdp-product-adjustments'), data.product_adjustments); } else if ('split' === data.product_adjustments.type && data.product_adjustments['split'][0]['type']) { add_product_adjustment(new_rule.find('.wdp-product-adjustments'), data.product_adjustments); } } if (data.cart_adjustments) { $btn = new_rule.find('.wdp-btn-add-cart-adjustment'); $.each(data.cart_adjustments, function (i, cart_adjustment) { add_cart_adjustment($btn, cart_adjustment); }); } if ( data.role_discounts && data.role_discounts.rows ) { $btn = new_rule.find( '.wdp-btn-add-role-discount' ); $.each( data.role_discounts.rows, function ( i, role_discount ) { add_role_discount( $btn, role_discount ); } ); new_rule.find( '[name="rule[role_discounts][dont_apply_bulk_if_roles_matched]"]' ).attr( 'checked', false ); new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).hide(); // Hide role discount sortable handler if bulk adjustments is empty if ( !( data.bulk_adjustments && data.bulk_adjustments.ranges ) ) { new_rule.find(".wdp-role-discounts .wdp-drag-handle").hide(); } else { // Show that label with checkbox when role discount on first position if (new_rule.find( ".wdp-sortable-blocks > div:first-child .dont-apply-bulk-if-roles-matched-check" ).length) { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).show(); } else { new_rule.find( '.dont-apply-bulk-if-roles-matched-check' ).hide(); } if ( typeof data.role_discounts.dont_apply_bulk_if_roles_matched === "undefined" ) { new_rule.find( '[name="rule[role_discounts][dont_apply_bulk_if_roles_matched]"]' ).attr( 'checked', true ); } } } if (data.bulk_adjustments && data.bulk_adjustments.ranges) { add_bulk_adjustment(new_rule.find('.wdp-bulk-adjustments'), data.bulk_adjustments); // Hide bulk adjustments sortable handler if role discounts is empty if ( !( data.role_discounts && data.role_discounts.rows ) ) { new_rule.find(".wdp-bulk-adjustments .wdp-drag-handle").hide(); } } if (data.get_products && data.get_products.value) { fill_get_products_options(new_rule.find('.wdp-get-products-block'), data.get_products); var $wdp_product_adjustments = new_rule.find('.wdp-get-products'); $.each(data.get_products.value, function (i, filter) { add_get_products($wdp_product_adjustments, filter); }); } } function fill_options($container, data) { if (data) { if (data.repeat) { $container.find('.wdp-repeat select').val(data.repeat); } if (data.apply_to) { $container.find('.wdp-apply-to select').val(data.apply_to); } } } function add_product_filter($container, data) { // hide message 'no rules' when add new filter $container.show(); $container.closest('.postbox').find('.wdp-btn-add-product-filter').hide(); var product_filter_index = get_new_product_filter_index($container); var template = get_template('filter_item_qty', { r: get_current_rule_index($container), f: product_filter_index, t: 'filters' }); var $product_filter = $(template); var $product_filter_selector = $product_filter.find('.wdp-filter-type'); // add filter into rule containter $container.find('.wdp-product-filter-container').append($product_filter); // load data for existing filter if (data) { if (data.type) $product_filter_selector.val(data.type); var qty = data.qty ? data.qty : false; var qty_end = data.qty_end ? data.qty_end : data.qty; if (qty) $product_filter.find('.wdp-condition-field-qty input').val(qty); if (qty_end) $product_filter.find('.wdp-condition-field-qty-end input').val(qty_end); } // hook for remove filter $product_filter.find('.wdp_filter_remove').click(function () { var $product_filter_container = $(this).closest('.wdp-filter-block'); $product_filter.closest('.postbox').find('.adjustment-split[data-index=' + $product_filter.attr('data-index') + ']').remove(); $product_filter.remove(); var filters_count = $product_filter_container.find('.wdp-filter-item').length; if (filters_count === 0) { $container.hide(); $container.closest('.postbox').find('.wdp-btn-add-product-filter').show(); $container.closest('.postbox').find('.adjustment-mode-total').attr('checked', 'checked').change(); $container.closest('.postbox').find('.adjustment-mode-split').attr('disabled', 'disabled'); } }); if (!wdp_data.options.enable_product_exclude) { $container.find(".wdp-product-exclude").hide(); } // render controls for selected filter type $product_filter_selector.change(function () { update_product_filter_fields($(this)); }); update_product_filter_fields($product_filter_selector, data); $container.closest('.postbox').find('.adjustment-mode-split').attr('disabled', false); add_product_adjustment_split($container.closest('.wdp-filter-block'), product_filter_index); } function update_fields_qty_type($product_filter) { var type = $product_filter.find('.wdp-condition-field-qty-type select').val(); if (type == 'any') { $product_filter.find('.wdp-condition-field-qty').hide(); $product_filter.find('.wdp-condition-field-range').hide(); } else if (type == 'qty') { $product_filter.find('.wdp-condition-field-qty').show(); $product_filter.find('.wdp-condition-field-range').hide(); } else if (type == 'range') { $product_filter.find('.wdp-condition-field-qty').hide(); $product_filter.find('.wdp-condition-field-range').show(); } } function update_product_filter_fields($el, data, option) { var $container = $el.closest('.wdp-filter-item'); var type = $el.val(); // prepare template for filter type var template = get_template('filter_' + type, { r: get_current_rule_index($el), f: get_current_product_filter_index($el), t: option || 'filters' }); $container.find('.wdp-condition-field-sub').html(template); // load data for existing filter if (data) { if (data.method) { $container.find('.wdp-filter-field-method select').val(data.method); } if (data.value) { var html = ''; $.each(data.value, function (i, id) { var title = wdp_data.titles[data.type] && wdp_data.titles[data.type][id] ? wdp_data.titles[data.type][id] : id; html += ''; }); $container.find('.wdp-condition-field-value select').append(html); } if ( data.product_exclude ) { if ( data.product_exclude.values ) { var product_exclude_html = ''; var pr_excl_type = 'products'; $.each(data.product_exclude.values, function (i, id) { var title = wdp_data.titles[pr_excl_type] && wdp_data.titles[pr_excl_type][id] ? wdp_data.titles[pr_excl_type][id] : id; product_exclude_html += ''; }); $container.find('.wdp-product-exclude select').append(product_exclude_html); } } } make_select2_products($container.find('[data-field="autocomplete"]')); make_select2_product_taxonomies($container.find('[data-field="autocomplete"][data-list="product_taxonomies"]')); } function add_condition($el, data) { $el.closest('.postbox').find('.wdp-btn-add-condition').hide(); var condition_template = get_template('condition_row', { r: get_current_rule_index($el), c: get_new_condition_index($el) }); var $condition = $(condition_template); $condition.find('.wdp-condition-remove').click(function () { var $rule = $(this).closest('.postbox'); $(this).closest('.wdp-condition').remove(); var conditions_count = $rule.find('.wdp-conditions .wdp-condition').length; if (conditions_count === 0) { $rule.find('.wdp-conditions').hide(); $el.closest('.postbox').find('.wdp-btn-add-condition').show(); } }); $el.closest('.postbox') .find('.wdp-conditions').show() .find('.wdp-conditions-container').append($condition); var $condition_type_selector = $condition.find('.wdp-condition-field-type select'); if (data && data.type) { $condition_type_selector.val(data.type); } if (!$condition_type_selector.val()) { var new_val = $condition_type_selector.find('option').prop('value'); $condition_type_selector.val(new_val); } update_condition_fields($condition_type_selector, data); $condition_type_selector.change(function () { update_condition_fields($(this)); }); } function update_condition_fields($el, data) { var $container = $el.closest('.wdp-condition'); var type = $el.val(); var template = get_template(type, { r: get_current_rule_index($el), c: $container.data('index') }); $container.find('.wdp-condition-field-sub').html(template); if (data && data.options) { var fields = $container.find('.wdp-condition-subfield'); fields.each( function(index, field) { var value_field; value_field = $('select[multiple]', field); if (value_field.length) { var titles = [], get_title; if (value_field.data('field') === 'autocomplete') { if (value_field.data('list') === 'product_taxonomies') { titles = wdp_data.titles[value_field.data('taxonomy')]; } else { titles = wdp_data.titles[value_field.data('list')]; } get_title = function(id) { return titles[id]; } } else if (value_field.data('field') === 'preloaded') { titles = wdp_data.lists[value_field.data('list')]; get_title = function(id) { for (var i = 0; i < titles.length; i++) { if (titles[i].id.toString() === id) return titles[i].text; } return id; } } $.each(data.options[index], function (i, val) { // value_field.find('[value="' + val + '"]').prop('selected', 'selected'); value_field.append(''); }); return; } value_field = $('select', field); if (value_field.length) { value_field.val( data.options[index] ); return; } value_field = $('input', field); if (value_field.length) { value_field.val(data.options[index]); } }); } $container.find('[data-field="date"]').removeClass('hasDatepicker').datepicker({dateFormat:"yy-mm-dd"}); $container.find('[class="datetimepicker"]').datetimepicker(); make_select2_tags($container.find('[data-field="tags"]')); make_select2_products($container.find('[data-field="autocomplete"]')); make_select2_product_taxonomies($container.find('[data-field="autocomplete"][data-list="product_taxonomies"]')); make_select2_preloaded($container.find('[data-field="preloaded"]')); $container.find('.wdp-condition-field-method-coupon select').change( function() { var disabled = [ 'at_least_one_any', 'none_at_all' ].indexOf( $( this ).val() ) >= 0; $container.find('.wdp-condition-field-value-coupon select').prop('disabled', disabled); } ); $container.find('.wdp-condition-field-method-coupon select').each( function() { var disabled = [ 'at_least_one_any', 'none_at_all' ].indexOf( $( this ).val() ) >= 0; $container.find('.wdp-condition-field-value-coupon select').prop('disabled', disabled); } ); $container.find( '.wdp-condition-field-method select' ).change( function () { var enable_last = 'in_range' === $( this ).val(); $container.find( '.wdp-condition-field-value-last' ).toggle( enable_last ); } ); $container.find( '.wdp-condition-field-method select' ).each( function () { var enable_last = 'in_range' === $( this ).val(); $container.find( '.wdp-condition-field-value-last' ).toggle( enable_last ); } ); } function add_limit($el, data) { $el.closest('.postbox').find('.wdp-btn-add-limit').hide(); var template = get_template('limit_row', { l: get_new_limit_index($el) }); var $limit = $(template); $el.closest('.postbox') .find('.wdp-limits').show() .find('.wdp-limits-container').append($limit); if (data) { $limit.find('.wdp-limit-type select').val(data.type); } $limit.find('.wdp-limit-remove').click(function () { var $rule = $(this).closest('.postbox'); $(this).closest('.wdp-limit').remove(); var limits_count = $rule.find('.wdp-limits .wdp-limit').length; if (limits_count === 0) { $rule.find('.wdp-limits').hide(); $el.closest('.postbox').find('.wdp-btn-add-limit').show(); } }); var $limit_type_selector = $limit.find('.wdp-limit-type select'); update_limit_fields($limit_type_selector, data); $limit_type_selector.change(function () { update_limit_fields($(this)); }); } function update_limit_fields($el, data) { var $container = $el.closest('.wdp-limit'); var type = $el.val(); var template = get_template(type + '_limit', { l: $container.data('index'), }); $container.find('.wdp-limit-field-sub').html(template); if (data && data.options) { $container.find('.wdp-limit-value input').val( data.options ); } } function add_range($el, data) { var $postbox = $el.closest('.postbox'); var template = get_template('adjustment_bulk', { r: get_current_rule_index($el), b: get_new_range_index($el) }); $postbox.find('.wdp-ranges-empty').hide(); var last_range_to_value; var el_last_range_to_value = $postbox.find('.wdp-ranges .wdp-range:last .adjustment-to'); if (el_last_range_to_value.length) { last_range_to_value = el_last_range_to_value.val(); } var $range = $(template); $postbox.find('.wdp-ranges').append($range); if (last_range_to_value) { $range.find('.adjustment-from').val(parseInt(last_range_to_value)+1); $range.find('.adjustment-to').focus(); } else { $range.find('.adjustment-from').focus(); } if (data) { $range.find('.adjustment-from').val(data.from); $range.find('.adjustment-to').val(data.to); $range.find('.adjustment-value').val(data.value); } $range.find('.wdp-range-remove').click(function () { var $rule = $(this).closest('.postbox'); $(this).closest('.wdp-range').remove(); var ranges_count = $rule.find('.wdp-ranges .wdp-range').length; if (ranges_count === 0) { $postbox.find('.wdp-ranges-empty').show(); } }); } function fill_get_products_options($container, data) { if (data) { if (data.repeat) { $container.find('.wdp-get-products-repeat select').val(data.repeat); } } } function add_get_products($container, data) { $container.closest('.wdp-get-products-block').show(); $container.closest('.postbox').find('.wdp-btn-add-getproduct').hide(); var template = get_template('adjustment_deal', { r: get_current_rule_index($container), f: get_new_product_filter_index($container) }); var $product_filter = $(template); var $product_filter_selector = $product_filter.find('.wdp-filter-type'); $container.append($product_filter); if (data) { if (data['qty']) $product_filter.find('.wdp-condition-field-qty input').val(data['qty']); } var $rule = $container.closest('.postbox'); $product_filter.find('.wdp_filter_remove').click(function () { var $product_filter_container = $(this).closest('.wdp-get-products'); $product_filter.remove(); var filters_count = $product_filter_container.find('.wdp-filter-item').length; if (filters_count === 0) { $container.closest('.wdp-get-products-block').hide(); $container.closest('.postbox').find('.wdp-btn-add-getproduct').show(); } }); update_product_filter_fields($product_filter_selector, data, 'get_products][value'); } function add_product_adjustment($container, data) { $container.show(); var $rule = $container.closest('.postbox'); $rule.find('.wdp-btn-add-product-adjustment').hide(); $rule.find('.wdp_product_adjustment_remove').click(function () { $rule.find('.wdp-btn-add-product-adjustment').show(); $container.hide(); flushInputs($container); }); var type; if (data) { type = data.type; $container.find('.adjustment-mode-' + type).attr('checked', 'checked'); if (data.total) { $container.find('.adjustment-total-type').val(data.total.type); $container.find('.adjustment-total-value').val(data.total.value); } $container.find('.adjustment-split').each(function(index) { if (data.split && data.split[index]) { fill_product_adjustment_split($(this), data.split[index]); } else { fill_product_adjustment_split($(this)); } }); if (data['max_discount_sum']) { $container.find('.product-adjustments-max-discount').val(data['max_discount_sum']); } } else { type = 'total'; $container.find('.adjustment-mode-total').attr('checked', 'checked'); $container.find('.adjustment-total-type').find('option:first-child').prop('selected', 'selected'); $container.find('.adjustment-split').each(function() { fill_product_adjustment_split($(this)); }); } $container.find('.adjustment-mode').change(function () { updateElementsVisisibilyInRowForElementValue($(this).val(), $(this).closest('.wdp-product-adjustments')); }); updateElementsVisisibilyInRowForElementValue(type, $container); } function add_product_adjustment_split($container, adj_index, data) { var template = get_template('adjustment_split_row', { adj: adj_index }); var $split_adjustment = $(template); $container.closest('.postbox') .find('.wdp-product-adjustments-split-container').append($split_adjustment); fill_product_adjustment_split($split_adjustment, data); } function fill_product_adjustment_split($split_adjustment, data) { if (data) { $split_adjustment.find('.adjustment-split-type').val(data.type); $split_adjustment.find('.adjustment-split-value').val(data.value); } else { $split_adjustment.find('.adjustment-split-type').find('option:first-child').prop('selected', 'selected'); } } function add_bulk_adjustment($container, data) { bulk_adjustment().add($container, data); } function add_cart_adjustment($el, data) { $el.closest('.postbox').find('.wdp-btn-add-cart-adjustment').hide(); var template = get_template('cart_adjustment_row', { ca: get_new_cart_adjustment_index($el) }); var $cart_adjustment = $(template); $el.closest('.postbox') .find('.wdp-cart-adjustments').show() .find('.wdp-cart-adjustments-container').append($cart_adjustment); if (data) { $cart_adjustment.find('.wdp-cart-adjustment-type select').val(data.type); } $cart_adjustment.find('.wdp-cart-adjustment-remove').click(function () { var $rule = $(this).closest('.postbox'); $(this).closest('.wdp-cart-adjustment').remove(); var adjs_count = $rule.find('.wdp-cart-adjustments .wdp-cart-adjustment').length; if (adjs_count === 0) { $rule.find('.wdp-cart-adjustments').hide(); $el.closest('.postbox').find('.wdp-btn-add-cart-adjustment').show(); } }); var $adj_type_selector = $cart_adjustment.find('.wdp-cart-adjustment-type select'); update_cart_adjustment_fields($adj_type_selector, data); $adj_type_selector.change(function () { update_cart_adjustment_fields($(this)); }); } function add_role_discount( $el, data ) { $el.closest( '.postbox' ).find( '.wdp-btn-add-role-discount' ).hide(); var template = get_template( 'role_discount_row', { indx: get_new_role_discount_index( $el ) } ); var $role_discount = $( template ); $el.closest( '.postbox' ) .find( '.wdp-role-discounts' ).show() .find( '.wdp-role-discounts-container' ).append( $role_discount ); if ( data ) { $role_discount.find( 'input.wdp-role-discount-value, select.wdp-role-discount-value' ).each( function ( index, el ) { var field_name = $( el ).data( 'field-name' ); var field_value = data[field_name]; if ( field_value !== undefined ) { if ( "roles" === field_name ) { var html = ''; $.each( field_value, function ( i, id ) { html += ''; } ); $( this ).append( html ); } else { $( this ).val( field_value ); } } } ); } make_select2_preloaded( $role_discount.find( '[data-field="preloaded"]' ) ); $role_discount.find( '.wdp_role_discount_remove' ).click( function () { var $rule = $( this ).closest( '.postbox' ); $( this ).closest( '.wdp-role-discount' ).remove(); var role_discounts_count = $rule.find( '.wdp-role-discounts .wdp-role-discount' ).length; if ( role_discounts_count === 0 ) { $rule.find( '.wdp-role-discounts' ).hide(); $el.closest( '.postbox' ).find( '.wdp-btn-add-role-discount' ).show(); // Unconditionally hide all sortable handlers $rule.find(".wdp-drag-handle").hide(); } } ); } function update_cart_adjustment_fields($el, data) { var $container = $el.closest('.wdp-cart-adjustment'); var type = $el.val(); var template = get_template(type + '_cart_adjustment', { ca: $container.data('index'), }); $container.find('.wdp-cart-adjustment-field-sub').html(template); if (data && data.options) { $container.find('.wdp-cart-adjustment-value input, .wdp-cart-adjustment-value select').each(function (index) { if (data.options[index] !== undefined) { jQuery(this).val(data.options[index]); } }); } } function updateDealOption($row, type) { var before = '', after = ''; if (type === 'free') { $row.find('.wdp-condition-field-deal-options').hide(); return; } else if (type === 'price__fixed') { after = wdp_data.labels.currency_symbol; } else if (type === 'discount__percentage') { after = '%'; } else if (type === 'discount__amount') { before = '-'; after = wdp_data.labels.currency_symbol; } $row.find('.wdp-condition-field-deal-options').show(); $row.find('.wdp-condition-field-deal-options--before').html(before); $row.find('.wdp-condition-field-deal-options--after').html(after); $row.find('.wdp-condition-field-deal-options input').val(''); } function update_get_products_auto_visibility($rule) { var $items = $rule.find('.wdp-get-products .wdp-filter-item'), filter_val = $items.find('.wdp-condition-field-value select').val(), filter_type = $items.find('.wdp-filter-type').val(), deal_type = $items.find('.wdp-condition-field-deal-type select').val(); var show = $items.length === 1 && filter_type === 'products' && deal_type === 'free' && filter_val && filter_val.length === 1; $rule.find('.wdp-get-products-auto').toggle(show); } /* Utils */ // find template by id, replace variables by values and return string function get_template(name, variables) { var template = $('#' + name + '_template').html() || ''; for (var v in variables) { template = template.replace(new RegExp('{' + v + '}', 'g'), variables[v]); } return template; } // find next index for condition row function get_new_condition_index($el) { var newIndex = 0; $el.closest('.postbox').find('.wdp-conditions .wdp-condition').each(function (i, el) { var index = ~~ $(el).data('index'); if (index >= newIndex) newIndex = index + 1; }); return newIndex; } // returns index rule where eleemnt placed function get_current_rule_index($el) { return $el.closest('.postbox').data('index'); } // find next index for filter row function get_new_product_filter_index($container) { var newIndex = 0; $container.find('.wdp-filter-item').each(function (i, el) { var index = ~~$(el).data('index'); if (index >= newIndex) newIndex = index + 1; }); return newIndex; } // returns index of filter where element placed function get_current_product_filter_index($el) { return $el.closest('.wdp-filter-item').data('index'); } // find next index for limit row function get_new_limit_index($el) { var newIndex = 0; $el.closest('.postbox').find('.wdp-limits .wdp-limit').each(function (i, el) { var index = ~~$(el).data('index'); if (index >= newIndex) newIndex = index + 1; }); return newIndex; } // find next index for cart adjustment row function get_new_cart_adjustment_index($el) { var newIndex = 0; $el.closest('.postbox').find('.wdp-cart-adjustments .wdp-cart-adjustment').each(function (i, el) { var index = ~~$(el).data('index'); if (index >= newIndex) newIndex = index + 1; }); return newIndex; } function get_new_role_discount_index( $el ) { var newIndex = 0; $el.closest( '.postbox' ).find( '.wdp-role-discounts .wdp-role-discount' ).each( function ( i, el ) { var index = ~ ~ $( el ).data( 'index' ); if ( index >= newIndex ) { newIndex = index + 1; } } ); return newIndex; } // find next index for range row function get_new_range_index($el) { var newIndex = 0; $el.closest('.postbox').find('.wdp-ranges .wdp-range').each(function (i, el) { var index = ~~$(el).data('index'); if (index >= newIndex) newIndex = index + 1; }); return newIndex; } function get_last_priority() { var newIndex = 0; $('#rules-container .postbox').each(function (i, el) { var index = ~~ $('.rule-priority', el).val(); if (index >= newIndex) newIndex = index + 1; }); return newIndex; } // make select to select2 autocomplete function make_select2_products($els) { $els.each(function (index, el) { var $el = $(el); if ( $el.data( 'list' ) === 'product_taxonomies' ) { return false; } $el.select2({ width: '100%', minimumInputLength: 1, placeholder: $el.data('placeholder'), escapeMarkup: function (text) { return text; }, language: { noResults: function () { return wdp_data.labels.select2_no_results; } }, ajax: { url: ajaxurl, type: 'POST', dataType: 'json', delay: 250, data: function (params) { return { query: params.term, action: 'wdp_ajax', method: $el.data('list') || 'product', selected: $el.val() }; }, processResults: function (response) { return { results: response.data || [] }; } } }); $el.on('select2:select', function (e) { var type = $el.attr('data-list'); var id = e.params.data.id; var title = e.params.data.text; if (typeof e.params.data.bundle !== 'undefined') { var bundle = e.params.data.bundle; var current = $(this).val() ? $(this).val() : []; var exclude = [id]; for (var i = 0; i < bundle.length; i++) { id = bundle[i].id; title = bundle[i].text; if (!$(this).find("option[value='" + id + "']").length) { $(this).append(new Option(title, id, false, false)); wdp_data.titles[type][id] = title; } if (current.indexOf(id) !== -1) { exclude.push(id); } else { current.push(id); } } current = current.filter(function (item) { return exclude.indexOf(item) === -1; }); $(this).val(current).trigger('change'); } else { wdp_data.titles[type][id] = title; } }); $el.parent().find('.select2-search__field').css('width', '100%'); }); } function make_select2_product_taxonomies($els) { $els.each(function (index, el) { var $el = $(el); $el.select2({ width: '100%', minimumInputLength: 1, placeholder: $el.data('placeholder'), escapeMarkup: function (text) { return text; }, language: { noResults: function () { return wdp_data.labels.select2_no_results; } }, ajax: { url: ajaxurl, type: 'POST', dataType: 'json', delay: 250, data: function (params) { return { query: params.term, action: 'wdp_ajax', method: $el.data('list') || 'product', taxonomy: $el.data('taxonomy') || '', selected: $el.val() }; }, processResults: function (response) { return { results: response.data || [] }; } } }); $el.on('select2:select', function (e) { var type = $el.attr('data-taxonomy'); var id = e.params.data.id; var title = e.params.data.text; wdp_data.titles[type][id] = title; }); $el.parent().find('.select2-search__field').css('width', '100%'); }); } function make_select2_preloaded($els) { $els.each(function (index, el) { var $el = $(el); var data = wdp_data.lists[ $el.data('list') ]; $el.select2({ width: '100%', escapeMarkup: function (text) { return text; }, minimumInputLength: 1, placeholder: $el.data('placeholder'), language: { noResults: function () { return wdp_data.labels.select2_no_results; } }, data: data }); $el.parent().find('.select2-search__field').css('width', '100%'); }); } // make select to select2 with tags function make_select2_tags($els) { $els.each(function (index, el) { var $el = $(el); $el.select2({ width: '100%' }); $el.parent().find('.select2-search__field').css('width', '100%'); }); } // update rule title function update_rule_title($rule) { var title = $rule.find('h2.hndle.ui-sortable-handle > span'); // check if rule enabled var $toggler = $rule.find('.wdp-field-enabled select'); var disabled = $toggler.val() === 'off'; title.toggleClass('wdp-title-disabled', disabled); $rule.toggleClass('disabled', disabled); // check if bulk rule repeated var repeat = false; var $checkbox_repeat = $rule.find('.wdp-adjustments-repeat'); if ($checkbox_repeat.length) { repeat = $checkbox_repeat.prop('checked'); } title.toggleClass('wdp-title-repeat', repeat); // check if cart rule provide discount or fee var cart_adjustment_type = $rule.find('.cart-adjustment-type ').val() || ''; title.toggleClass('wdp-title-discount', cart_adjustment_type.indexOf('discount') === 0); title.toggleClass('wdp-title-fee', cart_adjustment_type.indexOf('fee') === 0); } // make lists inside rule sortable function make_sortable($container) { $container.sortable({ containment: 'parent', items: '.wdp-row', cursor: 'move', axis: 'y', opacity: 0.65 }); } function updateElementsVisisibilyInRowForElementValue(value, $container) { var $row_elements = $container.find('[data-show-if]'); $row_elements.each(function (i, el) { var $el = $(el); var show_if = $el.data('show-if').split(','); var visible = show_if.indexOf(value) >= 0; $el.toggle( visible ); if (!visible) { // flushInputs($el); } }); } function flushInputs($container) { $container.find('input:not([data-readonly]), select:not([data-readonly]), textarea:not([data-readonly])').val(''); } $('.hide-disabled-rules').change(function () { var checked = $(this).prop('checked'); remove_get_parameter('hide_inactive'); remove_get_parameter('paged'); if (checked) { window.location.href += '&hide_inactive=1'; } else { window.location.reload(); } // $('#rules-container').toggleClass('hide-disabled', $(this).val() ); }); function remove_get_parameter(parameterName) { var result = null, clean_uri = null, tmp = []; location.search .substr(1) .split("&") .forEach(function (item) { tmp = item.split("="); if (tmp[0] === parameterName) { result = decodeURIComponent(tmp[1]); clean_uri = window.location.toString().replace("&" + tmp[0] + "=" + tmp[1], ""); clean_uri = clean_uri.replace(tmp[0] + "=" + tmp[1], ""); clean_uri = clean_uri.replace(/\?$/ig, ""); } }); if (result && clean_uri) { window.history.replaceState({}, document.title, clean_uri) } return result; }; function deparam(params){ var digitTest = /^\d+$/, keyBreaker = /([^\[\]]+)|(\[\])/g, plus = /\+/g, paramTest = /([^?#]*)(#.*)?$/; if(! params || ! paramTest.test(params) ) { return {}; } var data = {}, pairs = params.split('&'), current; for(var i=0; i < pairs.length; i++){ current = data; var pair = pairs[i].split('='); // if we find foo=1+1=2 if(pair.length != 2) { pair = [pair[0], pair.slice(1).join("=")] } var key = decodeURIComponent(pair[0].replace(plus, " ")), value = decodeURIComponent(pair[1].replace(plus, " ")), parts = key.match(keyBreaker); for ( var j = 0; j < parts.length - 1; j++ ) { var part = parts[j]; if (!current[part] ) { // if what we are pointing to looks like an array current[part] = digitTest.test(parts[j+1]) || parts[j+1] == "[]" ? [] : {} } current = current[part]; } lastPart = parts[parts.length - 1]; if(lastPart == "[]"){ current.push(value) }else{ current[lastPart] = value; } } return data; } function get_role_label(id) { var roles_list = wdp_data.lists.user_roles; for (var i = 0; i < roles_list.length; i++) { if (typeof roles_list[i] !== 'undefined' && roles_list[i].id === id) { return roles_list[i].text; } } return id } });