PageSourceSearch

https://www.wheelheels.de/wp-content/plugins/variation-swatches-fo…/assets/js/frontend.js?ver=2.2.5

js wheelheels.de collected 2026-09-25 03:19:07 UTC 10,194 bytes, 213 lines download raw bytes

1;(function ($) {
2    'use strict';
3
4    /**
5     * @TODO Code a function that calculate available combination instead of use WC hooks
6     */
7    $.fn.tawcvs_variation_swatches_form = function () {
8        return this.each(function () {
9            var $form = $(this);
10
11            if (typeof $form.find(".tawcvs-available-product-variation").data("product_variations") !== "undefined") {
12                $form.data("product_variations", $form.find(".tawcvs-available-product-variation").data("product_variations"))
13                    .trigger('reload_product_variations')
14                    .trigger('update_variation_values');
15            }
16
17            $form
18                .addClass('swatches-support')
19                .on("found_variation", function (event, variation) {
20                    $form.change_variation_image_on_shop_page(variation);
21                })
22                .on("reset_image", function (event) {
23                    $form.change_variation_image_on_shop_page(false);
24                })
25                .on('click', '.swatch', function (e) {
26                    e.preventDefault();
27                    e.stopImmediatePropagation();
28                    var $el = $(this);
29                    let $select = false, value = false;
30
31                    if (!$("body").hasClass("single-product") &&
32                        $("body").find(".wc-product-table-wrapper").length) {
33                        //For product table page
34                        let attribute_name = $el.closest('.tawcvs-swatches').data("attribute_name");
35                        $select = $el.closest('.variations').find('select[data-attribute_name="' + attribute_name + '"]');
36                        value = $el.attr('data-value');
37                    } else {
38                        //For normal variable product page
39                        $select = $el.closest('.value').find('select');
40                        value = $el.attr('data-value');
41                    }
42
43                    if ($el.hasClass('disabled')) {
44                        return;
45                    }
46
47                    //Woo product bundle plugin uses "select" class instead of "value" class
48                    if (!$select.length) {
49                        if ($form.closest(".woosb-product").length) {
50                            $select = $el.closest('.select').find('select');
51                        }
52                    }
53
54                    //Disabling other swatches, then resetting the select value to empty
55                    $el.parents('.tawcvs-swatches').find(".swatch.selected").each(function () {
56                        $(this).not($el).removeClass("selected");
57                        $select.val('');
58                    })
59
60                    // For old WC
61                    $select.trigger('focusin');
62
63                    // Check if this combination is available
64                    if (!$select.find('option[value="' + value + '"]').length) {
65                        $el.siblings('.swatch').removeClass('selected');
66                        $select.val('').change();
67                        $form.trigger('tawcvs_no_matching_variations', [$el]);
68                        return;
69                    }
70
71                    if ($el.hasClass('selected')) {
72                        $select.val('');
73                        $el.removeClass('selected');
74
75                        if ($el.attr('type') == 'radio') {
76                            setTimeout(function() {
77                                $el.prop('checked', false);
78                            }, 100);
79                        }
80                    } else {
81                        $el.addClass('selected').siblings('.selected').removeClass('selected');
82                        $select.val(value);
83
84                        if ($el.attr('type') == 'radio') {
85                            setTimeout(function() {
86                                $el.prop('checked', true);
87                            }, 100);
88                        }
89                    }
90
91                    $select.change();
92                })
93                .on('click', '.reset_variations', function () {
94                    $form.find('.swatch.selected').removeClass('selected');
95                    $form.find('.swatch.disabled').removeClass('disabled');
96
97                    if ($form.find('input[type="radio"]').length > 1) {
98                        $form.find('input[type="radio"]').prop('checked', false);
99                    }
100                })
101                .on('woocommerce_update_variation_values', function () {
102                    setTimeout(function () {
103                        $form.find('.variation-selector').each(function () {
104                            var $variationSelector = $(this),
105                                $options = $variationSelector.find('select').find('option'),
106                                $selected = $options.filter(':selected'),
107                                values = [];
108
109                            $options.each(function (index, option) {
110                                if (option.value !== '') {
111                                    values.push(option.value);
112                                }
113                            });
114
115                            $variationSelector.closest('.value').find('.swatch').each(function () {
116                                var $swatch = $(this),
117                                    value = $swatch.attr('data-value');
118
119                                $swatch.closest('.swatch-item-wrapper').show();
120
121                                if (values.indexOf(value) > -1) {
122                                    $swatch.removeClass('disabled');
123                                } else {
124                                    $swatch.addClass('disabled');
125
126                                    if ($swatch.closest('.tawcvs-swatches').hasClass('oss-hide')) {
127                                        $swatch.closest('.swatch-item-wrapper').hide();
128                                    }
129
130                                    if ($selected.length && value === $selected.val()) {
131                                        $swatch.removeClass('selected');
132                                    }
133                                }
134                            });
135                        });
136                    }, 100);
137                })
138                .on('tawcvs_no_matching_variations', function () {
139                    window.alert(wc_add_to_cart_variation_params.i18n_no_matching_variations_text);
140                });
141        });
142    };
143
144    $.fn.change_variation_image_on_shop_page = function (variation) {
145        var $product = $(this).closest('.product'),
146            $product_img = $product.find('.woocommerce-LoopProduct-link img');
147    
148        if ($product_img.length !== 1) {
149            return false;
150        }
151    
152        if (variation && variation.image && variation.image.src && variation.image.src.length > 1) {
153            $product_img.wc_set_variation_attr('src', variation.image.src);
154            $product_img.wc_set_variation_attr('height', variation.image.src_h);
155            $product_img.wc_set_variation_attr('width', variation.image.src_w);
156            $product_img.wc_set_variation_attr('srcset', variation.image.srcset);
157            $product_img.wc_set_variation_attr('sizes', variation.image.sizes);
158            $product_img.wc_set_variation_attr('title', variation.image.title);
159            $product_img.wc_set_variation_attr('data-caption', variation.image.caption);
160            $product_img.wc_set_variation_attr('alt', variation.image.alt);
161            $product_img.wc_set_variation_attr('data-src', variation.image.full_src);
162            $product_img.wc_set_variation_attr('data-large_image', variation.image.full_src);
163            $product_img.wc_set_variation_attr('data-large_image_width', variation.image.full_src_w);
164            $product_img.wc_set_variation_attr('data-large_image_height', variation.image.full_src_h);
165        } else {
166            $product_img.wc_reset_variation_attr('src');
167            $product_img.wc_reset_variation_attr('width');
168            $product_img.wc_reset_variation_attr('height');
169            $product_img.wc_reset_variation_attr('srcset');
170            $product_img.wc_reset_variation_attr('sizes');
171            $product_img.wc_reset_variation_attr('title');
172            $product_img.wc_reset_variation_attr('data-caption');
173            $product_img.wc_reset_variation_attr('alt');
174            $product_img.wc_reset_variation_attr('data-src');
175            $product_img.wc_reset_variation_attr('data-large_image');
176            $product_img.wc_reset_variation_attr('data-large_image_width');
177            $product_img.wc_reset_variation_attr('data-large_image_height');
178        }
179    }
180
181    //Tracking the reset_variations button on change visibility -> change the corresponding display state
182    function toggle_hidden_variation_btn() {
183        const resetVariationNodes = document.getElementsByClassName('reset_variations');
184        if (resetVariationNodes.length) {
185            Array.prototype.forEach.call(resetVariationNodes, function (resetVariationEle) {
186                let observer = new MutationObserver(function () {
187                    if (resetVariationEle.style.visibility !== 'hidden') {
188                        resetVariationEle.style.display = 'block';
189                    } else {
190                        resetVariationEle.style.display = 'none';
191                    }
192                });
193                observer.observe(resetVariationEle, {attributes: true, childList: true});
194            })
195        }
196    }
197
198    $(function () {
199        $('.variations_form').tawcvs_variation_swatches_form().trigger('woocommerce_update_variation_values');
200        $(document.body).trigger('tawcvs_initialized');
201        toggle_hidden_variation_btn();
202    });
203
204    $(document).ajaxComplete(function () {
205        var $variations_form = $('.variations_form:not(.swatches-support)');
206        if ($variations_form.length > 0) {
207            $variations_form.each(function () {
208                $(this).wc_variation_form();
209            });
210            $variations_form.tawcvs_variation_swatches_form();
211        }
212    });
213})(jQuery);

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.