diff --git a/assets/js/product-loader.js b/assets/js/product-loader.js
index 142e4ad..b8c54bf 100644
--- a/assets/js/product-loader.js
+++ b/assets/js/product-loader.js
@@ -55,9 +55,8 @@
renderPrice(product);
renderDetails(product, isEnglish);
renderImages(product, isEnglish);
- renderVariants(product);
+ renderOptions(product);
setupAddToCart(product);
- renderStock(product);
}
function renderTitle(product, isEnglish) {
@@ -113,42 +112,78 @@
}
}
- function renderVariants(product) {
+ function renderOptions(product) {
if (product.variants.edges.length <= 1) return;
- const variantsContainer = document.querySelector("[data-product-variants]");
- const variantSelector = document.querySelector("[data-variant-selector]");
+ const firstVariant = product.variants.edges[0].node;
+ if (!firstVariant.selectedOptions || firstVariant.selectedOptions.length === 0) return;
- if (!variantsContainer || !variantSelector) return;
+ const mainOption = firstVariant.selectedOptions[0];
+ const optionValues = new Set();
- variantsContainer.style.display = "block";
-
- variantSelector.innerHTML = product.variants.edges
- .map((edge) => {
- const variant = edge.node;
- const variantId = variant.id.replace(
- "gid://shopify/ProductVariant/",
- ""
- );
- const price = parseFloat(variant.price.amount).toFixed(2) + "€";
- const availability = variant.availableForSale
- ? ""
- : " (Rupture de stock)";
-
- return ``;
- })
- .join("");
-
- variantSelector.addEventListener("change", (e) => {
- const addToCartBtn = document.querySelector("[data-shopify-add-to-cart]");
- if (addToCartBtn) {
- addToCartBtn.dataset.variantId = e.target.value;
+ product.variants.edges.forEach(edge => {
+ const variant = edge.node;
+ if (variant.selectedOptions && variant.selectedOptions[0]) {
+ optionValues.add(variant.selectedOptions[0].value);
}
});
+
+ if (optionValues.size <= 1) return;
+
+ const optionsContainer = document.querySelector("[data-product-options]");
+ const optionsList = document.querySelector("[data-product-options-list]");
+
+ if (!optionsContainer || !optionsList) return;
+
+ const optionName = mainOption.name;
+ const optionSlug = optionName.toLowerCase().replace(/\s+/g, '-');
+
+ optionsList.innerHTML = Array.from(optionValues).map((value) => {
+ const uniqueId = `${optionSlug}-${value.toLowerCase().replace(/\s+/g, '-')}`;
+ const variant = product.variants.edges.find(e =>
+ e.node.selectedOptions && e.node.selectedOptions[0]?.value === value
+ )?.node;
+ const isAvailable = variant?.availableForSale || false;
+
+ return `
+
+
+
+
+ `;
+ }).join('');
+
+ optionsContainer.style.display = 'block';
+
+ const radios = optionsList.querySelectorAll('input[type="radio"]');
+ const addToCartBtn = document.querySelector("[data-shopify-add-to-cart]");
+ const buttonText = addToCartBtn?.querySelector('[data-button-text]');
+
+ radios.forEach(radio => {
+ radio.addEventListener('change', function() {
+ const variantId = this.dataset.variantId;
+
+ if (addToCartBtn) {
+ addToCartBtn.dataset.variantId = variantId;
+ addToCartBtn.removeAttribute('disabled');
+ }
+
+ if (buttonText) {
+ buttonText.textContent = addToCartBtn.dataset.defaultText || 'Ajouter au panier';
+ }
+
+ const allLi = optionsList.querySelectorAll('li');
+ allLi.forEach(li => li.classList.remove('is-selected'));
+ this.closest('li').classList.add('is-selected');
+ });
+ });
}
function setupAddToCart(product) {
@@ -158,31 +193,35 @@
const productId = product.id.replace("gid://shopify/Product/", "");
addToCartBtn.dataset.productId = productId;
- const firstAvailableVariant = product.variants.edges.find(
- (e) => e.node.availableForSale
- );
- if (firstAvailableVariant) {
- const variantId = firstAvailableVariant.node.id.replace(
- "gid://shopify/ProductVariant/",
- ""
- );
- addToCartBtn.dataset.variantId = variantId;
- }
- }
+ const hasMultipleVariants = product.variants.edges.length > 1;
+ const firstVariant = product.variants.edges[0]?.node;
+ const hasOptions = firstVariant?.selectedOptions && firstVariant.selectedOptions.length > 0;
- function renderStock(product) {
- const stockEl = document.querySelector("[data-product-stock]");
- if (!stockEl) return;
+ const uniqueOptions = new Set();
+ product.variants.edges.forEach(edge => {
+ if (edge.node.selectedOptions && edge.node.selectedOptions[0]) {
+ uniqueOptions.add(edge.node.selectedOptions[0].value);
+ }
+ });
+ const hasMultipleOptions = uniqueOptions.size > 1;
- const addToCartBtn = document.querySelector("[data-shopify-add-to-cart]");
-
- if (product.availableForSale) {
- stockEl.textContent = addToCartBtn?.dataset.textInStock || "En stock";
- stockEl.classList.add("in-stock");
+ if (hasMultipleVariants && hasOptions && hasMultipleOptions) {
+ addToCartBtn.setAttribute('disabled', 'disabled');
+ const buttonText = addToCartBtn.querySelector('[data-button-text]');
+ if (buttonText) {
+ buttonText.textContent = addToCartBtn.dataset.textChooseOption || 'Choisissez une option';
+ }
} else {
- stockEl.textContent =
- addToCartBtn?.dataset.textOutOfStock || "Rupture de stock";
- stockEl.classList.add("out-of-stock");
+ const firstAvailableVariant = product.variants.edges.find(
+ (e) => e.node.availableForSale
+ );
+ if (firstAvailableVariant) {
+ const variantId = firstAvailableVariant.node.id.replace(
+ "gid://shopify/ProductVariant/",
+ ""
+ );
+ addToCartBtn.dataset.variantId = variantId;
+ }
}
}
})();
diff --git a/site/languages/en.php b/site/languages/en.php
index 19e9aec..e356f2c 100644
--- a/site/languages/en.php
+++ b/site/languages/en.php
@@ -30,6 +30,7 @@ return [
'loading' => 'Loading...',
'productNotFound' => 'Product not found',
'selectVariant' => 'Select',
+ 'chooseOption' => 'Choose an option',
// Blueprints - Home
'home.title' => 'Home',
diff --git a/site/languages/fr.php b/site/languages/fr.php
index 249bb4d..98c263d 100644
--- a/site/languages/fr.php
+++ b/site/languages/fr.php
@@ -30,6 +30,7 @@ return [
'loading' => 'Chargement...',
'productNotFound' => 'Produit non trouvé',
'selectVariant' => 'Choisir',
+ 'chooseOption' => 'Choisissez une option',
// Blueprints - Home
'home.title' => 'Accueil',
diff --git a/site/snippets/buy-button.php b/site/snippets/buy-button.php
index 7769f2e..4f2bc74 100644
--- a/site/snippets/buy-button.php
+++ b/site/snippets/buy-button.php
@@ -1,25 +1,20 @@
-
-
-
-
-
-
-
-
+
diff --git a/site/templates/product.php b/site/templates/product.php
index 46d2487..3a58eaa 100644
--- a/site/templates/product.php
+++ b/site/templates/product.php
@@ -27,6 +27,10 @@ snippet('header', ['title' => $page->title(), 'template' => 'shop']);
+
+