Subversion Repositories eFlore/Applications.cel

Rev

Rev 3177 | Rev 3183 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3177 Rev 3178
1
"use strict";
1
"use strict";
2
 
2
 
3
/*************************************
3
/*************************************
4
 *  Fonctions de Style et Affichage  *
4
 *  Fonctions de Style et Affichage  *
5
 *      des éléments "spéciaux"      *
5
 *      des éléments "spéciaux"      *
6
 *************************************/
6
 *************************************/
7
 
7
 
8
// Logique d'affichage pour le input type=file
8
// Logique d'affichage pour le input type=file
9
function inputFile() {
9
function inputFile() {
10
  // Initialisation des variables
10
  // Initialisation des variables
11
  var $fileInput  = $( '.input-file' ),
11
  var $fileInput  = $( '.input-file' ),
12
      $button     = $( '.label-file' ),
12
      $button     = $( '.label-file' ),
13
      thisId = '';
13
      thisId = '';
14
  // Action lorsque la "barre d'espace" ou "Entrée" est pressée
14
  // Action lorsque la "barre d'espace" ou "Entrée" est pressée
15
  $( '.label-file' ).keydown( function( event ) {
15
  $( '.label-file' ).keydown( function( event ) {
16
    if ( event.keyCode == 13 || event.keyCode == 32 ) {
16
    if ( event.keyCode == 13 || event.keyCode == 32 ) {
17
      $( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();
17
      $( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();
18
    }
18
    }
19
  });
19
  });
20
  // Action lorsque le label est cliqué
20
  // Action lorsque le label est cliqué
21
  $( '.label-file' ).click( function(event) {
21
  $( '.label-file' ).click( function(event) {
22
    $( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();
22
    $( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();
23
    return false;
23
    return false;
24
  });
24
  });
25
  // Affiche un retour visuel dès que input:file change
25
  // Affiche un retour visuel dès que input:file change
26
  $fileInput.change( function( event ) {
26
  $fileInput.change( function( event ) {
27
    // Il est possible de supprimer un fichier
27
    // Il est possible de supprimer un fichier
28
    // donc on vérifie que le 'change' est un ajout ou modification
28
    // donc on vérifie que le 'change' est un ajout ou modification
29
    if( !$.isEmptyObject( event.target.files[0] ) ) {
29
    if( !$.isEmptyObject( event.target.files[0] ) ) {
30
      var file = event.target.files[0],
30
      var file = event.target.files[0],
31
        $theReturn = $( '.' + $( this ).attr( 'id' ) );
31
        $theReturn = $( '.' + $( this ).attr( 'id' ) );
32
      // Affichage du nom du fichier
32
      // Affichage du nom du fichier
33
      $theReturn.text( file.name );
33
      $theReturn.text( file.name );
34
      // Si le fichier est une image on l'affiche
34
      // Si le fichier est une image on l'affiche
35
      if( file.type.match( 'image' ) ) {
35
      if( file.type.match( 'image' ) ) {
36
        // Chemin temporaire de l'image et affichage
36
        // Chemin temporaire de l'image et affichage
37
        var tmppath = URL.createObjectURL( file );
37
        var tmppath = URL.createObjectURL( file );
38
        $theReturn.removeClass( 'hidden' ).append( '<img src="' + tmppath + '" width="50%">' );
38
        $theReturn.removeClass( 'hidden' ).append( '<img src="' + tmppath + '" width="50%">' );
39
      }
39
      }
40
    }
40
    }
41
  });
41
  });
42
  // Annuler le téléchargement
42
  // Annuler le téléchargement
43
  $( '.remove-file' ).click( function() {
43
  $( '.remove-file' ).click( function() {
44
    var $thisFileInput = $( this ).prev( '.input-file-container' ).find( '.input-file' );
44
    var $thisFileInput = $( this ).prev( '.input-file-container' ).find( '.input-file' );
45
    $thisFileInput.wrap( '<form>' ).closest( 'form' ).get(0).reset();
45
    $thisFileInput.wrap( '<form>' ).closest( 'form' ).get(0).reset();
46
    $thisFileInput.triggerHandler( 'change' );
46
    $thisFileInput.triggerHandler( 'change' );
47
    $thisFileInput.unwrap();
47
    $thisFileInput.unwrap();
48
    $( this ).next( '.file-return' ).addClass( 'hidden' ).empty();
48
    $( this ).next( '.file-return' ).addClass( 'hidden' ).empty();
49
  });
49
  });
50
}
50
}
51
 
51
 
52
// Style et affichage des list-checkboxes
52
// Style et affichage des list-checkboxes
53
function inputListCheckbox() {
53
function inputListCheckbox() {
54
  // On écoute le click sur une list-checkbox ('.selectBox')
54
  // On écoute le click sur une list-checkbox ('.selectBox')
55
  // à tout moment de son insertion dans le dom
55
  // à tout moment de son insertion dans le dom
56
  $('#zone-appli').on( 'click' , '.selectBox' , function() {
56
  $('#zone-appli').on( 'click' , '.selectBox' , function() {
57
    $( '.checkboxes[data-id="' + $(this).attr( 'data-id' ) + '"]' ).toggleClass( 'hidden' );
57
    $( '.checkboxes[data-id="' + $(this).attr( 'data-id' ) + '"]' ).toggleClass( 'hidden' );
58
  });
58
  });
59
}
59
}
60
 
60
 
61
// Mettre la première lettre en majuscule, les autres en minuscule
61
// Mettre la première lettre en majuscule, les autres en minuscule
62
function capitalize( string ) {
62
function capitalize( string ) {
63
  return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
63
  return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
64
}
64
}
65
 
65
 
66
/***********************************************************
66
/***********************************************************
67
 *  Fonctions pour la création des champs supplémentaires  *
67
 *  Fonctions pour la création des champs supplémentaires  *
68
 ***********************************************************/
68
 ***********************************************************/
69
 
69
 
70
// Logique globale pour l'ajout de nouveaux champs
70
// Logique globale pour l'ajout de nouveaux champs
71
function onClickAddNewFields( fieldIndex ) {
71
function onClickAddNewFields( fieldIndex ) {
72
  // Bouton ajouter un champ
72
  // Bouton ajouter un champ
73
  $( '#add-fields' ).click( function() {
73
  $( '#add-fields' ).click( function() {
74
    // Affichage du formulaire pour un champ
74
    // Affichage du formulaire pour un champ
75
    displayNewField( fieldIndex );
75
    displayNewField( fieldIndex );
76
    // Affichage du nom du champ
76
    // Affichage du nom du champ
77
    onChangeDisplayFieldLabel( fieldIndex );
77
    onChangeDisplayFieldLabel( fieldIndex );
78
    // Empêcher de créer plus d'une fois la même clé
78
    // Empêcher de créer plus d'une fois la même clé
79
    onChangeCheckKeyUnique();
79
    onChangeCheckKeyUnique();
80
    // Affichage des images/nom des documents importés dans les champs ajoutés
80
    // Affichage des images/nom des documents importés dans les champs ajoutés
81
    inputFile();
81
    inputFile();
82
    // Recueil des informations correspondantes au nouveau champ
82
    // Recueil des informations correspondantes au nouveau champ
83
    onChangeFieldTypeCollectDetails( fieldIndex );
83
    onChangeFieldTypeCollectDetails( fieldIndex );
84
    // Suppression d'un champ
84
    // Suppression d'un champ
85
    onClickRemoveField();
85
    onClickRemoveField();
86
 
86
 
87
    fieldIndex++;
87
    fieldIndex++;
88
  });
88
  });
89
}
89
}
90
 
90
 
91
// Création/affichage du formulaire d'un nouveau champ
91
// Création/affichage du formulaire d'un nouveau champ
92
function displayNewField( fieldIndex ) {
92
function displayNewField( fieldIndex ) {
93
  // Html du formulaire du nouveaux champs inséré dans le dom
93
  // Html du formulaire du nouveaux champs inséré dans le dom
94
  $( '#new-fields' ).append(
94
  $( '#new-fields' ).append(
95
    '<fieldset data-id="' + fieldIndex + '" class="new-field">'+
95
    '<fieldset data-id="' + fieldIndex + '" class="new-field">'+
96
      '<h3>Nouveau champ :<br><strong class="field-title" data-id="' + fieldIndex + '"></strong></h3>'+
96
      '<h3>Nouveau champ :<br><strong class="field-title" data-id="' + fieldIndex + '"></strong></h3>'+
97
      // Nom du champ
97
      // Nom du champ
98
      '<label for="field-name" title="Donnez un titre à votre champ">Nom du champ *</label>'+
98
      '<label for="field-name" title="Donnez un titre à votre champ">Nom du champ *</label>'+
99
      '<input type="text" name="field-name" data-id="' + fieldIndex + '" class="field-name" placeholder="Titre de votre champ" title="Donnez un titre à votre champ" required>'+
99
      '<input type="text" name="field-name" data-id="' + fieldIndex + '" class="field-name" placeholder="Titre de votre champ" title="Donnez un titre à votre champ" required>'+
100
      // Clé du champ
100
      // Clé du champ
101
      '<label for="field-key" title="Nom du champ dans la base de données">'+
101
      '<label for="field-key" title="Nom du champ dans la base de données">'+
102
        'Clé du champ en camelCase (ecritureChameau)<br>'+
102
        'Clé du champ *'+
103
        '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+
-
 
104
        'Pas d\'accents ou de cédille, pas de caractères spéciaux. *'+
-
 
105
      '</label>'+
103
      '</label>'+
106
      '<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>'+
104
      '<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>'+
-
 
105
      '<p class="message">' +
-
 
106
        '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+
-
 
107
        'Une clé doit être unique<br>' +
-
 
108
        'En camelCase (ecriture chameau)<br>'+
-
 
109
        'Pas d\'accents ou de cédille, pas de caractères spéciaux.' +
-
 
110
      '</p>' +
107
      // Type de champ
111
      // Type de champ
108
      '<label for="field-element" title="Quel type de champ">Type de champ *</label>'+
112
      '<label for="field-element" title="Quel type de champ">Type de champ *</label>'+
109
      '<div class="select-wrapper add-field-select" data-id="' + fieldIndex + '">'+
113
      '<div class="select-wrapper add-field-select" data-id="' + fieldIndex + '">'+
110
        '<select name="field-element" data-id="' + fieldIndex + '" class="field-element">'+
114
        '<select name="field-element" data-id="' + fieldIndex + '" class="field-element">'+
111
          '<option value="text">Champ texte</option>'+
115
          '<option value="text">Champ texte</option>'+
112
          '<option value="email">Champ email</option>'+
116
          '<option value="email">Champ email</option>'+
113
          '<option value="textarea">Champ rédaction</option>'+
117
          '<option value="textarea">Champ rédaction</option>'+
114
          '<option value="select">Menu déroulant</option>'+
118
          '<option value="select">Menu déroulant</option>'+
115
          '<option value="checkbox">Cases à cocher</option>'+
119
          '<option value="checkbox">Cases à cocher</option>'+
116
          '<option value="list-checkbox">Liste de cases à cocher</option>'+
120
          '<option value="list-checkbox">Liste de cases à cocher</option>'+
117
          '<option value="radio">Boutons radio</option>'+
121
          '<option value="radio">Boutons radio</option>'+
118
          '<option value="date">Calendrier</option>'+
122
          '<option value="date">Calendrier</option>'+
119
          '<option value="file">Téléchargement</option>'+
123
          '<option value="file">Téléchargement</option>'+
120
          '<option value="range">Curseur (entre 2 bornes)</option>'+
124
          '<option value="range">Curseur (entre 2 bornes)</option>'+
121
          '<option value="number">Nombre</option>'+
125
          '<option value="number">Nombre</option>'+
122
        '</select>'+
126
        '</select>'+
123
      '</div>'+
127
      '</div>'+
124
      // Checkbox "champ requis"
128
      // Checkbox "champ requis"
125
      '<label for="field-is_mandatory" title="Ce champ est obligatoire">Champ requis ?</label>'+
129
      '<label for="field-is_mandatory" title="Ce champ est obligatoire">Champ requis ?</label>'+
126
      '<input type="checkbox" name="field-is_mandatory" data-id="' + fieldIndex + '" class="field-is_mandatory">'+
130
      '<input type="checkbox" name="field-is_mandatory" data-id="' + fieldIndex + '" class="field-is_mandatory">'+
127
      // Unité des valeurs
131
      // Unité des valeurs
128
      '<label for="field-unit" title="Unité de mesure de vos valeurs">Unités ( cm, kg, ha, etc.)</label>'+
132
      '<label for="field-unit" title="Unité de mesure de vos valeurs">Unités ( cm, kg, ha, etc.)</label>'+
129
      '<input type="text" name="field-unit" data-id="' + fieldIndex + '" class="field-unit" placeholder="symbole de vos unités">'+
133
      '<input type="text" name="field-unit" data-id="' + fieldIndex + '" class="field-unit" placeholder="symbole de vos unités">'+
130
      // Tooltip
134
      // Tooltip
131
      '<label for="field-description" title="Ajoutez une info-bulle">Info-bulle</label>'+
135
      '<label for="field-description" title="Ajoutez une info-bulle">Info-bulle</label>'+
132
      '<input type="text" name="field-description" data-id="' + fieldIndex + '" class="field-description" placeholder="Quelques mots">'+
136
      '<input type="text" name="field-description" data-id="' + fieldIndex + '" class="field-description" placeholder="Quelques mots">'+
133
      // Import d'une image ou d'un pdf d'aide à afficher en popup
137
      // Import d'une image ou d'un pdf d'aide à afficher en popup
134
      '<div class="input-file-container">'+
138
      '<div class="input-file-container">'+
135
        '<input type="file" class="input-file field-help" name="field-help" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="application/pdf, image/*, video/*">'+
139
        '<input type="file" class="input-file field-help" name="field-help" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="application/pdf, image/*, video/*">'+
136
        '<label for="field-help" class="label-file"><i class="fas fa-download"></i> Popup aide image/pdf</label>'+
140
        '<label for="field-help" class="label-file"><i class="fas fa-download"></i> Popup aide image/pdf</label>'+
137
      '</div>'+
141
      '</div>'+
138
      '<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>'+
142
      '<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>'+
139
      '<div class="file-return help-doc-' + fieldIndex + ' hidden"></div>'+
143
      '<div class="file-return help-doc-' + fieldIndex + ' hidden"></div>'+
140
      // Boutons supprimer
144
      // Boutons supprimer
141
      '<label for="remove-field">Supprimer</label>'+
145
      '<label for="remove-field">Supprimer</label>'+
142
      '<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>'+
146
      '<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>'+
143
    '</fieldset>'
147
    '</fieldset>'
144
  );
148
  );
145
  // Animation de l'affichage
149
  // Animation de l'affichage
146
  $( 'fieldset.new-field[data-id="' + fieldIndex + '"]').hide().show( 200 );
150
  $( 'fieldset.new-field[data-id="' + fieldIndex + '"]').hide().show( 200 );
147
}
151
}
148
 
152
 
149
// Affichage du nom du champ dès qu'il est renseigné
153
// Affichage du nom du champ dès qu'il est renseigné
150
function onChangeDisplayFieldLabel( fieldIndex ) {
154
function onChangeDisplayFieldLabel( fieldIndex ) {
151
  $('.field-name[data-id="' + fieldIndex + '"]').change( function() {
155
  $('.field-name[data-id="' + fieldIndex + '"]').change( function() {
152
    $( '.field-title[data-id="' + fieldIndex + '"]' ).text( $( this ).val() );
156
    $( '.field-title[data-id="' + fieldIndex + '"]' ).text( $( this ).val() );
153
  });
157
  });
154
}
158
}
155
 
159
 
156
// Supprimer un nouveau champ
160
// Supprimer un nouveau champ
157
function onClickRemoveField ( keyFlag , nameFlag ) {
161
function onClickRemoveField ( keyFlag , nameFlag ) {
158
  $( '.remove-field' ).click( function() {
162
  $( '.remove-field' ).click( function() {
159
    $(this).closest('fieldset').hide( 200 , function () {
163
    $(this).closest('fieldset').hide( 200 , function () {
160
      $(this).remove();
164
      $(this).remove();
161
    });
165
    });
162
  });
166
  });
163
}
167
}
164
 
168
 
165
 
169
 
166
/**** Recueil des informations et détails qui dépendent du type de champ choisi ****/
170
/**** Recueil des informations et détails qui dépendent du type de champ choisi ****/
167
 
171
 
168
// Logique de recueil d'informations en fonction du type de champ choisi
172
// Logique de recueil d'informations en fonction du type de champ choisi
169
function onChangeFieldTypeCollectDetails( fieldIndex ) {
173
function onChangeFieldTypeCollectDetails( fieldIndex ) {
170
  // On insère les champs par défaut de recueil d'informations
174
  // On insère les champs par défaut de recueil d'informations
171
  displayFieldDetailsCollect(
175
  displayFieldDetailsCollect(
172
    fieldIndex,
176
    fieldIndex,
173
    // Placeholder (champ type text par défaut)
177
    // Placeholder (champ type text par défaut)
174
    '<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>'+
178
    '<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>'+
175
    '<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'
179
    '<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'
176
  );
180
  );
177
  // Sinon :
181
  // Sinon :
178
  $( '.field-element[data-id="' + fieldIndex + '"]' ).change( function() {
182
  $( '.field-element[data-id="' + fieldIndex + '"]' ).change( function() {
179
    // On intialise l'index pour les listes la variable qui contiendra un id pour chaque option
183
    // On intialise l'index pour les listes la variable qui contiendra un id pour chaque option
180
    var valueIndex = 0;
184
    var valueIndex = 0;
181
    // Si on hésite on qu'on se trompe dans la liste :
185
    // Si on hésite on qu'on se trompe dans la liste :
182
    // les champs de détails de l'option précédente doivent être supprimés
186
    // les champs de détails de l'option précédente doivent être supprimés
183
    $( '.field-details[data-id="' + fieldIndex + '"]' ).hide( 200 , function () {
187
    $( '.field-details[data-id="' + fieldIndex + '"]' ).hide( 200 , function () {
184
      $(this).remove();
188
      $(this).remove();
185
    });
189
    });
186
 
190
 
187
    // Html de recueil de données en fonction de l'élément choisi
191
    // Html de recueil de données en fonction de l'élément choisi
188
    switch( $( this ).val() ) {
192
    switch( $( this ).val() ) {
189
      case 'file':
193
      case 'file':
190
        break;
194
        break;
191
 
195
 
192
      case 'number':
196
      case 'number':
193
      case 'range':
197
      case 'range':
194
        displayFieldDetailsCollect(
198
        displayFieldDetailsCollect(
195
          fieldIndex,
199
          fieldIndex,
196
          '<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>' +
200
          '<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>' +
197
          // Placeholder
201
          // Placeholder
198
          '<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>'+
202
          '<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>'+
199
          '<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'+
203
          '<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'+
200
          // Valeur par défaut
204
          // Valeur par défaut
201
          '<label for="default" title="Valeur par défaut">Valeur par défaut</label>'+
205
          '<label for="default" title="Valeur par défaut">Valeur par défaut</label>'+
202
          '<input type="number" name="default" data-id="' + fieldIndex + '" class="default" step="0.01">'+
206
          '<input type="number" name="default" data-id="' + fieldIndex + '" class="default" step="0.01">'+
203
          // Incrémentation ( attribut step="" )
207
          // Incrémentation ( attribut step="" )
204
          '<label for="step" title="De 10 en 10, de 0.5 en 0.5, etc.">Incrémentation (step) :<br>defaut = +1</label>'+
208
          '<label for="step" title="De 10 en 10, de 0.5 en 0.5, etc.">Incrémentation (step) :<br>defaut = +1</label>'+
205
          '<input type="number" name="step" data-id="' + fieldIndex + '" class="step" step="0.01" value="1">'+
209
          '<input type="number" name="step" data-id="' + fieldIndex + '" class="step" step="0.01" value="1">'+
206
          // Min
210
          // Min
207
          '<label for="min" title="valeur min">Valeur minimale</label>'+
211
          '<label for="min" title="valeur min">Valeur minimale</label>'+
208
          '<input type="number" name="min" data-id="' + fieldIndex + '" class="min" step="0.01" value="0">'+
212
          '<input type="number" name="min" data-id="' + fieldIndex + '" class="min" step="0.01" value="0">'+
209
          // Max
213
          // Max
210
          '<label for="max" title="valeur max">Valeur maximale</label>'+
214
          '<label for="max" title="valeur max">Valeur maximale</label>'+
211
          '<input type="number" name="max" data-id="' + fieldIndex + '" class="max" step="0.01" value="1">'
215
          '<input type="number" name="max" data-id="' + fieldIndex + '" class="max" step="0.01" value="1">'
212
        );
216
        );
213
        break;
217
        break;
214
 
218
 
215
      case 'date':
219
      case 'date':
216
        displayFieldDetailsCollect(
220
        displayFieldDetailsCollect(
217
          fieldIndex,
221
          fieldIndex,
218
          // Date min
222
          // Date min
219
          '<label for="min" title="date min">Date minimale</label>'+
223
          '<label for="min" title="date min">Date minimale</label>'+
220
          '<input type="date" name="min" data-id="' + fieldIndex + '" class="min">'+
224
          '<input type="date" name="min" data-id="' + fieldIndex + '" class="min">'+
221
          // Date max
225
          // Date max
222
          '<label for="max" title="date max">Date maximale</label>'+
226
          '<label for="max" title="date max">Date maximale</label>'+
223
          '<input type="date" name="max" data-id="' + fieldIndex + '" class="max">'
227
          '<input type="date" name="max" data-id="' + fieldIndex + '" class="max">'
224
        );
228
        );
225
        break;
229
        break;
226
 
230
 
227
      case 'select':
231
      case 'select':
228
      case 'checkbox':
232
      case 'checkbox':
229
      case 'list-checkbox':
233
      case 'list-checkbox':
230
      case 'radio':
234
      case 'radio':
231
        displayFieldDetailsCollect(
235
        displayFieldDetailsCollect(
232
          fieldIndex,
236
          fieldIndex,
233
          '<p class="message">Ajoutez les valeurs de \"' + $( this ).children( 'option:selected' ).text() + '\"</p>'+
237
          '<p class="message">Ajoutez les valeurs de \"' + $( this ).children( 'option:selected' ).text() + '\"</p>'+
234
          // Bouton ajout d'une valeur à la liste
238
          // Bouton ajout d'une valeur à la liste
235
          '<label for="add-value" class="add-value" data-id="' + fieldIndex + '" title="Ajouter une valeur à la liste">Ajouter une valeur</label>'+
239
          '<label for="add-value" class="add-value" data-id="' + fieldIndex + '" title="Ajouter une valeur à la liste">Ajouter une valeur</label>'+
236
          '<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>'+
240
          '<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>'+
237
          // checkbox ajouter une valeur "Autre:"
241
          // checkbox ajouter une valeur "Autre:"
238
          '<label for="option-other-value" title="Ajouter une option \'Autre:\' à la fin">Valeur "Autre"</label>'+
242
          '<label for="option-other-value" title="Ajouter une option \'Autre:\' à la fin">Valeur "Autre"</label>'+
239
          '<input type="checkbox" name="option-other-value" data-id="' + fieldIndex + '" class="option-other-value" title="Ajouter une option \'Autre\' à la fin">'
243
          '<input type="checkbox" name="option-other-value" data-id="' + fieldIndex + '" class="option-other-value" title="Ajouter une option \'Autre\' à la fin">'
240
        );
244
        );
241
        break;
245
        break;
242
 
246
 
243
      case 'email':
247
      case 'email':
244
      case 'text':
248
      case 'text':
245
      case 'textarea':
249
      case 'textarea':
246
      default:
250
      default:
247
        displayFieldDetailsCollect(
251
        displayFieldDetailsCollect(
248
          fieldIndex,
252
          fieldIndex,
249
        // Placeholder
253
        // Placeholder
250
        '<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>'+
254
        '<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>'+
251
        '<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'
255
        '<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'
252
      );
256
      );
253
        break;
257
        break;
254
    }
258
    }
255
    // Ajout des valeurs possibles
259
    // Ajout des valeurs possibles
256
    // lorsque le champ est une liste ou case à cocher
260
    // lorsque le champ est une liste ou case à cocher
257
    onClickAddNewValueToList( fieldIndex , valueIndex );
261
    onClickAddNewValueToList( fieldIndex , valueIndex );
258
  });
262
  });
259
}
263
}
260
 
264
 
261
// Insertion dans le dom des champs de recueil d'informations
265
// Insertion dans le dom des champs de recueil d'informations
262
function displayFieldDetailsCollect( fieldIndex , fieldDetails ) {
266
function displayFieldDetailsCollect( fieldIndex , fieldDetails ) {
263
  $( '.add-field-select[data-id="' + fieldIndex + '"]' ).after(
267
  $( '.add-field-select[data-id="' + fieldIndex + '"]' ).after(
264
    '<div class="field-details" data-id="' + fieldIndex + '">' +
268
    '<div class="field-details" data-id="' + fieldIndex + '">' +
265
      fieldDetails +
269
      fieldDetails +
266
    '</div>'
270
    '</div>'
267
  ).hide().show( 200);
271
  ).hide().show( 200);
268
}
272
}
269
 
273
 
270
/**** Ajout des valeurs (options) des "champs de listes" (select, checkbox, radio, etc.) ****/
274
/**** Ajout des valeurs (options) des "champs de listes" (select, checkbox, radio, etc.) ****/
271
 
275
 
272
// Ajout des options des listes (deroulantes, cases à cocher etc.)
276
// Ajout des options des listes (deroulantes, cases à cocher etc.)
273
function onClickAddNewValueToList( fieldIndex , valueIndex ) {
277
function onClickAddNewValueToList( fieldIndex , valueIndex ) {
274
  $( '.add-value-button[data-id="' + fieldIndex + '"]' ).click( function() {
278
  $( '.add-value-button[data-id="' + fieldIndex + '"]' ).click( function() {
275
    $( '.add-value[data-id="' + fieldIndex + '"]' ).before(
279
    $( '.add-value[data-id="' + fieldIndex + '"]' ).before(
276
      '<div class="new-value" data-list-value-id="' + valueIndex +'">'+
280
      '<div class="new-value" data-list-value-id="' + valueIndex +'">'+
277
        // Recueil d'une valeur de la liste
281
        // Recueil d'une valeur de la liste
278
        '<label for="list-value">Valeur  *:</label>'+
282
        '<label for="list-value">Valeur  *:</label>'+
279
        '<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>'+
283
        '<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>'+
280
        // Checkbox valeur par défaut+bouton supprimer
284
        // Checkbox valeur par défaut+bouton supprimer
281
        '<div class="row">'+
285
        '<div class="row">'+
282
          '<div class="col-md-5">'+
286
          '<div class="col-md-5">'+
283
            // Valeur par défaut
287
            // Valeur par défaut
284
            '<label for="is-defaut-value" title="Ceci est la valeur par défaut">Valeur par défaut</label>'+
288
            '<label for="is-defaut-value" title="Ceci est la valeur par défaut">Valeur par défaut</label>'+
285
            '<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 >'+
289
            '<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 >'+
286
          '</div>'+
290
          '</div>'+
287
          '<div class="col-md-5">'+
291
          '<div class="col-md-5">'+
288
            // Bouton supprimer une option
292
            // Bouton supprimer une option
289
            '<label for="remove-value">supprimer valeur</label>'+
293
            '<label for="remove-value">supprimer valeur</label>'+
290
            '<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>'+
294
            '<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>'+
291
          '</div>'+
295
          '</div>'+
292
        '</div>'+
296
        '</div>'+
293
      '</div>'
297
      '</div>'
294
    ).hide().show( 200);
298
    ).hide().show( 200);
295
    // Activer la checkbox de valeur par default uniquement si une valeur est entrée
299
    // Activer la checkbox de valeur par default uniquement si une valeur est entrée
296
    onInputListValueLabelEnableDefaultCheckbox( valueIndex );
300
    onInputListValueLabelEnableDefaultCheckbox( valueIndex );
297
    // Une seule valeur par défaut pour select et radio
301
    // Une seule valeur par défaut pour select et radio
298
    onClickDefaultValueRemoveOthers( fieldIndex );
302
    onClickDefaultValueRemoveOthers( fieldIndex );
299
    // Supprimer une valeur
303
    // Supprimer une valeur
300
    onClickRemoveListValue( fieldIndex );
304
    onClickRemoveListValue( fieldIndex );
301
 
305
 
302
    valueIndex++;
306
    valueIndex++;
303
  });
307
  });
304
}
308
}
305
 
309
 
306
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
310
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
307
function onInputListValueLabelEnableDefaultCheckbox( valueIndex ) {
311
function onInputListValueLabelEnableDefaultCheckbox( valueIndex ) {
308
  $( '.new-value[data-list-value-id="' + valueIndex + '"] .list-value' ).on( 'input' , function() {
312
  $( '.new-value[data-list-value-id="' + valueIndex + '"] .list-value' ).on( 'input' , function() {
309
    if( $(this).val() !== '' ) {
313
    if( $(this).val() !== '' ) {
310
      $( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).removeAttr( 'disabled');
314
      $( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).removeAttr( 'disabled');
311
    } else {
315
    } else {
312
      $( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).attr( 'disabled', true ).removeAttr( 'checked' );
316
      $( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).attr( 'disabled', true ).removeAttr( 'checked' );
313
    }
317
    }
314
  });
318
  });
315
}
319
}
316
 
320
 
317
// Pour les éléments "select" et "radio" il ne peut y avoir qu'une valeur par défaut cochée
321
// Pour les éléments "select" et "radio" il ne peut y avoir qu'une valeur par défaut cochée
318
function onClickDefaultValueRemoveOthers( fieldIndex ) {
322
function onClickDefaultValueRemoveOthers( fieldIndex ) {
319
  var selectedFieldElement = $( '.field-element[data-id="' + fieldIndex + '"]' ).val();
323
  var selectedFieldElement = $( '.field-element[data-id="' + fieldIndex + '"]' ).val();
320
 
324
 
321
  if( selectedFieldElement === 'select' || selectedFieldElement === 'radio' ) {
325
  if( selectedFieldElement === 'select' || selectedFieldElement === 'radio' ) {
322
    $( '.is-defaut-value[data-id="' + fieldIndex + '"]' ).click( function() {
326
    $( '.is-defaut-value[data-id="' + fieldIndex + '"]' ).click( function() {
323
     if( $( this ).attr( 'checked' ) ) {
327
     if( $( this ).attr( 'checked' ) ) {
324
        // Décocher tous les autres
328
        // Décocher tous les autres
325
        $( '.is-defaut-value[data-id="' + fieldIndex + '"]:checked' ).not( $( this) ).removeAttr( 'checked' );
329
        $( '.is-defaut-value[data-id="' + fieldIndex + '"]:checked' ).not( $( this) ).removeAttr( 'checked' );
326
      }
330
      }
327
    });
331
    });
328
  }
332
  }
329
}
333
}
330
 
334
 
331
// Bouton supprimer une valeur
335
// Bouton supprimer une valeur
332
function onClickRemoveListValue( fieldIndex ) {
336
function onClickRemoveListValue( fieldIndex ) {
333
  $( '.remove-value.button[data-id="' + fieldIndex + '"]' ).click( function() {
337
  $( '.remove-value.button[data-id="' + fieldIndex + '"]' ).click( function() {
334
    $( '.new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).hide( 200 , function () {
338
    $( '.new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).hide( 200 , function () {
335
      $(this).remove();
339
      $(this).remove();
336
    });
340
    });
337
  });
341
  });
338
}
342
}
339
 
343
 
340
/*********************************************
344
/*********************************************
341
 *  Validation et envoi des nouveaux champs  *
345
 *  Validation et envoi des nouveaux champs  *
342
 *********************************************/
346
 *********************************************/
343
 
347
 
344
// Empêcher de créer plus d'une fois la même clé
348
// Empêcher de créer plus d'une fois la même clé
345
function onChangeCheckKeyUnique() {
349
function onChangeCheckKeyUnique() {
346
 if( 1 < $( '.field-key' ).length ) {
350
 if( 1 < $( '.field-key' ).length ) {
347
    // Marqueur de valeur dupliquée
351
    // Marqueur de valeur dupliquée
348
    let notUnique = false;
352
    let notUnique = false;
349
 
353
 
350
    $( '.field-key' ).change( function () {
354
    $( '.field-key' ).change( function () {
351
      let count = $( '.field-key' ).length;
355
      let count = $( '.field-key' ).length;
352
 
356
 
353
      for(var index = 0 ; index < count ; index++) {
357
      for(var index = 0 ; index < count ; index++) {
354
        let thisFieldKey = $( '.field-key[data-id="' + index + '"]' );
358
        let thisFieldKey = $( '.field-key[data-id="' + index + '"]' );
355
        // Le champ avec cet index paourrait avoir été supprimé
359
        // Le champ avec cet index paourrait avoir été supprimé
356
        if( 0 < thisFieldKey.length ) {
360
        if( 0 < thisFieldKey.length ) {
357
          for( var otherIndex = 0 ; otherIndex < count ; otherIndex++ ) {
361
          for( var otherIndex = 0 ; otherIndex < count ; otherIndex++ ) {
358
            let otherFieldKey = $( '.field-key[data-id="' + otherIndex + '"]' );
362
            let otherFieldKey = $( '.field-key[data-id="' + otherIndex + '"]' );
359
            // Le champ avec cet index pourrait avoir été supprimé
363
            // Le champ avec cet index pourrait avoir été supprimé
360
            // On vérifie qu'on ne compare pas un champ avec lui-même
364
            // On vérifie qu'on ne compare pas un champ avec lui-même
361
            // Que les champs ne sont pas vides
365
            // Que les champs ne sont pas vides
362
            // Les champs dupliqués déclanchent le marqueur et les alertes
366
            // Les champs dupliqués déclanchent le marqueur et les alertes
363
            if(
367
            if(
364
              0 < otherFieldKey.length &&
368
              0 < otherFieldKey.length &&
365
              index !== otherIndex &&
369
              index !== otherIndex &&
366
              '' !== otherFieldKey.val() &&
370
              '' !== otherFieldKey.val() &&
367
              '' !== thisFieldKey.val() &&
371
              '' !== thisFieldKey.val() &&
368
              thisFieldKey.val() === otherFieldKey.val()
372
              thisFieldKey.val() === otherFieldKey.val()
369
            ) {
373
            ) {
370
              // Le marqueur de valeur dupliquée passe à true
374
              // Le marqueur de valeur dupliquée passe à true
371
              notUnique = true;
375
              notUnique = true;
372
              if( 0 === $( '.invalid-field-key[data-id="' + index + '"]' ).length ) {
376
              if( 0 === $( '.invalid-field-key[data-id="' + index + '"]' ).length ) {
373
                // Le champ est signalé en rouge
377
                // Le champ est signalé en rouge
374
                // Un message d'alerte apparait sous le champ
378
                // Un message d'alerte apparait sous le champ
375
                thisFieldKey.addClass( 'invalid' );
379
                thisFieldKey.addClass( 'invalid' );
376
                thisFieldKey.after(
380
                thisFieldKey.after(
377
                  '<p class="message invalid-field-key" data-id="' + index + '">' +
381
                  '<p class="message invalid-field-key" data-id="' + index + '">' +
378
                    '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
382
                    '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
379
                    ' Vérifiez qu\'aucune clé n\'ait été utilisée plus d\'une fois'  +
383
                    ' Vérifiez qu\'aucune clé n\'ait été utilisée plus d\'une fois'  +
380
                  '</p>'
384
                  '</p>'
381
                );
385
                );
382
              }
386
              }
383
            }
387
            }
384
          }
388
          }
385
        }
389
        }
386
      }
390
      }
387
      if( notUnique ) {
391
      if( notUnique ) {
388
        // Un message d'alerte apparait au dessus des boutons prévisualiser/valider
392
        // Un message d'alerte apparait au dessus des boutons prévisualiser/valider
389
        if( 0 === $( '.invalid-field-key-bottom' ).length ) {
393
        if( 0 === $( '.invalid-field-key-bottom' ).length ) {
390
          $( '#new-fields' ).after(
394
          $( '#new-fields' ).after(
391
            '<p class="message invalid-field-key-bottom">' +
395
            '<p class="message invalid-field-key-bottom">' +
392
              '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
396
              '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
393
              ' Une clé a été utilisée plusieurs fois' +
397
              ' Une clé a été utilisée plusieurs fois' +
394
            '</p>'
398
            '</p>'
395
          );
399
          );
396
        }
400
        }
397
        // Les boutons prévisualiser/valider sont désactivés et signalés en rouge
401
        // Les boutons prévisualiser/valider sont désactivés et signalés en rouge
398
        $( '#preview-field , #validate-new-fields' ).addClass( 'invalid' ).css( 'pointer-events', 'none' );
402
        $( '#preview-field , #validate-new-fields' ).addClass( 'invalid' ).css( 'pointer-events', 'none' );
399
      } else {// Si on est ok on retire toutes les alertes
403
      } else {// Si on est ok on retire toutes les alertes
400
        // signalements rouges
404
        // signalements rouges
401
        $( '.field-key' ).each( function() {
405
        $( '.field-key' ).each( function() {
402
          $( this ).removeClass( 'invalid' );
406
          $( this ).removeClass( 'invalid' );
403
        });
407
        });
404
        $( '#preview-field , #validate-new-fields' ).removeClass( 'invalid' );
408
        $( '#preview-field , #validate-new-fields' ).removeClass( 'invalid' );
405
        // messages d'alerte
409
        // messages d'alerte
406
        $( '.invalid-field-key' ).each( function() {
410
        $( '.invalid-field-key' ).each( function() {
407
          $( this ).hide( 200 , function () {
411
          $( this ).hide( 200 , function () {
408
            $( this ).remove();
412
            $( this ).remove();
409
          });
413
          });
410
        });
414
        });
411
        $( '.invalid-field-key-bottom' ).hide( 200 , function () {
415
        $( '.invalid-field-key-bottom' ).hide( 200 , function () {
412
          $( this ).remove();
416
          $( this ).remove();
413
        });
417
        });
414
        //réactivation des boutons prévisualiser/valider
418
        //réactivation des boutons prévisualiser/valider
415
        $( '#preview-field' )[0].style.removeProperty( 'pointer-events' );
419
        $( '#preview-field' )[0].style.removeProperty( 'pointer-events' );
416
        $( '#validate-new-fields' )[0].style.removeProperty( 'pointer-events' )
420
        $( '#validate-new-fields' )[0].style.removeProperty( 'pointer-events' )
417
      }
421
      }
418
      // Réinitialisation
422
      // Réinitialisation
419
      notUnique = false;
423
      notUnique = false;
420
    });
424
    });
421
  }
425
  }
422
}
426
}
423
 
427
 
424
//Activation/Désactivation des boutons valider/prévisualiser
428
//Activation/Désactivation des boutons valider/prévisualiser
425
function activatePreviewAndValidateButtons() {
429
function activatePreviewAndValidateButtons() {
426
  var invalidElementInfos = false, // true si aucune option n'a été entrée pour un élément de liste (select, radio, etc.)
430
  var invalidElementInfos = false, // true si aucune option n'a été entrée pour un élément de liste (select, radio, etc.)
427
      invalidTextInfos    = false; // true si au moins un input required n'est pas renseigné
431
      invalidTextInfos    = false; // true si au moins un input required n'est pas renseigné
428
  // Clique sur le bouton prévisualiser ou valider
432
  // Clique sur le bouton prévisualiser ou valider
429
  $('#preview-field , #validate-new-fields').on( 'click' , function() {
433
  $('#preview-field , #validate-new-fields').on( 'click' , function() {
430
    // S'il n'y a pas (plus) de bloc nouveau champ
434
    // S'il n'y a pas (plus) de bloc nouveau champ
431
    if( 0 === $( 'fieldset' ).length ) {
435
    if( 0 === $( 'fieldset' ).length ) {
432
      return;
436
      return;
433
    }
437
    }
434
    var count = $( 'fieldset' ).last().attr('data-id');
438
    var count = $( 'fieldset' ).last().attr('data-id');
435
    // si on a déjà des avertissements on les supprime
439
    // si on a déjà des avertissements on les supprime
436
    if( 0 < $( '.validation-warning' ).length ) {
440
    if( 0 < $( '.validation-warning' ).length ) {
437
      // Supprimer les messages
441
      // Supprimer les messages
438
      $( '.validation-warning' ).each( function() {
442
      $( '.validation-warning' ).each( function() {
439
        $( this ).hide( 200 , function () {
443
        $( this ).hide( 200 , function () {
440
          $( this ).remove();
444
          $( this ).remove();
441
        });
445
        });
442
      });
446
      });
443
      // Supprimer les bordures en rouge vif
447
      // Supprimer les bordures en rouge vif
444
      $('.add-value-button , input[required]' ).each( function() {
448
      $('.add-value-button , input[required]' ).each( function() {
445
        $( this ).removeClass( 'invalid' );
449
        $( this ).removeClass( 'invalid' );
446
      });
450
      });
447
    }
451
    }
448
    // Parcourir tous les blocs d'infos de champs supplémentaires
452
    // Parcourir tous les blocs d'infos de champs supplémentaires
449
    for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
453
    for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
450
      var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
454
      var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
451
      // Certains indices peuvent correspondre à un champ supprimé
455
      // Certains indices peuvent correspondre à un champ supprimé
452
      if( 0 < $( thisFieldset ).length ) {
456
      if( 0 < $( thisFieldset ).length ) {
453
        var $fieldElement    = $( '.field-element' , thisFieldset ),
457
        var $fieldElement    = $( '.field-element' , thisFieldset ),
454
            fieldElementVal  = $fieldElement.val(),
458
            fieldElementVal  = $fieldElement.val(),
455
            isList           = ( // true si c'est un élément "liste"
459
            isList           = ( // true si c'est un élément "liste"
456
              fieldElementVal === 'list-checkbox' ||
460
              fieldElementVal === 'list-checkbox' ||
457
              fieldElementVal === 'checkbox'      ||
461
              fieldElementVal === 'checkbox'      ||
458
              fieldElementVal === 'radio'         ||
462
              fieldElementVal === 'radio'         ||
459
              fieldElementVal === 'select'
463
              fieldElementVal === 'select'
460
            );
464
            );
461
        // Si aucune option n'a été créée pour un élément "liste"
465
        // Si aucune option n'a été créée pour un élément "liste"
462
        if( isList && 0 === $( '.list-value' , thisFieldset ).length ) {
466
        if( isList && 0 === $( '.list-value' , thisFieldset ).length ) {
463
          invalidElementInfos = true;
467
          invalidElementInfos = true;
464
          // Le bouton "Ajouter une valeur" est signalé en rouge
468
          // Le bouton "Ajouter une valeur" est signalé en rouge
465
          $( '.add-value-button' , thisFieldset ).addClass( 'invalid' );
469
          $( '.add-value-button' , thisFieldset ).addClass( 'invalid' );
466
        }
470
        }
467
      }
471
      }
468
    }
472
    }
469
    // Si au moins un champ "required" n'est pas rempli
473
    // Si au moins un champ "required" n'est pas rempli
470
    $( 'input[required]' , thisFieldset ).each( function() {
474
    $( 'input[required]' , thisFieldset ).each( function() {
471
      if( 0 === $( this ).val().length ) {
475
      if( 0 === $( this ).val().length ) {
472
        invalidTextInfos = true;
476
        invalidTextInfos = true;
473
        // Le champ est signalé en rouge
477
        // Le champ est signalé en rouge
474
        $( this ).addClass( 'invalid' );
478
        $( this ).addClass( 'invalid' );
475
      }
479
      }
476
    });
480
    });
477
    // Si la saisie est invalide
481
    // Si la saisie est invalide
478
    if( invalidElementInfos ||  invalidTextInfos ) {
482
    if( invalidElementInfos ||  invalidTextInfos ) {
479
      // Désactivation des boutons valider et prévisualiser
483
      // Désactivation des boutons valider et prévisualiser
480
      $( '#preview-field , #validate-new-fields' ).addClass( 'invalid' );
484
      $( '#preview-field , #validate-new-fields' ).addClass( 'invalid' );
481
      // Message pour les options des "listes"
485
      // Message pour les options des "listes"
482
      if( invalidElementInfos ) {
486
      if( invalidElementInfos ) {
483
        $( '#new-fields' ).after(
487
        $( '#new-fields' ).after(
484
          '<p class="validation-warning message">' +
488
          '<p class="validation-warning message">' +
485
            '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
489
            '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
486
             '&nbsp;Vérifiez les boutons<br>"<i class="fa fa-puzzle-piece" aria-hidden="true" style="color:#4bbacb"></i>&nbsp;Ajouter une valeur" signalés en rouge:' +
490
             '&nbsp;Vérifiez les boutons<br>"<i class="fa fa-puzzle-piece" aria-hidden="true" style="color:#4bbacb"></i>&nbsp;Ajouter une valeur" signalés en rouge:' +
487
             ' il faut au moins une valeur pour les éléments "menu déroulant", "boutons radio", "cases à cocher" ou "liste de cases à cocher", ' +
491
             ' il faut au moins une valeur pour les éléments "menu déroulant", "boutons radio", "cases à cocher" ou "liste de cases à cocher", ' +
488
          '</p>'
492
          '</p>'
489
        );
493
        );
490
      }
494
      }
491
      // Message pour les champs
495
      // Message pour les champs
492
      if( invalidTextInfos ) {
496
      if( invalidTextInfos ) {
493
        $( '#new-fields' ).after(
497
        $( '#new-fields' ).after(
494
          '<p class="validation-warning message">' +
498
          '<p class="validation-warning message">' +
495
            '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
499
            '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
496
             '&nbsp;Des informations sont manquantes pour certains champs,' +
500
             '&nbsp;Des informations sont manquantes pour certains champs,' +
497
             ' vérifiez ceux signalés en rouge' +
501
             ' vérifiez ceux signalés en rouge' +
498
          '</p>'
502
          '</p>'
499
        );
503
        );
500
      }
504
      }
501
    } else {
505
    } else {
502
      $( '#preview-field , #validate-new-fields' ).removeClass( 'invalid' );
506
      $( '#preview-field , #validate-new-fields' ).removeClass( 'invalid' );
503
      if( $( this ).is( '#validate-new-fields') ) {
507
      if( $( this ).is( '#validate-new-fields') ) {
504
        // Lancement de l'enregistrement des valeurs à transmettre
508
        // Lancement de l'enregistrement des valeurs à transmettre
505
        onClickStoreNewFields();
509
        onClickStoreNewFields();
506
      } else if( $( this ).is( '#preview-field') ) {
510
      } else if( $( this ).is( '#preview-field') ) {
507
        // Lancement de la prévisualisation
511
        // Lancement de la prévisualisation
508
        newFieldsPreview();
512
        newFieldsPreview();
509
      }
513
      }
510
    }
514
    }
511
    // Réinitialisation des drapeaux de saisie invalide
515
    // Réinitialisation des drapeaux de saisie invalide
512
    invalidElementInfos = false;
516
    invalidElementInfos = false;
513
    invalidTextInfos    = false;
517
    invalidTextInfos    = false;
514
  });
518
  });
515
}
519
}
516
 
