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