From 3ca4238d367a5a7075a5fb2fbbba20ab4e375308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marduk=20Bola=C3=B1os?= Date: Wed, 19 Feb 2025 15:38:20 +0100 Subject: [PATCH 1/4] - Find the closest common ancestor of two chained selects instead of assuming it is a form. - Try to find the dependent field by its name attribute using a two-fold search strategy: exact match otherwise ends with --- django_select2/static/django_select2/django_select2.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/django_select2/static/django_select2/django_select2.js b/django_select2/static/django_select2/django_select2.js index 23447d54..321fcf71 100644 --- a/django_select2/static/django_select2/django_select2.js +++ b/django_select2/static/django_select2/django_select2.js @@ -26,9 +26,16 @@ let dependentFields = $element.data('select2-dependent-fields') if (dependentFields) { + const find_element = function(selector) { + const result = $(selector, $element.closest(':has(' + selector + ')')) + if (result.length > 0) return result + else return null + } dependentFields = dependentFields.trim().split(/\s+/) $.each(dependentFields, function (i, dependentField) { - result[dependentField] = $('[name=' + dependentField + ']', $element.closest('form')).val() + const name_is = '[name=' + dependentField + ']' + const name_ends_with = '[name$=' + dependentField + ']' + result[dependentField] = (find_element(name_is) || find_element(name_ends_with)).val() }) } From fc1c9eee525320c73849a62b5b03fa62baacf615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marduk=20Bola=C3=B1os?= Date: Thu, 20 Feb 2025 09:16:39 +0100 Subject: [PATCH 2/4] Syntactic changes to conform with JS Standard Style --- django_select2/static/django_select2/django_select2.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/django_select2/static/django_select2/django_select2.js b/django_select2/static/django_select2/django_select2.js index 321fcf71..c8b5b856 100644 --- a/django_select2/static/django_select2/django_select2.js +++ b/django_select2/static/django_select2/django_select2.js @@ -26,16 +26,16 @@ let dependentFields = $element.data('select2-dependent-fields') if (dependentFields) { - const find_element = function(selector) { + const findElement = function (selector) { const result = $(selector, $element.closest(':has(' + selector + ')')) if (result.length > 0) return result else return null } dependentFields = dependentFields.trim().split(/\s+/) $.each(dependentFields, function (i, dependentField) { - const name_is = '[name=' + dependentField + ']' - const name_ends_with = '[name$=' + dependentField + ']' - result[dependentField] = (find_element(name_is) || find_element(name_ends_with)).val() + const nameIs = '[name=' + dependentField + ']' + const nameEndsWith = '[name$=' + dependentField + ']' + result[dependentField] = (findElement(nameIs) || findElement(nameEndsWith)).val() }) } From e5a208de9969fff93d42622d331a4b48424e57c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marduk=20Bola=C3=B1os?= Date: Thu, 20 Feb 2025 15:06:22 +0100 Subject: [PATCH 3/4] Use string interpolation instead of string concatenation in order to improve readability --- django_select2/static/django_select2/django_select2.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/django_select2/static/django_select2/django_select2.js b/django_select2/static/django_select2/django_select2.js index c8b5b856..156092f4 100644 --- a/django_select2/static/django_select2/django_select2.js +++ b/django_select2/static/django_select2/django_select2.js @@ -27,14 +27,14 @@ let dependentFields = $element.data('select2-dependent-fields') if (dependentFields) { const findElement = function (selector) { - const result = $(selector, $element.closest(':has(' + selector + ')')) + const result = $(selector, $element.closest(`:has(${selector})`)) if (result.length > 0) return result else return null } dependentFields = dependentFields.trim().split(/\s+/) $.each(dependentFields, function (i, dependentField) { - const nameIs = '[name=' + dependentField + ']' - const nameEndsWith = '[name$=' + dependentField + ']' + const nameIs = `[name=${dependentField}]` + const nameEndsWith = `[name$=${dependentField}]` result[dependentField] = (findElement(nameIs) || findElement(nameEndsWith)).val() }) } From a59d9724ba9cecc10427dbda716dc4d9c6126538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marduk=20Bola=C3=B1os?= Date: Fri, 21 Feb 2025 08:50:25 +0100 Subject: [PATCH 4/4] Added a dash to the pattern in nameEndsWith in order to avoid matching the wrong field. Field names in inline forms end with -field_name. --- django_select2/static/django_select2/django_select2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_select2/static/django_select2/django_select2.js b/django_select2/static/django_select2/django_select2.js index 156092f4..f299e367 100644 --- a/django_select2/static/django_select2/django_select2.js +++ b/django_select2/static/django_select2/django_select2.js @@ -34,7 +34,7 @@ dependentFields = dependentFields.trim().split(/\s+/) $.each(dependentFields, function (i, dependentField) { const nameIs = `[name=${dependentField}]` - const nameEndsWith = `[name$=${dependentField}]` + const nameEndsWith = `[name$=-${dependentField}]` result[dependentField] = (findElement(nameIs) || findElement(nameEndsWith)).val() }) }