520
 
517
// Enregistrement des valeurs à transmettre
521
// Enregistrement des valeurs à transmettre
518
function onClickStoreNewFields() {
522
function onClickStoreNewFields() {
519
  // Lorsqu'on valide
523
  // Lorsqu'on valide
520
  var resultArrayIndex = 0;
524
  var resultArrayIndex = 0;
521
  var count = $( 'fieldset' ).last().attr('data-id');
525
  var count = $( 'fieldset' ).last().attr('data-id');
522
  var helpFileExists = false;
526
  var helpFileExists = false;
523
 
527
 
524
  // Savoir si au moins un fichier "aide" est enregistré
528
  // Savoir si au moins un fichier "aide" est enregistré
525
  $( '.field-help' ).each( function () {
529
  $( '.field-help' ).each( function () {
526
    if( '' !== $( this ).val() ){
530
    if( '' !== $( this ).val() ){
527
      helpFileExists = true;
531
      helpFileExists = true;
528
    }
532
    }
529
  })
533
  })
530
  // dans ce cas intégrer dans le formulaire à soumettre un bloc
534
  // dans ce cas intégrer dans le formulaire à soumettre un bloc
531
  // qui contiendra une copie de chacun de ces input[type="file"]
535
  // qui contiendra une copie de chacun de ces input[type="file"]
532
  if( helpFileExists ){
536
  if( helpFileExists ){
533
    $('#submit-button').before( '<div id="help-doc-submit" class="hidden"></div>' );
537
    $('#submit-button').before( '<div id="help-doc-submit" class="hidden"></div>' );
534
  }
538
  }
535
 
539
 
536
  // On déroule les blocs de champs supplémentaires
540
  // On déroule les blocs de champs supplémentaires
537
  for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
541
  for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
538
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
542
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
539
    // Certains indices peuvent correspondre à un champ supprimé
543
    // Certains indices peuvent correspondre à un champ supprimé
540
    if( 0 < $( thisFieldset ).length ) {
544
    if( 0 < $( thisFieldset ).length ) {
541
      // initialisation du tableau de résultats
545
      // initialisation du tableau de résultats
542
      datasToSubmit[ resultArrayIndex ] = { fieldValues:{} };
546
      datasToSubmit[ resultArrayIndex ] = { fieldValues:{} };
543
      // Ajout de la clé au tableau de resultats
547
      // Ajout de la clé au tableau de resultats
544
      datasToSubmit[ resultArrayIndex ].key = $( '.field-key' , thisFieldset ).val();
548
      datasToSubmit[ resultArrayIndex ].key = $( '.field-key' , thisFieldset ).val();
545
      // Ajout de le nom au tableau de resultats
549
      // Ajout de le nom au tableau de resultats
546
      datasToSubmit[ resultArrayIndex ].name = $( '.field-name' , thisFieldset ).val();
550
      datasToSubmit[ resultArrayIndex ].name = $( '.field-name' , thisFieldset ).val();
547
      // Recueil de l'élément choisi pour le tableau de resultats
551
      // Recueil de l'élément choisi pour le tableau de resultats
548
      datasToSubmit[ resultArrayIndex ].element = $( '.field-element' , thisFieldset ).val();
552
      datasToSubmit[ resultArrayIndex ].element = $( '.field-element' , thisFieldset ).val();
549
      // Ajout de la valeur 'requis' ou non au tableau de resultats
553
      // Ajout de la valeur 'requis' ou non au tableau de resultats
550
      datasToSubmit[ resultArrayIndex ].mandatory = $( '.field-is_mandatory' , thisFieldset ).is( ':checked' );
554
      datasToSubmit[ resultArrayIndex ].mandatory = $( '.field-is_mandatory' , thisFieldset ).is( ':checked' );
551
      // Ajout de l'unité au tableau de resultats
555
      // Ajout de l'unité au tableau de resultats
552
      datasToSubmit[ resultArrayIndex ].unit = $( '.field-unit' , thisFieldset ).val() || null;
556
      datasToSubmit[ resultArrayIndex ].unit = $( '.field-unit' , thisFieldset ).val() || null;
553
      // Ajout du tooltip au tableau de resultats
557
      // Ajout du tooltip au tableau de resultats
554
      datasToSubmit[ resultArrayIndex ].description = $( '.field-description' , thisFieldset ).val() || null;
558
      datasToSubmit[ resultArrayIndex ].description = $( '.field-description' , thisFieldset ).val() || null;
555
      // Ajout du nom du document d'aide au tableau de resultats
559
      // Ajout du nom du document d'aide au tableau de resultats
556
      datasToSubmit[ resultArrayIndex ].help = $( '.file-return.help-doc-' + index ).text() || null;
560
      datasToSubmit[ resultArrayIndex ].help = $( '.file-return.help-doc-' + index ).text() || null;
557
      // Collecte les des données dépendantes de l'élément choisi
561
      // Collecte les des données dépendantes de l'élément choisi
558
      // sous forme d'un tableau de resultats
562
      // sous forme d'un tableau de resultats
559
      onSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , thisFieldset );
563
      onSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , thisFieldset );
560
      if( $.isEmptyObject(datasToSubmit[ resultArrayIndex ].fieldValues) ){
564
      if( $.isEmptyObject(datasToSubmit[ resultArrayIndex ].fieldValues) ){
561
        delete datasToSubmit[ resultArrayIndex ].fieldValues;
565
        delete datasToSubmit[ resultArrayIndex ].fieldValues;
562
      }
566
      }
563
 
567
 
564
      // Copie d'un champ de fichier d'aide dans le bloc d'envoi
568
      // Copie d'un champ de fichier d'aide dans le bloc d'envoi
565
      if( '' !== $( '.field-help' , thisFieldset ).val() ) {
569
      if( '' !== $( '.field-help' , thisFieldset ).val() ) {
566
        $( '.field-help' , thisFieldset ).clone()
570
        $( '.field-help' , thisFieldset ).clone()
567
          .attr( 'id' , datasToSubmit[ resultArrayIndex ].key )// l'id prend la valeur de la clé
571
          .attr( 'id' , datasToSubmit[ resultArrayIndex ].key )// l'id prend la valeur de la clé
568
          .css( 'position' , 'static' )// Retrouver facilement le bloc dans la page
572
          .css( 'position' , 'static' )// Retrouver facilement le bloc dans la page
569
          .appendTo( '#help-doc-submit' );
573
          .appendTo( '#help-doc-submit' );
570
      }
574
      }
571
 
575
 
572
      resultArrayIndex++;
576
      resultArrayIndex++;
573
    }
577
    }
