Subversion Repositories eFlore/Applications.cel

Rev

Rev 3174 | Rev 3177 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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