Subversion Repositories eFlore/Applications.cel

Rev

Rev 3197 | Rev 3233 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3197 Rev 3226
Line 23... Line 23...
23
    return false;
23
    return false;
24
  });
24
  });
25
  // Affiche un retour visuel dès que input:file change
25
  // Affiche un retour visuel dès que input:file change
26
  $fileInput.change( function( event ) {
26
  $fileInput.change( function( event ) {
27
    // Il est possible de supprimer un fichier
27
    // Il est possible de supprimer un fichier
28
    // donc on vérifie que le 'change' est un ajout ou modification
28
    // donc on vérifie que le 'change' est un ajout ou modificationis-defaut-value
29
    if( !$.isEmptyObject( event.target.files[0] ) ) {
29
    if( !$.isEmptyObject( event.target.files[0] ) ) {
30
      var file = event.target.files[0],
30
      var file = event.target.files[0],
31
        $theReturn = $( '.' + $( this ).attr( 'id' ) );
31
          $theReturn = $( '.' + $( this ).attr( 'id' ) );
32
      // Affichage du nom du fichier
32
      // Affichage du nom du fichier
33
      $theReturn.text( file.name );
33
      $theReturn.text( file.name );
34
      // Si le fichier est une image on l'affiche
34
      // Si le fichier est une image on l'affiche
35
      if( file.type.match( 'image' ) ) {
35
      if( file.type.match( 'image/*' ) ) {
36
        // Chemin temporaire de l'image et affichage
36
        // Chemin temporaire de l'image et affichage
37
        var tmppath = URL.createObjectURL( file );
37
        var tmppath = URL.createObjectURL( file );
38
        $theReturn.removeClass( 'hidden' ).append( '<img src="' + tmppath + '" width="50%">' );
38
        $theReturn.removeClass( 'hidden' ).append( '<img src="' + tmppath + '" width="50%">' );
-
 
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);
39
      }
44
      }
40
    }
45
    }
41
  });
46
  });
42
  // Annuler le téléchargement
47
  // Annuler le téléchargement
43
  $( '.remove-file' ).click( function() {
48
  $( '.remove-file' ).click( function() {
44
    var $thisFileInput = $( this ).prev( '.input-file-container' ).find( '.input-file' );
49
    var $thisFileInput = $( this ).prev( '.input-file-container' ).find( '.input-file' );
-
 
50
    // lib : https://resources.tela-botanica.org/jquery/form/3.51/jquery.form.min.js
45
    $thisFileInput.wrap( '<form>' ).closest( 'form' ).get(0).reset();
51
    $thisFileInput.clearInputs();
46
    $thisFileInput.triggerHandler( 'change' );
52
    $thisFileInput.triggerHandler( 'change' );
47
    $thisFileInput.unwrap();
53
    // $thisFileInput.unwrap();
48
    $( this ).next( '.file-return' ).addClass( 'hidden' ).empty();
54
    $( this ).next( '.file-return' ).addClass( 'hidden' ).empty();
49
  });
55
  });
50
}
56
}
Line 51... Line 57...
51
 
57
 
52
// Style et affichage des list-checkboxes
58
// Style et affichage des list-checkboxes
53
function inputListCheckbox() {
59
function inputListCheckbox() {
54
  // On écoute le click sur une list-checkbox ('.selectBox')
60
  // On écoute le click sur une list-checkbox ('.selectBox')
55
  // à tout moment de son insertion dans le dom
61
  // à tout moment de son insertion dans le dom
56
  $( '#zone-appli' ).on( 'click' , '.selectBox' , function() {
62
  $( '#zone-appli' ).on( 'click' , '.selectBox' , function() {
57
    $( '.checkboxes[data-id="' + $(this).attr( 'data-id' ) + '"]' ).toggleClass( 'hidden' );
63
    $( '.checkboxes[data-id="' + $(this).data( 'id' ) + '"]' ).toggleClass( 'hidden' );
58
  });
64
  });
Line 59... Line 65...
59
}
65
}
60
 
66
 
Line 104... Line 110...
104
      '<input type="text" name="field-name" data-id="' + fieldIndex + '" class="field-name" placeholder="Titre de votre champ" title="Donnez un titre à votre champ" required>'+
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>'+
105
      // Clé du champ
111
      // Clé du champ
106
      '<label for="field-key" title="Nom du champ dans la base de données">'+
112
      '<label for="field-key" title="Nom du champ dans la base de données">'+
107
        'Clé du champ *'+
113
        'Clé du champ *'+
108
      '</label>'+
114
      '</label>'+
109
      '<input type="text" name="field-key" data-id="' + fieldIndex + '" class="field-key" placeholder="Clé du champ" Pattern="[A-Z][A-Za-z]+" title="Clé Unique en Camelcase, pas d\'accents pas de caractères spéciaux." required>'+
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>'+
110
      '<p class="message">' +