574
  }
578
  }
575
  var resultsArrayJson = JSON.stringify( datasToSubmit );
579
  var resultsArrayJson = JSON.stringify( datasToSubmit );
576
 
580
 
577
  console.log(resultsArrayJson);
581
  console.log(resultsArrayJson);
578
  // console.log(datasToSubmit);
582
  // console.log(datasToSubmit);
579
  // Désactivation de tous les champs et boutons (nouveaux champs)
583
  // Désactivation de tous les champs et boutons (nouveaux champs)
580
  $( '#new-fields, #new-fields .button , #add-fields , #preview-field' ).addClass( 'disabled' );
584
  $( '#new-fields, #new-fields .button , #add-fields , #preview-field' ).addClass( 'disabled' );
581
  $( '#validate-new-fields' ).addClass( 'validated' );
585
  $( '#validate-new-fields' ).addClass( 'validated' );
582
  $( '.validate-new-fields' ).text( 'Champs validés' );
586
  $( '.validate-new-fields' ).text( 'Champs validés' );
583
  // Mise à disposition des données pour le bouron submit
587
  // Mise à disposition des données pour le bouron submit
584
  $('#submit-button').before(
588
  $('#submit-button').before(
585
    '<input type="hidden" name="champs-supp" id="champs-supp" value=\'' + resultsArrayJson + '\'>'
589
    '<input type="hidden" name="champs-supp" id="champs-supp" value=\'' + resultsArrayJson + '\'>'
586
  );
590
  );
