vendor/sonata-project/admin-bundle/src/Resources/views/CRUD/base_list.html.twig line 1

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 base_template %}
  8. {%- block actions -%}
  9.     {% include '@SonataAdmin/CRUD/action_buttons.html.twig' %}
  10. {%- endblock -%}
  11. {%- block tab_menu -%}
  12.     {{ knp_menu_render(admin.sidemenu(action), {
  13.         'currentClass': 'active',
  14.         'template': get_global_template('tab_menu_template')
  15.     }, 'twig') }}
  16. {%- endblock -%}
  17. {% block title %}
  18.     {{ admin.isChild and admin.parent.subject ? 'title_edit'|trans({'%name%': admin.parent.toString(admin.parent.subject)|u.truncate(15, '...') }, 'SonataAdminBundle') : '' }}
  19. {% endblock %}
  20. {% block navbar_title %}
  21.     {{ admin.isChild and admin.parent.subject ? 'title_edit'|trans({'%name%': admin.parent.toString(admin.parent.subject)|u.truncate(100, '...') }, 'SonataAdminBundle') : '' }}
  22. {% endblock %}
  23. {# Define the variable out of the block to prevent error if someone is overriding the list_table and not the list_footer #}
  24. {% set datagrid_has_results = admin.datagrid.results|length > 0 %}
  25. {% block list_table %}
  26.     <div class="col-xs-12 col-md-12">
  27.         {% set batchactions = admin.batchactions %}
  28.         {% if admin.hasRoute('batch') and batchactions|length %}
  29.             <form action="{{ admin.generateUrl('batch', {'filter': admin.filterParameters}) }}" method="POST" >
  30.             <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
  31.         {% endif %}
  32.         {# Add a margin if no pager to prevent dropdown cropping on window #}
  33.         <div class="box box-primary"{% if admin.datagrid.pager.lastPage == 1 %} style="margin-bottom: 100px;"{% endif %}>
  34.             <div class="box-body{% if datagrid_has_results %} table-responsive no-padding{% endif %}">
  35.                 {{ sonata_block_render_event('sonata.admin.list.table.top', { 'admin': admin }) }}
  36.                 {% block list_header %}{% endblock %}
  37.                 {% if datagrid_has_results %}
  38.                     {% block table %}
  39.                         <table class="table table-bordered table-striped table-hover sonata-ba-list">
  40.                         {% block table_header %}
  41.                             <thead>
  42.                                 <tr class="sonata-ba-list-field-header">
  43.                                     {% for field_description in admin.list.getElements() %}
  44.                                         {% if admin.hasRoute('batch') and field_description.name == constant('Sonata\\AdminBundle\\Datagrid\\ListMapper::NAME_BATCH') and batchactions|length > 0 %}
  45.                                             <th class="sonata-ba-list-field-header sonata-ba-list-field-header-batch">
  46.                                               <input type="checkbox" id="list_batch_checkbox">
  47.                                             </th>
  48.                                         {% elseif field_description.name == constant('Sonata\\AdminBundle\\Datagrid\\ListMapper::NAME_SELECT') %}
  49.                                             <th class="sonata-ba-list-field-header sonata-ba-list-field-header-select"></th>
  50.                                         {% elseif field_description.name == constant('Sonata\\AdminBundle\\Datagrid\\ListMapper::NAME_ACTIONS') and app.request.isXmlHttpRequest %}
  51.                                             {# NEXT_MAJOR: Remove this case in version 5 and recommend using the option `ajax_hidden` instead. #}
  52.                                             {# Action buttons disabled in ajax view! #}
  53.                                         {% elseif field_description.getOption('ajax_hidden') == true and app.request.isXmlHttpRequest %}
  54.                                             {# Disable fields with 'ajax_hidden' option set to true #}
  55.                                         {% else %}
  56.                                             {% set sortable = false %}
  57.                                             {% if field_description.option('sortable', false) %}
  58.                                                 {% set sortable             = true %}
  59.                                                 {% set sort_parameters      = admin.datagrid.sortparameters(field_description) %}
  60.                                                 {% set current              = admin.datagrid.values[constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::SORT_BY')] is defined
  61.                                                     and (admin.datagrid.values[constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::SORT_BY')] == field_description
  62.                                                         or admin.datagrid.values[constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::SORT_BY')].name == sort_parameters.filter[constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::SORT_BY')]) %}
  63.                                                 {% set sort_active_class    = current ? 'sonata-ba-list-field-order-active' : '' %}
  64.                                                 {% set sort_by              = current ? admin.datagrid.values[constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::SORT_ORDER')] : field_description.option(constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::SORT_ORDER'), sort_parameters.filter[constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::SORT_ORDER')]) %}
  65.                                             {% endif %}
  66.                                             {% apply spaceless %}
  67.                                                 <th class="sonata-ba-list-field-header-{{ field_description.type }}{% if sortable %} sonata-ba-list-field-header-order-{{ sort_by|lower }} {{ sort_active_class }}{% endif %}{% if field_description.option('header_class') %} {{ field_description.option('header_class') }}{% endif %}"{% if field_description.option('header_style') %} style="{{ field_description.option('header_style') }}"{% endif %}>
  68.                                                     {% if sortable %}
  69.                                                         <a href="{{ admin.generateUrl(action|default('list'), sort_parameters|merge({_list_mode: admin.getListMode()})) }}">
  70.                                                     {% endif %}
  71.                                                     {% if field_description.getOption('label_icon') %}
  72.                                                         <span class="sonata-ba-list-field-header-label-icon">
  73.                                                             {{ field_description.getOption('label_icon')|parse_icon }}
  74.                                                         </span>
  75.                                                     {% endif %}
  76.                                                     {% if field_description.label is not same as(false) %}
  77.                                                         {% if field_description.translationDomain is same as(false) %}
  78.                                                             {{ field_description.label }}
  79.                                                         {% else %}
  80.                                                             {{ field_description.label|trans({}, field_description.translationDomain) }}
  81.                                                         {% endif %}
  82.                                                     {% endif %}
  83.                                                     {% if sortable %}</a>{% endif %}
  84.                                                 </th>
  85.                                             {% endapply %}
  86.                                         {% endif %}
  87.                                     {% endfor %}
  88.                                 </tr>
  89.                             </thead>
  90.                         {% endblock %}
  91.                         {% block table_body %}
  92.                             <tbody>
  93.                                 {% include get_admin_template('outer_list_rows_' ~ admin.getListMode(), admin.code) %}
  94.                             </tbody>
  95.                         {% endblock %}
  96.                         {% block table_footer %}
  97.                         {% endblock %}
  98.                     </table>
  99.                     {% endblock %}
  100.                 {% else %}
  101.                     {% block no_result_content %}
  102.                         <div class="info-box">
  103.                             <span class="info-box-icon bg-aqua"><i class="fas fa-arrow-circle-right" aria-hidden="true"></i></span>
  104.                             <div class="info-box-content">
  105.                                 <span class="info-box-text">{{ 'no_result'|trans({}, 'SonataAdminBundle') }}</span>
  106.                                 <div class="progress">
  107.                                     <div class="progress-bar" style="width: 0%"></div>
  108.                                 </div>
  109.                                 <div class="progress-description">
  110.                                     <ul class="list-unstyled">
  111.                                         {%- if admin.datagrid.pager.countResults() > 0 -%}
  112.                                             <li>
  113.                                                 <a href="{{ admin.generateUrl(action|default('list'), admin.datagrid.getPaginationParameters(1)) }}">
  114.                                                     {{- 'go_to_the_first_page'|trans({}, 'SonataAdminBundle') -}}
  115.                                                 </a>
  116.                                             </li>
  117.                                         {%- elseif not app.request.xmlHttpRequest -%}
  118.                                             {%- include get_admin_template('button_create', admin.code) -%}
  119.                                         {%- endif -%}
  120.                                     </ul>
  121.                                 </div>
  122.                             </div><!-- /.info-box-content -->
  123.                         </div>
  124.                     {% endblock %}
  125.                 {% endif %}
  126.                 {{ sonata_block_render_event('sonata.admin.list.table.bottom', { 'admin': admin }) }}
  127.             </div>
  128.             {% block list_footer %}
  129.                 {% if datagrid_has_results %}
  130.                     <div class="box-footer">
  131.                         <div class="form-inline clearfix">
  132.                             {% if not app.request.isXmlHttpRequest %}
  133.                                 <div class="pull-left">
  134.                                     {% if admin.hasRoute('batch') and batchactions|length > 0 %}
  135.                                         {% block batch %}
  136.                                             <script>
  137.                                                 {% block batch_javascript %}
  138.                                                     jQuery(document).ready(function ($) {
  139.                                                         // Toggle individual checkboxes when the batch checkbox is changed
  140.                                                         $('#list_batch_checkbox').on('ifChanged change', function () {
  141.                                                             var checkboxes = $(this)
  142.                                                                 .closest('table')
  143.                                                                 .find('td.sonata-ba-list-field-batch input[type="checkbox"], div.sonata-ba-list-field-batch input[type="checkbox"]')
  144.                                                             ;
  145.                                                             if (Admin.get_config('USE_ICHECK')) {
  146.                                                                 checkboxes.iCheck($(this).is(':checked') ? 'check' : 'uncheck');
  147.                                                             } else {
  148.                                                                 checkboxes.prop('checked', this.checked);
  149.                                                             }
  150.                                                         });
  151.                                                         // Add a CSS class to rows when they are selected
  152.                                                         $('td.sonata-ba-list-field-batch input[type="checkbox"], div.sonata-ba-list-field-batch input[type="checkbox"]')
  153.                                                             .on('ifChanged change', function () {
  154.                                                                 $(this)
  155.                                                                     .closest('tr, div.sonata-ba-list-field-batch')
  156.                                                                     .toggleClass('sonata-ba-list-row-selected', $(this).is(':checked'))
  157.                                                                 ;
  158.                                                             })
  159.                                                             .trigger('ifChanged')
  160.                                                         ;
  161.                                                     });
  162.                                                 {% endblock %}
  163.                                             </script>
  164.                                         {% block batch_actions %}
  165.                                             <label class="checkbox" for="{{ admin.uniqid }}_all_elements">
  166.                                                 <input type="checkbox" name="all_elements" id="{{ admin.uniqid }}_all_elements">
  167.                                                 {{ 'all_elements'|trans({}, 'SonataAdminBundle') }}
  168.                                                 ({{ admin.datagrid.pager.countResults() }})
  169.                                             </label>
  170.                                             <select name="action" style="width: auto; height: auto" class="form-control">
  171.                                                 {% for action, options in batchactions %}
  172.                                                     <option value="{{ action }}">
  173.                                                         {% if options.translation_domain is defined and options.translation_domain is same as(false) %}
  174.                                                             {{ options.label }}
  175.                                                         {% else %}
  176.                                                             {{ options.label|trans({}, options.translation_domain ?? admin.translationDomain) }}
  177.                                                         {% endif %}
  178.                                                     </option>
  179.                                                 {% endfor %}
  180.                                             </select>
  181.                                         {% endblock %}
  182.                                             <input type="submit" class="btn btn-small btn-primary" value="{{ 'btn_batch'|trans({}, 'SonataAdminBundle') }}">
  183.                                         {% endblock %}
  184.                                     {% endif %}
  185.                                 </div>
  186.                                 <div class="pull-right">
  187.                                     {% if admin.hasRoute('export') and admin.hasAccess('export') and export_formats|length %}
  188.                                         <div class="btn-group">
  189.                                             <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
  190.                                                 <i class="fas fa-share-square" aria-hidden="true"></i>
  191.                                                 {{ "label_export_download"|trans({}, "SonataAdminBundle") }}
  192.                                                 <span class="caret"></span>
  193.                                             </button>
  194.                                             <ul class="dropdown-menu">
  195.                                                 {% for format in export_formats %}
  196.                                                 <li>
  197.                                                     <a href="{{ admin.generateUrl('export', admin.datagrid.paginationparameters(0) + {'format' : format}) }}">
  198.                                                         <i class="fas fa-arrow-circle-o-down" aria-hidden="true"></i>
  199.                                                         {{ ("export_format_" ~ format)|trans({}, 'SonataAdminBundle') }}
  200.                                                     </a>
  201.                                                 </li>
  202.                                                 {% endfor %}
  203.                                             </ul>
  204.                                         </div>
  205.                                         {% if block('pager_results') is not empty %}
  206.                                             &nbsp;-&nbsp;
  207.                                         {% endif %}
  208.                                     {% endif %}
  209.                                     {% block pager_results %}
  210.                                         {% include get_admin_template('pager_results', admin.code) %}
  211.                                     {% endblock %}
  212.                                 </div>
  213.                             {% endif %}
  214.                         </div>
  215.                         {% block pager_links %}
  216.                             {% if admin.datagrid.pager.haveToPaginate() %}
  217.                                 <hr/>
  218.                                 {% include get_admin_template('pager_links', admin.code) %}
  219.                             {% endif %}
  220.                         {% endblock %}
  221.                     </div>
  222.                 {% endif %}
  223.             {% endblock %}
  224.         </div>
  225.         {% if admin.hasRoute('batch') and batchactions|length %}
  226.             </form>
  227.         {% endif %}
  228.     </div>
  229. {% endblock %}
  230. {% block list_filters_actions %}
  231.     {% set displayableFilters = admin.datagrid.filters|filter(filter => filter.option('show_filter') is not same as (false)) %}
  232.     {%- if displayableFilters|length %}
  233.         <ul class="nav navbar-nav navbar-right">
  234.             <li class="dropdown sonata-actions">
  235.                 <a href="#" class="dropdown-toggle sonata-ba-action" data-toggle="dropdown">
  236.                     <i class="fas fa-filter" aria-hidden="true"></i>
  237.                     {{ 'link_filters'|trans({}, 'SonataAdminBundle') }}
  238.                     <span class="badge sonata-filter-count"></span>
  239.                     <b class="caret"></b>
  240.                 </a>
  241.                 <ul class="dropdown-menu dropdown-menu-scrollable" role="menu">
  242.                     {% for filter in displayableFilters %}
  243.                         {% set filterDisplayed = filter.isActive() or filter.option('show_filter') is same as (true) %}
  244.                         <li>
  245.                             <a href="#" class="sonata-toggle-filter sonata-ba-action" filter-target="filter-{{ admin.uniqid }}-{{ filter.name }}" filter-container="filter-container-{{ admin.uniqid() }}">
  246.                                 <i class="far {{ filterDisplayed ? 'fa-check-square' : 'fa-square' }}"></i>
  247.                                 {% if filter.label is not same as(false) %}
  248.                                     {% if filter.translationDomain is same as(false) %}
  249.                                         {{ filter.label }}
  250.                                     {% else %}
  251.                                         {{ filter.label|trans(filter.option('label_translation_parameters', {}), filter.translationDomain ?? admin.translationDomain) }}
  252.                                     {% endif %}
  253.                                 {% endif %}
  254.                             </a>
  255.                         </li>
  256.                     {% endfor %}
  257.                 </ul>
  258.             </li>
  259.         </ul>
  260.     {% endif -%}
  261. {% endblock %}
  262. {% block list_filters %}
  263.     {% if admin.datagrid.filters %}
  264.         {% form_theme form get_admin_template('filter', admin.code) %}
  265.         <div class="col-xs-12 col-md-12 sonata-filters-box" style="display: {{ admin.datagrid.hasDisplayableFilters ? 'block' : 'none' }}" id="filter-container-{{ admin.uniqid() }}">
  266.             <div class="box box-primary" >
  267.                 <div class="box-body">
  268.                     <form
  269.                         class="sonata-filter-form form-horizontal {{ admin.isChild and 1 == admin.datagrid.filters|length ? 'hide' : '' }}"
  270.                         action="{{ admin.generateUrl(action|default('list')) }}"
  271.                         method="GET"
  272.                         role="form"
  273.                         data-default-values="{{ admin.defaultFilterParameters|json_encode }}"
  274.                     >
  275.                         {{ form_errors(form) }}
  276.                         <div class="row">
  277.                             <div class="col-sm-9">
  278.                                 {% set withAdvancedFilter = false %}
  279.                                 {% for filter in admin.datagrid.filters %}
  280.                                     {% set filterDisplayed = filter.isActive() or filter.option('show_filter') is same as (true) %}
  281.                                     {% set filterCanBeDisplayed = filter.option('show_filter') is not same as(false) %}
  282.                                     <div class="form-group {% block sonata_list_filter_group_class %}{% endblock %}" id="filter-{{ admin.uniqid }}-{{ filter.name }}" sonata-filter="{{ filterCanBeDisplayed ? 'true' : 'false' }}" style="display: {% if filterDisplayed %}block{% else %}none{% endif %}">
  283.                                         {% if filter.label is not same as(false) %}
  284.                                             <label for="{{ form[filter.formName].children['value'].vars.id }}" class="col-sm-3 control-label">
  285.                                                 {% if filter.translationDomain is same as(false) %}
  286.                                                     {{ filter.label }}
  287.                                                 {% else %}
  288.                                                     {{ filter.label|trans(filter.option('label_translation_parameters', {}), filter.translationDomain ?? admin.translationDomain) }}
  289.                                                 {% endif %}
  290.                                             </label>
  291.                                         {% endif %}
  292.                                         {% set attr = form[filter.formName].children['type'].vars.attr|default({}) %}
  293.                                         <div class="col-sm-4 advanced-filter">
  294.                                             {{ form_widget(form[filter.formName].children['type'], {'attr':  attr}) }}
  295.                                         </div>
  296.                                         <div class="col-sm-4">
  297.                                             {{ form_widget(form[filter.formName].children['value']) }}
  298.                                         </div>
  299.                                         {% if filterCanBeDisplayed %}
  300.                                             <div class="col-sm-1">
  301.                                                 <label class="control-label">
  302.                                                     <a href="#" class="sonata-toggle-filter sonata-ba-action" filter-target="filter-{{ admin.uniqid }}-{{ filter.name }}" filter-container="filter-container-{{ admin.uniqid() }}">
  303.                                                         <i class="fas fa-minus-circle" aria-hidden="true"></i>
  304.                                                     </a>
  305.                                                 </label>
  306.                                             </div>
  307.                                         {% endif %}
  308.                                     </div>
  309.                                     {% if filter.option('advanced_filter') %}
  310.                                         {% set withAdvancedFilter = true %}
  311.                                     {% endif %}
  312.                                 {% endfor %}
  313.                             </div>
  314.                             <div class="col-sm-3 text-center">
  315.                                 <input type="hidden" name="filter[{{ constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::PAGE') }}]" id="filter__page" value="1">
  316.                                 {% set foo = form[constant('Sonata\\AdminBundle\\Datagrid\\DatagridInterface::PAGE')].setRendered() %}
  317.                                 {{ form_rest(form) }}
  318.                                 <div class="form-group">
  319.                                     <button type="submit" class="btn btn-primary">
  320.                                         <i class="fas fa-filter" aria-hidden="true"></i> {{ 'btn_filter'|trans({}, 'SonataAdminBundle') }}
  321.                                     </button>
  322.                                     <a class="btn btn-default" href="{{ admin.generateUrl(action|default('list'), {filters: 'reset'}) }}">
  323.                                         {{ 'link_reset_filter'|trans({}, 'SonataAdminBundle') }}
  324.                                     </a>
  325.                                 </div>
  326.                                 {% if withAdvancedFilter %}
  327.                                     <div class="form-group">
  328.                                         <a href="#" data-toggle="advanced-filter">
  329.                                             <i class="fas fa-cogs" aria-hidden="true"></i>
  330.                                             {{ 'btn_advanced_filters'|trans({}, 'SonataAdminBundle') }}
  331.                                         </a>
  332.                                     </div>
  333.                                 {% endif %}
  334.                             </div>
  335.                         </div>
  336.                         {% for paramKey, paramValue in admin.persistentParameters %}
  337.                             <input type="hidden" name="{{ paramKey }}" value="{{ paramValue }}">
  338.                         {% endfor %}
  339.                     </form>
  340.                 </div>
  341.             </div>
  342.         </div>
  343.     {% endif %}
  344. {% endblock %}