PageSourceSearch

https://www.educationforhealth.africa/wp-content/plugins/data-tabl…/js/tables.view.woo.pro.js?ver=1.15.3

js educationforhealth.africa collected 2026-10-05 18:38:36 UTC 71,813 bytes, 2,055 lines download raw bytes

1(function ($, app) {
2  $(document).ready(function () {
3    app.WooPro = function () {
4      app.WooProFrontendEvents();
5    };
6
7    app.WooProFrontendEvents = function () {
8      //Click on multy add products button
9      $('.stAddMultyButton').on('click', function (e) {
10        e.preventDefault();
11
12        var _this = $(this),
13          wrapper = _this.closest('.supsystic-tables-wrap'),
14          rows = wrapper.find('.stMultiAddCheck'),
15          selectedProduct = [],
16          addonData = wrapper.find('.supsystic-tables-addon'),
17          hideViewCart = addonData.length && addonData.attr('data-view-cart-hide') == 'on';
18
19        rows.each(function () {
20          var checkbox = $(this).find('.stAddMulty'),
21            pushObj = {},
22            variation = {};
23          checkbox
24            .closest('td')
25            .find('.stVarAttribute')
26            .each(function () {
27              variation[$(this).attr('data-attribute')] = $(this).val();
28            });
29
30          pushObj.id = checkbox.val();
31          pushObj.varId = checkbox.attr('data-variation_id');
32          pushObj.quantity = checkbox.attr('data-quantity');
33          pushObj.variation = variation;
34          selectedProduct.push(pushObj);
35        });
36
37        app
38          .request(
39            {
40              module: 'woocommerce',
41              action: 'productsAddToCart',
42              nonce: typeof DTGS_NONCE !== 'undefined' ? DTGS_NONCE : DTGS_NONCE_FRONTEND,
43            },
44            {
45              selectedProducts: selectedProduct,
46            }
47          )
48          .done(function (res) {
49            console.log(res);
50            $(document.body).trigger('wc_fragment_refresh');
51
52            rows.each(function () {
53              var _this = $(this);
54              _this.removeClass('.stMultiAddCheck');
55              _this.find('.quantity .qty').val('1').trigger('change');
56              _this.find('.stAddMulty').prop('checked', false);
57              if (!hideViewCart) {
58                _this.find('.added_to_cart').removeClass('stHidden');
59              }
60            });
61            var message = res.message,
62              errors = res.errors;
63            $.sNotify({
64              icon: errors ? false : 'fa fa-check',
65              content: '<span>' + message + '</span>',
66              delay: errors ? 5000 : 1500,
67            });
68          })
69          .fail(function (error) {
70            console.log(error);
71          });
72        return false;
73      });
74
75      //Click on add product button
76      $('body').on('click', '.stAddToCart', function (e) {
77        e.preventDefault();
78        var _this = $(this),
79          wrapper = _this.closest('.stAddToCartWrapper'),
80          addonData = _this.closest('.supsystic-tables-wrap').find('.supsystic-tables-addon'),
81          hideViewCart = addonData.length && addonData.attr('data-view-cart-hide') == 'on',
82          selectedProduct = [],
83          pushObj = {},
84          variation = {};
85        _this
86          .closest('td')
87          .find('.stVarAttribute')
88          .each(function () {
89            variation[$(this).attr('data-attribute')] = $(this).val();
90          });
91
92        pushObj.id = _this.attr('data-product_id');
93        pushObj.varId = _this.attr('data-variation_id');
94        pushObj.quantity = _this.attr('data-quantity');
95        pushObj.variation = variation;
96        selectedProduct.push(pushObj);
97
98        app
99          .request(
100            {
101              module: 'woocommerce',
102              action: 'productsAddToCart',
103              nonce: typeof DTGS_NONCE !== 'undefined' ? DTGS_NONCE : DTGS_NONCE_FRONTEND,
104            },
105            {
106              selectedProducts: selectedProduct,
107            }
108          )
109          .done(function (res) {
110            $(document.body).trigger('wc_fragment_refresh');
111            if (!hideViewCart) {
112              wrapper.find('.added_to_cart').removeClass('stHidden');
113            }
114
115            wrapper.find('.quantity .qty').val('1').trigger('change');
116            wrapper.find('.stAddMulty').prop('checked', false);
117
118            var message = res.message,
119              errors = res.errors;
120            $.sNotify({
121              icon: errors ? false : 'fa fa-check',
122              content: '<span>' + message + '</span>',
123              delay: errors ? 5000 : 1500,
124            });
125          })
126          .fail(function (error) {
127            console.log(error);
128          });
129        return false;
130      });
131
132      //Change multy checkbox event
133      $('.supsystic-tables-wrap').on('change', '.stAddMulty', function () {
134        var checkbox = $(this),
135          row = checkbox.closest('tr');
136        if (row.hasClass('child')) {
137          row = row.prev();
138        }
139        if (checkbox.is(':checked')) {
140          row.addClass('stMultiAddCheck');
141        } else {
142          row.removeClass('stMultiAddCheck');
143        }
144      });
145
146      //change quantity input event
147      $('.supsystic-tables-wrap').on('change', '.quantity .qty', function () {
148        var qtyInput = $(this),
149          wrapper = qtyInput.closest('.stAddToCartWrapper'),
150          row = qtyInput.closest('tr');
151        if (row.hasClass('child')) {
152          row = row.prev();
153          var wrapperMain = row.find('td.add_to_cart');
154          wrapperMain.find('.stAddToCartButWrapp .stAddToCart').attr('data-quantity', qtyInput.val());
155          wrapperMain.find('.qty').val(qtyInput.val());
156          wrapperMain.find('.stAddMulty').attr('data-quantity', qtyInput.val());
157        }
158        wrapper.find('.stAddToCartButWrapp .stAddToCart').attr('data-quantity', qtyInput.val());
159        wrapper.find('.stAddMulty').attr('data-quantity', qtyInput.val());
160      });
161
162      $('.supsystic-tables-wrap').on('change', '.stVarAttribute', function () {
163        var select = $(this),
164          wrapper = select.closest('.stVarAttributes'),
165          variations = JSON.parse(wrapper.attr('data-variations')),
166          td = select.closest('td'),
167          curAttr = select.attr('data-attribute'),
168          curValue = select.val(),
169          otherAttrs = wrapper.find('select:not([data-attribute="' + curAttr + '"])'),
170          multy = td.closest('tr').find('.stAddMulty'),
171          attributes = [];
172
173        otherAttrs.each(function () {
174          var current = $(this);
175          attributes.push({ name: current.attr('data-attribute'), value: current.val() });
176          current.find('option:not([value=""])').css('display', 'none');
177        });
178
179        td.find('.stVarPrice').addClass('stHidden');
180        td.find('.stAddToCart').prop('disabled', true).attr('data-variation_id', 0);
181        multy.prop('disabled', true).attr('data-variation_id', 0);
182        var attrLen = attributes.length,
183          found = false;
184        for (id in variations) {
185          var attrs = variations[id],
186            match = !(curAttr in attrs) || attrs[curAttr] == '' || attrs[curAttr] == curValue;
187          if (match || curValue == '') {
188            for (var i = 0; i < attrLen; i++) {
189              var name = attributes[i]['name'],
190                value = attributes[i]['value'];
191              if (name in attrs) {
192                wrapper.find('select[data-attribute="' + name + '"] option' + (attrs[name] == '' ? '' : '[value="' + attrs[name] + '"]')).css('display', 'block');
193                if (attrs[name] != '' && attrs[name] != value) {
194                  match = false;
195                }
196              }
197            }
198            if (!found && match) {
199              td.find('.stVarPrice[data-variation_id="' + id + '"]').removeClass('stHidden');
200              td.find('.stAddToCart').prop('disabled', false).attr('data-variation_id', id);
201              multy.prop('disabled', false).attr('data-variation_id', id);
202              found = true;
203            }
204          }
205        }
206        if (multy.length > 0 && multy.prop('disabled')) {
207          multy.prop('checked', false);
208        }
209        otherAttrs.each(function () {
210          var current = $(this);
211          if (current.find('option:selected').css('display') == 'none') {
212            current.val('');
213          }
214        });
215      });
216    };
217
218    app.WooProExportPrepare = function ($table, exportTable, params) {
219      var addonData = $table.closest('.supsystic-tables-wrap').find('.supsystic-tables-addon');
220      if (addonData.length && addonData.attr('data-woocommerce-table') === 'on') {
221        exportTable.find('.stbWooExportToggle').remove();
222        exportTable.find('.stbWooColumnsToggle').remove();
223        exportTable.find('.stbWooCategoryFilter').remove();
224        exportTable.find('.stbWooFilterToggle').remove();
225        exportTable.find('.stbWooFilterWrapper').remove();
226        exportTable.find('.stbResetWooFilters').remove();
227        exportTable.find('.stAddMultyButton').remove();
228        exportTable.find('.stViewCheckoutButton').remove();
229
230        var buyTds = exportTable.find('.stAddToCartWrapper').closest('td');
231        if (buyTds.length) {
232          var numColumn = buyTds.eq(0).attr('data-x');
233          buyTds.remove();
234          exportTable.find('th[data-x="' + numColumn + '"]').remove();
235        }
236        exportTable.css('font-size', '80%');
237        exportTable.find('a').each(function () {
238          $(this).replaceWith($(this).text());
239        });
240        exportTable.find('.screen-reader-text').remove();
241        exportTable.find('.woocommerce-Price-currencySymbol[aria-hidden="true"]').removeAttr('aria-hidden');
242        exportTable.find('del').css({
243          'text-decoration': 'line-through',
244          opacity: '1',
245        });
246        exportTable.find('ins').css({
247          'text-decoration': 'none',
248          'font-weight': '700',
249          background: 'transparent',
250        });
251        exportTable.find('.woocommerce-Price-amount').css('white-space', 'nowrap').closest('td').css('white-space', 'nowrap');
252        exportTable.find('td, th').css('word-break', 'normal');
253        if (params['type'] == 'pdf') {
254          exportTable.find('.stDateWrapp').css('white-space', 'nowrap');
255          exportTable
256            .find('.woocommerce-Price-amount')
257            .closest('td')
258            .each(function () {
259              var td = $(this),
260                ins = td.find('ins');
261              if (ins.length) {
262                ins.replaceWith(ins.html());
263              }
264              if (td.find('.woocommerce-Price-amount').length > 1) {
265                td.html('<span class="woocommerce-Price-amount">' + td.html() + '<span>');
266              }
267            });
268        }
269      }
270      return exportTable;
271    };
272
273  app.WooPro();
274  });
275
276  app.setTableAddSearching = function (table) {
277    return table.closest('.supsystic-tables-wrap').find('.stbWooCategoryFilter, .stbWooFilterWrapper select, .stbWooFilterWrapper .stWooPriceInput, .stbWooFilterWrapper .stWooPriceRange').length > 0;
278  };
279
280  function isWooServerSideTable(table) {
281    var apiSettings = table.api().settings()[0];
282
283    return table.attr('data-server-side-processing') === 'on' || (apiSettings && apiSettings.oFeatures && apiSettings.oFeatures.bServerSide);
284  }
285
286  function getWooServerSideFilters(table) {
287    var filters = [],
288      tableWrapper = table.closest('.supsystic-tables-wrap');
289
290    var categorySelection = getWooCategoryFilterSelection(tableWrapper);
291    if (categorySelection.total > 0 && categorySelection.selected.length !== categorySelection.total) {
292      filters.push({
293        type: 'category_list',
294        values: categorySelection.selected,
295      });
296    }
297
298    tableWrapper.find('.stbWooFilterWrapper select').each(function () {
299        var select = $(this),
300          filterType = select.attr('data-filter-type') || '',
301          taxonomy = select.attr('data-taxonomy') || '',
302          value = select.val(),
303          keys = select.attr('data-column-keys'),
304          columns = typeof keys !== 'undefined' ? keys.split(',') : [];
305
306        if (value && filterType === 'stock_status') {
307          filters.push({
308            type: 'stock_status',
309            value: value,
310          });
311          return;
312        }
313
314        if (value && filterType === 'attribute_term') {
315          filters.push({
316            type: 'attribute_term',
317            taxonomy: taxonomy,
318            value: value,
319          });
320          return;
321        }
322
323        columns = $.map(columns, function (columnId) {
324          columnId = parseInt($.trim(columnId), 10);
325
326          return isNaN(columnId) ? null : columnId;
327        });
328
329        if (value && columns.length) {
330          filters.push({
331            columns: columns,
332            value: value,
333          });
334        }
335      });
336
337    var priceBounds = getWooSharedPriceState(tableWrapper);
338    if (priceBounds.min !== null || priceBounds.max !== null) {
339      filters.push({
340        type: 'price_range',
341        min: priceBounds.min !== null ? priceBounds.min : '',
342        max: priceBounds.max !== null ? priceBounds.max : '',
343      });
344    }
345
346    return filters;
347  }
348
349  function getWooCategoryFilterSelection(tableWrapper) {
350    var filterWrap = tableWrapper.find('.stbWooCategoryFilter').first(),
351      items = filterWrap.find('.stbWooCategoryFilterItem'),
352      selected = [];
353
354    items.each(function () {
355      var item = $(this),
356        checkbox = item.find('.stbWooCategoryFilterCheckbox'),
357        categoryId = parseInt(item.attr('data-category-id'), 10);
358
359      if (!isNaN(categoryId) && checkbox.is(':checked')) {
360        selected.push(categoryId);
361      }
362    });
363
364    return {
365      total: items.length,
366      selected: selected,
367    };
368  }
369
370  function syncWooCategoryFilterItemState(item, checked) {
371    item.toggleClass('is-active', !!checked);
372    item.attr('aria-pressed', checked ? 'true' : 'false');
373    item.find('.stbWooCategoryFilterCheckbox').prop('checked', !!checked);
374  }
375
376  function parseWooPriceValue(value) {
377    if (value === null || typeof value === 'undefined') {
378      return null;
379    }
380
381    value = $.trim(String(value)).replace(',', '.');
382    if (value === '') {
383      return null;
384    }
385
386    value = parseFloat(value);
387    return isNaN(value) ? null : value;
388  }
389
390  function roundWooPriceValue(value, step) {
391    if (value === null) {
392      return null;
393    }
394
395    var precision = step && String(step).indexOf('.') !== -1 ? String(step).split('.')[1].length : 0;
396    return parseFloat(Number(value).toFixed(precision));
397  }
398
399  function normalizeWooPriceBounds(minValue, maxValue, absoluteMin, absoluteMax) {
400    if (minValue !== null && absoluteMin !== null) {
401      minValue = Math.max(minValue, absoluteMin);
402    }
403    if (maxValue !== null && absoluteMax !== null) {
404      maxValue = Math.min(maxValue, absoluteMax);
405    }
406
407    if (minValue !== null && maxValue !== null && minValue > maxValue) {
408      var swap = minValue;
409      minValue = maxValue;
410      maxValue = swap;
411    }
412
413    return {
414      min: minValue,
415      max: maxValue,
416    };
417  }
418
419  function compactWooPriceBounds(state, absoluteMin, absoluteMax) {
420    state = state || {
421      min: null,
422      max: null,
423    };
424
425    if (absoluteMin !== null && state.min !== null && state.min === absoluteMin) {
426      state.min = null;
427    }
428    if (absoluteMax !== null && state.max !== null && state.max === absoluteMax) {
429      state.max = null;
430    }
431
432    return state;
433  }
434
435  function getWooPriceFilterState(priceFilter) {
436    var absoluteMin = parseWooPriceValue(priceFilter.attr('data-min')),
437      absoluteMax = parseWooPriceValue(priceFilter.attr('data-max')),
438      inputMin = priceFilter.find('.stWooPriceInputMin'),
439      inputMax = priceFilter.find('.stWooPriceInputMax'),
440      rangeMin = priceFilter.find('.stWooPriceRangeMin'),
441      rangeMax = priceFilter.find('.stWooPriceRangeMax'),
442      minValue = inputMin.length ? parseWooPriceValue(inputMin.val()) : null,
443      maxValue = inputMax.length ? parseWooPriceValue(inputMax.val()) : null;
444
445    if (minValue === null && rangeMin.length) {
446      minValue = parseWooPriceValue(rangeMin.val());
447    }
448    if (maxValue === null && rangeMax.length) {
449      maxValue = parseWooPriceValue(rangeMax.val());
450    }
451
452    return compactWooPriceBounds(
453      normalizeWooPriceBounds(minValue, maxValue, absoluteMin, absoluteMax),
454      absoluteMin,
455      absoluteMax
456    );
457  }
458
459  function updateWooPriceSliderVisual(priceFilter, minValue, maxValue) {
460    var absoluteMin = parseWooPriceValue(priceFilter.attr('data-min')),
461      absoluteMax = parseWooPriceValue(priceFilter.attr('data-max')),
462      range = absoluteMax !== null && absoluteMin !== null ? absoluteMax - absoluteMin : 0,
463      startPercent = 0,
464      endPercent = 100;
465
466    if (range > 0 && minValue !== null && maxValue !== null) {
467      startPercent = ((minValue - absoluteMin) / range) * 100;
468      endPercent = ((maxValue - absoluteMin) / range) * 100;
469    }
470
471    priceFilter.css({
472      '--stb-price-start': startPercent + '%',
473      '--stb-price-end': endPercent + '%',
474    });
475  }
476
477  function syncWooPriceFilterUi(priceFilter, state) {
478    var step = priceFilter.attr('data-step') || '1',
479      rangeMin = priceFilter.find('.stWooPriceRangeMin'),
480      rangeMax = priceFilter.find('.stWooPriceRangeMax'),
481      inputMin = priceFilter.find('.stWooPriceInputMin'),
482      inputMax = priceFilter.find('.stWooPriceInputMax'),
483      absoluteMin = parseWooPriceValue(priceFilter.attr('data-min')),
484      absoluteMax = parseWooPriceValue(priceFilter.attr('data-max')),
485      minValue = state.min !== null ? state.min : absoluteMin,
486      maxValue = state.max !== null ? state.max : absoluteMax;
487
488    minValue = roundWooPriceValue(minValue, step);
489    maxValue = roundWooPriceValue(maxValue, step);
490
491    if (rangeMin.length) {
492      rangeMin.val(minValue);
493    }
494    if (rangeMax.length) {
495      rangeMax.val(maxValue);
496    }
497    if (inputMin.length) {
498      inputMin.val(state.min === null ? '' : minValue);
499    }
500    if (inputMax.length) {
501      inputMax.val(state.max === null ? '' : maxValue);
502    }
503
504    updateWooPriceSliderVisual(priceFilter, minValue, maxValue);
505  }
506
507  function getWooPriceColumnSearchState(priceSearch, absoluteMin, absoluteMax) {
508    if (!priceSearch || !priceSearch.length) {
509      return {
510        min: null,
511        max: null,
512      };
513    }
514
515    absoluteMin = absoluteMin !== null && typeof absoluteMin !== 'undefined' ? absoluteMin : null;
516    absoluteMax = absoluteMax !== null && typeof absoluteMax !== 'undefined' ? absoluteMax : null;
517
518    return compactWooPriceBounds(
519      normalizeWooPriceBounds(
520        parseWooPriceValue(priceSearch.find('.stWooColumnPriceSearchMin').val()),
521        parseWooPriceValue(priceSearch.find('.stWooColumnPriceSearchMax').val()),
522        absoluteMin,
523        absoluteMax
524      ),
525      absoluteMin,
526      absoluteMax
527    );
528  }
529
530  function syncWooPriceColumnSearchUi(priceSearch, state) {
531    if (!priceSearch || !priceSearch.length) {
532      return;
533    }
534
535    priceSearch.find('.stWooColumnPriceSearchMin').val(state.min === null ? '' : state.min);
536    priceSearch.find('.stWooColumnPriceSearchMax').val(state.max === null ? '' : state.max);
537  }
538
539  function storeWooPriceFilterState(tableWrapper, state) {
540    tableWrapper.data('dtgWooPriceFilterState', {
541      min: state && state.min !== null ? state.min : null,
542      max: state && state.max !== null ? state.max : null,
543    });
544  }
545
546  function getWooSharedPriceState(tableWrapper) {
547    var priceFilter = tableWrapper.find('.stWooFilterPrice[data-filter-type="price_range"]').first(),
548      priceSearch = tableWrapper.find('.stWooColumnPriceSearch[data-filter-type="price_range"]').first(),
549      absoluteMin = priceFilter.length ? parseWooPriceValue(priceFilter.attr('data-min')) : null,
550      absoluteMax = priceFilter.length ? parseWooPriceValue(priceFilter.attr('data-max')) : null,
551      filterState = priceFilter.length ? getWooPriceFilterState(priceFilter) : null,
552      searchState = priceSearch.length ? getWooPriceColumnSearchState(priceSearch, absoluteMin, absoluteMax) : null,
553      storedFilterState = tableWrapper.data('dtgWooPriceFilterState') || null,
554      storedSearchState = tableWrapper.data('dtgWooPriceColumnSearchState') || null,
555      state = null;
556
557    if (filterState && (filterState.min !== null || filterState.max !== null)) {
558      state = filterState;
559    } else if (searchState && (searchState.min !== null || searchState.max !== null)) {
560      state = searchState;
561    } else if (storedFilterState && (storedFilterState.min !== null || storedFilterState.max !== null)) {
562      state = compactWooPriceBounds(normalizeWooPriceBounds(storedFilterState.min, storedFilterState.max, absoluteMin, absoluteMax), absoluteMin, absoluteMax);
563    } else if (storedSearchState && (storedSearchState.min !== null || storedSearchState.max !== null)) {
564      state = compactWooPriceBounds(normalizeWooPriceBounds(storedSearchState.min, storedSearchState.max, absoluteMin, absoluteMax), absoluteMin, absoluteMax);
565    }
566
567    return state || {
568      min: null,
569      max: null,
570    };
571  }
572
573  function syncWooSharedPriceState(tableWrapper, state) {
574    var priceFilter = tableWrapper.find('.stWooFilterPrice[data-filter-type="price_range"]').first(),
575      priceSearch = tableWrapper.find('.stWooColumnPriceSearch[data-filter-type="price_range"]').first(),
576      absoluteMin = priceFilter.length ? parseWooPriceValue(priceFilter.attr('data-min')) : null,
577      absoluteMax = priceFilter.length ? parseWooPriceValue(priceFilter.attr('data-max')) : null,
578      normalizedState = compactWooPriceBounds(
579        normalizeWooPriceBounds(
580          state && typeof state.min !== 'undefined' ? state.min : null,
581          state && typeof state.max !== 'undefined' ? state.max : null,
582          absoluteMin,
583          absoluteMax
584        ),
585        absoluteMin,
586        absoluteMax
587      );
588
589    if (priceFilter.length) {
590      syncWooPriceFilterUi(priceFilter, normalizedState);
591    }
592    if (priceSearch.length) {
593      syncWooPriceColumnSearchUi(priceSearch, normalizedState);
594    }
595
596    storeWooPriceFilterState(tableWrapper, normalizedState);
597    storeWooPriceColumnSearchState(tableWrapper, normalizedState);
598
599    return normalizedState;
600  }
601
602  function storeWooPriceColumnSearchState(tableWrapper, state) {
603    tableWrapper.data('dtgWooPriceColumnSearchState', {
604      min: state && state.min !== null ? state.min : null,
605      max: state && state.max !== null ? state.max : null,
606    });
607  }
608
609  function getWooAddon(tableWrapper) {
610    return tableWrapper.find('.supsystic-tables-addon[data-woocommerce-table="on"]').first();
611  }
612
613  function getWooAddonColumnsConfig(tableWrapper) {
614    var addon = getWooAddon(tableWrapper),
615      config = addon.attr('data-woo-columns-config');
616
617    if (!config) {
618      return [];
619    }
620
621    try {
622      config = JSON.parse(config);
623    } catch (e) {
624      config = [];
625    }
626
627    return $.isArray(config) ? config : [];
628  }
629
630  function getWooColumnSearchInputs(tableWrapper, columnIndex) {
631    var selector = '.search-column';
632
633    if (typeof columnIndex !== 'undefined' && columnIndex !== null) {
634      selector += '[data-column-num="' + columnIndex + '"]';
635    }
636
637    return tableWrapper.find(selector);
638  }
639
640  function getWooColumnSearchField(tableWrapper, columnIndex) {
641    return getWooColumnSearchInputs(tableWrapper, columnIndex).first().closest('.stbColumnSearchField');
642  }
643
644  function initWooColumnSearchVisibility(table) {
645    var tableWrapper = table.closest('.supsystic-tables-wrap'),
646      columnsConfig = getWooAddonColumnsConfig(tableWrapper);
647
648    if (!columnsConfig.length) {
649      return;
650    }
651
652    $.each(columnsConfig, function (index, columnConfig) {
653      var searchField = getWooColumnSearchField(tableWrapper, index),
654        hideSearchInput = columnConfig && parseInt(columnConfig.hide_search_input, 10) === 1;
655
656      if (!searchField.length || !columnConfig) {
657        return;
658      }
659
660      if (columnConfig.slug === 'price') {
661        hideSearchInput = parseInt(columnConfig.show_price_search_inputs, 10) !== 1;
662      }
663
664      searchField.toggle(!hideSearchInput);
665    });
666  }
667
668  function initWooAttributeFilters(table) {
669    var tableWrapper = table.closest('.supsystic-tables-wrap'),
670      attributeSelects = tableWrapper.find('.stWooFilterAttributes select[data-filter-type="attribute_term"]'),
671      storedFilterFn = tableWrapper.data('dtgWooAttributeFilterFn'),
672      extSearch = $.fn.dataTable.ext.search;
673
674    if (storedFilterFn) {
675      var existingIndex = $.inArray(storedFilterFn, extSearch);
676      if (existingIndex !== -1) {
677        extSearch.splice(existingIndex, 1);
678      }
679      tableWrapper.removeData('dtgWooAttributeFilterFn');
680    }
681
682    if (!attributeSelects.length) {
683      return;
684    }
685
686    var tableNode = table.get(0),
687      getRowMetaAttributes = function (rowNode) {
688        var row = rowNode ? $(rowNode) : $(),
689          rowMeta = row.find('.stbWooRowMeta').first();
690
691        return {
692          stock: row.attr('data-stock-status') || (rowMeta.length ? rowMeta.attr('data-stock-status') : '') || '',
693          attrs: row.attr('data-woo-attributes') || (rowMeta.length ? rowMeta.attr('data-woo-attributes') : '') || '',
694        };
695      },
696      filterFn = function (settings, data, dataIndex) {
697        if (settings.nTable !== tableNode || isWooServerSideTable(table)) {
698          return true;
699        }
700
701        var hasActiveFilters = false,
702          aoData = settings.aoData && settings.aoData[dataIndex] ? settings.aoData[dataIndex] : null,
703          rowNode = aoData && aoData.nTr ? aoData.nTr : null,
704          rowMeta = getRowMetaAttributes(rowNode),
705          rawAttributes = rowMeta.attrs,
706          rowAttributes = {};
707
708        if (rawAttributes) {
709          try {
710            rowAttributes = JSON.parse(rawAttributes) || {};
711          } catch (e) {
712            rowAttributes = {};
713          }
714        }
715
716        var matchesAll = true;
717        attributeSelects.each(function () {
718          var select = $(this),
719            selectedValue = select.val(),
720            taxonomy = select.attr('data-taxonomy') || '',
721            taxonomyValues = $.isArray(rowAttributes[taxonomy]) ? rowAttributes[taxonomy] : [];
722
723          if (!selectedValue) {
724            return;
725          }
726
727          hasActiveFilters = true;
728          if ($.inArray(selectedValue, taxonomyValues) === -1) {
729            matchesAll = false;
730            return false;
731          }
732        });
733
734        return !hasActiveFilters || matchesAll;
735      };
736
737    extSearch.push(filterFn);
738    tableWrapper.data('dtgWooAttributeFilterFn', filterFn);
739  }
740
741  function initWooStockStatusFilter(table) {
742    var tableWrapper = table.closest('.supsystic-tables-wrap'),
743      stockSelect = tableWrapper.find('.stWooFilterStock select'),
744      storedFilterFn = tableWrapper.data('dtgWooStockStatusFilterFn'),
745      extSearch = $.fn.dataTable.ext.search;
746
747    if (storedFilterFn) {
748      var existingIndex = $.inArray(storedFilterFn, extSearch);
749      if (existingIndex !== -1) {
750        extSearch.splice(existingIndex, 1);
751      }
752      tableWrapper.removeData('dtgWooStockStatusFilterFn');
753    }
754
755    if (!stockSelect.length) {
756      return;
757    }
758
759    var tableNode = table.get(0),
760      getRowStockStatus = function (rowNode) {
761        var row = rowNode ? $(rowNode) : $(),
762          rowMeta = row.find('.stbWooRowMeta').first();
763
764        return row.attr('data-stock-status') || (rowMeta.length ? rowMeta.attr('data-stock-status') : '') || '';
765      },
766      filterFn = function (settings, data, dataIndex) {
767        if (settings.nTable !== tableNode || isWooServerSideTable(table)) {
768          return true;
769        }
770
771        var selectedStatus = stockSelect.val();
772        if (!selectedStatus) {
773          return true;
774        }
775
776        var aoData = settings.aoData && settings.aoData[dataIndex] ? settings.aoData[dataIndex] : null,
777          rowNode = aoData && aoData.nTr ? aoData.nTr : null,
778          rowStatus = getRowStockStatus(rowNode);
779
780        return rowStatus === selectedStatus;
781      };
782
783    extSearch.push(filterFn);
784    tableWrapper.data('dtgWooStockStatusFilterFn', filterFn);
785  }
786
787  function initWooPriceFilter(table) {
788    var tableWrapper = table.closest('.supsystic-tables-wrap'),
789      priceFilter = tableWrapper.find('.stWooFilterPrice[data-filter-type="price_range"]'),
790      storedFilterFn = tableWrapper.data('dtgWooPriceFilterFn'),
791      storedState = tableWrapper.data('dtgWooPriceFilterState') || null,
792      extSearch = $.fn.dataTable.ext.search;
793
794    if (storedFilterFn) {
795      var existingIndex = $.inArray(storedFilterFn, extSearch);
796      if (existingIndex !== -1) {
797        extSearch.splice(existingIndex, 1);
798      }
799      tableWrapper.removeData('dtgWooPriceFilterFn');
800    }
801
802    if (!priceFilter.length) {
803      return;
804    }
805
806    var tableNode = table.get(0),
807      getRowPriceRange = function (rowNode) {
808        var row = rowNode ? $(rowNode) : $(),
809          rowMeta = row.find('.stbWooRowMeta').first(),
810          minValue = row.attr('data-price-min') || (rowMeta.length ? rowMeta.attr('data-price-min') : '') || '',
811          maxValue = row.attr('data-price-max') || (rowMeta.length ? rowMeta.attr('data-price-max') : '') || '';
812
813        return {
814          min: parseWooPriceValue(minValue),
815          max: parseWooPriceValue(maxValue),
816        };
817      },
818      filterFn = function (settings, data, dataIndex) {
819        if (settings.nTable !== tableNode || isWooServerSideTable(table)) {
820          return true;
821        }
822
823        var state = getWooPriceFilterState(priceFilter),
824          absoluteMin = parseWooPriceValue(priceFilter.attr('data-min')),
825          absoluteMax = parseWooPriceValue(priceFilter.attr('data-max'));
826
827        state = normalizeWooPriceBounds(state.min, state.max, absoluteMin, absoluteMax);
828        if (state.min === null && state.max === null) {
829          return true;
830        }
831
832        var aoData = settings.aoData && settings.aoData[dataIndex] ? settings.aoData[dataIndex] : null,
833          rowNode = aoData && aoData.nTr ? aoData.nTr : null,
834          rowRange = getRowPriceRange(rowNode),
835          rowMin = rowRange.min,
836          rowMax = rowRange.max;
837
838        if (rowMin === null && rowMax === null) {
839          return false;
840        }
841        if (rowMin === null) {
842          rowMin = rowMax;
843        }
844        if (rowMax === null) {
845          rowMax = rowMin;
846        }
847
848        if (state.min !== null && rowMax < state.min) {
849          return false;
850        }
851        if (state.max !== null && rowMin > state.max) {
852          return false;
853        }
854
855        return true;
856      };
857
858    extSearch.push(filterFn);
859    tableWrapper.data('dtgWooPriceFilterFn', filterFn);
860
861    if (storedState && (storedState.min !== null || storedState.max !== null)) {
862      syncWooSharedPriceState(tableWrapper, storedState);
863    } else {
864      syncWooSharedPriceState(tableWrapper, getWooSharedPriceState(tableWrapper));
865    }
866
867    priceFilter.off('.dtgPrice');
868
869    priceFilter.on('input.dtgPrice change.dtgPrice', '.stWooPriceRange', function () {
870      var absoluteMin = parseWooPriceValue(priceFilter.attr('data-min')),
871        absoluteMax = parseWooPriceValue(priceFilter.attr('data-max')),
872        rangeMin = parseWooPriceValue(priceFilter.find('.stWooPriceRangeMin').val()),
873        rangeMax = parseWooPriceValue(priceFilter.find('.stWooPriceRangeMax').val()),
874        state = normalizeWooPriceBounds(rangeMin, rangeMax, absoluteMin, absoluteMax);
875
876      syncWooSharedPriceState(tableWrapper, state);
877    });
878
879    priceFilter.on('change.dtgPrice', '.stWooPriceInput', function () {
880      var state = getWooPriceFilterState(priceFilter),
881        absoluteMin = parseWooPriceValue(priceFilter.attr('data-min')),
882        absoluteMax = parseWooPriceValue(priceFilter.attr('data-max'));
883
884      state = normalizeWooPriceBounds(state.min, state.max, absoluteMin, absoluteMax);
885      syncWooSharedPriceState(tableWrapper, state);
886      table.api().draw();
887    });
888
889    priceFilter.on('input.dtgPrice', '.stWooPriceRange', function () {
890      if (!isWooServerSideTable(table)) {
891        table.api().draw();
892      }
893    });
894
895    priceFilter.on('change.dtgPrice', '.stWooPriceRange', function () {
896      table.api().draw();
897    });
898  }
899
900  function initWooPriceColumnSearch(table) {
901    var tableWrapper = table.closest('.supsystic-tables-wrap'),
902      columnsConfig = getWooAddonColumnsConfig(tableWrapper),
903      storedFilterFn = tableWrapper.data('dtgWooPriceColumnSearchFilterFn'),
904      storedState = tableWrapper.data('dtgWooPriceColumnSearchState') || null,
905      extSearch = $.fn.dataTable.ext.search,
906      addon = getWooAddon(tableWrapper),
907      priceColumnIndex = -1,
908      priceColumnConfig = null,
909      fromPlaceholder = addon.attr('data-price-from-placeholder') || 'From',
910      toPlaceholder = addon.attr('data-price-to-placeholder') || 'To';
911
912    if (storedFilterFn) {
913      var existingIndex = $.inArray(storedFilterFn, extSearch);
914      if (existingIndex !== -1) {
915        extSearch.splice(existingIndex, 1);
916      }
917      tableWrapper.removeData('dtgWooPriceColumnSearchFilterFn');
918    }
919
920    if (!columnsConfig.length) {
921      return;
922    }
923
924    $.each(columnsConfig, function (index, columnConfig) {
925      if (columnConfig && columnConfig.slug === 'price') {
926        priceColumnIndex = index;
927        priceColumnConfig = columnConfig;
928        return false;
929      }
930    });
931
932    if (priceColumnIndex < 0 || !priceColumnConfig) {
933      return;
934    }
935
936    var originalInput = getWooColumnSearchInputs(tableWrapper, priceColumnIndex).first(),
937      searchField = getWooColumnSearchField(tableWrapper, priceColumnIndex),
938      shouldShow = parseInt(priceColumnConfig.show_price_search_inputs, 10) === 1,
939      customWrap = searchField.find('.stWooColumnPriceSearch');
940
941    if (!searchField.length || !originalInput.length) {
942      return;
943    }
944
945    if (!shouldShow) {
946      if (customWrap.length) {
947        customWrap.remove();
948      }
949      originalInput.removeClass('stHidden').show();
950      return;
951    }
952
953    originalInput.val('').addClass('stHidden').hide();
954
955    if (!customWrap.length) {
956      customWrap = $('<div class="stWooColumnPriceSearch" data-filter-type="price_range"></div>');
957      customWrap.append('<input type="number" class="stWooColumnPriceSearchInput stWooColumnPriceSearchMin" placeholder="' + fromPlaceholder + '" />');
958      customWrap.append('<span class="stWooPriceDash">&ndash;</span>');
959      customWrap.append('<input type="number" class="stWooColumnPriceSearchInput stWooColumnPriceSearchMax" placeholder="' + toPlaceholder + '" />');
960      searchField.append(customWrap);
961    }
962
963    syncWooSharedPriceState(tableWrapper, storedState || getWooSharedPriceState(tableWrapper));
964
965    var applyPriceColumnSearchState = function () {
966      var priceFilter = tableWrapper.find('.stWooFilterPrice[data-filter-type="price_range"]').first(),
967        absoluteMin = priceFilter.length ? parseWooPriceValue(priceFilter.attr('data-min')) : null,
968        absoluteMax = priceFilter.length ? parseWooPriceValue(priceFilter.attr('data-max')) : null,
969        state = getWooPriceColumnSearchState(customWrap, absoluteMin, absoluteMax),
970        column = table.api().column(priceColumnIndex);
971
972      syncWooSharedPriceState(tableWrapper, state);
973      originalInput.val('');
974      if (column.search() !== '') {
975        column.search('');
976      }
977      table.api().draw();
978    };
979
980    customWrap
981      .off('.dtgWooPriceColumn')
982      .on('mousedown.dtgWooPriceColumn click.dtgWooPriceColumn touchstart.dtgWooPriceColumn', 'input', function (e) {
983        e.stopPropagation();
984      })
985      .on('keydown.dtgWooPriceColumn', 'input', function (e) {
986        if (e.key === 'Enter' || e.keyCode === 13) {
987          var debounceTimer = customWrap.data('dtgWooPriceColumnTimer');
988
989          e.preventDefault();
990          e.stopPropagation();
991
992          if (debounceTimer) {
993            clearTimeout(debounceTimer);
994            customWrap.removeData('dtgWooPriceColumnTimer');
995          }
996
997          applyPriceColumnSearchState();
998          return false;
999        }
1000
1001        e.stopPropagation();
1002      })
1003      .on('input.dtgWooPriceColumn', 'input', function () {
1004        var debounceTimer = customWrap.data('dtgWooPriceColumnTimer');
1005
1006        if (debounceTimer) {
1007          clearTimeout(debounceTimer);
1008        }
1009
1010        debounceTimer = setTimeout(function () {
1011          applyPriceColumnSearchState();
1012          customWrap.removeData('dtgWooPriceColumnTimer');
1013        }, 2000);
1014
1015        customWrap.data('dtgWooPriceColumnTimer', debounceTimer);
1016      })
1017      .on('change.dtgWooPriceColumn', 'input', function () {
1018        var debounceTimer = customWrap.data('dtgWooPriceColumnTimer');
1019
1020        if (debounceTimer) {
1021          clearTimeout(debounceTimer);
1022          customWrap.removeData('dtgWooPriceColumnTimer');
1023        }
1024
1025        applyPriceColumnSearchState();
1026      });
1027
1028    var tableNode = table.get(0),
1029      getRowPriceRange = function (rowNode) {
1030        var row = rowNode ? $(rowNode) : $(),
1031          rowMeta = row.find('.stbWooRowMeta').first(),
1032          minValue = row.attr('data-price-min') || (rowMeta.length ? rowMeta.attr('data-price-min') : '') || '',
1033          maxValue = row.attr('data-price-max') || (rowMeta.length ? rowMeta.attr('data-price-max') : '') || '';
1034
1035        return {
1036          min: parseWooPriceValue(minValue),
1037          max: parseWooPriceValue(maxValue),
1038        };
1039      },
1040      filterFn = function (settings, data, dataIndex) {
1041        if (settings.nTable !== tableNode || isWooServerSideTable(table)) {
1042          return true;
1043        }
1044
1045        var state = tableWrapper.data('dtgWooPriceColumnSearchState') || {},
1046          stateMin = state.min !== null && typeof state.min !== 'undefined' ? state.min : null,
1047          stateMax = state.max !== null && typeof state.max !== 'undefined' ? state.max : null;
1048
1049        if (stateMin === null && stateMax === null) {
1050          return true;
1051        }
1052
1053        var aoData = settings.aoData && settings.aoData[dataIndex] ? settings.aoData[dataIndex] : null,
1054          rowNode = aoData && aoData.nTr ? aoData.nTr : null,
1055          rowRange = getRowPriceRange(rowNode),
1056          rowMin = rowRange.min,
1057          rowMax = rowRange.max;
1058
1059        if (rowMin === null && rowMax === null) {
1060          return false;
1061        }
1062        if (rowMin === null) {
1063          rowMin = rowMax;
1064        }
1065        if (rowMax === null) {
1066          rowMax = rowMin;
1067        }
1068
1069        if (stateMin !== null && rowMax < stateMin) {
1070          return false;
1071        }
1072        if (stateMax !== null && rowMin > stateMax) {
1073          return false;
1074        }
1075
1076        return true;
1077      };
1078
1079    extSearch.push(filterFn);
1080    tableWrapper.data('dtgWooPriceColumnSearchFilterFn', filterFn);
1081  }
1082
1083  function getWooColumnToggleKey(table) {
1084    return (table.attr('id') || 'woo-table').replace(/[^A-Za-z0-9_-]/g, '');
1085  }
1086
1087  function getWooColumnLabel(column) {
1088    var header = $(column.header());
1089    if (!header.length) {
1090      return '';
1091    }
1092
1093    var clone = header.clone();
1094    clone.find('.stbColumnSearchField, input, select, textarea, script, style').remove();
1095
1096    return $.trim(clone.text()).replace(/\s+/g, ' ');
1097  }
1098
1099  function getWooColumnsConfig(toggleWrap) {
1100    var config = toggleWrap.attr('data-columns-config');
1101
1102    if (!config) {
1103      return [];
1104    }
1105
1106    try {
1107      config = JSON.parse(config);
1108    } catch (e) {
1109      config = [];
1110    }
1111
1112    return $.isArray(config) ? config : [];
1113  }
1114
1115  function getWooConfiguredColumnLabel(columnConfig, column) {
1116    var configuredLabel = '';
1117
1118    if (columnConfig) {
1119      if (parseInt(columnConfig.show_display_name, 10) && columnConfig.display_name) {
1120        configuredLabel = $.trim(columnConfig.display_name);
1121      } else if (columnConfig.original_name) {
1122        configuredLabel = $.trim(columnConfig.original_name);
1123      } else if (columnConfig.display_name) {
1124        configuredLabel = $.trim(columnConfig.display_name);
1125      }
1126    }
1127
1128    return configuredLabel || getWooColumnLabel(column);
1129  }
1130
1131  function isWooToggleEligibleColumn(column, columnConfig) {
1132    var header = $(column.header()),
1133      label = getWooConfiguredColumnLabel(columnConfig, column);
1134
1135    if (!header.length || !label) {
1136      return false;
1137    }
1138
1139    if (header.hasClass('control') || header.hasClass('dtr-control')) {
1140      return false;
1141    }
1142
1143    if (columnConfig && parseInt(columnConfig.hide_column, 10)) {
1144      return false;
1145    }
1146
1147    return true;
1148  }
1149
1150  function syncWooColumnToggleItemState(item, column) {
1151    var isVisible = column.visible();
1152
1153    item.toggleClass('is-active', isVisible);
1154    item.find('.stbWooColumnsToggleCheckbox').prop('checked', isVisible);
1155    item.attr('aria-pressed', isVisible ? 'true' : 'false');
1156  }
1157
1158  function updateWooMobileDropdownViewportOffset(toggleWrap, toggleButton) {
1159    if (!toggleWrap || !toggleWrap.length || !toggleButton || !toggleButton.length) {
1160      return;
1161    }
1162
1163    if (window.matchMedia && !window.matchMedia('(max-width: 768px)').matches) {
1164      toggleWrap[0].style.removeProperty('--stb-woo-toggle-left');
1165      return;
1166    }
1167
1168    toggleWrap.css('--stb-woo-toggle-left', toggleButton.get(0).getBoundingClientRect().left + 'px');
1169  }
1170
1171  function bindWooMobileDropdownViewportOffset(toggleWrap, toggleButton, namespace) {
1172    var updatePosition = function () {
1173      updateWooMobileDropdownViewportOffset(toggleWrap, toggleButton);
1174    };
1175
1176    updatePosition();
1177    $(window).off('resize' + namespace).on('resize' + namespace, updatePosition);
1178    $(window).off('scroll' + namespace).on('scroll' + namespace, updatePosition);
1179    $(document).off('scroll' + namespace).on('scroll' + namespace, updatePosition);
1180  }
1181
1182  function closeWooToggleDropdowns(tableWrapper, exceptWrap) {
1183    if (!tableWrapper || !tableWrapper.length) {
1184      return;
1185    }
1186
1187    tableWrapper.find('.stbWooColumnsToggle').each(function () {
1188      var wrap = $(this);
1189      if (exceptWrap && exceptWrap.length && wrap.is(exceptWrap)) {
1190        return;
1191      }
1192
1193      wrap.find('.stbWooColumnsToggleButton').attr('aria-expanded', 'false');
1194      wrap.find('.stbWooColumnsToggleDropdown').addClass('stHidden');
1195    });
1196
1197    tableWrapper.find('.stbWooExportToggle').each(function () {
1198      var wrap = $(this);
1199      if (exceptWrap && exceptWrap.length && wrap.is(exceptWrap)) {
1200        return;
1201      }
1202
1203      wrap.find('.stbWooExportToggleButton').attr('aria-expanded', 'false');
1204      wrap.find('.stbWooExportToggleDropdown').addClass('stHidden');
1205    });
1206
1207    tableWrapper.find('.stbWooCategoryFilter').each(function () {
1208      var wrap = $(this);
1209      if (exceptWrap && exceptWrap.length && wrap.is(exceptWrap)) {
1210        return;
1211      }
1212
1213      wrap.find('.stbWooCategoryFilterButton').attr('aria-expanded', 'false');
1214      wrap.find('.stbWooCategoryFilterDropdown').addClass('stHidden');
1215    });
1216  }
1217
1218  function syncWooTableLayoutAfterColumnToggle(table, api) {
1219    var tableWrapper = table.closest('.supsystic-tables-wrap'),
1220      tableId = table.data('id'),
1221      syncLayout = function () {
1222        var scrollBody = tableWrapper.find('.dataTables_scrollBody'),
1223          scrollBodyTable = scrollBody.find('.supsystic-table');
1224
1225        if (scrollBody.length && scrollBodyTable.length && scrollBodyTable.is(':visible')) {
1226          if (scrollBody.width() > scrollBodyTable.width() || tableWrapper.width() > scrollBodyTable.width()) {
1227            scrollBody.width(scrollBodyTable.width());
1228            tableWrapper.find('.dataTables_scrollHead, .dataTables_scrollFoot, .dataTables_scrollBody').width(scrollBodyTable.width() + 1);
1229          }
1230        }
1231
1232        if (api.responsive && typeof api.responsive.recalc === 'function') {
1233          api.responsive.recalc();
1234        }
1235        api.columns.adjust();
1236
1237        if (typeof app.getTableInstanceById === 'function') {
1238          var instance = app.getTableInstanceById(tableId);
1239          if (instance && typeof instance.fnAdjustColumnSizing === 'function') {
1240            instance.fnAdjustColumnSizing(false);
1241          }
1242        }
1243      };
1244
1245    window.setTimeout(syncLayout, 0);
1246    window.setTimeout(syncLayout, 120);
1247    window.setTimeout(syncLayout, 320);
1248  }
1249
1250  function sanitizeWooExportFileName(value) {
1251    value = $.trim(value || '');
1252    if (!value) {
1253      value = 'table';
1254    }
1255
1256    value = value.replace(/[\\\/:*?"<>|]+/g, '-').replace(/\s+/g, ' ');
1257
1258    return $.trim(value) || 'table';
1259  }
1260
1261  function removeWooExportColumnByIndex(table, columnIndex) {
1262    if (!table || !table.length || columnIndex < 0) {
1263      return;
1264    }
1265
1266    table.find('tr').each(function () {
1267      $(this).children('th, td').eq(columnIndex).remove();
1268    });
1269  }
1270
1271  function getWooVisibleExportTable(wrapper, exportType) {
1272    if (!wrapper || !wrapper.length) {
1273      return $();
1274    }
1275
1276    var table = wrapper.find('.supsystic-table:first');
1277    if (!table.length) {
1278      return $();
1279    }
1280
1281    var tableId = table.data('id'),
1282      tableHtmlId = '#supsystic-table-' + tableId,
1283      clonedWrapper = wrapper.clone(),
1284      clonedTable = clonedWrapper.find(tableHtmlId).first(),
1285      caption = clonedWrapper.find(tableHtmlId + ' caption:first').clone(),
1286      thead = clonedWrapper.find('.dataTables_scrollHead thead:first').clone(),
1287      tbody = clonedWrapper.find(tableHtmlId + ' tbody:first').clone(),
1288      tfoot = clonedWrapper.find('.dataTables_scrollFoot tfoot:first').clone();
1289
1290    if (!thead.length) {
1291      thead = clonedWrapper.find(tableHtmlId + ' thead:first').clone();
1292    }
1293    if (!tfoot.length) {
1294      tfoot = clonedWrapper.find(tableHtmlId + ' tfoot:first').clone();
1295    }
1296
1297    if (typeof _stbPrepareTableToExport === 'function') {
1298      clonedWrapper = _stbPrepareTableToExport(clonedWrapper, table, {
1299        type: exportType,
1300        useClonedId: false,
1301      });
1302      clonedTable = clonedWrapper.find(tableHtmlId).first();
1303    }
1304
1305    if (typeof app.WooProExportPrepare === 'function') {
1306      clonedWrapper = app.WooProExportPrepare(table, clonedWrapper, {
1307        type: exportType,
1308      });
1309      clonedTable = clonedWrapper.find(tableHtmlId).first();
1310    }
1311
1312    if (!clonedTable.length) {
1313      return $();
1314    }
1315
1316    clonedWrapper.find('.dataTables_wrapper').each(function () {
1317      var currentWrapper = $(this),
1318        currentTable = currentWrapper.find(tableHtmlId).first();
1319
1320      if (currentTable.length) {
1321        currentWrapper.empty().append(currentTable);
1322      }
1323    });
1324
1325    clonedTable.empty();
1326    if (caption.length) {
1327      clonedTable.append(caption);
1328    }
1329    if (thead.length) {
1330      clonedTable.append(thead);
1331    }
1332    if (tbody.length) {
1333      clonedTable.append(tbody);
1334    }
1335    if (tfoot.length) {
1336      clonedTable.append(tfoot);
1337    }
1338
1339    clonedTable.find('.stbColumnsSearchWrapper, .dataTables_empty, .tblEditLink').remove();
1340    clonedTable.find('input, textarea, select').each(function () {
1341      var field = $(this),
1342        replacement = '';
1343
1344      if (field.is('select')) {
1345        replacement = field.find('option:selected').map(function () {
1346          return $.trim($(this).text());
1347        }).get().join(', ');
1348      } else if (field.is(':checkbox')) {
1349        replacement = field.is(':checked') ? 'Yes' : '';
1350      } else {
1351        replacement = field.val();
1352      }
1353
1354      field.replaceWith(document.createTextNode(replacement));
1355    });
1356
1357    clonedTable.find('a').each(function () {
1358      $(this).replaceWith(document.createTextNode($.trim($(this).text())));
1359    });
1360
1361    if (exportType === 'csv' || exportType === 'xls' || exportType === 'xlsx') {
1362      var addToCartColumnIndex = -1,
1363        addToCartCell = clonedTable
1364          .find('tbody td')
1365          .filter(function () {
1366            return $(this).find('.stAddToCartWrapper, .stAddToCartButWrapp, .stAddToCart, .stAddMulty').length > 0;
1367          })
1368          .first();
1369
1370      if (addToCartCell.length) {
1371        addToCartColumnIndex = addToCartCell.get(0).cellIndex;
1372      }
1373
1374      if (addToCartColumnIndex >= 0) {
1375        removeWooExportColumnByIndex(clonedTable, addToCartColumnIndex);
1376      }
1377
1378      clonedTable.find('img').each(function () {
1379        var image = $(this),
1380          imageSrc = $.trim(image.attr('src') || '');
1381
1382        image.replaceWith(document.createTextNode(imageSrc));
1383      });
1384    }
1385
1386    clonedTable.find('.screen-reader-text, .woocommerce-Price-currencySymbol[aria-hidden="true"]').each(function () {
1387      var current = $(this);
1388
1389      if (current.hasClass('woocommerce-Price-currencySymbol')) {
1390        current.removeAttr('aria-hidden');
1391        return;
1392      }
1393
1394      current.remove();
1395    });
1396
1397    clonedTable.find('del').css({
1398      'text-decoration': 'line-through',
1399      opacity: '1',
1400    });
1401    clonedTable.find('ins').css({
1402      'text-decoration': 'none',
1403      'font-weight': '700',
1404      background: 'transparent',
1405    });
1406
1407    clonedTable.find('.stbWooRowMeta').remove();
1408    clonedTable.find('th, td').filter(function () {
1409      return $(this).css('display') === 'none' || $(this).hasClass('stHidden');
1410    }).remove();
1411
1412    return clonedTable;
1413  }
1414
1415  function getWooExportRows(table) {
1416    var rows = [];
1417
1418    table.find('tr').each(function () {
1419      var currentRow = [],
1420        hasCells = false;
1421
1422      $(this)
1423        .children('th, td')
1424        .each(function () {
1425          var cell = $(this),
1426            cellClone = cell.clone();
1427
1428          cellClone.find('.screen-reader-text').remove();
1429          cellClone.find('.woocommerce-Price-currencySymbol[aria-hidden="true"]').removeAttr('aria-hidden');
1430
1431          var text = $.trim(cellClone.text().replace(/\s+/g, ' '));
1432
1433          currentRow.push(text);
1434          hasCells = true;
1435        });
1436
1437      if (hasCells) {
1438        rows.push(currentRow);
1439      }
1440    });
1441
1442    return rows;
1443  }
1444
1445  function buildWooCsvContent(rows) {
1446    return $.map(rows, function (row) {
1447      return $.map(row, function (cell) {
1448        cell = cell == null ? '' : String(cell);
1449        return '"' + cell.replace(/"/g, '""') + '"';
1450      }).join(',');
1451    }).join('\r\n');
1452  }
1453
1454  function buildWooExcelHtml(table, title) {
1455    var html = [
1456      '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">',
1457      '<head>',
1458      '<meta charset="utf-8">',
1459      '<meta name="ProgId" content="Excel.Sheet">',
1460      '<meta name="Generator" content="Supsystic Tables">',
1461      '<title>' + $('<div/>').text(title).html() + '</title>',
1462      '<style>',
1463      'table{border-collapse:collapse;width:100%;}',
1464      'th,td{border:1px solid #d7dce1;padding:6px 8px;text-align:left;vertical-align:top;}',
1465      'th{font-weight:700;}',
1466      'del{text-decoration:line-through;opacity:1;}',
1467      'ins{text-decoration:none;font-weight:700;background:transparent;}',
1468      '</style>',
1469      '</head>',
1470      '<body>',
1471      $('<div/>').append(table.clone()).html(),
1472      '</body>',
1473      '</html>',
1474    ];
1475
1476    return html.join('');
1477  }
1478
1479  function downloadWooExportBlob(content, fileName, mimeType) {
1480    var blob = new Blob([content], { type: mimeType }),
1481      url = window.URL.createObjectURL(blob),
1482      link = document.createElement('a');
1483
1484    link.href = url;
1485    link.download = fileName;
1486    document.body.appendChild(link);
1487    link.click();
1488    document.body.removeChild(link);
1489
1490    window.setTimeout(function () {
1491      window.URL.revokeObjectURL(url);
1492    }, 1000);
1493  }
1494
1495  function exportWooVisibleTable(tableWrapper, exportType) {
1496    if (!tableWrapper || !tableWrapper.length) {
1497      return false;
1498    }
1499
1500    var exportTable = getWooVisibleExportTable(tableWrapper, exportType);
1501    if (!exportTable.length) {
1502      return false;
1503    }
1504
1505    var sourceTable = tableWrapper.find('.supsystic-table:first'),
1506      fileBaseName = sanitizeWooExportFileName(sourceTable.attr('data-title') || sourceTable.data('title') || document.title || 'table');
1507
1508    if (exportType === 'csv') {
1509      var csvRows = getWooExportRows(exportTable),
1510        csvContent = '\uFEFF' + buildWooCsvContent(csvRows);
1511
1512      downloadWooExportBlob(csvContent, fileBaseName + '.csv', 'text/csv;charset=utf-8;');
1513      return true;
1514    }
1515
1516    if (exportType === 'xls' || exportType === 'xlsx') {
1517      var excelHtml = buildWooExcelHtml(exportTable, fileBaseName),
1518        excelMime = exportType === 'xlsx'
1519          ? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8;'
1520          : 'application/vnd.ms-excel;charset=utf-8;';
1521
1522      downloadWooExportBlob('\uFEFF' + excelHtml, fileBaseName + '.' + exportType, excelMime);
1523      return true;
1524    }
1525
1526    return false;
1527  }
1528
1529  function initWooColumnVisibilityToggle(table) {
1530    var tableWrapper = table.closest('.supsystic-tables-wrap'),
1531      toggleWrap = tableWrapper.find('.stbWooColumnsToggle');
1532
1533    if (!toggleWrap.length) {
1534      return;
1535    }
1536
1537    var api = table.api(),
1538      toggleButton = toggleWrap.find('.stbWooColumnsToggleButton'),
1539      toggleDropdown = toggleWrap.find('.stbWooColumnsToggleDropdown'),
1540      toggleList = toggleWrap.find('.stbWooColumnsToggleList'),
1541      columnsConfig = getWooColumnsConfig(toggleWrap),
1542      namespace = '.dtgWooColumns' + getWooColumnToggleKey(table),
1543      eligibleColumns = [];
1544
1545    bindWooMobileDropdownViewportOffset(toggleWrap, toggleButton, namespace);
1546
1547    api.columns().every(function (index) {
1548      var column = api.column(index),
1549        columnConfig = columnsConfig[index] || null,
1550        label = getWooConfiguredColumnLabel(columnConfig, column);
1551
1552      if (!isWooToggleEligibleColumn(column, columnConfig)) {
1553        return;
1554      }
1555
1556      eligibleColumns.push({
1557        index: index,
1558        label: label,
1559      });
1560    });
1561
1562    toggleList.empty();
1563
1564    if (!eligibleColumns.length) {
1565      toggleWrap.addClass('stHidden');
1566      return;
1567    }
1568
1569    toggleWrap.removeClass('stHidden');
1570
1571    $.each(eligibleColumns, function (_, itemData) {
1572      var item = $('<button type="button" class="stbWooColumnsToggleItem"></button>');
1573      item.attr({
1574        'data-column-index': itemData.index,
1575        'data-column-label': itemData.label,
1576      });
1577      item.html(
1578        '<span class="stbWooColumnsToggleItemInner">' +
1579          '<input type="checkbox" class="stbWooColumnsToggleCheckbox" />' +
1580          '<span class="stbWooColumnsToggleItemLabel"></span>' +
1581          '</span>'
1582      );
1583      item.find('.stbWooColumnsToggleItemLabel').text(itemData.label);
1584      syncWooColumnToggleItemState(item, api.column(itemData.index));
1585      toggleList.append(item);
1586    });
1587
1588    toggleButton.off('click' + namespace).on('click' + namespace, function (e) {
1589      e.preventDefault();
1590      e.stopPropagation();
1591
1592      var expanded = toggleButton.attr('aria-expanded') === 'true';
1593      if (!expanded) {
1594        closeWooToggleDropdowns(tableWrapper, toggleWrap);
1595      }
1596      updateWooMobileDropdownViewportOffset(toggleWrap, toggleButton);
1597      toggleButton.attr('aria-expanded', expanded ? 'false' : 'true');
1598      toggleDropdown.toggleClass('stHidden', expanded);
1599    });
1600
1601    toggleWrap.off('click' + namespace, '.stbWooColumnsToggleItem').on('click' + namespace, '.stbWooColumnsToggleItem', function (e) {
1602      e.preventDefault();
1603
1604      var item = $(this),
1605        columnIndex = parseInt(item.attr('data-column-index'), 10);
1606
1607      if (isNaN(columnIndex)) {
1608        return;
1609      }
1610
1611      var column = api.column(columnIndex);
1612      column.visible(!column.visible(), false);
1613
1614      if (api.responsive && typeof api.responsive.recalc === 'function') {
1615        api.responsive.recalc();
1616      }
1617
1618      api.columns.adjust().draw(false);
1619      syncWooTableLayoutAfterColumnToggle(table, api);
1620      syncWooColumnToggleItemState(item, column);
1621    });
1622
1623    api.off('column-visibility' + namespace).on('column-visibility' + namespace, function (e, settings, columnIndex) {
1624      var item = toggleList.find('.stbWooColumnsToggleItem[data-column-index="' + columnIndex + '"]');
1625
1626      if (item.length) {
1627        syncWooColumnToggleItemState(item, api.column(columnIndex));
1628      }
1629    });
1630
1631    $(document).off('click' + namespace).on('click' + namespace, function (e) {
1632      if ($(e.target).closest('.stbWooColumnsToggle').length) {
1633        return;
1634      }
1635
1636      toggleButton.attr('aria-expanded', 'false');
1637      toggleDropdown.addClass('stHidden');
1638    });
1639  }
1640
1641  function initWooFiltersToggle(table) {
1642    var tableWrapper = table.closest('.supsystic-tables-wrap'),
1643      toggleWrap = tableWrapper.find('.stbWooFilterToggle'),
1644      filtersWrap = tableWrapper.find('.stbWooFilterWrapper').first();
1645
1646    if (!toggleWrap.length || !filtersWrap.length) {
1647      return;
1648    }
1649
1650    var toggleButton = toggleWrap.find('.stbWooFiltersToggleButton'),
1651      resetButton = toggleWrap.find('.stbResetWooFilters'),
1652      namespace = '.dtgWooFiltersToggle' + getWooColumnToggleKey(table),
1653      setExpandedState = function (expanded) {
1654        toggleButton.attr('aria-expanded', expanded ? 'true' : 'false');
1655        filtersWrap.toggleClass('stHidden', !expanded);
1656        if (resetButton.length) {
1657          resetButton.toggleClass('stHidden', !expanded);
1658        }
1659      };
1660
1661    setExpandedState(toggleButton.attr('aria-expanded') === 'true');
1662
1663    toggleButton.off('click' + namespace).on('click' + namespace, function (e) {
1664      e.preventDefault();
1665      e.stopPropagation();
1666
1667      setExpandedState(toggleButton.attr('aria-expanded') !== 'true');
1668    });
1669  }
1670
1671  function initWooExportToggle(table) {
1672    var tableWrapper = table.closest('.supsystic-tables-wrap'),
1673      toggleWrap = tableWrapper.find('.stbWooExportToggle');
1674
1675    if (!toggleWrap.length) {
1676      return;
1677    }
1678
1679    var toggleButton = toggleWrap.find('.stbWooExportToggleButton'),
1680      toggleDropdown = toggleWrap.find('.stbWooExportToggleDropdown'),
1681      namespace = '.dtgWooExportToggle' + getWooColumnToggleKey(table);
1682
1683    bindWooMobileDropdownViewportOffset(toggleWrap, toggleButton, namespace);
1684
1685    if (!toggleWrap.find('.stbWooExportToggleItem').length) {
1686      toggleWrap.addClass('stHidden');
1687      return;
1688    }
1689
1690    toggleButton.off('click' + namespace).on('click' + namespace, function (e) {
1691      e.preventDefault();
1692      e.stopPropagation();
1693
1694      var expanded = toggleButton.attr('aria-expanded') === 'true';
1695      if (!expanded) {
1696        closeWooToggleDropdowns(tableWrapper, toggleWrap);
1697      }
1698      updateWooMobileDropdownViewportOffset(toggleWrap, toggleButton);
1699      toggleButton.attr('aria-expanded', expanded ? 'false' : 'true');
1700      toggleDropdown.toggleClass('stHidden', expanded);
1701    });
1702
1703    toggleWrap.off('click' + namespace, '.stbWooExportToggleItem').on('click' + namespace, '.stbWooExportToggleItem', function () {
1704      toggleButton.attr('aria-expanded', 'false');
1705      toggleDropdown.addClass('stHidden');
1706    });
1707
1708    toggleWrap
1709      .find('.export-csv, .export-xls, .export-xlsx')
1710      .off('click.dtgWooFrontendFileExport')
1711      .on('click.dtgWooFrontendFileExport', function (e) {
1712        var exportLink = $(this),
1713          exportType = exportLink.attr('data-export-type') || '';
1714
1715        if (!exportType) {
1716          return false;
1717        }
1718
1719        e.preventDefault();
1720        e.stopPropagation();
1721        if (typeof e.stopImmediatePropagation === 'function') {
1722          e.stopImmediatePropagation();
1723        }
1724
1725        toggleButton.attr('aria-expanded', 'false');
1726        toggleDropdown.addClass('stHidden');
1727        exportWooVisibleTable(tableWrapper, exportType);
1728
1729        return false;
1730      });
1731
1732    $(document).off('click' + namespace).on('click' + namespace, function (e) {
1733      if ($(e.target).closest('.stbWooExportToggle').length) {
1734        return;
1735      }
1736
1737      toggleButton.attr('aria-expanded', 'false');
1738      toggleDropdown.addClass('stHidden');
1739    });
1740  }
1741
1742  function initWooCategoryListFilter(table) {
1743    var tableWrapper = table.closest('.supsystic-tables-wrap'),
1744      filterWrap = tableWrapper.find('.stbWooCategoryFilter').first(),
1745      storedFilterFn = tableWrapper.data('dtgWooCategoryFilterFn'),
1746      extSearch = $.fn.dataTable.ext.search;
1747
1748    if (storedFilterFn) {
1749      var existingIndex = $.inArray(storedFilterFn, extSearch);
1750      if (existingIndex !== -1) {
1751        extSearch.splice(existingIndex, 1);
1752      }
1753      tableWrapper.removeData('dtgWooCategoryFilterFn');
1754    }
1755
1756    if (!filterWrap.length) {
1757      return;
1758    }
1759
1760    var api = table.api(),
1761      tableNode = table.get(0),
1762      toggleButton = filterWrap.find('.stbWooCategoryFilterButton'),
1763      dropdown = filterWrap.find('.stbWooCategoryFilterDropdown'),
1764      toggleAllButton = filterWrap.find('.stbWooCategoryFilterToggleAll'),
1765      namespace = '.dtgWooCategoryFilter' + getWooColumnToggleKey(table),
1766      applyCategoryFilter = function () {
1767        api.draw();
1768      },
1769      setExpandedState = function (expanded, applyOnClose) {
1770        var wasExpanded = toggleButton.attr('aria-expanded') === 'true';
1771
1772        updateWooMobileDropdownViewportOffset(filterWrap, toggleButton);
1773        toggleButton.attr('aria-expanded', expanded ? 'true' : 'false');
1774        dropdown.toggleClass('stHidden', !expanded);
1775
1776        if (!expanded && wasExpanded && applyOnClose) {
1777          applyCategoryFilter();
1778        }
1779      },
1780      filterFn = function (settings, data, dataIndex) {
1781        if (settings.nTable !== tableNode || isWooServerSideTable(table)) {
1782          return true;
1783        }
1784
1785        var selection = getWooCategoryFilterSelection(tableWrapper);
1786        if (!selection.total || selection.selected.length === selection.total) {
1787          return true;
1788        }
1789        if (!selection.selected.length) {
1790          return false;
1791        }
1792
1793        var aoData = settings.aoData && settings.aoData[dataIndex] ? settings.aoData[dataIndex] : null,
1794          rowNode = aoData && aoData.nTr ? aoData.nTr : null,
1795          row = rowNode ? $(rowNode) : $(),
1796          rowMeta = row.find('.stbWooRowMeta').first(),
1797          rawCategories = row.attr('data-woo-categories') || (rowMeta.length ? rowMeta.attr('data-woo-categories') : '') || '',
1798          rowCategories = [];
1799
1800        if (rawCategories) {
1801          try {
1802            rowCategories = JSON.parse(rawCategories) || [];
1803          } catch (e) {
1804            rowCategories = [];
1805          }
1806        }
1807
1808        rowCategories = $.map(rowCategories, function (value) {
1809          value = parseInt(value, 10);
1810          return isNaN(value) ? null : value;
1811        });
1812
1813        if (!rowCategories.length) {
1814          return false;
1815        }
1816
1817        for (var i = 0; i < selection.selected.length; i++) {
1818          if ($.inArray(selection.selected[i], rowCategories) !== -1) {
1819            return true;
1820          }
1821        }
1822
1823        return false;
1824      };
1825
1826    extSearch.push(filterFn);
1827    tableWrapper.data('dtgWooCategoryFilterFn', filterFn);
1828    bindWooMobileDropdownViewportOffset(filterWrap, toggleButton, namespace);
1829
1830    filterWrap.find('.stbWooCategoryFilterItem').each(function () {
1831      syncWooCategoryFilterItemState($(this), $(this).find('.stbWooCategoryFilterCheckbox').is(':checked'));
1832    });
1833
1834    toggleButton.off('click' + namespace).on('click' + namespace, function (e) {
1835      e.preventDefault();
1836      e.stopPropagation();
1837
1838      if (toggleButton.attr('aria-expanded') !== 'true') {
1839        closeWooToggleDropdowns(tableWrapper, filterWrap);
1840      }
1841      setExpandedState(toggleButton.attr('aria-expanded') !== 'true', true);
1842    });
1843
1844    filterWrap.off('click' + namespace, '.stbWooCategoryFilterItem').on('click' + namespace, '.stbWooCategoryFilterItem', function (e) {
1845      e.preventDefault();
1846      e.stopPropagation();
1847
1848      var item = $(this),
1849        checkbox = item.find('.stbWooCategoryFilterCheckbox'),
1850        checked = !checkbox.is(':checked');
1851
1852      syncWooCategoryFilterItemState(item, checked);
1853    });
1854
1855    toggleAllButton.off('click' + namespace).on('click' + namespace, function (e) {
1856      e.preventDefault();
1857      e.stopPropagation();
1858
1859      var items = filterWrap.find('.stbWooCategoryFilterItem'),
1860        shouldCheckAll = items.filter(function () {
1861          return !$(this).find('.stbWooCategoryFilterCheckbox').is(':checked');
1862        }).length > 0;
1863
1864      items.each(function () {
1865        syncWooCategoryFilterItemState($(this), shouldCheckAll);
1866      });
1867    });
1868
1869    dropdown.off('mouseleave' + namespace).on('mouseleave' + namespace, function () {
1870      if (toggleButton.attr('aria-expanded') === 'true') {
1871        setExpandedState(false, true);
1872      }
1873    });
1874
1875    $(document).off('click' + namespace).on('click' + namespace, function (e) {
1876      if ($(e.target).closest('.stbWooCategoryFilter').length) {
1877        return;
1878      }
1879
1880      setExpandedState(false, true);
1881    });
1882  }
1883
1884  app.getServerSideSearchParams = function (table, searchParams) {
1885    var params = $.extend(true, {}, searchParams || {}),
1886      wooFilters = getWooServerSideFilters(table);
1887
1888    if (wooFilters.length) {
1889      params.wooFilters = wooFilters;
1890    } else if (typeof params.wooFilters !== 'undefined') {
1891      delete params.wooFilters;
1892    }
1893
1894    return params;
1895  };
1896  app.setTableAddFilters = function (table) {
1897    var self = this,
1898      tableWrapper = table.closest('.supsystic-tables-wrap');
1899
1900    initWooExportToggle(table);
1901    initWooColumnVisibilityToggle(table);
1902    initWooFiltersToggle(table);
1903    initWooCategoryListFilter(table);
1904    initWooStockStatusFilter(table);
1905    initWooAttributeFilters(table);
1906    initWooPriceFilter(table);
1907    initWooPriceColumnSearch(table);
1908    initWooColumnSearchVisibility(table);
1909
1910    var filtersInput = tableWrapper.find('.stbWooFilterWrapper select');
1911    filtersInput.each(function () {
1912      var oControl = $(this),
1913        filterType = oControl.attr('data-filter-type') || '',
1914        tableId = table.attr('id'),
1915        columns = table.api().settings()[0].aoColumns,
1916        keys = oControl.attr('data-column-keys'),
1917        columnIds = typeof keys !== 'undefined' ? keys.split(',').map(Number) : [],
1918        serverSide = isWooServerSideTable(table);
1919
1920      if (filterType === 'stock_status' || filterType === 'attribute_term') {
1921        oControl.off('change.dtg').on('change.dtg', function () {
1922          table.api().draw();
1923        });
1924        return;
1925      }
1926
1927      if (columnIds.length > 0) {
1928        oControl.off('change.dtg').on('change.dtg', function () {
1929          var value = $(this).val();
1930          if (serverSide) {
1931            $.each(columnIds, function (_, numColumn) {
1932              getWooColumnSearchInputs(tableWrapper, numColumn).each(function () {
1933                $(this).val('');
1934              });
1935              table.api().column(numColumn).search('');
1936            });
1937            table.api().draw();
1938            return;
1939          }
1940          for (var i = 0; i < columnIds.length; i++) {
1941            var numColumn = columnIds[i],
1942              column = table.api().column(numColumn);
1943            if (column.search() !== value) {
1944              if (value != '') {
1945                getWooColumnSearchInputs(tableWrapper, numColumn).each(function () {
1946                  $(this).val('');
1947                });
1948              }
1949              column.search(value).draw();
1950              setTimeout(function () {
1951                column.draw();
1952              }, 50);
1953              return;
1954            }
1955          }
1956        });
1957      }
1958    });
1959
1960    tableWrapper
1961      .find('.stbResetWooFilters')
1962      .off('click')
1963      .on('click', function (e) {
1964        e.preventDefault();
1965        self.resetTableAddFilters(table);
1966      });
1967  };
1968
1969  app.resetTableAddFilters = function (table) {
1970    var doDraw = false,
1971      tableWrapper = table.closest('.supsystic-tables-wrap');
1972
1973    tableWrapper.find('.stbWooCategoryFilter').each(function () {
1974      var filterWrap = $(this),
1975        items = filterWrap.find('.stbWooCategoryFilterItem'),
1976        selection = getWooCategoryFilterSelection(tableWrapper);
1977
1978      if (selection.total && selection.selected.length !== selection.total) {
1979        items.each(function () {
1980          syncWooCategoryFilterItemState($(this), true);
1981        });
1982        doDraw = true;
1983      }
1984    });
1985
1986    tableWrapper
1987      .find('.stbWooFilterWrapper select')
1988      .each(function () {
1989        var select = $(this),
1990          firstVal = select.find('option:first').val();
1991        if (select.val() != firstVal) {
1992          select.val(firstVal).trigger('change.dtg');
1993          doDraw = true;
1994        }
1995      });
1996
1997    tableWrapper.find('.stWooFilterPrice[data-filter-type="price_range"]').each(function () {
1998      var priceFilter = $(this);
1999
2000      syncWooPriceFilterUi(priceFilter, {
2001        min: null,
2002        max: null,
2003      });
2004      storeWooPriceFilterState(tableWrapper, {
2005        min: null,
2006        max: null,
2007      });
2008      doDraw = true;
2009    });
2010
2011    tableWrapper.find('.stWooColumnPriceSearch').each(function () {
2012      var priceSearch = $(this);
2013
2014      priceSearch.find('.stWooColumnPriceSearchMin, .stWooColumnPriceSearchMax').val('');
2015      storeWooPriceColumnSearchState(tableWrapper, {
2016        min: null,
2017        max: null,
2018      });
2019      doDraw = true;
2020    });
2021
2022    if (doDraw) {
2023      table.api().draw();
2024    }
2025  };
2026
2027  app._beforeShowWooTable = function ($table) {
2028    var self = this,
2029      tableWrapper = $table.closest('.supsystic-tables-wrap'),
2030      addonData = tableWrapper.find('.supsystic-tables-addon');
2031    if (addonData.length == 0) return;
2032
2033    var beforeBlock = addonData.find('.stb-before-woo'),
2034      caption = tableWrapper.find('.supsystic-table-caption:first');
2035    if (beforeBlock.length) {
2036      if (caption.length) {
2037        caption.after(beforeBlock);
2038      } else {
2039        tableWrapper.prepend(beforeBlock);
2040      }
2041    }
2042  };
2043
2044  app._initTablesOnPageWoo = function (id) {
2045    var supsysticTables = $(typeof id != 'undefined' ? '#supsystic-table-' + id + ':not(.dataTable)' : '.supsystic-table');
2046
2047    supsysticTables.each(function () {
2048      var $curTable = $(this);
2049
2050      $curTable.on('beforeShowTable', function () {
2051        app._beforeShowWooTable($curTable);
2052      });
2053    });
2054  };
2055})(window.jQuery, window.supsystic.Tables);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.