106 lines
4.8 KiB
JavaScript
106 lines
4.8 KiB
JavaScript
'use strict';
|
|
{
|
|
const $ = django.jQuery;
|
|
|
|
$.fn.djangoAdminSelect2 = function() {
|
|
$.each(this, function(i, element) {
|
|
var select2_config = {};
|
|
select2_config.ajax = {
|
|
data: (params)=>{
|
|
var field_name = element.dataset.fieldName
|
|
var out = {
|
|
term: params.term,
|
|
page: params.page,
|
|
app_label: element.dataset.appLabel,
|
|
model_name: element.dataset.modelName,
|
|
field_name: field_name
|
|
};
|
|
if (element.dataset.hasOwnProperty('drilldown_enabled')) {
|
|
out.drilldown = 1;
|
|
if (element.dataset.hasOwnProperty('linkedfields')) {
|
|
var linkedfields = JSON.parse(element.dataset.linkedfields)
|
|
var linkedfields_obj = {};
|
|
var some_obj = false;
|
|
for (var i in linkedfields) {
|
|
if (linkedfields.hasOwnProperty(i)) {
|
|
var remote_field = linkedfields[i];
|
|
var field_id = element.dataset.select2Id;
|
|
var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field;
|
|
var value = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0].value;
|
|
if (value !== '') {
|
|
linkedfields_obj[remote_field] = value;
|
|
some_obj = true;
|
|
}
|
|
}
|
|
}
|
|
if (some_obj) {
|
|
out['linkedfields'] = JSON.stringify(linkedfields_obj);
|
|
}
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
};
|
|
if (element.dataset.hasOwnProperty('drilldown_enabled')) {
|
|
select2_config.templateResult = (item,container)=>{
|
|
var 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) {
|
|
$(element).select2("trigger", "select", {
|
|
data: item
|
|
})
|
|
}
|
|
}
|
|
|
|
return $('<span class="' + styleClass + '"></span>').text(item.text);
|
|
}
|
|
}
|
|
$(element).select2(select2_config);
|
|
if (element.dataset.hasOwnProperty('reset_on_excluded')) {
|
|
$(element).on('select2:select', ev=>{
|
|
var 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 remote_field = reset_on_excluded[i];
|
|
var field_id = element.dataset.select2Id;
|
|
var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field;
|
|
var remote_element = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0];
|
|
$(remote_element).val(null).trigger("change");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
});
|
|
return this;
|
|
}
|
|
;
|
|
|
|
$(function() {
|
|
// Initialize all autocomplete widgets except the one in the template
|
|
// form used when a new formset is added.
|
|
$('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
|
|
});
|
|
|
|
document.addEventListener('formset:added', (event)=>{
|
|
$(event.target).find('.admin-autocomplete').djangoAdminSelect2();
|
|
}
|
|
);
|
|
}
|