Subversion Repositories eFlore/Applications.cel

Rev

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