暫無描述

select2.js 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. ;(function ($) {
  2. if (window.__dal__initListenerIsSet)
  3. return;
  4. $(document).on('autocompleteLightInitialize', '[data-autocomplete-light-function=select2]', function() {
  5. var element = $(this);
  6. // Templating helper
  7. function template(text, is_html) {
  8. if (is_html) {
  9. var $result = $('<span>');
  10. $result.html(text);
  11. return $result;
  12. } else {
  13. return text;
  14. }
  15. }
  16. function result_template(item) {
  17. var text = template(item.text,
  18. element.attr('data-html') !== undefined || element.attr('data-result-html') !== undefined
  19. );
  20. if (item.create_id) {
  21. return $('<span></span>').text(text).addClass('dal-create')
  22. } else {
  23. return text
  24. }
  25. }
  26. function selected_template(item) {
  27. if (item.selected_text !== undefined) {
  28. return template(item.selected_text,
  29. element.attr('data-html') !== undefined || element.attr('data-selected-html') !== undefined
  30. );
  31. } else {
  32. return result_template(item);
  33. }
  34. return
  35. }
  36. var ajax = null;
  37. if ($(this).attr('data-autocomplete-light-url')) {
  38. ajax = {
  39. url: $(this).attr('data-autocomplete-light-url'),
  40. dataType: 'json',
  41. delay: 250,
  42. data: function (params) {
  43. var data = {
  44. q: params.term, // search term
  45. page: params.page,
  46. create: element.attr('data-autocomplete-light-create') && !element.attr('data-tags'),
  47. forward: yl.getForwards(element)
  48. };
  49. return data;
  50. },
  51. processResults: function (data, page) {
  52. if (element.attr('data-tags')) {
  53. $.each(data.results, function(index, value) {
  54. value.id = value.text;
  55. });
  56. }
  57. return data;
  58. },
  59. cache: true
  60. };
  61. }
  62. $(this).select2({
  63. tokenSeparators: element.attr('data-tags') ? [','] : null,
  64. debug: true,
  65. containerCssClass: ':all:',
  66. placeholder: element.attr('data-placeholder') || '',
  67. language: element.attr('data-autocomplete-light-language'),
  68. minimumInputLength: element.attr('data-minimum-input-length') || 0,
  69. allowClear: ! $(this).is('[required]'),
  70. templateResult: result_template,
  71. templateSelection: selected_template,
  72. ajax: ajax,
  73. tags: Boolean(element.attr('data-tags')),
  74. });
  75. $(this).on('select2:selecting', function (e) {
  76. var data = e.params.args.data;
  77. if (data.create_id !== true)
  78. return;
  79. e.preventDefault();
  80. var select = $(this);
  81. $.ajax({
  82. url: $(this).attr('data-autocomplete-light-url'),
  83. type: 'POST',
  84. dataType: 'json',
  85. data: {
  86. text: data.id,
  87. forward: yl.getForwards($(this))
  88. },
  89. beforeSend: function(xhr, settings) {
  90. xhr.setRequestHeader("X-CSRFToken", document.csrftoken);
  91. },
  92. success: function(data, textStatus, jqXHR ) {
  93. select.append(
  94. $('<option>', {value: data.id, text: data.text, selected: true})
  95. );
  96. select.trigger('change');
  97. select.select2('close');
  98. }
  99. });
  100. });
  101. });
  102. window.__dal__initListenerIsSet = true;
  103. $('[data-autocomplete-light-function=select2]:not([id*="__prefix__"])').each(function() {
  104. window.__dal__initialize(this);
  105. });
  106. })(yl.jQuery);