Skip to content

Commit 1342f13

Browse files
authored
[chores] Added hooks to AutocompleteJsonView
* Added hooks to AutocompleteJsonView * Added custom CSS class for autocomplete filter dropdown * Made autocomplete field empty label configurable
1 parent 7ba0aa2 commit 1342f13

File tree

5 files changed

+28
-6
lines changed

5 files changed

+28
-6
lines changed

openwisp_utils/admin_theme/filters.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ def expected_parameters(self):
9494

9595
class AutocompleteFilter(BaseAutocompleteFilter):
9696
template = 'admin/auto_filter.html'
97+
widget_attrs = {
98+
'data-dropdown-css-class': 'ow2-autocomplete-dropdown',
99+
'data-empty-label': '-',
100+
}
97101

98102
class Media:
99103
css = {

openwisp_utils/admin_theme/static/admin/css/ow-auto-filter.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
.auto-filter li {
2525
list-style-type: none;
2626
}
27-
.select2-dropdown,
27+
.ow2-autocomplete-dropdown.select2-dropdown,
2828
.auto-filter span.select2-selection,
2929
.auto-filter .select2 {
3030
min-width: 222px !important;

openwisp_utils/admin_theme/static/admin/js/ow-auto-filter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ django.jQuery(document).ready(function () {
2020
el = django.jQuery(el);
2121
nullParam = el.attr("name") + "__isnull";
2222
if (searchHash[nullParam] !== undefined) {
23-
el.append(new Option("-", "null", false, false));
23+
el.append(new Option(el.data('empty-label'), "null", false, false));
2424
el.val("null");
2525
el.trigger("change");
2626
}

openwisp_utils/admin_theme/views.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
class AutocompleteJsonView(BaseAutocompleteJsonView):
77
admin_site = None
88

9+
def get_empty_label(self):
10+
return '-'
11+
12+
def get_allow_null(self):
13+
return True
14+
915
def get(self, request, *args, **kwargs):
1016
(
1117
self.term,
@@ -22,13 +28,19 @@ def get(self, request, *args, **kwargs):
2228
context = self.get_context_data()
2329
# Add option for filtering objects with None field.
2430
results = []
31+
empty_label = self.get_empty_label()
2532
if (
2633
getattr(self.source_field, 'null', False)
34+
and self.get_allow_null()
2735
and not getattr(self.source_field, '_get_limit_choices_to_mocked', False)
2836
and not self.term
29-
or self.term == '-'
37+
or self.term == empty_label
3038
):
31-
results += [{'id': 'null', 'text': '-'}]
39+
# The select2 library requires data in a specific format
40+
# https://select2.org/data-sources/formats.
41+
# select2 does not render option with blank "id" (i.e. '').
42+
# Therefore, "null" is used here for "id".
43+
results += [{'id': 'null', 'text': empty_label}]
3244
results += [
3345
{'id': str(obj.pk), 'text': self.display_text(obj)}
3446
for obj in context['object_list']

tests/test_project/tests/test_selenium.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,10 @@ def test_autocomplete_shelf_filter(self):
718718
result_xpath = '//*[@id="result_list"]/tbody/tr/th/a[contains(text(), "{}")]'
719719
self.open(url)
720720
self.assertIn(
721-
f'<select name="shelf__id" id="{select_id}" class="admin-autocomplete',
721+
(
722+
'<select name="shelf__id" data-dropdown-css-class="ow2-autocomplete-dropdown"'
723+
f' data-empty-label="-" id="{select_id}" class="admin-autocomplete'
724+
),
722725
self.web_driver.page_source,
723726
)
724727
self.web_driver.find_element_by_css_selector(filter_css_selector).click()
@@ -759,7 +762,10 @@ def test_autocomplete_owner_filter(self):
759762
result_xpath = '//*[@id="result_list"]/tbody/tr/th/a[contains(text(), "{}")]'
760763
self.open(url)
761764
self.assertIn(
762-
f'<select name="owner_id" id="{select_id}" class="admin-autocomplete',
765+
(
766+
'<select name="owner_id" data-dropdown-css-class="ow2-autocomplete-dropdown"'
767+
f' data-empty-label="-" id="{select_id}" class="admin-autocomplete'
768+
),
763769
self.web_driver.page_source,
764770
)
765771
self.web_driver.find_element_by_css_selector(filter_css_selector).click()

0 commit comments

Comments
 (0)