{% extends 'base.html.twig' %}
{% block stylesheets %}
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
{% endblock %}
{% block body %}
<link href="https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css" rel="stylesheet">
<div class="flex h-screen bg-white">
<!-- Sidebar -->
<div class="sidebar">
<div class="logo_content">
<div class="logo">
<div class="logo_name">Administration</div>
</div>
<i class="bx bx-menu" id="btn"></i>
</div>
<ul class="nav_list">
{% if is_granted('ROLE_SUPER_ADMIN') %}
<li>
<a href="{{ path('app_dashboard') }}">
<i class="bx bx-grid-alt"></i>
<span class="links_name">Dashboard</span>
</a>
<span class="tooltip">Dashboard</span>
</li>
{% endif %}
<li>
<a href="{{ path('app_client_admin') }}">
<i class="bx bx-user"></i>
<span class="links_name">Clients</span>
</a>
<span class="tooltip">Clients</span>
</li>
<li>
<a href="{{ path('app_ticket_gratter') }}">
<i class="bx bx-gift"></i>
<span class="links_name">Ticket à gratter</span>
</a>
<span class="tooltip">Ticket à gratter</span>
</li>
<li class="has-submenu">
<a href="#">
<i class="bx bx-calculator"></i>
<span class="links_name">Recette</span>
</a>
<span class="tooltip">Recette</span>
<ul class="submenu">
<li>
<a href="{{ path('app_recette') }}">
<i class="bx bx-calculator"></i>
<span>Recette</span>
</a>
</li>
<li>
<a href="{{ path('app_prestation_index') }}">
<i class="bx bx-list-ul"></i>
<span>Liste des prestations</span>
</a>
</li>
</ul>
</li>
<li class="has-submenu">
<a href="#">
<i class="bx bxl-instagram"></i>
<span class="links_name">Instagram</span>
</a>
<span class="tooltip">Instagram</span>
<ul class="submenu">
<li>
<a href="{{ path('app_instagram_upload') }}">
<i class="bx bx-upload"></i>
<span>Créer une story</span>
</a>
</li>
<li>
<a href="{{ path('app_instagram_post') }}">
<i class="bx bx-image-add"></i>
<span>Importer images</span>
</a>
</li>
<li>
<a href="{{ path('image_creator') }}">
<i class="bx bx-palette"></i>
<span>Type de publication</span>
</a>
</li>
<li>
<a href="{{ path('app_instagram_bot_message') }}">
<i class="bx bx-message-rounded-dots"></i>
<span>Message Automatique</span>
</a>
</li>
<li>
<a href="{{ path('app_instagram_post') }}">
<i class="bx bx-cog"></i>
<span>Réglages</span>
</a>
</li>
</ul>
</li>
<li class="has-submenu">
<a href="#">
<i class="bx bx-broadcast"></i>
<span class="links_name">Marketing</span>
</a>
<span class="tooltip">Marketing</span>
<ul class="submenu">
<li>
<a href="{{ path('app_notification_apple_wallet') }}">
<i class="bx bxl-apple"></i>
<span>Notifications iOS</span>
</a>
</li>
<li>
<a href="{{ path('app_review_request') }}">
<i class="bx bx-star"></i>
<span>Avis Google</span>
</a>
</li>
</ul>
</li>
<li>
<a href="#">
<i class="bx bx-folder"></i>
<span class="links_name">Document</span>
</a>
<span class="tooltip">Document</span>
</li>
<li>
<a href="#">
<i class="bx bx-heart"></i>
<span class="links_name">Saved</span>
</a>
<span class="tooltip">Saved</span>
</li>
<li>
<a href="#">
<i class="bx bx-cog"></i>
<span class="links_name">Settings</span>
</a>
<span class="tooltip">Settings</span>
</li>
</ul>
<div class="profile_content">
<div class="profile">
<div class="profile_details">
{% set initials = app.user.firstname|slice(0, 1) ~ app.user.lastname|slice(0, 1) %}
<div class="avatar">{{ initials }}</div>
<div class="name_job">
<div class="name">{{ app.user.firstname }} {{ app.user.lastname }}</div>
<div class="job">Administrateur</div>
</div>
</div>
<a href="{{ path('app_logout') }}">
<i class="bx bx-log-out" id="log_out"></i>
</a>
</div>
</div>
</div>
<!-- Main Content -->
<div class="home_content">
<header class="flex items-center justify-between h-16 px-4 bg-white border-b mobile-header">
<button class="text-gray-500 focus:outline-none lg:hidden" id="menu-toggle">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
</button>
<div class="flex items-center space-x-4">
<nav class="flex mobile-breadcrumb" aria-label="Breadcrumb">
{% block breadcrumb %}
{{ generate_breadcrumb(app.request.attributes.get('_route'))|raw }}
{% endblock %}
</nav>
</div>
</header>
<div class="container mx-auto px-4">
<div class="mb-6 mt-4">
<h2 class="text-3xl font-bold flex items-center"><span class="mr-2">{% block page_emoji %}{% endblock %}</span> {% block page_titre %}{% endblock %}</h2>
<p class="text-gray-600 mb-1">{% block page_info %} {% endblock %}</p> <!-- Réduire la marge inférieure -->
</div>
</div>
<main class="flex-grow w-full">
<div class="px-2">
{% block admin_content %}
{% endblock %}
</div>
</main>
</div>
</div>
<style>
:root {
--navbar-height: 64px; /* Ajustez cette valeur en fonction de la hauteur de votre navbar */
}
body, html {
height: 100%;
margin: 0;
padding: 0;
}
.sidebar {
position: absolute;
top: var(--navbar-height);
left: 0;
height: calc(100% - var(--navbar-height));
width: 78px;
background: #181818;
padding: 6px 14px;
transition: all 0.5s ease;
z-index: 999; /* Assurez-vous que la sidebar est en dessous de la navbar */
}
.sidebar.active {
width: 240px;
}
.sidebar.fixed {
position: fixed;
top: 0;
height: 100%;
}
.sidebar .logo_content .logo {
color: #ffffff;
height: 50px;
width: 100%;
display: flex;
align-items: center;
opacity: 0;
pointer-events: none;
transition: all 0.5s ease;
}
.sidebar.active .logo_content .logo {
opacity: 1;
}
.logo_content .logo i {
font-size: 28px;
margin-right: 5px;
}
.logo_content .logo .logo_name {
font-size: 20px;
font-weight: 400;
}
.sidebar #btn {
position: absolute;
color: #ffffff;
left: 50%;
top: 6px;
font-size: 20px;
height: 50px;
width: 50px;
text-align: center;
line-height: 50px;
transform: translateX(-50%);
}
.sidebar.active #btn {
left: 90%;
}
.sidebar ul {
margin-top: 20px;
}
.sidebar ul li {
position: relative;
height: 50px;
width: 100%;
margin: 0 5px;
list-style: none;
line-height: 50px;
}
.sidebar ul li .tooltip {
position: absolute;
left: 122px;
top: 0;
transform: translate(-50%, -50%);
border-radius: 6px;
height: 35px;
width: 122px;
background: #ffffff;
line-height: 35px;
text-align: center;
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
transition: 0s;
opacity: 0;
pointer-events: none;
display: block;
}
.sidebar.active ul li .tooltip {
display: none;
}
.sidebar ul li:hover .tooltip {
transition: all 0.5s ease;
opacity: 1;
top: 50%;
}
.sidebar ul li a {
color: #ffffff;
display: flex;
align-items: center;
text-decoration: none;
border-radius: 12px;
transition: all 0.4s ease;
white-space: nowrap;
}
.sidebar ul li a:hover {
color: #181818;
background: #333333;
}
.sidebar ul li i {
height: 50px;
min-width: 50px;
border-radius: 12px;
line-height: 50px;
text-align: center;
}
.sidebar .links_name {
opacity: 0;
pointer-events: none;
transition: all 0.5s ease;
}
.sidebar.active .links_name {
opacity: 1;
pointer-events: auto;
}
.sidebar .profile_content {
position: absolute;
color: #ffffff;
bottom: 0;
left: 0;
width: 100%;
}
.sidebar .profile_content .profile {
position: relative;
padding: 10px 6px;
height: 60px;
background: none;
transition: all 0.5s ease;
}
.sidebar.active .profile_content .profile {
background: #282828;
}
.profile_content .profile .profile_details {
display: flex;
align-items: center;
opacity: 0;
pointer-events: none;
white-space: nowrap;
}
.sidebar.active .profile .profile_details {
opacity: 1;
pointer-events: auto;
}
.profile .profile_details img {
height: 45px;
width: 45px;
object-fit: cover;
: 12px;
}
.profile .profile_details .name_job {
margin-left: 10px;
}
.profile .profile_details .name {
font-size: 15px;
font-weight: 400;
}
.profile .profile_details .job {
font-size: 12px;
}
.profile #log_out {
position: absolute;
left: 50%;
bottom: 5px;
transform: translateX(-50%);
min-width: 50px;
line-height: 50px;
font-size: 20px;
border-radius: 12px;
text-align: center;
transition: all 0.5s ease;
background: #282828;
}
.sidebar.active .profile #log_out {
left: 88%;
}
.sidebar.active .profile #log_out {
background: none;
}
.home_content {
position: absolute;
height: calc(100% - var(--navbar-height)); /* Ajustez cette valeur en fonction de la hauteur de votre navbar */
width: calc(100% - 78px);
left: 78px;
top: var(--navbar-height); /* Ajustez cette valeur en fonction de la hauteur de votre navbar */
transition: all 0.5s ease;
}
.home_content .text {
font-size: 25px;
font-weight: 500;
color: #1d1b31;
margin: 12px;
}
.sidebar.active ~ .home_content {
width: calc(100% - 240px);
left: 240px;
}
.breadcrumb {
list-style: none; /* Supprime les puces par défaut */
padding: 0; /* Supprime le padding par défaut */
margin: 0; /* Supprime la marge par défaut */
background: none; /* Supprime le fond par défaut */
display: flex; /* Utilise flexbox pour aligner les éléments en ligne */
flex-wrap: nowrap; /* Empêche le retour à la ligne */
overflow-x: auto; /* Ajoute un défilement horizontal si nécessaire */
}
.breadcrumb li {
display: inline-flex; /* Assure que les éléments sont alignés horizontalement */
align-items: center; /* Centre verticalement les éléments */
margin-right: 0.5rem; /* Ajoute un espace après les éléments */
}
.breadcrumb li a {
text-decoration: none; /* Supprime la décoration de texte par défaut */
color: inherit; /* Utilise la couleur de texte héritée */
transition: color 0.3s; /* Ajoute une transition pour le hover */
}
.breadcrumb li a:hover {
color: #ae885a; /* Couleur de texte au survol */
}
.breadcrumb li svg {
margin-right: 0.5rem; /* Ajoute un espace après les icônes */
}
.avatar {
width: 45px;
height: 45px;
border-radius: 50%;
background-color: #333;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
font-weight: bold;
}
.profile_details {
display: flex;
align-items: center;
}
.name_job {
margin-left: 10px;
}
.name {
font-size: 15px;
font-weight: 400;
}
.job {
font-size: 12px;
}
@media (max-width: 768px) {
.sidebar {
width: 240px;
left: -240px;
top: auto !important;
height: calc(100% - var(--navbar-height)); /* Ajustez cette valeur en fonction de la hauteur de votre navbar */
transition: all 0.3s ease;
position: fixed; /* Ajoutez cette ligne */
}
.sidebar.active {
left: 0;
}
.home_content {
width: 100%;
left: 0;
transition: all 0.3s ease;
}
.sidebar.active ~ .home_content {
left: 240px;
width: calc(100% - 240px);
}
.sidebar #btn {
display: none;
}
.mobile-header {
margin-top: -40px;
}
.breadcrumb {
font-size: 0.8rem; /* Réduire la taille de la police */
}
.breadcrumb li {
margin-right: 0.3rem; /* Réduire les marges entre les éléments */
}
.breadcrumb li svg {
width: 0.6rem; /* Réduire la taille des icônes */
height: 0.6rem;
}
}
/* Remplacez votre media query iPad actuelle par celle-ci */
@media (min-width: 769px) and (max-width: 1024px) {
.mobile-header #menu-toggle {
display: none;
}
.sidebar {
width: 78px; /* Commence fermée */
left: 0;
top: var(--navbar-height);
height: calc(100% - var(--navbar-height));
transition: all 0.3s ease;
}
.sidebar.active {
width: 240px; /* S'ouvre au clic */
}
.sidebar .links_name {
opacity: 0;
}
.sidebar.active .links_name {
opacity: 1;
}
.home_content {
width: calc(100% - 78px);
left: 78px;
transition: all 0.3s ease;
}
.sidebar.active ~ .home_content {
width: calc(100% - 240px);
left: 240px;
}
.sidebar #btn {
display: block; /* Afficher le bouton sur iPad */
}
/* Gestion du profil */
.profile_content .profile .profile_details {
opacity: 0;
}
.sidebar.active .profile_content .profile .profile_details {
opacity: 1;
}
}
@media (min-width: 769px) and (max-width: 1024px) {
.sidebar:not(.active) ul li.has-submenu > a::after {
display: none;
}
.sidebar:not(.active) ul li .submenu {
position: absolute;
left: 78px;
background: #181818;
width: 200px;
padding: 10px;
border-radius: 0 6px 6px 0;
display: none;
}
.sidebar:not(.active) ul li.has-submenu.open .submenu {
display: block;
}
.sidebar.active ul li .submenu {
left: 240px;
}
}
.sidebar ul li.has-submenu > a::after {
content: '\25B6';
position: absolute;
right: 20px;
transition: transform 0.3s;
display: none; /* Masquer la flèche par défaut */
}
.sidebar.active ul li.has-submenu > a::after {
display: inline-block; /* Afficher la flèche lorsque la barre latérale est ouverte */
}
.sidebar ul li.has-submenu.open > a::after {
transform: rotate(90deg);
}
.sidebar ul li .submenu {
display: none;
padding-left: 20px;
}
.sidebar ul li.open .submenu {
display: block;
}
.sidebar.active ul li .submenu {
position: absolute;
left: 100%;
top: 0;
background: #181818;
width: 200px;
padding: 10px;
border-radius: 0 6px 6px 0;
}
.sidebar.active ul li .submenu li {
background: none;
padding: 6px 0;
}
.sidebar:not(.active) ul li.has-submenu.open .submenu {
position: absolute;
left: 78px;
top: 0;
background: #181818;
width: 200px;
padding: 10px;
border-radius: 0 6px 6px 0;
z-index: 1000;
}
.sidebar:not(.active) ul li.has-submenu.open .submenu li {
height: auto;
padding: 6px 0;
}
.sidebar:not(.active) ul li.has-submenu.open .submenu li a {
padding-left: 10px;
}
.sidebar ul li.has-submenu.open .tooltip {
display: none;
}
.sidebar.active ul li .submenu {
position: absolute;
left: 100%;
top: 0;
background: #181818;
width: 200px;
padding: 10px;
border-radius: 0 6px 6px 0;
margin-left: -14px; /* Ajoutez cette ligne pour coller le sous-menu à la sidebar */
}
.sidebar:not(.active) ul li.has-submenu.open .submenu {
position: absolute;
left: 64px; /* Ajustez cette valeur pour coller le sous-menu à la sidebar fermée */
top: 0;
background: #181818;
width: 200px;
padding: 10px;
border-radius: 0 6px 6px 0;
z-index: 1000;
}
.sidebar ul li .submenu li a {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: block;
padding: 5px 10px;
}
.sidebar:not(.active) ul li.has-submenu.open .submenu li a {
padding-left: 10px;
}
.sidebar.active ul li .submenu,
.sidebar:not(.active) ul li.has-submenu.open .submenu {
width: auto;
min-width: 200px;
max-width: 250px;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
let sidebar = document.querySelector('.sidebar');
let navbarHeight = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--navbar-height'), 10);
let btn = document.querySelector('#btn');
let menuToggle = document.querySelector('#menu-toggle');
// Gestion du scroll
window.addEventListener('scroll', function () {
if (window.scrollY > navbarHeight) {
sidebar.classList.add('fixed');
sidebar.style.top = '0';
} else {
sidebar.classList.remove('fixed');
sidebar.style.top = `var(--navbar-height)`;
}
});
// Gestion des boutons de menu
btn.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
menuToggle.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
// Gestion des sous-menus
let submenuItems = document.querySelectorAll('.has-submenu');
submenuItems.forEach(item => {
item.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
// Fermer tous les autres sous-menus
submenuItems.forEach(otherItem => {
if (otherItem !== this && otherItem.classList.contains('open')) {
otherItem.classList.remove('open');
const otherTooltip = otherItem.querySelector('.tooltip');
if (otherTooltip) {
otherTooltip.style.display = '';
}
}
});
// Basculer l'état du sous-menu actuel
this.classList.toggle('open');
// Gérer le tooltip
const tooltip = this.querySelector('.tooltip');
if (tooltip) {
tooltip.style.display = this.classList.contains('open') ? 'none' : '';
}
});
});
// Fermer les sous-menus lors d'un clic à l'extérieur
document.addEventListener('click', function(e) {
if (!sidebar.contains(e.target)) {
submenuItems.forEach(item => {
item.classList.remove('open');
const tooltip = item.querySelector('.tooltip');
if (tooltip) {
tooltip.style.display = '';
}
});
}
});
// Gestion des liens dans les sous-menus
let submenuLinks = document.querySelectorAll('.submenu a');
submenuLinks.forEach(link => {
link.addEventListener('click', function(e) {
e.stopPropagation();
});
});
// État initial pour iPad
function setInitialState() {
if (window.innerWidth >= 769 && window.innerWidth <= 1024) {
sidebar.classList.remove('active');
submenuItems.forEach(item => item.classList.remove('open'));
}
}
setInitialState();
window.addEventListener('resize', setInitialState);
});
</script>
{% endblock %}