116
      '<p class="message">' +
111
        '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+
117
        '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+
112
        'Une clé doit être unique<br>' +
118
        'Une clé doit être unique<br>' +
113
        'En camelCase (ecriture chameau)<br>'+
119
        'En "camelCase" (ecriture chameau)<br>'+
-
 
120
        'Ou en minuscule avec tirets ("-") si nécessaire<br>'+
114
        'Pas d\'accents ou de cédille, pas de caractères spéciaux.' +
121
        'Pas d\'espaces, aucuns caractères spéciaux (accents, cédilles, etc.).' +
115
      '</p>' +
122
      '</p>' +
116
      // Type de champ
123
      // Type de champ
117
      '<label for="field-element" title="Quel type de champ">Type de champ *</label>'+
124
      '<label for="field-element" title="Quel type de champ">Type de champ *</label>'+
118
      '<div class="select-wrapper add-field-select" data-id="' + fieldIndex + '">'+
125
      '<div class="select-wrapper add-field-select" data-id="' + fieldIndex + '">'+
119
        '<select name="field-element" data-id="' + fieldIndex + '" class="field-element">'+
126
        '<select name="field-element" data-id="' + fieldIndex + '" class="field-element">'+
Line 123... Line 130...
123
          '<option value="select">Menu déroulant</option>'+
130
          '<option value="select">Menu déroulant</option>'+
124
          '<option value="checkbox">Cases à cocher</option>'+
131
          '<option value="checkbox">Cases à cocher</option>'+
125
          '<option value="list-checkbox">Liste de cases à cocher</option>'+
132
          '<option value="list-checkbox">Liste de cases à cocher</option>'+
126
          '<option value="radio">Boutons radio</option>'+
133
          '<option value="radio">Boutons radio</option>'+
127
          '<option value="date">Calendrier</option>'+
134
          '<option value="date">Calendrier</option>'+
128
          '<option value="file">Téléchargement</option>'+
-
 
129
          '<option value="range">Curseur (entre 2 bornes)</option>'+
135
          '<option value="range">Curseur (entre 2 bornes)</option>'+
130
          '<option value="number">Nombre</option>'+
136
          '<option value="number">Nombre</option>'+
131
        '</select>'+
137
        '</select>'+
132
      '</div>'+
138
      '</div>'+
133
      // Checkbox "champ requis"
139
      // Checkbox "champ requis"
Line 137... Line 143...
137
      '<label for="field-unit" title="Unité de mesure de vos valeurs">Unités ( cm, kg, ha, etc.)</label>'+
143
      '<label for="field-unit" title="Unité de mesure de vos valeurs">Unités ( cm, kg, ha, etc.)</label>'+
138
      '<input type="text" name="field-unit" data-id="' + fieldIndex + '" class="field-unit" placeholder="symbole de vos unités">'+
144
      '<input type="text" name="field-unit" data-id="' + fieldIndex + '" class="field-unit" placeholder="symbole de vos unités">'+
139
      // Tooltip
145
      // Tooltip
140
      '<label for="field-description" title="Ajoutez une info-bulle">Info-bulle</label>'+
146
      '<label for="field-description" title="Ajoutez une info-bulle">Info-bulle</label>'+
141
      '<input type="text" name="field-description" data-id="' + fieldIndex + '" class="field-description" placeholder="Quelques mots">'+
147
      '<input type="text" name="field-description" data-id="' + fieldIndex + '" class="field-description" placeholder="Quelques mots">'+
142
      // Import d'une image ou d'un pdf d'aide à afficher en popup
148
      // Import d'une image d'aide à afficher en popup
143
      '<div class="input-file-container">'+
149
      '<div class="input-file-container">'+
144
        '<input type="file" class="input-file field-help" name="field-help" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="application/pdf, image/*, video/*">'+
150
        '<input type="file" class="input-file field-help" name="field-help' + fieldIndex + '" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="image/*">'+
145
        '<label for="field-help" class="label-file"><i class="fas fa-download"></i> Popup aide image/pdf</label>'+
151
        '<label for="field-help' + fieldIndex + '" class="label-file"><i class="fas fa-download"></i> Popup aide image (.jpg)</label>'+
146
      '</div>'+
152
      '</div>'+
147
      '<div class="remove-file button" name="remove-file" data-id="' + fieldIndex + '" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>'+
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>'+
148
      '<div class="file-return help-doc-' + fieldIndex + ' hidden"></div>'+
154
      '<div class="file-return help-doc-' + fieldIndex + ' hidden"></div>'+
149
      // Boutons supprimer
155
      // Boutons supprimer
