templates/bundles/EasyAdminBundle/layout.html.twig line 1
{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #}
{% trans_default_domain ea.i18n.translationDomain %}
<!DOCTYPE html >
<html lang="{{ ea.i18n.htmlLocale }}" dir="{{ ea.i18n.textDirection }}" >
<head>
{% set sessionLifetimeSeconds = app.session.getMetadataBag().getLifetime() %}
<style>
.session-badge {
display: inline-block;
padding: 0.25em 0.5em;
font-size: 75%;
font-weight: 700;
line-height: 1;
color: #fff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: 0.25rem;
background-color: #007bff;
}
</style>
<!-- <script>
document.addEventListener('DOMContentLoaded', function() {
var sessionBadge = document.querySelector('.session-badge');
var sessionLifetimeSeconds = {{ sessionLifetimeSeconds }};
var updateInterval = 1000; // Mettez à jour toutes les secondes
function updateSessionCounter() {
var minutes = Math.floor(sessionLifetimeSeconds / 60);
var seconds = sessionLifetimeSeconds % 60;
sessionBadge.textContent = minutes + 'm ' + seconds + 's';
sessionLifetimeSeconds--;
}
// Mettez à jour le compteur initialement
updateSessionCounter();
// Mettez à jour le compteur toutes les secondes
setInterval(updateSessionCounter, updateInterval);
});
</script>-->
<script>
document.addEventListener("turbo:load", function() {
// Votre code existant pour le compteur de session
var sessionBadge = document.querySelector('.session-badge');
var sessionLifetimeSeconds = {{ sessionLifetimeSeconds }};
var updateInterval = 1000; // Mettez à jour toutes les secondes
function updateSessionCounter() {
if (sessionLifetimeSeconds > 0) {
var hours = Math.floor(sessionLifetimeSeconds / 3600);
var minutes = Math.floor((sessionLifetimeSeconds % 3600) / 60);
var seconds = sessionLifetimeSeconds % 60;
sessionBadge.textContent = hours + 'h ' + minutes + 'm ' + seconds + 's';
sessionLifetimeSeconds--;
} else {
// Arrêtez le compteur et effectuez toute autre action nécessaire
clearInterval(intervalId);
sessionBadge.textContent = 'Session expirée';
}
}
// Mettez à jour le compteur initialement
updateSessionCounter();
// Mettez à jour le compteur toutes les secondes
var intervalId = setInterval(updateSessionCounter, updateInterval);
});
</script>
{% 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" />
<meta name="turbo-cache-control" content="no-cache">
{% set sessionLifetime = app.session.getMetadataBag().getLifetime() %}
<meta name="session_duration" content="{{ sessionLifetime }}">
{% 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) }}">
{{ encore_entry_link_tags('app') }}
{% if is_granted("ROLE_CUSTOMER") %}
<link rel="stylesheet" href="{{ asset('themes/'~ settings.get.assetFolderName|lower ~ '/admin/admin-customer.css') }}">
{% else %}
<link rel="stylesheet" href="{{ asset('themes/'~ settings.get.assetFolderName|lower ~ '/admin/admin.css') }}">
{% endif %}
{% 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 %}
{{ encore_entry_script_tags('app') }}
{% endblock head_javascript %}
{% 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>
{% 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 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 %}
<span>{{ item.label|trans }}</span>
</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>
<span class="dropdown-header dropdown-locales-label">{{ 'settings.locale'|trans(domain = 'EasyAdminBundle') }}</span>
</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>
<span class="dropdown-header dropdown-appearance-label">{{ 'settings.appearance.label'|trans(domain = 'EasyAdminBundle') }}</span>
</li>
<li>
<a href="#" class="dropdown-item dropdown-appearance-item" data-ea-color-scheme="light">
<i class="far fa-sun"></i> <span>{{ 'settings.appearance.light'|trans(domain = 'EasyAdminBundle') }}</span>
</a>
</li>
<li>
<a href="#" class="dropdown-item dropdown-appearance-item" data-ea-color-scheme="dark">
<i class="far fa-moon"></i> <span>{{ 'settings.appearance.dark'|trans(domain = 'EasyAdminBundle') }}</span>
</a>
</li>
<li>
<a href="#" class="dropdown-item dropdown-appearance-item active" data-ea-color-scheme="auto">
<i class="fas fa-desktop"></i> <span>{{ 'settings.appearance.auto'|trans(domain = 'EasyAdminBundle') }}</span>
</a>
</li>
{% endif %}
</ul>
</div>
{% endif %}
{% endset %}
<div class="wrapper">
{% 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 %}
<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, array in ea.search.appliedFilters %}
{% for key, value in array %}
{# 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 %}
{% endfor %}
{% endblock %}
<input type="hidden" name="crudAction" value="index">
<input type="hidden" name="crudControllerFqcn" value="{{ ea.request.query.get('crudControllerFqcn') }}">
<input type="hidden" name="menuIndex" value="{{ ea.request.query.get('menuIndex') }}">
<input type="hidden" name="submenuIndex" value="{{ ea.request.query.get('submenuIndex') }}">
<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>
{% if is_granted("ROLE_AGENT") %}
<div class="navbar-custom-menu p-1" >
{% set urlSessionHistory = ea_url().setRoute("toggleSession") %}
{% if settings.session %}
{% if settings.session.endAt != null %}
<a href="{{urlSessionHistory}}" class="btn bg-green-dark text-white">
<i class="fa-solid fa-power-off"></i>
Commencer ma session
</a>
{% else %}
<a href="{{urlSessionHistory}}" class="btn bg-pink-dark text-white">
<i class="fa-solid fa-power-off"></i>
Fermer ma session <small style="font-size:9px;">(Commencé á {{settings.session.startAt|date("H:i:s")}})</small>
</a>
{% endif %}
{% else %}
<a href="{{urlSessionHistory}}" class="btn bg-green-dark text-white">
<i class="fa-solid fa-power-off"></i>
Commencer ma session
</a>
{% endif %}
</a>
</div>
{% endif %}
<div class="navbar-custom-menu p-1" style="position:relative;">
<div style="position:absolute;bottom:0;left:18px;z-index:9;opacity:0.8;">
<span class="badge badge-primary" >1</span>
</div>
<small style="color: rgb(78, 48, 158);">La durée de la session restante : </small><span class="session-badge">0h 0m 0s</span>
<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">
<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 fa fa-bell fa-stack-1x fa-inverse"></i>
</span>
</span>
<span class="user-name">Notifications </span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li class="dropdown-user-details">
Nouveau adhérent : Ayman Bantala
</li>
</ul>
</div>
</div>
<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>
{{ settings_dropdown }}
{% 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 animate__animated animate__fadeIn">
{% 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 %}
<script>
var notificationSound = new Audio('flexy/sounds/notification_sound.mp3');
document.addEventListener("turbo:load",function(){
{% if settings.get.isMercureEnabled %}
const eventSource = new EventSource("{{ mercure('https://hello.com/books/1')|escape('js') }}");
eventSource.onmessage = event => {
// Will be called every time an update is published by the server
var data = JSON.parse(event.data);
if(data.status == "success"){
if(data.entity == "VisitCustomer"){
//notificationSound.loop = true;
notificationSound.play();
const flashMessages = document.getElementById('flash-messages');
/*$("#flash-messages").append('<div class="alert alert-success alert-dismissible fade show" role="alert"><button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>Nouvelle commande a été crée</div>');*/
{% set urlOrders = ea_url()
.setController('App\\Flexy\\POSBundle\\Controller\\OrderCrudController')
.setAction('index') %}
Turbo.visit("{{urlOrders|escape('js')}}");
}
if(data.status == "success"){
if(data.entity == "Order"){
//notificationSound.loop = true;
notificationSound.play();
const flashMessages = document.getElementById('flash-messages');
/*$("#flash-messages").append('<div class="alert alert-success alert-dismissible fade show" role="alert"><button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>Nouvelle commande a été crée</div>');*/
{% set urlOrders = ea_url()
.setController('App\\Flexy\\POSBundle\\Controller\\OrderCrudController')
.setAction('index') %}
Turbo.visit("{{urlOrders|escape('js')}}");
}
//alert(data.status);
}
console.log(JSON.parse(event.data));
}
{% endif %}
});
document.addEventListener("turbo:click",function(){
notificationSound.pause();
notificationSound.currentTime = 0;
});
</script>
{% endblock body_javascript %}
{% block configured_body_contents %}
{% for htmlContent in ea.assets.bodyContents ?? [] %}
{{ htmlContent|raw }}
{% endfor %}
{% endblock %}
</body>
{% endblock body %}
</html>