{# Load variation swatches CSS #}
<link rel="stylesheet" href="{{ asset('VariationSwatches42/assets/variation-swatches.css', 'plugin') }}">
{# Load React and variation swatches bundle #}
<script src="{{ asset('VariationSwatches42/assets/variation-swatches-bundle.js', 'plugin') }}"></script>
{# Initialize variation swatches #}
{% if configScript is defined and configScript is not empty %}
{{ configScript|raw }}
{% endif %}
{% if productsScript is defined and productsScript is not empty %}
{{ productsScript|raw }}
{% endif %}
{# Custom Event Handler for Variation Swatches Selection Complete #}
<script>
document.addEventListener('DOMContentLoaded', function () {
const isProductDetail = document.body && document.body.id === 'page_product_detail';
// Listen for the custom event from ReactJS variation swatches - both options selected
document.addEventListener('variationSwatchesSelectionComplete', function (event) {
const {productId, SwatchesMediaIndexConfig} = event.detail;
if (isProductDetail) {
// Product detail page - handle slider navigation
handleProductDetailSlider(SwatchesMediaIndexConfig, event.detail);
} else {
// Product list page - handle image URL switching
handleProductListImageSwitch(productId, SwatchesMediaIndexConfig);
}
});
// Listen for deselection event - when one or both options are deselected
document.addEventListener('variationSwatchesDeselection', function (event) {
const {productId} = event.detail;
if (isProductDetail) {
const slickSlider = document.querySelector('.item_visual');
if (slickSlider && typeof $ !== 'undefined' && $(slickSlider).hasClass('slick-initialized')) {
$(slickSlider).slick('slickGoTo', 0, false);
}
} else {
// Product list page - revert to original image
handleProductListImageRevert(productId);
}
});
// Handle product detail slider navigation
function handleProductDetailSlider(SwatchesMediaIndexConfig, eventDetail) {
const mediaIndex = SwatchesMediaIndexConfig.media_index;
// Only proceed if media index is not null
if (mediaIndex !== null && mediaIndex !== undefined) {
const slickSlider = document.querySelector('.item_visual');
if (slickSlider && typeof $ !== 'undefined' && $(slickSlider).hasClass('slick-initialized')) {
$(slickSlider).slick('slickGoTo', mediaIndex, false);
// Dispatch a custom event to notify other components
const sliderChangedEvent = new CustomEvent('variationSwatchesSliderChanged', {
detail: {
productId: eventDetail.productId,
mediaIndex: mediaIndex,
SwatchesConfig: eventDetail.SwatchesConfig,
SwatchesMediaIndexConfig: SwatchesMediaIndexConfig
},
bubbles: true
});
document.dispatchEvent(sliderChangedEvent);
}
}
}
// Handle product list image URL switching
function handleProductListImageSwitch(productId, SwatchesMediaIndexConfig) {
const imageUrl = getImageUrlFromConfig(SwatchesMediaIndexConfig);
if (imageUrl) {
const productInput = document.querySelector(`input[name="product_id"][value="${productId}"]`);
if (productInput) {
const productElement = productInput.closest('.ec-shelfGrid__item');
if (productElement) {
const imageElement = productElement.querySelector('.ec-shelfGrid__item-image img');
if (imageElement) {
if (!imageElement.dataset.originalSrc) {
imageElement.dataset.originalSrc = imageElement.src;
}
// Switch to new image
imageElement.src = imageUrl;
}
}
}
}
}
// Handle product list image revert
function handleProductListImageRevert(productId) {
const productInput = document.querySelector(`input[name="product_id"][value="${productId}"]`);
if (productInput) {
const productElement = productInput.closest('.ec-shelfGrid__item');
if (productElement) {
const imageElement = productElement.querySelector('.ec-shelfGrid__item-image img');
if (imageElement && imageElement.dataset.originalSrc) {
imageElement.src = imageElement.dataset.originalSrc;
}
}
}
}
// Get image URL from SwatchesMediaIndexConfig
function getImageUrlFromConfig(SwatchesMediaIndexConfig) {
if (SwatchesMediaIndexConfig && SwatchesMediaIndexConfig.image_url) {
return SwatchesMediaIndexConfig.image_url;
}
return null;
}
});
</script>