templates/Nordinfo/Main/proposerevent.html.twig line 1

Open in your IDE?
  1. {% extends 'Nordinfo/Main/base.html.twig' %}
  2. {% block title %}Proposer un évènement - Nord Info
  3. {% endblock %}
  4. {% block body_class %}body-signaler bgColorGrey
  5. {% endblock %}
  6. {% block body %}
  7.   <main role="main" class="mainContent pt-0 pb-0 bgColorHighlightBlue" data-form-validation-step="hidden"
  8.         id="mainContent" tabindex="-1">
  9.     {% if referer is not null %}
  10.       {% set url_back = referer %}
  11.     {% else %}
  12.       {% set url_back = path('info') %}
  13.     {% endif %}
  14.     {% include 'Nordinfo/Main/parts/back_btn.html.twig' with {'back_btn_class':'_list-page'} %}
  15.     <div class="container pt-5">
  16.       <div class="containerPageHeader">
  17.         <h1 class="d-validation-none" data-focus-content-target="initial">Proposer un évènement</h1>
  18.         <h1 class="d-none d-validation-block">Vérifier votre message</h1>
  19.       </div>
  20.       <article class="pt-4">
  21.         <p class="d-validation-none">
  22.           Remplissez le formulaire ci-après pour proposer un évènement.
  23.           Cet évènement intégrera le fil “Agenda” de Nord info une fois validé par l’équipe de modération.
  24.         </p>
  25.         <p class="d-none d-validation-block">
  26.           Vérifiez les informations de votre évènement, répondez à la question de vérification puis cliquez sur Envoyer
  27.         </p>
  28.         <div class="pb-4"></div>
  29.         <p class="text-center d-validation-none">Les champs suivis d'un astérisque (<span class="colorRed">*</span>)
  30.           sont obligatoires</p>
  31.         <div class="alert alert-danger alert-errors" id="alertErrorsContainer">
  32.           <p class="mb-2">Les champ suivants doivent être renseignés :</p>
  33.           <ul class="mb-0" id="alertErrorsList"></ul>
  34.         </div>
  35.         <form action="{{ path('send_form_event') }}" enctype="multipart/form-data" method="POST"
  36.               class="needs-validation formCustom" novalidate>
  37.           <input type="hidden" name="raison">
  38.           <div class="form-validation-overlay mb-5">
  39.             <div class="form-group">
  40.               <div class="__input-wrapper">
  41.                 <div class="__inner">
  42.                   <label for="inputOrganisateur">
  43.                     <span class="label-text">Organisateur de l'évènement <span class="colorRed">*</span></span>
  44.                   </label>
  45.                   <input name="organisateur" type="text" data-paste-clear autocomplete="organization"
  46.                          class="form-control" id="inputOrganisateur" placeholder="" required>
  47.                 </div>
  48.               </div>
  49.             </div>
  50.             <div class="form-group">
  51.               <div class="__input-wrapper">
  52.                 <div class="__inner">
  53.                   <label for="inputEmail">
  54.                     <span class="label-text">Votre adresse courriel (ne sera pas diffusée) (ex : nom@domaine.fr) <span
  55.                         class="colorRed">*</span></span>
  56.                   </label>
  57.                   <input name="email_organisateur" type="email" data-paste-clear class="form-control" id="inputEmail"
  58.                          placeholder="" required>
  59.                 </div>
  60.               </div>
  61.             </div>
  62.             <div class="form-group">
  63.               <div class="__input-wrapper">
  64.                 <div class="__inner">
  65.                   <label for="inputTitre">
  66.                     <span class="label-text">Titre <span class="colorRed">*</span></span>
  67.                   </label>
  68.                   <input name="titre" type="text" data-paste-clear class="form-control" id="inputTitre" required>
  69.                 </div>
  70.               </div>
  71.             </div>
  72.             <div class="form-group">
  73.               <div class="__input-wrapper _select _label-hidden">
  74.                 <div class="__inner" style="position:relative;">
  75.                   <label for="selectCategory">
  76.                     <span class="label-text">Type de manifestation <span class="colorRed">*</span></span>
  77.                   </label>
  78.                   <select name="type" class="form-control" id="selectCategory" required>
  79.                     {% for type in types %}
  80.                       <option value="{{ type.id }}">{{ type.displayName }}</option>
  81.                     {% endfor %}
  82.                   </select>
  83.                 </div>
  84.               </div>
  85.             </div>
  86.             <div class="form-group" data-form-validation-step-file-wrapper>
  87.               <div class="inputFileWrapper">
  88.                 <input id="max_id" type="hidden" name="MAX_FILE_SIZE" value="2000000"/>
  89.                 <input onchange="upload_check()" type="file" name="image" id="file-1" class="inputfile inputfile-1"
  90.                        accept="image/jpeg,image/gif,image/png"/>
  91.                 <label for="file-1" class="label-file">
  92.                   {{ source('svg/icon_attachment.svg') }}
  93.                   <span>
  94.                                         <span class="label-text">Ajouter un visuel (affiche, flyer, etc.)</span>
  95.                                         <br>
  96.                                         <span class="fsXs">2 Mo maximum. JPEG, JPG, GIF, PNG</span>
  97.                                     </span>
  98.                 </label>
  99.               </div>
  100.               <script>
  101.                 function upload_check() {
  102.                   var upl = document.getElementById("file-1");
  103.                   var max = document.getElementById("max_id").value;
  104.                   if (upl.files[0].size > max) {
  105.                     alert("Fichier trop volumineux");
  106.                     upl.value = "";
  107.                   }
  108.                 }
  109.               </script>
  110.               <script>
  111.                 'use strict';
  112.                 (function (document, window, index) {
  113.                   var inputs = document.querySelectorAll('.inputfile');
  114.                   Array.prototype.forEach.call(inputs, function (input) {
  115.                     var label = input.nextElementSibling,
  116.                       labelVal = label.innerHTML;
  117.                     input.addEventListener('change', function (e) {
  118.                       var fileName = '';
  119.                       if (this.files && this.files.length > 1)
  120.                         fileName = (this.getAttribute('data-multiple-caption') || '').replace('{count}', this.files.length);
  121.                       else
  122.                         fileName = e.target.value.split('\\').pop();
  123.                       if (fileName)
  124.                         label.querySelector('span').innerHTML = fileName;
  125.                       else
  126.                         label.innerHTML = labelVal;
  127.                     });
  128.                     // Firefox bug fix
  129.                     input.addEventListener('focus', function () {
  130.                       input.classList.add('has-focus');
  131.                     });
  132.                     input.addEventListener('blur', function () {
  133.                       input.classList.remove('has-focus');
  134.                     });
  135.                   });
  136.                 }(document, window, 0));
  137.               </script>
  138.             </div>
  139.             <div class="form-group mb-5">
  140.               <div class="form-check">
  141.                 <input class="form-check-input" id="checkImageDroit" type="checkbox" value="" name="image_droit">
  142.                 <label class="form-check-label" for="checkImageDroit">
  143.                   <span class="label-text">Je certifie avoir les droits sur cette image</span>
  144.                 </label>
  145.               </div>
  146.             </div>
  147.             <div class="form-group">
  148.               <div class="__input-wrapper">
  149.                 <div class="__inner">
  150.                   <label for="inputLieu">
  151.                     <span class="label-text">Lieu (Salle, lieu dit, Bâtiment) <span class="colorRed">*</span></span>
  152.                   </label>
  153.                   <input name="lieu" type="text" data-paste-clear class="form-control" id="inputLieu" required>
  154.                 </div>
  155.               </div>
  156.             </div>
  157.             <div class="form-group">
  158.               <div class="__input-wrapper">
  159.                 <div class="__inner">
  160.                   <label for="inputAdresse">
  161.                     <span class="label-text">Adresse <span class="colorRed">*</span></span>
  162.                   </label>
  163.                   <input name="adresse" data-paste-clear type="text" class="form-control"
  164.                          id="inputAdresse" placeholder="" required>
  165.                   <input type="hidden" id="adresseSelected" value="false" />
  166.                   <div class="address-feedback position-absolute list-group top-0"
  167.                        style="z-index:1100;top: calc(100% - 14px);width: calc(100% - 63px);">
  168.                   </div>
  169.                 </div>
  170.               </div>
  171.             </div>
  172.             <div class="row mx-n2">
  173.               <div class="col-12 col-md-6 px-2">
  174.                 <div class="form-group">
  175.                   <div class="__input-wrapper">
  176.                     <div class="__inner">
  177.                       <label for="inputCodePostal">
  178.                         <span class="label-text">Code postal <span class="colorRed">*</span></span>
  179.                       </label>
  180.                       <input name="code_postal" type="text" data-paste-clear class="form-control" id="inputCodePostal" required>
  181.                     </div>
  182.                   </div>
  183.                 </div>
  184.               </div>
  185.               <div class="col-12 col-md-6 px-2">
  186.                 <div class="form-group containerAutocomplete">
  187.                   <div class="__input-wrapper">
  188.                     <div class="__inner">
  189.                       <label for="inputVille">
  190.                         <span class="label-text">Ville <span class="colorRed">*</span></span>
  191.                       </label>
  192.                       <input type="text" data-paste-clear autocomplete="randomstring" class="form-control" name="ville"
  193.                              id="inputVille" placeholder="" required>
  194.                     </div>
  195.                   </div>
  196.                 </div>
  197.               </div>
  198.             </div>
  199.             <div class="row mx-n2">
  200.               <div class="col-12 col-md-6 px-2">
  201.                 <div class="form-group">
  202.                   <div class="__input-wrapper _select">
  203.                     <div class="__inner">
  204.                       <label for="inputDateDebut">
  205.                         <span class="label-text">Date de début <span class="colorRed">*</span></span>
  206.                       </label>
  207.                       <input name="date_debut" autocomplete="off" type="text" class="form-control datetimepicker-input"
  208.                              id="inputDateDebut" placeholder="JJ/MM/AAAA" required>
  209.                     </div>
  210.                   </div>
  211.                 </div>
  212.               </div>
  213.               <div class="col-12 col-md-6 px-2">
  214.                 <div class="form-group">
  215.                   <div class="__input-wrapper _select">
  216.                     <div class="__inner">
  217.                       <label for="inputDateFin">
  218.                         <span class="label-text">Date de fin <span class="colorRed">*</span></span>
  219.                       </label>
  220.                       <input name="date_fin" autocomplete="off" type="text" class="form-control datetimepicker-input-2"
  221.                              id="inputDateFin" placeholder="JJ/MM/AAAA" disabled required>
  222.                     </div>
  223.                   </div>
  224.                 </div>
  225.               </div>
  226.               <script type="text/javascript">
  227.                 $(function () {
  228.                   jQuery.datetimepicker.setLocale('fr');
  229.                   jQuery('.datetimepicker-input').datetimepicker({
  230.                     lang: 'fr',
  231.                     timepicker: false,
  232.                     format: 'd/m/Y',
  233.                     dayOfWeekStart: 1,
  234.                     minDate: 0,
  235.                     timepickerScrollbar: false,
  236.                     scrollMonth: false,
  237.                     scrollInput: false,
  238.                     scrollTime: false,
  239.                     onSelectDate: function (dp, $input) {
  240.                       $('.datetimepicker-input-2').prop("disabled", false).val('');
  241.                       jQuery('.datetimepicker-input-2').datetimepicker({
  242.                         lang: 'fr',
  243.                         timepicker: false,
  244.                         format: 'd/m/Y',
  245.                         dayOfWeekStart: 1,
  246.                         minDate: dp,
  247.                         timepickerScrollbar: false,
  248.                         scrollMonth: false,
  249.                         scrollInput: false,
  250.                         scrollTime: false
  251.                       });
  252.                     }
  253.                   });
  254.                 });
  255.               </script>
  256.             </div>
  257.             <div class="row mx-n2">
  258.               <div class="col-12 col-md-6 px-2">
  259.                 <div class="form-group">
  260.                   <div class="__input-wrapper _select">
  261.                     <div class="__inner">
  262.                       <label for="inputHeureDebut">
  263.                         <span class="label-text">Heure de début <span class="colorRed">*</span></span>
  264.                       </label>
  265.                       <input name="heure_debut" autocomplete="off" type="text" class="form-control timepicker-input"
  266.                              id="inputHeureDebut" placeholder="00:00" required>
  267.                     </div>
  268.                   </div>
  269.                 </div>
  270.               </div>
  271.               <div class="col-12 col-md-6 px-2">
  272.                 <div class="form-group">
  273.                   <div class="__input-wrapper _select">
  274.                     <div class="__inner">
  275.                       <label for="inputHeureFin">
  276.                         <span class="label-text">Heure de fin <span class="colorRed">*</span></span>
  277.                       </label>
  278.                       <input name="heure_fin" autocomplete="off" type="text" class="form-control timepicker-input-2"
  279.                              id="inputHeureFin" placeholder="00:00" disabled required>
  280.                     </div>
  281.                   </div>
  282.                 </div>
  283.               </div>
  284.               <script type="text/javascript">
  285.                 $(function () {
  286.                   jQuery.datetimepicker.setLocale('fr');
  287.                   jQuery('.timepicker-input').datetimepicker({
  288.                     datepicker: false,
  289.                     timepicker: true,
  290.                     format: 'H:i',
  291.                     allowTimes: [
  292.                       '09:00', '09:30',
  293.                       '10:00', '10:30',
  294.                       '11:00', '11:30',
  295.                       '12:00', '12:30',
  296.                       '13:00', '13:30',
  297.                       '14:00', '14:30',
  298.                       '15:00', '15:30',
  299.                       '16:00', '16:30',
  300.                       '17:00', '17:30',
  301.                       '18:00', '18:30',
  302.                       '19:00', '19:30',
  303.                       '20:00', '20:30',
  304.                       '21:00', '21:30',
  305.                       '22:00', '22:30',
  306.                       '23:00'
  307.                     ],
  308.                     onSelectTime: function (dp, $input) {
  309.                       $('.timepicker-input-2').prop("disabled", false).val('');
  310.                       jQuery('.timepicker-input-2').datetimepicker({
  311.                         datepicker: false,
  312.                         timepicker: true,
  313.                         format: 'H:i',
  314.                         allowTimes: [
  315.                           '09:00', '09:30',
  316.                           '10:00', '10:30',
  317.                           '11:00', '11:30',
  318.                           '12:00', '12:30',
  319.                           '13:00', '13:30',
  320.                           '14:00', '14:30',
  321.                           '15:00', '15:30',
  322.                           '16:00', '16:30',
  323.                           '17:00', '17:30',
  324.                           '18:00', '18:30',
  325.                           '19:00', '19:30',
  326.                           '20:00', '20:30',
  327.                           '21:00', '21:30',
  328.                           '22:00', '22:30',
  329.                           '23:00'
  330.                         ],
  331.                       });
  332.                     }
  333.                   });
  334.                 });
  335.               </script>
  336.               <div class="form-group d-none">
  337.                 <div class="__input-wrapper _textarea">
  338.                   <div class="__inner border-bottom-0">
  339.                     <label for="inputHoraires">
  340.                       <span class="label-text">Horaires</span>
  341.                     </label>
  342.                     <textarea name="horaires" data-paste-clear class="form-control js-textarea-counter" maxlength="500"
  343.                               id="inputHoraires" placeholder="" rows="3"></textarea>
  344.                   </div>
  345.                 </div>
  346.               </div>
  347.             </div>
  348.             <div class="form-group">
  349.               <div class="__input-wrapper _textarea">
  350.                 <div class="__inner border-bottom-0">
  351.                   <label for="inputTarifs">
  352.                     <span class="label-text">Tarifs</span>
  353.                   </label>
  354.                   <textarea name="tarifs" data-paste-clear class="form-control js-textarea-counter" maxlength="500"
  355.                             id="inputTarifs" placeholder="" rows="3"></textarea>
  356.                 </div>
  357.               </div>
  358.             </div>
  359.             <div class="form-group">
  360.               <div class="__input-wrapper _textarea">
  361.                 <div class="__inner border-bottom-0">
  362.                   <label for="inputPresentation">
  363.                     <span class="label-text">Présentation (texte brut uniquement)<span class="colorRed">*</span></span>
  364.                   </label>
  365.                   <textarea name="presentation" data-paste-clear class="form-control js-textarea-counter"
  366.                             id="inputPresentation" placeholder="" rows="3" maxlength="2500" required></textarea>
  367.                 </div>
  368.               </div>
  369.             </div>
  370.             <div class="form-group">
  371.               <div class="__input-wrapper">
  372.                 <div class="__inner">
  373.                   <label for="inputEmail2">
  374.                     <span class="label-text">Adresse courriel pour informations complémentaires et/ou réservation (ex : nom@domaine.fr)</span>
  375.                   </label>
  376.                   <input name="email" type="text" data-paste-clear autocomplete="email" class="form-control"
  377.                          id="inputEmail2" placeholder="">
  378.                 </div>
  379.               </div>
  380.             </div>
  381.             <div class="form-group">
  382.               <div class="__input-wrapper">
  383.                 <div class="__inner">
  384.                   <label for="inputTelephone">
  385.                     <span
  386.                       class="label-text">Contact téléphonique pour informations complémentaires et/ou réservation</span>
  387.                   </label>
  388.                   <input name="telephone" type="tel" data-paste-clear class="form-control" id="inputTelephone"
  389.                          placeholder="(+33) ...">
  390.                 </div>
  391.               </div>
  392.             </div>
  393.             <div class="form-group">
  394.               <div class="__input-wrapper">
  395.                 <div class="__inner">
  396.                   <label for="inputLien1">
  397.                                         <span class="label-text">
  398.                                             Lien utile 1 (site internet, Facebook, Instagram, Twitter, etc.)
  399.                                         </span>
  400.                   </label>
  401.                   <input name="lien1" type="text" data-paste-clear class="form-control" id="inputLien1"
  402.                          placeholder="https://">
  403.                 </div>
  404.               </div>
  405.             </div>
  406.             <div class="form-group">
  407.               <div class="__input-wrapper">
  408.                 <div class="__inner">
  409.                   <label for="inputLien2">
  410.                                         <span class="label-text">
  411.                                             Lien utile 2 (site internet, Facebook, Instagram, Twitter, etc.)
  412.                                         </span>
  413.                   </label>
  414.                   <input name="lien2" type="text" data-paste-clear class="form-control" id="inputLien2"
  415.                          placeholder="https://">
  416.                 </div>
  417.               </div>
  418.             </div>
  419.             <div class="form-group mb-5">
  420.               <div class="form-check">
  421.                 <input class="form-check-input" type="checkbox" value="" name="checkbox" id="invalidCheck" required>
  422.                 <label class="form-check-label" for="invalidCheck">
  423.                   <span class="d-none label-text">Accepter les Conditions Générales d'Utilisation</span>
  424.                   <span>Accepter les</span>
  425.                   <a href="/pages-legales/cgu">Conditions Générales d'Utilisation</a>&nbsp;<span
  426.                     class="colorRed">*</span>
  427.                 </label>
  428.               </div>
  429.             </div>
  430.           </div>
  431.           <div class="form-group d-none d-validation-block">
  432.             <input type="hidden" name="nb1" value="{{ caps['valeur1']['valeur'] }}">
  433.             <input type="hidden" name="nb2" value="{{ caps['valeur2']['valeur'] }}">
  434.             <div class="__input-wrapper _captcha _propose-event">
  435.               <div class="__inner">
  436.                 <label for="inputCaptcha">Répondez à cette question de vérification avant d’envoyer votre évènement :
  437.                   Quel est le résultat de ({{ caps['valeur1']['libelle'] }}
  438.                   +
  439.                   {{ caps['valeur2']['libelle'] }}) (en chiffre)
  440.                   <span class="colorRed d-validation-none">*</span>
  441.                 </label>
  442.                 <input class="form-control _captcha" type="text" id="inputCaptcha" name="captcha" data-focus-content-target="verify">
  443.               </div>
  444.             </div>
  445.           </div>
  446.           <div class="__buttons-wrapper">
  447.             <button class="btn btnFormSubmit d-none d-validation-inline-block _modify" data-form-validation-step-toggle>
  448.               <span>MODIFIER</span>
  449.             </button>
  450.             <button class="btn btnFormSubmit d-none d-validation-inline-block" type="submit">
  451.               <span>ENVOYER</span>
  452.             </button>
  453.             <button class="btn btnFormSubmit d-validation-none _validation" data-form-validation-step-toggle>
  454.               <span>VALIDER</span>
  455.             </button>
  456.           </div>
  457.         </form>
  458.         <div style="padding-bottom:100px;"></div>
  459.       </article>
  460.     </div>
  461.   </main>
  462. {% endblock %}
  463. {% block javascripts %}
  464.   {{ parent() }}
  465.   {% include('Nordinfo/Main/parts/autocompleteCommune.js.html.twig') with {'autocomplete_selector':'inputVille'} %}
  466.   <script>
  467.     // FACULTATIF : Pour l'infobulle bootstrap du champ #inputAdresse
  468.     $(function () {
  469.       $('[data-toggle="tooltip"]').tooltip();
  470.     });
  471.     /*
  472.     * Script de gestion de recherche avec l'API adresses.data.gouv.fr
  473.     * 
  474.     */
  475.     var currentFocus = -1;
  476.     var fetchTrigger = 0;
  477.     // Fonction pour mettre en forme visuellement un résultat sélectionné
  478.     function setActive() {
  479.       var nbVal = $("div.address-feedback a").length;
  480.       if (!nbVal)
  481.         return false; // Si on n'a aucun résultat listé, on s'arrête là.
  482.       // On commence par nettoyer une éventuelle sélection précédente
  483.       $('div.address-feedback a').removeClass("active");
  484.       // Bidouille mathématique pour contraindre le focus dans la plage du nombre de résultats
  485.       currentFocus = ((currentFocus + nbVal - 1) % nbVal) + 1;
  486.       $('div.address-feedback a:nth-child(' + currentFocus + ')').addClass("active");
  487.     }
  488.     // Au clic sur une adresse suggérée, on ventile l'adresse dans les champs appropriés. On espionne mousedown plutôt que click pour l'attraper avant la perte de focus du champ adresse.
  489.     $('div.address-feedback').on("mousedown", "a", function (event) {
  490.       // Stop la propagation par défaut
  491.       event.preventDefault();
  492.       event.stopPropagation();
  493.       $("#inputAdresse").val($(this).attr("data-name"));
  494.       $("#inputCodePostal").val($(this).attr("data-postcode"));
  495.       $("#inputVille").val($(this).attr("data-city"));
  496.       $("#adresseSelected").val("true");
  497.       $("#inputAdresse").removeClass("error").parent().find('div.error').remove();
  498.       $('.address-feedback').empty();
  499.     });
  500.     // On espionne le clavier dans le champ adresse pour déclencher les actions qui vont bien
  501.     $("#inputAdresse").keyup(function (event) {
  502.       $("#adresseSelected").val("false");
  503.       // Stop la propagation par défaut
  504.       event.preventDefault();
  505.       event.stopPropagation();
  506.       if (event.keyCode === 38) { // Flèche HAUT
  507.         currentFocus--;
  508.         setActive();
  509.         return false;
  510.       } else if (event.keyCode === 40) { // Flèche BAS
  511.         currentFocus++;
  512.         setActive();
  513.         return false;
  514.       } else if (event.keyCode === 13) { // Touche ENTREE
  515.         if (currentFocus > 0) {
  516.           // On simule un clic sur l'élément actif
  517.           $("div.address-feedback a:nth-child(" + currentFocus + ")").mousedown();
  518.         }
  519.         return false;
  520.       }
  521.       // Si on arrive ici, c'est que l'user a avancé dans la saisie : on réinitialise le curseur de sélection.
  522.       $('div.address-feedback a').removeClass("active");
  523.       currentFocus = 0;
  524.       // On annule une éventuelle précédente requête en attente
  525.       clearTimeout(fetchTrigger);
  526.       // Si le champ adresse est vide, on nettoie la liste des suggestions et on ne lance pas de requête.
  527.       let rue = $("#inputAdresse").val();
  528.       if (rue.length === 0) {
  529.         $('.address-feedback').empty();
  530.         return false;
  531.       }
  532.       // On lance une minuterie pour une requête vers l'API.
  533.       fetchTrigger = setTimeout(function () {
  534.         // On lance la requête sur l'API
  535.         $.get('https://api-adresse.data.gouv.fr/search/', {
  536.           q: rue,
  537.           limit: 15,
  538.           autocomplete: 1
  539.         }, function (data, status, xhr) {
  540.           let liste = "";
  541.           $.each(data.features, function (i, obj) {
  542.             // Données phase 1 (obj.properties.label) & phase 2 : name, postcode, city.
  543.             // J'ajoute chaque élément dans une liste
  544.             let cooladdress = obj.properties.name + " " + obj.properties.postcode + " <strong>" + obj.properties.city + "</strong>";
  545.             liste += '<a class="list-group-item list-group-item-action py-1" href="#" name="' + obj.properties.label + '" data-name="' + obj.properties.name + '" data-postcode="' + obj.properties.postcode + '" data-city="' + obj.properties.city + '">' + cooladdress + '</a>';
  546.           });
  547.           $('.address-feedback').html(liste);
  548.         }, 'json');
  549.       }, 500);
  550.     });
  551.     // On cache la liste si le champ adresse perd le focus
  552.     $("#inputAdresse").focusout(function () {
  553.       $('.address-feedback').empty();
  554.     });
  555.     // On annule le comportement par défaut des touches entré et flèches si une liste de suggestion d'adresses est affichée
  556.     $("#inputAdresse").keydown(function (e) {
  557.       if ($("div.address-feedback a").length > 0 && (e.keyCode === 38 || e.keyCode === 40 || e.keyCode === 13)) {
  558.         e.preventDefault();
  559.       }
  560.     });
  561.   </script>
  562.   <script>
  563.     (function() {
  564.       window.addEventListener('load', function() {
  565.         const form = document.querySelector('.formCustom');
  566.         if (form) {
  567.           form.reset();
  568.           clearCustomElements();
  569.         }
  570.       });
  571.       
  572.       function clearCustomElements() {
  573.         const fileInputs = document.querySelectorAll('input[type="file"]');
  574.         fileInputs.forEach(input => {
  575.           input.value = '';
  576.           const label = input.nextElementSibling;
  577.           if (label && label.classList.contains('label-file')) {
  578.             const span = label.querySelector('span span');
  579.             if (span) {
  580.               span.innerHTML = 'Ajouter un visuel (affiche, flyer, etc.)';
  581.             }
  582.           }
  583.         });
  584.         const disabledInputs = document.querySelectorAll('input[disabled]');
  585.         disabledInputs.forEach(input => {
  586.           input.value = '';
  587.         });
  588.         const addressFeedback = document.querySelector('.address-feedback');
  589.         if (addressFeedback) {
  590.           addressFeedback.innerHTML = '';
  591.         }
  592.         const form = document.querySelector('.formCustom');
  593.         if (form) {
  594.           form.classList.remove('was-validated');
  595.         }
  596.         const errorContainer = document.getElementById('alertErrorsContainer');
  597.         if (errorContainer) {
  598.           errorContainer.style.display = 'none';
  599.         }
  600.         const dateInputs = document.querySelectorAll('.datetimepicker-input, .datetimepicker-input-2, .timepicker-input, .timepicker-input-2');
  601.         dateInputs.forEach(input => {
  602.           input.value = '';
  603.           if (input.classList.contains('datetimepicker-input-2') || input.classList.contains('timepicker-input-2')) {
  604.             input.disabled = true;
  605.           }
  606.         });
  607.       }
  608.     })();
  609.   </script>
  610. {% endblock %}