587
}
591
}
588
 
592
 
589
// Renseigne le tableau de resultat
593
// Renseigne le tableau de resultat
590
// pour les données dépendant de l'élément choisi
594
// pour les données dépendant de l'élément choisi
591
function onSelectCollectDataValuesToSubmit( datasToSubmitObject , thisFieldset ) {
595
function onSelectCollectDataValuesToSubmit( datasToSubmitObject , thisFieldset ) {
592
    switch( datasToSubmitObject.element ) {
596
    switch( datasToSubmitObject.element ) {
593
      // case 'file' :
597
      // case 'file' :
594
      // Rien à faire, pas de détails à transmettre
598
      // Rien à faire, pas de détails à transmettre
595
      case 'select':
599
      case 'select':
596
      case 'checkbox':
600
      case 'checkbox':
597
      case 'list-checkbox':
601
      case 'list-checkbox':
598
      case 'radio':
602
      case 'radio':
599
        datasToSubmitObject.fieldValues.listValue = [];
603
        datasToSubmitObject.fieldValues.listValue = [];
600
        // Ajout des valeurs de liste
604
        // Ajout des valeurs de liste
601
        onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset );
605
        onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset );
602
        // S'il y a une valeur 'autre' on l'indique à la fin de la liste
606
        // S'il y a une valeur 'autre' on l'indique à la fin de la liste
603
        if( $('.option-other-value' , thisFieldset ).attr( 'checked' ) && datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) === -1 ) {
607
        if( $('.option-other-value' , thisFieldset ).attr( 'checked' ) && datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) === -1 ) {
604
          datasToSubmitObject.fieldValues.listValue.push( 'other' );
608
          datasToSubmitObject.fieldValues.listValue.push( 'other' );
605
        }
609
        }
606
        break;
610
        break;
607
 
611
 
608
      case 'number':
612
      case 'number':
609
      case 'range':
613
      case 'range':
610
        // Placeholder
614
        // Placeholder
611
        datasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val() || null;
615
        datasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val() || null;
612
        // Valeur par défaut
616
        // Valeur par défaut
613
        datasToSubmitObject.fieldValues.default = $( '.default' , thisFieldset ).val() || null;
617
        datasToSubmitObject.fieldValues.default = $( '.default' , thisFieldset ).val() || null;
614
        // Incrémentation ( attribut step="" )
618
        // Incrémentation ( attribut step="" )
615
         datasToSubmitObject.fieldValues.step = $( '.step' , thisFieldset ).val() || null;
619
         datasToSubmitObject.fieldValues.step = $( '.step' , thisFieldset ).val() || null;
616
        // Min
620
        // Min
617
        datasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val() || null;
621
        datasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val() || null;
618
        // Max
622
        // Max
619
        datasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val() || null;
623
        datasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val() || null;
620
        break;
624
        break;
621
 
625
 
622
      case 'date':
626
      case 'date':
623
        // Min
627
        // Min
624
        datasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val() || null;
628
        datasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val() || null;
625
        // Max
629
        // Max
626
        datasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val() || null;
630
        datasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val() || null;
627
        break;
631
        break;
628
 
632
 
629
      case 'email':
633
      case 'email':
630
      case 'text':
634
      case 'text':
631
      case 'textarea':
635
      case 'textarea':
632
      default:
636
      default:
633
        // Placeholder
637
        // Placeholder
634
        datasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val() || null;
638
        datasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val() || null;
635
        break;
639
        break;
636
    }
640
    }
637
    return datasToSubmitObject;
641
    return datasToSubmitObject;
638
}
642
}
639
 
643
 
640
// Ajout d'une valeur d'un élément liste (select, checkbox etc.)
644
// Ajout d'une valeur d'un élément liste (select, checkbox etc.)
641
// dans le tableau de resultats
645
// dans le tableau de resultats
642
function onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset ) {
646
function onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset ) {
643
  $( '.list-value' , thisFieldset ).each( function() {
647
  $( '.list-value' , thisFieldset ).each( function() {
644
    var selectedFieldElement = $( '.field-element' , thisFieldset ).val();
648
    var selectedFieldElement = $( '.field-element' , thisFieldset ).val();
645
 
649
 
646
     if( $( this ).val() ){
650
     if( $( this ).val() ){
647
      // Is-default-value non cochée
651
      // Is-default-value non cochée
648
      if( !$( '.is-defaut-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' , thisFieldset ).attr( 'checked' ) ) {
652
      if( !$( '.is-defaut-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' , thisFieldset ).attr( 'checked' ) ) {
649
        datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );
653
        datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );
650
      // Is-default-value cochée pour select/radio
654
      // Is-default-value cochée pour select/radio
651
      } else if( 'select' ===  selectedFieldElement || 'radio' === selectedFieldElement ) {
655
      } else if( 'select' ===  selectedFieldElement || 'radio' === selectedFieldElement ) {
652
        // Une seule valeur par defaut, devient la première valeur du tableau + '#'
656
        // Une seule valeur par defaut, devient la première valeur du tableau + '#'
653
        datasToSubmitObject.fieldValues.listValue.unshift( $( this ).val() + '#' );
657
        datasToSubmitObject.fieldValues.listValue.unshift( $( this ).val() + '#' );
654
      // Is-default-value cochée pour checkbox/list-checkbox
658
      // Is-default-value cochée pour checkbox/list-checkbox
655
      } else {
659
      } else {
656
        // On ajoute simplement la valeur au tableau + '#'
660
        // On ajoute simplement la valeur au tableau + '#'
657
        datasToSubmitObject.fieldValues.listValue.push( $( this ).val() + '#' );
661
        datasToSubmitObject.fieldValues.listValue.push( $( this ).val() + '#' );
658
      }
662
      }
659
    }
663
    }
660
  });
664
  });
661
}
665
}
662
 
666
 
663
/************************************************
667
/************************************************
664
 *  Fonction d'affichage des champs classiques  *
668
 *  Fonction d'affichage des champs classiques  *
665
 ************************************************/
669
 ************************************************/
666
 
670
 
667
// Prévisualisation
671
// Prévisualisation
668
function DisplayClassicFields() {
672
function DisplayClassicFields() {
669
  // Affichage du titre du widget
673
  // Affichage du titre du widget
670
  renderFields( $('#titre') , $( '.widget-renderer h1' ) );
674
  renderFields( $('#titre') , $( '.widget-renderer h1' ) );
671
  // Affichage du nom du projet
675
  // Affichage du nom du projet
672
  renderFields( $('#projet') , $( '.projet-description' ));
676
  renderFields( $('#projet') , $( '.projet-description' ));
673
  // Affichage de la description
677
  // Affichage de la description
674
  renderFields( $('#description') , $( '.preview-description' ) );
678
  renderFields( $('#description') , $( '.preview-description' ) );
675
  // Affichage du logo s'il existe déjà
679
  // Affichage du logo s'il existe déjà
676
  if( $('#logo').val() || $('#logo')[0].defaultValue ) {
680
  if( $('#logo').val() || $('#logo')[0].defaultValue ) {
677
    $( '#preview-logo img' ).prop( 'src' , $( '#group-settings-form .logo img' ).prop('src') );
681
    $( '#preview-logo img' ).prop( 'src' , $( '#group-settings-form .logo img' ).prop('src') );
678
  }
682
  }
679
  // Affichage du logo chargé
683
  // Affichage du logo chargé
680
  $( '#logo.input-file' ).change( function( event ) {
684
  $( '#logo.input-file' ).change( function( event ) {
681
    // Si le 'change' était pas une suppression
685
    // Si le 'change' était pas une suppression
682
    if( $.isEmptyObject( event.target.files[0] ) ) {
686
    if( $.isEmptyObject( event.target.files[0] ) ) {
683
      $( '#preview-logo img' ).prop( 'src' , '' );
687
      $( '#preview-logo img' ).prop( 'src' , '' );
684
    // Si on a chargé un logo ou changé le fichier
688
    // Si on a chargé un logo ou changé le fichier
685
    } else {
689
    } else {
686
      $( '#preview-logo img' ).prop( 'src' , URL.createObjectURL( event.target.files[0] ) );
690
      $( '#preview-logo img' ).prop( 'src' , URL.createObjectURL( event.target.files[0] ) );
687
    }
691
    }
688
  });
692
  });
689
  // Affichage de l'image de fond
693
  // Affichage de l'image de fond
690
  $('#fond.input-file').change( function ( event ) {
694
  $('#fond.input-file').change( function ( event ) {
691
    if( !$.isEmptyObject( event.target.files[0] ) ) {
695
    if( !$.isEmptyObject( event.target.files[0] ) ) {
692
      $( '.widget-renderer' ).css('background' ,'url(' + URL.createObjectURL( event.target.files[0] ) + ') no-repeat center');
696
      $( '.widget-renderer' ).css('background' ,'url(' + URL.createObjectURL( event.target.files[0] ) + ') no-repeat center');
693
    } else {
697
    } else {
694
      $( '.widget-renderer' )[0].style.removeProperty( 'background' );
698
      $( '.widget-renderer' )[0].style.removeProperty( 'background' );
695
    }
699
    }
696
  });
700
  });
697
}
701
}
698
 
702
 
699
// Affichage des infos dès que disponibles
703
// Affichage des infos dès que disponibles
700
// pour les champs classiques
704
// pour les champs classiques
701
function renderFields( $source , $taget ) {
705
function renderFields( $source , $taget ) {
702
  if($source.val()) {
706
  if($source.val()) {
703
    $taget.text( $source.val() );
707
    $taget.text( $source.val() );
704
  }
708
  }
705
  $source.change( function () {
709
  $source.change( function () {
706
    $taget.text( $( this ).val() );
710
    $taget.text( $( this ).val() );
707
  });
711
  });
708
}
712
}
709
 
713
 
