Skip to content

Commit 3f222cb

Browse files
committed
some fix from modlinltd#97
1 parent db80f1f commit 3f222cb

File tree

2 files changed

+82
-26
lines changed

2 files changed

+82
-26
lines changed

advanced_filters/forms.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class AdvancedFilterQueryForm(CleanWhiteSpacesMixin, forms.Form):
7171
label=_('Operator'),
7272
required=True, choices=OPERATORS, initial="iexact",
7373
widget=forms.Select(attrs={'class': 'query-operator'}))
74-
value = VaryingTypeCharField(required=True, widget=forms.TextInput(
74+
value = VaryingTypeCharField(required=False, widget=forms.TextInput(
7575
attrs={'class': 'query-value'}), label=_('Value'))
7676
value_from = forms.DateTimeField(widget=forms.HiddenInput(
7777
attrs={'class': 'query-dt-from'}), required=False)
@@ -139,10 +139,7 @@ def _parse_query_dict(query_data, model):
139139
elif query_data['value'] is False:
140140
query_data['operator'] = "isfalse"
141141
else:
142-
if isinstance(mfield, DateField):
143-
# this is a date/datetime field
144-
query_data['operator'] = "range" # default
145-
else:
142+
if not query_data.get('operator') == "range":
146143
query_data['operator'] = operator # default
147144

148145
if isinstance(query_data.get('value'),
@@ -173,6 +170,15 @@ def clean(self):
173170
self.set_range_value(cleaned_data)
174171
return cleaned_data
175172

173+
def clean_value(self):
174+
value = self.cleaned_data['value']
175+
op = self.cleaned_data.get('operator', '')
176+
list = ['istrue', 'isfalse', 'isnull']
177+
if op not in list:
178+
self.fields['value'].required = True
179+
return self.fields['value'].clean(value)
180+
return value
181+
176182
def make_query(self, *args, **kwargs):
177183
""" Returns a Q object from the submitted form """
178184
query = Q() # initial is an empty query

advanced_filters/static/advanced-filters/advanced-filters.js

Lines changed: 71 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,45 @@ var OperatorHandlers = function($) {
3434
}
3535
self.val_input.css({display: 'none'});
3636

37-
$(".hasDatepicker").datepicker("destroy");
37+
try {
38+
$(".hasDatepicker").datepicker("destroy");
39+
} catch(e) {
40+
console.warn("Can't destroy datepicker");
41+
}
3842
$from.addClass('vDateField');
3943
$to.addClass('vDateField');
40-
grappelli.initDateAndTimePicker();
44+
try {
45+
grappelli.initDateAndTimePicker();
46+
} catch(e) {
47+
console.warn("Can't ini datepicker with grappelli.initDateAndTimePicker");
48+
}
4149
};
4250

4351
self.remove_datepickers = function() {
4452
self.val_input.css({display: 'block'});
4553
if (self.val_input.parent().find('input.vDateField').length > 0) {
4654
var datefields = self.val_input.parent().find('input.vDateField');
4755
datefields.each(function() {
48-
$(this).datepicker("destroy");
56+
try {
57+
$(this).datepicker("destroy");
58+
} catch(e) {
59+
console.warn("Can't destroy datepicker");
60+
}
4961
});
5062
datefields.remove();
5163
}
5264
};
5365

5466
self.modify_widget = function(elm) {
5567
// pick a widget for the value field according to operator
68+
69+
list = ['istrue', 'isfalse', 'isnull'];
70+
5671
self.value = $(elm).val();
5772
self.val_input = $(elm).parents('tr').find('.query-value');
5873
console.log("selected operator: " + self.value);
74+
var field = $(elm).parents('tr').find('.query-field');
75+
self.initialize_select2(field);
5976

6077
if (self.value == "range") {
6178
self.add_datepickers();
@@ -69,27 +86,60 @@ var OperatorHandlers = function($) {
6986
self.remove_datepickers();
7087
}
7188

72-
if ($.inArray(self.value, ["istrue","isnull","isfalse"]) > -1) {
73-
self.val_input.hide();
89+
var input = $(elm).parents('tr').find('input.query-value');
90+
if (list.includes(self.value)) {
91+
input.prop('readonly', true);
92+
input.css('pointer-events', 'none');
93+
input.css('color', '#ccc');
7494
} else {
75-
self.val_input.show();
95+
input.prop('readonly', false);
96+
input.css('pointer-events', 'all');
97+
input.css('color', 'black');
7698
}
7799
};
78100

79101
self.initialize_select2 = function(elm) {
80102
// initialize select2 widget and populate field choices
81103
var field = $(elm).val();
82-
var choices_url = ADVANCED_FILTER_CHOICES_LOOKUP_URL + (FORM_MODEL ||
104+
var op = $(elm).parents('tr').find('.query-operator').val();
105+
106+
if ($.inArray(op, ["iexact", "icontains", "iregex"]) > -1) {
107+
var choices_url = ADVANCED_FILTER_CHOICES_LOOKUP_URL + (FORM_MODEL ||
83108
MODEL_LABEL) + '/' + field;
84-
var input = $(elm).parents('tr').find('input.query-value');
85-
input.select2("destroy");
86-
$.get(choices_url, function(data) {
87-
input.select2({'data': data, 'createSearchChoice': function(term) {
88-
return { 'id': term, 'text': term };
89-
}});
90-
});
109+
var input = $(elm).parents('tr').find('input.query-value');
110+
input.select2("destroy");
111+
$.get(choices_url, function(data) {
112+
input.select2({'data': data, 'multiple': op == "iregex", 'createSearchChoice': function(term) {
113+
return { 'id': term, 'text': term };
114+
}});
115+
});
116+
} else {
117+
var input = $(elm).parents('tr').find('input.query-value');
118+
input.select2("destroy");
119+
}
91120
};
92121

122+
// self.initialize_select2 = function(elm) {
123+
// // initialize select2 widget and populate field choices
124+
// var field = $(elm).val();
125+
// var op = $(elm).parents('tr').find('.query-operator');
126+
// if (field.includes('__') && op.val() == 'iexact') {
127+
// var choices_url = ADVANCED_FILTER_CHOICES_LOOKUP_URL + (FORM_MODEL ||
128+
// MODEL_LABEL) + '/' + field;
129+
// var input = $(elm).parents('tr').find('input.query-value');
130+
// input.select2("destroy");
131+
// $.get(choices_url, function(data) {
132+
// input.select2({'data': data, 'createSearchChoice': function(term) {
133+
// return { 'id': term, 'text': term };
134+
// }});
135+
// });
136+
// }
137+
// else {
138+
// var input = $(elm).parents('tr').find('input.query-value');
139+
// input.select2("destroy");
140+
// }
141+
// };
142+
93143
self.field_selected = function(elm) {
94144
self.selected_field_elm = elm;
95145
var row = $(elm).parents('tr');
@@ -123,13 +173,13 @@ var OperatorHandlers = function($) {
123173
}
124174
$('.form-row select.query-operator').each(function() {
125175
$(this).off("change");
126-
$(this).data('pre_change', $(this).val());
176+
// $(this).data('pre_change', $(this).val());
127177
$(this).on("change", function() {
128178
var before_change = $(this).data('pre_change');
129179
if ($(this).val() != before_change) self.modify_widget(this);
130180
$(this).data('pre_change', $(this).val());
131181
}).change();
132-
self.modify_widget(this);
182+
// self.modify_widget(this);
133183
});
134184
$('.form-row select.query-field').each(function() {
135185
$(this).off("change");
@@ -140,18 +190,18 @@ var OperatorHandlers = function($) {
140190
$(this).data('pre_change', $(this).val());
141191
}).change();
142192
});
143-
self.field_selected($('.form-row select.query-field').first());
193+
// self.field_selected($('.form-row select.query-field').first());
144194

145195
};
146196

147197
self.destroy = function() {
148-
$('.form-row select.query-operator').each(function() {
198+
$('.form-row select.query-operator:last').each(function() {
149199
$(this).off("change");
150200
});
151-
$('.form-row select.query-field').each(function() {
201+
$('.form-row select.query-field:last').each(function() {
152202
$(this).off("change");
153203
});
154-
$('.form-row input.query-value').each(function() {
204+
$('.form-row input.query-value:last').each(function() {
155205
$(this).select2("destroy");
156206
});
157207
};
@@ -166,4 +216,4 @@ var OperatorHandlers = function($) {
166216
_af_handlers.init();
167217
}
168218
});
169-
})(window._jq || jQuery);
219+
})(window._jq || jQuery);

0 commit comments

Comments
 (0)