[fix] Edge case in variant selection in website - when variant has less number of attributes than template
diff --git a/erpnext/templates/includes/product_page.js b/erpnext/templates/includes/product_page.js
index f7a2360..cec4f2a 100644
--- a/erpnext/templates/includes/product_page.js
+++ b/erpnext/templates/includes/product_page.js
@@ -67,16 +67,17 @@
$("[itemscope] .item-view-attribute .form-control").on("change", function() {
try {
var item_code = encodeURIComponent(get_item_code());
+
} catch(e) {
// unable to find variant
// then chose the closest available one
var attribute = $(this).attr("data-attribute");
var attribute_value = $(this).val()
- var item_code = update_attribute_selectors(attribute, attribute_value);
+ var item_code = find_closest_match(attribute, attribute_value);
if (!item_code) {
- msgprint(__("Please select some other value for {0}", [attribute]))
+ msgprint(__("Cannot find a matching Item. Please select some other value for {0}.", [attribute]))
throw e;
}
}
@@ -99,9 +100,16 @@
function get_item_code() {
if(window.variant_info) {
var attributes = get_selected_attributes();
+ var no_of_attributes = Object.keys(attributes).length;
for(var i in variant_info) {
var variant = variant_info[i];
+
+ if (variant.attributes.length < no_of_attributes) {
+ // the case when variant has less attributes than template
+ continue;
+ }
+
var match = true;
for(var j in variant.attributes) {
if(attributes[variant.attributes[j].attribute]
@@ -120,13 +128,15 @@
}
}
-function update_attribute_selectors(selected_attribute, selected_attribute_value) {
+function find_closest_match(selected_attribute, selected_attribute_value) {
// find the closest match keeping the selected attribute in focus and get the item code
var attributes = get_selected_attributes();
var previous_match_score = 0;
+ var previous_no_of_attributes = 0;
var matched;
+
for(var i in variant_info) {
var variant = variant_info[i];
var match_score = 0;
@@ -142,9 +152,13 @@
}
}
- if (has_selected_attribute && (match_score > previous_match_score)) {
+ if (has_selected_attribute
+ && ((match_score > previous_match_score) || (match_score==previous_match_score && previous_no_of_attributes < variant.attributes.length))) {
previous_match_score = match_score;
matched = variant;
+ previous_no_of_attributes = variant.attributes.length;
+
+
}
}