710
 
714
 
711
/*****************************************************
715
/*****************************************************
712
 *  Fonction d'affichage des champs supplémentaires  *
716
 *  Fonction d'affichage des champs supplémentaires  *
713
 *****************************************************/
717
 *****************************************************/
714
 
718
 
715
// Construction des éléments à visualiser
719
// Construction des éléments à visualiser
716
function onClickPreviewField( thisFieldset , index ) {
720
function onClickPreviewField( thisFieldset , index ) {
717
  // Récupération des données
721
  // Récupération des données
718
      // Tous les champs
722
      // Tous les champs
719
  var fieldLabel       = $( '.field-name'            , thisFieldset ).val(),//nom
723
  var fieldLabel       = $( '.field-name'            , thisFieldset ).val(),//nom
720
      fieldKey         = $( '.field-key'             , thisFieldset ).val(),//clé
724
      fieldKey         = $( '.field-key'             , thisFieldset ).val(),//clé
721
      fieldElement     = $( '.field-element'         , thisFieldset ).val(),//élément
725
      fieldElement     = $( '.field-element'         , thisFieldset ).val(),//élément
722
      fieldIsMandatory = $( '.field-is_mandatory'    , thisFieldset ).is( ':checked' ),//champ requis
726
      fieldIsMandatory = $( '.field-is_mandatory'    , thisFieldset ).is( ':checked' ),//champ requis
723
      fieldUnit        = $( '.field-unit'            , thisFieldset ).val(),//unités
727
      fieldUnit        = $( '.field-unit'            , thisFieldset ).val(),//unités
724
      fieldTooltip     = $( '.field-description'     , thisFieldset ).val(),//info-bulle
728
      fieldTooltip     = $( '.field-description'     , thisFieldset ).val(),//info-bulle
725
      fieldHelp        = $( '.file-return.help-doc-' + index ).text(),//nom du fichier d'aide
729
      fieldHelp        = $( '.file-return.help-doc-' + index ).text(),//nom du fichier d'aide
726
      fieldPlaceholder = $( '.aide-saisie'           , thisFieldset ).val() || '',//placeholder
730
      fieldPlaceholder = $( '.aide-saisie'           , thisFieldset ).val() || '',//placeholder
727
      // Champs à valeur numérique ou date
731
      // Champs à valeur numérique ou date
728
      fieldStep        = $( '.step'                  , thisFieldset ).val(),
732
      fieldStep        = $( '.step'                  , thisFieldset ).val(),
729
      fieldMin         = $( '.min'                   , thisFieldset ).val(),
733
      fieldMin         = $( '.min'                   , thisFieldset ).val(),
730
      fieldMax         = $( '.max'                   , thisFieldset ).val(),
734
      fieldMax         = $( '.max'                   , thisFieldset ).val(),
731
      // Champs "listes"
735
      // Champs "listes"
732
      fieldDefaultNum  = $( '.default'               , thisFieldset ).val(),//option pas default
736
      fieldDefaultNum  = $( '.default'               , thisFieldset ).val(),//option pas default
733
      fieldOtherValue  = $( '.option-other-value'    , thisFieldset ).is( ':checked' ),//option autre
737
      fieldOtherValue  = $( '.option-other-value'    , thisFieldset ).is( ':checked' ),//option autre
734
      fieldOptions     = collectListOptions( thisFieldset );//Array: toutes les options
738
      fieldOptions     = collectListOptions( thisFieldset );//Array: toutes les options
735
  // Variables d'affichage
739
  // Variables d'affichage
736
  var fieldHtml               = '',//variable contenant tout le html à afficher
740
  var fieldHtml               = '',//variable contenant tout le html à afficher
737
      commonFieldsHtml        = {},//Éléments simples ou chaînes communes aux "listes"
741
      commonFieldsHtml        = {},//Éléments simples ou chaînes communes aux "listes"
738
      listFieldsHtml = {},//chaînes & html pour les listes mais non spécifiques
742
      listFieldsHtml = {},//chaînes & html pour les listes mais non spécifiques
739
      listFieldsHtml          = {},//chaînes & html spécifiques aux listes
743
      listFieldsHtml          = {},//chaînes & html spécifiques aux listes
740
      count                   = fieldOptions.length;//nombre d'options, pour les boucles for
744
      count                   = fieldOptions.length;//nombre d'options, pour les boucles for
741
  //valeurs initiales des chaînes de caractères
745
  //valeurs initiales des chaînes de caractères
742
  //Éléments simples ou chaînes communes aux "listes"
746
  //Éléments simples ou chaînes communes aux "listes"
743
  commonFieldsHtml = {
747
  commonFieldsHtml = {
744
    dataIdAttr : ' data-id="' + index + '"',
748
    dataIdAttr : ' data-id="' + index + '"',
745
    helpButton : '',//bouton aide
749
    helpButton : '',//bouton aide
746
    helpClass  : '',//classe de l'élément associé au bouton aide
750
    helpClass  : '',//classe de l'élément associé au bouton aide
747
    titleAttr  : '',//info-bulle
751
    titleAttr  : '',//info-bulle
748
    fieldInput : {//attributs de l'élément
752
    fieldInput : {//attributs de l'élément
749
      typeAttr        : ' type="' + fieldElement + '"',
753
      typeAttr        : ' type="' + fieldElement + '"',
750
      nameAttr        : ' name="' + fieldKey + '"',
754
      nameAttr        : ' name="' + fieldKey + '"',
751
      classAttr       : ' class="' +  fieldKey + '"',
755
      classAttr       : ' class="' +  fieldKey + '"',
752
      placeholderAttr : '',
756
      placeholderAttr : '',
753
      mandatoryAttr   : '',//required
757
      mandatoryAttr   : '',//required
754
      otherAttr       : ''
758
      otherAttr       : ''
755
    },
759
    },
756
    fieldLabel : {//attributs et contenu du label
760
    fieldLabel : {//attributs et contenu du label
757
      labelContent    : fieldLabel,//label
761
      labelContent    : fieldLabel,//label
758
      forAttr         : ' for="' + fieldKey + '"',//attribut for
762
      forAttr         : ' for="' + fieldKey + '"',//attribut for
759
      classAttr       : '',//classe du label
763
      classAttr       : '',//classe du label
760
      otherAttr       : ''//tous autres attributs
764
      otherAttr       : ''//tous autres attributs
761
    }
765
    }
762
  }
766
  }
763
  // Pour les éléments de listes (select, checkbox, etc.)
767
  // Pour les éléments de listes (select, checkbox, etc.)
764
  listFieldsHtml = {
768
  listFieldsHtml = {
765
    containerContent : fieldLabel,//les options peuvent avoir chacune un label
769
    containerContent : fieldLabel,//les options peuvent avoir chacune un label
766
    containerClass   : '',//une classe pour le conteneur
770
    containerClass   : '',//une classe pour le conteneur
767
    forAttr          : '',//correspond à l'id d'une checkbox/radio/list-checkbox
771
    forAttr          : '',//correspond à l'id d'une checkbox/radio/list-checkbox
768
    optionIdAttr     : '',//value-id
772
    optionIdAttr     : '',//value-id
769
    defaultAttr      : ''//default
773
    defaultAttr      : ''//default
770
  };
774
  };
771
  // Changement d'un élément existant:
775
  // Changement d'un élément existant:
772
  // supprimer le précédent pour ajouter le nouveau
776
  // supprimer le précédent pour ajouter le nouveau
773
  if( 0 < $( '.preview-fields' , thisFieldset ).length ) {
777
  if( 0 < $( '.preview-fields' , thisFieldset ).length ) {
774
    $( '.preview-fields' , thisFieldset ).remove();
778
    $( '.preview-fields' , thisFieldset ).remove();
775
  }
779
  }
776
  // Élément requis
780
  // Élément requis
777
  if( fieldIsMandatory ) {
781
  if( fieldIsMandatory ) {
778
    // Attribut required pour le listes
782
    // Attribut required pour le listes
779
    commonFieldsHtml.fieldInput.mandatoryAttr = ' required="required"';
783
    commonFieldsHtml.fieldInput.mandatoryAttr = ' required="required"';
780
    // Nom du champ (éléments listes)
784
    // Nom du champ (éléments listes)
781
    listFieldsHtml.containerContent         += ' *';
785
    listFieldsHtml.containerContent         += ' *';
782
    // Nom du champ (éléments simples)
786
    // Nom du champ (éléments simples)
783
    commonFieldsHtml.fieldLabel.labelContent += ' *';
787
    commonFieldsHtml.fieldLabel.labelContent += ' *';
784
  }
788
  }
785
  // Infobulle
789
  // Infobulle
786
  if( '' !== fieldTooltip ) {
790
  if( '' !== fieldTooltip ) {
787
    commonFieldsHtml.titleAttr = ' title="' +  fieldTooltip + '"';
791
    commonFieldsHtml.titleAttr = ' title="' +  fieldTooltip + '"';
788
  }
792
  }
789
  // Placeholder
793
  // Placeholder
790
  if( '' !== fieldPlaceholder ) {
794
  if( '' !== fieldPlaceholder ) {
791
    commonFieldsHtml.fieldInput.placeholderAttr = ' placeholder="' +  fieldPlaceholder + '"';
795
    commonFieldsHtml.fieldInput.placeholderAttr = ' placeholder="' +  fieldPlaceholder + '"';
792
  }
796
  }
793
  // Fichier d'aide
797
  // Fichier d'aide
794
  if( '' !== fieldHelp ) {
798
  if( '' !== fieldHelp ) {
795
    // Bouton 'aide'
799
    // Bouton 'aide'
796
    commonFieldsHtml.helpButton = '<div class="button help-button"><i class="fas fa-info-circle"></i></div>';
800
    commonFieldsHtml.helpButton = '<div class="button help-button"><i class="fas fa-info-circle"></i></div>';
797
    // classe 'aide'
801
    // classe 'aide'
798
    commonFieldsHtml.helpClass = ' and-help';
802
    commonFieldsHtml.helpClass = ' and-help';
799
  }
803
  }
800
  // html à ajouter en fonction de l'élément choisi
804
  // html à ajouter en fonction de l'élément choisi
801
  switch( fieldElement ) {
805
  switch( fieldElement ) {
802
    case 'checkbox' :
806
    case 'checkbox' :
803
    case 'radio' :
807
    case 'radio' :
804
      listFieldsHtml.containerClass = ' class="' + fieldElement +'"';
808
      listFieldsHtml.containerClass = ' class="' + fieldElement +'"';
805
      fieldHtml =
809
      fieldHtml =
806
        // Conteneur
810
        // Conteneur
807
        '<div' +
811
        '<div' +
808
          // Class="L'élément choisi"
812
          // Class="L'élément choisi"
809
          listFieldsHtml.containerClass +
813
          listFieldsHtml.containerClass +
810
          // DataId
814
          // DataId
811
          commonFieldsHtml.dataIdAttr +
815
          commonFieldsHtml.dataIdAttr +
812
          // Required
816
          // Required
813
          commonFieldsHtml.fieldInput.mandatoryAttr +
817
          commonFieldsHtml.fieldInput.mandatoryAttr +
814
          // Info bulle
818
          // Info bulle
815
          commonFieldsHtml.titleAttr +
819
          commonFieldsHtml.titleAttr +
816
        ' >'+
820
        ' >'+
817
          // Nom du champ
821
          // Nom du champ
818
          // Classe 'and-help'
822
          // Classe 'and-help'
819
          '<div class="list-label' + commonFieldsHtml.helpClass + '">' +
823
          '<div class="list-label' + commonFieldsHtml.helpClass + '">' +
820
            // Label
824
            // Label
821
            listFieldsHtml.containerContent +
825
            listFieldsHtml.containerContent +
822
          '</div>' +
826
          '</div>' +
823
          // Bouton 'help'
827
          // Bouton 'help'
824
          commonFieldsHtml.helpButton;
828
          commonFieldsHtml.helpButton;
825
      // On déroule les différentes valeurs
829
      // On déroule les différentes valeurs
826
      for( let i = 0; i < count; i++ ) {
830
      for( let i = 0; i < count; i++ ) {
827
        let fieldOption = fieldOptions[i];
831
        let fieldOption = fieldOptions[i];
828
        // L'id de input
832
        // L'id de input
829
        listFieldsHtml.inputIdAttr = ' id="' + fieldOption.optionValue + '"';
833
        listFieldsHtml.inputIdAttr = ' id="' + fieldOption.optionValue + '"';
830
        listFieldsHtml.forAttr = ' for="' + fieldOption.optionValue + '"';
834
        listFieldsHtml.forAttr = ' for="' + fieldOption.optionValue + '"';
831
        // Default
835
        // Default
832
        listFieldsHtml.defaultAttr = '';//réinitialisation
836
        listFieldsHtml.defaultAttr = '';//réinitialisation
833
        if( fieldOption.isDefault ) {//affectation
837
        if( fieldOption.isDefault ) {//affectation
834
          listFieldsHtml.defaultAttr = ' checked';
838
          listFieldsHtml.defaultAttr = ' checked';
835
        }
839
        }
836
        // L'indice de chaque option
840
        // L'indice de chaque option
837
        // L'option "autre" n'en a pas
841
        // L'option "autre" n'en a pas
838
        if( '' !== fieldOption.optionIndex ) {
842
        if( '' !== fieldOption.optionIndex ) {
839
          listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
843
          listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
840
        }
844
        }
841
 
845
 
842
        fieldHtml +=
846
        fieldHtml +=
843
          '<label' +
847
          '<label' +
844
            // For
848
            // For
845
            listFieldsHtml.forAttr +
849
            listFieldsHtml.forAttr +
846
            // value-id
850
            // value-id
847
            listFieldsHtml.optionIdAttr +
851
            listFieldsHtml.optionIdAttr +
848
            // Class="nom du champ"
852
            // Class="nom du champ"
849
            commonFieldsHtml.fieldInput.classAttr +
853
            commonFieldsHtml.fieldInput.classAttr +
850
          '>' +
854
          '>' +
851
            '<input' +
855
            '<input' +
852
              // Type
856
              // Type
853
              commonFieldsHtml.fieldInput.typeAttr +
857
              commonFieldsHtml.fieldInput.typeAttr +
854
              // Id
858
              // Id
855
              listFieldsHtml.inputIdAttr +
859
              listFieldsHtml.inputIdAttr +
856
              // DataId
860
              // DataId
857
              commonFieldsHtml.dataIdAttr +
861
              commonFieldsHtml.dataIdAttr +
858
              // value-id
862
              // value-id
859
              listFieldsHtml.optionIdAttr +
863
              listFieldsHtml.optionIdAttr +
860
              // Name
864
              // Name
861
              commonFieldsHtml.fieldInput.nameAttr +
865
              commonFieldsHtml.fieldInput.nameAttr +
862
              // Value
866
              // Value
863
              ' value="' + fieldOption.optionValue + '"' +
867
              ' value="' + fieldOption.optionValue + '"' +
864
              // Checked
868
              // Checked
865
              listFieldsHtml.defaultAttr +
869
              listFieldsHtml.defaultAttr +
866
              // Class="nom du champ"
870
              // Class="nom du champ"
867
              commonFieldsHtml.fieldInput.classAttr +
871
              commonFieldsHtml.fieldInput.classAttr +
868
            '>' +
872
            '>' +
869
            // Label de l'option
873
            // Label de l'option
870
            fieldOption.optionText +
874
            fieldOption.optionText +
871
          '</label>';
875
          '</label>';
872
        // Si valeur "autre" est cochée
876
        // Si valeur "autre" est cochée
873
        if( fieldOtherValue ) {
877
        if( fieldOtherValue ) {
874
          fieldHtml +=
878
          fieldHtml +=
875
            '<label for="other"' +
879
            '<label for="other"' +
876
              commonFieldsHtml.dataIdAttr +
880
              commonFieldsHtml.dataIdAttr +
877
            '>' +
881
            '>' +
878
              '<input' +
882
              '<input' +
879
                commonFieldsHtml.fieldInput.typeAttr +
883
                commonFieldsHtml.fieldInput.typeAttr +
880
                ' id="other"' +
884
                ' id="other"' +
881
                commonFieldsHtml.fieldInput.nameAttr +
885
                commonFieldsHtml.fieldInput.nameAttr +
882
                ' value="other"' +
886
                ' value="other"' +
883
                commonFieldsHtml.fieldInput.classAttr +
887
                commonFieldsHtml.fieldInput.classAttr +
884
                commonFieldsHtml.dataIdAttr +
888
                commonFieldsHtml.dataIdAttr +
885
              '>' +
889
              '>' +
886
            'Autre</label>';
890
            'Autre</label>';
887
        }
891
        }
888
      }
892
      }
889
      // Fin du conteneur
893
      // Fin du conteneur
890
      fieldHtml += '</div>';
894
      fieldHtml += '</div>';
891
      break;
895
      break;
892
 
896
 
893
    case 'list-checkbox':
897
    case 'list-checkbox':
894
      fieldHtml =
898
      fieldHtml =
895
        // Classe 'and-help'
899
        // Classe 'and-help'
896
        '<div class="multiselect ' + fieldElement + commonFieldsHtml.helpClass + '"' +
900
        '<div class="multiselect ' + fieldElement + commonFieldsHtml.helpClass + '"' +
897
          // DataId
901
          // DataId
898
          commonFieldsHtml.dataIdAttr +
902
          commonFieldsHtml.dataIdAttr +
899
        '>' +
903
        '>' +
900
          '<label>' +
904
          '<label>' +
901
            // Nom du champ
905
            // Nom du champ
902
            listFieldsHtml.containerContent +
906
            listFieldsHtml.containerContent +
903
          '</label>' +
907
          '</label>' +
904
          '<div class="selectBox"' +
908
          '<div class="selectBox"' +
905
            // DataId
909
            // DataId
906
            commonFieldsHtml.dataIdAttr +
910
            commonFieldsHtml.dataIdAttr +
907
          '>' +
911
          '>' +
908
            '<select' +
912
            '<select' +
909
              // DataId
913
              // DataId
910
              commonFieldsHtml.dataIdAttr +
914
              commonFieldsHtml.dataIdAttr +
911
              // Required
915
              // Required
912
              commonFieldsHtml.fieldInput.mandatoryAttr +
916
              commonFieldsHtml.fieldInput.mandatoryAttr +
913
              // Info bulle
917
              // Info bulle
914
              commonFieldsHtml.titleAttr +
918
              commonFieldsHtml.titleAttr +
915
            '>' +
919
            '>' +
916
              // Apparait dans la barre de sélection
920
              // Apparait dans la barre de sélection
917
              '<option>Plusieurs choix possibles</option>' +
921
              '<option>Plusieurs choix possibles</option>' +
918
            '</select>' +
922
            '</select>' +
919
            '<div class="overSelect"></div>' +
923
            '<div class="overSelect"></div>' +
920
          '</div>' +
924
          '</div>' +
921
          '<div class="checkboxes hidden"' +
925
          '<div class="checkboxes hidden"' +
922
            // DataId
926
            // DataId
923
            commonFieldsHtml.dataIdAttr +
927
            commonFieldsHtml.dataIdAttr +
924
          '>';
928
          '>';
925
      // On déroule les différentes valeurs
929
      // On déroule les différentes valeurs
926
      for( let i = 0; i < count; i++ ) {
930
      for( let i = 0; i < count; i++ ) {
927
        let fieldOption = fieldOptions[i];
931
        let fieldOption = fieldOptions[i];
928
        // Type="checkbox"
932
        // Type="checkbox"
929
        commonFieldsHtml.fieldInput.typeAttr = ' type="checkbox"';
933
        commonFieldsHtml.fieldInput.typeAttr = ' type="checkbox"';
930
        // Id
934
        // Id
931
        listFieldsHtml.inputIdAttr = ' id="' + fieldOption.optionValue.toLowerCase() + '"';
935
        listFieldsHtml.inputIdAttr = ' id="' + fieldOption.optionValue.toLowerCase() + '"';
932
        // For
936
        // For
933
        listFieldsHtml.forAttr = ' for="' + fieldOption.optionValue.toLowerCase() + '"';
937
        listFieldsHtml.forAttr = ' for="' + fieldOption.optionValue.toLowerCase() + '"';
934
        // Default
938
        // Default
935
        listFieldsHtml.defaultAttr = '';//réinitialisation
939
        listFieldsHtml.defaultAttr = '';//réinitialisation
936
        if( fieldOption.isDefault ) {
940
        if( fieldOption.isDefault ) {
937
          listFieldsHtml.defaultAttr = ' checked';//affectation
941
          listFieldsHtml.defaultAttr = ' checked';//affectation
938
        }
942
        }
939
        // value-id
943
        // value-id
940
        if( '' !== fieldOption.optionIndex ) {
944
        if( '' !== fieldOption.optionIndex ) {
941
          listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
945
          listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
942
        }
946
        }
943
 
947
 
944
        fieldHtml +=
948
        fieldHtml +=
945
          '<label' +
949
          '<label' +
946
            // For
950
            // For
947
            listFieldsHtml.forAttr +
951
            listFieldsHtml.forAttr +
948
            // value-id
952
            // value-id
949
            listFieldsHtml.optionIdAttr +
953
            listFieldsHtml.optionIdAttr +
950
          '>' +
954
          '>' +
951
            '<input type="checkbox"' +
955
            '<input type="checkbox"' +
952
              // Id
956
              // Id
953
              listFieldsHtml.inputIdAttr +
957
              listFieldsHtml.inputIdAttr +
954
              // value-id
958
              // value-id
955
              listFieldsHtml.optionIdAttr +
959
              listFieldsHtml.optionIdAttr +
956
              // Name
960
              // Name
957
              commonFieldsHtml.fieldInput.nameAttr +
961
              commonFieldsHtml.fieldInput.nameAttr +
958
              // Value
962
              // Value
959
              ' value="' + fieldOption.optionValue + '"' +
963
              ' value="' + fieldOption.optionValue + '"' +
960
              // Checked
964
              // Checked
961
              listFieldsHtml.defaultAttr +
965
              listFieldsHtml.defaultAttr +
962
              // Class="nom du champ"
966
              // Class="nom du champ"
963
              commonFieldsHtml.fieldInput.classAttr +
967
              commonFieldsHtml.fieldInput.classAttr +
964
              // DataId
968
              // DataId
965
              commonFieldsHtml.dataIdAttr +
969
              commonFieldsHtml.dataIdAttr +
966
            '>' +
970
            '>' +
967
            // Label de l'option
971
            // Label de l'option
968
            fieldOption.optionText +
972
            fieldOption.optionText +
969
          '</label>';
973
          '</label>';
970
      }
974
      }
971
      // Si valeur "autre" est cochée
975
      // Si valeur "autre" est cochée
972
      if( fieldOtherValue ) {
976
      if( fieldOtherValue ) {
973
        fieldHtml +=
977
        fieldHtml +=
974
          '<label for="other"' +
978
          '<label for="other"' +
975
            // DataId
979
            // DataId
976
            commonFieldsHtml.dataIdAttr +
980
            commonFieldsHtml.dataIdAttr +
977
          '>' +
981
          '>' +
978
            '<input type="checkbox"' +
982
            '<input type="checkbox"' +
979
              ' id="other"' +
983
              ' id="other"' +
980
              commonFieldsHtml.fieldInput.nameAttr +
984
              commonFieldsHtml.fieldInput.nameAttr +
981
              ' value="other"' +
985
              ' value="other"' +
982
              commonFieldsHtml.fieldInput.classAttr +
986
              commonFieldsHtml.fieldInput.classAttr +
983
              // DataId
987
              // DataId
984
              commonFieldsHtml.dataIdAttr +
988
              commonFieldsHtml.dataIdAttr +
985
            '>' +
989
            '>' +
986
          'Autre</label>';
990
          'Autre</label>';
987
      }
991
      }
988
      // Fermeture des conteneurs .multiselect .checkboxes
992
      // Fermeture des conteneurs .multiselect .checkboxes
989
      fieldHtml +=
993
      fieldHtml +=
990
        '</div>'+
994
        '</div>'+
991
      '</div>' +
995
      '</div>' +
992
      // Bouton 'help'
996
      // Bouton 'help'
993
      commonFieldsHtml.helpButton;
997
      commonFieldsHtml.helpButton;
994
      break;
998
      break;
995
 
999
 
996
    case 'select':
1000
    case 'select':
997
      fieldHtml =
1001
      fieldHtml =
998
        '<label' +
1002
        '<label' +
999
          commonFieldsHtml.fieldLabel.forAttr +
1003
          commonFieldsHtml.fieldLabel.forAttr +
1000
          // Info bulle
1004
          // Info bulle
1001
          commonFieldsHtml.titleAttr +
1005
          commonFieldsHtml.titleAttr +
1002
        '>' +
1006
        '>' +
1003
          // Nom du champ
1007
          // Nom du champ
1004
          listFieldsHtml.containerContent +
1008
          listFieldsHtml.containerContent +
1005
        '</label>' +
1009
        '</label>' +
1006
        // Conteneur/Wrapper
1010
        // Conteneur/Wrapper
1007
        // +Classe 'and-help'
1011
        // +Classe 'and-help'
1008
        '<div class="select-wrapper add-field-select ' + fieldElement + commonFieldsHtml.helpClass + '"' +
1012
        '<div class="select-wrapper add-field-select ' + fieldElement + commonFieldsHtml.helpClass + '"' +
1009
          // DataID
1013
          // DataID
1010
          commonFieldsHtml.dataIdAttr +
1014
          commonFieldsHtml.dataIdAttr +
1011
        '>' +
1015
        '>' +
1012
          '<select' +
1016
          '<select' +
1013
            commonFieldsHtml.fieldInput.nameAttr +
1017
            commonFieldsHtml.fieldInput.nameAttr +
1014
            ' id="' + fieldKey + '"' +
1018
            ' id="' + fieldKey + '"' +
1015
            // Class
1019
            // Class
1016
            commonFieldsHtml.fieldInput.classAttr +
1020
            commonFieldsHtml.fieldInput.classAttr +
1017
            // Required
1021
            // Required
1018
            commonFieldsHtml.fieldInput.mandatoryAttr +
1022
            commonFieldsHtml.fieldInput.mandatoryAttr +
1019
            // DataId
1023
            // DataId
1020
            commonFieldsHtml.dataIdAttr +
1024
            commonFieldsHtml.dataIdAttr +
1021
          '>';
1025
          '>';
1022
 
1026
 
1023
      // On déroule les différentes valeurs
1027
      // On déroule les différentes valeurs
1024
      for( let i = 0; i < count; i++ ) {
1028
      for( let i = 0; i < count; i++ ) {
1025
        let fieldOption = fieldOptions[i];
1029
        let fieldOption = fieldOptions[i];
1026
        // Default
1030
        // Default
1027
        listFieldsHtml.defaultAttr = '';//réinitialisation
1031
        listFieldsHtml.defaultAttr = '';//réinitialisation
1028
        if( fieldOption.isDefault ) {//affectation
1032
        if( fieldOption.isDefault ) {//affectation
1029
          listFieldsHtml.defaultAttr = ' selected="selected"';
1033
          listFieldsHtml.defaultAttr = ' selected="selected"';
1030
        }
1034
        }
1031
        // value-id
1035
        // value-id
1032
        if( '' !== fieldOption.optionIndex ) {
1036
        if( '' !== fieldOption.optionIndex ) {
1033
          listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
1037
          listFieldsHtml.optionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
1034
        }
1038
        }
1035
 
1039
 
1036
        fieldHtml +=
1040
        fieldHtml +=
1037
          '<option' +
1041
          '<option' +
1038
            // Value
1042
            // Value
1039
            ' value="' + fieldOption.optionValue + '"' +
1043
            ' value="' + fieldOption.optionValue + '"' +
1040
            // Value-id
1044
            // Value-id
1041
            listFieldsHtml.optionIdAttr +
1045
            listFieldsHtml.optionIdAttr +
1042
            // Selected
1046
            // Selected
1043
            listFieldsHtml.defaultAttr +
1047
            listFieldsHtml.defaultAttr +
1044
          '>' +
1048
          '>' +
1045
            // Option
1049
            // Option
1046
            fieldOption.optionText +
1050
            fieldOption.optionText +
1047
          '</option>';
1051
          '</option>';
1048
      }
1052
      }
1049
      // Si valeur "autre" est cochée
1053
      // Si valeur "autre" est cochée
1050
      if( fieldOtherValue ) {
1054
      if( fieldOtherValue ) {
1051
        fieldHtml +=
1055
        fieldHtml +=
1052
          '<option class="other" value="other"' + commonFieldsHtml.dataIdAttr + '>' +
1056
          '<option class="other" value="other"' + commonFieldsHtml.dataIdAttr + '>' +
1053
            'Autre' +
1057
            'Autre' +
1054
          '</option>';
1058
          '</option>';
1055
      }
1059
      }
1056
      // Fermeture des conteneurs
1060
      // Fermeture des conteneurs
1057
      fieldHtml +=
1061
      fieldHtml +=
1058
          '</select>' +
1062
          '</select>' +
1059
        // Fin du conteneur/wrapper
1063
        // Fin du conteneur/wrapper
1060
        '</div>' +
1064
        '</div>' +
1061
        // Bouton 'help'
1065
        // Bouton 'help'
1062
        commonFieldsHtml.helpButton;
1066
        commonFieldsHtml.helpButton;
1063
      break;
1067
      break;
1064
 
1068
 
1065
    case 'file' :
1069
    case 'file' :
1066
      // Ouvrir l'attribut class (suppression de '"')
1070
      // Ouvrir l'attribut class (suppression de '"')
1067
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
1071
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
1068
      commonFieldsHtml.fieldInput.classAttr += ' input-file"';
1072
      commonFieldsHtml.fieldInput.classAttr += ' input-file"';
1069
      // Class du label
1073
      // Class du label
1070
      commonFieldsHtml.fieldLabel.classAttr = ' class="label-file"';
1074
      commonFieldsHtml.fieldLabel.classAttr = ' class="label-file"';
1071
      // Type de fichiers acceptés
1075
      // Type de fichiers acceptés
1072
      commonFieldsHtml.fieldInput.otherAttr += ' accept="application/pdf, image/*, video/*"';
1076
      commonFieldsHtml.fieldInput.otherAttr += ' accept="application/pdf, image/*, video/*"';
1073
 
1077
 
1074
      fieldHtml =
1078
      fieldHtml =
1075
        // Classe 'and-help'
1079
        // Classe 'and-help'
1076
        '<div class="input-file-container' + commonFieldsHtml.helpClass + '">' +
1080
        '<div class="input-file-container' + commonFieldsHtml.helpClass + '">' +
1077
          '<input' +
1081
          '<input' +
1078
            // Type
1082
            // Type
1079
            commonFieldsHtml.fieldInput.typeAttr +
1083
            commonFieldsHtml.fieldInput.typeAttr +
1080
            // Name
1084
            // Name
1081
            commonFieldsHtml.fieldInput.nameAttr +
1085
            commonFieldsHtml.fieldInput.nameAttr +
1082
            // DataId
1086
            // DataId
1083
            commonFieldsHtml.dataIdAttr +
1087
            commonFieldsHtml.dataIdAttr +
1084
            // Class
1088
            // Class
1085
            commonFieldsHtml.fieldInput.classAttr +
1089
            commonFieldsHtml.fieldInput.classAttr +
1086
            // Info-bulle
1090
            // Info-bulle
1087
            commonFieldsHtml.titleAttr +
1091
            commonFieldsHtml.titleAttr +
1088
            // Placeholder
1092
            // Placeholder
1089
            commonFieldsHtml.fieldInput.placeholderAttr +
1093
            commonFieldsHtml.fieldInput.placeholderAttr +
1090
            // Required
1094
            // Required
1091
            commonFieldsHtml.fieldInput.mandatoryAttr +
1095
            commonFieldsHtml.fieldInput.mandatoryAttr +
1092
            // Autres attributs
1096
            // Autres attributs
1093
            commonFieldsHtml.fieldInput.otherAttr +
1097
            commonFieldsHtml.fieldInput.otherAttr +
1094
          '>' +
1098
          '>' +
1095
          '<label' +
1099
          '<label' +
1096
            // For
1100
            // For
1097
            commonFieldsHtml.fieldLabel.forAttr +
1101
            commonFieldsHtml.fieldLabel.forAttr +
1098
            // Class
1102
            // Class
1099
            commonFieldsHtml.fieldLabel.classAttr +
1103
            commonFieldsHtml.fieldLabel.classAttr +
1100
            // Info-bulle
1104
            // Info-bulle
1101
            commonFieldsHtml.titleAttr +
1105
            commonFieldsHtml.titleAttr +
1102
          '><i class="fas fa-download"></i> ' +
1106
          '><i class="fas fa-download"></i> ' +
1103
            // Nom du champ
1107
            // Nom du champ
1104
            commonFieldsHtml.fieldLabel.labelContent +
1108
            commonFieldsHtml.fieldLabel.labelContent +
1105
          '</label>' +
1109
          '</label>' +
1106
        '</div>' +
1110
        '</div>' +
1107
        // Bouton supprimer le fichier
1111
        // Bouton supprimer le fichier
1108
        '<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>' +
1112
        '<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>' +
1109
        // Bouton 'help'
1113
        // Bouton 'help'
1110
        commonFieldsHtml.helpButton;
1114
        commonFieldsHtml.helpButton;
1111
      break;
1115
      break;
1112
 
1116
 
1113
    case 'textarea':
1117
    case 'textarea':
1114
      // Classe 'and-help'
1118
      // Classe 'and-help'
1115
      commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';
1119
      commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';
1116
      // Autres attributs
1120
      // Autres attributs
1117
      commonFieldsHtml.fieldInput.otherAttr += ' id="' + fieldKey + '"';
1121
      commonFieldsHtml.fieldInput.otherAttr += ' id="' + fieldKey + '"';
1118
 
1122
 
1119
      fieldHtml =
1123
      fieldHtml =
1120
        '<label' +
1124
        '<label' +
1121
          // For
1125
          // For
1122
          commonFieldsHtml.fieldLabel.forAttr +
1126
          commonFieldsHtml.fieldLabel.forAttr +
1123
          // Class
1127
          // Class
1124
          commonFieldsHtml.fieldLabel.classAttr +
1128
          commonFieldsHtml.fieldLabel.classAttr +
1125
          // Info-bulle
1129
          // Info-bulle
1126
          commonFieldsHtml.titleAttr +
1130
          commonFieldsHtml.titleAttr +
1127
          // Autres attributs
1131
          // Autres attributs
1128
          commonFieldsHtml.fieldLabel.otherAttr +
1132
          commonFieldsHtml.fieldLabel.otherAttr +
1129
        '>' +
1133
        '>' +
1130
          // Nom du champ
1134
          // Nom du champ
1131
          commonFieldsHtml.fieldLabel.labelContent +
1135
          commonFieldsHtml.fieldLabel.labelContent +
1132
        '</label>' +
1136
        '</label>' +
1133
        // Bouton 'help'
1137
        // Bouton 'help'
1134
        commonFieldsHtml.helpButton +
1138
        commonFieldsHtml.helpButton +
1135
        '<textarea' +
1139
        '<textarea' +
1136
          // Name
1140
          // Name
1137
          commonFieldsHtml.fieldInput.nameAttr +
1141
          commonFieldsHtml.fieldInput.nameAttr +
1138
          // DataId
1142
          // DataId
1139
          commonFieldsHtml.dataIdAttr +
1143
          commonFieldsHtml.dataIdAttr +
1140
          // Class
1144
          // Class
1141
          commonFieldsHtml.fieldInput.classAttr +
1145
          commonFieldsHtml.fieldInput.classAttr +
1142
          // Info-bulle
1146
          // Info-bulle
1143
          commonFieldsHtml.titleAttr +
1147
          commonFieldsHtml.titleAttr +
1144
          // Info-bulle
1148
          // Info-bulle
1145
          commonFieldsHtml.fieldInput.placeholderAttr +
1149
          commonFieldsHtml.fieldInput.placeholderAttr +
1146
          // Required
1150
          // Required
1147
          commonFieldsHtml.fieldInput.mandatoryAttr +
1151
          commonFieldsHtml.fieldInput.mandatoryAttr +
1148
          // Autres attributs
1152
          // Autres attributs
1149
          commonFieldsHtml.fieldInput.otherAttr +
1153
          commonFieldsHtml.fieldInput.otherAttr +
1150
        '></textarea>';
1154
        '></textarea>';
1151
        break;
1155
        break;
1152
 
1156
 
1153
    case 'range':
1157
    case 'range':
1154
      // Classe 'and-help'
1158
      // Classe 'and-help'
1155
      commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';
1159
      commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';
1156
      // Step
1160
      // Step
1157
      if( '' !== fieldStep ) {
1161
      if( '' !== fieldStep ) {
1158
        commonFieldsHtml.fieldInput.otherAttr += ' step="' +  fieldStep + '"';
1162
        commonFieldsHtml.fieldInput.otherAttr += ' step="' +  fieldStep + '"';
1159
      }
1163
      }
1160
      // Min
1164
      // Min
1161
      if( '' !== fieldMin ) {
1165
      if( '' !== fieldMin ) {
1162
        commonFieldsHtml.fieldInput.otherAttr += ' min="' +  fieldMin + '"';
1166
        commonFieldsHtml.fieldInput.otherAttr += ' min="' +  fieldMin + '"';
1163
      }
1167
      }
1164
      //Max
1168
      //Max
1165
      if( '' !== fieldMax ) {
1169
      if( '' !== fieldMax ) {
1166
        commonFieldsHtml.fieldInput.otherAttr += ' max="' +  fieldMax + '"';
1170
        commonFieldsHtml.fieldInput.otherAttr += ' max="' +  fieldMax + '"';
1167
      }
1171
      }
1168
 
1172
 
1169
      fieldHtml =
1173
      fieldHtml =
1170
        '<div class="number">' +
1174
        '<div class="number">' +
1171
          '<label' +
1175
          '<label' +
1172
            // For
1176
            // For
1173
            commonFieldsHtml.fieldLabel.forAttr +
1177
            commonFieldsHtml.fieldLabel.forAttr +
1174
            // Class
1178
            // Class
1175
            commonFieldsHtml.fieldLabel.classAttr +
1179
            commonFieldsHtml.fieldLabel.classAttr +
1176
            // Info-bulle
1180
            // Info-bulle
1177
            commonFieldsHtml.titleAttr +
1181
            commonFieldsHtml.titleAttr +
1178
            // Autres attributs
1182
            // Autres attributs
1179
            commonFieldsHtml.fieldLabel.otherAttr +
1183
            commonFieldsHtml.fieldLabel.otherAttr +
1180
          '>' +
1184
          '>' +
1181
            // Nom du champ
1185
            // Nom du champ
1182
            commonFieldsHtml.fieldLabel.labelContent +
1186
            commonFieldsHtml.fieldLabel.labelContent +
1183
          '</label>' +
1187
          '</label>' +
1184
          // Bouton 'help'
1188
          // Bouton 'help'
1185
          commonFieldsHtml.helpButton +
1189
          commonFieldsHtml.helpButton +
1186
 
1190
 
1187
          '<input' +
1191
          '<input' +
1188
            // Type
1192
            // Type
1189
            commonFieldsHtml.fieldInput.typeAttr +
1193
            commonFieldsHtml.fieldInput.typeAttr +
1190
            // Name
1194
            // Name
1191
            commonFieldsHtml.fieldInput.nameAttr +
1195
            commonFieldsHtml.fieldInput.nameAttr +
1192
            // DataId
1196
            // DataId
1193
            commonFieldsHtml.dataIdAttr +
1197
            commonFieldsHtml.dataIdAttr +
1194
            // Class
1198
            // Class
1195
            commonFieldsHtml.fieldInput.classAttr +
1199
            commonFieldsHtml.fieldInput.classAttr +
1196
            // Info-bulle
1200
            // Info-bulle
1197
            commonFieldsHtml.titleAttr +
1201
            commonFieldsHtml.titleAttr +
1198
            // Info-bulle
1202
            // Info-bulle
1199
            commonFieldsHtml.fieldInput.placeholderAttr +
1203
            commonFieldsHtml.fieldInput.placeholderAttr +
1200
            // Required
1204
            // Required
1201
            commonFieldsHtml.fieldInput.mandatoryAttr +
1205
            commonFieldsHtml.fieldInput.mandatoryAttr +
1202
            // Autres attributs
1206
            // Autres attributs
1203
            commonFieldsHtml.fieldInput.otherAttr +
1207
            commonFieldsHtml.fieldInput.otherAttr +
1204
          '>' +
1208
          '>' +
1205
        '</div>';
1209
        '</div>';
1206
        break;
1210
        break;
1207
 
1211
 
1208
    case 'date':
1212
    case 'date':
1209
    case 'number':
1213
    case 'number':
1210
      // Ouvrir l'attribut class (suppression de '"')
1214
      // Ouvrir l'attribut class (suppression de '"')
1211
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
1215
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
1212
      // Classe 'and-help'
1216
      // Classe 'and-help'
1213
      commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass + '"';
1217
      commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass + '"';
1214
      // Step
1218
      // Step
1215
      if( '' !== fieldStep ) {
1219
      if( '' !== fieldStep ) {
1216
        commonFieldsHtml.fieldInput.otherAttr += ' step="' +  fieldStep + '"';
1220
        commonFieldsHtml.fieldInput.otherAttr += ' step="' +  fieldStep + '"';
1217
      }
1221
      }
1218
      // Min
1222
      // Min
1219
      if( '' !== fieldMin ) {
1223
      if( '' !== fieldMin ) {
1220
        commonFieldsHtml.fieldInput.otherAttr += ' min="' +  fieldMin + '"';
1224
        commonFieldsHtml.fieldInput.otherAttr += ' min="' +  fieldMin + '"';
1221
      }
1225
      }
1222
      // Max
1226
      // Max
1223
      if( '' !== fieldMax ) {
1227
      if( '' !== fieldMax ) {
1224
        commonFieldsHtml.fieldInput.otherAttr += ' max="' +  fieldMax + '"';
1228
        commonFieldsHtml.fieldInput.otherAttr += ' max="' +  fieldMax + '"';
1225
      }
1229
      }
1226
      fieldHtml =
1230
      fieldHtml =
1227
        '<div class="number">' +
1231
        '<div class="number">' +
1228
          '<label' +
1232
          '<label' +
1229
            // For
1233
            // For
1230
            commonFieldsHtml.fieldLabel.forAttr +
1234
            commonFieldsHtml.fieldLabel.forAttr +
1231
            // Class
1235
            // Class
1232
            commonFieldsHtml.fieldLabel.classAttr +
1236
            commonFieldsHtml.fieldLabel.classAttr +
1233
            // Info-bulle
1237
            // Info-bulle
1234
            commonFieldsHtml.titleAttr +
1238
            commonFieldsHtml.titleAttr +
1235
            // Autres attributs
1239
            // Autres attributs
1236
            commonFieldsHtml.fieldLabel.otherAttr +
1240
            commonFieldsHtml.fieldLabel.otherAttr +
1237
          '>' +
1241
          '>' +
1238
            // Nom du champ
1242
            // Nom du champ
1239
            commonFieldsHtml.fieldLabel.labelContent +
1243
            commonFieldsHtml.fieldLabel.labelContent +
1240
          '</label>' +
1244
          '</label>' +
1241
          '<input' +
1245
          '<input' +
1242
            // Type
1246
            // Type
1243
            commonFieldsHtml.fieldInput.typeAttr +
1247
            commonFieldsHtml.fieldInput.typeAttr +
1244
            // Name
1248
            // Name
1245
            commonFieldsHtml.fieldInput.nameAttr +
1249
            commonFieldsHtml.fieldInput.nameAttr +
1246
            // DataId
1250
            // DataId
1247
            commonFieldsHtml.dataIdAttr +
1251
            commonFieldsHtml.dataIdAttr +
1248
            // Class
1252
            // Class
1249
            commonFieldsHtml.fieldInput.classAttr +
1253
            commonFieldsHtml.fieldInput.classAttr +
1250
            // Info-bulle
1254
            // Info-bulle
1251
            commonFieldsHtml.titleAttr +
1255
            commonFieldsHtml.titleAttr +
1252
            // Info-bulle
1256
            // Info-bulle
1253
            commonFieldsHtml.fieldInput.placeholderAttr +
1257
            commonFieldsHtml.fieldInput.placeholderAttr +
1254
            // Required
1258
            // Required
1255
            commonFieldsHtml.fieldInput.mandatoryAttr +
1259
            commonFieldsHtml.fieldInput.mandatoryAttr +
1256
            // Autres attributs
1260
            // Autres attributs
1257
            commonFieldsHtml.fieldInput.otherAttr +
1261
            commonFieldsHtml.fieldInput.otherAttr +
1258
          '>' +
1262
          '>' +
1259
          // Bouton 'help'
1263
          // Bouton 'help'
1260
          commonFieldsHtml.helpButton +
1264
          commonFieldsHtml.helpButton +
1261
        '</div>';
1265
        '</div>';
1262
        break;
1266
        break;
1263
 
1267
 
1264
    case 'text' :
1268
    case 'text' :
1265
    case 'email':
1269
    case 'email':
1266
    default:
1270
    default:
1267
      // Ouvrir l'attribut class (suppression de '"')
1271
      // Ouvrir l'attribut class (suppression de '"')
1268
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
1272
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
1269
      // Classe 'and-help'
1273
      // Classe 'and-help'
1270
      commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass + '"';
1274
      commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass + '"';
1271
 
1275
 
1272
      fieldHtml =
1276
      fieldHtml =
1273
        '<label' +
1277
        '<label' +
1274
          // For
1278
          // For
1275
          commonFieldsHtml.fieldLabel.forAttr +
1279
          commonFieldsHtml.fieldLabel.forAttr +
1276
          // Class
1280
          // Class
1277
          commonFieldsHtml.fieldLabel.classAttr +
1281
          commonFieldsHtml.fieldLabel.classAttr +
1278
          // Info-bulle
1282
          // Info-bulle
1279
          commonFieldsHtml.titleAttr +
1283
          commonFieldsHtml.titleAttr +
1280
          // Autres attributs
1284
          // Autres attributs
1281
          commonFieldsHtml.fieldLabel.otherAttr +
1285
          commonFieldsHtml.fieldLabel.otherAttr +
1282
        '>' +
1286
        '>' +
1283
          // Nom du champ
1287
          // Nom du champ
1284
          commonFieldsHtml.fieldLabel.labelContent +
1288
          commonFieldsHtml.fieldLabel.labelContent +
1285
        '</label>' +
1289
        '</label>' +
1286
        '<input' +
1290
        '<input' +
1287
          // Type
1291
          // Type
1288
          commonFieldsHtml.fieldInput.typeAttr +
1292
          commonFieldsHtml.fieldInput.typeAttr +
1289
          // Name
1293
          // Name
1290
          commonFieldsHtml.fieldInput.nameAttr +
1294
          commonFieldsHtml.fieldInput.nameAttr +
1291
          // DataId
1295
          // DataId
1292
          commonFieldsHtml.dataIdAttr +
1296
          commonFieldsHtml.dataIdAttr +
1293
          // Class
1297
          // Class
1294
          commonFieldsHtml.fieldInput.classAttr +
1298
          commonFieldsHtml.fieldInput.classAttr +
1295
          // Info-bulle
1299
          // Info-bulle
1296
          commonFieldsHtml.titleAttr +
1300
          commonFieldsHtml.titleAttr +
1297
          // Info-bulle
1301
          // Info-bulle
1298
          commonFieldsHtml.fieldInput.placeholderAttr +
1302
          commonFieldsHtml.fieldInput.placeholderAttr +
1299
          // Required
1303
          // Required
1300
          commonFieldsHtml.fieldInput.mandatoryAttr +
1304
          commonFieldsHtml.fieldInput.mandatoryAttr +
1301
          // Autres attributs
1305
          // Autres attributs
1302
          commonFieldsHtml.fieldInput.otherAttr +
1306
          commonFieldsHtml.fieldInput.otherAttr +
1303
        '>' +
1307
        '>' +
1304
        // Bouton 'help'
1308
        // Bouton 'help'
1305
        commonFieldsHtml.helpButton;
1309
        commonFieldsHtml.helpButton;
1306
      break;
1310
      break;
1307
  }
1311
  }
1308
  return fieldHtml;
1312
  return fieldHtml;
1309
}
1313
}
1310
 
