{% extends 'Nordinfo/Main/base.html.twig' %}
{% block title %}Proposer un évènement - Nord Info
{% endblock %}
{% block body_class %}body-signaler bgColorGrey
{% endblock %}
{% block body %}
<main role="main" class="mainContent pt-0 pb-0 bgColorHighlightBlue" data-form-validation-step="hidden"
id="mainContent" tabindex="-1">
{% if referer is not null %}
{% set url_back = referer %}
{% else %}
{% set url_back = path('info') %}
{% endif %}
{% include 'Nordinfo/Main/parts/back_btn.html.twig' with {'back_btn_class':'_list-page'} %}
<div class="container pt-5">
<div class="containerPageHeader">
<h1 class="d-validation-none" data-focus-content-target="initial">Proposer un évènement</h1>
<h1 class="d-none d-validation-block">Vérifier votre message</h1>
</div>
<article class="pt-4">
<p class="d-validation-none">
Remplissez le formulaire ci-après pour proposer un évènement.
Cet évènement intégrera le fil “Agenda” de Nord info une fois validé par l’équipe de modération.
</p>
<p class="d-none d-validation-block">
Vérifiez les informations de votre évènement, répondez à la question de vérification puis cliquez sur Envoyer
</p>
<div class="pb-4"></div>
<p class="text-center d-validation-none">Les champs suivis d'un astérisque (<span class="colorRed">*</span>)
sont obligatoires</p>
<div class="alert alert-danger alert-errors" id="alertErrorsContainer">
<p class="mb-2">Les champ suivants doivent être renseignés :</p>
<ul class="mb-0" id="alertErrorsList"></ul>
</div>
<form action="{{ path('send_form_event') }}" enctype="multipart/form-data" method="POST"
class="needs-validation formCustom" novalidate>
<input type="hidden" name="raison">
<div class="form-validation-overlay mb-5">
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputOrganisateur">
<span class="label-text">Organisateur de l'évènement <span class="colorRed">*</span></span>
</label>
<input name="organisateur" type="text" data-paste-clear autocomplete="organization"
class="form-control" id="inputOrganisateur" placeholder="" required>
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputEmail">
<span class="label-text">Votre adresse courriel (ne sera pas diffusée) (ex : nom@domaine.fr) <span
class="colorRed">*</span></span>
</label>
<input name="email_organisateur" type="email" data-paste-clear class="form-control" id="inputEmail"
placeholder="" required>
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputTitre">
<span class="label-text">Titre <span class="colorRed">*</span></span>
</label>
<input name="titre" type="text" data-paste-clear class="form-control" id="inputTitre" required>
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper _select _label-hidden">
<div class="__inner" style="position:relative;">
<label for="selectCategory">
<span class="label-text">Type de manifestation <span class="colorRed">*</span></span>
</label>
<select name="type" class="form-control" id="selectCategory" required>
{% for type in types %}
<option value="{{ type.id }}">{{ type.displayName }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
<div class="form-group" data-form-validation-step-file-wrapper>
<div class="inputFileWrapper">
<input id="max_id" type="hidden" name="MAX_FILE_SIZE" value="2000000"/>
<input onchange="upload_check()" type="file" name="image" id="file-1" class="inputfile inputfile-1"
accept="image/jpeg,image/gif,image/png"/>
<label for="file-1" class="label-file">
{{ source('svg/icon_attachment.svg') }}
<span>
<span class="label-text">Ajouter un visuel (affiche, flyer, etc.)</span>
<br>
<span class="fsXs">2 Mo maximum. JPEG, JPG, GIF, PNG</span>
</span>
</label>
</div>
<script>
function upload_check() {
var upl = document.getElementById("file-1");
var max = document.getElementById("max_id").value;
if (upl.files[0].size > max) {
alert("Fichier trop volumineux");
upl.value = "";
}
}
</script>
<script>
'use strict';
(function (document, window, index) {
var inputs = document.querySelectorAll('.inputfile');
Array.prototype.forEach.call(inputs, function (input) {
var label = input.nextElementSibling,
labelVal = label.innerHTML;
input.addEventListener('change', function (e) {
var fileName = '';
if (this.files && this.files.length > 1)
fileName = (this.getAttribute('data-multiple-caption') || '').replace('{count}', this.files.length);
else
fileName = e.target.value.split('\\').pop();
if (fileName)
label.querySelector('span').innerHTML = fileName;
else
label.innerHTML = labelVal;
});
// Firefox bug fix
input.addEventListener('focus', function () {
input.classList.add('has-focus');
});
input.addEventListener('blur', function () {
input.classList.remove('has-focus');
});
});
}(document, window, 0));
</script>
</div>
<div class="form-group mb-5">
<div class="form-check">
<input class="form-check-input" id="checkImageDroit" type="checkbox" value="" name="image_droit">
<label class="form-check-label" for="checkImageDroit">
<span class="label-text">Je certifie avoir les droits sur cette image</span>
</label>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputLieu">
<span class="label-text">Lieu (Salle, lieu dit, Bâtiment) <span class="colorRed">*</span></span>
</label>
<input name="lieu" type="text" data-paste-clear class="form-control" id="inputLieu" required>
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputAdresse">
<span class="label-text">Adresse <span class="colorRed">*</span></span>
</label>
<input name="adresse" data-paste-clear type="text" class="form-control"
id="inputAdresse" placeholder="" required>
<input type="hidden" id="adresseSelected" value="false" />
<div class="address-feedback position-absolute list-group top-0"
style="z-index:1100;top: calc(100% - 14px);width: calc(100% - 63px);">
</div>
</div>
</div>
</div>
<div class="row mx-n2">
<div class="col-12 col-md-6 px-2">
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputCodePostal">
<span class="label-text">Code postal <span class="colorRed">*</span></span>
</label>
<input name="code_postal" type="text" data-paste-clear class="form-control" id="inputCodePostal" required>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 px-2">
<div class="form-group containerAutocomplete">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputVille">
<span class="label-text">Ville <span class="colorRed">*</span></span>
</label>
<input type="text" data-paste-clear autocomplete="randomstring" class="form-control" name="ville"
id="inputVille" placeholder="" required>
</div>
</div>
</div>
</div>
</div>
<div class="row mx-n2">
<div class="col-12 col-md-6 px-2">
<div class="form-group">
<div class="__input-wrapper _select">
<div class="__inner">
<label for="inputDateDebut">
<span class="label-text">Date de début <span class="colorRed">*</span></span>
</label>
<input name="date_debut" autocomplete="off" type="text" class="form-control datetimepicker-input"
id="inputDateDebut" placeholder="JJ/MM/AAAA" required>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 px-2">
<div class="form-group">
<div class="__input-wrapper _select">
<div class="__inner">
<label for="inputDateFin">
<span class="label-text">Date de fin <span class="colorRed">*</span></span>
</label>
<input name="date_fin" autocomplete="off" type="text" class="form-control datetimepicker-input-2"
id="inputDateFin" placeholder="JJ/MM/AAAA" disabled required>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
jQuery.datetimepicker.setLocale('fr');
jQuery('.datetimepicker-input').datetimepicker({
lang: 'fr',
timepicker: false,
format: 'd/m/Y',
dayOfWeekStart: 1,
minDate: 0,
timepickerScrollbar: false,
scrollMonth: false,
scrollInput: false,
scrollTime: false,
onSelectDate: function (dp, $input) {
$('.datetimepicker-input-2').prop("disabled", false).val('');
jQuery('.datetimepicker-input-2').datetimepicker({
lang: 'fr',
timepicker: false,
format: 'd/m/Y',
dayOfWeekStart: 1,
minDate: dp,
timepickerScrollbar: false,
scrollMonth: false,
scrollInput: false,
scrollTime: false
});
}
});
});
</script>
</div>
<div class="row mx-n2">
<div class="col-12 col-md-6 px-2">
<div class="form-group">
<div class="__input-wrapper _select">
<div class="__inner">
<label for="inputHeureDebut">
<span class="label-text">Heure de début <span class="colorRed">*</span></span>
</label>
<input name="heure_debut" autocomplete="off" type="text" class="form-control timepicker-input"
id="inputHeureDebut" placeholder="00:00" required>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-6 px-2">
<div class="form-group">
<div class="__input-wrapper _select">
<div class="__inner">
<label for="inputHeureFin">
<span class="label-text">Heure de fin <span class="colorRed">*</span></span>
</label>
<input name="heure_fin" autocomplete="off" type="text" class="form-control timepicker-input-2"
id="inputHeureFin" placeholder="00:00" disabled required>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
jQuery.datetimepicker.setLocale('fr');
jQuery('.timepicker-input').datetimepicker({
datepicker: false,
timepicker: true,
format: 'H:i',
allowTimes: [
'09:00', '09:30',
'10:00', '10:30',
'11:00', '11:30',
'12:00', '12:30',
'13:00', '13:30',
'14:00', '14:30',
'15:00', '15:30',
'16:00', '16:30',
'17:00', '17:30',
'18:00', '18:30',
'19:00', '19:30',
'20:00', '20:30',
'21:00', '21:30',
'22:00', '22:30',
'23:00'
],
onSelectTime: function (dp, $input) {
$('.timepicker-input-2').prop("disabled", false).val('');
jQuery('.timepicker-input-2').datetimepicker({
datepicker: false,
timepicker: true,
format: 'H:i',
allowTimes: [
'09:00', '09:30',
'10:00', '10:30',
'11:00', '11:30',
'12:00', '12:30',
'13:00', '13:30',
'14:00', '14:30',
'15:00', '15:30',
'16:00', '16:30',
'17:00', '17:30',
'18:00', '18:30',
'19:00', '19:30',
'20:00', '20:30',
'21:00', '21:30',
'22:00', '22:30',
'23:00'
],
});
}
});
});
</script>
<div class="form-group d-none">
<div class="__input-wrapper _textarea">
<div class="__inner border-bottom-0">
<label for="inputHoraires">
<span class="label-text">Horaires</span>
</label>
<textarea name="horaires" data-paste-clear class="form-control js-textarea-counter" maxlength="500"
id="inputHoraires" placeholder="" rows="3"></textarea>
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper _textarea">
<div class="__inner border-bottom-0">
<label for="inputTarifs">
<span class="label-text">Tarifs</span>
</label>
<textarea name="tarifs" data-paste-clear class="form-control js-textarea-counter" maxlength="500"
id="inputTarifs" placeholder="" rows="3"></textarea>
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper _textarea">
<div class="__inner border-bottom-0">
<label for="inputPresentation">
<span class="label-text">Présentation (texte brut uniquement)<span class="colorRed">*</span></span>
</label>
<textarea name="presentation" data-paste-clear class="form-control js-textarea-counter"
id="inputPresentation" placeholder="" rows="3" maxlength="2500" required></textarea>
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputEmail2">
<span class="label-text">Adresse courriel pour informations complémentaires et/ou réservation (ex : nom@domaine.fr)</span>
</label>
<input name="email" type="text" data-paste-clear autocomplete="email" class="form-control"
id="inputEmail2" placeholder="">
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputTelephone">
<span
class="label-text">Contact téléphonique pour informations complémentaires et/ou réservation</span>
</label>
<input name="telephone" type="tel" data-paste-clear class="form-control" id="inputTelephone"
placeholder="(+33) ...">
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputLien1">
<span class="label-text">
Lien utile 1 (site internet, Facebook, Instagram, Twitter, etc.)
</span>
</label>
<input name="lien1" type="text" data-paste-clear class="form-control" id="inputLien1"
placeholder="https://">
</div>
</div>
</div>
<div class="form-group">
<div class="__input-wrapper">
<div class="__inner">
<label for="inputLien2">
<span class="label-text">
Lien utile 2 (site internet, Facebook, Instagram, Twitter, etc.)
</span>
</label>
<input name="lien2" type="text" data-paste-clear class="form-control" id="inputLien2"
placeholder="https://">
</div>
</div>
</div>
<div class="form-group mb-5">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" name="checkbox" id="invalidCheck" required>
<label class="form-check-label" for="invalidCheck">
<span class="d-none label-text">Accepter les Conditions Générales d'Utilisation</span>
<span>Accepter les</span>
<a href="/pages-legales/cgu">Conditions Générales d'Utilisation</a> <span
class="colorRed">*</span>
</label>
</div>
</div>
</div>
<div class="form-group d-none d-validation-block">
<input type="hidden" name="nb1" value="{{ caps['valeur1']['valeur'] }}">
<input type="hidden" name="nb2" value="{{ caps['valeur2']['valeur'] }}">
<div class="__input-wrapper _captcha _propose-event">
<div class="__inner">
<label for="inputCaptcha">Répondez à cette question de vérification avant d’envoyer votre évènement :
Quel est le résultat de ({{ caps['valeur1']['libelle'] }}
+
{{ caps['valeur2']['libelle'] }}) (en chiffre)
<span class="colorRed d-validation-none">*</span>
</label>
<input class="form-control _captcha" type="text" id="inputCaptcha" name="captcha" data-focus-content-target="verify">
</div>
</div>
</div>
<div class="__buttons-wrapper">
<button class="btn btnFormSubmit d-none d-validation-inline-block _modify" data-form-validation-step-toggle>
<span>MODIFIER</span>
</button>
<button class="btn btnFormSubmit d-none d-validation-inline-block" type="submit">
<span>ENVOYER</span>
</button>
<button class="btn btnFormSubmit d-validation-none _validation" data-form-validation-step-toggle>
<span>VALIDER</span>
</button>
</div>
</form>
<div style="padding-bottom:100px;"></div>
</article>
</div>
</main>
{% endblock %}
{% block javascripts %}
{{ parent() }}
{% include('Nordinfo/Main/parts/autocompleteCommune.js.html.twig') with {'autocomplete_selector':'inputVille'} %}
<script>
// FACULTATIF : Pour l'infobulle bootstrap du champ #inputAdresse
$(function () {
$('[data-toggle="tooltip"]').tooltip();
});
/*
* Script de gestion de recherche avec l'API adresses.data.gouv.fr
*
*/
var currentFocus = -1;
var fetchTrigger = 0;
// Fonction pour mettre en forme visuellement un résultat sélectionné
function setActive() {
var nbVal = $("div.address-feedback a").length;
if (!nbVal)
return false; // Si on n'a aucun résultat listé, on s'arrête là.
// On commence par nettoyer une éventuelle sélection précédente
$('div.address-feedback a').removeClass("active");
// Bidouille mathématique pour contraindre le focus dans la plage du nombre de résultats
currentFocus = ((currentFocus + nbVal - 1) % nbVal) + 1;
$('div.address-feedback a:nth-child(' + currentFocus + ')').addClass("active");
}
// 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.
$('div.address-feedback').on("mousedown", "a", function (event) {
// Stop la propagation par défaut
event.preventDefault();
event.stopPropagation();
$("#inputAdresse").val($(this).attr("data-name"));
$("#inputCodePostal").val($(this).attr("data-postcode"));
$("#inputVille").val($(this).attr("data-city"));
$("#adresseSelected").val("true");
$("#inputAdresse").removeClass("error").parent().find('div.error').remove();
$('.address-feedback').empty();
});
// On espionne le clavier dans le champ adresse pour déclencher les actions qui vont bien
$("#inputAdresse").keyup(function (event) {
$("#adresseSelected").val("false");
// Stop la propagation par défaut
event.preventDefault();
event.stopPropagation();
if (event.keyCode === 38) { // Flèche HAUT
currentFocus--;
setActive();
return false;
} else if (event.keyCode === 40) { // Flèche BAS
currentFocus++;
setActive();
return false;
} else if (event.keyCode === 13) { // Touche ENTREE
if (currentFocus > 0) {
// On simule un clic sur l'élément actif
$("div.address-feedback a:nth-child(" + currentFocus + ")").mousedown();
}
return false;
}
// Si on arrive ici, c'est que l'user a avancé dans la saisie : on réinitialise le curseur de sélection.
$('div.address-feedback a').removeClass("active");
currentFocus = 0;
// On annule une éventuelle précédente requête en attente
clearTimeout(fetchTrigger);
// Si le champ adresse est vide, on nettoie la liste des suggestions et on ne lance pas de requête.
let rue = $("#inputAdresse").val();
if (rue.length === 0) {
$('.address-feedback').empty();
return false;
}
// On lance une minuterie pour une requête vers l'API.
fetchTrigger = setTimeout(function () {
// On lance la requête sur l'API
$.get('https://api-adresse.data.gouv.fr/search/', {
q: rue,
limit: 15,
autocomplete: 1
}, function (data, status, xhr) {
let liste = "";
$.each(data.features, function (i, obj) {
// Données phase 1 (obj.properties.label) & phase 2 : name, postcode, city.
// J'ajoute chaque élément dans une liste
let cooladdress = obj.properties.name + " " + obj.properties.postcode + " <strong>" + obj.properties.city + "</strong>";
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>';
});
$('.address-feedback').html(liste);
}, 'json');
}, 500);
});
// On cache la liste si le champ adresse perd le focus
$("#inputAdresse").focusout(function () {
$('.address-feedback').empty();
});
// On annule le comportement par défaut des touches entré et flèches si une liste de suggestion d'adresses est affichée
$("#inputAdresse").keydown(function (e) {
if ($("div.address-feedback a").length > 0 && (e.keyCode === 38 || e.keyCode === 40 || e.keyCode === 13)) {
e.preventDefault();
}
});
</script>
<script>
(function() {
window.addEventListener('load', function() {
const form = document.querySelector('.formCustom');
if (form) {
form.reset();
clearCustomElements();
}
});
function clearCustomElements() {
const fileInputs = document.querySelectorAll('input[type="file"]');
fileInputs.forEach(input => {
input.value = '';
const label = input.nextElementSibling;
if (label && label.classList.contains('label-file')) {
const span = label.querySelector('span span');
if (span) {
span.innerHTML = 'Ajouter un visuel (affiche, flyer, etc.)';
}
}
});
const disabledInputs = document.querySelectorAll('input[disabled]');
disabledInputs.forEach(input => {
input.value = '';
});
const addressFeedback = document.querySelector('.address-feedback');
if (addressFeedback) {
addressFeedback.innerHTML = '';
}
const form = document.querySelector('.formCustom');
if (form) {
form.classList.remove('was-validated');
}
const errorContainer = document.getElementById('alertErrorsContainer');
if (errorContainer) {
errorContainer.style.display = 'none';
}
const dateInputs = document.querySelectorAll('.datetimepicker-input, .datetimepicker-input-2, .timepicker-input, .timepicker-input-2');
dateInputs.forEach(input => {
input.value = '';
if (input.classList.contains('datetimepicker-input-2') || input.classList.contains('timepicker-input-2')) {
input.disabled = true;
}
});
}
})();
</script>
{% endblock %}