Rev 3166 | Rev 3168 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
"use strict";/**************************** Lancement des scripts ****************************/jQuery( document ).ready( function() {// Initialisation d'un identifiant de champvar fieldId = 1;// Ajout de nouveaux champsonClickAddNewFields( fieldId );// Affichage des images ou nom des documents importésinputFile();});/************************************************************ Fonctions pour la création des champs supplémentaires ************************************************************/// Logique globale pour l'ajout de nouveaux champsfunction onClickAddNewFields( fieldId ) {$( '#add-fields' ).click( function() {// Ajout d'un nouveau champdisplayNewField( fieldId );// Suppression d'un champonClickRemoveField();$('#submit-button').before('<p>hello</p>'+'<input type="hidden" class="name-field-submit" name="name" data-id="' + fieldId+ '" value="">');// Les images ou les nom des documents importés doivent aussi// s'afficher dans les champs ajoutésinputFile();fieldId++;});}// Création et logique pour un nouveau champfunction newField( fieldId ) {// Le html des nouveaux champs à insérer dans le domvar fieldsHtml ='<div data-id="' + fieldId + '" class="new-field">'+'<h3>Nouveau champ :<br><strong class="field-title"></strong></h3>'+// Nom du champ'<label for="nom-champs" title="Donnez titre à votre champ">Nom du champ</label>'+'<input type="text" class="nom-champs" placeholder="Donnez titre à votre champ" required>'+// Type de champ'<label for="type-champ" title="Quel type de champ">Type de champ</label>'+'<div class="select-wrapper add-field-select">'+'<select name="type-champ" class="type-champ" required>'+'<option value="text" selected="selected">Champ texte</option>'+'<option value="email">Champ email</option>'+'<option value="textarea">Champ rédaction</option>'+'<option value="select">Menu déroulant</option>'+'<option value="checkbox">Cases à cocher</option>'+'<option value="list-checkbox">liste Cases à cocher</option>'+'<option value="radio">Boutons radio</option>'+'<option value="date">Calendrier</option>'+'<option value="file">Téléchargement</option>'+'<option value="range">Curseur (curseur entre 2 bornes)</option>'+'<option value="number">Nombre</option>'+'</select>'+'</div>'+// Clé du champ'<label for="cle" title="Clé du champ (son nom dans la base de données)">'+'Clé du champ en camelCase (ecritureChameau)<br>'+'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+'Pas d\'accents ou de cédille, pas de caractères spéciaux.'+'</label>'+'<input type="text" name="cle" class="cle" placeholder="Clé du champ" required title="Clé du champ (son nom dans la base de données)">'+// Tooltip'<label for="field-tooltip" title="Ajoutez une info-bulle">Info-bulle</label>'+'<input type="text" name="field-tooltip" class="field-tooltip" placeholder="Quelques mots">'+// Import d'une image ou d'un pdf d'aide à afficher en popup'<div class="input-file-container">'+'<input type="file" class="input-file" name="help" id="help" accept="application/pdf, image/*, video/*">'+'<label for="help" class="label-file"><i class="fas fa-download"></i>Image ou pdf d\'aide (popup)</label>'+'</div>'+'<div class="file-return help"></div>'+'<div class="row">'+// Checkbox "champ requis"'<div class="col-md-5">'+'<label for="required-field" title="Ce champ est obligatoire">Champ requis ?</label>'+'<input type="checkbox" name="required-field" id="required-field">'+'</div>'+// Bouton supprimer le champ'<div class="col-md-5">'+'<label for="remove-field">Supprimer ce champ</label>'+'<div class="remove-field button" name="remove-field" data-id="' + fieldId + '" title="Supprimer un champ"><i class="fa fa-times" aria-hidden="true"></i></div>''</div>'+'</div>'+'</div>';$( '#new-fields' ).append( fieldsHtml );// Le nom du champ est affiché dès qu'il est renseignéonChangeDisplayFieldName( fieldId );// En fonction du type de champ choisi on demande les informations correspondantesonChangeFieldTypeCollectDetails( fieldId );}// Un peu d'animation de l'affichage d'un nouveau champfunction displayNewField( fieldId ) {newField( fieldId );$( '.new-field[data-id="' + fieldId + '"]').hide().removeClass( 'hidden' ).show( 200 );}// Logique pour le bouton supprimer tout un champfunction onClickRemoveField() {$( '.remove-field.button' ).click( function() {$( '.new-field[data-id="' + $( this ).attr( 'data-id' ) + '"]').fadeOut( 200 , this.remove() );});}// Affichage du nom du champ dès qu'il est renseignéfunction onChangeDisplayFieldName( fieldId ) {$('.new-field[data-id="' + fieldId + '"] .nom-champs').change( function() {var fieldName = $( this ).val();$( '.new-field[data-id="' + fieldId + '"] .field-title' ).text( fieldName );$( '.name-field-submit[data-id="' + fieldId + '"]' ).val( fieldName );});}/**** Recueil des informations et détails qui dépendent du type de champ choisi ****/// Logique de recueil d'informations en fonction du type de champ choisifunction onChangeFieldTypeCollectDetails( fieldId ) {var fieldDetails =// Placeholder (champ type text par défaut)'<label for="aide-saisie" title="Aidez les utilisateurs en deux ou 3 mots ou chiffres à comprendre ce que doit contenir le champ">Texte d\'aide à la saisie</label>'+'<input type="text" name="aide-saisie" class="aide-saisie" placeholder="Ce que doit contenir le champ">';// On insère les champs par défaut de recueil d'informationsdisplayFieldDetailsCollect( fieldId , fieldDetails );$( '.new-field[data-id="' + fieldId + '"] .type-champ' ).change( function() {// on intialise L'id pour les listes la variable qui contiendra un id pour chaque optionvar valueId = 1;// Si on hésite on qu'on se trompe dans la liste :// les champs de détails de l'option précédente doivent être supprimés$( '.new-field[data-id="' + fieldId + '"] .field-details' ).remove();// $( this ).val() = le type de champ choisi dans select ".type-champ"switch( $( this ).val() ) {case 'number':case 'range':fieldDetails =// Placeholder'<label for="aide-saisie" title="Deux ou 3 mots ou chiffres à comprendre ce que doit contenir le champ (ex: min 20, 10 par 10, etc.)">Texte d\'aide à la saisie</label>'+'<input type="text" name="aide-saisie" class="aide-saisie" placeholder="Ce que doit contenir le champ">'+// Valeur par défaut'<label for="default" title="Valeur par défaut">Valeur par défaut (1 par défaut)</label>'+'<input type="number" name="default" class="default" value="1">'+// Incrémentation ( attribut step="" )'<label for="pas" title="De 10 en 10, de 0.5 en 0.5, etc.">Le "pas" d\'incrémentation,<br>(attention, pas devirgule mais un point),<br>par defaut la valeur augmentera de 1 en 1</label>'+'<input type="number" name="pas" class="pas" value="1">';// Min'<label for="min" title="valeur min">Valeur minimale</label>'+'<input type="number" name="min" class="min" value="1">'+// Max'<label for="max" title="valeur max">Valeur maximale</label>'+'<input type="number" name="max" class="max" value="1">';break;case 'date':fieldDetails =// Date min'<label for="min" title="valeur min">Valeur minimale</label>'+'<input type="date" name="min" class="min" value="1">'+// Date max'<label for="max" title="valeur max">Valeur maximale</label>'+'<input type="date" name="max" class="max" value="1">';break;case 'select':case 'checkbox':case 'list-checkbox':case 'radio':fieldDetails =// Todo : afficher les noms donnés dans le select ".type-champ"// plutot que le nom des éléments html'<p class="message">Ajoutez les valeurs de ' + $( this ).val() + '</p>'+// Bouton ajout d'une valeur à la liste'<label for="add-value" class="add-value" title="Ajouter une valeur à la liste">Ajouter une valeur</label>'+'<div class="button add-value-button" name="add-value" title="Ajouter une valeur à la liste"><i class="fa fa-plus" aria-hidden="true"></i></div>'+// checkbox ajouter une valeur "Autre:"'<label for="option-other-value" title="Ajouter une option \'Autre:\' à la fin">Valeur "Autre"</label>'+'<input type="checkbox" class="option-other-value" name="option-other-value" title="Ajouter une option \'Autre\' à la fin">';break;case 'file':fieldDetails = '';case 'text':case 'textarea':case 'email':default:fieldDetails =// Placeholder'<label for="aide-saisie" title="Aidez les utilisateurs en deux ou 3 mots ou chiffres à comprendre ce que doit contenir le champ">Texte d\'aide à la saisie</label>'+'<input type="text" name="aide-saisie" class="aide-saisie" placeholder="Ce que doit contenir le champ">';break;}if( fieldDetails.length > 0 ) {//ne pas ajouer une div vide s'il n'y pas d'informations à demanderdisplayFieldDetailsCollect( fieldId , fieldDetails );}// Ajout des valeurs possibles// lorsque le champ est une liste ou case à cocheronClickAddNewValueToList( fieldId , valueId );});}// Insertion dans le dom des champs de recueil d'informationsfunction displayFieldDetailsCollect( fieldId , fieldDetails ) {$( '.new-field[data-id="' + fieldId + '"] .add-field-select' ).after( '<div class="field-details">' + fieldDetails + '</div>' );}/**** Ajout des valeurs (options) des "champs de listes" (select, checkbox, radio, etc.) ****/// Logique d'ajout des options des listes (deroulantes, cases à cocher etc.)function onClickAddNewValueToList( fieldId , valueId ) {$( '.new-field[data-id="' + fieldId + '"] .add-value-button' ).click( function() {var valueHtml ='<div class="new-value" data-list-value-id="' + valueId +'">'+// Recueil d'une valeur de la liste'<label for="list-value">Valeur:</label>'+'<input type="text" name="list-value" class="list-value" placeholder="Une des valeurs de la liste">'+'<div class="row">'+'<div class="col-md-5">'+// Checkbox "valeur pas défaut" de la liste'<label for="is-defaut-value" title="Ceci est la valeur par défaut">Valeur par défaut</label>'+'<input type="checkbox" name="is-defaut-value" class="is-defaut-value">'+'</div>'+'<div class="col-md-5">'+// Bouton "supprimer la valeur" de la liste'<label for="remove-value">Supprimer valeur</label>'+'<div class="remove-value button" name="remove-value" data-list-value-id="' + valueId + '" title="Supprimer une valeur"><i class="fa fa-times" aria-hidden="true"></i></div>''</div>'+'</div>'+'</div>';$( '.new-field[data-id="' + fieldId + '"] .add-value' ).before( valueHtml );// Pouvoir supprimer une valeuronClickRemoveListValue( fieldId );// s'assurer qu'il n'y a qu'une valeur par défaut cochée dans les listesonClickDefaultValueRemoveOthers( fieldId );valueId++;});}// Logique pour le bouton supprimer une valeurfunction onClickRemoveListValue( fieldId ) {$('.new-field[data-id="' + fieldId + '"] .remove-value.button').click( function() {$( '.new-field[data-id="' + fieldId + '"] .new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).fadeOut( 200 , this.remove() );});}// Dans une liste il ne peut y avoir qu'une valeur pas défaut cochéefunction onClickDefaultValueRemoveOthers( fieldId ) {$( '.new-field[data-id="' + fieldId + '"] .is-defaut-value' ).click( function() {$( '.new-field[data-id="' + fieldId + '"] .is-defaut-value' ).not( $( this ) ).removeAttr('checked');});}/***************************************** Fonctions pour afficher les images ** ou les nom de fichers importés *****************************************/// Logique d'affichage pour le input type=filefunction inputFile() {// initialisation des variablesvar $fileInput = $( ".input-file" ),$button = $( ".label-file" );// action lorsque la "barre d'espace" ou "Entrée" est pressée$button.on( 'keydown', function( event ) {if ( event.keyCode == 13 || event.keyCode == 32 ) {$fileInput.focus();}});// action lorsque le label est cliqué$button.click(function() {$fileInput.focus();return false;});// affiche un retour visuel dès que input:file change$fileInput.change( function( event ) {var file = event.target.files[0],$theReturn = $( '.' + $( this ).attr( 'id' ) );// affichage du nom du fichier$theReturn.text( file.name );// si le fichier est une image on l'afficheif( file.type.match( 'image' ) ) {// temporairement retrouver le chemin// de l'image qui a été chagée, pour affichagevar tmppath = URL.createObjectURL( file );$theReturn.append( '<img src="' + tmppath + '" width="50%">' );}});}