1314
 
1311
// Construire un tableau des options pour chaque élément de listes
1315
// Construire un tableau des options pour chaque élément de listes
1312
function collectListOptions( thisFieldset ) {
1316
function collectListOptions( thisFieldset ) {
1313
  var $details = $( '.field-details' , thisFieldset ),
1317
  var $details = $( '.field-details' , thisFieldset ),
1314
      options = [];
1318
      options = [];
1315
 
1319
 
1316
  $details.find( '.new-value' ).each( function() {
1320
  $details.find( '.new-value' ).each( function() {
1317
    options.push({
1321
    options.push({
1318
      // Valeur transmise (value)
1322
      // Valeur transmise (value)
1319
      optionValue : $( this ).find('.list-value').val().toLowerCase(),
1323
      optionValue : $( this ).find('.list-value').val().toLowerCase(),
1320
      // Valeur Visible
1324
      // Valeur Visible
1321
      optionText  : capitalize( $( this ).find('.list-value').val() ),
1325
      optionText  : capitalize( $( this ).find('.list-value').val() ),
1322
      // Booléen "default"
1326
      // Booléen "default"
1323
      isDefault   : $( this ).find( '.is-defaut-value').is( ':checked' ),
1327
      isDefault   : $( this ).find( '.is-defaut-value').is( ':checked' ),
1324
      // Indice de l'option
1328
      // Indice de l'option
1325
      optionIndex : $( this ).attr('data-list-value-id')
1329
      optionIndex : $( this ).attr('data-list-value-id')
1326
    });
1330
    });
1327
  });
1331
  });
1328
  return options;
1332
  return options;
1329
}
1333
}
1330
 
