Subversion Repositories eFlore/Applications.cel

Rev

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