Conditionally Showing Datepicker Blocks Based on Product Types in Cart Using the Hidden Input Block
In this tutorial, we will demonstrate how to conditionally show or hide a Datepicker block based on whether a product of type “REQUIRES-DRY-ICE” is in the cart, drawer cart and multi-address cart using the Hidden Input Block.
Step 1: Duplicate Your Live Theme
It is good practice to work on a development theme.
Step 2: Upload Snippet
Create a JS file named “giftship-dry-ice” in the “assets” folder and copy and paste the following code:
(() => {
const MODULE = {
init: function() {
MODULE.events();
},
events: function() {
// HANDLES FULL CART PAGE
document.addEventListener('giftship.loaded', (e) => {
if (window.Gs && Gs.state && Gs.state.page_type === "cart") {
MODULE.handlers.checkSingleCart(false);
}
});
// HANDLES DRAWER CART
document.addEventListener('giftship.drawer-cart.opened', (e) => {
var cartData = e.detail?.cartData || null;
MODULE.handlers.checkSingleCart(true, cartData);
});
document.addEventListener('giftship.drawer-cart.item-updated', (e) => {
var cartData = e.detail?.cartData || null;
MODULE.handlers.checkSingleCart(true, cartData);
});
// HANDLES MULTISHIPPING CART
document.addEventListener('giftship.shipping.rate-loaded', (e) => {
if (window.location.pathname && window.location.pathname.includes('a/gs/cart/confirm')) {
var index = e.detail.index;
var shippingLineVariants = e.detail?.address?.variants || [];
MODULE.handlers.checkMultiCart(index, shippingLineVariants);
}
});
},
handlers: {
checkSingleCart: function(isDrawerCart, initialCartData = null) {
MODULE.actions.conditionallyFetchCartData()
.then((cartData) => {
if (!cartData) {
console.warn("Invalid cart data", cartData);
return;
}
var requiresDryIce = cartData.items.some(item => item.product_type === "REQUIRES-DRY-ICE");
var inputSelector = (isDrawerCart) ? '#gsDrawer input[name="attributes[_type]"]' : '#gsAppContainer input[name="attributes[_type]"]';
var hiddenInput = document.querySelector(inputSelector);
MODULE.actions.attemptPopulateHiddenInput(
hiddenInput,
requiresDryIce,
isDrawerCart,
function() {
return document.querySelector(inputSelector);
}
);
})
.catch((err) => {
console.warn("An error occurred handling single cart.", err);
});
},
checkMultiCart: function(index, lineVariants) {
var requiresDryIce = lineVariants.some(item => item.product_type === "REQUIRES-DRY-ICE");
var inputSelector = `#gsGroup${index} input[name^="attributes[_type"]`;
var hiddenInput = document.querySelector(inputSelector);
MODULE.actions.populateHiddenInput(hiddenInput, requiresDryIce, false);
}
},
actions: {
conditionallyFetchCartData: function(cartData = null) {
if (cartData && cartData.items && cartData.items.length) {
return cartData;
}
return new Promise((resolve, reject) => {
fetch('/cart.js')
.then((res) => res.json())
.then(res => resolve(res))
.catch((err) => {
reject(err);
});
});
},
attemptPopulateHiddenInput(hiddenInput, requiresDryIce, isDrawerCart, getHiddenInput, attempts = 0) {
if (hiddenInput) {
MODULE.actions.populateHiddenInput(hiddenInput, requiresDryIce, isDrawerCart);
return;
}
if (attempts >= 5) {
console.warn("Could not find hidden input to populate.");
return;
}
attempts += 1;
setTimeout(function() {
var newHiddenInput = getHiddenInput();
MODULE.actions.attemptPopulateHiddenInput(newHiddenInput, requiresDryIce, isDrawerCart, getHiddenInput, attempts);
}, 750);
},
populateHiddenInput(hiddenInput, requiresDryIce, isDrawerCart) {
if (!hiddenInput) {
console.warn("Hidden input not found.", hiddenInput)
return;
}
hiddenInput.value = (requiresDryIce) ? 'true' : 'false';
MODULE.actions.checkConditions(isDrawerCart);
},
checkConditions(isDrawerCart) {
if (isDrawerCart) {
Gs.drawerCart.actions.checkConditions();
} else {
Gs.cartOptions.actions.checkConditions();
}
}
}
};
MODULE.init();
})();
Step 3: Edit theme.liquid and Include Snippet
At the bottom of this document, directly above the closing </body> tag, paste the following code:
<script src="{{ 'giftship-dry-ice.js' | asset_url }}" defer="defer"></script>
Step 4: Add custom javascript to Multiship
Visit Giftship’s general settings > tab: Multiship and paste this into the following Shipping Address Page Custom JavaScript.
var loadJS = function(url, location){
var scriptTag = document.createElement('script');
scriptTag.src = url;
location.appendChild(scriptTag);
};
loadJS("{{ 'giftship-dry-ice.js' | asset_url }}", document.body);
Step 5: Set Up a Cart Option Set
Create a cart option set and navigate to Display Settings. Make sure the cart set is set for display.
Step 6: Add a Hidden Input Block
Create a hidden input block. You can name the input anything, but for this tutorial, use “_type” and remember to uncheck “Ignore value.”
Step 7: Add the Datepicker Blocks
Create the first datepicker block and move to the display rules tab.
- Display Option: Select “When all conditions are met.”
- Block Conditions: Show IF block “_type” is equal to “true.”
- Do the opposite for the second date picker block (eg. equal to false).
Step 8: Test, Test and Test!
Preview the development theme, add items with and without product type “REQUIRES-DRY-ICE” and remove, refresh and repeat.