Skip to content

Instantly share code, notes, and snippets.

@gterrill
Last active August 29, 2015 13:57
Show Gist options
  • Save gterrill/9478771 to your computer and use it in GitHub Desktop.
Save gterrill/9478771 to your computer and use it in GitHub Desktop.
Bundle availability including quantity using $.Deffered
; 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();
Shopify.getProduct(target.handle, function(product) {
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})
});
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 {
var bundledQuantity = Math.round(results[i].quantity/results[i].multiplier);
if (quantity > bundledQuantity) {
quantity = bundledQuantity;
}
}
}
callback({available: available, quantity: quantity});
});
return true;
} else {
callback({available: true});
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment