/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/assets/src/select2/select2.js
304 строки
10 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
/** * Работа с зависимости в Select2 * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2020 */ ;(function ($) { var select_tree = []; $.fn.select2_init = function () { init_select2($(this)); }; $.fn.select2_lite_init = function () { init_select2_lite($(this)); }; $.fn.select2_update_children = function (is_init) { var select_list = do_update_children($(this), []); do_update_children_val($(this), select_list, is_init); }; $.fn.select2_ajax_init = function () { init_ajax_select2($(this)); }; // set applicative options for select2 function applicative($select2, options) { if ($select2.data('select-search') === 'off') { options.minimumResultsForSearch = Infinity; } if ($select2.data('select-search-ajax') === 'off') { options.dropdownCssClass = 'select2__without-search'; } if ($select2.data('dropdownmoreheight') === true) { options.dropdownCssClass = 'select2__dropdown-more-height'; } return options; } // исправление ошибки с сортировкой в тегах function fix_tag_sorting($select) { $select.on("select2:select", function (evt) { var element = evt.params.data.element; var $element = $(element); $element.detach(); $(this).append($element); $(this).trigger("change"); }); } // линейное обновление зависимостей function do_update_children_val(select2, select_list, is_init) { var val = select2.val(); if (!is_init) { // очищаем for (var i = 0; i < select_list.length; i++) { var $select = select_list[i].obj; var is_nested = select2.hasClass('nested'); if (!$select.hasClass('disabled-all')) { if (val == null) { if (select2.data('faset')) { if ($select.data('faset') == select2.data('faset')) { $select.val(null).trigger('change.select2'); } } else { $select.val(null).trigger('change.select2'); } } else { if ($select.attr('id') != select2.attr('id')) { if (!is_nested) { if ($select.data('faset')) { if ($select.data('faset') == select2.data('faset')) { $select.val(null).trigger('change.select2'); } } else { $select.val(null).trigger('change.select2'); } } } } } } } // блокируем for (var i = 0; i < select_list.length; i++) { var $select = select_list[i].obj; var parent = $select.data('parent'); var parent_count = 0; var ids = parent.split(","); $(ids).each(function (ind) { var sel = ids[ind]; if (sel) { var p = $('#' + sel); if (p.attr('aria-required') == 'true') { parent_count++; } } }); var data = App.make_parent(parent, true); if (!$select.hasClass('disabled-all')) { if (data.length == parent_count || select2.hasClass('enabled')) { App.enabled($select, true); } else { App.enabled($select, false); } } } } // обновление зависимых объектов function do_update_children(select2, select_list) { var children = $('[data-parent*="' + select2.attr('id') + '"]:not(.avoid)'); children.each(function () { var $o = $(this); var id = $o.attr('id'); if (!indexOf(select_list, id)) { select_list = addIn(select_list, id, $o); select_list = do_update_children($o, select_list); } }); return select_list; } // Зависимость объектов function do_change(val) { var alert = true; var select2 = $(this); var val = select2.val(); var is_lite = select2.hasClass('on-remove'); var nested = select2.hasClass('nested'); if (is_lite) { alert = val == null; } // if (alert) { var select_list = do_update_children(select2, []); do_update_children_val(select2, select_list, false); // } // при смене состояния, если есть атрибут data-url - то передаём туда выделенное значение var url = select2.data('url'); if (url) { var data = []; data.push({name: 'value', value: val}); App.post(null, url, data); } } function init_ajax_select2(dom) { $('.select2lite:not(.not-initialize)', dom).each(function () { init_select2_lite($(this)); }); var $list = $('.select2-ajax:not(.not-initialize)', dom); $list.each(function () { init_select2($(this)); }); $list.each(function () { var select_list = do_update_children($(this), []); do_update_children_val($(this), select_list, true); }); } function init_select2_lite($select2) { var lng = App.lang(); if (lng == 'zh') { lng = 'zh-CN'; } $select2.select2(applicative($select2, { placeholder: "Select from the list", language: lng, allowClear: true })).on('change', do_change); if ($select2.data('tags')) { fix_tag_sorting($select2); } } function init_select2($select2) { var lng = App.lang(); if (lng == 'zh') { lng = 'zh-CN'; } var is_tags = $select2.data('tags'); var is_multiple = $select2.data('multiple'); var min_input_length = $select2.data('min_input_length'); var config = { placeholder: "Select from the list", allowClear: !is_tags, language: lng, tags: is_tags, multiple: is_multiple, tokenSeparators: [","], createTag: function (term, data) { if ($select2.data('append')) { if ($(data).filter(function () { return this.text.localeCompare(term.term) === 0; }).length === 0) { if (term.term) { return { id: term.term, text: term.term, html: 'Add: "' + term.term + '"' }; } } } }, ajax: { url: $select2.attr('data-source'), dataType: 'json', delay: 250, data: function (params) { var parent = $(this).attr('data-parent'); var data = App.make_parent(parent); data.push({name: 'q', value: params.term}); data.push({name: 'page_limit', value: 25}); data.push({name: 'page', value: params.page || 1}); return data; }, processResults: function (data, params) { params.page = params.page || 1; return { results: data.result, pagination: { more: (params.page * 25) < data.total } }; }, cache: false }, escapeMarkup: function (markup) { return markup; }, // let our custom formatter work templateResult: function (obj) { if (obj.html) { return obj.html; } else { return obj.text; } }, // omitted for brevity, see the source of this page templateSelection: function (obj) { const option = $(obj.element); const color = option.data("color"); if (!color) { return obj.text; } return $(`<span style="color: ${color}">${obj.text}</span>`); // if (obj.html && !obj.as_text) { // return obj.html; // } // else { // return obj.text; // } } // omitted for brevity, see the source of this page }; if (!(min_input_length === null || min_input_length === undefined)) { config.minimumInputLength = min_input_length; } $select2.select2(applicative($select2, config)).on('change', do_change); if (is_tags) { // fix_tag_sorting($select2); } } })(jQuery); jQuery(document).ready(function ($) { $(".select2-ajax").each(function () { $(this).select2_init(); }); $(".select2lite").each(function () { $(this).select2_lite_init(); }); $(".select2-ajax").each(function () { $(this).select2_update_children(true); }); $(document).on('ajax-loaded', function (event, form) { $(form).select2_ajax_init(); }); });