150
      '<label for="remove-field">Supprimer</label>'+
156
      '<label for="remove-field">Supprimer</label>'+
Line 161... Line 167...
161
    $( '.field-title[data-id="' + fieldIndex + '"]' ).text( $( this ).val() );
167
    $( '.field-title[data-id="' + fieldIndex + '"]' ).text( $( this ).val() );
162
  });
168
  });
163
}
169
}
Line 164... Line 170...
164
 
170
 
165
// Supprimer un nouveau champ
171
// Supprimer un nouveau champ
166
function onClickRemoveField ( keyFlag , nameFlag ) {
172
function onClickRemoveField () {
167
  $( '.remove-field' ).click( function() {
173
  $( '.remove-field' ).click( function() {
168
    $(this).closest('fieldset').hide( 200 , function () {
174
    $( this ).closest('fieldset').hide( 200 , function () {
169
      $(this).remove();
175
      $( this ).remove();
170
    });
176
    });
171
  });
177
  });
Line 188... Line 194...
188
    // On intialise l'index pour les listes la variable qui contiendra un id pour chaque option
194
    // On intialise l'index pour les listes la variable qui contiendra un id pour chaque option
189
    var valueIndex = 0;
195
    var valueIndex = 0;
190
    // Si on hésite on qu'on se trompe dans la liste :
196
    // Si on hésite on qu'on se trompe dans la liste :
191
    // les champs de détails de l'option précédente doivent être supprimés
197
    // les champs de détails de l'option précédente doivent être supprimés
192
    $( '.field-details[data-id="' + fieldIndex + '"]' ).hide( 200 , function () {
198
    $( '.field-details[data-id="' + fieldIndex + '"]' ).hide( 200 , function () {
193
      $(this).remove();
199
      $( this ).remove();
194
    });
200
    });
Line 195... Line 201...
195
 
201
 
196
    // Html de recueil de données en fonction de l'élément choisi
202
    // Html de recueil de données en fonction de l'élément choisi
197
    switch( $( this ).val() ) {
-
 
198
      case 'file':
-
 
199
        break;
-
 
200
 
203
    switch( $( this ).val() ) {
201
      case 'number':
204
      case 'number':
202
      case 'range':
205
      case 'range':
203
        displayFieldDetailsCollect(
206
        displayFieldDetailsCollect(
204
          fieldIndex,
207
          fieldIndex,
Line 312... Line 315...
312
            '<div class="remove-value button" name="remove-value" data-id="' + fieldIndex + '" data-list-value-id="' + valueIndex + '" title="Supprimer une valeur"><i class="fa fa-trash" aria-hidden="true"></i></div>'+
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>'+
313
          '</div>'+
316
          '</div>'+
314
        '</div>'+
317
        '</div>'+
315
      '</div>'
318
      '</div>'
316
    ).hide().show( 200);
319
    ).hide().show( 200);
317
    // Activer la checkbox de valeur par default uniquement si une valeur est entrée
-
 
318
    onInputListValueLabelEnableDefaultCheckbox( valueIndex );
-
 
319
    // Une seule valeur par défaut pour select et radio
320
    // Une seule valeur par défaut pour select et radio
320
    onClickDefaultValueRemoveOthers( fieldIndex );
321
    onClickDefaultValueRemoveOthers( fieldIndex );
321
    // Supprimer une valeur
322
    // Supprimer une valeur
322
    onClickRemoveListValue( fieldIndex );
323
    onClickRemoveListValue( fieldIndex );
323
  });
324
  });
324
}
325
}
Line 325... Line 326...
325
 
326
 
326
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
327
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
327
function onInputListValueLabelEnableDefaultCheckbox( valueIndex ) {
328
function onInputListValueLabelEnableDefaultCheckbox() {
-
 
329
  $( '#new-fields' ).on( 'input' , '.list-value' , function() {
328
  $( '.new-value[data-list-value-id="' + valueIndex + '"] .list-value' ).on( 'input' , function() {
330
    var thisValue = $( this ).parent( '.new-value' );
329
    if( $(this).val() !== '' ) {
331
    if( '' !== $( this ).val() ) {
330
      $( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).removeAttr( 'disabled');
332
      $( '.is-defaut-value', thisValue ).removeAttr( 'disabled' );
331
    } else {
333
    } else {
332
      $( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).attr( 'disabled', true ).removeAttr( 'checked' );
334
      $( '.is-defaut-value', thisValue ).attr( 'disabled', true ).removeAttr( 'checked' );
333
    }
335
    }
334
  });
336
  });
Line 335... Line 337...
335
}
337
}
Line 349... Line 351...
349
}
351
}
Line 350... Line 352...
350
 
352
 
