diff --git a/django/contatti_app/drilldown_autocomplete.py b/django/contatti_app/drilldown_autocomplete.py index ba3d132..82e94e1 100644 --- a/django/contatti_app/drilldown_autocomplete.py +++ b/django/contatti_app/drilldown_autocomplete.py @@ -148,6 +148,9 @@ class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin): if 'reset_on_excluded' in daf[db_field.name]: attrs['data-reset_on_excluded'] = json.dumps( list(daf[db_field.name]['reset_on_excluded'])) + if 'reset_on_included' in daf[db_field.name]: + attrs['data-reset_on_included'] = json.dumps( + list(daf[db_field.name]['reset_on_included'])) kwargs["widget"] = DrillDownAutocompleteSelect( db_field, self.admin_site, attrs=attrs, using=db ) diff --git a/django/static/admin/js/autocomplete.js b/django/static/admin/js/autocomplete.js index 76b0420..4e4b18d 100644 --- a/django/static/admin/js/autocomplete.js +++ b/django/static/admin/js/autocomplete.js @@ -4,89 +4,121 @@ $.fn.djangoAdminSelect2 = function() { $.each(this, function(i, element) { - var select2_config = {}; + const select2_config = {}; select2_config.ajax = { data: (params)=>{ - var field_name = element.dataset.fieldName - var out = { + const {fieldName, appLabel, modelName} = element.dataset; + const out = { term: params.term, page: params.page, - app_label: element.dataset.appLabel, - model_name: element.dataset.modelName, - field_name: field_name + app_label: appLabel, + model_name: modelName, + field_name: fieldName }; + if (element.dataset.hasOwnProperty('drilldown_enabled')) { out.drilldown = 1; + if (element.dataset.hasOwnProperty('filtered_by')) { - var filtered_by_fields = JSON.parse(element.dataset.filtered_by) - var filtered_by_dict = {}; - var some_obj = false; - for (var i in filtered_by_fields) { + const filtered_by_fields = JSON.parse(element.dataset.filtered_by) + const filtered_by_dict = {}; + let some_obj = false; + + for (let i in filtered_by_fields) { if (filtered_by_fields.hasOwnProperty(i)) { - var filtering_field = filtered_by_fields[i]; - var field_id = element.dataset.select2Id; - var filtering_field_id = field_id.slice(0, field_id.length - field_name.length) + filtering_field; - var filtering_value = document.querySelectorAll('[data-select2-id=' + filtering_field_id + '].admin-autocomplete')[0].value; + const filtering_field = filtered_by_fields[i]; + const field_id = element.dataset.select2Id; + const filtering_field_id = `${field_id.slice(0, field_id.length - fieldName.length)}${filtering_field}`; + const filtering_value = document.querySelector(`[data-select2-id="${filtering_field_id}"].admin-autocomplete`).value; + if (filtering_value !== '') { filtered_by_dict[filtering_field] = filtering_value; some_obj = true; } } } + if (some_obj) { - out['filtered_by_dict'] = JSON.stringify(filtered_by_dict); + out.filtered_by_dict = JSON.stringify(filtered_by_dict); } } } - return out + + return out; } }; + if (element.dataset.hasOwnProperty('drilldown_enabled')) { select2_config.templateResult = (item,container)=>{ - var styleClass = ''; + let styleClass = ''; element.classList.add('drilldown'); + if (item.ddok === 1) { styleClass = 'drilldown_ok'; } else { styleClass = 'drilldown_ko'; } + container.classList.add(styleClass); + if (item.hasOwnProperty('autoselect')) { - if ((element.dataset.included_only ?? false) || $(element).select2('data').length == 0) { + const includedOnly = element.dataset.included_only ?? false; + const dataLength = $(element).select2('data').length; + + if (includedOnly || dataLength == 0) { $(element).select2("trigger", "select", { data: item }) } } - return $('').text(item.text); + return $(``).text(item.text); } } + $(element).select2(select2_config); + + const reset_on_excluded = []; + const reset_on_included = []; + let all_fields_to_reset; + let reset_on_something = false; + if (element.dataset.hasOwnProperty('reset_on_excluded')) { - $(element).on('select2:select', ev=>{ - var data = $(element).select2('data'); + reset_on_excluded.push(...JSON.parse(element.dataset.reset_on_excluded)); + reset_on_something = true; + } + + if (element.dataset.hasOwnProperty('reset_on_included')) { + reset_on_included.push(...JSON.parse(element.dataset.reset_on_included)); + reset_on_something = true; + } + + if (reset_on_something) { + $(element).on('select2:select', (ev)=>{ + const data = $(element).select2('data'); + if (Array.isArray(data) && data.length > 0) { - var ddok = data[0].ddok; - if (!(ddok ?? true)) { - var reset_on_excluded = JSON.parse(element.dataset.reset_on_excluded); - for (var i in reset_on_excluded) { - if (reset_on_excluded.hasOwnProperty(i)) { - var field_name = element.dataset.fieldName - var field_to_reset = reset_on_excluded[i]; - var field_id = element.dataset.select2Id; - var id_to_reset = field_id.slice(0, field_id.length - field_name.length) + field_to_reset; - var element_to_reset = document.querySelectorAll('[data-select2-id=' + id_to_reset + '].admin-autocomplete')[0]; - $(element_to_reset).val(null).trigger("change"); + const ddok = data[0].ddok; + + if (ddok !== undefined) { + all_fields_to_reset = ddok ? reset_on_included : reset_on_excluded; + + if (all_fields_to_reset.length > 0) { + all_fields_to_reset.forEach((field_to_reset)=>{ + const field_name = element.dataset.fieldName; + const field_id = element.dataset.select2Id; + const id_to_reset = `${field_id.slice(0, field_id.length - field_name.length)}${field_to_reset}`; + const element_to_reset = document.querySelector(`#${id_to_reset}.admin-autocomplete`); + $(element_to_reset).val(null).trigger('change'); } + ); } } } } ); } - }); return this; }