{% set societe = dtc_societe.getSociete() %}
<div class="col-md-3 left_col">
<div class="_left_col scroll-view">
<div class="navbar _nav_title text-center" style="border: 0;">
<a href="/" class="_site_title" style=""><img style="width:75%;" src="/images/logo_noir.png"></a>
</div>
{#
<div class="navbar nav_title" style="border: 0;">
<a href="/" class="site_title" style="font-size:1.4em;"><i style="padding-left:0px;border-radius:0%;border:0;" class="icon-kangaroo-silhouette"></i> <span>Pro Outback Import</span></a>
</div>
#}
{% if version_projet != "" and 1!=1 %}
<div class="navbar " style="border: 0;font-size:1.4em;color:white;padding-top:0;padding-bottom:0px;">
<span class="badge badge-info">{{ version_projet }}</span>
</div>
{% endif %}
<!-- menu profile quick info -->
{% if app.user.id is defined %}
<div class="profile clearfix">
<div class="profile_pic">
<img src="/images/avatar.png" style="height:55px;" class="img-circle profile_img">
</div>
<div class="profile_info">
<span>Bonjour,</span>
<h2 class="orange" style="color:#fbb911;">{{ app.user.prenom }} {{ app.user.nom }}</h2>
</div>
</div>
{% endif %}
<!-- /menu profile quick info -->
<!-- sidebar menu -->
<div id="sidebar-menu" class="main_menu_side hidden-print main_menu">
<div class="menu_section">
<h3>General</h3>
<ul class="nav side-menu">
<li><a href="/"><i class="fa fa-home"></i> Accueil </a> </li>
<li><a href="{{ path ("dtc_article_liste") }}"><i class="fa fa-shopping-cart"></i> Catalogue </a> </li>
{#
<li><a><i class="fa fa-shopping-cart"></i> Catalogue <span class="fa fa-chevron-down"></span></a>
<ul class="nav child_menu">
<li><a href="{{ path ("dtc_article_liste") }}">Produits</a></li>
</ul>
</li>
#}
<li><a><i class="fa fa-clipboard"></i> Commandes <span class="fa fa-chevron-down"></span></a>
<ul class="nav child_menu">
<li><a href="{{ path ("dtc_devis_liste") }}">Devis</a></li>
<li><a href="{{ path ("dtc_commande_liste") }}">Commandes</a></li>
<li><a href="{{ path ("dtc_bon_livraison_liste") }}">Bons de livraison</a></li>
<li><a href="{{ path ("dtc_facture_liste") }}">Factures</a></li>
<li><a href="{{ path ("dtc_sav") }}">SAV</a></li>
</ul>
</li>
<li><a><i class="fa fa-download"></i> Téléchargements <span class="fa fa-chevron-down"></span></a>
<ul class="nav child_menu">
{# <li><a href="{{ path ("dtc_telechargement_prix_liste") }}">Prix</a></li> #}
<li><a href="{{ path ("dtc_telechargement_catalogue_liste") }}">Catalogues</a></li>
<li><a href="{{ path ("dtc_telechargement_fiche_liste") }}">Fichiers CSV</a></li>
</ul>
</li>
<li><a href="{{ path ("dtc_contact") }}"><i class="fa fa-envelope"></i> Contact </a>
<li><a href="{{ path ("dtc_faq") }}"><i class="fa fa-question"></i> Aide </a>
</ul>
</div>
<div class="menu_section " style="margin-bottom:20px;">
<h3>Paramètres</h3>
<ul class="nav side-menu side-menu-2" style="margin-top:15px;">
<li><a><i class="fa fa-gears"></i> Paramètres <span class="fa fa-chevron-down"></span></a>
<ul class="nav child_menu">
<li><a href="{{ path ("dtc_utilisateur_profil") }}">Données personnelles</a></li>
{# <li><a href="{{ path ("dtc_remise_liste") }}">Remises</a></li>#}
<li><a href="{{ path ("dtc_adresse_liste") }}">Adresses</a></li>
{% if app.user.client.id is defined and app.user.client.statutApi %}
<li><a href="{{ path ("dtc_client_export_csv") }}">Export CSV</a></li>
<li><a href="{{ path ("dtc_client_api") }}">API</a></li>
{% endif %}
</ul>
</li>
{#
<li><a><i class="fa fa-gears"></i> Paramètres <span class="fa fa-chevron-down"></span></a>
<ul class="nav child_menu">
<li><a href="#level1_1">Level One</a>
<li><a>Level One<span class="fa fa-chevron-down"></span></a>
<ul class="nav child_menu">
<li class="sub_menu"><a href="level2.html">Level Two</a>
</li>
<li><a href="#level2_1">Level Two</a>
</li>
<li><a href="#level2_2">Level Two</a>
</li>
</ul>
</li>
<li><a href="#level1_2">Level One</a>
</li>
</ul>
</li>
<li><a href="{{ path('dtc_utilisateur_profil') }}"><i class="fa fa-gears"></i> Paramètres</a></li>
#}
</ul>
</div>
<div class="menu_section">
<style>
/* Style de base pour tous les drapeaux */
</style>
<script type="text/javascript">
function changeLanguage(lang) {
var selectField = document.querySelector("select.goog-te-combo");
if (selectField) {
selectField.value = lang;
selectField.dispatchEvent(new Event("change"));
}
}
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'fr'
}, 'google_translate_element');
}
</script>
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
<div id="google_translate_element" style="display:none"></div>
<h3>Langue</h3>
<ul class="nav side-menu" style="margin-top:15px;">
<li style="text-align:center;">
<span style="cursor:pointer;display:inline;padding-right:5px;" href="#" onclick="changeLanguage('en')"><span style="margin-bottom:10px;" class="flag flag-gb"></span></span>
<span style="cursor:pointer;display:inline;padding-left:5px;padding-right:5px;" href="#" onclick="changeLanguage('fr')"><span style="margin-bottom:10px;" class="flag flag-fr"></span></span>
<span style="cursor:pointer;display:inline;padding-left:5px;padding-right:5px;" href="#" onclick="changeLanguage('es')"><span style="margin-bottom:10px;" class="flag flag-es"></span></span>
</li>
</ul>
</div>
</div>
<!-- /sidebar menu -->
<!-- /menu footer buttons -->
<div class="sidebar-footer hidden-small">
{#
<a data-toggle="tooltip" data-placement="top" title="Settings">
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
</a>
<a data-toggle="tooltip" data-placement="top" title="FullScreen">
<span class="glyphicon glyphicon-fullscreen" aria-hidden="true"></span>
</a>
<a data-toggle="tooltip" data-placement="top" title="Lock">
<span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span>
</a>
<span style="width:75%;display:block;float:left;">
</span>
#}
<a data-toggle="tooltip" data-placement="top" title="Aide" href="{{ path('dtc_faq') }}">
<span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span>
</a>
<a data-toggle="tooltip" data-placement="top" title="Contact" href="{{ path('dtc_contact') }}">
<span class="glyphicon glyphicon-envelope" aria-hidden="true"></span>
</a>
<a data-toggle="tooltip" data-placement="top" title="Profil" href="{{ path('dtc_utilisateur_profil') }}">
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
</a>
<a data-toggle="tooltip" data-placement="top" title="Se déconnecter" href="{{ path('logout') }}">
<span class="glyphicon glyphicon-off" aria-hidden="true"></span>
</a>
</div>
<!-- /menu footer buttons -->
</div>
</div>
{% set now = "now"|date("Y-m-d H:i:s") %}
{% if societe.noteService != ""
and societe.isStatutTexteBandeau
and (societe.dateDebutTexteBandeau is not empty and societe.dateDebutTexteBandeau|date("Y-m-d H:i:s") <= now)
and (societe.dateFinTexteBandeau is not empty and societe.dateFinTexteBandeau|date("Y-m-d H:i:s") >= now)
%}
<div style="background:yellow;">
<div class="banner" aria-label="" style="_margin-left:230px;">
<div class="track" id="track">
<div class="item" style="text-align:center;">
{{ societe.noteService }}
{{ societe.noteService }}
{{ societe.noteService }}
</div>
<input id="speed" type="hidden" value="30" min="10">
</div>
</div>
</div>
{% endif %}
<style>
.pulse {
animation: pulse 0.4s ease;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.15); }
100% { transform: scale(1); }
}
</style>
{% if app.user.type.id is defined and (app.user.type.id == 1 or app.user.type.id == 2 or app.user.type.id == 3) %}
<div id="bandeau_admin" class="dark" style="background:#d8d8d8;padding:10px;">
<div id="contenu_bandeau_admin">
{% if app.user.client.id is defined %}
<span data-link="{{ path ("dtc_change_client_modal", {} ) }}" class="droite btn btn-success btn-sm open-modal-form" data-taille="" data-target="#blocModal" data-toggle="modal">Changer de client</span>
{% else %}
<span data-link="{{ path ("dtc_change_client_modal", {} ) }}" class="droite btn btn-success btn-sm open-modal-form" data-taille="" data-target="#blocModal" data-toggle="modal">Choisir un client</span>
{% endif %}
<b>{{ app.user.prenom }} {{ app.user.nom }} ADMIN</b>.
{% if app.user.client.id is defined %}
<div id="client_rattache">CLIENT : <b id="">{{ app.user.client.reference }} - {{ app.user.client.nom }}</b>.
{% if app.user.type.id == 1 %}
| <a class="dark" href="{{ path ("dtc_client_stats", {} ) }}">Suivi activités</a>
{% endif %}
</div>
{% else %}
<div id="client_rattache"><span class="fa fa-warning text-danger"></span> MERCI DE SÉLECTIONNER UN CLIENT. <span class="fa fa-warning text-danger"></div>
{% endif %}
<div class="both"></div>
</div>
</div>
{% endif %}
<script>
$(document).ready(function(){
$selectArticleRechercheTop = $("#dtc_article_recherche_top_select2").select2({
ajax: {
url: Routing.generate('dtc_article_recherche'),
dataType: 'json',
delay: 250,
data: function (params) { return { q: params.term,page: params.page}; },
processResults: function (data, params) {
params.page = params.page || 1;
return { results: data.items, pagination: { more: (params.page * 10) < data.total_count }};},
cache: true
},
escapeMarkup: function (markup) { return markup; },minimumInputLength: 0,
templateResult:formatRepoSelect2RechercheTop,
templateSelection: formatRepoSelect2RechercheTopSelection,
minimumInputLength: 3,
placeholder: 'Rechercher un produit, une référence.',
language: {
inputTooShort: function(args) {
var remainingChars = args.minimum - args.input.length;
return 'Merci de saisir au moins ' + args.minimum + ' caractères';
},
searching: function() {
return "Recherche en cours…"; // ton texte personnalisé
},
noResults: function() {
return "Aucun résultat trouvé";
},
errorLoading: function () {
return "Les résultats n'ont pas pu être chargés.";
}
},
});
var isEnterKey = false;
var url_fiche_produit_select2 = "";
$('#dtc_article_recherche_top_select2').on('select2:open', function(e) {
// On récupère l'input de recherche interne du dropdown
let searchField = $('.select2-container--open .select2-search__field');
// On retire tout ancien handler keydown pour éviter les doublons
searchField.off('keydown').on('keydown', function(e) {
if (e.key === "Enter" || e.keyCode === 13) {
e.preventDefault(); // empêche la sélection par défaut
isEnterKey = true;
let userInput = $(this).val();
if (url_fiche_produit_select2 === "") {
var url = Routing.generate('dtc_article_liste', {mc: userInput});
window.location.href = url;
e.stopImmediatePropagation();
}
return false;
}
});
});
$("#dtc_article_recherche_top_select2").on('change', function(e) {
if (isEnterKey) {
} else {
var valeur = $(this).val();
var selectedData = $(this).select2('data')[0]; // récupère le premier item sélectionné
var slug = selectedData.slug;
var url = Routing.generate('dtc_article_afficher', {id: valeur,slug:slug});
url_fiche_produit_select2 = url;
window.location.href = url;
e.stopImmediatePropagation();
return false;
}
isEnterKey = false;
});
});
</script>
<!-- top navigation -->
<div class="top_nav">
<div class="nav_menu" style="margin-bottom:0px;">
<div class="nav toggle" style="">
{#
<div style="margin-top:15px;padding-left : 0px;padding-left:5px;" class="gauche" id="icon-kangaroo-mobile">
<a href="/" style="padding:0px;"><i style="font-size:2em;" class="icon-kangaroo-silhouette"></i></a>
</div>
#}
<a style="color:white !important;" id="menu_toggle"><i class="fa fa-bars"></i></a>
<a id="loupe_search" class="visible_mobile" href="#" data-toggle="modal" data-target="#searchModal" class="ml-2 pl-0" style="padding-left:0px;">
<i class="fa fa-search"></i>
</a>
</div>
<nav class="nav navbar-nav">
<div class="_off" id="bloc_select2_recheche_top" style="float:left;width:calc(100% - 350px);position:absolute;">
<div id="dtc_article_recherche_top_select2_conteneur" style="padding-top:9px;">
<select style="width:100%;" id="dtc_article_recherche_top_select2"></select>
</div>
</div>
<ul style="padding-left:0px;" class=" navbar-right">
<li class="nav-item dropdown open" style="padding-left: 15px;">
{% if app.user.id is defined %}
<a href="javascript:;" class="user-profile dropdown-toggle" aria-haspopup="true" id="navbarDropdown" data-toggle="dropdown" aria-expanded="false">
<img src="/images/avatar.png" alt="">
<span style="white-space:nowrap;" class="masquer_mobile_absolute">{{ app.user.prenom }} {{ app.user.nom }}</span>
</a>
{% else %}
<a href="/login" class="user-profile">
<img src="/images/avatar.png" alt="">
<span style="white-space:nowrap;" class="masquer_mobile_absolute">Se connecter</span>
</a>
{% endif %}
<div class="dropdown-menu dropdown-usermenu pull-right" aria-labelledby="navbarDropdown">
{% if app.user.id is defined %}
<a class="dropdown-item" href="{{ path('dtc_utilisateur_profil') }}"><i style="color:#34495E;font-size:1.35em;" class="fa fa-user pull-right"></i> {{ app.user.prenom }} {{ app.user.nom }}</a>
{% endif %}
<a class="dropdown-item" href="{{ path('dtc_adresse_liste') }}"><i style="color:#34495E;font-size:1.35em;" class="fa fa-book pull-right"></i> Adresses</a>
{# <a class="dropdown-item" href="{{ path('dtc_remise_liste') }}"><i style="color:#34495E;font-size:1.35em;" class=" pull-right">%</i> Remises</a>#}
<a class="dropdown-item" href="{{ path('logout') }}"><i style="color:#34495E;font-size:1.35em;" class="fa fa-power-off pull-right"></i> Déconnexion</a>
{#
<a class="dropdown-item" href="javascript:;">
<span class="badge bg-red pull-right">50%</span>
<span>Settings</span>
</a>
#}
</div>
</li>
{% set panier = dtc_panier.getPanier() %}
<li role="presentation" class="nav-item dropdown open">
<a style="color:white !important;" href="javascript:;" class="dropdown-toggle info-number" id="navbarDropdown1" data-toggle="dropdown" aria-expanded="false">
<i style="" class="fa fa-shopping-cart"></i>
<span style="font-weight:bold;position:inherit;" id="panier-count" class="badge bg-red {% if panier.id is defined and panier.articleCommande|length > 0 %}bounce{% endif %}">{% if panier.id is defined and panier.articleCommande|length > 0 %}{{ panier.articleCommande|length }}{% else %}0{% endif %}</span>
</a>
<ul id="liste-top-panier" class="dropdown-menu list-unstyled msg_list" role="menu" aria-labelledby="navbarDropdown1">
{% if panier.id is defined and panier.articleCommande|length > 0 %}
{% for p in panier.articleCommande %}
<li class="nav-item">
{% set slug = dtc_article.getslugifArticle(p.article) %}
<a class="dropdown-item" href="{{ path("dtc_article_afficher" , { 'id': p.article.id,'slug':slug }) }}">
<span class="image">
{% set images = dtc_image_article.getImageDefaut(p.article.id) %}
{% if images[0] is defined %}
{# <img src="{{ asset(images[0].getUploadDir ~ '/' ~ p.article.id ~ '/' ~ images[0].url) | imagine_filter('400x300') }}" style="width:25%;">#}
<img src="{{ url_image_distant }}/image/800/600/{{ images[0].ulid }}" style="width:25%;">
{% else %}
<img src="{{ asset('images/defaut-img-product.jpg') }}" style="width:25%;">
{% endif %}
</span>
<div class="gauche">
<div>Référence : {{ p.reference }}</div>
<div class="message">Tarif : {{ p.prixAvecRemise|price|raw }} € HT</div>
<div class="message">Quantité : {{ p.quantite }}</div>
</div>
</a>
</li>
{% endfor %}
{% endif %}
<li class="nav-item">
<div class="text-center">
<a href="{{ path('dtc_panier_afficher') }}" class="btn btn-warning d-flex justify-content-center align-items-center" style="width:100%;">
<i class="fa fa-shopping-cart mr-2" style="font-size:0.9em;"></i>
Voir le panier
</a>
</div>
</li>
</ul>
</li>
</ul>
</nav>
</div>
{% set current_path = app.request.attributes.get('_route') %}
{% set tableau_fil = "" %}
{% set tableau_fil = "" %}
{% set objet = "" %}
{% if current_path == "dtc_article_liste" %}
{% set tableau_fil = "DTCArticlesBundle:Article" %}
{% set type_fil = "liste" %}
{% elseif current_path == "dtc_article_afficher" %}
{% set tableau_fil = "DTCArticlesBundle:Article" %}
{% set type_fil = article.libelle %}
{% set objet = article %}
{% endif %}
{% if tableau_fil != "" %}
{% include 'FO/FO/fil_ariane.html.twig' with( {'tableau':tableau_fil ,'type':type_fil,'objet':objet} )%}
{% endif %}
{% if societe.noteService != "" %}
<script>
(function(){
const track = document.getElementById('track');
const speedInput = document.getElementById('speed');
const applyBtn = document.getElementById('apply');
// s'assurer qu'on a au moins deux copies consécutives du contenu pour une boucle continue
function ensureDouble(){
const children = Array.from(track.children);
// si la piste n'a qu'une seule série, on la clone pour avoir une répétition
if(children.length === 1){
const clone = children[0].cloneNode(true);
track.appendChild(clone);
}
}
// calcule et applique la durée d'animation pour que la vitesse soit constante
function applySpeed(pxPerSecond){
// largeur totale de la piste (les deux répétitions)
// on utilise scrollWidth pour prendre en compte le contenu non visible
const totalWidth = track.scrollWidth;
// durée en secondes = (largeur à parcourir (en px) / vitesse en px/s)
// la piste animée parcourt 50% de sa largeur (de 0 à -50%) avant de boucler
// donc distance parcourue = totalWidth * 0.5
const distancePx = totalWidth * 0.5;
const durationSec = Math.max(1, distancePx / pxPerSecond); // minimum 1s
// appliquer la durée via variable CSS
track.style.setProperty('--duration', durationSec + 's');
}
// initialisation
ensureDouble();
// appliquer vitesse initiale tirée du champ
applySpeed(Number(speedInput.value) || 120);
// si la fenêtre est redimensionnée, recalculer la durée
let resizeTimer;
window.addEventListener('resize', ()=>{
clearTimeout(resizeTimer);
resizeTimer = setTimeout(()=> applySpeed(Number(speedInput.value) || 120), 120);
});
// accessible: permet de modifier le texte depuis Javascript si besoin
window.setMarqueeText = function(newText){
// remplace le texte dans les items existants
const items = track.querySelectorAll('.item');
if(items.length === 0){
const d = document.createElement('div'); d.className='item'; d.textContent=newText; track.appendChild(d);
} else {
items.forEach(it => it.textContent = newText);
}
// si on avait une seule série, s'assurer d'une répétition
ensureDouble();
// recalculer durée
applySpeed(Number(speedInput.value) || 120);
};
})();
</script>
{% endif %}
</div>
<!-- /top navigation -->