PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/Resources/views/Form/Type/sonata_type_model_autocomplete.html.twig

http://github.com/sonata-project/SonataAdminBundle
Twig Template | 174 lines | 148 code | 26 blank | 0 comment | 10 complexity | 6ff9c52e869efd604817dbd15c6a263d MD5 | raw file
Possible License(s): JSON, Apache-2.0, MIT
  1. {#
  2. This file is part of the Sonata package.
  3. (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  4. For the full copyright and license information, please view the LICENSE
  5. file that was distributed with this source code.
  6. #}
  7. {% spaceless %}
  8. <input type="text" id="{{ id }}_autocomplete_input" value=""
  9. {%- if read_only is defined and read_only %} readonly="readonly"{% endif -%}
  10. {%- if disabled %} disabled="disabled"{% endif -%}
  11. {%- if required %} required="required"{% endif %}
  12. />
  13. <div id="{{ id }}_hidden_inputs_wrap">
  14. {% if multiple -%}
  15. {%- for idx, val in value if idx~'' != '_labels' -%}
  16. <input type="hidden" name="{{ full_name }}[]" {%- if disabled %} disabled="disabled"{% endif %} value="{{ val }}">
  17. {%- endfor -%}
  18. {% else -%}
  19. <input type="hidden" name="{{ full_name }}" {%- if disabled %} disabled="disabled"{% endif %} value="{{ value[0]|default('') }}">
  20. {% endif -%}
  21. </div>
  22. <script>
  23. (function ($) {
  24. var autocompleteInput = $('#{{ id }}_autocomplete_input');
  25. autocompleteInput.select2({
  26. {%- set allowClearPlaceholder = (not multiple and not required) ? ' ' : '' -%}
  27. placeholder: '{{ placeholder ?: allowClearPlaceholder }}', // allowClear needs placeholder to work properly
  28. allowClear: {{ required ? 'false' : 'true' }},
  29. enable: {{ disabled ? 'false' : 'true' }},
  30. readonly: {{ read_only is defined and read_only or attr.readonly is defined and attr.readonly ? 'true' : 'false' }},
  31. minimumInputLength: {{ minimum_input_length }},
  32. multiple: {{ multiple ? 'true' : 'false' }},
  33. width: '{{ width }}',
  34. dropdownAutoWidth: {{ dropdown_auto_width ? 'true' : 'false' }},
  35. containerCssClass: '{{ container_css_class ~ ' form-control' }}',
  36. dropdownCssClass: '{{ dropdown_css_class }}',
  37. ajax: {
  38. url: '{{ url ?: path(route.name, route.parameters|default([]))|e('js') }}',
  39. dataType: 'json',
  40. quietMillis: {{ quiet_millis }},
  41. cache: {{ cache ? 'true' : 'false' }},
  42. data: function (term, page) { // page is the one-based page number tracked by Select2
  43. {% block sonata_type_model_autocomplete_ajax_request_parameters %}
  44. return {
  45. //search term
  46. '{{ req_param_name_search }}': term,
  47. // page size
  48. '{{ req_param_name_items_per_page }}': {{ items_per_page }},
  49. // page number
  50. '{{ req_param_name_page_number }}': page,
  51. // admin
  52. {% if sonata_admin.admin is not null %}
  53. 'uniqid': '{{ sonata_admin.admin.uniqid }}',
  54. 'admin_code': '{{ sonata_admin.admin.code }}',
  55. {% elseif admin_code %}
  56. 'admin_code': '{{ admin_code }}',
  57. {% endif %}
  58. // subclass
  59. {% if app.request.query.get('subclass') %}
  60. 'subclass': '{{ app.request.query.get('subclass') }}',
  61. {% endif %}
  62. {% if context == 'filter' %}
  63. 'field': '{{ full_name|replace({'filter[': '', '][value]': '', '__':'.'}) }}',
  64. '_context': 'filter'
  65. {% else %}
  66. 'field': '{{ name }}'
  67. {% endif %}
  68. // other parameters
  69. {% if req_params is not empty %},
  70. {%- for key, value in req_params -%}
  71. '{{- key|e('js') -}}': '{{- value|e('js') -}}'
  72. {%- if not loop.last -%}, {% endif -%}
  73. {%- endfor -%}
  74. {% endif %}
  75. };
  76. {% endblock %}
  77. },
  78. results: function (data, page) {
  79. // notice we return the value of more so Select2 knows if more results can be loaded
  80. return {results: data.items, more: data.more};
  81. }
  82. },
  83. formatResult: function (item) {
  84. return {% block sonata_type_model_autocomplete_dropdown_item_format %}'<div class="{{ dropdown_item_css_class }}">'+item.label+'<\/div>'{% endblock %};// format of one dropdown item
  85. },
  86. formatSelection: function (item) {
  87. return {% block sonata_type_model_autocomplete_selection_format %}item.label{% endblock %};// format selected item '<b>'+item.label+'</b>';
  88. },
  89. escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
  90. });
  91. autocompleteInput.on('change', function(e) {
  92. // console.log('change '+JSON.stringify({val:e.val, added:e.added, removed:e.removed}));
  93. // remove input
  94. if (undefined !== e.removed && null !== e.removed) {
  95. var removedItems = e.removed;
  96. {% if multiple %}
  97. if(!$.isArray(removedItems)) {
  98. removedItems = [removedItems];
  99. }
  100. var length = removedItems.length;
  101. for (var i = 0; i < length; i++) {
  102. el = removedItems[i];
  103. $('#{{ id }}_hidden_inputs_wrap input:hidden[value="'+el.id+'"]').remove();
  104. }
  105. {%- else -%}
  106. $('#{{ id }}_hidden_inputs_wrap input:hidden').val('');
  107. {%- endif %}
  108. }
  109. // add new input
  110. var el = null;
  111. if (undefined !== e.added) {
  112. var addedItems = e.added;
  113. {% if multiple %}
  114. if(!$.isArray(addedItems)) {
  115. addedItems = [addedItems];
  116. }
  117. var length = addedItems.length;
  118. for (var i = 0; i < length; i++) {
  119. el = addedItems[i];
  120. $('#{{ id }}_hidden_inputs_wrap').append('<input type="hidden" name="{{ full_name }}[]" value="'+el.id+'" />');
  121. }
  122. {%- else -%}
  123. $('#{{ id }}_hidden_inputs_wrap input:hidden').val(addedItems.id);
  124. {%- endif %}
  125. }
  126. });
  127. // Initialise the autocomplete
  128. var data = [];
  129. {%- if value is not empty -%}
  130. data = {%- if multiple -%}[ {%- endif -%}
  131. {%- for idx, val in value if idx~'' != '_labels' -%}
  132. {%- if not loop.first -%}, {% endif -%}
  133. {id: '{{ val|e('js') }}', label:'{{ value['_labels'][idx]|e('js') }}'}
  134. {%- endfor -%}
  135. {%- if multiple -%} ] {%- endif -%};
  136. {% endif -%}
  137. if (undefined==data.length || 0<data.length) { // Leave placeholder if no data set
  138. autocompleteInput.select2('data', data);
  139. }
  140. // remove unneeded autocomplete text input before form submit
  141. $('#{{ id }}_autocomplete_input').closest('form').submit(function()
  142. {
  143. $('#{{ id }}_autocomplete_input').remove();
  144. return true;
  145. });
  146. })(jQuery);
  147. </script>
  148. {% endspaceless %}