Rev 3184 | Rev 3186 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
"use strict";/************************************** Fonctions de Style et Affichage ** des éléments "spéciaux" **************************************/// Logique d'affichage pour le input type=filefunction inputFile() {// Initialisation des variablesvar $fileInput = $( '.input-file' ),$button = $( '.label-file' ),thisId = '';// Action lorsque la "barre d'espace" ou "Entrée" est pressée$( '.label-file' ).keydown( function( event ) {if ( event.keyCode == 13 || event.keyCode == 32 ) {$( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();}});// Action lorsque le label est cliqué$( '.label-file' ).click( function(event) {$( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();return false;});// Affiche un retour visuel dès que input:file change$fileInput.change( function( event ) {// Il est possible de supprimer un fichier// donc on vérifie que le 'change' est un ajout ou modificationif( !$.isEmptyObject( event.target.files[0] ) ) {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' ) ) {// Chemin temporaire de l'image et affichagevar tmppath = URL.createObjectURL( file );$theReturn.removeClass( 'hidden' ).append( '<img src="' + tmppath + '" width="50%">' );}}});// Annuler le téléchargement$( '.remove-file' ).click( function() {var $thisFileInput = $( this ).prev( '.input-file-container' ).find( '.input-file' );$thisFileInput.wrap( '<form>' ).closest( 'form' ).get(0).reset();$thisFileInput.triggerHandler( 'change' );$thisFileInput.unwrap();$( this ).next( '.file-return' ).addClass( 'hidden' ).empty();});}// Style et affichage des list-checkboxesfunction inputListCheckbox() {// On écoute le click sur une list-checkbox ('.selectBox')// à tout moment de son insertion dans le dom$( '#zone-appli' ).on( 'click' , '.selectBox' , function() {$( '.checkboxes[data-id="' + $(this).attr( 'data-id' ) + '"]' ).toggleClass( 'hidden' );});}function inputRangeDisplayNumber() {$( '#zone-supp' ).on( 'input' , '.range input[type="range"]' , function () {console.log( $( this ).val() );$( this ).next( 'input[type="number"]' ).val ( $( this ).val() );});$( '#zone-supp' ).on( 'input' , '.range input[type="number"]' , function () {console.log( $( this ).val() );$( this ).prev( 'input[type="range"]' ).val ( $( this ).val() );});}/************************************************************ Fonctions pour la création des champs supplémentaires ************************************************************/// Logique globale pour l'ajout de nouveaux champsfunction onClickAddNewFields( fieldIndex ) {// Bouton ajouter un champ$( '#add-fields' ).click( function() {// Affichage du formulaire pour un champdisplayNewField( fieldIndex );// Affichage du nom du champonChangeDisplayFieldLabel( fieldIndex );// Empêcher de créer plus d'une fois la même cléonChangeCheckKeyUnique();// Affichage des images/nom des documents importés dans les champs ajoutésinputFile();// Recueil des informations correspondantes au nouveau champonChangeFieldTypeCollectDetails( fieldIndex );// Suppression d'un champonClickRemoveField();fieldIndex++;});}// Création/affichage du formulaire d'un nouveau champfunction displayNewField( fieldIndex ) {// Html du formulaire du nouveaux champs inséré dans le dom$( '#new-fields' ).append('<fieldset data-id="' + fieldIndex + '" class="new-field">'+'<h3>Nouveau champ :<br><strong class="field-title" data-id="' + fieldIndex + '"></strong></h3>'+// Nom du champ'<label for="field-name" title="Donnez un titre à votre champ">Nom du champ *</label>'+'<input type="text" name="field-name" data-id="' + fieldIndex + '" class="field-name" placeholder="Titre de votre champ" title="Donnez un titre à votre champ" required>'+// Clé du champ'<label for="field-key" title="Nom du champ dans la base de données">'+'Clé du champ *'+'</label>'+'<input type="text" name="field-key" data-id="' + fieldIndex + '" class="field-key" placeholder="Clé du champ" title="Nom du champ dans la base de données" required>'+'<p class="message">' +'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+'Une clé doit être unique<br>' +'En camelCase (ecriture chameau)<br>'+'Pas d\'accents ou de cédille, pas de caractères spéciaux.' +'</p>' +// Type de champ'<label for="field-element" title="Quel type de champ">Type de champ *</label>'+'<div class="select-wrapper add-field-select" data-id="' + fieldIndex + '">'+'<select name="field-element" data-id="' + fieldIndex + '" class="field-element">'+'<option value="text">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 de 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 (entre 2 bornes)</option>'+'<option value="number">Nombre</option>'+'</select>'+'</div>'+// Checkbox "champ requis"'<label for="field-is_mandatory" title="Ce champ est obligatoire">Champ requis ?</label>'+'<input type="checkbox" name="field-is_mandatory" data-id="' + fieldIndex + '" class="field-is_mandatory">'+// Unité des valeurs'<label for="field-unit" title="Unité de mesure de vos valeurs">Unités ( cm, kg, ha, etc.)</label>'+'<input type="text" name="field-unit" data-id="' + fieldIndex + '" class="field-unit" placeholder="symbole de vos unités">'+// Tooltip'<label for="field-description" title="Ajoutez une info-bulle">Info-bulle</label>'+'<input type="text" name="field-description" data-id="' + fieldIndex + '" class="field-description" 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 field-help" name="field-help" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="application/pdf, image/*, video/*">'+'<label for="field-help" class="label-file"><i class="fas fa-download"></i> Popup aide image/pdf</label>'+'</div>'+'<div class="remove-file button" name="remove-file" data-id="' + fieldIndex + '" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>'+'<div class="file-return help-doc-' + fieldIndex + ' hidden"></div>'+// Boutons supprimer'<label for="remove-field">Supprimer</label>'+'<div class="remove-field button" name="remove-field" data-id="' + fieldIndex + '" title="Supprimer un champ"><i class="fa fa-skull" aria-hidden="true"></i></div>'+'</fieldset>');// Animation de l'affichage$( 'fieldset.new-field[data-id="' + fieldIndex + '"]').hide().show( 200 );}// Affichage du nom du champ dès qu'il est renseignéfunction onChangeDisplayFieldLabel( fieldIndex ) {$('.field-name[data-id="' + fieldIndex + '"]').change( function() {$( '.field-title[data-id="' + fieldIndex + '"]' ).text( $( this ).val() );});}// Supprimer un nouveau champfunction onClickRemoveField ( keyFlag , nameFlag ) {$( '.remove-field' ).click( function() {$(this).closest('fieldset').hide( 200 , function () {$(this).remove();});});}/**** 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( fieldIndex ) {// On insère les champs par défaut de recueil d'informationsdisplayFieldDetailsCollect(fieldIndex,// 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" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">');// Sinon :$( '.field-element[data-id="' + fieldIndex + '"]' ).change( function() {// On intialise l'index pour les listes la variable qui contiendra un id pour chaque optionvar valueIndex = 0;// 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$( '.field-details[data-id="' + fieldIndex + '"]' ).hide( 200 , function () {$(this).remove();});// Html de recueil de données en fonction de l'élément choisiswitch( $( this ).val() ) {case 'file':break;case 'number':case 'range':displayFieldDetailsCollect(fieldIndex,'<p class="message"><i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> Ne pas oublier de changer, si nécessaire, les valeurs step, min et max</p>' +// Placeholder'<label for="aide-saisie" title="Deux ou 3 mots ou chiffres pour 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" data-id="' + fieldIndex + '" 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</label>'+'<input type="number" name="default" data-id="' + fieldIndex + '" class="default" step="0.01">'+// Incrémentation ( attribut step="" )'<label for="step" title="De 10 en 10, de 0.5 en 0.5, etc.">Incrémentation (step) :<br>defaut = +1</label>'+'<input type="number" name="step" data-id="' + fieldIndex + '" class="step" step="0.01" value="1">'+// Min'<label for="min" title="valeur min">Valeur minimale</label>'+'<input type="number" name="min" data-id="' + fieldIndex + '" class="min" step="0.01" value="0">'+// Max'<label for="max" title="valeur max">Valeur maximale</label>'+'<input type="number" name="max" data-id="' + fieldIndex + '" class="max" step="0.01" value="1">');break;case 'date':displayFieldDetailsCollect(fieldIndex,// Date min'<label for="min" title="date min">Date minimale</label>'+'<input type="date" name="min" data-id="' + fieldIndex + '" class="min">'+// Date max'<label for="max" title="date max">Date maximale</label>'+'<input type="date" name="max" data-id="' + fieldIndex + '" class="max">');break;case 'select':case 'checkbox':case 'list-checkbox':case 'radio':displayFieldDetailsCollect(fieldIndex,'<p class="message">Ajoutez les valeurs de \"' + $( this ).children( 'option:selected' ).text() + '\"</p>'+// Bouton ajout d'une valeur à la liste'<label for="add-value" class="add-value" data-id="' + fieldIndex + '" title="Ajouter une valeur à la liste">Ajouter une valeur</label>'+'<div class="button add-value-button" name="add-value" data-id="' + fieldIndex + '" title="Ajouter une valeur à la liste"><i class="fa fa-puzzle-piece" 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" name="option-other-value" data-id="' + fieldIndex + '" class="option-other-value" title="Ajouter une option \'Autre\' à la fin">');break;case 'email':case 'text':case 'textarea':default:displayFieldDetailsCollect(fieldIndex,// 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" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">');break;}// Ajout des valeurs possibles// lorsque le champ est une liste ou case à cocheronClickAddNewValueToList( fieldIndex , valueIndex );});}// Insertion dans le dom des champs de recueil d'informationsfunction displayFieldDetailsCollect( fieldIndex , fieldDetails ) {$( '.add-field-select[data-id="' + fieldIndex + '"]' ).after('<div class="field-details" data-id="' + fieldIndex + '">' +fieldDetails +'</div>').hide().show( 200);}/**** Ajout des valeurs (options) des "champs de listes" (select, checkbox, radio, etc.) ****/// Ajout des options des listes (deroulantes, cases à cocher etc.)function onClickAddNewValueToList( fieldIndex , valueIndex ) {$( '.add-value-button[data-id="' + fieldIndex + '"]' ).click( function() {$( '.add-value[data-id="' + fieldIndex + '"]' ).before('<div class="new-value" data-list-value-id="' + valueIndex +'">'+// Recueil d'une valeur de la liste'<label for="list-value">Valeur *:</label>'+'<input type="text" name="list-value" data-id="' + fieldIndex + '" class="list-value" data-list-value-id="' + valueIndex +'" placeholder="Une des valeurs de la liste" required>'+// Checkbox valeur par défaut+bouton supprimer'<div class="row">'+'<div class="col-md-5">'+// Valeur par défaut'<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" data-id="' + fieldIndex + '" class="is-defaut-value" title="entrez une valeur pour activer cette case" data-list-value-id="' + valueIndex +'" disabled >'+'</div>'+'<div class="col-md-5">'+// Bouton supprimer une option'<label for="remove-value">supprimer valeur</label>'+'<div class="remove-value button" name="remove-value" data-id="' + fieldIndex + '" data-list-value-id="' + valueIndex + '" title="Supprimer une valeur"><i class="fa fa-trash" aria-hidden="true"></i></div>'+'</div>'+'</div>'+'</div>').hide().show( 200);// Activer la checkbox de valeur par default uniquement si une valeur est entréeonInputListValueLabelEnableDefaultCheckbox( valueIndex );// Une seule valeur par défaut pour select et radioonClickDefaultValueRemoveOthers( fieldIndex );// Supprimer une valeuronClickRemoveListValue( fieldIndex );valueIndex++;});}// Activer la checkbox de valeur par default uniquement si une valeur est entréefunction onInputListValueLabelEnableDefaultCheckbox( valueIndex ) {$( '.new-value[data-list-value-id="' + valueIndex + '"] .list-value' ).on( 'input' , function() {if( $(this).val() !== '' ) {$( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).removeAttr( 'disabled');} else {$( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).attr( 'disabled', true ).removeAttr( 'checked' );}});}// Pour les éléments "select" et "radio" il ne peut y avoir qu'une valeur par défaut cochéefunction onClickDefaultValueRemoveOthers( fieldIndex ) {var selectedFieldElement = $( '.field-element[data-id="' + fieldIndex + '"]' ).val();if( selectedFieldElement === 'select' || selectedFieldElement === 'radio' ) {$( '.is-defaut-value[data-id="' + fieldIndex + '"]' ).click( function() {if( $( this ).attr( 'checked' ) ) {// Décocher tous les autres$( '.is-defaut-value[data-id="' + fieldIndex + '"]:checked' ).not( $( this) ).removeAttr( 'checked' );}});}}// Bouton supprimer une valeurfunction onClickRemoveListValue( fieldIndex ) {$( '.remove-value.button[data-id="' + fieldIndex + '"]' ).click( function() {$( '.new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).hide( 200 , function () {$(this).remove();});});}/********************************************** Validation et envoi des nouveaux champs **********************************************/// Empêcher de créer plus d'une fois la même cléfunction onChangeCheckKeyUnique() {if( 1 < $( '.field-key' ).length ) {// Marqueur de valeur dupliquéevar notUnique = false;$( '.field-key' ).change( function () {let count = $( '.field-key' ).length;for(var index = 0 ; index < count ; index++) {let thisFieldKey = $( '.field-key[data-id="' + index + '"]' );// Le champ avec cet index paourrait avoir été suppriméif( 0 < thisFieldKey.length ) {for( var otherIndex = 0 ; otherIndex < count ; otherIndex++ ) {let otherFieldKey = $( '.field-key[data-id="' + otherIndex + '"]' );// Le champ avec cet index pourrait avoir été supprimé// On vérifie qu'on ne compare pas un champ avec lui-même// Que les champs ne sont pas vides// Les champs dupliqués déclanchent le marqueur et les alertesif(0 < otherFieldKey.length &&index !== otherIndex &&'' !== otherFieldKey.val() &&'' !== thisFieldKey.val() &&thisFieldKey.val() === otherFieldKey.val()) {// Le marqueur de valeur dupliquée passe à truenotUnique = true;if( 0 === $( '.invalid-field-key[data-id="' + index + '"]' ).length ) {// Le champ est signalé en rouge// Un message d'alerte apparait sous le champthisFieldKey.addClass( 'invalid' );thisFieldKey.after('<p class="message invalid-field-key" data-id="' + index + '">' +'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +' Vérifiez qu\'aucune clé n\'ait été utilisée plus d\'une fois' +'</p>');}}}}}if( notUnique ) {// Un message d'alerte apparait au dessus des boutons prévisualiser/validerif( 0 === $( '.invalid-field-key-bottom' ).length ) {$( '#new-fields' ).after('<p class="message invalid-field-key-bottom">' +'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +' Une clé a été utilisée plusieurs fois' +'</p>');}// Les boutons prévisualiser/valider sont désactivés et signalés en rouge$( '#preview-field , #validate-new-fields' ).addClass( 'invalid' ).css( 'pointer-events', 'none' );} else {// Si on est ok on retire toutes les alertes// signalements rouges$( '.field-key' ).each( function() {$( this ).removeClass( 'invalid' );});$( '#preview-field , #validate-new-fields' ).removeClass( 'invalid' );// messages d'alerte$( '.invalid-field-key' ).each( function() {$( this ).hide( 200 , function () {$( this ).remove();});});$( '.invalid-field-key-bottom' ).hide( 200 , function () {$( this ).remove();});//réactivation des boutons prévisualiser/valider$( '#preview-field' )[0].style.removeProperty( 'pointer-events' );$( '#validate-new-fields' )[0].style.removeProperty( 'pointer-events' )}// RéinitialisationnotUnique = false;});}}//Activation/Désactivation des boutons valider/prévisualiserfunction activatePreviewAndValidateButtons() {var invalidElementInfos = false, // true si aucune option n'a été entrée pour un élément de liste (select, radio, etc.)invalidTextInfos = false; // true si au moins un input required n'est pas renseigné// Clique sur le bouton prévisualiser ou valider$('#preview-field , #validate-new-fields').on( 'click' , function() {// S'il n'y a pas (plus) de bloc nouveau champif( 0 === $( 'fieldset' ).length ) {return;}var count = $( 'fieldset' ).last().attr('data-id');// si on a déjà des avertissements on les supprimeif( 0 < $( '.validation-warning' ).length ) {// Supprimer les messages$( '.validation-warning' ).each( function() {$( this ).hide( 200 , function () {$( this ).remove();});});// Supprimer les bordures en rouge vif$('.add-value-button , input[required]' ).each( function() {$( this ).removeClass( 'invalid' );});}// Parcourir tous les blocs d'infos de champs supplémentairesfor( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {var thisFieldset = $( 'fieldset[data-id="' + index + '"]');// Certains indices peuvent correspondre à un champ suppriméif( 0 < $( thisFieldset ).length ) {var $fieldElement = $( '.field-element' , thisFieldset ),fieldElementVal = $fieldElement.val(),isList = ( // true si c'est un élément "liste"fieldElementVal === 'list-checkbox' ||fieldElementVal === 'checkbox' ||fieldElementVal === 'radio' ||fieldElementVal === 'select');// Si aucune option n'a été créée pour un élément "liste"if( isList && 0 === $( '.list-value' , thisFieldset ).length ) {invalidElementInfos = true;// Le bouton "Ajouter une valeur" est signalé en rouge$( '.add-value-button' , thisFieldset ).addClass( 'invalid' );}}}// Si au moins un champ "required" n'est pas rempli$( 'input[required]' , thisFieldset ).each( function() {if( 0 === $( this ).val().length ) {invalidTextInfos = true;// Le champ est signalé en rouge$( this ).addClass( 'invalid' );}});// Si la saisie est invalideif( invalidElementInfos || invalidTextInfos ) {// Désactivation des boutons valider et prévisualiser$( '#preview-field , #validate-new-fields' ).addClass( 'invalid' );// Message pour les options des "listes"if( invalidElementInfos ) {$( '#new-fields' ).after('<p class="validation-warning message">' +'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +' Vérifiez les boutons<br>"<i class="fa fa-puzzle-piece" aria-hidden="true" style="color:#4bbacb"></i> Ajouter une valeur" signalés en rouge:' +' il faut au moins une valeur pour les éléments "menu déroulant", "boutons radio", "cases à cocher" ou "liste de cases à cocher", ' +'</p>');}// Message pour les champsif( invalidTextInfos ) {$( '#new-fields' ).after('<p class="validation-warning message">' +'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +' Des informations sont manquantes pour certains champs,' +' vérifiez ceux signalés en rouge' +'</p>');}} else {$( '#preview-field , #validate-new-fields' ).removeClass( 'invalid' );if( $( this ).is( '#validate-new-fields') ) {// Lancement de l'enregistrement des valeurs à transmettreonClickStoreNewFields();} else if( $( this ).is( '#preview-field') ) {// Lancement de la prévisualisationnewFieldsPreview();}}// Réinitialisation des drapeaux de saisie invalideinvalidElementInfos = false;invalidTextInfos = false;});}// Enregistrement des valeurs à transmettrefunction onClickStoreNewFields() {// Lorsqu'on validevar resultArrayIndex = 0;var count = $( 'fieldset' ).last().attr('data-id');var helpFileExists = false;// Savoir si au moins un fichier "aide" est enregistré$( '.field-help' ).each( function () {if( '' !== $( this ).val() ){helpFileExists = true;}})// dans ce cas intégrer dans le formulaire à soumettre un bloc// qui contiendra une copie de chacun de ces input[type="file"]if( helpFileExists ){$('#submit-button').before( '<div id="help-doc-submit" class="hidden"></div>' );}// On déroule les blocs de champs supplémentairesfor( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {var thisFieldset = $( 'fieldset[data-id="' + index + '"]');// Certains indices peuvent correspondre à un champ suppriméif( 0 < $( thisFieldset ).length ) {// initialisation du tableau de résultatsdatasToSubmit[ resultArrayIndex ] = { fieldValues:{} };// Ajout de la clé au tableau de resultatsdatasToSubmit[ resultArrayIndex ].key = $( '.field-key' , thisFieldset ).val();// Ajout de le nom au tableau de resultatsdatasToSubmit[ resultArrayIndex ].name = $( '.field-name' , thisFieldset ).val();// Recueil de l'élément choisi pour le tableau de resultatsdatasToSubmit[ resultArrayIndex ].element = $( '.field-element' , thisFieldset ).val();// Ajout de la valeur 'requis' ou non au tableau de resultatsdatasToSubmit[ resultArrayIndex ].mandatory = $( '.field-is_mandatory' , thisFieldset ).is( ':checked' );// Ajout de l'unité au tableau de resultatsdatasToSubmit[ resultArrayIndex ].unit = $( '.field-unit' , thisFieldset ).val() || null;// Ajout du tooltip au tableau de resultatsdatasToSubmit[ resultArrayIndex ].description = $( '.field-description' , thisFieldset ).val() || null;// Ajout du nom du document d'aide au tableau de resultatsdatasToSubmit[ resultArrayIndex ].help = $( '.file-return.help-doc-' + index ).text() || null;// Collecte les des données dépendantes de l'élément choisi// sous forme d'un tableau de resultatsonSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , thisFieldset );if( $.isEmptyObject(datasToSubmit[ resultArrayIndex ].fieldValues) ){delete datasToSubmit[ resultArrayIndex ].fieldValues;}// Copie d'un champ de fichier d'aide dans le bloc d'envoiif( '' !== $( '.field-help' , thisFieldset ).val() ) {$( '.field-help' , thisFieldset ).clone().attr( 'id' , datasToSubmit[ resultArrayIndex ].key )// l'id prend la valeur de la clé.css( 'position' , 'static' )// Retrouver facilement le bloc dans la page.appendTo( '#help-doc-submit' );}resultArrayIndex++;}}var resultsArrayJson = JSON.stringify( datasToSubmit );// Désactivation de tous les champs et boutons (nouveaux champs)$( '#new-fields, #new-fields .button , #add-fields , #preview-field' ).addClass( 'disabled' );$( '#validate-new-fields' ).addClass( 'validated' );$( '.validate-new-fields' ).text( 'Champs validés' );// Mise à disposition des données pour le bouron submit$('#submit-button').before('<input type="hidden" name="champs-supp" id="champs-supp" value=\'' + resultsArrayJson + '\'>');}// Renseigne le tableau de resultat// pour les données dépendant de l'élément choisifunction onSelectCollectDataValuesToSubmit( datasToSubmitObject , thisFieldset ) {switch( datasToSubmitObject.element ) {// case 'file' :// Rien à faire, pas de détails à transmettrecase 'select':case 'checkbox':case 'list-checkbox':case 'radio':datasToSubmitObject.fieldValues.listValue = [];// Ajout des valeurs de listeonChangeStoreListValueLabel( datasToSubmitObject , thisFieldset );// S'il y a une valeur 'autre' on l'indique à la fin de la listeif( $('.option-other-value' , thisFieldset ).attr( 'checked' ) && datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) === -1 ) {datasToSubmitObject.fieldValues.listValue.push( 'other' );}break;case 'number':case 'range':// PlaceholderdatasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val() || null;// Valeur par défautdatasToSubmitObject.fieldValues.default = $( '.default' , thisFieldset ).val() || null;// Incrémentation ( attribut step="" )datasToSubmitObject.fieldValues.step = $( '.step' , thisFieldset ).val() || null;// MindatasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val() || null;// MaxdatasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val() || null;break;case 'date':// MindatasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val() || null;// MaxdatasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val() || null;break;case 'email':case 'text':case 'textarea':default:// PlaceholderdatasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val() || null;break;}return datasToSubmitObject;}// Ajout d'une valeur d'un élément liste (select, checkbox etc.)// dans le tableau de resultatsfunction onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset ) {$( '.list-value' , thisFieldset ).each( function() {var selectedFieldElement = $( '.field-element' , thisFieldset ).val();if( $( this ).val() ){// Is-default-value non cochéeif( !$( '.is-defaut-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' , thisFieldset ).attr( 'checked' ) ) {datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );// Is-default-value cochée pour select/radio} else if( 'select' === selectedFieldElement || 'radio' === selectedFieldElement ) {// Une seule valeur par defaut, devient la première valeur du tableau + '#'datasToSubmitObject.fieldValues.listValue.unshift( $( this ).val() + '#' );// Is-default-value cochée pour checkbox/list-checkbox} else {// On ajoute simplement la valeur au tableau + '#'datasToSubmitObject.fieldValues.listValue.push( $( this ).val() + '#' );}}});}/************************************************* Fonction d'affichage des champs classiques *************************************************/// Prévisualisationfunction DisplayClassicFields() {// Affichage du titre du widgetrenderFields( $('#titre') , $( '.widget-renderer h1' ) );// Affichage du nom du projetrenderFields( $('#projet') , $( '.projet-description' ));// Affichage de la descriptionrenderFields( $('#description') , $( '.preview-description' ) );// Affichage du logo s'il existe déjàif( $('#logo').val() || $('#logo')[0].defaultValue ) {$( '#preview-logo img' ).prop( 'src' , $( '#group-settings-form .logo img' ).prop('src') );}// Affichage du logo chargé$( '#logo.input-file' ).change( function( event ) {// Si le 'change' était pas une suppressionif( $.isEmptyObject( event.target.files[0] ) ) {$( '#preview-logo img' ).prop( 'src' , '' );// Si on a chargé un logo ou changé le fichier} else {$( '#preview-logo img' ).prop( 'src' , URL.createObjectURL( event.target.files[0] ) );}});// Affichage de l'image de fond$('#fond.input-file').change( function ( event ) {if( !$.isEmptyObject( event.target.files[0] ) ) {$( '.widget-renderer' ).css('background' ,'url(' + URL.createObjectURL( event.target.files[0] ) + ') no-repeat center');} else {$( '.widget-renderer' )[0].style.removeProperty( 'background' );}});}// Affichage des infos dès que disponibles// pour les champs classiquesfunction renderFields( $source , $taget ) {if($source.val()) {$taget.text( $source.val() );}$source.change( function () {$taget.text( $( this ).val() );});}/****************************************************** Fonction d'affichage des champs supplémentaires ******************************************************/// Construction des éléments à visualiserfunction onClickPreviewField( thisFieldset , index ) {// Récupération des données// Tous les champsvar fieldLabel = $( '.field-name' , thisFieldset ).val() || '',//nomfieldKey = $( '.field-key' , thisFieldset ).val() || '',//cléfieldElement = $( '.field-element' , thisFieldset ).val() || '',//élémentfieldIsMandatory = $( '.field-is_mandatory' , thisFieldset ).is( ':checked' ),//champ requisfieldUnit = $( '.field-unit' , thisFieldset ).val() || '',//unitésfieldTooltip = $( '.field-description' , thisFieldset ).val() || '',//info-bullefieldHelp = $( '.file-return.help-doc-' + index ).text() || '',//nom du fichier d'aidefieldPlaceholder = $( '.aide-saisie' , thisFieldset ).val() || '',//placeholder// Champs à valeur numérique ou datefieldStep = $( '.step' , thisFieldset ).val() || '',fieldMin = $( '.min' , thisFieldset ).val() || '',fieldMax = $( '.max' , thisFieldset ).val() || '',// Champs "listes"fieldDefaultNum = $( '.default' , thisFieldset ).val() || '',// value range/number par defaultfieldOtherValue = $( '.option-other-value' , thisFieldset ).is( ':checked' ),//option autrefieldOptions = collectListOptions( thisFieldset );//Array: toutes les options// Variables d'affichagevar fieldHtml = '',//variable contenant tout le html à affichercommonFieldsHtml = {},//Éléments simples ou chaînes communes aux "listes"listFieldsHtml = {},//chaînes & html pour les listes mais non spécifiqueslistFieldsHtml = {},//chaînes & html spécifiques aux listescount = fieldOptions.length;//nombre d'options, pour les boucles for//valeurs initiales des chaînes de caractères//Éléments simples ou chaînes communes aux "listes"commonFieldsHtml = {dataIdAttr : ' data-id="' + index + '"',helpButton : '',//bouton aidehelpClass : '',//classe de l'élément associé au bouton aidetitleAttr : '',//info-bullefieldInput : {//attributs de l'élémenttypeAttr : ' type="' + fieldElement + '"',nameAttr : ' name="' + fieldKey + '"',classAttr : ' class="' + fieldKey + '"',placeholderAttr : '',mandatoryAttr : '',//requiredotherAttr : ''},fieldLabel : {//attributs et contenu du labellabelContent : fieldLabel,//labelforAttr : ' for="' + fieldKey + '"',//attribut forclassAttr : '',//classe du labelotherAttr : ''//tous autres attributs}}// Pour les éléments de listes (select, checkbox, etc.)listFieldsHtml = {containerContent : fieldLabel,//les options peuvent avoir chacune un labelcontainerClass : '',//une classe pour le conteneurforAttr : '',//correspond à l'id d'une checkbox/radio/list-checkboxoptionIdAttr : '',//value-iddefaultAttr : ''//default};// Changement d'un élément existant:// supprimer le précédent pour ajouter le nouveauif( 0 < $( '.preview-fields' , thisFieldset ).length ) {$( '.preview-fields' , thisFieldset ).remove();}// Élément requisif( fieldIsMandatory ) {// Attribut required pour le listescommonFieldsHtml.fieldInput.mandatoryAttr = ' required="required"';// Nom du champ (éléments listes)listFieldsHtml.containerContent += ' *';// Nom du champ (éléments simples)commonFieldsHtml.fieldLabel.labelContent += ' *';}// Infobulleif( '' !== fieldTooltip ) {commonFieldsHtml.titleAttr = ' title="' + fieldTooltip + '"';}// Placeholderif( '' !== fieldPlaceholder ) {commonFieldsHtml.fieldInput.placeholderAttr = ' placeholder="' + fieldPlaceholder + '"';}// Fichier d'aideif( '' !== fieldHelp ) {// Bouton 'aide'commonFieldsHtml.helpButton = '<div class="button help-button"><i class="fas fa-info-circle"></i></div>';// classe 'aide'commonFieldsHtml.helpClass = ' and-help';}// html à ajouter en fonction de l'élément choisiswitch( fieldElement ) {case 'checkbox' :case 'radio' :listFieldsHtml.containerClass = ' class="' + fieldElement +'"';fieldHtml =// Conteneur'<div' +// Class="L'élément choisi"listFieldsHtml.containerClass +// DataIdcommonFieldsHtml.dataIdAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// Info bullecommonFieldsHtml.titleAttr +' >'+// Nom du champ// Classe 'and-help''<div class="list-label' + commonFieldsHtml.helpClass + '">' +// LabellistFieldsHtml.containerContent +'</div>' +// Bouton 'help'commonFieldsHtml.helpButton;// On déroule les différentes valeursfor( let i = 0; i < count; i++ ) {let fieldOption = fieldOptions[i];// L'id de inputlistFieldsHtml.inputIdAttr = ' id="' + fieldOption.optionValue + '"';listFieldsHtml.forAttr = ' for="' + fieldOption.optionValue + '"';// DefaultlistFieldsHtml.defaultAttr = '';//réinitialisationif( fieldOption.isDefault ) {//affectationlistFieldsHtml.defaultAttr = ' checked';}// L'indice de chaque option// L'option "autre" n'en a pasif( '' !== fieldOption.optionIndex ) {listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';}fieldHtml +='<label' +// ForlistFieldsHtml.forAttr +// value-idlistFieldsHtml.optionIdAttr +// Class="nom du champ"commonFieldsHtml.fieldInput.classAttr +'>' +'<input' +// TypecommonFieldsHtml.fieldInput.typeAttr +// IdlistFieldsHtml.inputIdAttr +// DataIdcommonFieldsHtml.dataIdAttr +// value-idlistFieldsHtml.optionIdAttr +// NamecommonFieldsHtml.fieldInput.nameAttr +// Value' value="' + fieldOption.optionValue + '"' +// CheckedlistFieldsHtml.defaultAttr +// Class="nom du champ"commonFieldsHtml.fieldInput.classAttr +'>' +// Label de l'optionfieldOption.optionText +'</label>';// Si valeur "autre" est cochéeif( fieldOtherValue ) {fieldHtml +='<label for="other"' +commonFieldsHtml.dataIdAttr +'>' +'<input' +commonFieldsHtml.fieldInput.typeAttr +' id="other"' +commonFieldsHtml.fieldInput.nameAttr +' value="other"' +commonFieldsHtml.fieldInput.classAttr +commonFieldsHtml.dataIdAttr +'>' +'Autre</label>';}}// Fin du conteneurfieldHtml += '</div>';break;case 'list-checkbox':fieldHtml =// Classe 'and-help''<div class="multiselect ' + fieldElement + commonFieldsHtml.helpClass + '"' +// DataIdcommonFieldsHtml.dataIdAttr +'>' +'<label>' +// Nom du champlistFieldsHtml.containerContent +'</label>' +'<div class="selectBox"' +// DataIdcommonFieldsHtml.dataIdAttr +'>' +'<select' +// DataIdcommonFieldsHtml.dataIdAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// Info bullecommonFieldsHtml.titleAttr +'>' +// Apparait dans la barre de sélection'<option>Plusieurs choix possibles</option>' +'</select>' +'<div class="overSelect"></div>' +'</div>' +'<div class="checkboxes hidden"' +// DataIdcommonFieldsHtml.dataIdAttr +'>';// On déroule les différentes valeursfor( let i = 0; i < count; i++ ) {let fieldOption = fieldOptions[i];// Type="checkbox"commonFieldsHtml.fieldInput.typeAttr = ' type="checkbox"';// IdlistFieldsHtml.inputIdAttr = ' id="' + fieldOption.optionValue.toLowerCase() + '"';// ForlistFieldsHtml.forAttr = ' for="' + fieldOption.optionValue.toLowerCase() + '"';// DefaultlistFieldsHtml.defaultAttr = '';//réinitialisationif( fieldOption.isDefault ) {listFieldsHtml.defaultAttr = ' checked';//affectation}// value-idif( '' !== fieldOption.optionIndex ) {listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';}fieldHtml +='<label' +// ForlistFieldsHtml.forAttr +// value-idlistFieldsHtml.optionIdAttr +'>' +'<input type="checkbox"' +// IdlistFieldsHtml.inputIdAttr +// value-idlistFieldsHtml.optionIdAttr +// NamecommonFieldsHtml.fieldInput.nameAttr +// Value' value="' + fieldOption.optionValue + '"' +// CheckedlistFieldsHtml.defaultAttr +// Class="nom du champ"commonFieldsHtml.fieldInput.classAttr +// DataIdcommonFieldsHtml.dataIdAttr +'>' +// Label de l'optionfieldOption.optionText +'</label>';}// Si valeur "autre" est cochéeif( fieldOtherValue ) {fieldHtml +='<label for="other"' +// DataIdcommonFieldsHtml.dataIdAttr +'>' +'<input type="checkbox"' +' id="other"' +commonFieldsHtml.fieldInput.nameAttr +' value="other"' +commonFieldsHtml.fieldInput.classAttr +// DataIdcommonFieldsHtml.dataIdAttr +'>' +'Autre</label>';}// Fermeture des conteneurs .multiselect .checkboxesfieldHtml +='</div>'+'</div>' +// Bouton 'help'commonFieldsHtml.helpButton;break;case 'select':fieldHtml ='<label' +commonFieldsHtml.fieldLabel.forAttr +// Info bullecommonFieldsHtml.titleAttr +'>' +// Nom du champlistFieldsHtml.containerContent +'</label>' +// Conteneur/Wrapper// +Classe 'and-help''<div class="select-wrapper add-field-select ' + fieldElement + commonFieldsHtml.helpClass + '"' +// DataIDcommonFieldsHtml.dataIdAttr +'>' +'<select' +commonFieldsHtml.fieldInput.nameAttr +' id="' + fieldKey + '"' +// ClasscommonFieldsHtml.fieldInput.classAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// DataIdcommonFieldsHtml.dataIdAttr +'>';// On déroule les différentes valeursfor( let i = 0; i < count; i++ ) {let fieldOption = fieldOptions[i];// DefaultlistFieldsHtml.defaultAttr = '';//réinitialisationif( fieldOption.isDefault ) {//affectationlistFieldsHtml.defaultAttr = ' selected="selected"';}// value-idif( '' !== fieldOption.optionIndex ) {listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';}fieldHtml +='<option' +// Value' value="' + fieldOption.optionValue + '"' +// Value-idlistFieldsHtml.optionIdAttr +// SelectedlistFieldsHtml.defaultAttr +'>' +// OptionfieldOption.optionText +'</option>';}// Si valeur "autre" est cochéeif( fieldOtherValue ) {fieldHtml +='<option class="other" value="other"' + commonFieldsHtml.dataIdAttr + '>' +'Autre' +'</option>';}// Fermeture des conteneursfieldHtml +='</select>' +// Fin du conteneur/wrapper'</div>' +// Bouton 'help'commonFieldsHtml.helpButton;break;case 'file' :// Ouvrir l'attribut class (suppression de '"')commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);commonFieldsHtml.fieldInput.classAttr += ' input-file"';// Class du labelcommonFieldsHtml.fieldLabel.classAttr = ' class="label-file"';// Type de fichiers acceptéscommonFieldsHtml.fieldInput.otherAttr += ' accept="application/pdf, image/*, video/*"';fieldHtml =// Classe 'and-help''<div class="input-file-container' + commonFieldsHtml.helpClass + '">' +'<input' +// TypecommonFieldsHtml.fieldInput.typeAttr +// NamecommonFieldsHtml.fieldInput.nameAttr +// DataIdcommonFieldsHtml.dataIdAttr +// ClasscommonFieldsHtml.fieldInput.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// PlaceholdercommonFieldsHtml.fieldInput.placeholderAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// Autres attributscommonFieldsHtml.fieldInput.otherAttr +'>' +'<label' +// ForcommonFieldsHtml.fieldLabel.forAttr +// ClasscommonFieldsHtml.fieldLabel.classAttr +// Info-bullecommonFieldsHtml.titleAttr +'><i class="fas fa-download"></i> ' +// Nom du champcommonFieldsHtml.fieldLabel.labelContent +'</label>' +'</div>' +// Bouton supprimer le fichier'<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>' +// Bouton 'help'commonFieldsHtml.helpButton;break;case 'textarea':// Classe 'and-help'commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';// Autres attributscommonFieldsHtml.fieldInput.otherAttr += ' id="' + fieldKey + '"';fieldHtml ='<label' +// ForcommonFieldsHtml.fieldLabel.forAttr +// ClasscommonFieldsHtml.fieldLabel.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// Autres attributscommonFieldsHtml.fieldLabel.otherAttr +'>' +// Nom du champcommonFieldsHtml.fieldLabel.labelContent +'</label>' +// Bouton 'help'commonFieldsHtml.helpButton +'<textarea' +// NamecommonFieldsHtml.fieldInput.nameAttr +// DataIdcommonFieldsHtml.dataIdAttr +// ClasscommonFieldsHtml.fieldInput.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// Info-bullecommonFieldsHtml.fieldInput.placeholderAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// Autres attributscommonFieldsHtml.fieldInput.otherAttr +'></textarea>';break;case 'range':// Classe 'and-help'commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';// Stepif( '' !== fieldStep ) {commonFieldsHtml.fieldInput.otherAttr += ' step="' + fieldStep + '"';}// Minif( '' !== fieldMin ) {commonFieldsHtml.fieldInput.otherAttr += ' min="' + fieldMin + '"';}//Maxif( '' !== fieldMax ) {commonFieldsHtml.fieldInput.otherAttr += ' max="' + fieldMax + '"';}fieldHtml ='<div' +' class="range"' +' id="' + fieldKey + '"' +'>' +'<label' +// ForcommonFieldsHtml.fieldLabel.forAttr +// ClasscommonFieldsHtml.fieldLabel.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// Autres attributscommonFieldsHtml.fieldLabel.otherAttr +'>' +// Nom du champcommonFieldsHtml.fieldLabel.labelContent +'</label>' +// Bouton 'help'commonFieldsHtml.helpButton +'<input' +// TypecommonFieldsHtml.fieldInput.typeAttr +// NamecommonFieldsHtml.fieldInput.nameAttr +// DataIdcommonFieldsHtml.dataIdAttr +// ClasscommonFieldsHtml.fieldInput.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// Default' value="' + fieldDefaultNum + '"' +// Autres attributscommonFieldsHtml.fieldInput.otherAttr +'>' +'<input' +' type="number"' +' name="' + fieldKey + 'Output"' +// Info-bullecommonFieldsHtml.titleAttr +// PlaceholdercommonFieldsHtml.fieldInput.placeholderAttr +' value="' + fieldDefaultNum + '"' +// Autres attributscommonFieldsHtml.fieldInput.otherAttr +// DataIdcommonFieldsHtml.dataIdAttr +'>' +'</div>';break;case 'number':// Stepif( '' !== fieldStep ) {commonFieldsHtml.fieldInput.otherAttr += ' step="' + fieldStep + '"';}case 'date':// Ouvrir l'attribut class (suppression de '"')commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);// Classe 'and-help'commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass + '"';// Minif( '' !== fieldMin ) {commonFieldsHtml.fieldInput.otherAttr += ' min="' + fieldMin + '"';}// Maxif( '' !== fieldMax ) {commonFieldsHtml.fieldInput.otherAttr += ' max="' + fieldMax + '"';}fieldHtml ='<div class="number">' +'<label' +// ForcommonFieldsHtml.fieldLabel.forAttr +// ClasscommonFieldsHtml.fieldLabel.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// Autres attributscommonFieldsHtml.fieldLabel.otherAttr +'>' +// Nom du champcommonFieldsHtml.fieldLabel.labelContent +'</label>' +'<input' +// TypecommonFieldsHtml.fieldInput.typeAttr +// NamecommonFieldsHtml.fieldInput.nameAttr +// DataIdcommonFieldsHtml.dataIdAttr +// ClasscommonFieldsHtml.fieldInput.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// PlaceholdercommonFieldsHtml.fieldInput.placeholderAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// Default' value="' + fieldDefaultNum + '"' +// Autres attributscommonFieldsHtml.fieldInput.otherAttr +'>' +// Bouton 'help'commonFieldsHtml.helpButton +'</div>';break;case 'text' :case 'email':default:// Ouvrir l'attribut class (suppression de '"')commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);// Classe 'and-help'commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass + '"';fieldHtml ='<label' +// ForcommonFieldsHtml.fieldLabel.forAttr +// ClasscommonFieldsHtml.fieldLabel.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// Autres attributscommonFieldsHtml.fieldLabel.otherAttr +'>' +// Nom du champcommonFieldsHtml.fieldLabel.labelContent +'</label>' +'<input' +// TypecommonFieldsHtml.fieldInput.typeAttr +// NamecommonFieldsHtml.fieldInput.nameAttr +// DataIdcommonFieldsHtml.dataIdAttr +// ClasscommonFieldsHtml.fieldInput.classAttr +// Info-bullecommonFieldsHtml.titleAttr +// Info-bullecommonFieldsHtml.fieldInput.placeholderAttr +// RequiredcommonFieldsHtml.fieldInput.mandatoryAttr +// Autres attributscommonFieldsHtml.fieldInput.otherAttr +'>' +// Bouton 'help'commonFieldsHtml.helpButton;break;}return fieldHtml;}// Construire un tableau des options pour chaque élément de listesfunction collectListOptions( thisFieldset ) {var $details = $( '.field-details' , thisFieldset ),options = [];$details.find( '.new-value' ).each( function() {options.push({// Valeur transmise (value)optionValue : $( this ).find('.list-value').val().toLowerCase(),// Valeur VisibleoptionText : $( this ).find('.list-value').val(),// Booléen "default"isDefault : $( this ).find( '.is-defaut-value').is( ':checked' ),// Indice de l'optionoptionIndex : $( this ).attr('data-list-value-id')});});return options;}// Faire apparaitre un champ text "Autre"function onOtherOption( thisFieldset , index ) {// Ce champ (dans la prévisualisation)var thisPreviewFieldset = $( '.preview-fields[data-id="' + index + '"]'),//L'élément choisielement = $('.field-element' , thisFieldset ).val(),// Où insérer le champ "Autre"$element = $( '.' + element , thisPreviewFieldset ),// html du champ "Autre"collectOther ='<label data-id="' + index + '" for="collect-other">Autre option :</label>' +'<input type="text" name="collect-other" data-id="' + index + '" class="collect-other" >';// Pouvoir supprimer le champ "Autre"function optionRemove( thisPreviewFieldset ) {$( 'label[for="collect-other"]' , thisPreviewFieldset ).remove();$( 'input.collect-other' , thisPreviewFieldset ).remove();}switch( element ) {case 'radio' :// Lorsqu'un nouveau bouton est coché$( 'input' , thisPreviewFieldset ).on( 'change' , function () {if( 'other' === $( this ).val() ) {// Insertion du champ "Autre" après les boutons$element.after( collectOther );} else {// Suppression du champ autreoptionRemove( thisPreviewFieldset );}});break;case 'select' :// Lorsque l'option "Autre" est selectionnée$( 'select' , thisPreviewFieldset ).on( 'change' , function () {if( 'other' === $( this).val() ) {// Insertion du champ "Autre" après les boutons$element.after( collectOther );// Suppression du champ autre} else {optionRemove( thisPreviewFieldset );}});break;case 'checkbox' :case 'list-checkbox' :// Lorsque "Autre" est coché$( 'input#other' , thisPreviewFieldset ).on( 'click' , function () {// Insertion du champ "Autre" après les boutonsif( $( this ).is( ':checked' ) ) {$element.after( collectOther );} else {// Suppression du champ autreoptionRemove( thisPreviewFieldset );}});break;default :break;}}// Prévisualisation des nouveaux champsfunction newFieldsPreview() {var count = $( 'fieldset' ).last().attr('data-id');// Si on a déjà prévisualisé on efface tout pour recommencerif( 0 < $( '.preview-fields' ).length ) {$( '.preview-fields' ).each( function () {$( this ).remove();});}// Au premier ajout d'un champ dans la prévisualisation on ajoute un titre et un messageif( true === firstClick ) {$( '#zone-supp' ).prepend('<h2>Informations propres au projet</h2>' +'<div class="message">L\'objectif principal de cet aperçu est de vérifier les contenus et repérer d\'éventuelles erreurs</div>');}// Parcourir tous les blocs d'infos de champs supplémentairesfor( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {var thisFieldset = $( 'fieldset[data-id="' + index + '"]');// Certains indices peuvent correspondre à un champ suppriméif( 0 < $( thisFieldset ).length ) {// Prévisualisation d'un champ$( '#zone-supp .preview-container' ).append('<div class="preview-fields" data-id="' + index + '">'+onClickPreviewField( thisFieldset , index ) +'</div>');// Ajout/suppression d'un champ texte "Autre"if( $( '.option-other-value' , thisFieldset ).is( ':checked' ) ) {onOtherOption( thisFieldset , index);}}}// Le titre + message de la section prévisualisation ne sont ajoutés qu'une foisfirstClick = false;}// Activation/Desactivation et contenu de la modale Bootstrap// https://getbootstrap.com/docs/3.3/javascript/#modalsfunction previewFieldHelpModal() {$( '#zone-supp' ).on( 'click' , '.help-button' , function ( event ) {var index = $( this ).closest( '.preview-fields' ).attr( 'data-id' ),thisFieldset = $( '.new-field[data-id="' + index + '"]' ),file = $( '.field-help' , thisFieldset )[0].files[0],tmppath = URL.createObjectURL( file );// Titre$( '#help-modal-label' ).text( 'Aide pour : ' + $( '.field-name' , thisFieldset ).val() );// Contenuif( file.type.match( 'image' ) ) {$( '#print_content' ).append( '<img src="' + tmppath + '" style="max-width:100%">' );} else if( file.type.match( 'pdf' ) ) {$( '#print_content' ).append( '<iframe src="' + tmppath + '" width="100%" height="650" align="middle" scrolling="no" frameborder="0"></iframe>' );}// Sortie avec la touche escape$( '#help-modal' ).modal( { keyboard : true } );// Affichage$( '#help-modal' ).modal( 'show' );// Remplacer l'autofocus qui ne fonctionne plus en HTML5// Message dans la doc de bootstrap :// Due to how HTML5 defines its semantics,// the autofocus HTML attribute has no effect in Bootstrap modals.// To achieve the same effect, use some custom JavaScript$( '#help-modal' ).on( 'shown.bs.modal' , function () {$( '#myInput' ).trigger( 'focus' );})// Réinitialisation$( '#help-modal' ).on( 'hidden.bs.modal' , function () {$( '#help-modal-label' ).text();$( '#print_content' ).empty();})});}/**************************** Lancement des scripts ****************************/// Tableau d'envoi des donnéesvar datasToSubmit = new Array();// Variable permettant un seul affichage du titre// de la prévisualisation pour les nouveaux champsvar firstClick = true;jQuery( document ).ready( function() {// Identifiant de champvar fieldIndex = 0;// Ajout de nouveaux champsonClickAddNewFields( fieldIndex );// Activation/Desactivation des boutons valider et prévisualiseractivatePreviewAndValidateButtons();// Prévisualisation des champs classiquesDisplayClassicFields();// Affichage des images ou nom des documents importésinputFile();// Affichage des List-checkboxinputListCheckbox();// Affichage des RangeinputRangeDisplayNumber()// Modale "aide"previewFieldHelpModal();});