351
// Bouton supprimer une valeur
353
// Bouton supprimer une valeur
352
function onClickRemoveListValue( fieldIndex ) {
354
function onClickRemoveListValue( fieldIndex ) {
353
  $( '.remove-value.button[data-id="' + fieldIndex + '"]' ).click( function() {
355
  $( '.remove-value.button[data-id="' + fieldIndex + '"]' ).click( function() {
354
    $( '.new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).hide( 200 , function () {
356
    $( '.new-value[data-list-value-id="' + $( this ).data( 'list-value-id' ) + '"]' ).hide( 200 , function () {
355
      $(this).remove();
357
      $( this ).remove();
356
    });
358
    });
357
  });
359
  });
Line 358... Line 360...
358
}
360
}
Line 482... Line 484...
482
  $( '#new-fields input[required]' ).each( function() {
484
  $( '#new-fields input[required]' ).each( function() {
483
    if( 0 === $( this ).val().length ) {
485
    if( 0 === $( this ).val().length ) {
484
      // Le champ est signalé en rouge
486
      // Le champ est signalé en rouge
485
      $( this ).addClass( 'invalid' );
487
      $( this ).addClass( 'invalid' );
486
      // Un message d'alerte apparait après le champ
488
      // Un message d'alerte apparait après le champ
487
      if( 0 === $( this).next( '.validation-warning' ).length ) {
489
      if( 0 === $( this ).next( '.validation-warning' ).length ) {
488
        $( this).after(
490
        $( this ).after(
489
          '<p class="validation-warning message">' +
491
          '<p class="validation-warning message">' +
490
            '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
492
            '<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
491
             '&nbsp;Ce champ est requis' +
493
             '&nbsp;Ce champ est requis' +
492
          '</p>'
494
          '</p>'
493
        );
495
        );
494
      }
496
      }
495
    } else {
497
    } else {
496
      // Le champ est signalé en rouge
498
      // Le champ est signalé en rouge
497
      $( this ).removeClass( 'invalid' );
499
      $( this ).removeClass( 'invalid' );
498
      // Le message d'alerte du champ est supprimé
500
      // Le message d'alerte du champ est supprimé
499
      if( 0 < $( this).next( '.validation-warning' ).length ) {
501
      if( 0 < $( this ).next( '.validation-warning' ).length ) {
500
        $( this ).next( '.validation-warning' ).hide( 200 , function () {
502
        $( this ).next( '.validation-warning' ).hide( 200 , function () {
501
          $( this ).remove();
503
          $( this ).remove();
502
        });
504
        });
503
      }
505
      }
504
    }
506
    }
Line 530... Line 532...
530
 
532
 
531
// Enregistrement des valeurs à transmettre
533
// Enregistrement des valeurs à transmettre
532
function onClickStoreNewFields() {
534
function onClickStoreNewFields() {
533
  // Lorsqu'on valide
535
  // Lorsqu'on valide
534
  var resultArrayIndex = 0;
536
  var resultArrayIndex = 0;
535
  var count = $( 'fieldset' ).last().attr('data-id');
537
  var count = $( 'fieldset' ).last().data( 'id' );
536
  var helpFileExists = false;
538
  var helpFileExists = false;
537
  // Savoir si au moins un fichier "aide" est enregistré
539
  // Savoir si au moins un fichier "aide" est enregistré
538
  $( '.field-help' ).each( function () {
540
  $( '.field-help' ).each( function () {
539
    if( '' !== $( this ).val() ){
541
    if( '' !== $( this ).val() ){
540
      helpFileExists = true;
542
      helpFileExists = true;
541
    }
543
    }
542
  })
544
  })
543
  // dans ce cas intégrer dans le formulaire à soumettre un bloc
545
  // dans ce cas intégrer dans le formulaire à soumettre un bloc
544
  // qui contiendra une copie de chacun de ces input[type="file"]
546
  // qui contiendra une copie de chacun de ces input[type="file"]
545
  if( helpFileExists ){
547
  if( helpFileExists ){
546
    $('#submit-button').before( '<div id="help-doc-submit" class="hidden"></div>' );
548
    $( '#submit-button' ).before( '<div id="help-doc-submit" style="position:fixed;visibility:hidden;"></div>' );
547
  }
549
  }
548
  // On déroule les blocs de champs supplémentaires
550
  // On déroule les blocs de champs supplémentaires
549
  for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
551
  for( var index = $( 'fieldset' ).first().data( 'id' ) ; index <= count ; index++ ) {
550
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
552
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
551
    // Certains indices peuvent correspondre à un champ supprimé
553
    // Certains indices peuvent correspondre à un champ supprimé
552
    if( 0 < $( thisFieldset ).length ) {
554
    if( 0 < $( thisFieldset ).length ) {
553
      // initialisation du tableau de résultats
555
      // initialisation du tableau de résultats
Line 567... Line 569...
567
      // Ajout du nom du document d'aide au tableau de resultats
569
      // Ajout du nom du document d'aide au tableau de resultats
568
      datasToSubmit[ resultArrayIndex ].help        = $( '.file-return.help-doc-' + index ).text() || null;
570
      datasToSubmit[ resultArrayIndex ].help        = $( '.file-return.help-doc-' + index ).text() || null;
569
      // Collecte les des données dépendantes de l'élément choisi
571
      // Collecte les des données dépendantes de l'élément choisi
570
      // sous forme d'un tableau de resultats
572
      // sous forme d'un tableau de resultats
571
      onSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , thisFieldset );
573
      onSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , thisFieldset );
-
 
574
 
572
      if( $.isEmptyObject(datasToSubmit[ resultArrayIndex ].fieldValues) ){
575
      if( $.isEmptyObject( datasToSubmit[ resultArrayIndex ].fieldValues ) ){
573
        delete datasToSubmit[ resultArrayIndex ].fieldValues;
576
        delete datasToSubmit[ resultArrayIndex ].fieldValues;
574
      }
577
      }
575
      // Copie d'un champ de fichier d'aide dans le bloc d'envoi
578
      // Copie d'un champ de fichier d'aide dans le bloc d'envoi
576
      if( '' !== $( '.field-help' , thisFieldset ).val() ) {
579
      if( '' !== $( '.field-help' , thisFieldset ).val() ) {
577
        $( '.field-help' , thisFieldset ).clone()
580
        $( '.field-help' , thisFieldset ).clone()
578
          .attr( 'id' , datasToSubmit[ resultArrayIndex ].key )// l'id prend la valeur de la clé
581
          .attr( 'name' , 'help-' + datasToSubmit[ resultArrayIndex ].key )// l'attribut name prend la valeur de la clé
579
          .css( 'position' , 'static' )// Retrouver facilement le bloc dans la page
-
 
580
          .appendTo( '#help-doc-submit' );
582
          .appendTo( '#help-doc-submit' );
581
      }
583
      }
582
      resultArrayIndex++;
584
      resultArrayIndex++;
583
    }
585
    }
584
  }
586
  }
585
  var resultsArrayJson = JSON.stringify( datasToSubmit );
587
  var resultsArrayJson = JSON.stringify( datasToSubmit );
-
 
588
  console.log(resultsArrayJson);
586
  // Désactivation de tous les champs et boutons (nouveaux champs)
589
  // Désactivation de tous les champs et boutons (nouveaux champs)
587
  $( '#new-fields, #new-fields .button , #add-fields , #preview-field' ).addClass( 'disabled' );
590
  $( '#new-fields, #new-fields .button , #add-fields , #preview-field' ).addClass( 'disabled' );
588
  $( '#validate-new-fields' ).addClass( 'validated' );
591
  $( '#validate-new-fields' ).addClass( 'validated' );
589
  $( '.validate-new-fields' ).text( 'Champs validés' );
592
  $( '.validate-new-fields' ).text( 'Champs validés' );
590
  // Mise à disposition des données pour le bouron submit
593
  // Mise à disposition des données pour le bouron submit
591
  $('#submit-button').before(
594
  $( '#submit-button' ).before(
592
    '<input type="hidden" name="champs-supp" id="champs-supp" value=\'' + resultsArrayJson + '\'>'
595
    '<input type="hidden" name="champs-supp" id="champs-supp" value="' + resultsArrayJson + '">'
593
  );
596
  );
594
}
597
}
Line 595... Line 598...
595
 
598
 
596
// Renseigne le tableau de resultat
599
// Renseigne le tableau de resultat
597
// pour les données dépendant de l'élément choisi
600
// pour les données dépendant de l'élément choisi
598
function onSelectCollectDataValuesToSubmit( datasToSubmitObject , thisFieldset ) {
601
function onSelectCollectDataValuesToSubmit( datasToSubmitObject , thisFieldset ) {
599
    switch( datasToSubmitObject.element ) {
-
 
600
      // case 'file' :
-
 
601
      // Rien à faire, pas de détails à transmettre
602
    switch( datasToSubmitObject.element ) {
602
      case 'select':
603
      case 'select':
603
      case 'checkbox':
604
      case 'checkbox':
604
      case 'list-checkbox':
605
      case 'list-checkbox':
605
      case 'radio':
606
      case 'radio':
606
        datasToSubmitObject.fieldValues.listValue = [];
607
        datasToSubmitObject.fieldValues.listValue = [];
607
        // Ajout des valeurs de liste
608
        // Ajout des valeurs de liste
608
        onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset );
609
        onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset );
609
        // S'il y a une valeur 'autre' on l'indique à la fin de la liste
610
        // S'il y a une valeur 'autre' on l'indique à la fin de la liste
610
        if( $('.option-other-value' , thisFieldset ).attr( 'checked' ) && datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) === -1 ) {
611
        if( $( '.option-other-value' , thisFieldset ).attr( 'checked' ) && -1 === datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) ) {
611
          datasToSubmitObject.fieldValues.listValue.push( 'other' );
612
          datasToSubmitObject.fieldValues.listValue.push( 'other' );
612
        }
613
        }
Line 613... Line 614...
613
        break;
614
        break;
Line 650... Line 651...
650
  $( '.list-value' , thisFieldset ).each( function() {
651
  $( '.list-value' , thisFieldset ).each( function() {
651
    var selectedFieldElement = $( '.field-element' , thisFieldset ).val();
652
    var selectedFieldElement = $( '.field-element' , thisFieldset ).val();
Line 652... Line 653...
652
 
653
 
653
     if( $( this ).val() ){
654
     if( $( this ).val() ){
654
      // Is-default-value non cochée
655
      // Is-default-value non cochée
655
      if( !$( '.is-defaut-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' , thisFieldset ).attr( 'checked' ) ) {
656
      if( !$( '.is-defaut-value[data-list-value-id="' + $( this ).data( 'list-value-id' ) + '"]' , thisFieldset ).attr( 'checked' ) ) {
656
        datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );
657
        datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );
657
      // Is-default-value cochée pour select/radio
658
      // Is-default-value cochée pour select/radio
658
      } else if( 'select' ===  selectedFieldElement || 'radio' === selectedFieldElement ) {
659
      } else if( 'select' ===  selectedFieldElement || 'radio' === selectedFieldElement ) {
659
        // Une seule valeur par defaut, devient la première valeur du tableau + '#'
660
        // Une seule valeur par defaut, devient la première valeur du tableau + '#'
Line 672... Line 673...
672
 ************************************************/
673
 ************************************************/
Line 673... Line 674...
673
 
674
 
674
// Prévisualisation
675
// Prévisualisation
675
function DisplayClassicFields() {
676
function DisplayClassicFields() {
676
  // Affichage du titre du widget
677
  // Affichage du titre du widget
677
  renderFields( $('#titre') , $( '.widget-renderer h1' ) );
678
  renderFields( $( '#titre' ) , $( '.widget-renderer h1' ) );
678
  // Affichage du nom du projet
679
  // Affichage du nom du projet
679
  renderFields( $('#projet') , $( '.projet-description' ));
680
  renderFields( $( '#projet' ) , $( '.projet-description' ));
680
  // Affichage de la description
681
  // Affichage de la description
681
  renderFields( $('#description') , $( '.preview-description' ) );
682
  renderFields( $( '#description' ) , $( '.preview-description' ) );
682
  // Affichage du logo s'il existe déjà
683
  // Affichage du logo s'il existe déjà
683
  if( 0 !== $('#logo').val().length || $('#logo')[0].defaultValue ) {
684
  if( 0 !== $( '#logo' ).val().length || $( '#logo' )[0].defaultValue ) {
684
    $( '#preview-logo' ).append(
685
    $( '#preview-logo' ).append(
685
      '<img src="' +
686
      '<img src="' +
686
        $( '#group-settings-form .logo img' ).prop('src') +
687
        $( '#group-settings-form .logo img' ).prop( 'src' ) +
687
        '" width="75%"' +
688
        '" width="75%"' +
688
      '>'
689
      '>'
689
    );
690
    );
690
  }
691
  }
Line 714... Line 715...
714
}
715
}
Line 715... Line 716...
715
 
716
 
716
// Affichage des infos dès que disponibles
717
// Affichage des infos dès que disponibles
717
// pour les champs classiques
718
// pour les champs classiques
718
function renderFields( $source , $taget ) {
719
function renderFields( $source , $taget ) {
719
  if($source.val()) {
720
  if( $source.val() ) {
720
    $taget.text( $source.val() );
721
    $taget.text( $source.val() );
721
  }
722
  }
722
  $source.change( function () {
723
  $source.change( function () {
723
    $taget.text( $( this ).val() );
724
    $taget.text( $( this ).val() );
Line 1077... Line 1078...
1077
        '</div>' +
1078
        '</div>' +
1078
        // Bouton 'help'
1079
        // Bouton 'help'
1079
        commonFieldsHtml.helpButton;
1080
        commonFieldsHtml.helpButton;
1080
      break;
1081
      break;
Line 1081... Line -...
1081
 
-
 
1082
    case 'file' :
-
 
1083
      // Ouvrir l'attribut class (suppression de '"')
-
 
1084
      commonFieldsHtml.fieldInput.classAttr = commonFieldsHtml.fieldInput.classAttr.slice(0, -1);
-
 
1085
      commonFieldsHtml.fieldInput.classAttr += ' input-file"';
-
 
1086
      // Class du label
-
 
1087
      commonFieldsHtml.fieldLabel.classAttr = ' class="label-file"';
-
 
1088
      // Type de fichiers acceptés
-
 
1089
      commonFieldsHtml.fieldInput.otherAttr += ' accept="application/pdf, image/*, video/*"';
-
 
1090
 
-
 
1091
      fieldHtml =
-
 
1092
        // Classe 'and-help'
-
 
1093
        '<div class="input-file-container' + commonFieldsHtml.helpClass + '">' +
-
 
1094
          '<input' +
-
 
1095
            // Type
-
 
1096
            commonFieldsHtml.fieldInput.typeAttr +
-
 
1097
            // Name
-
 
1098
            commonFieldsHtml.fieldInput.nameAttr +
-
 
1099
            // DataId
-
 
1100
            commonFieldsHtml.dataIdAttr +
-
 
1101
            // Class
-
 
1102
            commonFieldsHtml.fieldInput.classAttr +
-
 
1103
            // Info-bulle
-
 
1104
            commonFieldsHtml.titleAttr +
-
 
1105
            // Placeholder
-
 
1106
            commonFieldsHtml.fieldInput.placeholderAttr +
-
 
1107
            // Required
-
 
1108
            commonFieldsHtml.fieldInput.mandatoryAttr +
-
 
1109
            // Autres attributs
-
 
1110
            commonFieldsHtml.fieldInput.otherAttr +
-
 
1111
          '>' +
-
 
1112
          '<label' +
-
 
1113
            // For
-
 
1114
            commonFieldsHtml.fieldLabel.forAttr +
-
 
1115
            // Class
-
 
1116
            commonFieldsHtml.fieldLabel.classAttr +
-
 
1117
            // Info-bulle
-
 
1118
            commonFieldsHtml.titleAttr +
-
 
1119
          '><i class="fas fa-download"></i> ' +
-
 
1120
            // Nom du champ
-
 
1121
            commonFieldsHtml.fieldLabel.labelContent +
-
 
1122
          '</label>' +
-
 
1123
        '</div>' +
-
 
1124
        // Bouton supprimer le fichier
-
 
1125
        '<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>' +
-
 
1126
        // Bouton 'help'
-
 
1127
        commonFieldsHtml.helpButton;
-
 
1128
      break;
-
 
1129
 
1082
 
1130
    case 'textarea':
1083
    case 'textarea':
1131
      // Classe 'and-help'
1084
      // Classe 'and-help'
1132
      commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';
1085
      commonFieldsHtml.fieldLabel.classAttr = ' class="' + commonFieldsHtml.helpClass + '"';
1133
      // Autres attributs
1086
      // Autres attributs
Line 1354... Line 1307...
1354
      // Valeur Visible
1307
      // Valeur Visible
1355
      optionText  : $( this ).find('.list-value').val(),
1308
      optionText  : $( this ).find('.list-value').val(),
1356
      // Booléen "default"
1309
      // Booléen "default"
1357
      isDefault   : $( this ).find( '.is-defaut-value').is( ':checked' ),
1310
      isDefault   : $( this ).find( '.is-defaut-value').is( ':checked' ),
1358
      // Indice de l'option
1311
      // Indice de l'option
1359
      optionIndex : $( this ).attr('data-list-value-id')
1312
      optionIndex : $( this ).data( 'list-value-id')
1360
    });
1313
    });
1361
  });
1314
  });
1362
  return options;
1315
  return options;
1363
}
1316
}
Line 1426... Line 1379...
1426
  }
1379
  }
1427
}
1380
}
Line 1428... Line 1381...
1428
 