1334
 
1331
// Faire apparaitre un champ text "Autre"
1335
// Faire apparaitre un champ text "Autre"
1332
function onOtherOption( thisFieldset , index ) {
1336
function onOtherOption( thisFieldset , index ) {
1333
  // Ce champ (dans la prévisualisation)
1337
  // Ce champ (dans la prévisualisation)
1334
  var thisPreviewFieldset = $( '.preview-fields[data-id="' + index + '"]'),
1338
  var thisPreviewFieldset = $( '.preview-fields[data-id="' + index + '"]'),
1335
      //L'élément choisi
1339
      //L'élément choisi
1336
      element             = $('.field-element' , thisFieldset ).val(),
1340
      element             = $('.field-element' , thisFieldset ).val(),
1337
      // Où insérer le champ "Autre"
1341
      // Où insérer le champ "Autre"
1338
      $element            = $( '.' + element , thisPreviewFieldset ),
1342
      $element            = $( '.' + element , thisPreviewFieldset ),
1339
      // html du champ "Autre"
1343
      // html du champ "Autre"
1340
      collectOther        =
1344
      collectOther        =
1341
        '<label data-id="' + index + '" for="collect-other">Autre option :</label>' +
1345
        '<label data-id="' + index + '" for="collect-other">Autre option :</label>' +
1342
        '<input type="text" name="collect-other" data-id="' + index + '" class="collect-other" >';
1346
        '<input type="text" name="collect-other" data-id="' + index + '" class="collect-other" >';
1343
  // Pouvoir supprimer le champ "Autre"
1347
  // Pouvoir supprimer le champ "Autre"
1344
  function optionRemove( thisPreviewFieldset ) {
1348
  function optionRemove( thisPreviewFieldset ) {
1345
    $( 'label[for="collect-other"]' , thisPreviewFieldset ).remove();
1349
    $( 'label[for="collect-other"]' , thisPreviewFieldset ).remove();
1346
    $( 'input.collect-other' , thisPreviewFieldset ).remove();
1350
    $( 'input.collect-other' , thisPreviewFieldset ).remove();
1347
  }
1351
  }
1348
 
1352
 
1349
  switch( element ) {
1353
  switch( element ) {
1350
    case 'radio' :
1354
    case 'radio' :
1351
      // Lorsqu'un nouveau bouton est coché
1355
      // Lorsqu'un nouveau bouton est coché
1352
      $( 'input' , thisPreviewFieldset ).on( 'change' , function () {
1356
      $( 'input' , thisPreviewFieldset ).on( 'change' , function () {
1353
  console.log($( this ));
1357
  console.log($( this ));
1354
        if( 'other' === $( this ).val() ) {
1358
        if( 'other' === $( this ).val() ) {
1355
          // Insertion du champ "Autre" après les boutons
1359
          // Insertion du champ "Autre" après les boutons
1356
          $element.after( collectOther );
1360
          $element.after( collectOther );
1357
        } else {
1361
        } else {
1358
          // Suppression du champ autre
1362
          // Suppression du champ autre
1359
          optionRemove( thisPreviewFieldset );
1363
          optionRemove( thisPreviewFieldset );
1360
        }
1364
        }
1361
      });
1365
      });
1362
      break;
1366
      break;
1363
 
1367
 
1364
    case 'select' :
1368
    case 'select' :
1365
      // Lorsque l'option "Autre" est selectionnée
1369
      // Lorsque l'option "Autre" est selectionnée
1366
      $( 'select' , thisPreviewFieldset ).on( 'change' , function () {
1370
      $( 'select' , thisPreviewFieldset ).on( 'change' , function () {
1367
        if( 'other' === $( this).val() ) {
1371
        if( 'other' === $( this).val() ) {
1368
          // Insertion du champ "Autre" après les boutons
1372
          // Insertion du champ "Autre" après les boutons
1369
          $element.after( collectOther );
1373
          $element.after( collectOther );
1370
          // Suppression du champ autre
1374
          // Suppression du champ autre
1371
        } else {
1375
        } else {
1372
          optionRemove( thisPreviewFieldset );
1376
          optionRemove( thisPreviewFieldset );
1373
        }
1377
        }
1374
      });
1378
      });
1375
      break;
1379
      break;
1376
 
1380
 
1377
    case 'checkbox' :
1381
    case 'checkbox' :
1378
    case 'list-checkbox' :
1382
    case 'list-checkbox' :
1379
      // Lorsque "Autre" est coché
1383
      // Lorsque "Autre" est coché
1380
      $( 'input#other' , thisPreviewFieldset ).on( 'click' , function () {
1384
      $( 'input#other' , thisPreviewFieldset ).on( 'click' , function () {
1381
        // Insertion du champ "Autre" après les boutons
1385
        // Insertion du champ "Autre" après les boutons
1382
        if( $( this ).is( ':checked' ) ) {
1386
        if( $( this ).is( ':checked' ) ) {
1383
          $element.after( collectOther );
1387
          $element.after( collectOther );
1384
        } else {
1388
        } else {
1385
          // Suppression du champ autre
1389
          // Suppression du champ autre
1386
          optionRemove( thisPreviewFieldset );
1390
          optionRemove( thisPreviewFieldset );
1387
        }
1391
        }
1388
      });
1392
      });
1389
      break;
1393
      break;
1390
 
1394
 
1391
    default :
1395
    default :
1392
      break;
1396
      break;
1393
  }
1397
  }
1394
}
1398
}
1395
 
