Subversion Repositories eFlore/Applications.cel

Rev

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

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