templates/front/agents/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %} - Des conseillers de proximité{% endblock %}
  3. {% block meta_description %}Les conseillers sont des experts du marché local. Ils vous apporteront une estimation précise et les outils de mise en valeur indispensable telle la visite virtuelle{% endblock %}
  4. {% block content %}
  5. <section id="agents" class="container-fluid">
  6.     <div class="row">
  7.         <div class="order-1 order-md-2 col-md-6  col-xl-7 col-xxl-8 p-0">            
  8.             <div class="map_full bg-light col p-0">   
  9.                 <form id="search_agent" class="filter" style="background-color: #f3f3f3;">
  10.                     <div class="row m-0 pt-3">
  11.                         <div  class="col-xl-6 px-3 px-xl-2 pb-3 pl-xl-3">
  12.                             <div class="auto-search">
  13.                                 <input
  14.                                 type="text"
  15.                                 autocomplete="off"
  16.                                 id="geosearch"
  17.                                 class="full-width form-control"
  18.                                 placeholder="Recherche par Ville"
  19.                                 />
  20.                             </div>
  21.                         </div>
  22.                         <div class="col-xl-6 px-3 px-xl-2 pr-xl-3">
  23.                             <div id="search_agent_name" class="form-group position-relative">
  24.                                 <label class="sr-only required" for="contact_form_nom">Nom</label>
  25.                                 <input id="autoComplete_name" class="form-control" type="text">
  26.                                 <button class="auto-clear hidden" type="button" aria-label="clear text from input"></button>
  27.                             </div>
  28.                         </div>
  29.                     </div>
  30.                 </form>   
  31.                 <div id="agents_map" class="map_container"></div>
  32.             </div>
  33.         </div>    
  34.         <div class="order-2 order-md-1 col-md-6  col-xl-5 col-xxl-4 px-3 px-md-4 px-lg-5 mt-3 mt-md-5">
  35.             <h2 class="section_title" style="font-size:20px">Trouvez le conseiller proche de chez vous !</h2>
  36.             {# <hr class="separateur-rouge" /> #}
  37.             {#
  38.             <img class="img-fluid d-block mb-3 shadow" src="{{ asset('assets/media/agents/G.-Terrin-1024x683.jpg') }}" >
  39.             <p class="px-3">Nos conseillers sont sélectionnés et formés pour vous apporter un maximum de services et de conseils. Un maillage local leur permet d'être encore plus performants. Des outils , des savoirs et une motivation à toutes épreuves composent notre ADN.<br>Contacter votre conseiller local sans aucune hésitation !</p>
  40.             <p class="px-3"><b>Gregory TERRIN, Manager Départemental</b></p> 
  41.             #}
  42.             <div class="owl-carousel my-3" id="list_agents">
  43.                 {% for agent in agents %}
  44.                     {%if agent.rating > 4.5  %}
  45.                     {# {%if agent.id ==  12 %} #}
  46.                     <div class="px-1">
  47.                         <div class="card border-0 bg-dark" data-id="{{ agent.id }}">
  48.                             <a href="{{ path( 'show_agent' , {slug:agent.slug}) }}">
  49.                                 <img class="card-img-top" src="{{ vich_uploader_asset(agent, 'imageFile')|imagine_filter('agent_thumb') }}">
  50.                             </a>
  51.  
  52.                             <div class="card-body p-3 row text-white">
  53.                                 <div class="col-sm-7 col-md-12 col-lg-7 mb-3 mb-sm-0 mb-md-3 mb-lg-0 mb-lg-0 pr-0">
  54.                                     <h5 class="card-title font-weight-bold"><a class="text-white" href="{{ path( 'show_agent' , {slug:agent.slug}) }}">{{ agent }}</a></h5>
  55.                                     <h6 class="card-subtitle text-white d-flex">
  56.                                     <i class="icon-location"></i><span>{{ agent.secteur }}</span>
  57.                                     </h6>
  58.                                 </div>
  59.                                 <div class="col-sm-5 col-md-12 col-lg-5 pl-0">
  60.                                     <div class="text-white text-sm-right  text-md-left text-lg-right pl-3 pl-sm-0 pl-md-3 pl-lg-0">
  61.                                         <span class="d-inline"><img class="" src="{{ asset('assets/img/OS_isotype.svg') }}"  width="20" /></span>
  62.                                         <span class="d-inline">{{ agent.rating|stars('', agent.countReviews) }}</span>
  63.                                     </div>
  64.                                 </div>
  65.                             </div>
  66.                         </div>
  67.                     </div>
  68.                     {% endif %}
  69.                 {% endfor %}    
  70.             </div>
  71.             <div class="px-0 px-md-4">
  72.                 {{ render(controller('App\\Controller\\Front\\HomeController::osKpis')) }}
  73.             </div>
  74.             <div class="text-center mb-5">
  75.                 <img class="img-fluid" src="{{ asset('assets/media/agents/logo_opinion_system.png' ) | imagine_filter('runtime',  {"thumbnail": {"size": [250],  'mode': 'outbound'  }}) }}" />
  76.             </div>
  77.         </div>
  78.     </div>
  79. </section>
  80. {{ source('front/agents/agent-infobox-template.html') }}
  81. {% endblock %}
  82. {% block footer %}
  83. {% endblock %}
  84. {% block stylesheets %}
  85.     {{ parent() }}
  86.     <link rel="stylesheet" href="{{ asset('assets/vendor/OwlCarousel2-2.3.4/dist/assets/owl.carousel.min.css') }}"/>
  87.     <link rel="stylesheet" href="{{ asset('assets/vendor/OwlCarousel2-2.3.4/dist/assets/owl.theme.default.min.css') }}"/>
  88.     {#<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/css/select2.min.css" />#}
  89.     <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
  90.     <link rel="stylesheet" href="{{ asset('assets/vendor/leaflet-control-geocoder/Control.Geocoder.css') }}"/>
  91.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/tomik23/autocomplete@1.6.8/dist/css/autocomplete.min.css"/>
  92. {% endblock %}
  93. {% block javascripts %}
  94.     {{ parent() }}
  95.     <script src="{{ asset('bundles/fosjsrouting/js/router.min.js') }}"></script>
  96.     <script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script>
  97.     <script src="{{ asset('assets/vendor/OwlCarousel2-2.3.4/dist/owl.carousel.min.js') }}"></script>
  98.     <script src="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@8.3.0/dist/js/autoComplete.min.js"></script>
  99.     <script src="{{ asset('assets/vendor/swag.min.js') }}"></script>
  100.     <script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>
  101.     <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
  102.     <script src="https://leaflet.github.io/Leaflet.markercluster/dist/leaflet.markercluster-src.js"></script>
  103.     <script src="{{ asset('assets/vendor/Leaflet.SmoothMarkerBouncing.js') }}"></script>
  104.     {# <script src="{{ asset('assets/js/Control.Geocoder.js') }}"></script> #}
  105.     <script src="{{ asset('assets/js/autocomplete.js') }}"></script>
  106.     <script src="{{ asset('assets/js/base_map.js?v1.0') }}"></script>
  107.     <script src="{{ asset('assets/js/rrose.js') }}"></script>
  108.     <script src="{{ asset('assets/js/auto_complete_geosearch.js') }}"></script>
  109.     <script>
  110.         var datas  = {{ datas|json_encode()|raw }};
  111.         var source_infobox;
  112.         var template_infobox;
  113.         
  114.         jQuery(document).ready(function(){ 
  115.             initHandlebars();
  116.             source_infobox   = $("#infobox-template").html();
  117.             template_infobox  = Handlebars.compile(source_infobox);
  118.             $('#search_agent').trigger("reset");
  119.             // $('#search_agent select').select2({
  120.             //     allowClear: true
  121.             // });
  122.             clusterMarkers.options.disableClusteringAtZoom = 8;
  123.             setMap('agents_map', 8, 8, 16 );
  124.             geoSearch('geosearch', map);
  125.             // map.touchZoom.disable();
  126.             // map.doubleClickZoom.disable();
  127.             // map.boxZoom.disable();
  128.             // map.keyboard.disable();
  129.             map.scrollWheelZoom.disable();
  130.             // map.zoomControl.remove();
  131.             // map.dragging.disable();
  132.             addMarkers(datas, true, false);
  133.             var first_agent_id = $('#list_agents .card').first().data('id');
  134.             bounceMarker(first_agent_id);
  135.             var owl = $("#list_agents").owlCarousel({
  136.                 loop:true,
  137.                 autoplay:true,
  138.                 autoplayTimeout: owl_speed / 2,
  139.                 autoplayHoverPause:true,
  140.                 smartSpeed: 1000,
  141.                 margin:30,
  142.                 nav:false,
  143.                 dots:false,
  144.                 items:1
  145.             });
  146.             owl.on('translated.owl.carousel', function(event) {
  147.                 if($('#geosearch').val() == '' && $('#autoComplete_name').val() == '' ){
  148.                     var current_agent_id = $('#list_agents').find('.active .card').data('id');
  149.                     bounceMarker(current_agent_id);
  150.                 }
  151.             });
  152.             $('#search_agent_name').find('.auto-clear').click(function(){
  153.                 if( $('#search_agent_name').find('ul').length > 0){
  154.                     $('#search_agent_name').find('ul').remove();
  155.                 }
  156.                 $('#autoComplete_name').val('').trigger('change');
  157.                 $('#search_agent_name').find('.auto-clear').addClass('hidden');
  158.             });
  159.             $('#autoComplete_name').change(function(){
  160.                 if($(this).val() == ''){
  161.                     map.closePopup();
  162.                     map.fitBounds(clusterMarkers.getBounds());
  163.                 }
  164.                 else{
  165.                     $('#search_agent_name').find('.auto-clear').removeClass('hidden');
  166.                 }
  167.             });
  168.         });
  169.         function centerMe(e) {
  170.             // retusrn;
  171.             if($('body').width() < 768 ){
  172.                 var pixelPosition = map.latLngToLayerPoint(e.target.getLatLng());
  173.                 var new_y = $('#agents_map').height() /2;
  174.                 pixelPosition.y =  pixelPosition.y -  new_y  + 50 ;
  175.                 var new_latlng  = map.layerPointToLatLng(pixelPosition);
  176.                 map.setView(new_latlng);
  177.             }
  178.             else{
  179.                 map.setView(e.target.getLatLng());
  180.             }
  181.         }
  182.         function geoSearchOnSearch(map) {
  183.             L.Marker.stopAllBouncingMarkers();L.Marker.stopAllBouncingMarkers();
  184.             map.closePopup();
  185.             // $('#autoComplete_name').val('').trigger('change');
  186.             $("#search_agent_name .auto-clear").trigger('click');
  187.         }
  188.         function geoSearchOnSubmit(map, object ) {
  189.             map.closePopup();
  190.         }
  191.         function geoSearchOnReset(map, element) {
  192.             map.fitBounds(clusterMarkers.getBounds());
  193.         } 
  194.         const autoCompleteJS = new autoComplete({
  195.             data: {                              // Data src [Array, Function, Async] | (REQUIRED)
  196.               src: datas,
  197.               key: ["name"],
  198.               cache: false
  199.             },
  200.             sort: (a, b) => {                    // Sort rendered results ascendingly | (Optional)
  201.                 if (a.match < b.match) return -1;
  202.                 if (a.match > b.match) return 1;
  203.                 return 0;
  204.             },
  205.             trigger: {event: ["input", "focus"]},
  206.             placeHolder: "Recherche par nom ou prénom du conseiller",     // Place Holder text                 | (Optional)
  207.             selector: "#autoComplete_name",           // Input field selector              | (Optional)
  208.             observer: true,                      // Input field observer | (Optional)
  209.             threshold: 2,                        // Min. Chars length to start Engine | (Optional)
  210.             debounce: 300,                       // Post duration for engine to start | (Optional)
  211.             searchEngine: "strict",              // Search Engine type/mode           | (Optional)
  212.             diacritics: true,
  213.             resultsList: {                       // Rendered results list object      | (Optional)
  214.                 container: element => {
  215.                     element.setAttribute("id", "autoComplete_list");
  216.                     element.setAttribute("class", "list-unstyled autoComplete_list");
  217.                 },
  218.                 destination: "#autoComplete_name",
  219.                 position: "afterend",
  220.                 element: "ul"
  221.             },
  222.             maxResults: 5,                         // Max. number of rendered results | (Optional)
  223.             highlight: false,                       // Highlight matching results      | (Optional)
  224.             resultItem: {                          // Rendered result item            | (Optional)
  225.                 content: (data, element) => {
  226.                     item = data.value;
  227.                     element.innerHTML = data.match +' ('+item.secteur+')';
  228.                 },
  229.                 element: "li"
  230.             },
  231.             noResults: (dataFeedback, generateList) => {
  232.                 // Generate autoComplete List
  233.                 generateList(autoCompleteJS, dataFeedback, dataFeedback.results);
  234.                 // No Results List Item
  235.                 const result = document.createElement("li");
  236.                 result.setAttribute("class", "no_result");
  237.                 result.setAttribute("tabindex", "1");
  238.                 result.innerHTML = `Pas de résultat pour "${dataFeedback.query}"`;
  239.                 document.querySelector(`#${autoCompleteJS.resultsList.idName}`).appendChild(result);
  240.             },
  241.             onSelection: feedback => {             // Action script onSelection event | (Optional)
  242.                 $(".auto-search .auto-clear").trigger('click');
  243.                 // $('#geosearch').val('').trigger('change');
  244.                 $('#geosearch').blur();
  245.                 document.querySelector("#autoComplete_name").blur();
  246.                 // Prepare User's Selected Value
  247.                 const selection = feedback.selection.value[feedback.selection.key];
  248.                 // Replace Input value with the selected value
  249.                 document.querySelector("#autoComplete_name").value = selection;
  250.                 // Console log autoComplete data feedback
  251.                 // console.log(feedback.selection.value);
  252.                 flyAndOpenPopupMarker(feedback.selection.value.id);
  253.             }
  254.         });
  255.     </script>
  256. {% endblock %}