vendor/sonata-project/admin-bundle/src/Resources/views/Form/form_admin_fields.html.twig line 395

Open in your IDE?
  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. {% extends 'form_div_layout.html.twig' %}
  8. {% block form_errors -%}
  9.     {% if errors|length > 0 %}
  10.         {% if not form.parent %}<div class="alert alert-danger">{% endif %}
  11.             <ul class="list-unstyled">
  12.                 {% for error in errors %}
  13.                     <li><i class="fa fa-exclamation-circle" aria-hidden="true"></i> {{ error.message }}</li>
  14.                 {% endfor %}
  15.             </ul>
  16.         {% if not form.parent %}</div>{% endif %}
  17.     {% endif %}
  18. {%- endblock form_errors %}
  19. {# NEXT_MAJOR: Remove this block and all the calls made to this block #}
  20. {% block sonata_help %}
  21. {% apply spaceless %}
  22. {% if sonata_help is defined and sonata_help %}
  23.     {% deprecated 'The "sonata_help" option is deprecated since sonata-project/admin-bundle 3.60, to be removed in 4.0. Use "help" instead.' %}
  24.     <span class="help-block sonata-ba-field-widget-help">{{ sonata_help|raw }}</span>
  25. {% endif %}
  26. {% endapply %}
  27. {% endblock %}
  28. {% block form_help %}
  29.     {% apply spaceless %}
  30.         <span class="help-block sonata-ba-field-widget-help">{{ parent() }}</span>
  31.     {% endapply %}
  32. {% endblock %}
  33. {% block form_widget -%}
  34.     {{ parent() }}
  35.     {{ block('sonata_help') }}
  36. {%- endblock form_widget %}
  37. {% block form_widget_simple %}
  38.     {% set type = type|default('text') %}
  39.     {% if type != 'file' %}
  40.         {% set attr = attr|merge({'class': attr.class|default('') ~ ' form-control'}) %}
  41.     {% endif %}
  42.     {{ parent() }}
  43. {% endblock form_widget_simple %}
  44. {% block textarea_widget %}
  45.     {% set attr = attr|merge({'class': attr.class|default('') ~ ' form-control'}) %}
  46.     {{ parent() }}
  47.     {{ block('sonata_help') }}
  48. {% endblock textarea_widget %}
  49. {% block number_widget -%}
  50.     {{ parent() }}
  51.     {{ block('sonata_help') }}
  52. {%- endblock number_widget %}
  53. {% block choice_widget -%}
  54.     {{ parent() }}
  55.     {{ block('sonata_help') }}
  56. {%- endblock choice_widget %}
  57. {% block money_widget -%}
  58.     {% if money_pattern == '{{ widget }}' %}
  59.         {{- block('form_widget_simple') -}}
  60.     {% else %}
  61.         {% set currencySymbol = money_pattern|replace({'{{ widget }}': ''})|trim %}
  62.         {% if money_pattern matches '/^{{ widget }}/' %}
  63.             <div class="input-group">
  64.                 {{- block('form_widget_simple') -}}
  65.                 <span class="input-group-addon">{{ currencySymbol }}</span>
  66.             </div>
  67.         {% elseif money_pattern matches '/{{ widget }}$/' %}
  68.             <div class="input-group">
  69.                 <span class="input-group-addon">{{ currencySymbol }}</span>
  70.                 {{- block('form_widget_simple') -}}
  71.             </div>
  72.         {% endif %}
  73.     {% endif %}
  74.     {{ block('sonata_help') }}
  75. {%- endblock money_widget %}
  76. {% block percent_widget %}
  77.     {% apply spaceless %}
  78.         {% set type = type|default('text') %}
  79.         <div class="input-group">
  80.             {{ block('form_widget_simple') }}
  81.             <span class="input-group-addon">%</span>
  82.         </div>
  83.         {{ block('sonata_help') }}
  84.     {% endapply %}
  85. {% endblock percent_widget %}
  86. {% block checkbox_widget -%}
  87.     {% set parent_label_class = parent_label_class|default('') -%}
  88.     {% if 'checkbox-inline' in parent_label_class %}
  89.         {{- form_label(form, null, { widget: parent() }) -}}
  90.     {% else -%}
  91.         <div class="checkbox">
  92.             {{- form_label(form, null, { widget: parent() }) -}}
  93.         </div>
  94.     {%- endif %}
  95. {%- endblock checkbox_widget %}
  96. {% block radio_widget -%}
  97.     {%- set parent_label_class = parent_label_class|default('') -%}
  98.     {% if 'radio-inline' in parent_label_class %}
  99.         {{- form_label(form, null, { widget: parent() }) -}}
  100.     {% else -%}
  101.         <div class="radio">
  102.             {{- form_label(form, null, { widget: parent() }) -}}
  103.         </div>
  104.     {%- endif %}
  105. {%- endblock radio_widget %}
  106. {# Labels #}
  107. {% block form_label %}
  108. {% apply spaceless %}
  109.     {% if label is not same as(false) and sonata_admin.options['form_type'] == 'horizontal' %}
  110.         {% set label_class = 'col-sm-3' %}
  111.     {% endif %}
  112.     {% set label_class = label_class|default('') ~ ' control-label' %}
  113.     {% if label is not same as(false) %}
  114.         {% set label_attr = label_attr|merge({'class': label_attr.class|default('') ~ ' ' ~ label_class }) %}
  115.         {% if not compound %}
  116.             {% set label_attr = label_attr|merge({'for': id}) %}
  117.         {% endif %}
  118.         {% if required %}
  119.             {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
  120.         {% endif %}
  121.         {% if label is empty %}
  122.             {%- if label_format is defined and label_format is not empty -%}
  123.                 {% set label = label_format|replace({
  124.                     '%name%': name,
  125.                     '%id%': id,
  126.                 }) %}
  127.             {%- else -%}
  128.                 {% set label = name|humanize %}
  129.             {%- endif -%}
  130.         {% endif %}
  131.         <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
  132.             {% if translation_domain is same as(false) %}
  133.                 {{- label -}}
  134.             {% elseif not sonata_admin.admin %}
  135.                 {{- label|trans({}, translation_domain) -}}
  136.             {% else %}
  137.                 {{ label|trans({}, sonata_admin.field_description.translationDomain ?: admin.translationDomain) }}
  138.             {% endif %}
  139.         </label>
  140.     {% endif %}
  141. {% endapply %}
  142. {% endblock form_label %}
  143. {% block checkbox_label -%}
  144.     {{- block('checkbox_radio_label') -}}
  145. {%- endblock checkbox_label %}
  146. {% block radio_label -%}
  147.     {{- block('checkbox_radio_label') -}}
  148. {%- endblock radio_label %}
  149. {% block checkbox_radio_label %}
  150.     {% if sonata_admin.admin %}
  151.         {% set translation_domain = sonata_admin.field_description.translationDomain %}
  152.     {% endif %}
  153.     {# Do not display the label if widget is not defined in order to prevent double label rendering #}
  154.     {% if widget is defined %}
  155.         {% if required %}
  156.             {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' required')|trim}) %}
  157.         {% endif %}
  158.         {% if parent_label_class is defined %}
  159.             {% set label_attr = label_attr|merge({class: (label_attr.class|default('') ~ ' ' ~ parent_label_class)|trim}) %}
  160.         {% endif %}
  161.         {% if label is not same as(false) and label is empty %}
  162.             {% set label = name|humanize %}
  163.         {% endif %}
  164.         <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
  165.             {{- widget|raw -}}
  166.             {%- if label is not same as(false) -%}
  167.                 <span class="control-label__text">
  168.                     {% if translation_domain is same as(false) %}
  169.                         {{- label -}}
  170.                     {% else %}
  171.                         {{- label|trans({}, translation_domain) -}}
  172.                     {%- endif -%}
  173.                 </span>
  174.             {%- endif -%}
  175.         </label>
  176.     {% endif %}
  177. {% endblock checkbox_radio_label %}
  178. {% block choice_widget_expanded %}
  179. {% apply spaceless %}
  180.     {% set attr = attr|merge({'class': attr.class|default('') ~ ' list-unstyled'}) %}
  181.     <ul {{ block('widget_container_attributes') }}>
  182.     {% for child in form %}
  183.         <li>
  184.             {{ form_widget(child, {
  185.                 'horizontal': false,
  186.                 'horizontal_input_wrapper_class': '',
  187.                 'translation_domain': choice_translation_domain
  188.             }) }} {# 'horizontal' values are needed to avoid MopaBootstrapBundle messing with the DOM #}
  189.         </li>
  190.     {% endfor %}
  191.     </ul>
  192. {% endapply %}
  193. {% endblock choice_widget_expanded %}
  194. {% block choice_widget_collapsed %}
  195. {% apply spaceless %}
  196.     {% if required and placeholder is defined and placeholder is none %}
  197.         {% set required = false %}
  198.     {% elseif required and empty_value is defined and empty_value_in_choices is defined and empty_value is none and not empty_value_in_choices and not multiple %}
  199.         {% set required = false %}
  200.     {% endif %}
  201.     {% set attr = attr|merge({'class': attr.class|default('') ~ ' form-control'}) %}
  202.     {% if (sortable is defined) and sortable and multiple %}
  203.         {{ block('sonata_type_choice_multiple_sortable') }}
  204.     {% else %}
  205.         <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %} >
  206.             {% if empty_value is defined and empty_value is not none %}
  207.                 <option value=""{% if required and value is empty %} selected="selected"{% endif %}>
  208.                     {% if empty_value != '' %}
  209.                         {% if not sonata_admin.admin %}
  210.                             {{- empty_value|trans({}, translation_domain) -}}
  211.                         {% else %}
  212.                             {{- empty_value|trans({}, sonata_admin.field_description.translationDomain) -}}
  213.                         {% endif %}
  214.                     {% endif %}
  215.                 </option>
  216.             {% elseif placeholder is defined and placeholder is not none %}
  217.                 <option value=""{% if required and value is empty %} selected="selected"{% endif %}>
  218.                     {% if placeholder != '' %}
  219.                         {% if not sonata_admin.admin %}
  220.                             {{- placeholder|trans({}, translation_domain) -}}
  221.                         {% else %}
  222.                             {{- placeholder|trans({}, sonata_admin.field_description.translationDomain) -}}
  223.                         {% endif %}
  224.                     {% endif %}
  225.                 </option>
  226.             {% endif %}
  227.             {% if preferred_choices|length > 0 %}
  228.                 {% set options = preferred_choices %}
  229.                 {{ block('choice_widget_options') }}
  230.                 {% if choices|length > 0 %}
  231.                     <option disabled="disabled">{{ separator }}</option>
  232.                 {% endif %}
  233.             {% endif %}
  234.             {% set options = choices %}
  235.             {{ block('choice_widget_options') }}
  236.         </select>
  237.     {% endif %}
  238. {% endapply %}
  239. {% endblock choice_widget_collapsed %}
  240. {% block date_widget %}
  241. {% apply spaceless %}
  242.     {% if widget == 'single_text' %}
  243.         {{ block('form_widget_simple') }}
  244.     {% else %}
  245.         {% if row is not defined or row == true %}
  246.             {% set attr = attr|merge({'class': attr.class|default('') ~ ' row' }) %}
  247.         {% endif %}
  248.         {% set input_wrapper_class = input_wrapper_class|default('col-sm-4') %}
  249.         <div {{ block('widget_container_attributes') }}>
  250.             {{ date_pattern|replace({
  251.                 '{{ year }}':  '<div class="'~ input_wrapper_class ~ '">' ~ form_widget(form.year) ~ '</div>',
  252.                 '{{ month }}': '<div class="'~ input_wrapper_class ~ '">' ~ form_widget(form.month) ~ '</div>',
  253.                 '{{ day }}':   '<div class="'~ input_wrapper_class ~ '">' ~ form_widget(form.day) ~ '</div>',
  254.             })|raw }}
  255.         </div>
  256.     {% endif %}
  257.     {% if datepicker_use_button is not defined %}
  258.         {{ block('sonata_help') }}
  259.     {% endif %}
  260. {% endapply %}
  261. {% endblock date_widget %}
  262. {% block time_widget %}
  263. {% apply spaceless %}
  264.     {% if widget == 'single_text' %}
  265.         {{ block('form_widget_simple') }}
  266.     {% else %}
  267.         {% if row is not defined or row == true %}
  268.             {% set attr = attr|merge({'class': attr.class|default('') ~ ' row' }) %}
  269.         {% endif %}
  270.         {% set input_wrapper_class = input_wrapper_class|default('col-sm-6') %}
  271.         <div {{ block('widget_container_attributes') }}>
  272.             <div class="{{ input_wrapper_class }}">
  273.                 {{ form_widget(form.hour) }}
  274.             </div>
  275.             {% if with_minutes %}
  276.                 <div class="{{ input_wrapper_class }}">
  277.                     {{ form_widget(form.minute) }}
  278.                 </div>
  279.             {% endif %}
  280.             {% if with_seconds %}
  281.                 <div class="{{ input_wrapper_class }}">
  282.                     {{ form_widget(form.second) }}
  283.                 </div>
  284.             {% endif %}
  285.         </div>
  286.     {% endif %}
  287.     {{ block('sonata_help') }}
  288. {% endapply %}
  289. {% endblock time_widget %}
  290. {% block datetime_widget %}
  291. {% apply spaceless %}
  292.     {% if widget == 'single_text' %}
  293.         {{ block('form_widget_simple') }}
  294.     {% else %}
  295.         {% set attr = attr|merge({'class': attr.class|default('') ~ ' row' }) %}
  296.         <div {{ block('widget_container_attributes') }}>
  297.             {{ form_errors(form.date) }}
  298.             {{ form_errors(form.time) }}
  299.             {% if form.date.vars.widget == 'single_text' %}
  300.                 <div class="col-sm-2">
  301.                     {{ form_widget(form.date) }}
  302.                 </div>
  303.             {% else %}
  304.                 {{ form_widget(form.date, {'row': false, 'input_wrapper_class': 'col-sm-2'}) }}
  305.             {% endif %}
  306.             {% if form.time.vars.widget == 'single_text' %}
  307.                 <div class="col-sm-2">
  308.                     {{ form_widget(form.time) }}
  309.                 </div>
  310.             {% else %}
  311.                 {{ form_widget(form.time, {'row': false, 'input_wrapper_class': 'col-sm-2'}) }}
  312.             {% endif %}
  313.         </div>
  314.     {% endif %}
  315.     {% if datepicker_use_button is not defined %}
  316.         {{ block('sonata_help') }}
  317.     {% endif %}
  318. {% endapply %}
  319. {% endblock datetime_widget %}
  320. {% block form_row %}
  321.     {% set show_label = show_label ?? true %}
  322.     <div class="form-group{% if errors|length > 0 %} has-error{% endif %}" id="sonata-ba-field-container-{{ id }}">
  323.         {% if sonata_admin.field_description.options is defined %}
  324.             {% set label = sonata_admin.field_description.options.name|default(label) %}
  325.         {% endif %}
  326.         {% set div_class = 'sonata-ba-field' %}
  327.         {% if label is same as(false) %}
  328.             {% set div_class = div_class ~ ' sonata-collection-row-without-label' %}
  329.         {% endif %}
  330.         {% if sonata_admin is defined and sonata_admin.options['form_type'] == 'horizontal' %}
  331.             {# Add an offset if no label or is a checkbox/radio #}
  332.             {% if label is same as(false) or form.vars.checked is defined %}
  333.                 {% if 'collection' in form.parent.vars.block_prefixes %}
  334.                     {% set div_class = div_class ~ ' col-sm-12' %}
  335.                 {% else %}
  336.                     {% set div_class = div_class ~ ' col-sm-9 col-sm-offset-3' %}
  337.                 {% endif %}
  338.             {% else %}
  339.                 {% set div_class = div_class ~ ' col-sm-9' %}
  340.             {% endif %}
  341.         {% endif %}
  342.         {% if show_label %}
  343.             {{ form_label(form, label|default(null)) }}
  344.         {% endif %}
  345.         {% if sonata_admin is defined and sonata_admin_enabled %}
  346.             {% set div_class = div_class ~ ' sonata-ba-field-' ~ sonata_admin.edit ~ '-' ~ sonata_admin.inline %}
  347.         {% endif %}
  348.         {% if errors|length > 0 %}
  349.             {% set div_class = div_class ~ ' sonata-ba-field-error' %}
  350.         {% endif %}
  351.         <div class="{{ div_class }}">
  352.             {{ form_widget(form, {'horizontal': false, 'horizontal_input_wrapper_class': ''}) }} {# {'horizontal': false, 'horizontal_input_wrapper_class': ''} needed to avoid MopaBootstrapBundle messing with the DOM #}
  353.             {% if errors|length > 0 %}
  354.                 <div class="help-block sonata-ba-field-error-messages">
  355.                     {{ form_errors(form) }}
  356.                 </div>
  357.             {% endif %}
  358.             {% if sonata_admin is defined and sonata_admin_enabled and sonata_admin.field_description.help|default(false) %}
  359.                 <span class="help-block sonata-ba-field-help">{{ sonata_admin.field_description.help|trans({}, sonata_admin.field_description.translationDomain ?: admin.translationDomain)|raw }}</span>
  360.             {% endif %}
  361.             {{ form_help(form) }}
  362.         </div>
  363.     </div>
  364. {% endblock form_row %}
  365. {% block checkbox_row -%}
  366.     {% set show_label = false %}
  367.     {{ block('form_row') }}
  368. {%- endblock checkbox_row %}
  369. {% block radio_row -%}
  370.     {% set show_label = false %}
  371.     {{ block('form_row') }}
  372. {%- endblock radio_row %}
  373. {% block sonata_type_native_collection_widget_row %}
  374. {% apply spaceless %}
  375.     <div class="sonata-collection-row">
  376.         {% if allow_delete %}
  377.             <div class="row">
  378.                 <div class="col-xs-1">
  379.                     <a href="#" class="btn btn-link sonata-collection-delete">
  380.                         <i class="fa fa-minus-circle" aria-hidden="true"></i>
  381.                     </a>
  382.                 </div>
  383.                 <div class="col-xs-11">
  384.         {% endif %}
  385.             {{ form_row(child, { label: false }) }}
  386.         {% if allow_delete %}
  387.                 </div>
  388.             </div>
  389.         {% endif %}
  390.     </div>
  391. {% endapply %}
  392. {% endblock sonata_type_native_collection_widget_row %}
  393. {% block sonata_type_native_collection_widget %}
  394. {% apply spaceless %}
  395.     {% if prototype is defined %}
  396.         {% set child = prototype %}
  397.         {% set allow_delete_backup = allow_delete %}
  398.         {% set allow_delete = true %}
  399.         {% set attr = attr|merge({'data-prototype': block('sonata_type_native_collection_widget_row'), 'data-prototype-name': prototype.vars.name, 'class': attr.class|default('') }) %}
  400.         {% set allow_delete = allow_delete_backup %}
  401.     {% endif %}
  402.     <div {{ block('widget_container_attributes') }}>
  403.         {{ form_errors(form) }}
  404.         {% for child in form %}
  405.             {{ block('sonata_type_native_collection_widget_row') }}
  406.         {% endfor %}
  407.         {{ form_rest(form) }}
  408.         {% if allow_add %}
  409.             <div><a href="#" class="btn btn-link sonata-collection-add"><i class="fa fa-plus-circle" aria-hidden="true"></i></a></div>
  410.         {% endif %}
  411.     </div>
  412. {% endapply %}
  413. {% endblock sonata_type_native_collection_widget %}
  414. {% block sonata_type_immutable_array_widget %}
  415.     {% apply spaceless %}
  416.         <div {{ block('widget_container_attributes') }}>
  417.             {{ block('sonata_help') }}
  418.             {{ form_errors(form) }}
  419.             {% for key, child in form %}
  420.                 {{ block('sonata_type_immutable_array_widget_row') }}
  421.             {% endfor %}
  422.             {{ form_rest(form) }}
  423.         </div>
  424.     {% endapply %}
  425. {% endblock sonata_type_immutable_array_widget %}
  426. {% block sonata_type_immutable_array_widget_row %}
  427.     {% apply spaceless %}
  428.         <div class="form-group{% if child.vars.errors|length > 0 %} has-error{% endif %}" id="sonata-ba-field-container-{{ id }}-{{ key }}">
  429.             {{ form_label(child) }}
  430.             {% set div_class = "" %}
  431.             {% if sonata_admin.options['form_type'] == 'horizontal' %}
  432.                 {% set div_class = 'col-sm-9' %}
  433.             {% endif %}
  434.             <div class="{{ div_class }} sonata-ba-field sonata-ba-field-{{ sonata_admin.edit }}-{{ sonata_admin.inline }}{% if child.vars.errors|length > 0 %} sonata-ba-field-error{% endif %}">
  435.                 {{ form_widget(child, {'horizontal': false, 'horizontal_input_wrapper_class': ''}) }} {# {'horizontal': false, 'horizontal_input_wrapper_class': ''} needed to avoid MopaBootstrapBundle messing with the DOM #}
  436.                 {% set sonata_help = child.vars.sonata_help %}
  437.                 {{ block('sonata_help') }}
  438.             </div>
  439.             {% if child.vars.errors|length > 0 %}
  440.                 <div class="help-block sonata-ba-field-error-messages">
  441.                     {{ form_errors(child) }}
  442.                 </div>
  443.             {% endif %}
  444.         </div>
  445.     {% endapply %}
  446. {% endblock %}
  447. {% block sonata_type_model_autocomplete_widget %}
  448.     {% include template %}
  449. {% endblock sonata_type_model_autocomplete_widget %}
  450. {% block sonata_type_choice_field_mask_widget %}
  451.     {{ block('choice_widget') }}
  452.     {# Taking the form name excluding ending field glue character #}
  453.     {% set main_form_name = id|slice(0, (id|length - name|length)-1) %}
  454.     {% if expanded %}
  455.         {% set js_selector = '#' ~ main_form_name ~ '_' ~ name ~ ' input' %}
  456.         {% set js_event = 'ifChecked' %}
  457.     {% else %}
  458.         {% set js_selector = '#' ~ main_form_name ~ '_' ~ name %}
  459.         {% set js_event = 'change' %}
  460.     {% endif %}
  461.     <script>
  462.         jQuery(document).ready(function() {
  463.             var allFields = {{ all_fields|json_encode|raw }},
  464.                 map = {{ map|json_encode|raw }},
  465.                 showMaskChoiceEl = jQuery("{{ js_selector }}");
  466.             showMaskChoiceEl.on("{{ js_event }}", function () {
  467.                 choice_field_mask_show(jQuery(this).val());
  468.             });
  469.             function choice_field_mask_show(val) {
  470.                 var controlGroupIdFunc = function (field) {
  471.                     // Most of fields are named with an underscore
  472.                     var defaultFieldId = '#sonata-ba-field-container-{{ main_form_name }}_' + field;
  473.                     // Some fields may be named with a dash (like keys of immutable array form type)
  474.                     if (jQuery(defaultFieldId).length === 0) {
  475.                         return '#sonata-ba-field-container-{{ main_form_name }}-' + field;
  476.                     }
  477.                     return defaultFieldId;
  478.                 };
  479.                 jQuery.each(allFields, function (i, field) {
  480.                     var fieldContainer = controlGroupIdFunc(field);
  481.                     jQuery(fieldContainer).hide();
  482.                     jQuery(fieldContainer).find('[required="required"]').attr('data-required', 'required').removeAttr("required");
  483.                 });
  484.                 if (map[val]) {
  485.                     jQuery.each(map[val], function (i, field) {
  486.                         var fieldContainer = controlGroupIdFunc(field);
  487.                         jQuery(fieldContainer).show();
  488.                         jQuery(fieldContainer).find('[data-required="required"]').attr("required", "required");
  489.                     });
  490.                 }
  491.             }
  492.             {% if value is empty %}
  493.                 choice_field_mask_show(showMaskChoiceEl.val());
  494.             {% else %}
  495.                 choice_field_mask_show('{{ value|e('js') }}');
  496.             {% endif %}
  497.         });
  498.     </script>
  499. {% endblock %}
  500. {% block sonata_type_choice_multiple_sortable %}
  501.     <input type="hidden" name="{{ full_name }}" id="{{ id }}" value="{{ value|join(',') }}" />
  502.     <script>
  503.         jQuery(document).ready(function() {
  504.             Admin.setup_sortable_select2(jQuery('#{{ id }}'), {{ form.vars.choices|json_encode|raw }});
  505.         });
  506.     </script>
  507. {% endblock %}