Skip to content

Instantly share code, notes, and snippets.

@gterrill
Last active August 29, 2015 14:25
Show Gist options
  • Save gterrill/92322b9f3d7ae345d53c to your computer and use it in GitHub Desktop.
Save gterrill/92322b9f3d7ae345d53c to your computer and use it in GitHub Desktop.
bundled.v3.js.liquid
<script>
bundles = [];
{% for variant in product.variants %}{% if variant.metafields.sva.bundled %}
bundles['{{ variant.id }}'] = jQuery.parseJSON('{{ variant.metafields.sva.bundled }}');
{% endif %}{% endfor %}
var process = function (target, results) {
var deferred = $.Deferred();
$.ajax({
dataType: "json",
url: "/products/" + target.handle + ".js"
}).done(function (product, textStatus, jqXHR) {
var multiplier = target.multiplier || 1,
variants = jQuery.grep(product.variants, function (variant) { // find matching variants
return jQuery.inArray(variant.id, target.variants) > -1
});
jQuery.each(variants, function (i, variant) {
results.push({
variant: variant.id,
available: (variant.inventory_quantity >= multiplier),
quantity: variant.inventory_quantity,
multiplier: target.multiplier
})
});
}).fail(function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 404) {
for (var i = 0; i < target.variants.length; i++) {
results.push({
variant: target.variants[i],
available: 0,
quantity: 0,
multiplier: target.multiplier
})
}
} else {
console.log([jqXHR, textStatus, errorThrown]);
}
}).always(function () {
deferred.resolve();
});
return deferred.promise();
}
var bundled = function (id, callback) {
var targets = bundles[id];
if (targets) {
var processes = [], results = [], i;
jQuery.each(targets, function (n, target) {
processes.push(process(target, results));
})
$.when.apply($, processes).done(function () {
var available = true, quantity = 100;
for (i = 0; i < results.length; i++) {
if (results[i].available == false) {
available = false;
quantity = 0;
break;
} else {
if (quantity > results[i].quantity) {
quantity = results[i].quantity;
}
}
}
callback({available: available, quantity: quantity});
});
return true;
} else {
callback({available: true});
return false;
}
}
</script>
@gterrill
Copy link
Author

In this version there is no dependency on the Shopify API (still needs jQuery though) and it deals with hidden products.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment