Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3892 idir 1
import {findFieldset} from './utils.js';
2
 
3
// Variable permettant un seul affichage du titre
4
// de la prévisualisation pour les nouveaux champs
5
let firstClick = true;
6
 
7
/************************************************
8
 *  Fonction d'affichage des champs classiques  *
9
 ************************************************/
10
 
11
// Prévisualisation
12
export const displayClassicFields = () => {
13
  // Affichage du titre du widget
14
  renderFields($('#titre'), $('.widget-renderer h1'));
15
  // Affichage de la description
16
  renderFields($('#description'), $('.preview-description'));
17
  // Affichage referentiel
18
  $('#label-taxon span').text(` (${$('#referentiel').val()})`);
19
  $('#referentiel').change(function () {
20
    $('#label-taxon span').text(` (${$(this).val()})`);
21
  });
22
 
23
  // Affichage du logo s'il existe déjà
24
  if (0 !== $('#logo').val().length || $('#logo')[0].defaultValue) {
25
    $('#preview-logo').append(
26
      `<img src="${$('#group-settings-form .logo img').prop('src')}" width="75%">`
27
    );
28
  }
29
  // Affichage du logo chargé
30
  $('#logo.input-file').change(function(event) {
31
    // Si le 'change' n'était pas une suppression
32
    if ($.isEmptyObject(event.target.files[0])) {
33
      $('#preview-logo img').remove();
34
    // Si on a chargé un logo ou changé le fichier
35
    } else {
36
      $('#preview-logo').append(
37
        `<img src="${URL.createObjectURL(event.target.files[0])}" width="75%">`
38
      );
39
    }
40
  });
41
  // Affichage de l'image de fond
42
  $('#image_fond.input-file').on('change', evt => {
43
    if (!$.isEmptyObject(evt.target.files[0])) {
44
      $('.widget-renderer').css('background' ,`url(${URL.createObjectURL(evt.target.files[0])}) no-repeat fixed center center`);
45
    } else {
46
      $('.widget-renderer')[0].style.removeProperty('background');
47
    }
48
  });
49
}
50
 
51
// Affichage des infos dès que disponibles
52
// pour les champs classiques
53
const renderFields = ($source, $taget) => {
54
  let text = new DOMParser().parseFromString($source.val(), 'text/html');
55
 
56
  text = text.body.textContent || '';
57
  if ($source.val()) {
58
    $taget.text(text);
59
  }
60
  $source.on('change', () => $taget.text(text));
61
}
62
 
63
 
64
/*****************************************************
65
 *  Fonction d'affichage des champs supplémentaires  *
66
 *****************************************************/
67
// Prévisualisation des nouveaux champs
68
export const newFieldsPreview = function() {
69
  const count = $('fieldset').last().data('id');
70
  let $thisFieldset;
71
 
72
  // Si on a déjà prévisualisé on efface tout pour recommencer
73
  if (0 < $('.preview-fields').length) {
74
    $('.preview-fields').each(function () {
75
      $(this).remove();
76
    });
77
  }
78
  // Au premier ajout d'un champ dans la prévisualisation on ajoute un titre et un message
79
  if (true === firstClick) {
80
    $('#zone-supp').prepend(
81
      `<h2>Informations propres au projet</h2>
82
      <div class="message">L’objectif principal de cet aperçu est de vérifier les contenus et repérer d’éventuelles erreurs</div>`
83
    );
84
  }
85
  // Parcourir tous les blocs d'infos de champs supplémentaires
86
  for(let index = $('fieldset').first().data('id'); index <= count; index++) {
87
    $thisFieldset = findFieldset(index);
88
    // Certains indices peuvent correspondre à un champ supprimé
89
    if (0 < $($thisFieldset).length) {
90
      // Prévisualisation d'un champ
91
      $('#zone-supp .preview-container').append(
92
        `<div class="preview-fields col-sm-12 row" data-id="${index}">
93
          ${onClickPreviewField($thisFieldset, index)}
94
        </div>`
95
      );
96
      // Ajout/suppression d'un champ texte "Autre"
97
      if ($('.option-other-value', $thisFieldset).is(':checked')) {
98
        onOtherOption($thisFieldset, index);
99
      }
100
    }
101
  }
102
  // Le titre+message de la section prévisualisation ne sont ajoutés qu'une fois
103
  firstClick = false;
104
};
105
 
106
// Construction des éléments à visualiser
107
const onClickPreviewField = (thisFieldset, index) => {
108
  // Récupération des données
109
  const fieldKey    = $('.field-key'         , thisFieldset).val() || '',//clé
110
    fieldElement    = $('.field-element'     , thisFieldset).val() || '',//élément
111
    // Champs à valeur numérique ou date
112
    fieldStep       = $('.step'              , thisFieldset).val() || '',
113
    fieldMin        = $('.min'               , thisFieldset).val() || '',
114
    fieldMax        = $('.max'               , thisFieldset).val() || '',
115
    // Champs "listes"
116
    fieldDefaultNum = $('.default'           , thisFieldset).val() || '',// value range/number par default
117
    fieldOtherValue = $('.option-other-value', thisFieldset).is(':checked'),//option autre
118
    fieldOptions    = collectListOptions(thisFieldset);//Array: toutes les options
119
  let fieldLabel     = $('.field-name'        , thisFieldset).val() || '',//nom
120
    fieldTooltip     = $('.field-description' , thisFieldset).val() || '',//info-bulle
121
    fieldPlaceholder = $('.aide-saisie'       , thisFieldset).val() || '';//placeholder
122
  // Variables d'affichage
123
  const count     = fieldOptions.length,//nombre d'options, pour les boucles for
124
    replaceQuotes = text => text.replace(/(')/gm, '&apos;').replace(/(")/gm, '&quot;');
125
  let fieldHtml = '',//variable contenant tout le html à afficher
126
    fieldOption;
127
 
128
  // réafficher les apostrophes
129
  $.each([fieldLabel,fieldTooltip,fieldPlaceholder], (i,fieldValue) => replaceQuotes(fieldValue));
130
 
131
  //valeurs initiales des chaînes de caractères
132
  //Éléments simples ou chaînes communes aux "listes"
133
  let commonFieldsHtml = {//Éléments simples ou chaînes communes aux "listes"
134
    dataIdAttr : ' data-id="'+index+'"',
135
    helpButton : '',//bouton aide
136
    helpClass  : '',//classe de l'élément associé au bouton aide
137
    titleAttr  : '',//info-bulle
138
    fieldInput : {//attributs de l'élément
139
      typeAttr        : ' type="'+fieldElement+'"',
140
      nameAttr        : ' name="'+fieldKey+'"',
141
      classAttr       : ' class="'+fieldKey+'"',
142
      placeholderAttr : '',
143
      mandatoryAttr   : '',//required
144
      otherAttr       : ''
145
    },
146
    fieldLabel : {//attributs et contenu du label
147
      labelContent    : fieldLabel,//label
148
      forAttr         : ' for="'+fieldKey+'"',//attribut for
149
      classAttr       : '',//classe du label
150
      otherAttr       : ''//tous autres attributs
151
    }
152
  };
153
  // Pour les éléments de listes (select, checkbox, etc.)
154
  let listFieldsHtml = {//chaînes & html spécifiques aux listes
155
    containerContent : fieldLabel,//les options peuvent avoir chacune un label
156
    containerClass   : '',//une classe pour le conteneur
157
    forAttr          : '',//correspond à l'id d'une checkbox/radio/list-checkbox
158
    optionIdAttr     : '',//value-id
159
    defaultAttr      : ''//default
160
  };
161
  // Changement d'un élément existant:
162
  // supprimer le précédent pour ajouter le nouveau
163
  if (0 < $('.preview-fields', thisFieldset).length) {
164
    $('.preview-fields', thisFieldset).remove();
165
  }
166
  // Élément requis
167
  if ($('.field-is_mandatory', thisFieldset).is(':checked')) {
168
    // Attribut required pour le listes
169
    commonFieldsHtml.fieldInput.mandatoryAttr = ' required="required"';
170
    // Nom du champ (éléments listes)
171
    listFieldsHtml.containerContent = '* '+listFieldsHtml.containerContent;
172
    // Nom du champ (éléments simples)
173
    commonFieldsHtml.fieldLabel.labelContent = '* '+commonFieldsHtml.fieldLabel.labelContent;
174
  }
175
  // Infobulle
176
  if ('' !== fieldTooltip) {
177
    commonFieldsHtml.titleAttr = ' title="'+fieldTooltip+'"';
178
  }
179
  // Placeholder
180
  if ('' !== fieldPlaceholder) {
181
    commonFieldsHtml.fieldInput.placeholderAttr = ' placeholder="'+fieldPlaceholder+'"';
182
  }
183
  // Fichier d'aide
184
  if ('' !== $('.file-return.help-doc-'+index).text()) {
185
    // Bouton 'aide'
186
    commonFieldsHtml.helpButton = '<div class="help-button btn btn-outline-info btn-sm border-0"><i class="fas fa-info-circle"></i></div>';
187
    // classe 'aide'
188
    commonFieldsHtml.helpClass = ' and-help';
189
  }
190
  // html à ajouter en fonction de l'élément choisi
191
  switch(fieldElement) {
192
    case 'checkbox' :
193
    case 'radio' :
194
      listFieldsHtml.containerClass = ' class="'+fieldElement+'"';
195
      commonFieldsHtml.fieldLabel.classAttr = ' class="radio-label"';
196
      fieldHtml =
197
        // Conteneur
198
        '<div style="width:100%"'+
199
          // Class="L'élément choisi"
200
          listFieldsHtml.containerClass+
201
          // DataId
202
          commonFieldsHtml.dataIdAttr+
203
          // Required
204
          commonFieldsHtml.fieldInput.mandatoryAttr+
205
          // Info bulle
206
          commonFieldsHtml.titleAttr+
207
        ' >'+
208
          // Nom du champ
209
          // Classe 'and-help'
210
          '<div class="mt-3 list-label'+commonFieldsHtml.helpClass+'">'+
211
            // Label
212
            listFieldsHtml.containerContent+
213
            // Bouton 'help'
214
            commonFieldsHtml.helpButton+
215
          '</div>';
216
      // On déroule les différentes valeurs
217
      for( let i = 0; i < count; i++) {
218
        fieldOption = fieldOptions[i];
219
        // L'id de input
220
        listFieldsHtml.inputIdAttr = ' id="'+fieldOption.optionValue+'"';
221
        listFieldsHtml.forAttr = ' for="'+fieldOption.optionValue+'"';
222
        // Default
223
        listFieldsHtml.defaultAttr = '';//réinitialisation
224
        if (fieldOption.isDefault) {//affectation
225
          listFieldsHtml.defaultAttr = ' checked';
226
        }
227
        // L'indice de chaque option
228
        // L'option "autre" n'en a pas
229
        if ('' !== fieldOption.optionIndex) {
230
          listFieldsHtml.optionIdAttr = ' value-id="'+fieldOption.optionIndex+'"';
231
        }
232
 
233
        fieldHtml +=
234
          '<label'+
235
            // For
236
            listFieldsHtml.forAttr+
237
            // value-id
238
            listFieldsHtml.optionIdAttr+
239
            // Class du label
240
            commonFieldsHtml.fieldLabel.classAttr+
241
          '>'+
242
            '<input'+
243
              // Type
244
              commonFieldsHtml.fieldInput.typeAttr+
245
              // Id
246
              listFieldsHtml.inputIdAttr+
247
              // DataId
248
              commonFieldsHtml.dataIdAttr+
249
              // value-id
250
              listFieldsHtml.optionIdAttr+
251
              // Name
252
              commonFieldsHtml.fieldInput.nameAttr+
253
              // Value
254
              ' value="'+replaceQuotes(fieldOption.optionValue)+
255
              // Checked
256
              listFieldsHtml.defaultAttr+
257
              // Class="nom du champ"
258
              commonFieldsHtml.fieldInput.classAttr+
259
            '>'+
260
            // Label de l'option
261
            replaceQuotes(fieldOption.optionText)+
262
          '</label>';
263
      }
264
      // Si valeur "autre" est cochée
265
      if (fieldOtherValue) {
266
        fieldHtml +=
267
          '<label for="other"'+
268
            commonFieldsHtml.dataIdAttr+
269
            commonFieldsHtml.fieldLabel.classAttr+
270
          '>'+
271
            '<input'+
272
              commonFieldsHtml.fieldInput.typeAttr+
273
              ' id="other-'+fieldElement+'-'+index+'"'+
274
              commonFieldsHtml.fieldInput.nameAttr+
275
              ' value="other"'+
276
              commonFieldsHtml.fieldInput.classAttr+
277
              commonFieldsHtml.dataIdAttr+
278
            '>'+
279
          'Autre</label>';
280
        }
281
      // Fin du conteneur
282
      fieldHtml += '</div>';
283
      break;
284
 
285
    case 'list-checkbox':
286
      commonFieldsHtml.fieldLabel.classAttr = ' class="radio-label"';
287
      fieldHtml =
288
        // Classe 'and-help'
289
        '<div class="multiselect  add-field-select'+commonFieldsHtml.helpClass+'"'+
290
          // DataId
291
          commonFieldsHtml.dataIdAttr+
292
        '>'+
293
          '<label style="width:100%">'+
294
            // Nom du champ
295
            listFieldsHtml.containerContent+
296
            // Bouton 'help'
297
            commonFieldsHtml.helpButton+
298
          '</label>'+
299
          '<div class="mt-3">'+
300
            '<div class="selectBox"'+
301
              // DataId
302
              commonFieldsHtml.dataIdAttr+
303
            '>'+
304
              '<select'+
305
                // DataId
306
                commonFieldsHtml.dataIdAttr+
307
                // Required
308
                commonFieldsHtml.fieldInput.mandatoryAttr+
309
                // Info bulle
310
                commonFieldsHtml.titleAttr+
311
                // Class
312
                ' class="form-control custom-select '+fieldElement+'"'+
313
              '>'+
314
                // Apparait dans la barre de sélection
315
                '<option>Plusieurs choix possibles</option>'+
316
              '</select>'+
317
              '<div class="overSelect"></div>'+
318
            '</div>'+
319
            '<div class="checkboxes hidden"'+
320
              // DataId
321
              commonFieldsHtml.dataIdAttr+
322
            '>';
323
      // On déroule les différentes valeurs
324
      for( let i = 0; i < count; i++) {
325
        fieldOption = fieldOptions[i];
326
        // Type="checkbox"
327
        commonFieldsHtml.fieldInput.typeAttr = ' type="checkbox"';
328
        // Id
329
        listFieldsHtml.inputIdAttr = ' id="'+replaceQuotes(fieldOption.optionValue).toLowerCase()+'"';
330
        // For
331
        listFieldsHtml.forAttr = ' for="'+replaceQuotes(fieldOption.optionValue).toLowerCase()+'"';
332
        // Default
333
        listFieldsHtml.defaultAttr = '';//réinitialisation
334
        if (fieldOption.isDefault) {
335
          listFieldsHtml.defaultAttr = ' checked';//affectation
336
        }
337
        // value-id
338
        if ('' !== fieldOption.optionIndex) {
339
          listFieldsHtml.optionIdAttr = ' value-id="'+fieldOption.optionIndex+'"';
340
        }
341
 
342
        fieldHtml +=
343
          '<label'+
344
            // For
345
            listFieldsHtml.forAttr+
346
            // value-id
347
            listFieldsHtml.optionIdAttr+
348
            // Class du label
349
            commonFieldsHtml.fieldLabel.classAttr+
350
          '>'+
351
            '<input type="checkbox"'+
352
              // Id
353
              listFieldsHtml.inputIdAttr+
354
              // value-id
355
              listFieldsHtml.optionIdAttr+
356
              // Name
357
              commonFieldsHtml.fieldInput.nameAttr+
358
              // Value
359
              ' value="'+replaceQuotes(fieldOption.optionValue)+'"'+
360
              // Checked
361
              listFieldsHtml.defaultAttr+
362
              // Class="nom du champ"
363
              commonFieldsHtml.fieldInput.classAttr+
364
              // DataId
365
              commonFieldsHtml.dataIdAttr+
366
            '>'+
367
            // Label de l'option
368
            replaceQuotes(fieldOption.optionText)+
369
          '</label>';
370
      }
371
      // Si valeur "autre" est cochée
372
      if (fieldOtherValue) {
373
        fieldHtml +=
374
          '<label for="other"'+
375
            // DataId
376
            commonFieldsHtml.dataIdAttr+
377
          '>'+
378
            '<input type="checkbox"'+
379
              ' id="other-'+fieldElement+'-'+index+'"'+
380
              commonFieldsHtml.fieldInput.nameAttr+
381
              ' value="other"'+
382
              commonFieldsHtml.fieldInput.classAttr+
383
              // DataId
384
              commonFieldsHtml.dataIdAttr+
385
            '>'+
386
          'Autre</label>';
387
      }
388
      // Fermeture des conteneurs .multiselect .checkboxes
389
      fieldHtml +=
390
            '</div>'+
391
          '</div>'+
392
        '</div>';
393
      break;
394
 
395
    case 'select':
396
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
397
      commonFieldsHtml.fieldInput.classAttr += ' form-control custom-select"';
398
      fieldHtml =
399
        // Conteneur/Wrapper
400
        // +Classe 'and-help'
401
        '<div class="add-field-select '+fieldElement+commonFieldsHtml.helpClass+'"'+
402
          // DataID
403
          commonFieldsHtml.dataIdAttr+
404
        '>'+
405
          '<label class="mt-3" style="width:100%"'+
406
            commonFieldsHtml.fieldLabel.forAttr+
407
            // Info bulle
408
            commonFieldsHtml.titleAttr+
409
          '>'+
410
            // Nom du champ
411
            listFieldsHtml.containerContent+
412
            // Bouton 'help'
413
            commonFieldsHtml.helpButton+
414
          '</label>'+
415
          '<select'+
416
            commonFieldsHtml.fieldInput.nameAttr+
417
            ' id="'+fieldKey+'"'+
418
            // Class
419
            commonFieldsHtml.fieldInput.classAttr+
420
            // Required
421
            commonFieldsHtml.fieldInput.mandatoryAttr+
422
            // DataId
423
            commonFieldsHtml.dataIdAttr+
424
          '>';
425
 
426
      // On déroule les différentes valeurs
427
      for( let i = 0; i < count; i++) {
428
        fieldOption = fieldOptions[i];
429
        // Default
430
        listFieldsHtml.defaultAttr = '';//réinitialisation
431
        if (fieldOption.isDefault) {//affectation
432
          listFieldsHtml.defaultAttr = ' selected="selected"';
433
        }
434
        // value-id
435
        if ('' !== fieldOption.optionIndex) {
436
          listFieldsHtml.optionIdAttr = ' value-id="'+fieldOption.optionIndex+'"';
437
        }
438
 
439
        fieldHtml +=
440
          '<option'+
441
            // Value
442
            ' value="'+replaceQuotes(fieldOption.optionValue)+'"'+
443
            // Value-id
444
            listFieldsHtml.optionIdAttr+
445
            // Selected
446
            listFieldsHtml.defaultAttr+
447
          '>'+
448
            // Option
449
            replaceQuotes(fieldOption.optionText)+
450
          '</option>';
451
      }
452
      // Si valeur "autre" est cochée
453
      if (fieldOtherValue) {
454
        fieldHtml +=
455
          '<option class="other" value="other"'+commonFieldsHtml.dataIdAttr+'>'+
456
            'Autre'+
457
          '</option>';
458
      }
459
      // Fermeture des conteneurs
460
      fieldHtml +=
461
          '</select>'+
462
        // Fin du conteneur/wrapper
463
        '</div>';
464
      break;
465
 
466
    case 'textarea':
467
    // Ouvrir l'attribut class (suppression de '"')
468
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
469
      // Classe 'custom-range'
470
      commonFieldsHtml.fieldInput.classAttr += ' form-control"';
471
      // Classe 'and-help'
472
      commonFieldsHtml.fieldLabel.classAttr = ' class="mt-3 '+commonFieldsHtml.helpClass+'"';
473
      // Autres attributs
474
      commonFieldsHtml.fieldInput.otherAttr += ' id="'+fieldKey+'"';
475
 
476
      fieldHtml =
477
        '<label  style="width:100%"'+
478
          // For
479
          commonFieldsHtml.fieldLabel.forAttr+
480
          // Class
481
          commonFieldsHtml.fieldLabel.classAttr+
482
          // Info-bulle
483
          commonFieldsHtml.titleAttr+
484
          // Autres attributs
485
          commonFieldsHtml.fieldLabel.otherAttr+
486
        '>'+
487
          // Nom du champ
488
          commonFieldsHtml.fieldLabel.labelContent+
489
          // Bouton 'help'
490
          commonFieldsHtml.helpButton+
491
        '</label>'+
492
        '<textarea'+
493
          // Name
494
          commonFieldsHtml.fieldInput.nameAttr+
495
          // DataId
496
          commonFieldsHtml.dataIdAttr+
497
          // Class
498
          commonFieldsHtml.fieldInput.classAttr+
499
          // Info-bulle
500
          commonFieldsHtml.titleAttr+
501
          // Info-bulle
502
          commonFieldsHtml.fieldInput.placeholderAttr+
503
          // Required
504
          commonFieldsHtml.fieldInput.mandatoryAttr+
505
          // Autres attributs
506
          commonFieldsHtml.fieldInput.otherAttr+
507
        '></textarea>';
508
        break;
509
 
510
    case 'range':
511
      // Ouvrir l'attribut class (suppression de '"')
512
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
513
      // Classe 'custom-range'
514
      commonFieldsHtml.fieldInput.classAttr += ' custom-range form-control pl-3"';
515
      // Classe 'and-help'
516
      commonFieldsHtml.fieldLabel.classAttr = ' class="mt-3 '+commonFieldsHtml.helpClass+'"';
517
      // Step
518
      if ('' !== fieldStep) {
519
        commonFieldsHtml.fieldInput.otherAttr += ' step="'+fieldStep+'"';
520
      }
521
      // Min
522
      if ('' !== fieldMin) {
523
        commonFieldsHtml.fieldInput.otherAttr += ' min="'+fieldMin+'"';
524
      }
525
      //Max
526
      if ('' !== fieldMax) {
527
        commonFieldsHtml.fieldInput.otherAttr += ' max="'+fieldMax+'"';
528
      }
529
      fieldHtml =
530
        '<div'+
531
          ' class="range"'+
532
          ' id="'+fieldKey+'"'+
533
        '>'+
534
          '<label style="width:100%"'+
535
            // For
536
            commonFieldsHtml.fieldLabel.forAttr+
537
            // Class
538
            commonFieldsHtml.fieldLabel.classAttr+
539
            // Info-bulle
540
            commonFieldsHtml.titleAttr+
541
            // Autres attributs
542
            commonFieldsHtml.fieldLabel.otherAttr+
543
          '>'+
544
            // Nom du champ
545
            commonFieldsHtml.fieldLabel.labelContent+
546
            // Bouton 'help'
547
            commonFieldsHtml.helpButton+
548
          '</label>'+
549
          '<div class="col-sm-12 row" style="max-width=100%">'+
550
          // Visualiser min max et la valeur de range
551
            '<p class="col-sm-2 range-values text-center font-weight-bold">'+
552
              'Min '+fieldMin+
553
            '</p>'+
554
            '<div class="range-live-value range-values text-center font-weight-bold col-sm-7">'+
555
              fieldDefaultNum+
556
            '</div>'+
557
            '<p class="col-sm-2 range-values text-center font-weight-bold">'+
558
              'Max '+fieldMax+
559
            '</p>'+
560
 
561
            '<input'+
562
              // Type
563
              commonFieldsHtml.fieldInput.typeAttr+
564
              // Name
565
              commonFieldsHtml.fieldInput.nameAttr+
566
              // DataId
567
              commonFieldsHtml.dataIdAttr+
568
              // Class
569
              commonFieldsHtml.fieldInput.classAttr+
570
              // Info-bulle
571
              commonFieldsHtml.titleAttr+
572
              // Required
573
              commonFieldsHtml.fieldInput.mandatoryAttr+
574
              // Default
575
              ' value="'+fieldDefaultNum+'"'+
576
              // Autres attributs
577
              commonFieldsHtml.fieldInput.otherAttr+
578
            '>'+
579
          '</div>'
580
        '</div>';
581
        break;
582
 
583
    case 'number':
584
      // Step
585
      if ('' !== fieldStep) {
586
        commonFieldsHtml.fieldInput.otherAttr += ' step="'+fieldStep+'"';
587
      }
588
    case 'date':
589
      // Ouvrir l'attribut class (suppression de '"')
590
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
591
      // Classe 'and-help'
592
      commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass+' form-control"';
593
      // Min
594
      if ('' !== fieldMin) {
595
        commonFieldsHtml.fieldInput.otherAttr += ' min="'+fieldMin+'"';
596
      }
597
      // Max
598
      if ('' !== fieldMax) {
599
        commonFieldsHtml.fieldInput.otherAttr += ' max="'+fieldMax+'"';
600
      }
601
      // Class du label
602
      commonFieldsHtml.fieldLabel.classAttr = 'class="mt-3"';
603
      fieldHtml =
604
        '<div class="number">'+
605
          '<label style="width:100%"'+
606
            // For
607
            commonFieldsHtml.fieldLabel.forAttr+
608
            // Class
609
            commonFieldsHtml.fieldLabel.classAttr+
610
            // Info-bulle
611
            commonFieldsHtml.titleAttr+
612
            // Autres attributs
613
            commonFieldsHtml.fieldLabel.otherAttr+
614
          '>'+
615
            // Nom du champ
616
            commonFieldsHtml.fieldLabel.labelContent+
617
            // Bouton 'help'
618
            commonFieldsHtml.helpButton+
619
          '</label>'+
620
          '<input'+
621
            // Type
622
            commonFieldsHtml.fieldInput.typeAttr+
623
            // Name
624
            commonFieldsHtml.fieldInput.nameAttr+
625
            // DataId
626
            commonFieldsHtml.dataIdAttr+
627
            // Class
628
            commonFieldsHtml.fieldInput.classAttr+
629
            // Info-bulle
630
            commonFieldsHtml.titleAttr+
631
            // Placeholder
632
            commonFieldsHtml.fieldInput.placeholderAttr+
633
            // Required
634
            commonFieldsHtml.fieldInput.mandatoryAttr+
635
            // Default
636
            ' value="'+fieldDefaultNum+'"'+
637
            // Autres attributs
638
            commonFieldsHtml.fieldInput.otherAttr+
639
          '>'+
640
        '</div>';
641
        break;
642
 
643
    case 'text' :
644
    case 'email':
645
    default:
646
      // Ouvrir l'attribut class (suppression de '"')
647
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
648
      // Classe 'and-help'
649
      commonFieldsHtml.fieldInput.classAttr += commonFieldsHtml.helpClass+' form-control"';
650
      // Class du label
651
      commonFieldsHtml.fieldLabel.classAttr = 'class="mt-3"';
652
 
653
      fieldHtml =
654
        '<label style="width:100%"'+
655
          // For
656
          commonFieldsHtml.fieldLabel.forAttr+
657
          // Class
658
          commonFieldsHtml.fieldLabel.classAttr+
659
          // Info-bulle
660
          commonFieldsHtml.titleAttr+
661
          // Autres attributs
662
          commonFieldsHtml.fieldLabel.otherAttr+
663
        '>'+
664
          // Nom du champ
665
          commonFieldsHtml.fieldLabel.labelContent+
666
          // Bouton 'help'
667
          commonFieldsHtml.helpButton+
668
        '</label>'+
669
        '<input'+
670
          // Type
671
          commonFieldsHtml.fieldInput.typeAttr+
672
          // Name
673
          commonFieldsHtml.fieldInput.nameAttr+
674
          // DataId
675
          commonFieldsHtml.dataIdAttr+
676
          // Class
677
          commonFieldsHtml.fieldInput.classAttr+
678
          // Info-bulle
679
          commonFieldsHtml.titleAttr+
680
          // Placeholder
681
          commonFieldsHtml.fieldInput.placeholderAttr+
682
          // Required
683
          commonFieldsHtml.fieldInput.mandatoryAttr+
684
          // Autres attributs
685
          commonFieldsHtml.fieldInput.otherAttr+
686
        '>';
687
      break;
688
  }
689
  return fieldHtml;
690
}
691
 
692
// Construire un tableau des options pour chaque élément de listes
693
const collectListOptions = thisFieldset => {
694
  const $details = $('.field-details', thisFieldset),
695
    options = [];
696
 
697
  $details.find('.new-value').each(function () {
698
    options.push({
699
      // Valeur transmise (value)
700
      optionValue : $(this).find('.list-value').val().toLowerCase(),
701
      // Valeur Visible
702
      optionText  : $(this).find('.displayed-label').val(),
703
      // Booléen "default"
704
      isDefault   : $(this).find('.is-defaut-value').is(':checked'),
705
      // Indice de l'option
706
      optionIndex : $(this).data('list-value-id')
707
    });
708
  });
709
  return options;
710
}
711
 
712
// Faire apparaitre un champ text "Autre"
713
const onOtherOption = ($thisFieldset , index) => {
714
  // L'élément choisi
715
  const element         = $('.field-element', $thisFieldset).val(),
716
    thisPreviewFieldset = $(`.preview-fields[data-id=${index}]`),
717
    // html du champ "Autre"
718
    collectOther        =
719
      `<div class="col-sm-12 mt-1 collect-other-block">
720
        <label data-id="${index}" for="collect-other" style="font-weight:300">Autre option :</label>
721
        <input type="text" name="collect-other" data-id="${index}" class="collect-other form-control">
722
      </div>`,
723
    hasCheckboxes       = ['list-checkbox','checkbox'].includes(element),
724
    eventType           = hasCheckboxes ? 'click' : 'change';
725
  let fieldSelector = 'input';
726
 
727
  if('select' === element) {
728
    fieldSelector = 'select';
729
  } else if (hasCheckboxes) {
730
    fieldSelector += `#other-${element}-${index}`;
731
  }
732
 
733
  const $field = $(fieldSelector, thisPreviewFieldset);
734
 
735
  $field.on(eventType, function() {
736
    const hasOtherOption = hasCheckboxes ? ($field.is(':checked')) : ('other' === $field.val());
737
 
738
    if (hasOtherOption) {
739
      // Insertion du champ "Autre" après les boutons
740
      if ('list-checkbox' === element) {
741
        $('.checkboxes', thisPreviewFieldset).append(collectOther);
742
      } else {
743
        $('.'+element, thisPreviewFieldset).after(collectOther);
744
      }
745
    } else {
746
      // Suppression du champ autre
747
      $('.collect-other-block', thisPreviewFieldset).remove();
748
    }
749
  });
750
};