mirror of
https://gitlab.crans.org/bde/nk20
synced 2024-11-30 12:23:00 +00:00
123 lines
4.1 KiB
JavaScript
123 lines
4.1 KiB
JavaScript
|
;(function ($) {
|
||
|
if (window.__dal__initListenerIsSet)
|
||
|
return;
|
||
|
|
||
|
$(document).on('autocompleteLightInitialize', '[data-autocomplete-light-function=select2]', function() {
|
||
|
var element = $(this);
|
||
|
|
||
|
// Templating helper
|
||
|
function template(text, is_html) {
|
||
|
if (is_html) {
|
||
|
var $result = $('<span>');
|
||
|
$result.html(text);
|
||
|
return $result;
|
||
|
} else {
|
||
|
return text;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function result_template(item) {
|
||
|
var text = template(item.text,
|
||
|
element.attr('data-html') !== undefined || element.attr('data-result-html') !== undefined
|
||
|
);
|
||
|
|
||
|
if (item.create_id) {
|
||
|
return $('<span></span>').text(text).addClass('dal-create')
|
||
|
} else {
|
||
|
return text
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function selected_template(item) {
|
||
|
if (item.selected_text !== undefined) {
|
||
|
return template(item.selected_text,
|
||
|
element.attr('data-html') !== undefined || element.attr('data-selected-html') !== undefined
|
||
|
);
|
||
|
} else {
|
||
|
return result_template(item);
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var ajax = null;
|
||
|
if ($(this).attr('data-autocomplete-light-url')) {
|
||
|
ajax = {
|
||
|
url: $(this).attr('data-autocomplete-light-url'),
|
||
|
dataType: 'json',
|
||
|
delay: 250,
|
||
|
|
||
|
data: function (params) {
|
||
|
var data = {
|
||
|
q: params.term, // search term
|
||
|
page: params.page,
|
||
|
create: element.attr('data-autocomplete-light-create') && !element.attr('data-tags'),
|
||
|
forward: yl.getForwards(element)
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
},
|
||
|
processResults: function (data, page) {
|
||
|
if (element.attr('data-tags')) {
|
||
|
$.each(data.results, function(index, value) {
|
||
|
value.id = value.text;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return data;
|
||
|
},
|
||
|
cache: true
|
||
|
};
|
||
|
}
|
||
|
|
||
|
$(this).select2({
|
||
|
tokenSeparators: element.attr('data-tags') ? [','] : null,
|
||
|
debug: true,
|
||
|
containerCssClass: ':all:',
|
||
|
placeholder: element.attr('data-placeholder') || '',
|
||
|
language: element.attr('data-autocomplete-light-language'),
|
||
|
minimumInputLength: element.attr('data-minimum-input-length') || 0,
|
||
|
allowClear: ! $(this).is('[required]'),
|
||
|
templateResult: result_template,
|
||
|
templateSelection: selected_template,
|
||
|
ajax: ajax,
|
||
|
tags: Boolean(element.attr('data-tags')),
|
||
|
});
|
||
|
|
||
|
$(this).on('select2:selecting', function (e) {
|
||
|
var data = e.params.args.data;
|
||
|
|
||
|
if (data.create_id !== true)
|
||
|
return;
|
||
|
|
||
|
e.preventDefault();
|
||
|
|
||
|
var select = $(this);
|
||
|
|
||
|
$.ajax({
|
||
|
url: $(this).attr('data-autocomplete-light-url'),
|
||
|
type: 'POST',
|
||
|
dataType: 'json',
|
||
|
data: {
|
||
|
text: data.id,
|
||
|
forward: yl.getForwards($(this))
|
||
|
},
|
||
|
beforeSend: function(xhr, settings) {
|
||
|
xhr.setRequestHeader("X-CSRFToken", document.csrftoken);
|
||
|
},
|
||
|
success: function(data, textStatus, jqXHR ) {
|
||
|
select.append(
|
||
|
$('<option>', {value: data.id, text: data.text, selected: true})
|
||
|
);
|
||
|
select.trigger('change');
|
||
|
select.select2('close');
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
});
|
||
|
window.__dal__initListenerIsSet = true;
|
||
|
$('[data-autocomplete-light-function=select2]:not([id*="__prefix__"])').each(function() {
|
||
|
window.__dal__initialize(this);
|
||
|
});
|
||
|
})(yl.jQuery);
|