1381
 
1429
// Prévisualisation des nouveaux champs
1382
// Prévisualisation des nouveaux champs
1430
function newFieldsPreview() {
1383
function newFieldsPreview() {
1431
  var count = $( 'fieldset' ).last().attr('data-id');
1384
  var count = $( 'fieldset' ).last().data( 'id' );
1432
  // Si on a déjà prévisualisé on efface tout pour recommencer
1385
  // Si on a déjà prévisualisé on efface tout pour recommencer
1433
  if( 0 < $( '.preview-fields' ).length ) {
1386
  if( 0 < $( '.preview-fields' ).length ) {
1434
    $( '.preview-fields' ).each( function () {
1387
    $( '.preview-fields' ).each( function () {
1435
      $( this ).remove();
1388
      $( this ).remove();
Line 1441... Line 1394...
1441
      '<h2>Informations propres au projet</h2>' +
1394
      '<h2>Informations propres au projet</h2>' +
1442
      '<div class="message">L\'objectif principal de cet aperçu est de vérifier les contenus et repérer d\'éventuelles erreurs</div>'
1395
      '<div class="message">L\'objectif principal de cet aperçu est de vérifier les contenus et repérer d\'éventuelles erreurs</div>'
1443
    );
1396
    );
1444
  }
1397
  }
1445
  // Parcourir tous les blocs d'infos de champs supplémentaires
1398
  // Parcourir tous les blocs d'infos de champs supplémentaires
1446
  for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
1399
  for( var index = $( 'fieldset' ).first().data( 'id' ) ; index <= count ; index++ ) {
1447
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
1400
    var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
1448
    // Certains indices peuvent correspondre à un champ supprimé
1401
    // Certains indices peuvent correspondre à un champ supprimé
1449
    if( 0 < $( thisFieldset ).length ) {
1402
    if( 0 < $( thisFieldset ).length ) {
1450
      // Prévisualisation d'un champ
1403
      // Prévisualisation d'un champ
1451
      $( '#zone-supp .preview-container' ).append(
1404
      $( '#zone-supp .preview-container' ).append(
Line 1465... Line 1418...
1465
 
1418
 
1466
// Activation/Desactivation et contenu de la modale Bootstrap
1419
// Activation/Desactivation et contenu de la modale Bootstrap
1467
// https://getbootstrap.com/docs/3.3/javascript/#modals
1420
// https://getbootstrap.com/docs/3.3/javascript/#modals
1468
function previewFieldHelpModal() {
1421
function previewFieldHelpModal() {
1469
  $( '#zone-supp' ).on( 'click' , '.help-button' , function ( event ) {
1422
  $( '#zone-supp' ).on( 'click' , '.help-button' , function ( event ) {
1470
    var index = $( this ).closest( '.preview-fields' ).attr( 'data-id' ),
1423
    var index = $( this ).closest( '.preview-fields' ).data( 'id' ),
1471
        thisFieldset = $( '.new-field[data-id="' + index + '"]' ),
1424
        thisFieldset = $( '.new-field[data-id="' + index + '"]' ),
1472
        file = $( '.field-help' , thisFieldset )[0].files[0],
1425
        file = $( '.field-help' , thisFieldset )[0].files[0],
1473
        tmppath = URL.createObjectURL( file );
1426
        tmppath = URL.createObjectURL( file );
1474
    // Titre
1427
    // Titre
1475
    $( '#help-modal-label' ).text( 'Aide pour : ' +  $( '.field-name' , thisFieldset ).val() );
1428
    $( '#help-modal-label' ).text( 'Aide pour : ' +  $( '.field-name' , thisFieldset ).val() );
1476
    // Contenu
1429
    // Contenu
1477
    if( file.type.match( 'image' ) ) {
1430
    if( file.type.match( 'image/*' ) ) {
1478
        $( '#print_content' ).append( '<img src="' + tmppath + '" style="max-width:100%">' );
1431
        $( '#print_content' ).append( '<img src="' + tmppath + '" style="max-width:100%">' );
1479
    } else if( file.type.match( 'pdf' ) ) {
1432
    } else {
1480
        $( '#print_content' ).append( '<iframe src="' + tmppath + '" width="100%" height="650" align="middle" scrolling="no" frameborder="0"></iframe>' );
1433
      $( '#print_content' ).append( '<p>Erreur : le fichier n\'est pas une image</p>' );
1481
    }
1434
    }
1482
    // Sortie avec la touche escape
1435
    // Sortie avec la touche escape
1483
    $( '#help-modal' ).modal( { keyboard : true } );
1436
    $( '#help-modal' ).modal( { keyboard : true } );
1484
    // Affichage
1437
    // Affichage
Line 1520... Line 1473...
1520
  DisplayClassicFields();
1473
  DisplayClassicFields();
1521
  // Affichage des images ou nom des documents importés
1474
  // Affichage des images ou nom des documents importés
1522
  inputFile();
1475
  inputFile();
1523
  // Affichage des List-checkbox
1476
  // Affichage des List-checkbox
1524
  inputListCheckbox();
1477
  inputListCheckbox();
-
 
1478
  // Activer la checkbox de valeur par default uniquement si une valeur est entrée
-
 
1479
  onInputListValueLabelEnableDefaultCheckbox();
1525
  // Affichage des Range
1480
  // Affichage des Range
1526
  inputRangeDisplayNumber()
1481
  inputRangeDisplayNumber();
1527
  // Modale "aide"
1482
  // Modale "aide"
1528
  previewFieldHelpModal();
1483
  previewFieldHelpModal();
1529
});
1484
});