```
✨ feat(templates): Améliore la lisibilité et l'esthétique de l'interface
Ce commit met à jour les couleurs et les styles de texte dans plusieurs
templates pour améliorer la lisibilité et l'esthétique globale de
l'interface utilisateur. Les couleurs de texte secondaires sont
ajustées pour un meilleur contraste.
```
This commit is contained in:
@@ -21,7 +21,7 @@
|
|||||||
<div class="flex justify-between items-center mb-8">
|
<div class="flex justify-between items-center mb-8">
|
||||||
<div>
|
<div>
|
||||||
<h1 class="text-3xl font-black text-gray-800 dark:text-white tracking-tight">Liste des Administrateurs</h1>
|
<h1 class="text-3xl font-black text-gray-800 dark:text-white tracking-tight">Liste des Administrateurs</h1>
|
||||||
<p class="text-sm text-gray-500 dark:text-gray-400 font-medium mt-1">Gestion des accès et des niveaux d'accréditation système.</p>
|
<p class="text-sm text-gray-500 dark:text-gray-200 font-medium mt-1">Gestion des accès et des niveaux d'accréditation système.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center space-x-3">
|
<div class="flex items-center space-x-3">
|
||||||
<span class="px-4 py-2 text-xs font-black text-indigo-600 bg-indigo-100 rounded-full dark:bg-indigo-900/40 dark:text-indigo-300 uppercase tracking-widest shadow-sm border border-indigo-200 dark:border-indigo-800">
|
<span class="px-4 py-2 text-xs font-black text-indigo-600 bg-indigo-100 rounded-full dark:bg-indigo-900/40 dark:text-indigo-300 uppercase tracking-widest shadow-sm border border-indigo-200 dark:border-indigo-800">
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
{# TABLE CARD #}
|
{# TABLE CARD #}
|
||||||
<div class="bg-white dark:bg-[#1e293b] shadow-sm rounded-3xl border border-gray-200 dark:border-gray-800 overflow-hidden">
|
<div class="bg-white dark:bg-[#1e293b] shadow-sm rounded-3xl border border-gray-200 dark:border-gray-800 overflow-hidden">
|
||||||
<div class="overflow-x-auto">
|
<div class="overflow-x-auto">
|
||||||
<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
<table class="w-full text-sm text-left text-gray-500 dark:text-gray-200">
|
||||||
<thead class="text-[10px] text-gray-400 uppercase bg-gray-50/50 dark:bg-gray-900/50 dark:text-gray-500 border-b border-gray-100 dark:border-gray-800">
|
<thead class="text-[10px] text-gray-200 uppercase bg-gray-50/50 dark:bg-gray-900/50 dark:text-gray-500 border-b border-gray-100 dark:border-gray-800">
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col" class="px-8 py-5 font-black tracking-widest">Identité de l'Administrateur</th>
|
<th scope="col" class="px-8 py-5 font-black tracking-widest">Identité de l'Administrateur</th>
|
||||||
<th scope="col" class="px-8 py-5 font-black tracking-widest">Rôles & Habilitations</th>
|
<th scope="col" class="px-8 py-5 font-black tracking-widest">Rôles & Habilitations</th>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
{# COLONNE 1 : IDENTITÉ #}
|
{# COLONNE 1 : IDENTITÉ #}
|
||||||
<td class="px-8 py-5">
|
<td class="px-8 py-5">
|
||||||
<div class="flex items-center space-x-4">
|
<div class="flex items-center space-x-4">
|
||||||
<div class="h-11 w-11 rounded-2xl bg-slate-100 dark:bg-slate-800 flex items-center justify-center text-slate-500 dark:text-slate-400 font-black text-xs border border-slate-200 dark:border-slate-700 shadow-sm transition-transform group-hover:scale-110">
|
<div class="h-11 w-11 rounded-2xl bg-slate-100 dark:bg-slate-800 flex items-center justify-center text-slate-300 dark:text-slate-400 font-black text-xs border border-slate-200 dark:border-slate-700 shadow-sm transition-transform group-hover:scale-110">
|
||||||
{{ admin.firstName|first|upper }}{{ admin.name|first|upper }}
|
{{ admin.firstName|first|upper }}{{ admin.name|first|upper }}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
{% elseif role == 'ROLE_CLIENT_MAIN' %}
|
{% elseif role == 'ROLE_CLIENT_MAIN' %}
|
||||||
<span class="px-2 py-0.5 bg-indigo-600 text-white text-[9px] font-black uppercase rounded shadow-sm">CLIENT PRINCIPAL</span>
|
<span class="px-2 py-0.5 bg-indigo-600 text-white text-[9px] font-black uppercase rounded shadow-sm">CLIENT PRINCIPAL</span>
|
||||||
{% elseif role == 'ROLE_ADMIN' %}
|
{% elseif role == 'ROLE_ADMIN' %}
|
||||||
<span class="px-2 py-0.5 bg-slate-100 dark:bg-slate-800 text-slate-500 dark:text-slate-400 text-[9px] font-black uppercase rounded border border-slate-200 dark:border-slate-700">ADMIN</span>
|
<span class="px-2 py-0.5 bg-slate-100 dark:bg-slate-800 text-slate-300 dark:text-slate-400 text-[9px] font-black uppercase rounded border border-slate-200 dark:border-slate-700">ADMIN</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="px-2 py-0.5 bg-emerald-100 dark:bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 text-[9px] font-bold uppercase rounded border border-emerald-200 dark:border-emerald-500/20">
|
<span class="px-2 py-0.5 bg-emerald-100 dark:bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 text-[9px] font-bold uppercase rounded border border-emerald-200 dark:border-emerald-500/20">
|
||||||
{{ role|replace({'ROLE_ADMIN_': ''}) }}
|
{{ role|replace({'ROLE_ADMIN_': ''}) }}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
{% block actions %}
|
{% block actions %}
|
||||||
{# Bouton de retour vers la liste #}
|
{# Bouton de retour vers la liste #}
|
||||||
<a data-turbo="false" href="{{ path('app_crm_administrateur') }}" class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 dark:hover:bg-gray-700 transition-colors">
|
<a data-turbo="false" href="{{ path('app_crm_administrateur') }}" class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-200 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 dark:hover:bg-gray-700 transition-colors">
|
||||||
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path>
|
||||||
</svg>
|
</svg>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
{# Bloc IDENTIFIANT - Correction couleur Label dark:text-gray-200 #}
|
{# Bloc IDENTIFIANT - Correction couleur Label dark:text-gray-200 #}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
{{ form_label(form.username, 'Identifiant (Username)', {
|
{{ form_label(form.username, 'Identifiant (Username)', {
|
||||||
'label_attr': {'class': 'block text-sm font-semibold text-gray-700 dark:text-gray-200'}
|
'label_attr': {'class': 'block text-sm font-semibold text-gray-200 dark:text-gray-200'}
|
||||||
}) }}
|
}) }}
|
||||||
{{ form_widget(form.username, {
|
{{ form_widget(form.username, {
|
||||||
'attr': {
|
'attr': {
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
{# Bloc EMAIL #}
|
{# Bloc EMAIL #}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
{{ form_label(form.email, 'Adresse mail professionnelle', {
|
{{ form_label(form.email, 'Adresse mail professionnelle', {
|
||||||
'label_attr': {'class': 'block text-sm font-semibold text-gray-700 dark:text-gray-200'}
|
'label_attr': {'class': 'block text-sm font-semibold text-gray-200 dark:text-gray-200'}
|
||||||
}) }}
|
}) }}
|
||||||
{{ form_widget(form.email, {
|
{{ form_widget(form.email, {
|
||||||
'attr': {
|
'attr': {
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
{# Bloc PRENOM #}
|
{# Bloc PRENOM #}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
{{ form_label(form.firstName, 'Prénom', {
|
{{ form_label(form.firstName, 'Prénom', {
|
||||||
'label_attr': {'class': 'block text-sm font-semibold text-gray-700 dark:text-gray-200'}
|
'label_attr': {'class': 'block text-sm font-semibold text-gray-200 dark:text-gray-200'}
|
||||||
}) }}
|
}) }}
|
||||||
{{ form_widget(form.firstName, {
|
{{ form_widget(form.firstName, {
|
||||||
'attr': {
|
'attr': {
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
{# Bloc NOM #}
|
{# Bloc NOM #}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
{{ form_label(form.name, 'Nom de famille', {
|
{{ form_label(form.name, 'Nom de famille', {
|
||||||
'label_attr': {'class': 'block text-sm font-semibold text-gray-700 dark:text-gray-200'}
|
'label_attr': {'class': 'block text-sm font-semibold text-gray-200 dark:text-gray-200'}
|
||||||
}) }}
|
}) }}
|
||||||
{{ form_widget(form.name, {
|
{{ form_widget(form.name, {
|
||||||
'attr': {
|
'attr': {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
{% block title %}Administrateur : {{ admin.firstName }} {{ admin.name }}{% endblock %}
|
{% block title %}Administrateur : {{ admin.firstName }} {{ admin.name }}{% endblock %}
|
||||||
|
|
||||||
{% block actions %}
|
{% block actions %}
|
||||||
<a data-turbo="false" href="{{ path('app_crm_administrateur') }}" class="flex items-center space-x-2 px-4 py-2 text-slate-500 hover:text-slate-800 dark:hover:text-white transition-colors">
|
<a data-turbo="false" href="{{ path('app_crm_administrateur') }}" class="flex items-center space-x-2 px-4 py-2 text-slate-300 hover:text-slate-800 dark:hover:text-white transition-colors">
|
||||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/></svg>
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/></svg>
|
||||||
<span class="text-sm font-bold tracking-tight">Retour à la liste</span>
|
<span class="text-sm font-bold tracking-tight">Retour à la liste</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<span class="text-sm font-bold text-slate-600 dark:text-slate-300">{{ admin.email }}</span>
|
<span class="text-sm font-bold text-slate-600 dark:text-slate-300">{{ admin.email }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="h-1 w-1 bg-slate-300 dark:bg-slate-700 rounded-full"></div>
|
<div class="h-1 w-1 bg-slate-300 dark:bg-slate-700 rounded-full"></div>
|
||||||
<span class="text-[10px] font-black text-slate-500 uppercase tracking-widest">System ID: #{{ admin.id }}</span>
|
<span class="text-[10px] font-black text-slate-300 uppercase tracking-widest">System ID: #{{ admin.id }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<a data-turbo="false" href="{{ path('app_crm_administrateur_view', {id: admin.id, act: 'updateStatut', status: 'false'}) }}"
|
<a data-turbo="false" href="{{ path('app_crm_administrateur_view', {id: admin.id, act: 'updateStatut', status: 'false'}) }}"
|
||||||
onclick="return confirm('Voulez-vous vraiment désactiver cet accès ?')"
|
onclick="return confirm('Voulez-vous vraiment désactiver cet accès ?')"
|
||||||
class="px-6 py-3 bg-slate-100 dark:bg-slate-800 hover:bg-red-600 text-slate-500 dark:text-slate-400 hover:text-white text-[10px] font-black uppercase tracking-widest transition-all active:scale-95 border-l border-slate-200 dark:border-white/5">
|
class="px-6 py-3 bg-slate-100 dark:bg-slate-800 hover:bg-red-600text-slate-300 dark:text-slate-400 hover:text-white text-[10px] font-black uppercase tracking-widest transition-all active:scale-95 border-l border-slate-200 dark:border-white/5">
|
||||||
Désactiver
|
Désactiver
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -158,7 +158,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h4 class="text-sm font-bold text-slate-800 dark:text-white">Authentification 2FA</h4>
|
<h4 class="text-sm font-bold text-slate-800 dark:text-white">Authentification 2FA</h4>
|
||||||
<p class="text-xs text-slate-500 dark:text-slate-400">
|
<p class="text-xs text-slate-300 dark:text-slate-400">
|
||||||
{% if admin.googleAuthenticatorSecret %}
|
{% if admin.googleAuthenticatorSecret %}
|
||||||
<span class="text-emerald-500 font-bold">● Activée</span> — Accès hautement sécurisé
|
<span class="text-emerald-500 font-bold">● Activée</span> — Accès hautement sécurisé
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -253,7 +253,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span class="block text-sm font-bold text-white tracking-wide group-hover:text-indigo-400 transition-colors uppercase">Administrateur Client Principal</span>
|
<span class="block text-sm font-bold text-white tracking-wide group-hover:text-indigo-400 transition-colors uppercase">Administrateur Client Principal</span>
|
||||||
<p class="text-[10px] text-slate-500 font-medium mt-1 uppercase italic">Contrôle total de l'organisation</p>
|
<p class="text-[10px] text-slate-300 font-medium mt-1 uppercase italic">Contrôle total de l'organisation</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
@@ -269,7 +269,7 @@
|
|||||||
<div class="px-8 py-6 border-b border-slate-100 dark:border-slate-800 flex items-center justify-between bg-slate-50/30 dark:bg-slate-800/30">
|
<div class="px-8 py-6 border-b border-slate-100 dark:border-slate-800 flex items-center justify-between bg-slate-50/30 dark:bg-slate-800/30">
|
||||||
<div>
|
<div>
|
||||||
<h3 class="text-[10px] font-black text-indigo-500 uppercase tracking-[0.3em]">Journal d'Audit Personnel</h3>
|
<h3 class="text-[10px] font-black text-indigo-500 uppercase tracking-[0.3em]">Journal d'Audit Personnel</h3>
|
||||||
<p class="text-xs text-slate-500 dark:text-slate-400 mt-1">Historique des actions et vérification d'intégrité numérique</p>
|
<p class="text-xs text-slate-300 dark:text-slate-400 mt-1">Historique des actions et vérification d'intégrité numérique</p>
|
||||||
</div>
|
</div>
|
||||||
<span class="px-4 py-1.5 bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400 text-[10px] font-black uppercase rounded-lg border border-indigo-100 dark:border-indigo-800/50">
|
<span class="px-4 py-1.5 bg-indigo-50 dark:bg-indigo-900/20 text-indigo-600 dark:text-indigo-400 text-[10px] font-black uppercase rounded-lg border border-indigo-100 dark:border-indigo-800/50">
|
||||||
{{ auditLogs.getTotalItemCount }} ÉVÈNEMENTS
|
{{ auditLogs.getTotalItemCount }} ÉVÈNEMENTS
|
||||||
@@ -305,12 +305,12 @@
|
|||||||
'SECURITY_CRITICAL': { 'label': 'CRITIQUE', 'style': 'bg-red-600 text-white border-red-700 animate-pulse font-black' },
|
'SECURITY_CRITICAL': { 'label': 'CRITIQUE', 'style': 'bg-red-600 text-white border-red-700 animate-pulse font-black' },
|
||||||
'2FA_INVITE': { 'label': 'INVITATION 2FA', 'style': 'bg-indigo-500/10 text-indigo-500 border-indigo-500/20' },
|
'2FA_INVITE': { 'label': 'INVITATION 2FA', 'style': 'bg-indigo-500/10 text-indigo-500 border-indigo-500/20' },
|
||||||
'2FA_DISABLED': { 'label': '2FA DÉSACTIVÉE', 'style': 'bg-rose-500/10 text-rose-600 border-rose-500/20 font-bold' },
|
'2FA_DISABLED': { 'label': '2FA DÉSACTIVÉE', 'style': 'bg-rose-500/10 text-rose-600 border-rose-500/20 font-bold' },
|
||||||
'UPDATE_STATUS': { 'label': 'STATUT COMPTE', 'style': 'bg-slate-500/10 text-slate-500 border-slate-500/20' },
|
'UPDATE_STATUS': { 'label': 'STATUT COMPTE', 'style': 'bg-slate-500/10 text-slate-300 border-slate-500/20' },
|
||||||
'UPDATE_ROLES': { 'label': 'DROITS ACCÈS', 'style': 'bg-purple-500/10 text-purple-600 border-purple-500/20' }
|
'UPDATE_ROLES': { 'label': 'DROITS ACCÈS', 'style': 'bg-purple-500/10 text-purple-600 border-purple-500/20' }
|
||||||
} %}
|
} %}
|
||||||
|
|
||||||
{# On récupère la configuration ou on utilise une valeur par défaut #}
|
{# On récupère la configuration ou on utilise une valeur par défaut #}
|
||||||
{% set config = typeMapping[log.type] ?? { 'label': log.type|replace({'_': ' '}), 'style': 'bg-slate-500/10 text-slate-500 border-slate-500/20' } %}
|
{% set config = typeMapping[log.type] ?? { 'label': log.type|replace({'_': ' '}), 'style': 'bg-slate-500/10 text-slate-300 border-slate-500/20' } %}
|
||||||
|
|
||||||
<span class="px-3 py-1.5 rounded-lg text-[10px] font-black border uppercase tracking-widest {{ config.style }}">
|
<span class="px-3 py-1.5 rounded-lg text-[10px] font-black border uppercase tracking-widest {{ config.style }}">
|
||||||
{{ config.label }}
|
{{ config.label }}
|
||||||
@@ -372,7 +372,7 @@
|
|||||||
<tr class="hover:bg-slate-50/50 dark:hover:bg-slate-800/30 transition-colors">
|
<tr class="hover:bg-slate-50/50 dark:hover:bg-slate-800/30 transition-colors">
|
||||||
<td class="px-8 py-5 text-slate-700 dark:text-slate-200">{{ login.loginAt|date('d/m/Y H:i') }}</td>
|
<td class="px-8 py-5 text-slate-700 dark:text-slate-200">{{ login.loginAt|date('d/m/Y H:i') }}</td>
|
||||||
<td class="px-8 py-5">
|
<td class="px-8 py-5">
|
||||||
<span class="px-3 py-1 bg-slate-100 dark:bg-slate-800 rounded-lg text-xs font-mono text-slate-500 border border-slate-200 dark:border-slate-700">
|
<span class="px-3 py-1 bg-slate-100 dark:bg-slate-800 rounded-lg text-xs font-mono text-slate-300 border border-slate-200 dark:border-slate-700">
|
||||||
{{ login.ip }}
|
{{ login.ip }}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
{# 1. SELECT COMPTE #}
|
{# 1. SELECT COMPTE #}
|
||||||
<div class="flex-1 min-w-[240px]">
|
<div class="flex-1 min-w-[240px]">
|
||||||
<label for="account" class="block text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] mb-2 ml-2">Filtrer par compte</label>
|
<label for="account" class="block text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] mb-2 ml-2">Filtrer par compte</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<select name="account" id="account" class="w-full bg-slate-900/50 border border-white/10 rounded-xl px-4 py-3.5 text-sm text-white focus:border-blue-500 focus:ring-0 outline-none transition-all appearance-none cursor-pointer">
|
<select name="account" id="account" class="w-full bg-slate-900/50 border border-white/10 rounded-xl px-4 py-3.5 text-sm text-white focus:border-blue-500 focus:ring-0 outline-none transition-all appearance-none cursor-pointer">
|
||||||
<option value="">Tous les utilisateurs</option>
|
<option value="">Tous les utilisateurs</option>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
</option>
|
</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
<div class="absolute inset-y-0 right-4 flex items-center pointer-events-none text-slate-500">
|
<div class="absolute inset-y-0 right-4 flex items-center pointer-events-nonetext-slate-300">
|
||||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg>
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></svg>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
<div class="px-8 py-6 border-b border-white/5 flex items-center justify-between bg-white/5">
|
<div class="px-8 py-6 border-b border-white/5 flex items-center justify-between bg-white/5">
|
||||||
<div>
|
<div>
|
||||||
<h2 class="text-xl font-bold text-white tracking-tight">Historique d'activité</h2>
|
<h2 class="text-xl font-bold text-white tracking-tight">Historique d'activité</h2>
|
||||||
<p class="text-[10px] text-slate-500 font-bold uppercase tracking-widest mt-1">Sécurisé par signature cryptographique SHA-256</p>
|
<p class="text-[10px] text-slate-300 font-bold uppercase tracking-widest mt-1">Sécurisé par signature cryptographique SHA-256</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<span class="px-4 py-1.5 bg-blue-500/10 text-blue-400 text-[10px] font-black uppercase rounded-lg border border-blue-500/20">
|
<span class="px-4 py-1.5 bg-blue-500/10 text-blue-400 text-[10px] font-black uppercase rounded-lg border border-blue-500/20">
|
||||||
@@ -86,13 +86,13 @@
|
|||||||
<table class="w-full text-left border-collapse">
|
<table class="w-full text-left border-collapse">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="bg-slate-900/40 border-b border-white/5">
|
<tr class="bg-slate-900/40 border-b border-white/5">
|
||||||
<th class="px-8 py-5 text-[11px] font-black text-slate-500 uppercase tracking-[0.2em]">Horodatage</th>
|
<th class="px-8 py-5 text-[11px] font-black text-slate-300 uppercase tracking-[0.2em]">Horodatage</th>
|
||||||
<th class="px-8 py-5 text-[11px] font-black text-slate-500 uppercase tracking-[0.2em]">Agent & Session</th>
|
<th class="px-8 py-5 text-[11px] font-black text-slate-300 uppercase tracking-[0.2em]">Agent & Session</th>
|
||||||
<th class="px-8 py-5 text-[11px] font-black text-slate-500 uppercase tracking-[0.2em] text-center">Action</th>
|
<th class="px-8 py-5 text-[11px] font-black text-slate-300 uppercase tracking-[0.2em] text-center">Action</th>
|
||||||
<th class="px-8 py-5 text-[11px] font-black text-slate-500 uppercase tracking-[0.2em] text-center">Intégrité</th>
|
<th class="px-8 py-5 text-[11px] font-black text-slate-300 uppercase tracking-[0.2em] text-center">Intégrité</th>
|
||||||
<th class="px-8 py-5 text-[11px] font-black text-slate-500 uppercase tracking-[0.2em]">Détails</th>
|
<th class="px-8 py-5 text-[11px] font-black text-slate-300 uppercase tracking-[0.2em]">Détails</th>
|
||||||
{% if is_granted('ROLE_ROOT') %}
|
{% if is_granted('ROLE_ROOT') %}
|
||||||
<th class="px-8 py-5 text-[11px] font-black text-slate-500 uppercase tracking-[0.2em] text-right">Admin</th>
|
<th class="px-8 py-5 text-[11px] font-black text-slate-300 uppercase tracking-[0.2em] text-right">Admin</th>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
{# 1. DATE #}
|
{# 1. DATE #}
|
||||||
<td class="px-8 py-6 whitespace-nowrap align-top">
|
<td class="px-8 py-6 whitespace-nowrap align-top">
|
||||||
<div class="text-sm font-bold text-white">{{ log.actionAt|date('d/m/Y') }}</div>
|
<div class="text-sm font-bold text-white">{{ log.actionAt|date('d/m/Y') }}</div>
|
||||||
<div class="text-[10px] text-slate-500 font-mono mt-0.5 tracking-wider">{{ log.actionAt|date('H:i:s') }}</div>
|
<div class="text-[10px] text-slate-300 font-mono mt-0.5 tracking-wider">{{ log.actionAt|date('H:i:s') }}</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
{# 2. ADMIN & UA #}
|
{# 2. ADMIN & UA #}
|
||||||
@@ -118,7 +118,7 @@
|
|||||||
<span class="ml-2 px-1.5 py-0.5 rounded text-[8px] bg-rose-500/10 text-rose-500 font-black uppercase border border-rose-500/20">Root</span>
|
<span class="ml-2 px-1.5 py-0.5 rounded text-[8px] bg-rose-500/10 text-rose-500 font-black uppercase border border-rose-500/20">Root</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-[10px] text-slate-500 font-medium truncate max-w-[180px]">{{ log.userAgent|default('Agent inconnu') }}</div>
|
<div class="text-[10px] text-slate-300 font-medium truncate max-w-[180px]">{{ log.userAgent|default('Agent inconnu') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
'2FA_INVITE': { 'label': '2FA INVITE', 'style': 'bg-indigo-500/10 text-indigo-400 border-indigo-500/20' },
|
'2FA_INVITE': { 'label': '2FA INVITE', 'style': 'bg-indigo-500/10 text-indigo-400 border-indigo-500/20' },
|
||||||
'2FA_DISABLED': { 'label': '2FA OFF', 'style': 'bg-rose-500/10 text-rose-500 border-rose-500/20 font-bold' }
|
'2FA_DISABLED': { 'label': '2FA OFF', 'style': 'bg-rose-500/10 text-rose-500 border-rose-500/20 font-bold' }
|
||||||
} %}
|
} %}
|
||||||
{% set config = typeMapping[log.type] ?? { 'label': log.type, 'style': 'bg-slate-500/10 text-slate-500 border-white/10' } %}
|
{% set config = typeMapping[log.type] ?? { 'label': log.type, 'style': 'bg-slate-500/10 text-slate-300 border-white/10' } %}
|
||||||
<span class="px-3 py-1.5 rounded-lg text-[9px] font-black border uppercase tracking-[0.15em] {{ config.style }}">
|
<span class="px-3 py-1.5 rounded-lg text-[9px] font-black border uppercase tracking-[0.15em] {{ config.style }}">
|
||||||
{{ config.label }}
|
{{ config.label }}
|
||||||
</span>
|
</span>
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
<td class="px-8 py-6 whitespace-nowrap text-right align-top">
|
<td class="px-8 py-6 whitespace-nowrap text-right align-top">
|
||||||
<form action="{{ path('app_crm_audit_logs_delete', {id: log.id}) }}" method="POST" onsubmit="return confirm('Confirmer la suppression définitive de cet enregistrement ?');">
|
<form action="{{ path('app_crm_audit_logs_delete', {id: log.id}) }}" method="POST" onsubmit="return confirm('Confirmer la suppression définitive de cet enregistrement ?');">
|
||||||
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ log.id) }}">
|
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ log.id) }}">
|
||||||
<button type="submit" class="p-2 text-slate-500 hover:text-rose-500 hover:bg-rose-500/10 rounded-lg transition-all">
|
<button type="submit" class="p-2 text-slate-300 hover:text-rose-500 hover:bg-rose-500/10 rounded-lg transition-all">
|
||||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/></svg>
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/></svg>
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
@@ -178,7 +178,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="6" class="px-8 py-20 text-center italic text-slate-500 font-medium">
|
<td colspan="6" class="px-8 py-20 text-center italic text-slate-300 font-medium">
|
||||||
Aucun enregistrement trouvé dans le journal d'audit.
|
Aucun enregistrement trouvé dans le journal d'audit.
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -190,7 +190,7 @@
|
|||||||
{# PAGINATION #}
|
{# PAGINATION #}
|
||||||
<div class="px-8 py-8 bg-black/20 border-t border-white/5">
|
<div class="px-8 py-8 bg-black/20 border-t border-white/5">
|
||||||
<div class="flex flex-col md:flex-row items-center justify-between gap-6">
|
<div class="flex flex-col md:flex-row items-center justify-between gap-6">
|
||||||
<div class="text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">
|
<div class="text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">
|
||||||
Page {{ logs.getCurrentPageNumber }} sur {{ (logs.getTotalItemCount / 25)|round(0, 'ceil') }}
|
Page {{ logs.getCurrentPageNumber }} sur {{ (logs.getTotalItemCount / 25)|round(0, 'ceil') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="navigation custom-pagination">
|
<div class="navigation custom-pagination">
|
||||||
|
|||||||
@@ -26,10 +26,10 @@
|
|||||||
<table class="w-full text-left border-collapse">
|
<table class="w-full text-left border-collapse">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="bg-slate-900/50 border-b border-white/5">
|
<tr class="bg-slate-900/50 border-b border-white/5">
|
||||||
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em] text-slate-500">Identité de la Sauvegarde</th>
|
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em] text-slate-300">Identité de la Sauvegarde</th>
|
||||||
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em] text-slate-500 text-center">État</th>
|
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em text-slate-300 text-center">État</th>
|
||||||
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em] text-slate-500 text-center">Taille</th>
|
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em text-slate-300 text-center">Taille</th>
|
||||||
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em] text-slate-500 text-right">Actions</th>
|
<th class="p-6 text-[10px] font-bold uppercase tracking-[0.2em text-slate-300 text-right">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="text-sm font-bold text-white tracking-tight">Sauvegarde</p>
|
<p class="text-sm font-bold text-white tracking-tight">Sauvegarde</p>
|
||||||
<p class="text-[11px] text-slate-500 font-medium">Réalisé le {{ backup.createdAt|date('d/m/Y') }} à {{ backup.createdAt|date('H:i') }}</p>
|
<p class="text-[11px text-slate-300 font-medium">Réalisé le {{ backup.createdAt|date('d/m/Y') }} à {{ backup.createdAt|date('H:i') }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
<nav class="flex flex-col p-6 space-y-8 h-[calc(100vh-80px)] overflow-y-auto custom-scrollbar">
|
<nav class="flex flex-col p-6 space-y-8 h-[calc(100vh-80px)] overflow-y-auto custom-scrollbar">
|
||||||
<div>
|
<div>
|
||||||
<p class="px-4 mb-4 text-[10px] font-semibold text-slate-500 uppercase tracking-[0.2em]">Menu Principal</p>
|
<p class="px-4 mb-4 text-[10px] font-semibold text-slate-300 uppercase tracking-[0.2em]">Menu Principal</p>
|
||||||
<div class="space-y-1">
|
<div class="space-y-1">
|
||||||
{% macro nav_link(path, label, icon_svg, current_route) %}
|
{% macro nav_link(path, label, icon_svg, current_route) %}
|
||||||
{% set isActive = app.request.get('_route') == current_route %}
|
{% set isActive = app.request.get('_route') == current_route %}
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p class="px-4 mb-4 text-[10px] font-semibold text-slate-500 uppercase tracking-[0.2em]">Configuration</p>
|
<p class="px-4 mb-4 text-[10px] font-semibold text-slate-300 uppercase tracking-[0.2em]">Configuration</p>
|
||||||
<details class="group" {{ (app.request.get('_route') matches '/^app_crm_administrateur/' or app.request.get('_route') == 'app_crm_audit_logs') ? 'open' }}>
|
<details class="group" {{ (app.request.get('_route') matches '/^app_crm_administrateur/' or app.request.get('_route') == 'app_crm_audit_logs') ? 'open' }}>
|
||||||
<summary class="list-none w-full flex items-center justify-between px-4 py-3 rounded-xl hover:bg-slate-800 text-slate-400 transition-all duration-200 cursor-pointer">
|
<summary class="list-none w-full flex items-center justify-between px-4 py-3 rounded-xl hover:bg-slate-800 text-slate-400 transition-all duration-200 cursor-pointer">
|
||||||
<div class="flex items-center space-x-3">
|
<div class="flex items-center space-x-3">
|
||||||
@@ -163,7 +163,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<p class="text-sm text-slate-400 font-medium">{{ message }}</p>
|
<p class="text-sm text-slate-400 font-medium">{{ message }}</p>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" onclick="this.parentElement.remove()" class="ml-auto text-slate-500 hover:text-slate-300">
|
<button type="button" onclick="this.parentElement.remove()" class="ml-auto text-slate-300 hover:text-slate-300">
|
||||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path d="M6 18L18 6M6 6l12 12" /></svg>
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path d="M6 18L18 6M6 6l12 12" /></svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -179,18 +179,18 @@
|
|||||||
<div class="bg-slate-800/40 backdrop-blur-xl border border-slate-700/50 rounded-[2rem] p-6 shadow-xl">
|
<div class="bg-slate-800/40 backdrop-blur-xl border border-slate-700/50 rounded-[2rem] p-6 shadow-xl">
|
||||||
<div class="flex flex-col md:flex-row items-center justify-between gap-4 text-center md:text-left">
|
<div class="flex flex-col md:flex-row items-center justify-between gap-4 text-center md:text-left">
|
||||||
<div class="space-y-1">
|
<div class="space-y-1">
|
||||||
<p class="text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Propulsé par</p>
|
<p class="text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Propulsé par</p>
|
||||||
<p class="text-sm font-bold text-white">
|
<p class="text-sm font-bold text-white">
|
||||||
Développé par <span class="text-blue-600">SARL SITECONSEIL</span>
|
Développé par <span class="text-blue-600">SARL SITECONSEIL</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col items-center md:items-end space-y-1">
|
<div class="flex flex-col items-center md:items-end space-y-1">
|
||||||
<div class="flex items-center space-x-4">
|
<div class="flex items-center space-x-4">
|
||||||
<a href="https://www.siteconseil.fr" target="_blank" class="text-xs font-medium text-slate-500 hover:text-blue-600 transition-colors underline decoration-blue-500/30 underline-offset-4">www.siteconseil.fr</a>
|
<a href="https://www.siteconseil.fr" target="_blank" class="text-xs font-mediumtext-slate-300 hover:text-blue-600 transition-colors underline decoration-blue-500/30 underline-offset-4">www.siteconseil.fr</a>
|
||||||
<span class="w-1 h-1 bg-slate-700 rounded-full"></span>
|
<span class="w-1 h-1 bg-slate-700 rounded-full"></span>
|
||||||
<a href="mailto:s.com@siteconseil.fr" class="text-xs font-medium text-slate-500 hover:text-blue-600 transition-colors">s.com@siteconseil.fr</a>
|
<a href="mailto:s.com@siteconseil.fr" class="text-xs font-mediumtext-slate-300 hover:text-blue-600 transition-colors">s.com@siteconseil.fr</a>
|
||||||
</div>
|
</div>
|
||||||
<p class="text-[9px] font-black text-slate-500 uppercase tracking-widest">
|
<p class="text-[9px] font-black text-slate-300 uppercase tracking-widest">
|
||||||
Crm Engine <span class="text-slate-300">1.0.0</span>
|
Crm Engine <span class="text-slate-300">1.0.0</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -28,12 +28,12 @@
|
|||||||
|
|
||||||
<div class="space-y-6">
|
<div class="space-y-6">
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.customer, 'Client', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.customer, 'Client', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.customer, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.customer, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.type, 'Type de contrat', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.type, 'Type de contrat', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.type, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.type, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -68,27 +68,27 @@
|
|||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-x-6 gap-y-5">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-x-6 gap-y-5">
|
||||||
<div class="md:col-span-2">
|
<div class="md:col-span-2">
|
||||||
{{ form_label(form.addressEvent, 'Adresse principale', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.addressEvent, 'Adresse principale', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.addressEvent, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.addressEvent, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.address2Event, 'Complément d\'adresse 1', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.address2Event, 'Complément d\'adresse 1', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.address2Event, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5', 'placeholder': 'Bâtiment, étage...'}}) }}
|
{{ form_widget(form.address2Event, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5', 'placeholder': 'Bâtiment, étage...'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.address3Event, 'Complément d\'adresse 2', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.address3Event, 'Complément d\'adresse 2', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.address3Event, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5', 'placeholder': 'Code, interphone...'}}) }}
|
{{ form_widget(form.address3Event, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5', 'placeholder': 'Code, interphone...'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.zipCodeEvent, 'Code Postal', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.zipCodeEvent, 'Code Postal', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.zipCodeEvent, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.zipCodeEvent, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.townEvent, 'Ville', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.townEvent, 'Ville', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.townEvent, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.townEvent, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="md:col-span-2">
|
<div class="md:col-span-2">
|
||||||
{{ form_label(form.details, 'Précisions de livraison / Notes d\'accès', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.details, 'Précisions de livraison / Notes d\'accès', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.details, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5', 'rows': '2', 'placeholder': 'Ex: Portail étroit, se garer dans la cour...'}}) }}
|
{{ form_widget(form.details, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5', 'rows': '2', 'placeholder': 'Ex: Portail étroit, se garer dans la cour...'}}) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -102,19 +102,19 @@
|
|||||||
</h3>
|
</h3>
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.typeSol, 'Nature du sol', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.typeSol, 'Nature du sol', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.typeSol, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.typeSol, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.pente, 'Pente / Dénivelé', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.pente, 'Pente / Dénivelé', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.pente, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.pente, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.access, 'Accès Camion', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.access, 'Accès Camion', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.access, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.access, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.distancePower, 'Distance Point électrique', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.distancePower, 'Distance Point électrique', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.distancePower, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.distancePower, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -130,11 +130,11 @@
|
|||||||
</h3>
|
</h3>
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-4xl mx-auto">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-4xl mx-auto">
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.dateAt, 'Début de l\'événement', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block text-center'}}) }}
|
{{ form_label(form.dateAt, 'Début de l\'événement', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block text-center'}}) }}
|
||||||
{{ form_widget(form.dateAt, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white text-center focus:ring-blue-500/40 focus:border-blue-500 transition-all py-4 px-5 font-black'}}) }}
|
{{ form_widget(form.dateAt, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white text-center focus:ring-blue-500/40 focus:border-blue-500 transition-all py-4 px-5 font-black'}}) }}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.endAt, 'Fin de l\'événement', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block text-center'}}) }}
|
{{ form_label(form.endAt, 'Fin de l\'événement', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block text-center'}}) }}
|
||||||
{{ form_widget(form.endAt, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white text-center focus:ring-blue-500/40 focus:border-blue-500 transition-all py-4 px-5 font-black'}}) }}
|
{{ form_widget(form.endAt, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white text-center focus:ring-blue-500/40 focus:border-blue-500 transition-all py-4 px-5 font-black'}}) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -158,7 +158,7 @@
|
|||||||
|
|
||||||
{# 1. PRODUIT AVEC BOUTON RECHERCHE #}
|
{# 1. PRODUIT AVEC BOUTON RECHERCHE #}
|
||||||
<div class="lg:col-span-4">
|
<div class="lg:col-span-4">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
||||||
<div class="relative flex items-center">
|
<div class="relative flex items-center">
|
||||||
<input type="text" name="lines[{{ key }}][name]" value="{{ line.name }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
<input type="text" name="lines[{{ key }}][name]" value="{{ line.name }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
||||||
|
|
||||||
@@ -171,19 +171,19 @@
|
|||||||
|
|
||||||
{# 2. PRIX 1J #}
|
{# 2. PRIX 1J #}
|
||||||
<div class="lg:col-span-2">
|
<div class="lg:col-span-2">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Prix 1J HT</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Prix 1J HT</label>
|
||||||
<input type="text" name="lines[{{ key }}][priceHt1Day]" value="{{ line.priceHt1Day }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
<input type="text" name="lines[{{ key }}][priceHt1Day]" value="{{ line.priceHt1Day }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# 3. PRIX SUP #}
|
{# 3. PRIX SUP #}
|
||||||
<div class="lg:col-span-2">
|
<div class="lg:col-span-2">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Prix J Sup. HT</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Prix J Sup. HT</label>
|
||||||
<input type="text" name="lines[{{ key }}][priceHtSupDay]" value="{{ line.priceHtSupDay }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
<input type="text" name="lines[{{ key }}][priceHtSupDay]" value="{{ line.priceHtSupDay }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# 4. CAUTION #}
|
{# 4. CAUTION #}
|
||||||
<div class="lg:col-span-3">
|
<div class="lg:col-span-3">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Caution (€)</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Caution (€)</label>
|
||||||
<input type="text" name="lines[{{ key }}][caution]" value="{{ line.caution }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
<input type="text" name="lines[{{ key }}][caution]" value="{{ line.caution }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@
|
|||||||
|
|
||||||
{# 1. PRODUIT AVEC BOUTON RECHERCHE #}
|
{# 1. PRODUIT AVEC BOUTON RECHERCHE #}
|
||||||
<div class="lg:col-span-6">
|
<div class="lg:col-span-6">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
||||||
<div class="relative flex items-center">
|
<div class="relative flex items-center">
|
||||||
<input type="text" name="options[{{ key }}][name]" value="{{ line.name }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
<input type="text" name="options[{{ key }}][name]" value="{{ line.name }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
||||||
|
|
||||||
@@ -236,12 +236,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="lg:col-span-2">
|
<div class="lg:col-span-2">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Détails</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Détails</label>
|
||||||
<input type="text" name="options[{{ key }}][details]" value="{{ line.details }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
<input type="text" name="options[{{ key }}][details]" value="{{ line.details }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
||||||
</div>
|
</div>
|
||||||
{# 2. PRIX 1J #}
|
{# 2. PRIX 1J #}
|
||||||
<div class="lg:col-span-3">
|
<div class="lg:col-span-3">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Prix 1J HT</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Prix 1J HT</label>
|
||||||
<input type="text" name="options[{{ key }}][priceHt]" value="{{ line.priceHt }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
<input type="text" name="options[{{ key }}][priceHt]" value="{{ line.priceHt }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 px-5 text-sm font-mono">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -57,9 +57,9 @@
|
|||||||
<input type="hidden" name="active" value="{{ active }}">
|
<input type="hidden" name="active" value="{{ active }}">
|
||||||
|
|
||||||
<div class="flex-1 w-full space-y-2">
|
<div class="flex-1 w-full space-y-2">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-2">Recherche globale</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-2">Recherche globale</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<svg class="absolute left-4 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="absolute left-4 top-1/2 -translate-y-1/2 w-4 h-4text-slate-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
|
||||||
</svg>
|
</svg>
|
||||||
<input type="text" name="q" value="{{ searchTerm }}"
|
<input type="text" name="q" value="{{ searchTerm }}"
|
||||||
@@ -69,13 +69,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="w-full md:w-44 space-y-2">
|
<div class="w-full md:w-44 space-y-2">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-2">Date début</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-2">Date début</label>
|
||||||
<input type="date" name="startDate" value="{{ startDate }}"
|
<input type="date" name="startDate" value="{{ startDate }}"
|
||||||
class="w-full bg-slate-900/50 border border-white/5 rounded-xl py-3 px-4 text-xs text-white focus:border-blue-500/50 focus:ring-0 transition-all">
|
class="w-full bg-slate-900/50 border border-white/5 rounded-xl py-3 px-4 text-xs text-white focus:border-blue-500/50 focus:ring-0 transition-all">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="w-full md:w-44 space-y-2">
|
<div class="w-full md:w-44 space-y-2">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-2">Date fin</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-2">Date fin</label>
|
||||||
<input type="date" name="endDate" value="{{ endDate }}"
|
<input type="date" name="endDate" value="{{ endDate }}"
|
||||||
class="w-full bg-slate-900/50 border border-white/5 rounded-xl py-3 px-4 text-xs text-white focus:border-blue-500/50 focus:ring-0 transition-all">
|
class="w-full bg-slate-900/50 border border-white/5 rounded-xl py-3 px-4 text-xs text-white focus:border-blue-500/50 focus:ring-0 transition-all">
|
||||||
</div>
|
</div>
|
||||||
@@ -109,10 +109,10 @@
|
|||||||
<table class="w-full text-left">
|
<table class="w-full text-left">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5">
|
<tr class="border-b border-white/5">
|
||||||
<th class="pb-6 text-[10px] font-black text-slate-500 uppercase tracking-widest">Date</th>
|
<th class="pb-6 text-[10px] font-black text-slate-300 uppercase tracking-widest">Date</th>
|
||||||
<th class="pb-6 text-[10px] font-black text-slate-500 uppercase tracking-widest">Client</th>
|
<th class="pb-6 text-[10px] font-black text-slate-300 uppercase tracking-widest">Client</th>
|
||||||
<th class="pb-6 text-[10px] font-black text-slate-500 uppercase tracking-widest text-right">Montant TTC</th>
|
<th class="pb-6 text-[10px] font-black text-slate-300 uppercase tracking-widest text-right">Montant TTC</th>
|
||||||
<th class="pb-6 text-[10px] font-black text-slate-500 uppercase tracking-widest text-center">Statut</th>
|
<th class="pb-6 text-[10px] font-black text-slate-300 uppercase tracking-widest text-center">Statut</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5 text-slate-400 italic text-xs">
|
<tbody class="divide-y divide-white/5 text-slate-400 italic text-xs">
|
||||||
@@ -146,7 +146,7 @@
|
|||||||
<td class="py-5 pl-6 rounded-l-2xl border-y border-l border-white/5">
|
<td class="py-5 pl-6 rounded-l-2xl border-y border-l border-white/5">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<span class="text-xs font-bold text-white">{{ confirmedPaiement.paymentAt|date('d/m/Y') }}</span>
|
<span class="text-xs font-bold text-white">{{ confirmedPaiement.paymentAt|date('d/m/Y') }}</span>
|
||||||
<span class="text-[9px] text-slate-500 font-medium">Encaissé</span>
|
<span class="text-[9px] text-slate-300 font-medium">Encaissé</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
<span class="text-xs font-bold text-slate-200 uppercase tracking-tight">
|
<span class="text-xs font-bold text-slate-200 uppercase tracking-tight">
|
||||||
{{ confirmedPaiement.contrat.customer.name }} {{ confirmedPaiement.contrat.customer.surname }}
|
{{ confirmedPaiement.contrat.customer.name }} {{ confirmedPaiement.contrat.customer.surname }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-[10px] text-slate-500 lowercase">{{ confirmedPaiement.contrat.customer.email }}</span>
|
<span class="text-[10px text-slate-300 lowercase">{{ confirmedPaiement.contrat.customer.email }}</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
{# 3. LIEU #}
|
{# 3. LIEU #}
|
||||||
<div class="lg:col-span-2 p-8 border-b lg:border-b-0 lg:border-r border-white/5">
|
<div class="lg:col-span-2 p-8 border-b lg:border-b-0 lg:border-r border-white/5">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<span class="text-[10px] font-bold text-slate-500 uppercase tracking-widest mb-1">Destination</span>
|
<span class="text-[10px] font-bold text-slate-300 uppercase tracking-widest mb-1">Destination</span>
|
||||||
<p class="text-slate-200 font-bold text-sm">{{ contrat.townEvent }}</p>
|
<p class="text-slate-200 font-bold text-sm">{{ contrat.townEvent }}</p>
|
||||||
<p class="text-blue-500 font-black text-[11px]">{{ contrat.zipCodeEvent }}</p>
|
<p class="text-blue-500 font-black text-[11px]">{{ contrat.zipCodeEvent }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
{# --- 1. BANDEAU DE STATUT RAPIDE --- #}
|
{# --- 1. BANDEAU DE STATUT RAPIDE --- #}
|
||||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||||
<div class="p-4 rounded-[1.5rem] bg-white/5 border border-white/10 backdrop-blur-md flex items-center justify-between">
|
<div class="p-4 rounded-[1.5rem] bg-white/5 border border-white/10 backdrop-blur-md flex items-center justify-between">
|
||||||
<span class="text-[10px] font-black uppercase text-slate-500 tracking-widest">État Juridique</span>
|
<span class="text-[10px] font-black uppercase text-slate-300 tracking-widest">État Juridique</span>
|
||||||
{% if contrat.signed %}
|
{% if contrat.signed %}
|
||||||
<span class="px-3 py-1 bg-emerald-500/10 text-emerald-400 text-[9px] font-black rounded-lg border border-emerald-500/20">SIGNÉ</span>
|
<span class="px-3 py-1 bg-emerald-500/10 text-emerald-400 text-[9px] font-black rounded-lg border border-emerald-500/20">SIGNÉ</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -51,13 +51,13 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="p-4 rounded-[1.5rem] bg-white/5 border border-white/10 backdrop-blur-md flex items-center justify-between">
|
<div class="p-4 rounded-[1.5rem] bg-white/5 border border-white/10 backdrop-blur-md flex items-center justify-between">
|
||||||
<span class="text-[10px] font-black uppercase text-slate-500 tracking-widest">Reste à percevoir</span>
|
<span class="text-[10px] font-black uppercasetext-slate-300 tracking-widest">Reste à percevoir</span>
|
||||||
<span class="text-xs font-black {{ soldeOk ? 'text-emerald-400' : 'text-rose-500' }} italic">
|
<span class="text-xs font-black {{ soldeOk ? 'text-emerald-400' : 'text-rose-500' }} italic">
|
||||||
{{ soldeOk ? 'CONTRAT SOLDÉ' : (solde|number_format(2, ',', ' ') ~ ' €') }}
|
{{ soldeOk ? 'CONTRAT SOLDÉ' : (solde|number_format(2, ',', ' ') ~ ' €') }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="p-4 rounded-[1.5rem] bg-white/5 border border-white/10 backdrop-blur-md flex items-center justify-between">
|
<div class="p-4 rounded-[1.5rem] bg-white/5 border border-white/10 backdrop-blur-md flex items-center justify-between">
|
||||||
<span class="text-[10px] font-black uppercase text-slate-500 tracking-widest">Référence</span>
|
<span class="text-[10px] font-black uppercasetext-slate-300 tracking-widest">Référence</span>
|
||||||
<span class="text-xs font-black text-blue-400 italic">#{{ contrat.numReservation }}</span>
|
<span class="text-xs font-black text-blue-400 italic">#{{ contrat.numReservation }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="p-5 rounded-2xl bg-white/[0.02] border border-white/5">
|
<div class="p-5 rounded-2xl bg-white/[0.02] border border-white/5">
|
||||||
<span class="text-[9px] font-black text-slate-500 uppercase tracking-widest block mb-1">Adresse de livraison</span>
|
<span class="text-[9px] font-black text-slate-300 uppercase tracking-widest block mb-1">Adresse de livraison</span>
|
||||||
<p class="text-white text-base font-bold">{{ contrat.addressEvent }}</p>
|
<p class="text-white text-base font-bold">{{ contrat.addressEvent }}</p>
|
||||||
<p class="text-emerald-400 font-black text-sm uppercase italic">{{ contrat.zipCodeEvent }} {{ contrat.townEvent }}</p>
|
<p class="text-emerald-400 font-black text-sm uppercase italic">{{ contrat.zipCodeEvent }} {{ contrat.townEvent }}</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -231,11 +231,11 @@
|
|||||||
<div class="flex justify-between items-start">
|
<div class="flex justify-between items-start">
|
||||||
<div>
|
<div>
|
||||||
<h4 class="text-white font-bold text-base uppercase italic">{{ product.name }}</h4>
|
<h4 class="text-white font-bold text-base uppercase italic">{{ product.name }}</h4>
|
||||||
<p class="text-[10px] text-slate-500 font-bold uppercase mt-1">Caution : {{ product.caution }}€</p>
|
<p class="text-[10px text-slate-300 font-bold uppercase mt-1">Caution : {{ product.caution }}€</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<span class="text-blue-400 font-black italic">{{ product.price1DayHt }}€</span>
|
<span class="text-blue-400 font-black italic">{{ product.price1DayHt }}€</span>
|
||||||
<span class="block text-[8px] text-slate-500 uppercase font-black">HT / Jour</span>
|
<span class="block text-[8px text-slate-300 uppercase font-black">HT / Jour</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -273,10 +273,10 @@
|
|||||||
<table class="w-full text-left">
|
<table class="w-full text-left">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5 bg-white/[0.03]">
|
<tr class="border-b border-white/5 bg-white/[0.03]">
|
||||||
<th class="px-8 py-4 text-[9px] font-black text-slate-500 uppercase tracking-widest">Transaction</th>
|
<th class="px-8 py-4 text-[9px] font-black text-slate-300 uppercase tracking-widest">Transaction</th>
|
||||||
<th class="px-8 py-4 text-[9px] font-black text-slate-500 uppercase tracking-widest">Type</th>
|
<th class="px-8 py-4 text-[9px] font-black text-slate-300 uppercase tracking-widest">Type</th>
|
||||||
<th class="px-8 py-4 text-[9px] font-black text-slate-500 uppercase tracking-widest">Montant</th>
|
<th class="px-8 py-4 text-[9px] font-black text-slate-300 uppercase tracking-widest">Montant</th>
|
||||||
<th class="px-8 py-4 text-[9px] font-black text-slate-500 uppercase tracking-widest text-right">Justificatif</th>
|
<th class="px-8 py-4 text-[9px] font-black text-slate-300 uppercase tracking-widest text-right">Justificatif</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<div class="px-8 py-6 border-b border-white/5 bg-white/5 flex items-center justify-between">
|
<div class="px-8 py-6 border-b border-white/5 bg-white/5 flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 class="text-xl font-bold text-white tracking-tight">Liste des clients</h2>
|
<h2 class="text-xl font-bold text-white tracking-tight">Liste des clients</h2>
|
||||||
<p class="text-[10px] text-slate-500 font-bold uppercase tracking-widest mt-1">Base de données centralisée</p>
|
<p class="text-[10px text-slate-300 font-bold uppercase tracking-widest mt-1">Base de données centralisée</p>
|
||||||
</div>
|
</div>
|
||||||
<span class="px-4 py-1.5 bg-blue-500/10 text-blue-400 text-[10px] font-black uppercase rounded-lg border border-blue-500/20">
|
<span class="px-4 py-1.5 bg-blue-500/10 text-blue-400 text-[10px] font-black uppercase rounded-lg border border-blue-500/20">
|
||||||
{{ customers.getTotalItemCount }} CONTACTS
|
{{ customers.getTotalItemCount }} CONTACTS
|
||||||
@@ -32,11 +32,11 @@
|
|||||||
<table class="w-full text-left border-collapse">
|
<table class="w-full text-left border-collapse">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="bg-slate-900/40 border-b border-white/5">
|
<tr class="bg-slate-900/40 border-b border-white/5">
|
||||||
<th class="px-8 py-5 text-[10px] font-black text-slate-500 uppercase tracking-widest">Identité</th>
|
<th class="px-8 py-5 text-[10px] font-black text-slate-300 uppercase tracking-widest">Identité</th>
|
||||||
<th class="px-8 py-5 text-[10px] font-black text-slate-500 uppercase tracking-widest text-center">Type</th>
|
<th class="px-8 py-5 text-[10px] font-black text-slate-300 uppercase tracking-widest text-center">Type</th>
|
||||||
<th class="px-8 py-5 text-[10px] font-black text-slate-500 uppercase tracking-widest">Coordonnées</th>
|
<th class="px-8 py-5 text-[10px] font-black text-slate-300 uppercase tracking-widest">Coordonnées</th>
|
||||||
<th class="px-8 py-5 text-[10px] font-black text-slate-500 uppercase tracking-widest">SIRET / ID</th>
|
<th class="px-8 py-5 text-[10px] font-black text-slate-300 uppercase tracking-widest">SIRET / ID</th>
|
||||||
<th class="px-8 py-5 text-[10px] font-black text-slate-500 uppercase tracking-widest text-right">Actions</th>
|
<th class="px-8 py-5 text-[10px] font-black text-slate-300 uppercase tracking-widest text-right">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center mt-1 space-x-2">
|
<div class="flex items-center mt-1 space-x-2">
|
||||||
<span class="text-[9px] font-bold text-slate-500 tracking-tighter">ID: #{{ customer.id }}</span>
|
<span class="text-[9px] font-bold text-slate-300 tracking-tighter">ID: #{{ customer.id }}</span>
|
||||||
|
|
||||||
{% if customer.customerId %}
|
{% if customer.customerId %}
|
||||||
<div class="flex items-center text-[8px] font-black text-emerald-400 uppercase tracking-[0.1em] bg-emerald-500/10 px-2 py-0.5 rounded-md border border-emerald-500/30">
|
<div class="flex items-center text-[8px] font-black text-emerald-400 uppercase tracking-[0.1em] bg-emerald-500/10 px-2 py-0.5 rounded-md border border-emerald-500/30">
|
||||||
@@ -98,11 +98,11 @@
|
|||||||
<td class="px-8 py-6">
|
<td class="px-8 py-6">
|
||||||
<div class="flex flex-col space-y-1 text-xs">
|
<div class="flex flex-col space-y-1 text-xs">
|
||||||
<div class="flex items-center text-slate-300">
|
<div class="flex items-center text-slate-300">
|
||||||
<svg class="w-3.5 h-3.5 mr-2 text-slate-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /></svg>
|
<svg class="w-3.5 h-3.5 mr-2 text-slate-300" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /></svg>
|
||||||
{{ customer.email }}
|
{{ customer.email }}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center text-slate-400 font-mono text-[11px]">
|
<div class="flex items-center text-slate-400 font-mono text-[11px]">
|
||||||
<svg class="w-3.5 h-3.5 mr-2 text-slate-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" /></svg>
|
<svg class="w-3.5 h-3.5 mr-2 text-slate-300" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" /></svg>
|
||||||
{{ customer.phone }}
|
{{ customer.phone }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="5" class="px-8 py-20 text-center italic text-slate-500 font-medium">
|
<td colspan="5" class="px-8 py-20 text-center italic text-slate-300 font-medium">
|
||||||
Aucun client enregistré dans la base.
|
Aucun client enregistré dans la base.
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
{# PAGINATION #}
|
{# PAGINATION #}
|
||||||
<div class="px-8 py-8 bg-black/20 border-t border-white/5">
|
<div class="px-8 py-8 bg-black/20 border-t border-white/5">
|
||||||
<div class="flex flex-col md:flex-row items-center justify-between gap-6">
|
<div class="flex flex-col md:flex-row items-center justify-between gap-6">
|
||||||
<div class="text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">
|
<div class="text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">
|
||||||
Page {{ customers.currentPageNumber }} sur {{ (customers.totalItemCount / customers.getItemNumberPerPage)|round(0, 'ceil') }}
|
Page {{ customers.currentPageNumber }} sur {{ (customers.totalItemCount / customers.getItemNumberPerPage)|round(0, 'ceil') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="navigation custom-pagination">
|
<div class="navigation custom-pagination">
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
{# Navigation haute #}
|
{# Navigation haute #}
|
||||||
<div class="mb-6 px-2">
|
<div class="mb-6 px-2">
|
||||||
<a data-turbo="false" href="{{ path('app_crm_customer') }}" class="inline-flex items-center text-[10px] font-black text-slate-500 hover:text-white uppercase tracking-[0.2em] transition-colors group">
|
<a data-turbo="false" href="{{ path('app_crm_customer') }}" class="inline-flex items-center text-[10px] font-black text-slate-300 hover:text-white uppercase tracking-[0.2em] transition-colors group">
|
||||||
<svg class="w-4 h-4 mr-2 group-hover:-translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="w-4 h-4 mr-2 group-hover:-translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M10 19l-7-7m0 0l7-7m-7 7h18" />
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M10 19l-7-7m0 0l7-7m-7 7h18" />
|
||||||
</svg>
|
</svg>
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
<div class="px-10 py-8 border-b border-white/5 bg-white/5 flex items-center justify-between">
|
<div class="px-10 py-8 border-b border-white/5 bg-white/5 flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h2 class="text-xl font-bold text-white tracking-tight">Fiche d'identification</h2>
|
<h2 class="text-xl font-bold text-white tracking-tight">Fiche d'identification</h2>
|
||||||
<p class="text-[10px] text-slate-500 font-bold uppercase tracking-widest mt-1">Saisie des informations de compte</p>
|
<p class="text-[10px] text-slate-300 font-bold uppercase tracking-widest mt-1">Saisie des informations de compte</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
{# ACTIONS : Boutons espacés #}
|
{# ACTIONS : Boutons espacés #}
|
||||||
<div class="pt-10 border-t border-white/5 flex items-center justify-end">
|
<div class="pt-10 border-t border-white/5 flex items-center justify-end">
|
||||||
<div class="flex items-center space-x-16"> {# Espace large entre les deux boutons #}
|
<div class="flex items-center space-x-16"> {# Espace large entre les deux boutons #}
|
||||||
<a data-turbo="false" href="{{ path('app_crm_customer') }}" class="mr-2 text-[10px] font-black text-slate-500 hover:text-rose-500 uppercase tracking-widest transition-colors">
|
<a data-turbo="false" href="{{ path('app_crm_customer') }}" class="mr-2 text-[10px] font-black text-slate-300 hover:text-rose-500 uppercase tracking-widest transition-colors">
|
||||||
Annuler l'opération
|
Annuler l'opération
|
||||||
</a>
|
</a>
|
||||||
<button type="submit" class="p-2 px-16 py-4 bg-blue-600 hover:bg-blue-500 text-white text-[10px] font-black uppercase tracking-[0.2em] rounded-2xl shadow-lg shadow-blue-600/20 transition-all hover:scale-105 active:scale-95">
|
<button type="submit" class="p-2 px-16 py-4 bg-blue-600 hover:bg-blue-500 text-white text-[10px] font-black uppercase tracking-[0.2em] rounded-2xl shadow-lg shadow-blue-600/20 transition-all hover:scale-105 active:scale-95">
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* Styles communs aux champs */
|
/* Styles communs aux champs */
|
||||||
label { @apply block text-[10px] font-black text-slate-500 uppercase tracking-widest mb-3 ml-2; }
|
label { @apply block text-[10px] font-black text-slate-300 uppercase tracking-widest mb-3 ml-2; }
|
||||||
|
|
||||||
input, select {
|
input, select {
|
||||||
@apply w-full bg-slate-900/40 border border-white/10 rounded-2xl px-6 py-4 text-sm text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/5 outline-none transition-all duration-300 !important;
|
@apply w-full bg-slate-900/40 border border-white/10 rounded-2xl px-6 py-4 text-sm text-white focus:border-blue-500 focus:ring-4 focus:ring-blue-500/5 outline-none transition-all duration-300 !important;
|
||||||
|
|||||||
@@ -80,9 +80,9 @@
|
|||||||
<table class="w-full text-left">
|
<table class="w-full text-left">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5">
|
<tr class="border-b border-white/5">
|
||||||
<th class="pb-4 text-[10px] font-black text-slate-500 uppercase tracking-widest">Numéro</th>
|
<th class="pb-4 text-[10px] font-black text-slate-300 uppercase tracking-widest">Numéro</th>
|
||||||
<th class="pb-4 text-[10px] font-black text-slate-500 uppercase tracking-widest text-center">Statut</th>
|
<th class="pb-4 text-[10px] font-black text-slate-300 uppercase tracking-widest text-center">Statut</th>
|
||||||
<th class="pb-4 text-[10px] font-black text-slate-500 uppercase tracking-widest text-right">Montant HT</th>
|
<th class="pb-4 text-[10px] font-black text-slate-300 uppercase tracking-widest text-right">Montant HT</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -120,10 +120,10 @@
|
|||||||
<table class="w-full text-left">
|
<table class="w-full text-left">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5">
|
<tr class="border-b border-white/5">
|
||||||
<th class="pb-4 text-[10px] font-black text-slate-500 uppercase tracking-widest">Réservation</th>
|
<th class="pb-4 text-[10px] font-black text-slate-300 uppercase tracking-widest">Réservation</th>
|
||||||
<th class="pb-4 text-[10px] font-black text-slate-500 uppercase tracking-widest text-right">Total</th>
|
<th class="pb-4 text-[10px] font-black text-slate-300 uppercase tracking-widest text-right">Total</th>
|
||||||
<th class="pb-4 text-[10px] font-black text-slate-500 uppercase tracking-widest text-right">Réglé</th>
|
<th class="pb-4 text-[10px] font-black text-slate-300 uppercase tracking-widest text-right">Réglé</th>
|
||||||
<th class="pb-4 text-[10px] font-black text-slate-500 uppercase tracking-widest text-right">Solde</th>
|
<th class="pb-4 text-[10px] font-black text-slate-300 uppercase tracking-widest text-right">Solde</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -183,10 +183,10 @@
|
|||||||
<span class="text-xs font-bold text-emerald-500">€</span>
|
<span class="text-xs font-bold text-emerald-500">€</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-3 grid grid-cols-2 gap-2">
|
<div class="mt-3 grid grid-cols-2 gap-2">
|
||||||
<div class="text-[8px] text-slate-500 font-bold uppercase">
|
<div class="text-[8px text-slate-300 font-bold uppercase">
|
||||||
{{ customer.devis|length }} Devis
|
{{ customer.devis|length }} Devis
|
||||||
</div>
|
</div>
|
||||||
<div class="text-[8px] text-slate-500 font-bold uppercase text-right">
|
<div class="text-[8px text-slate-300 font-bold uppercase text-right">
|
||||||
{{ customer.contrats|length }} Contrats
|
{{ customer.contrats|length }} Contrats
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
{# ZONE SENSIBLE #}
|
{# ZONE SENSIBLE #}
|
||||||
<div class="backdrop-blur-xl bg-rose-500/5 border border-rose-500/10 rounded-[2.5rem] p-8">
|
<div class="backdrop-blur-xl bg-rose-500/5 border border-rose-500/10 rounded-[2.5rem] p-8">
|
||||||
<h4 class="text-[10px] font-black text-rose-500 uppercase tracking-widest mb-4">Zone sensible</h4>
|
<h4 class="text-[10px] font-black text-rose-500 uppercase tracking-widest mb-4">Zone sensible</h4>
|
||||||
<p class="text-[9px] text-slate-500 mb-6 leading-relaxed uppercase font-bold tracking-tight">
|
<p class="text-[9px] text-slate-300 mb-6 leading-relaxed uppercase font-bold tracking-tight">
|
||||||
La suppression est définitive sur l'intranet et Stripe.
|
La suppression est définitive sur l'intranet et Stripe.
|
||||||
</p>
|
</p>
|
||||||
<a data-turbo="false" href="{{ path('app_crm_customer_delete', {id: customer.id}) }}?_token={{ csrf_token('delete' ~ customer.id) }}"
|
<a data-turbo="false" href="{{ path('app_crm_customer_delete', {id: customer.id}) }}?_token={{ csrf_token('delete' ~ customer.id) }}"
|
||||||
@@ -279,7 +279,7 @@
|
|||||||
{{ editingAddress ? 'Enregistrer les modifications' : 'Ajouter au carnet' }}
|
{{ editingAddress ? 'Enregistrer les modifications' : 'Ajouter au carnet' }}
|
||||||
</button>
|
</button>
|
||||||
{% if editingAddress %}
|
{% if editingAddress %}
|
||||||
<a data-turbo="false" href="{{ path('app_crm_customer_edit', {id: customer.id}) }}" class="text-center py-2 text-[9px] font-black text-slate-500 uppercase tracking-widest hover:text-white transition-colors">
|
<a data-turbo="false" href="{{ path('app_crm_customer_edit', {id: customer.id}) }}" class="text-center py-2 text-[9px] font-black text-slate-300 uppercase tracking-widest hover:text-white transition-colors">
|
||||||
Annuler la modification
|
Annuler la modification
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -292,7 +292,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
label { @apply block text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] mb-2 ml-2; }
|
label { @apply block text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] mb-2 ml-2; }
|
||||||
input, select, textarea {
|
input, select, textarea {
|
||||||
@apply w-full bg-slate-900/60 border border-white/5 rounded-2xl px-5 py-3.5 text-xs text-white outline-none focus:border-blue-500/30 focus:bg-slate-900/80 transition-all duration-300 !important;
|
@apply w-full bg-slate-900/60 border border-white/5 rounded-2xl px-5 py-3.5 text-xs text-white outline-none focus:border-blue-500/30 focus:bg-slate-900/80 transition-all duration-300 !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h3 class="text-2xl font-black text-white tracking-tight">Création d'un devis</h3>
|
<h3 class="text-2xl font-black text-white tracking-tight">Création d'un devis</h3>
|
||||||
<p class="text-[9px] text-slate-500 uppercase tracking-[0.3em] font-bold mt-1">Configuration des informations d'entête</p>
|
<p class="text-[9px] text-slate-300 uppercase tracking-[0.3em] font-bold mt-1">Configuration des informations d'entête</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
<div class="relative space-y-10">
|
<div class="relative space-y-10">
|
||||||
{# SECTION ENTÊTE #}
|
{# SECTION ENTÊTE #}
|
||||||
{% set input_class = "w-full bg-slate-900/60 border border-white/10 rounded-2xl px-5 py-4 text-sm text-white outline-none focus:border-blue-500/50 focus:bg-slate-900/90 transition-all duration-300" %}
|
{% set input_class = "w-full bg-slate-900/60 border border-white/10 rounded-2xl px-5 py-4 text-sm text-white outline-none focus:border-blue-500/50 focus:bg-slate-900/90 transition-all duration-300" %}
|
||||||
{% set label_class = "block text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] mb-3 ml-2" %}
|
{% set label_class = "block text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] mb-3 ml-2" %}
|
||||||
|
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 items-start">
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 items-start">
|
||||||
<div class="space-y-3">
|
<div class="space-y-3">
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-5 items-end">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-5 items-end">
|
||||||
{# 1. PRODUIT #}
|
{# 1. PRODUIT #}
|
||||||
<div class="lg:col-span-5">
|
<div class="lg:col-span-5">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
||||||
<div class="relative flex items-center">
|
<div class="relative flex items-center">
|
||||||
<input type="text" name="lines[{{ key }}][product]" value="{{ line.product }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
<input type="text" name="lines[{{ key }}][product]" value="{{ line.product }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{# 1. PRODUIT #}
|
{# 1. PRODUIT #}
|
||||||
<div class="lg:col-span-7">
|
<div class="lg:col-span-7">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Produit / Prestation</label>
|
||||||
<div class="relative flex items-center">
|
<div class="relative flex items-center">
|
||||||
<input type="text" name="options[{{ key }}][product]" value="{{ option.product }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
<input type="text" name="options[{{ key }}][product]" value="{{ option.product }}" required class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
||||||
|
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="lg:col-span-2">
|
<div class="lg:col-span-2">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">Détails</label>
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">Détails</label>
|
||||||
<div class="relative flex items-center">
|
<div class="relative flex items-center">
|
||||||
<input type="text" name="options[{{ key }}][details]" value="{{ option.details }}" class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
<input type="text" name="options[{{ key }}][details]" value="{{ option.details }}" class="w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-3 pl-5 pr-12 text-sm">
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,12 +20,12 @@
|
|||||||
<table class="w-full text-left border-collapse">
|
<table class="w-full text-left border-collapse">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5 bg-black/20">
|
<tr class="border-b border-white/5 bg-black/20">
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Référence</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Référence</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Client</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Client</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Date</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Date</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Statut</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Statut</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-center">Total HT</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-center">Total HT</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-right">Actions</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-right">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
<span class="text-sm font-bold text-white group-hover:text-blue-400 transition-colors capitalize">
|
<span class="text-sm font-bold text-white group-hover:text-blue-400 transition-colors capitalize">
|
||||||
{{ quote.customer.surname|upper }} {{ quote.customer.name }}
|
{{ quote.customer.surname|upper }} {{ quote.customer.name }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-[9px] text-slate-500 font-bold uppercase tracking-tighter italic">
|
<span class="text-[9px] text-slate-300 font-bold uppercase tracking-tighter italic">
|
||||||
{{ quote.customer.phone|default(quote.customer.email) }}
|
{{ quote.customer.phone|default(quote.customer.email) }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{# PDF Brouillon #}
|
{# PDF Brouillon #}
|
||||||
<a download="{{ quote.num }}.pdf" href="{{ vich_uploader_asset(quote,'devisDocuSealFile') }}" target="_blank" class="p-2 bg-slate-600/10 hover:bg-slate-600 text-slate-500 hover:text-white rounded-xl transition-all border border-slate-500/20">
|
<a download="{{ quote.num }}.pdf" href="{{ vich_uploader_asset(quote,'devisDocuSealFile') }}" target="_blank" class="p-2 bg-slate-600/10 hover:bg-slate-600text-slate-300 hover:text-white rounded-xl transition-all border border-slate-500/20">
|
||||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z" /></svg>
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z" /></svg>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -22,12 +22,12 @@
|
|||||||
<table class="w-full text-left border-collapse">
|
<table class="w-full text-left border-collapse">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5 bg-black/20">
|
<tr class="border-b border-white/5 bg-black/20">
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Visuel</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Visuel</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Désignation</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Désignation</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Type</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Type</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Statut</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Statut</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-center">Tarif</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-center">Tarif</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-right">Actions</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-right">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
En ligne
|
En ligne
|
||||||
</span>
|
</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-slate-500/10 border border-white/5 text-slate-500 text-[9px] font-black uppercase tracking-widest italic">
|
<span class="inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-slate-500/10 border border-white/5text-slate-300 text-[9px] font-black uppercase tracking-widest italic">
|
||||||
Brouillon
|
Brouillon
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -81,13 +81,13 @@
|
|||||||
<div class="flex items-center justify-center space-x-2">
|
<div class="flex items-center justify-center space-x-2">
|
||||||
{# 1 JOUR #}
|
{# 1 JOUR #}
|
||||||
<div class="flex flex-col items-center px-3 py-1.5 rounded-xl bg-white/5 border border-white/5 group-hover:border-blue-500/20 transition-all">
|
<div class="flex flex-col items-center px-3 py-1.5 rounded-xl bg-white/5 border border-white/5 group-hover:border-blue-500/20 transition-all">
|
||||||
<span class="text-[8px] font-black text-slate-500 uppercase tracking-tighter">1J</span>
|
<span class="text-[8px] font-black text-slate-300 uppercase tracking-tighter">1J</span>
|
||||||
<span class="text-xs font-black text-white italic">{{ formule.price1j|default('0') }}€</span>
|
<span class="text-xs font-black text-white italic">{{ formule.price1j|default('0') }}€</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# 2 JOURS #}
|
{# 2 JOURS #}
|
||||||
<div class="flex flex-col items-center px-3 py-1.5 rounded-xl bg-white/5 border border-white/5 group-hover:border-blue-500/20 transition-all">
|
<div class="flex flex-col items-center px-3 py-1.5 rounded-xl bg-white/5 border border-white/5 group-hover:border-blue-500/20 transition-all">
|
||||||
<span class="text-[8px] font-black text-slate-500 uppercase tracking-tighter">2J</span>
|
<span class="text-[8px] font-black text-slate-300 uppercase tracking-tighter">2J</span>
|
||||||
<span class="text-xs font-black text-blue-400 italic">{{ formule.price2j|default('0') }}€</span>
|
<span class="text-xs font-black text-blue-400 italic">{{ formule.price2j|default('0') }}€</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex-1 w-full space-y-4">
|
<div class="flex-1 w-full space-y-4">
|
||||||
{{ form_label(form.imageFile, 'Cliquer pour uploader un visuel', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest'}}) }}
|
{{ form_label(form.imageFile, 'Cliquer pour uploader un visuel', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest'}}) }}
|
||||||
{{ form_widget(form.imageFile, {
|
{{ form_widget(form.imageFile, {
|
||||||
'id': 'product_image_input',
|
'id': 'product_image_input',
|
||||||
'attr': {
|
'attr': {
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
hover:file:bg-white/20 transition-all cursor-pointer'
|
hover:file:bg-white/20 transition-all cursor-pointer'
|
||||||
}
|
}
|
||||||
}) }}
|
}) }}
|
||||||
<p class="text-[10px] text-slate-500 italic">Formats acceptés: PNG, JPG (Max 2Mo)</p>
|
<p class="text-[10px text-slate-300 italic">Formats acceptés: PNG, JPG (Max 2Mo)</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
|
|
||||||
<div class="space-y-6">
|
<div class="space-y-6">
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1">Nom de la formule</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1">Nom de la formule</label>
|
||||||
{{ form_widget(form.name, {
|
{{ form_widget(form.name, {
|
||||||
'attr': {
|
'attr': {
|
||||||
'placeholder': 'ex: Pack Premium Gold',
|
'placeholder': 'ex: Pack Premium Gold',
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1">Description détaillée</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1">Description détaillée</label>
|
||||||
{{ form_widget(form.description, {
|
{{ form_widget(form.description, {
|
||||||
'attr': {
|
'attr': {
|
||||||
'class': 'w-full bg-white/5 border border-white/10 rounded-xl py-4 px-5 text-white placeholder-slate-600 focus:outline-none focus:ring-2 focus:ring-blue-500/50 transition-all min-h-[150px]',
|
'class': 'w-full bg-white/5 border border-white/10 rounded-xl py-4 px-5 text-white placeholder-slate-600 focus:outline-none focus:ring-2 focus:ring-blue-500/50 transition-all min-h-[150px]',
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{# Définitions de classes conservées #}
|
{# Définitions de classes conservées #}
|
||||||
{% set input_class = "w-full bg-slate-900/60 border border-white/10 rounded-2xl px-5 py-4 text-sm text-white outline-none focus:border-blue-500/50 focus:bg-slate-900/90 transition-all duration-300" %}
|
{% set input_class = "w-full bg-slate-900/60 border border-white/10 rounded-2xl px-5 py-4 text-sm text-white outline-none focus:border-blue-500/50 focus:bg-slate-900/90 transition-all duration-300" %}
|
||||||
{% set label_class = "block text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] mb-3 ml-2" %}
|
{% set label_class = "block text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] mb-3 ml-2" %}
|
||||||
<form action="{{ path('app_crm_formules_view', {id: formule.id}) }}" method="POST"
|
<form action="{{ path('app_crm_formules_view', {id: formule.id}) }}" method="POST"
|
||||||
class="w-full backdrop-blur-2xl bg-white/5 border border-white/10 rounded-[2.5rem] p-8 shadow-2xl relative overflow-hidden mt-6">
|
class="w-full backdrop-blur-2xl bg-white/5 border border-white/10 rounded-[2.5rem] p-8 shadow-2xl relative overflow-hidden mt-6">
|
||||||
<div class="w-full form-repeater" data-component="repeater" is="repeat-line">
|
<div class="w-full form-repeater" data-component="repeater" is="repeat-line">
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<div class="grid grid-cols-1 lg:grid-cols-12 gap-5 items-start">
|
<div class="grid grid-cols-1 lg:grid-cols-12 gap-5 items-start">
|
||||||
{# 1. PRODUIT / WYSIWYG #}
|
{# 1. PRODUIT / WYSIWYG #}
|
||||||
<div class="lg:col-span-11">
|
<div class="lg:col-span-11">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">
|
||||||
Produit / Prestation
|
Produit / Prestation
|
||||||
</label>
|
</label>
|
||||||
<div class="relative flex items-center">
|
<div class="relative flex items-center">
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
<div class="grid grid-cols-1 lg:grid-cols-12 gap-5 items-start">
|
<div class="grid grid-cols-1 lg:grid-cols-12 gap-5 items-start">
|
||||||
{# 1. PRODUIT / WYSIWYG #}
|
{# 1. PRODUIT / WYSIWYG #}
|
||||||
<div class="lg:col-span-11">
|
<div class="lg:col-span-11">
|
||||||
<label class="text-[9px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block">
|
<label class="text-[9px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block">
|
||||||
Options
|
Options
|
||||||
</label>
|
</label>
|
||||||
<div class="relative flex items-center">
|
<div class="relative flex items-center">
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
<div class="w-full mb-8 flex flex-col items-start gap-2">
|
<div class="w-full mb-8 flex flex-col items-start gap-2">
|
||||||
<h1 class="text-4xl font-black text-white italic tracking-tighter uppercase">Modification</h1>
|
<h1 class="text-4xl font-black text-white italic tracking-tighter uppercase">Modification</h1>
|
||||||
<div class="flex items-center space-x-3">
|
<div class="flex items-center space-x-3">
|
||||||
<p class="text-[10px] font-bold text-slate-500 uppercase tracking-[0.3em]">ID : #{{ formule.id|format("%04d") }}</p>
|
<p class="text-[10px] font-boldtext-slate-300 uppercase tracking-[0.3em]">ID : #{{ formule.id|format("%04d") }}</p>
|
||||||
<span class="w-1 h-1 bg-slate-700 rounded-full"></span>
|
<span class="w-1 h-1 bg-slate-700 rounded-full"></span>
|
||||||
<p class="text-[10px] font-bold text-blue-500 uppercase tracking-[0.3em]">{{ type|default('PACK')|upper }}</p>
|
<p class="text-[10px] font-bold text-blue-500 uppercase tracking-[0.3em]">{{ type|default('PACK')|upper }}</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex-1 w-full space-y-4">
|
<div class="flex-1 w-full space-y-4">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest">Remplacer l'image</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest">Remplacer l'image</label>
|
||||||
{{ form_widget(form.imageFile, {
|
{{ form_widget(form.imageFile, {
|
||||||
'attr': {
|
'attr': {
|
||||||
'class': 'block w-full text-xs text-slate-400 file:mr-6 file:py-3 file:px-6 file:rounded-xl file:border file:border-white/10 file:text-[10px] file:font-black file:uppercase file:bg-white/5 file:text-white cursor-pointer transition-all hover:file:bg-white/10'
|
'class': 'block w-full text-xs text-slate-400 file:mr-6 file:py-3 file:px-6 file:rounded-xl file:border file:border-white/10 file:text-[10px] file:font-black file:uppercase file:bg-white/5 file:text-white cursor-pointer transition-all hover:file:bg-white/10'
|
||||||
@@ -99,14 +99,14 @@
|
|||||||
|
|
||||||
<div class="grid grid-cols-1 gap-6">
|
<div class="grid grid-cols-1 gap-6">
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1">Nom du pack</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1">Nom du pack</label>
|
||||||
{{ form_widget(form.name, {
|
{{ form_widget(form.name, {
|
||||||
'attr': {'class': 'w-full bg-white/5 border border-white/10 rounded-xl py-4 px-5 text-white focus:ring-2 focus:ring-blue-500/50 outline-none transition-all placeholder-slate-700'}
|
'attr': {'class': 'w-full bg-white/5 border border-white/10 rounded-xl py-4 px-5 text-white focus:ring-2 focus:ring-blue-500/50 outline-none transition-all placeholder-slate-700'}
|
||||||
}) }}
|
}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1">Description catalogue</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1">Description catalogue</label>
|
||||||
{{ form_widget(form.description, {
|
{{ form_widget(form.description, {
|
||||||
'attr': {'is':'crm-editor','class': 'w-full bg-white/5 border border-white/10 rounded-xl py-4 px-5 text-white focus:ring-2 focus:ring-blue-500/50 outline-none transition-all min-h-[150px]'}
|
'attr': {'is':'crm-editor','class': 'w-full bg-white/5 border border-white/10 rounded-xl py-4 px-5 text-white focus:ring-2 focus:ring-blue-500/50 outline-none transition-all min-h-[150px]'}
|
||||||
}) }}
|
}) }}
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
{# Badge de rappel du type #}
|
{# Badge de rappel du type #}
|
||||||
<span class="text-[9px] font-bold text-slate-500 uppercase px-3 py-1 bg-white/5 rounded-lg border border-white/10 italic">
|
<span class="text-[9px] font-boldtext-slate-300 uppercase px-3 py-1 bg-white/5 rounded-lg border border-white/10 italic">
|
||||||
Tarification dégressive
|
Tarification dégressive
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
|
||||||
{# Prix 1 Jour #}
|
{# Prix 1 Jour #}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1">Tarif 1 Jour</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1">Tarif 1 Jour</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<input type="number" step="0.01" name="price[1j]" value="{{ formule.price1j|default('0.00') }}"
|
<input type="number" step="0.01" name="price[1j]" value="{{ formule.price1j|default('0.00') }}"
|
||||||
class="w-full bg-white/5 border border-white/10 rounded-xl py-4 pl-5 pr-12 text-white font-bold focus:ring-2 focus:ring-emerald-500/50 outline-none transition-all">
|
class="w-full bg-white/5 border border-white/10 rounded-xl py-4 pl-5 pr-12 text-white font-bold focus:ring-2 focus:ring-emerald-500/50 outline-none transition-all">
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
|
|
||||||
{# Prix 2 Jours #}
|
{# Prix 2 Jours #}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1">Tarif 2 Jours</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1">Tarif 2 Jours</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<input type="number" step="0.01" name="price[2j]" value="{{ formule.price2j|default('0.00') }}"
|
<input type="number" step="0.01" name="price[2j]" value="{{ formule.price2j|default('0.00') }}"
|
||||||
class="w-full bg-white/5 border border-white/10 rounded-xl py-4 pl-5 pr-12 text-white font-bold focus:ring-2 focus:ring-emerald-500/50 outline-none transition-all">
|
class="w-full bg-white/5 border border-white/10 rounded-xl py-4 pl-5 pr-12 text-white font-bold focus:ring-2 focus:ring-emerald-500/50 outline-none transition-all">
|
||||||
@@ -170,7 +170,7 @@
|
|||||||
|
|
||||||
{# Prix 5 Jours #}
|
{# Prix 5 Jours #}
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<label class="text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1">Tarif 5 Jours</label>
|
<label class="text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1">Tarif 5 Jours</label>
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<input type="number" step="0.01" name="price[5j]" value="{{ formule.price5j|default('0.00') }}"
|
<input type="number" step="0.01" name="price[5j]" value="{{ formule.price5j|default('0.00') }}"
|
||||||
class="w-full bg-white/5 border border-white/10 rounded-xl py-4 pl-5 pr-12 text-white font-bold focus:ring-2 focus:ring-emerald-500/50 outline-none transition-all">
|
class="w-full bg-white/5 border border-white/10 rounded-xl py-4 pl-5 pr-12 text-white font-bold focus:ring-2 focus:ring-emerald-500/50 outline-none transition-all">
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<div class="flex items-center gap-2 px-2">
|
<div class="flex items-center gap-2 px-2">
|
||||||
<h1 class="text-xl font-black italic text-slate-900 dark:text-white uppercase tracking-tighter">Analytics</h1>
|
<h1 class="text-xl font-black italic text-slate-900 dark:text-white uppercase tracking-tighter">Analytics</h1>
|
||||||
<a href="{{ statview }}" target="_blank" class="group flex items-center gap-2 bg-white/5 px-4 py-2 rounded-xl border border-white/10 hover:bg-blue-600 transition-all duration-300">
|
<a href="{{ statview }}" target="_blank" class="group flex items-center gap-2 bg-white/5 px-4 py-2 rounded-xl border border-white/10 hover:bg-blue-600 transition-all duration-300">
|
||||||
<span class="text-[10px] font-bold text-slate-500 group-hover:text-white transition-colors uppercase tracking-widest">reservation.ludikevent.fr</span>
|
<span class="text-[10px] font-boldtext-slate-300 group-hover:text-white transition-colors uppercase tracking-widest">reservation.ludikevent.fr</span>
|
||||||
<svg class="w-3 h-3 text-slate-400 group-hover:text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg>
|
<svg class="w-3 h-3 text-slate-400 group-hover:text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -65,13 +65,13 @@
|
|||||||
<div class="md:col-span-3 grid grid-cols-1 md:grid-cols-3 gap-6 bg-white/5 p-6 rounded-[2.5rem] border border-white/10 shadow-inner">
|
<div class="md:col-span-3 grid grid-cols-1 md:grid-cols-3 gap-6 bg-white/5 p-6 rounded-[2.5rem] border border-white/10 shadow-inner">
|
||||||
<div class="md:col-span-3 flex items-center gap-4 mb-2 px-4">
|
<div class="md:col-span-3 flex items-center gap-4 mb-2 px-4">
|
||||||
<span class="h-[1px] flex-1 bg-white/10"></span>
|
<span class="h-[1px] flex-1 bg-white/10"></span>
|
||||||
<h4 class="text-[10px] font-black text-slate-500 uppercase tracking-[0.3em]">Core Web Vitals (24h)</h4>
|
<h4 class="text-[10px] font-black text-slate-300 uppercase tracking-[0.3em]">Core Web Vitals (24h)</h4>
|
||||||
<span class="h-[1px] flex-1 bg-white/10"></span>
|
<span class="h-[1px] flex-1 bg-white/10"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# LCP #}
|
{# LCP #}
|
||||||
<div class="backdrop-blur-xl bg-slate-900/40 border border-white/5 p-6 rounded-3xl">
|
<div class="backdrop-blur-xl bg-slate-900/40 border border-white/5 p-6 rounded-3xl">
|
||||||
<p class="text-[9px] font-black text-slate-500 uppercase tracking-widest mb-3">Moyenne LCP</p>
|
<p class="text-[9px] font-black text-slate-300 uppercase tracking-widest mb-3">Moyenne LCP</p>
|
||||||
<div class="flex items-end gap-3">
|
<div class="flex items-end gap-3">
|
||||||
<span class="text-3xl font-black text-white italic leading-none">{{ avg_lcp|number_format(2) }}s</span>
|
<span class="text-3xl font-black text-white italic leading-none">{{ avg_lcp|number_format(2) }}s</span>
|
||||||
<span class="text-[10px] px-2 py-0.5 rounded {{ avg_lcp < 2.5 ? 'bg-emerald-500/10 text-emerald-400' : 'bg-rose-500/10 text-rose-400' }} font-bold uppercase italic">
|
<span class="text-[10px] px-2 py-0.5 rounded {{ avg_lcp < 2.5 ? 'bg-emerald-500/10 text-emerald-400' : 'bg-rose-500/10 text-rose-400' }} font-bold uppercase italic">
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
|
|
||||||
{# CLS #}
|
{# CLS #}
|
||||||
<div class="backdrop-blur-xl bg-slate-900/40 border border-white/5 p-6 rounded-3xl">
|
<div class="backdrop-blur-xl bg-slate-900/40 border border-white/5 p-6 rounded-3xl">
|
||||||
<p class="text-[9px] font-black text-slate-500 uppercase tracking-widest mb-3">Moyenne CLS</p>
|
<p class="text-[9px] font-black text-slate-300 uppercase tracking-widest mb-3">Moyenne CLS</p>
|
||||||
<div class="flex items-end gap-3">
|
<div class="flex items-end gap-3">
|
||||||
<span class="text-3xl font-black text-white italic leading-none">{{ avg_cls|number_format(3) }}</span>
|
<span class="text-3xl font-black text-white italic leading-none">{{ avg_cls|number_format(3) }}</span>
|
||||||
<span class="text-[10px] px-2 py-0.5 rounded {{ avg_cls < 0.1 ? 'bg-emerald-500/10 text-emerald-400' : 'bg-rose-500/10 text-rose-400' }} font-bold uppercase italic">
|
<span class="text-[10px] px-2 py-0.5 rounded {{ avg_cls < 0.1 ? 'bg-emerald-500/10 text-emerald-400' : 'bg-rose-500/10 text-rose-400' }} font-bold uppercase italic">
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
|
|
||||||
{# INP #}
|
{# INP #}
|
||||||
<div class="backdrop-blur-xl bg-slate-900/40 border border-white/5 p-6 rounded-3xl">
|
<div class="backdrop-blur-xl bg-slate-900/40 border border-white/5 p-6 rounded-3xl">
|
||||||
<p class="text-[9px] font-black text-slate-500 uppercase tracking-widest mb-3">Moyenne INP</p>
|
<p class="text-[9px] font-black text-slate-300 uppercase tracking-widest mb-3">Moyenne INP</p>
|
||||||
<div class="flex items-end gap-3">
|
<div class="flex items-end gap-3">
|
||||||
<span class="text-3xl font-black text-white italic leading-none">{{ avg_inp|number_format(0) }}ms</span>
|
<span class="text-3xl font-black text-white italic leading-none">{{ avg_inp|number_format(0) }}ms</span>
|
||||||
<span class="text-[10px] px-2 py-0.5 rounded {{ avg_inp < 200 ? 'bg-emerald-500/10 text-emerald-400' : 'bg-rose-500/10 text-rose-400' }} font-bold uppercase italic">
|
<span class="text-[10px] px-2 py-0.5 rounded {{ avg_inp < 200 ? 'bg-emerald-500/10 text-emerald-400' : 'bg-rose-500/10 text-rose-400' }} font-bold uppercase italic">
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex-1 w-full">
|
<div class="flex-1 w-full">
|
||||||
{{ form_label(form.imageFile, 'Sélectionner un fichier', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest mb-2 block'}}) }}
|
{{ form_label(form.imageFile, 'Sélectionner un fichier', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest mb-2 block'}}) }}
|
||||||
|
|
||||||
{# On enlève le "onchange" inline, on cible via l'ID généré par Symfony ou un ID fixe #}
|
{# On enlève le "onchange" inline, on cible via l'ID généré par Symfony ou un ID fixe #}
|
||||||
{{ form_widget(form.imageFile, {
|
{{ form_widget(form.imageFile, {
|
||||||
@@ -60,13 +60,13 @@
|
|||||||
<div class="space-y-8">
|
<div class="space-y-8">
|
||||||
{# Nom de l'option #}
|
{# Nom de l'option #}
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.name, 'Nom de l\'option', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-3 block'}}) }}
|
{{ form_label(form.name, 'Nom de l\'option', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-3 block'}}) }}
|
||||||
{{ form_widget(form.name, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-4 px-6 text-lg font-bold', 'placeholder': 'ex: Assurance Sérénité, Nettoyage...'}}) }}
|
{{ form_widget(form.name, {'attr': {'class': 'w-full bg-slate-950/50 border-white/5 rounded-2xl text-white focus:ring-purple-500/20 focus:border-purple-500 transition-all py-4 px-6 text-lg font-bold', 'placeholder': 'ex: Assurance Sérénité, Nettoyage...'}}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="space-y-6">
|
<div class="space-y-6">
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.priceHt, 'Prix Ht', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
{{ form_label(form.priceHt, 'Prix Ht', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
{{ form_widget(form.priceHt, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-emerald-400 font-black text-xl focus:ring-emerald-500/20 focus:border-emerald-500 transition-all py-4 px-5'}}) }}
|
{{ form_widget(form.priceHt, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-emerald-400 font-black text-xl focus:ring-emerald-500/20 focus:border-emerald-500 transition-all py-4 px-5'}}) }}
|
||||||
<span class="absolute right-5 top-1/2 -translate-y-1/2 text-slate-600 font-bold">€HT</span>
|
<span class="absolute right-5 top-1/2 -translate-y-1/2 text-slate-600 font-bold">€HT</span>
|
||||||
|
|||||||
@@ -29,12 +29,12 @@
|
|||||||
<table class="w-full text-left border-collapse">
|
<table class="w-full text-left border-collapse">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5 bg-black/20">
|
<tr class="border-b border-white/5 bg-black/20">
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Visuel & Réf</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Visuel & Réf</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Désignation</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Désignation</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Catégorie</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Catégorie</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Stripe</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Stripe</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-center">Tarif J1</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-center">Tarif J1</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-right">Actions</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-right">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr><td colspan="6" class="py-24 text-center italic text-slate-500 text-[10px] font-black uppercase tracking-[0.2em]">Aucun produit</td></tr>
|
<tr><td colspan="6" class="py-24 text-center italictext-slate-300 text-[10px] font-black uppercase tracking-[0.2em]">Aucun produit</td></tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -114,11 +114,11 @@
|
|||||||
<table class="w-full text-left border-collapse">
|
<table class="w-full text-left border-collapse">
|
||||||
<thead>
|
<thead>
|
||||||
<tr class="border-b border-white/5 bg-black/20">
|
<tr class="border-b border-white/5 bg-black/20">
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Visuel</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Visuel</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Désignation</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Désignation</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em]">Stripe</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em]">Stripe</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-center">Tarif</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-center">Tarif</th>
|
||||||
<th class="px-6 py-5 text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] text-right">Actions</th>
|
<th class="px-6 py-5 text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] text-right">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-white/5">
|
<tbody class="divide-y divide-white/5">
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr><td colspan="5" class="py-24 text-center italic text-slate-500 text-[10px] font-black uppercase tracking-[0.2em]">Aucune option</td></tr>
|
<tr><td colspan="5" class="py-24 text-center italic text-slate-300 text-[10px] font-black uppercase tracking-[0.2em]">Aucune option</td></tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
Voir sur le site
|
Voir sur le site
|
||||||
|
|
||||||
<svg class="w-3 h-3 ml-2 text-slate-500 group-hover:translate-x-1 group-hover:-translate-y-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="w-3 h-3 ml-2 text-slate-300 group-hover:translate-x-1 group-hover:-translate-y-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex-1 w-full">
|
<div class="flex-1 w-full">
|
||||||
{{ form_label(form.imageFile, 'Sélectionner un fichier', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest mb-2 block'}}) }}
|
{{ form_label(form.imageFile, 'Sélectionner un fichier', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest mb-2 block'}}) }}
|
||||||
|
|
||||||
{# On enlève le "onchange" inline, on cible via l'ID généré par Symfony ou un ID fixe #}
|
{# On enlève le "onchange" inline, on cible via l'ID généré par Symfony ou un ID fixe #}
|
||||||
{{ form_widget(form.imageFile, {
|
{{ form_widget(form.imageFile, {
|
||||||
@@ -80,23 +80,23 @@
|
|||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
<div class="md:col-span-2">
|
<div class="md:col-span-2">
|
||||||
{{ form_label(form.name, 'Désignation Commerciale', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.name, 'Désignation Commerciale', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.name, {'attr': {'placeholder': 'Ex: Château Gonflable Jungle', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.name, {'attr': {'placeholder': 'Ex: Château Gonflable Jungle', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.category, 'Catégorie', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.category, 'Catégorie', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.category, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.category, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.ref, 'Référence Interne (SKU)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.ref, 'Référence Interne (SKU)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.ref, {'attr': {'placeholder': 'REF-000', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
{{ form_widget(form.ref, {'attr': {'placeholder': 'REF-000', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 px-5'}}) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{# À placer juste après le bloc Référence Interne #}
|
{# À placer juste après le bloc Référence Interne #}
|
||||||
<div class="md:col-span-2 mt-6">
|
<div class="md:col-span-2 mt-6">
|
||||||
{{ form_label(form.description, 'Description détaillée', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.description, 'Description détaillée', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(form.description, {
|
{{ form_widget(form.description, {
|
||||||
'attr': {
|
'attr': {
|
||||||
'is':'crm-editor',
|
'is':'crm-editor',
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||||
{# Largeur #}
|
{# Largeur #}
|
||||||
<div class="relative group">
|
<div class="relative group">
|
||||||
{{ form_label(form.dimW, 'Largeur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.dimW, 'Largeur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<div class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
<div class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
||||||
<span class="text-slate-500 text-[10px] font-bold italic">W</span>
|
<span class="text-slate-500 text-[10px] font-bold italic">W</span>
|
||||||
@@ -132,7 +132,7 @@
|
|||||||
|
|
||||||
{# Longueur #}
|
{# Longueur #}
|
||||||
<div class="relative group">
|
<div class="relative group">
|
||||||
{{ form_label(form.dimP, 'Longueur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.dimP, 'Longueur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<div class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
<div class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
||||||
<span class="text-slate-500 text-[10px] font-bold italic">L</span>
|
<span class="text-slate-500 text-[10px] font-bold italic">L</span>
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
|
|
||||||
{# Hauteur #}
|
{# Hauteur #}
|
||||||
<div class="relative group">
|
<div class="relative group">
|
||||||
{{ form_label(form.dimH, 'Hauteur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(form.dimH, 'Hauteur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<div class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
<div class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
|
||||||
<span class="text-slate-500 text-[10px] font-bold italic">H</span>
|
<span class="text-slate-500 text-[10px] font-bold italic">H</span>
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
{# PRIX LOCATION #}
|
{# PRIX LOCATION #}
|
||||||
<div class="space-y-6">
|
<div class="space-y-6">
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.priceDay, 'Tarif 1er Jour (€) Ou Tarif weekend (si Barnums)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
{{ form_label(form.priceDay, 'Tarif 1er Jour (€) Ou Tarif weekend (si Barnums)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
{{ form_widget(form.priceDay, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-emerald-400 font-black text-xl focus:ring-emerald-500/20 focus:border-emerald-500 transition-all py-4 px-5'}}) }}
|
{{ form_widget(form.priceDay, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-emerald-400 font-black text-xl focus:ring-emerald-500/20 focus:border-emerald-500 transition-all py-4 px-5'}}) }}
|
||||||
<span class="absolute right-5 top-1/2 -translate-y-1/2 text-slate-600 font-bold">€HT</span>
|
<span class="absolute right-5 top-1/2 -translate-y-1/2 text-slate-600 font-bold">€HT</span>
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(form.priceSup, 'Tarif Jour Sup. (€)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
{{ form_label(form.priceSup, 'Tarif Jour Sup. (€)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
{{ form_widget(form.priceSup, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-blue-400 font-black text-xl focus:ring-blue-500/20 focus:border-blue-500 transition-all py-4 px-5'}}) }}
|
{{ form_widget(form.priceSup, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-blue-400 font-black text-xl focus:ring-blue-500/20 focus:border-blue-500 transition-all py-4 px-5'}}) }}
|
||||||
<span class="absolute right-5 top-1/2 -translate-y-1/2 text-slate-600 font-bold">€HT</span>
|
<span class="absolute right-5 top-1/2 -translate-y-1/2 text-slate-600 font-bold">€HT</span>
|
||||||
@@ -185,7 +185,7 @@
|
|||||||
<hr class="mt-2"/>
|
<hr class="mt-2"/>
|
||||||
{# CAUTION #}
|
{# CAUTION #}
|
||||||
<div class="pt-8 border-t border-white/5">
|
<div class="pt-8 border-t border-white/5">
|
||||||
{{ form_label(form.caution, 'Montant de la Caution (€)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
{{ form_label(form.caution, 'Montant de la Caution (€)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest ml-1 mb-2 block'}}) }}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
{{ form_widget(form.caution, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3 px-5 text-center'}}) }}
|
{{ form_widget(form.caution, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3 px-5 text-center'}}) }}
|
||||||
</div>
|
</div>
|
||||||
@@ -274,17 +274,17 @@
|
|||||||
{{ form_start(formDoc) }}
|
{{ form_start(formDoc) }}
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 items-end">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 items-end">
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(formDoc.name, 'Nom du document', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(formDoc.name, 'Nom du document', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(formDoc.name, {'attr': {'placeholder': 'Ex: Notice technique PDF', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-4 px-5 font-bold text-sm'}}) }}
|
{{ form_widget(formDoc.name, {'attr': {'placeholder': 'Ex: Notice technique PDF', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-amber-500/20 focus:border-amber-500 transition-all py-4 px-5 font-bold text-sm'}}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{{ form_label(formDoc.isPublic, 'Visibilité Client', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
{{ form_label(formDoc.isPublic, 'Visibilité Client', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }}
|
||||||
{{ form_widget(formDoc.isPublic, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-4 px-5 font-bold text-sm cursor-pointer'}}) }}
|
{{ form_widget(formDoc.isPublic, {'attr': {'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white focus:ring-blue-500/20 focus:border-blue-500 transition-all py-4 px-5 font-bold text-sm cursor-pointer'}}) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="md:col-span-2 bg-slate-950/40 p-6 rounded-[2rem] border border-dashed border-white/10 group hover:border-amber-500/30 transition-all">
|
<div class="md:col-span-2 bg-slate-950/40 p-6 rounded-[2rem] border border-dashed border-white/10 group hover:border-amber-500/30 transition-all">
|
||||||
{{ form_label(formDoc.docProduct, 'Fichier PDF (Notice, Certificat...)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-widest mb-4 block text-center'}}) }}
|
{{ form_label(formDoc.docProduct, 'Fichier PDF (Notice, Certificat...)', {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-widest mb-4 block text-center'}}) }}
|
||||||
{{ form_widget(formDoc.docProduct, {
|
{{ form_widget(formDoc.docProduct, {
|
||||||
'attr': {
|
'attr': {
|
||||||
'class': 'block w-full text-xs text-slate-400 file:mr-4 file:py-3 file:px-6 file:rounded-xl file:border-0 file:text-[10px] file:font-black file:uppercase file:tracking-widest file:bg-amber-600 file:text-white hover:file:bg-amber-500 transition-all cursor-pointer'
|
'class': 'block w-full text-xs text-slate-400 file:mr-4 file:py-3 file:px-6 file:rounded-xl file:border-0 file:text-[10px] file:font-black file:uppercase file:tracking-widest file:bg-amber-600 file:text-white hover:file:bg-amber-500 transition-all cursor-pointer'
|
||||||
|
|||||||
@@ -36,11 +36,11 @@
|
|||||||
|
|
||||||
<div class="flex flex-wrap justify-center md:justify-start gap-4">
|
<div class="flex flex-wrap justify-center md:justify-start gap-4">
|
||||||
<div class="bg-white/5 border border-white/5 px-4 py-2 rounded-xl text-center">
|
<div class="bg-white/5 border border-white/5 px-4 py-2 rounded-xl text-center">
|
||||||
<p class="text-[9px] text-slate-500 uppercase font-black tracking-widest mb-1">Identifiant</p>
|
<p class="text-[9px] text-slate-300 uppercase font-black tracking-widest mb-1">Identifiant</p>
|
||||||
<p class="text-xs font-mono text-white">#{{ user.id }}</p>
|
<p class="text-xs font-mono text-white">#{{ user.id }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white/5 border border-white/5 px-4 py-2 rounded-xl text-center">
|
<div class="bg-white/5 border border-white/5 px-4 py-2 rounded-xl text-center">
|
||||||
<p class="text-[9px] text-slate-500 uppercase font-black tracking-widest mb-1">Dernière connexion</p>
|
<p class="text-[9px] text-slate-300 uppercase font-black tracking-widest mb-1">Dernière connexion</p>
|
||||||
<p class="text-xs text-white uppercase font-bold tracking-tighter">Aujourd'hui</p>
|
<p class="text-xs text-white uppercase font-bold tracking-tighter">Aujourd'hui</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
{% for row in formPassword %}
|
{% for row in formPassword %}
|
||||||
{% if row.vars.name != '_token' %}
|
{% if row.vars.name != '_token' %}
|
||||||
<div class="space-y-1">
|
<div class="space-y-1">
|
||||||
{{ form_label(row, null, {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-2'}}) }}
|
{{ form_label(row, null, {'label_attr': {'class': 'text-[10px] font-black text-slate-300 uppercase tracking-[0.2em] ml-2'}}) }}
|
||||||
{{ form_widget(row, {'attr': {'class': 'w-full px-5 py-4 bg-slate-900/50 border border-white/10 rounded-2xl text-white text-sm focus:border-blue-600 focus:ring-0 transition-all outline-none placeholder:text-slate-700'}}) }}
|
{{ form_widget(row, {'attr': {'class': 'w-full px-5 py-4 bg-slate-900/50 border border-white/10 rounded-2xl text-white text-sm focus:border-blue-600 focus:ring-0 transition-all outline-none placeholder:text-slate-700'}}) }}
|
||||||
<div class="text-red-500 text-[9px] font-bold uppercase tracking-tighter mt-1 ml-2">
|
<div class="text-red-500 text-[9px] font-bold uppercase tracking-tighter mt-1 ml-2">
|
||||||
{{ form_errors(row) }}
|
{{ form_errors(row) }}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<div class="max-w-3xl">
|
<div class="max-w-3xl">
|
||||||
<form action="{{ path('app_crm_search') }}" method="GET" class="relative group">
|
<form action="{{ path('app_crm_search') }}" method="GET" class="relative group">
|
||||||
<div class="absolute inset-y-0 left-6 flex items-center pointer-events-none">
|
<div class="absolute inset-y-0 left-6 flex items-center pointer-events-none">
|
||||||
<svg class="w-5 h-5 text-slate-500 group-focus-within:text-blue-500 transition-colors" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="w-5 h-5 text-slate-300 group-focus-within:text-blue-500 transition-colors" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
{% block form_label %}
|
{% block form_label %}
|
||||||
|
|
||||||
{% if label is not same as(false) %}
|
{% if label is not same as(false) %}
|
||||||
<label for="{{ id }}" class="block text-sm font-medium text-gray-700">
|
<label for="{{ id }}" class="block text-sm font-medium text-gray-200">
|
||||||
{{ label|trans({}, translation_domain) }}
|
{{ label|trans({}, translation_domain) }}
|
||||||
{% if required %}
|
{% if required %}
|
||||||
<span class="text-red-500">*</span>
|
<span class="text-red-500">*</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user