1399
 
1396
// Prévisualisation des nouveaux champs
1400
// Prévisualisation des nouveaux champs
1397
function newFieldsPreview() {
1401
function newFieldsPreview() {
1398
  var count = $( 'fieldset' ).last().attr('data-id');
1402
  var count = $( 'fieldset' ).last().attr('data-id');
1399
  // Si on a déjà prévisualisé on efface tout pour recommencer
1403
  // Si on a déjà prévisualisé on efface tout pour recommencer
1400
  if( 0 < $( '.preview-fields' ).length ) {
1404
  if( 0 < $( '.preview-fields' ).length ) {
1401
    $( '.preview-fields' ).each( function () {
1405
    $( '.preview-fields' ).each( function () {
1402
      $( this ).remove();
1406
      $( this ).remove();
1403
    });
1407
    });
1404
  }
1408
  }
1405
  // Au premier ajout d'un champ dans la prévisualisation on ajoute un titre et un message
1409
  // Au premier ajout d'un champ dans la prévisualisation on ajoute un titre et un message
1406
  if( true === firstClick ) {
1410
  if( true === firstClick ) {
1407
    $( '#zone-supp' ).prepend(
1411
    $( '#zone-supp' ).prepend(
1408
      '<h2>Informations spécifiques au projet</h2>' +
1412
      '<h2>Informations spécifiques au projet</h2>' +
1409
      '<div class="message">Ceci n\'est qu\'un aperçu.<br>Il vous permet simplement de visualiser les contenus pour vérifier d\'évenutelles erreurs</div>'
1413
      '<div class="message">Ceci n\'est qu\'un aperçu.<br>Il vous permet simplement de visualiser les contenus pour vérifier d\'évenutelles erreurs</div>'
1410
    );
1414
    );
1411
  }
1415
  }
1412
  // Parcourir tous les blocs d'infos de champs supplémentaires
1416
  // Parcourir tous les blocs d'infos de champs supplémentaires
1413
  for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
1417
  for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
1414
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
1418
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
1415
    // Certains indices peuvent correspondre à un champ supprimé
1419
    // Certains indices peuvent correspondre à un champ supprimé
1416
    if( 0 < $( thisFieldset ).length ) {
1420
    if( 0 < $( thisFieldset ).length ) {
1417
      // Prévisualisation d'un champ
1421
      // Prévisualisation d'un champ
1418
      $( '#zone-supp .preview-container' ).append(
1422
      $( '#zone-supp .preview-container' ).append(
1419
        '<div class="preview-fields" data-id="' + index + '">'+
1423
        '<div class="preview-fields" data-id="' + index + '">'+
1420
          onClickPreviewField( thisFieldset , index ) +
1424
          onClickPreviewField( thisFieldset , index ) +
1421
        '</div>'
1425
        '</div>'
1422
      );
1426
      );
1423
      // Ajout/suppression d'un champ texte "Autre"
1427
      // Ajout/suppression d'un champ texte "Autre"
1424
      if( $( '.option-other-value' , thisFieldset ).is( ':checked' ) ) {
1428
      if( $( '.option-other-value' , thisFieldset ).is( ':checked' ) ) {
1425
        onOtherOption( thisFieldset , index);
1429
        onOtherOption( thisFieldset , index);
1426
      }
1430
      }
1427
    }
1431
    }
1428
  }
1432
  }
1429
  // Le titre + message de la section prévisualisation ne sont ajoutés qu'une fois
1433
  // Le titre + message de la section prévisualisation ne sont ajoutés qu'une fois
1430
  firstClick = false;
1434
  firstClick = false;
1431
}
1435
}
1432
 
1436
 
1433
// Activation/Desactivation et contenu de la modale Bootstrap
1437
// Activation/Desactivation et contenu de la modale Bootstrap
1434
// https://getbootstrap.com/docs/3.3/javascript/#modals
1438
// https://getbootstrap.com/docs/3.3/javascript/#modals
1435
function previewFieldHelpModal() {
1439
function previewFieldHelpModal() {
1436
  $( '#zone-supp' ).on( 'click' , '.help-button' , function ( event ) {
1440
  $( '#zone-supp' ).on( 'click' , '.help-button' , function ( event ) {
1437
    var index = $( this ).closest( '.preview-fields' ).attr( 'data-id' ),
1441
    var index = $( this ).closest( '.preview-fields' ).attr( 'data-id' ),
1438
        thisFieldset = $( '.new-field[data-id="' + index + '"]' ),
1442
        thisFieldset = $( '.new-field[data-id="' + index + '"]' ),
1439
        file = $( '.field-help' , thisFieldset )[0].files[0],
1443
        file = $( '.field-help' , thisFieldset )[0].files[0],
1440
        tmppath = URL.createObjectURL( file );
1444
        tmppath = URL.createObjectURL( file );
1441
    // Titre
1445
    // Titre
1442
    $( '#help-modal-label' ).text( 'Aide pour : ' +  $( '.field-name' , thisFieldset ).val() );
1446
    $( '#help-modal-label' ).text( 'Aide pour : ' +  $( '.field-name' , thisFieldset ).val() );
1443
    // Contenu
1447
    // Contenu
1444
    if( file.type.match( 'image' ) ) {
1448
    if( file.type.match( 'image' ) ) {
1445
        $( '#print_content' ).append( '<img src="' + tmppath + '" style="max-width:100%">' );
1449
        $( '#print_content' ).append( '<img src="' + tmppath + '" style="max-width:100%">' );
1446
    } else if( file.type.match( 'pdf' ) ) {
1450
    } else if( file.type.match( 'pdf' ) ) {
1447
        $( '#print_content' ).append( '<iframe src="' + tmppath + '" width="100%" height="650" align="middle" scrolling="no" frameborder="0"></iframe>' );
1451
        $( '#print_content' ).append( '<iframe src="' + tmppath + '" width="100%" height="650" align="middle" scrolling="no" frameborder="0"></iframe>' );
1448
    }
1452
    }
1449
    // Sortie avec la touche escape
1453
    // Sortie avec la touche escape
1450
    $( '#help-modal' ).modal( { keyboard : true } );
1454
    $( '#help-modal' ).modal( { keyboard : true } );
1451
    // Affichage
1455
    // Affichage
1452
    $( '#help-modal' ).modal( 'show' );
1456
    $( '#help-modal' ).modal( 'show' );
1453
    // Remplacer l'autofocus qui ne fonctionne plus en HTML5
1457
    // Remplacer l'autofocus qui ne fonctionne plus en HTML5
1454
    // Message dans la doc de bootstrap :
1458
    // Message dans la doc de bootstrap :
1455
    // Due to how HTML5 defines its semantics,
1459
    // Due to how HTML5 defines its semantics,
1456
    // the autofocus HTML attribute has no effect in Bootstrap modals.
1460
    // the autofocus HTML attribute has no effect in Bootstrap modals.
1457
    // To achieve the same effect, use some custom JavaScript
1461
    // To achieve the same effect, use some custom JavaScript
1458
    $( '#help-modal' ).on( 'shown.bs.modal' , function () {
1462
    $( '#help-modal' ).on( 'shown.bs.modal' , function () {
1459
      $( '#myInput' ).trigger( 'focus' );
1463
      $( '#myInput' ).trigger( 'focus' );
1460
    })
1464
    })
1461
    // Réinitialisation
1465
    // Réinitialisation
1462
    $( '#help-modal' ).on( 'hidden.bs.modal' , function () {
1466
    $( '#help-modal' ).on( 'hidden.bs.modal' , function () {
1463
      $( '#help-modal-label' ).text();
1467
      $( '#help-modal-label' ).text();
1464
      $( '#print_content' ).empty();
1468
      $( '#print_content' ).empty();
1465
    })
1469
    })
1466
  });
1470
  });
1467
}
1471
}
1468
 
1472
 
1469
 
1473
 
1470
/***************************
1474
/***************************
1471
 *  Lancement des scripts  *
1475
 *  Lancement des scripts  *
1472
 ***************************/
1476
 ***************************/
1473
 
1477
 
1474
// Tableau d'envoi des données
1478
// Tableau d'envoi des données
1475
var datasToSubmit = new Array();
1479
var datasToSubmit = new Array();
1476
var firstClick = true;
1480
var firstClick = true;
1477
 
1481
 
1478
jQuery( document ).ready( function() {
1482
jQuery( document ).ready( function() {
1479
  // Identifiant de champ
1483
  // Identifiant de champ
1480
  var fieldIndex = 0;
1484
  var fieldIndex = 0;
1481
  // Ajout de nouveaux champs
1485
  // Ajout de nouveaux champs
1482
  onClickAddNewFields( fieldIndex );
1486
  onClickAddNewFields( fieldIndex );
1483
  // Activation/Desactivation des boutons valider et prévisualiser
1487
  // Activation/Desactivation des boutons valider et prévisualiser
1484
  activatePreviewAndValidateButtons();
1488
  activatePreviewAndValidateButtons();
1485
  // Prévisualisation des champs classiques
1489
  // Prévisualisation des champs classiques
1486
  DisplayClassicFields();
1490
  DisplayClassicFields();
1487
  // Affichage des images ou nom des documents importés
1491
  // Affichage des images ou nom des documents importés
1488
  inputFile();
1492
  inputFile();
1489
  // Affichage des List-checkbox
1493
  // Affichage des List-checkbox
1490
  inputListCheckbox();
1494
  inputListCheckbox();
1491
  // Modale "aide"
1495
  // Modale "aide"
1492
  previewFieldHelpModal();
1496
  previewFieldHelpModal();
1493
});
1497
});