Subversion Repositories eFlore/Applications.cel

Rev

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