vendor/easycorp/easyadmin-bundle/templates/layout.html.twig line 1

Open in your IDE?
  1. {# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #}
  2. {% trans_default_domain ea.i18n.translationDomain %}
  3. <!DOCTYPE html>
  4. <html lang="{{ ea.i18n.htmlLocale }}" dir="{{ ea.i18n.textDirection }}" data-turbo="false">
  5. <head>
  6.     {% block head_metas %}
  7.         <meta charset="utf-8">
  8.         <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9.         <meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noodp, noimageindex, notranslate, nocache" />
  10.         <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  11.         <meta name="generator" content="EasyAdmin" />
  12.     {% endblock head_metas %}
  13.     {% set page_title_block_output %}{% block page_title %}{{ block('content_title') }}{% endblock %}{% endset %}
  14.     <title>{{ page_title_block_output|striptags|raw }}</title>
  15.     {% block head_stylesheets %}
  16.         <link rel="stylesheet" href="{{ asset('app.css', ea.assets.defaultAssetPackageName) }}">
  17.     {% endblock %}
  18.     {% block configured_stylesheets %}
  19.         {{ include('@EasyAdmin/includes/_css_assets.html.twig', { assets: ea.assets.cssAssets ?? [] }, with_context = false) }}
  20.         {{ include('@EasyAdmin/includes/_encore_link_tags.html.twig', { assets: ea.assets.webpackEncoreAssets ?? [] }, with_context = false) }}
  21.     {% endblock %}
  22.     {% block head_favicon %}
  23.         <link rel="shortcut icon" href="{{ asset(ea.dashboardFaviconPath) }}">
  24.     {% endblock %}
  25.     {% block head_javascript %}
  26.         <script src="{{ asset('app.js', ea.assets.defaultAssetPackageName) }}"></script>
  27.         {% block importmap %}
  28.             {{ include('@EasyAdmin/includes/_importmap.html.twig', { assets: ea.assets.assetMapperAssets ?? [] }, with_context = false) }}
  29.         {% endblock %}
  30.     {% endblock head_javascript %}
  31.     {% block configured_javascripts %}
  32.         {{ include('@EasyAdmin/includes/_js_assets.html.twig', { assets: ea.assets.jsAssets ?? [] }, with_context = false) }}
  33.         {{ include('@EasyAdmin/includes/_encore_script_tags.html.twig', { assets: ea.assets.webpackEncoreAssets ?? [] }, with_context = false) }}
  34.     {% endblock %}
  35.     {% block configured_head_contents %}
  36.         {% for htmlContent in ea.assets.headContents ?? [] %}
  37.             {{ htmlContent|raw }}
  38.         {% endfor %}
  39.     {% endblock %}
  40. </head>
  41. {% block body %}
  42.     <body {% block body_attr %}{% endblock %}
  43.         id="{% block body_id %}{% endblock %}"
  44.         class="ea {% block body_class %}{% endblock %}"
  45.         data-ea-content-width="{{ ea.crud.contentWidth ?? ea.dashboardContentWidth ?? 'normal' }}"
  46.         data-ea-sidebar-width="{{ ea.crud.sidebarWidth ?? ea.dashboardSidebarWidth ?? 'normal' }}"
  47.         data-ea-dark-scheme-is-enabled="{{ ea.dashboardHasDarkModeEnabled ? 'true' : 'false' }}"
  48.         data-ea-default-color-scheme="{{ ea.dashboardDefaultColorScheme }}"
  49.     >
  50.     {% block javascript_page_layout %}
  51.         <script src="{{ asset('page-layout.js', ea.assets.defaultAssetPackageName) }}"></script>
  52.     {% endblock javascript_page_layout %}
  53.     {% block javascript_page_color_scheme %}
  54.         <script src="{{ asset('page-color-scheme.js', ea.assets.defaultAssetPackageName) }}"></script>
  55.     {% endblock javascript_page_color_scheme %}
  56.     {% block wrapper_wrapper %}
  57.         {% block flash_messages %}
  58.             {{ include(ea.templatePath('flash_messages')) }}
  59.         {% endblock flash_messages %}
  60.         {% set user_menu_avatar %}
  61.             {% if null == ea.userMenu.avatarUrl %}
  62.                 <span class="user-avatar">
  63.                     <span class="fa-stack">
  64.                         <i class="user-avatar-icon-background fas fa-square fa-stack-2x"></i>
  65.                         <i class="user-avatar-icon-foreground {{ ea.user is not null ? 'fa fa-user' : 'fas fa-user-slash' }} fa-stack-1x fa-inverse"></i>
  66.                     </span>
  67.                 </span>
  68.             {% else %}
  69.                 <img class="user-avatar" src="{{ ea.userMenu.avatarUrl }}" />
  70.             {% endif %}
  71.         {% endset %}
  72.         {% set impersonator_permission = constant('Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter::IS_IMPERSONATOR') is defined ? 'IS_IMPERSONATOR' : 'ROLE_PREVIOUS_ADMIN' %}
  73.         {% set user_menu_dropdown %}
  74.             <ul class="dropdown-menu dropdown-menu-end">
  75.                 <li class="dropdown-user-details">
  76.                     <div>{{ user_menu_avatar }}</div>
  77.                     <div>
  78.                         <span class="user-label">{{ 'user.logged_in_as'|trans(domain = 'EasyAdminBundle') }}</span>
  79.                         <span class="user-name">{{ ea.user is null ? 'user.anonymous'|trans(domain = 'EasyAdminBundle') : ea.userMenu.name }}</span>
  80.                     </div>
  81.                 </li>
  82.                 {% block user_menu %}
  83.                     {% if ea.userMenu.items|length > 0 %}
  84.                         <li><hr class="dropdown-divider"></li>
  85.                         {% for item in ea.userMenu.items %}
  86.                             <li>
  87.                                 {% if item.isMenuSection and not loop.first %}
  88.                                     <hr class="dropdown-divider">
  89.                                 {% elseif not item.isMenuSection %}
  90.                                     <a href="{{ item.linkUrl }}" class="dropdown-item user-action {{ item.cssClass }}"
  91.                                        target="{{ item.linkTarget }}" rel="{{ item.linkRel }}"
  92.                                        referrerpolicy="origin-when-cross-origin">
  93.                                         {% if item.icon is not empty %}<i class="fa fa-fw {{ item.icon }}"></i>{% endif %}
  94.                                         {{ item.label|trans }}
  95.                                     </a>
  96.                                 {% endif %}
  97.                             </li>
  98.                         {% endfor %}
  99.                     {% endif %}
  100.                 {% endblock user_menu %}
  101.             </ul>
  102.         {% endset %}
  103.         {% set settings_dropdown %}
  104.             {% if ea.dashboardLocales or ea.dashboardHasDarkModeEnabled %}
  105.                 <div class="dropdown dropdown-settings">
  106.                     <a class="dropdown-settings-button" type="button" data-bs-toggle="dropdown" data-bs-offset="0,5" aria-expanded="false">
  107.                         <i class="fas fa-gear"></i>
  108.                     </a>
  109.                     <ul class="dropdown-menu dropdown-menu-end">
  110.                         {% if ea.dashboardLocales %}
  111.                             <li class="dropdown-header dropdown-locales-label">
  112.                                 {{ 'settings.locale'|trans(domain = 'EasyAdminBundle') }}
  113.                             </li>
  114.                             {% for localeDto in ea.dashboardLocales %}
  115.                                 <li>
  116.                                     <a href="{{ ea_url().set('_locale', localeDto.locale) }}" class="dropdown-item{% if app.request.locale == localeDto.locale %} active{% endif %}">
  117.                                         {% if localeDto.icon %}
  118.                                             <i class="{{ localeDto.icon }}"></i>
  119.                                         {% endif %}
  120.                                         {{ localeDto.name }}
  121.                                     </a>
  122.                                 </li>
  123.                             {% endfor %}
  124.                         {% endif %}
  125.                         {% if ea.dashboardHasDarkModeEnabled %}
  126.                             {% if ea.dashboardLocales %}
  127.                                 <div class="dropdown-divider"></div>
  128.                             {% endif %}
  129.                             <li class="dropdown-header dropdown-appearance-label">
  130.                                 {{ 'settings.appearance.label'|trans(domain = 'EasyAdminBundle') }}
  131.                             </li>
  132.                             <li>
  133.                                 <a href="#" class="dropdown-item dropdown-appearance-item" data-ea-color-scheme="light">
  134.                                     <i class="far fa-sun fa-fw"></i>
  135.                                     {{ 'settings.appearance.light'|trans(domain = 'EasyAdminBundle') }}
  136.                                 </a>
  137.                             </li>
  138.                             <li>
  139.                                 <a href="#" class="dropdown-item dropdown-appearance-item" data-ea-color-scheme="dark">
  140.                                     <i class="far fa-moon fa-fw"></i>
  141.                                     {{ 'settings.appearance.dark'|trans(domain = 'EasyAdminBundle') }}
  142.                                 </a>
  143.                             </li>
  144.                             <li>
  145.                                 <a href="#" class="dropdown-item dropdown-appearance-item active" data-ea-color-scheme="auto">
  146.                                     <i class="fas fa-desktop fa-fw"></i>
  147.                                     {{ 'settings.appearance.auto'|trans(domain = 'EasyAdminBundle') }}
  148.                                 </a>
  149.                             </li>
  150.                         {% endif %}
  151.                     </ul>
  152.                 </div>
  153.             {% endif %}
  154.         {% endset %}
  155.         <div class="wrapper">
  156.             {% block wrapper %}
  157.                 <div class="responsive-header">
  158.                     {% block responsive_header %}
  159.                         <button id="navigation-toggler" type="button" aria-label="Toggle navigation">
  160.                             <i class="fa fa-fw fa-bars"></i>
  161.                         </button>
  162.                         <div id="responsive-header-logo" class="text-truncate ms-auto">
  163.                             {% block responsive_header_logo %}
  164.                                 <a class="responsive-logo" title="{{ ea.dashboardTitle|striptags }}" href="{{ path(ea.dashboardRouteName) }}">
  165.                                     {{ ea.dashboardTitle|raw }}
  166.                                 </a>
  167.                             {% endblock responsive_header_logo %}
  168.                         </div>
  169.                         <div class="dropdown user-menu-wrapper {{ is_granted(impersonator_permission) ? 'user-is-impersonated' }} ms-auto">
  170.                             <a class="user-details" type="button" data-bs-toggle="dropdown" data-bs-offset="0,5" aria-expanded="false">
  171.                                 {# to make the site design consistent, always display the user avatar in responsive header
  172.                                    and hide the user name (because there's no space left) regardless of the user config #}
  173.                                 {% if ea.userMenu.avatarDisplayed %}
  174.                                     {{ user_menu_avatar }}
  175.                                 {% else %}
  176.                                     <i class="user-avatar fa fa-fw {{ ea.user is not null ? 'fa-user' : 'fa-user-times' }}"></i>
  177.                                 {% endif %}
  178.                             </a>
  179.                             {{ user_menu_dropdown }}
  180.                         </div>
  181.                         {{ settings_dropdown }}
  182.                     {% endblock responsive_header %}
  183.                 </div>
  184.                 <div class="sidebar-wrapper">
  185.                     <aside class="sidebar">
  186.                         {% block sidebar %}
  187.                             <header class="main-header">
  188.                                 {% block header %}
  189.                                 <nav class="navbar" role="navigation">
  190.                                     {% block header_navbar %}
  191.                                         <div id="header-logo">
  192.                                             {% block header_logo %}
  193.                                                 <a class="logo" title="{{ ea.dashboardTitle|striptags }}" href="{{ path(ea.dashboardRouteName) }}">
  194.                                                     <span class="logo-custom">{{ ea.dashboardTitle|raw }}</span>
  195.                                                     <span class="logo-compact"><i class="fas fa-home"></i></span>
  196.                                                 </a>
  197.                                             {% endblock header_logo %}
  198.                                         </div>
  199.                                     {% endblock header_navbar %}
  200.                                 </nav>
  201.                                 {% endblock header %}
  202.                             </header>
  203.                             {% block main_menu_wrapper %}
  204.                                 {{ include(ea.templatePath('main_menu')) }}
  205.                             {% endblock main_menu_wrapper %}
  206.                         {% endblock sidebar %}
  207.                         <div id="sidebar-resizer-handler" class="resizer-handler resizer-handler-left"></div>
  208.                     </aside>
  209.                 </div>
  210.                 <section class="main-content">
  211.                     {% set has_search = ea.crud is not null and ea.crud.isSearchEnabled %}
  212.                     <aside class="content-top {{ has_search ? 'ea-search-enabled' : 'ea-search-disabled' }}">
  213.                         {% block content_top_header %}
  214.                             {% block search_wrapper %}
  215.                             <div class="content-search">
  216.                                 {% if has_search %}
  217.                                     {% block search %}
  218.                                         {% set formActionUrl = null %}
  219.                                         {% if ea.usePrettyUrls %}
  220.                                             {% set formActionUrl = ea_url().setController(ea.request.attributes.get('crudControllerFqcn')).setAction('index').set('page', 1) %}
  221.                                         {% endif %}
  222.                                         <form class="form-action-search" method="get" {% if formActionUrl %}action="{{ formActionUrl }}"{% endif %}>
  223.                                             {% block search_form %}
  224.                                                 {% block search_form_filters %}
  225.                                                     {% for field, fieldValue in ea.search.appliedFilters %}
  226.                                                         {% if fieldValue is iterable %}
  227.                                                             {% for key, value in fieldValue %}
  228.                                                                 {# This code re-applies your filters on searches, an iterable check is needed in cases we have more than one object for a filter #}
  229.                                                                 {% if value is iterable %}
  230.                                                                     {% for index, iterValue in value %}
  231.                                                                         {# This sub-level iterable check is needed in cases we have more complex filters like the DateTimeFilter cf. issue #5038 #}
  232.                                                                         {% if iterValue is iterable %}
  233.                                                                             {% for subIndex, subIterValue in iterValue %}
  234.                                                                                 <input type="hidden" name="filters[{{ field }}][{{ key }}][{{ index }}][{{ subIndex }}]" value="{{ subIterValue }}">
  235.                                                                             {% endfor %}
  236.                                                                         {% else %}
  237.                                                                             <input type="hidden" name="filters[{{ field }}][{{ key }}][{{ index }}]" value="{{ iterValue }}">
  238.                                                                         {% endif %}
  239.                                                                     {% endfor %}
  240.                                                                 {% else %}
  241.                                                                     <input type="hidden" name="filters[{{ field }}][{{ key }}]" value="{{ value }}">
  242.                                                                 {% endif %}
  243.                                                             {% endfor %}
  244.                                                         {% else %}
  245.                                                             <input type="hidden" name="filters[{{ field }}]" value="{{ fieldValue }}">
  246.                                                         {% endif %}
  247.                                                     {% endfor %}
  248.                                                 {% endblock %}
  249.                                                 {% if not ea.usePrettyUrls %}
  250.                                                     <input type="hidden" name="crudAction" value="index">
  251.                                                     <input type="hidden" name="crudControllerFqcn" value="{{ ea.request.query.get('crudControllerFqcn') }}">
  252.                                                     <input type="hidden" name="page" value="1">
  253.                                                 {% endif %}
  254.                                                 <div class="form-group">
  255.                                                     <div class="form-widget">
  256.                                                         <i class="fas fa-search content-search-icon"></i>
  257.                                                         <label class="content-search-label" data-value="{{ app.request.get('query') }}">
  258.                                                             <input class="form-control {{ app.request.get('query') is null ? 'is-blank' }}" type="search" name="query" value="{{ app.request.get('query') ?? '' }}" placeholder="{{ t('action.search', ea.i18n.translationParameters, 'EasyAdminBundle')|trans }}" spellcheck="false" autocorrect="off" onInput="this.parentNode.dataset.value=this.value"{% if ea.crud.currentAction == 'index' and ea.crud.autofocusSearch == true %} autofocus="autofocus"{% endif %}>
  259.                                                         </label>
  260.                                                         {% if app.request.get('query') %}
  261.                                                             {% set search_reset_url = ea_url().unset('query') %}
  262.                                                             {% if ea.usePrettyUrls %}
  263.                                                                 {% set search_reset_url = ea_url().unset('query').setController(ea.request.attributes.get('crudControllerFqcn')).setAction('index').set('page', 1) %}
  264.                                                             {% endif %}
  265.                                                             <a href="{{ search_reset_url }}" class="content-search-reset">
  266.                                                                 <i class="fas fa-fw fa-times"></i>
  267.                                                             </a>
  268.                                                         {% endif %}
  269.                                                     </div>
  270.                                                 </div>
  271.                                             {% endblock %}
  272.                                         </form>
  273.                                     {% endblock search %}
  274.                                 {% endif %}
  275.                             </div>
  276.                             {% endblock search_wrapper %}
  277.                             {% block header_custom_menu_wrapper %}
  278.                             <div class="navbar-custom-menu">
  279.                                 {% block header_custom_menu %}
  280.                                     <div class="dropdown user-menu-wrapper {{ is_granted(impersonator_permission) ? 'user-is-impersonated' }}">
  281.                                         <a class="user-details" type="button" data-bs-toggle="dropdown" data-bs-offset="0,5" aria-expanded="false">
  282.                                             {{ user_menu_avatar }}
  283.                                             {% if ea.userMenu.isNameDisplayed %}
  284.                                                 <span class="user-name">{{ ea.userMenu.name }}</span>
  285.                                             {% endif %}
  286.                                         </a>
  287.                                         {{ user_menu_dropdown }}
  288.                                     </div>
  289.                                 {% endblock header_custom_menu %}
  290.                             </div>
  291.                             {% endblock header_custom_menu_wrapper %}
  292.                             {% block settings_dropdown_wrapper %}
  293.                                 {{ settings_dropdown }}
  294.                             {% endblock settings_dropdown_wrapper %}
  295.                         {% endblock content_top_header %}
  296.                     </aside>
  297.                     <div class="content-wrapper">
  298.                         {% block content %}
  299.                             <article class="content">
  300.                                 {% block content_header_wrapper %}
  301.                                     {% set has_help_message = (ea.crud.helpMessage ?? '') is not empty %}
  302.                                     <section class="content-header">
  303.                                         {% block content_header %}
  304.                                             <div class="content-header-title">
  305.                                                 <h1 class="title">
  306.                                                     {% block content_title %}{% endblock %}
  307.                                                     {% block content_help %}
  308.                                                         {% if has_help_message %}
  309.                                                             <a tabindex="0" class="content-header-help" data-bs-toggle="popover" data-bs-custom-class="ea-content-help-popover" data-bs-animation="true" data-bs-html="true" data-bs-placement="bottom" data-bs-trigger="focus" data-bs-content="{{ ea.crud.helpMessage|trans|e('html_attr') }}">
  310.                                                                 <i class="far fa-question-circle"></i>
  311.                                                             </a>
  312.                                                         {% endif %}
  313.                                                     {% endblock %}
  314.                                                 </h1>
  315.                                             </div>
  316.                                             {% block page_actions_wrapper %}
  317.                                                 <div class="page-actions">{% block page_actions %}{% endblock %}</div>
  318.                                             {% endblock %}
  319.                                         {% endblock content_header %}
  320.                                     </section>
  321.                                 {% endblock content_header_wrapper %}
  322.                                 <section id="main" class="content-body">
  323.                                     {% block main %}{% endblock %}
  324.                                 </section>
  325.                                 {% block content_footer_wrapper %}
  326.                                     {% set content_footer = block('content_footer') is defined ? block('content_footer') : '' %}
  327.                                     {% if content_footer is not empty %}
  328.                                         <section class="content-footer">
  329.                                             {{ content_footer }}
  330.                                         </section>
  331.                                     {% endif %}
  332.                                 {% endblock %}
  333.                             </article>
  334.                         {% endblock content %}
  335.                         <div id="content-resizer-handler" class="resizer-handler resizer-handler-right"></div>
  336.                     </div>
  337.                 </section>
  338.             {% endblock wrapper %}
  339.         </div>
  340.     {% endblock wrapper_wrapper %}
  341.     {% block body_javascript %}{% endblock body_javascript %}
  342.     {% block configured_body_contents %}
  343.         {% for htmlContent in ea.assets.bodyContents ?? [] %}
  344.             {{ htmlContent|raw }}
  345.         {% endfor %}
  346.     {% endblock %}
  347.     </body>
  348. {% endblock body %}
  349. </html>