Subversion Repositories eFlore/Applications.cel

Compare Revisions

Regard whitespace Rev 3174 → Rev 3173

/trunk/widget/modules/manager/squelettes/creation.tpl.html
45,6 → 45,11
<script type="text/javascript" src="https://www.tela-botanica.org/commun/jquery/form/2.95/jquery.form.min.js"></script>
<script src="https://resources.tela-botanica.org/bootstrap/3.1.0/js/bootstrap.min.js"></script>
 
<!-- Barre de navigation -->
<?php if ($bar !== false): ?>
<script src="<?php echo $url_script_navigation; ?>"></script>
<?php endif; ?>
 
<!-- CSS -->
<link href="https://www.tela-botanica.org/commun/jquery/jquery-ui/1.8.18/css/smoothness/jquery-ui-1.8.18.custom.css" rel="stylesheet" type="text/css" media="screen" />
<link href="https://www.tela-botanica.org/commun/bootstrap/2.0.2/css/bootstrap.min.css" rel="stylesheet" type="text/css" media="screen" />
70,21 → 75,12
<?php endif; ?>
<h1 id="widget-titre" class="widget-titre"><?php echo ucfirst($mode); ?> de widget de saisie du CEL</h1>
<div id="register-page">
<div id="group-settings-form" class="row">
<div class="row">
 
<div class="widget-blocks col-md-4">
 
<p class="message">
<?php if ($mode === 'modification') : ?>
Attention vous modifiez un widget déjà existant, le tag et la langue ne peuvent pas être changer.
S'il s'agit d'un projet type, en modifiant ce widget vous modifiez tous les widgets de ce type.
<?php else : ?>
Vous créez un widget, si vous choississez de le mettre dans un type, certains champs deviendront
obligatoires et la localisation (point ou rue) sera automatiquement déterminée.
<?php endif; ?>
</p>
 
<form action="http://localhost/cel/widget/manager?mode=<?php echo $mode; ?>" id="basic-widget-form" class="standard-form component component-text" method="post" enctype="multipart/form-data">
<div id="group-settings-form">
<form action="http://localhost/cel/widget/manager?mode=<?php echo $mode; ?>" id="new-widget-form" class="standard-form component component-text" method="post" enctype="multipart/form-data">
<div class="register-section" id="basic-details-section">
 
<h2>Meta-données</h2>
135,8 → 131,7
<input type="file" class="input-file" name="logo" id="logo" accept="image">
<label for="logo" class="label-file"><i class="fas fa-download"></i> Logo</label>
</div>
<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>
<div class="file-return logo hidden"></div>
<div class="file-return logo"></div>
 
<?php echo isset($widget['logo']) ? '<img src="'.$widget['logo'].'"><br />Pour changer, télécharger un nouveau fichier.': ''; ?>
 
144,8 → 139,7
<input type="file" class="input-file" name="fond" id="fond" value="<?php echo $widget['titre']; ?>">
<label for="fond" class="label-file"><i class="fas fa-download"></i> Image de fond</label>
</div>
<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>
<div class="file-return fond hidden"></div>
<div class="file-return fond"></div>
</div><!-- end #profile-details-description-section -->
 
<div class="register-section" id="profile-details-fields-section">
176,86 → 170,73
 
<label for="referentiel">Référentiel *</label>
<input type="text" name="referentiel" id="referentiel" required pattern="([a-z]+?)*" title="Nom du référentiel ex. bdtfx" value="<?php echo isset($widget['referentiel']) ? $widget['referentiel'] : ''; ?>">
 
<!-- Bouton fichier-type à compléter -->
<div class="input-file-container">
<input type="file" class="input-file" name="especes" id="especes">
<label for="especes"class="label-file"><i class="fas fa-download"></i> Espèces</label>
<label for="especes"class="label-file"><i class="fas fa-download"></i> Espèces</label> fichier type
</div>
<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>
<a href="#" class="button fichier-type"><i class="fas fa-file-alt" aria-hidden="true"></i> Fichier type</a>
<div class="file-return especes hidden"></div>
<div class="file-return especes"></div>
</div><!-- end #profile-details-fields-section -->
 
<!--Submit-->
<div class="submit complete-registration" id="submit-button">
<button href="#" type="submit" name="signup_submit" id="signup_submit" class="button" target="" title="Soumettre le nouveau widget"><i class="fas fa-trophy" aria-hidden="true"></i>&nbsp;Terminer</button>
<button href="#" type="submit" name="signup_submit" id="signup_submit" class="button" target="" title=""><span class="button-text">Terminer </span></button>
</div>
<!--Submit-->
 
</form><!-- end #new-widget-form -->
 
<form id="new-fields" autocomplete="off">
<form id="new-fields">
<h2>Ajouter des champs</h2>
<p class="message">
<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>
&nbsp;Attention :
<br>
<i class="fa fa-bolt" aria-hidden="true" style="color:#B3C954"></i>
&nbsp;Le bouton "Valider" sert à valider les champs supplémentaires uniquement
<br>
<i class="fas fa-trophy" aria-hidden="true" style="color:#B3C954"></i>
&nbsp;Le bouton "Terminer" sert à envoyer la totalité du nouveau widget
</p>
<p class="message"><i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> Attention : Ces nouveaux champs (tout comme le widget) ne seront pris en compte qu'une fois le formulaire validé</p>
</form><!-- #new-fields = fomulaire oû viennent s'insérer les champs supplémentaires -->
 
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-4 buttons">
<label class="add-fields">Ajouter</label>
<div class="col-md-6">
<label class="add-fields">Ajouter champs</label>
<div class="button" id="add-fields" title="Ajouter un champ"><i class="fa fa-plus" aria-hidden="true"></i></div>
</div>
<div class="col-md-4 col-sm-4 col-xs-4 buttons">
<label for="preview-field">Prévisualiser</label>
<div class="button" id="preview-field" name="preview-field" title="prévisualiser"><i class="fa fa-magic" aria-hidden="true"></i></div>
<div class="col-md-6">
<label class="validate-new-fields">Valider champs</label>
<div class="button disabled" id="validate-new-fields" title="Valider les champs supplémentaires"><i class="fa fa-check" aria-hidden="true"></i></div>
</div>
<div class="col-md-4 col-sm-4 col-xs-4 buttons">
<label class="validate-new-fields">Valider</label>
<div class="button" id="validate-new-fields" title="Valider les champs supplémentaires"><i class="fa fa-bolt" aria-hidden="true"></i></div>
</div>
</div>
 
<hr>
</div>
 
</div><!-- end .widget-blocks = tout le bloc de gauche-->
 
<div class="widget-blocks col-md-8">
<div class="widget-blocks col-md-8 project">
<p class="message">
<?php if ($mode === 'modification') : ?>
Attention vous modifiez un widget déjà existant, le tag et la langue ne peuvent pas être changer.
S'il s'agit d'un projet type, en modifiant ce widget vous modifiez tous les widgets de ce type.
<?php else : ?>
Vous créez un widget, si vous choississez de le mettre dans un type, certains champs deviendront
obligatoires et la localisation (point ou rue) sera automatiquement déterminée.
<?php endif; ?>
</p>
<!-- <iframe src="http://localhost/widget:cel:saisie2?projet=<?php echo isset($widget['projet'])?$widget['projet']:'base'; ?>" class="widget-renderer" height="100%" width="100%" ></iframe> -->
<div class="widget-renderer" style="background:rgba(248, 245, 239, 0.6);">
<div class="widget-renderer">
 
<div id="preview-header" class="row">
<div id="preview-logo" class="col-md-4">
<img src="" alt="" width="75%">
</div>
<div class="row">
 
<div class="col-md-4">
<img id="preview-logo" src="" alt="">
<div id="preview-title" class="col-md-8">
<h1></h1>
</div>
</div>
 
</div>
 
<div id="preview-messages" class="row">
<div class="row">
 
<div id="preview-description" class="col-md-7">
<div class="message">
<h3>
<span>Projet : </span>
<span class="projet-description"></span>
</h3>
<p class="preview-description"></p>
</div>
<div id="preview-description" class="col-md-6">
<div class="preview-description message"></div>
</div><!-- end #preview-description -->
 
<div id="preview-aide" class="col-md-5">
<div class="message">
<div id="preview-aide" class="message col-md-6">
<h3>Aide</h3>
<p>
Cet outil vous permet de partager simplement vos observations avec
280,7 → 261,6
">contactez-nous</a>
</p>
</div>
</div>
</div><!-- end #preview-aide -->
 
<div id="preview-formulaire" class="row">
397,7 → 377,7
 
<form id="form-supp" role="form" autocomplete="on">
<div id="zone-supp" class="row align-items-center">
<div class="col-md-6 preview-container"></div>
<div class="col-md-6"></div>
</div>
</form>
 
412,23 → 392,6
</div>
</div>
</div>
<div id="help-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="help-modal-label" style="display: none;" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="help-modal-label"></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" id="print_content"></div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="<?php echo $url_base; ?>modules/manager/squelettes/js/manager.js"></script>
</script>
</body>
</html>
/trunk/widget/modules/manager/squelettes/css/manager.css
1,16 → 1,6
@CHARSET "UTF-8";
 
body {
font-family: Ubuntu,Verdana,sans-serif !important;
}
 
div.widget-blocks {
box-sizing: border-box;
padding: 3rem;
margin-bottom: 5rem;
}
 
#zone-appli #register-page .widget-blocks .clear {
.clear {
clear: both;
height: 0;
 
28,142 → 18,65
}
 
h1#widget-titre {
font-size: 3rem;
font-size: 2.6rem;
font-weight: 700;
line-height: 3.2rem;
margin: 0;
position: relative;
color: #232323;
font-family: Ubuntu,sans-serif;
}
 
#zone-appli #register-page .widget-blocks h2 {
font-size: 2.3rem;
h2 {
font-family: Muli,sans-serif;
font-size: 21.5px;
font-weight: 700;
line-height: 1.15;
}
 
#zone-appli #register-page .widget-blocks h3 {
font-size: 2rem;
margin-top: 0.5rem;
div.widget-blocks {
box-sizing: border-box;
padding: 1rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks button,
#group-settings-form .button {
font-size: 1.6rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks input,
#zone-appli #register-page #group-settings-form .widget-blocks select,
#zone-appli #register-page #group-settings-form .widget-blocks textarea {
font-size: 1.3rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .message {
.message {
background-color: #f8f5ef;
color: #232323;
padding: 1rem;
border-radius: 0.3rem;
font-size: 1.3rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .hidden {
display: none;
}
 
/* Aperçu du widget */
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer {
border-radius: 0.3rem;
padding: 0 3rem 3rem 3rem;
.widget-renderer {
border:none;
padding: 3rem;
height: 300rem;
min-height: 100%;
width: 100%;
/*pointer-events: none;*/
overflow: hidden;
/*background: rgba(248, 245, 239, 0.6);*/
width: 90%;
pointer-events: none;
overflow: hidden
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer h1 {
font-size: 3rem;
line-height: 3.2rem;
width: 100%;
color: #232323;
margin: 1rem;
.register-section{
margin-bottom: 1rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer h1,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer h2 span,
#zone-appli #register-page #group-settings-form .widget-blocks h3 .field-title,
#zone-appli #register-page #group-settings-form .widget-blocks .list-label,
#zone-appli #register-page #group-settings-form .widget-blocks label {
text-transform: capitalize;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer h2 {
width: 100%;
color: #232323;
margin: 1rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .and-help {
width: 80%;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .and-help.input-file-container {
width: 73.8%;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer label.and-help,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .list-label.and-help {
margin-bottom:1.5rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer label.and-help,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .list-label.and-help,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .select-wrapper.and-help,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .multiselect.and-help {
display:inline-block;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks form {
/* Formulaires du nouveau widget*/
#group-settings-form {
font-family: Muli,sans-serif;
float: none;
margin-bottom: 2rem;
position: absolute;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .list-label,
#zone-appli #register-page #group-settings-form .widget-blocks label {
#group-settings-form label {
color: #606060;
display: block;
font-size: 1.5rem;
margin-bottom: 0.4rem;
margin-top: 2rem;
font-weight: 300;
font-weight: 700;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .checkbox,
#zone-appli #register-page #group-settings-form .widget-blocks .radio {
padding-left: 0;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .checkbox label,
#zone-appli #register-page #group-settings-form .widget-blocks .radio label{
padding-left: 1rem;
}
 
#preview-formulaire,
#preview-header,
#preview-messages {
padding: 2rem;
border-radius: 0.3rem;
background-color: rgba(255, 255, 255, 0.8);
margin-top: 2rem;
}
 
.register-section{
margin-bottom: 1rem;
}
 
/* Formulaires du nouveau widget*/
#group-settings-form {
float: none;
}
 
#group-settings-form #langue{
width: 100%;
border: 0.1rem solid #ddd;
173,138 → 86,71
}
 
/* Styles des champs required*/
#group-settings-form .register-section input:required,
#group-settings-form .register-section select:required,
#group-settings-form #new-fields input:required,
#group-settings-form #new-fields select:required {
border: 0.2rem solid #F8DFD3;
#group-settings-form .register-section input[required],
#group-settings-form .register-section select[required],
#group-settings-form #new-fields input[required],
#group-settings-form #new-fields select[required] {
border: 0.2rem solid rgba(0, 159, 184, 0.5);
}
 
/**** Styles des boutons ****/
 
/* Positionnement visuel du bouton submit pour qu'il reste
sous les nouveaux champs alors que dans le dom
il est positionné avant les nouveaux champs */
#zone-appli #register-page #group-settings-form .widget-blocks #submit-button {
#group-settings-form #submit-button {
position: absolute;
bottom: -20px;
bottom: -50px;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks #add-fields.button,
#zone-appli #register-page #group-settings-form .widget-blocks .add-value-button.button {
/**** Styles des boutons ajouter et supprimer ****/
#group-settings-form #add-fields.button,
#group-settings-form .add-value-button.button {
background-color: #009fb8;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks #add-fields.button:hover,
#zone-appli #register-page #group-settings-form .widget-blocks #add-fields.button:focus,
#zone-appli #register-page #group-settings-form .widget-blocks .add-value-button.button:hover,
#zone-appli #register-page #group-settings-form .widget-blocks .add-value-button.button:focus {
background-color: rgba(0, 159, 184, 0.7);
#group-settings-form .disabled,
#group-settings-form .validated {
background-color: #eeeeee !important;
cursor: default;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .remove-field.button,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-value.button,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-file {
background-color: #ff5d55;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .remove-field.button:hover,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-field.button:focus,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-value.button:hover,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-value.button:focus,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-file:hover,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-file:focus {
background-color: rgba(255, 93, 85, 0.7);
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .help-button {
background-color: #ea9973;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .help-button,
#zone-appli #register-page #group-settings-form .widget-blocks .remove-file {
margin-left: 0.5rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .remove-file,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .help-button {
border-radius: 0.2rem;
padding: 1.1rem 1rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .help-button:hover,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .help-button:focus,
#zone-appli #register-page #group-settings-form .widget-blocks .fichier-type:hover,
#zone-appli #register-page #group-settings-form .widget-blocks .fichier-type:focus {
background-color: rgba(234, 153, 115, 0.7);
}
/*
#zone-appli #register-page #group-settings-form .widget-blocks .remove-file i {
font-size: 1.6rem;
}*/
 
#zone-appli #register-page #group-settings-form .widget-blocks .fichier-type {
text-transform: capitalize;
font-size: 1.5rem;
margin-left: 0;
padding: 0.8rem;
background-color: #ea9973;
text-decoration: none;
color: #ffffff;
border-radius: 0.2rem;
}
 
 
/**** style du formulaire des nouveaux champs après validation ****/
#zone-appli #register-page #group-settings-form .widget-blocks .disabled,
#zone-appli #register-page #group-settings-form .widget-blocks .validated {
background-color: #eeeeee;
#group-settings-form .validated i {
color: #c3d45d;
cursor: default;
pointer-events: none;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .invalid {
box-shadow : 0 0 1.5px 1px red;
#group-settings-form #add-fields.button:hover,
#group-settings-form #add-fields.button:focus,
#group-settings-form .add-value-button.button:hover,
#group-settings-form .add-value-button.button:focus {
background-color: rgba(0, 159, 184, 0.7);
}
 
/* Le picto validation apparait en vert */
#group-settings-form .validated i {
color: #c3d45d;
cursor: default;
#group-settings-form .remove-field.button,
#group-settings-form .remove-value.button {
background-color: #ff5d55;
}
 
/* La couleur de fond du formulaire lui-même ne change pas */
#zone-appli #register-page #group-settings-form .widget-blocks #new-fields.disabled{
background-color: initial;
#group-settings-form .remove-field.button:hover,
#group-settings-form .remove-field.button:focus,
#group-settings-form .remove-value.button:hover,
#group-settings-form .remove-value.button:focus {
background-color: rgba(255, 93, 85, 0.7);
}
 
/*************************************************/
 
/**** Style des select ****/
#group-settings-form select,
#group-settings-form .selectBox select {
background-color: rgba(0, 159, 184, 0.5);
#group-settings-form select {
background-color: #fff;
border: 0.1rem solid #ddd;
}
 
#group-settings-form select {
font-size: 3rem;
font-weight: 900;
}
#group-settings-form select,
#group-settings-form select[required] {
 
#group-settings-form select,
#group-settings-form select:required,
#group-settings-form .selectBox select,
#group-settings-form .selectBox select:required {
width: 100%;
color:#fff;
color:#333;
border-radius: 0.3rem;
padding: 0.8rem;
line-height: 1.15;
}
 
#group-settings-form select,
#group-settings-form select:required {
padding:0.5rem;
text-transform:none;
 
/* On retire la 'flèche' par defaut */
316,39 → 162,11
}
 
#group-settings-form .select-wrapper,
#group-settings-form #new-fields .select-wrapper,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .selectBox {
#group-settings-form #new-fields .select-wrapper {
position: relative;
border: 0.1rem solid #ddd;
border-radius: 0.3rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .overSelect {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .checkboxes {
border: 0.1rem solid #ddd;
border-radius: 0 0.3rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .label label,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .checkboxes label {
display: block;
padding: 0.5rem;
line-height: 1.15;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer #checkboxes label:hover {
background-color: #1e90ff;
}
 
#group-settings-form .select-wrapper::after,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .selectBox::after {
#group-settings-form .select-wrapper::after {
/* Ajout et style d'une "flèche bas" */
content: '⌄';
pointer-events: none;
357,12 → 175,10
right: 0.5rem;
font-size: 3rem;
font-weight: 900;
color: #fff;
color: #606060;
}
 
#group-settings-form #new-fields .select-wrapper::after,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .selectBox::after,
#zone-appli #register-page #group-settings-form .widget-blocks .widget-renderer .select-wrapper::after {
#group-settings-form #new-fields .select-wrapper::after {
/* correction de la position de la flèche
dans le formulaire des champs ajoutés*/
top: -10px;
372,9 → 188,8
/**** Affichage des nouveaux champs ****/
 
/* Mieux distinguer les différentes strates */
#group-settings-form fieldset.new-field,
#group-settings-form .new-field,
#group-settings-form .new-value {
position: static;
margin: 1rem 0;
padding: 2rem;
border-radius: 0.3rem;
395,19 → 210,18
#group-settings-form .input-file-container,
#group-settings-form #new-fields .input-file-container {
position: relative;
width: 86.9%;
display: inline-block;
width: 100%;
}
 
#group-settings-form .label-file,
#group-settings-form #new-fields .label-file {
display: block;
padding: 0.7rem;
padding: 1rem;
background: #009FB8;
color: #fff !important;
font-size: 1.5rem;
cursor: pointer;
border-radius: 0.3rem;
border-radius: 0.2rem;
}
 
#group-settings-form .input-file,
450,38 → 264,7
#group-settings-form .file-return,
#group-settings-form #new-fields .file-return {
font-style: italic;
font-size: 1rem;
font-size: 1.5rem;
font-weight: bold;
background-color: #fff;
padding: 2rem;
border-radius: 0.3rem;
}
 
#zone-appli #register-page #group-settings-form .widget-blocks input[type="date"],
#zone-appli #register-page #group-settings-form .widget-blocks input[type="number"],
#zone-appli #register-page #group-settings-form .widget-blocks input[type="email"] {
line-height: 1.15;
margin: 0;
padding: 1rem;
border: 0.1rem solid #ddd;
border-radius: 0.3rem;
width: 100%;
box-sizing: inherit;
}
 
/*************************************/
 
#signup_submit {
font-weight: 700;
}
 
.modal-header .close {
margin-top: -2rem !important;
}
 
@media screen and (min-width: 992px) {
div.widget-blocks {
position: sticky;
top: 20px;
}
}
/trunk/widget/modules/manager/squelettes/js/manager.js
1,68 → 1,27
"use strict";
 
/*************************************
* Fonctions de Style et Affichage *
* des éléments "spéciaux" *
*************************************/
// déclaration du tableau d'envoi des données?
var datasToSubmit = new Array();
var listvalue = new Array();
 
// Logique d'affichage pour le input type=file
function inputFile() {
// Initialisation des variables
var $fileInput = $( '.input-file' ),
$button = $( '.label-file' ),
thisId = '';
// Action lorsque la "barre d'espace" ou "Entrée" est pressée
$( '.label-file' ).keydown( function( event ) {
if ( event.keyCode == 13 || event.keyCode == 32 ) {
$( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();
}
});
// Action lorsque le label est cliqué
$( '.label-file' ).click( function(event) {
$( '#' + $( this ).attr( 'for' ) + '.input-file' ).focus();
return false;
});
// Affiche un retour visuel dès que input:file change
$fileInput.change( function( event ) {
// Il est possible de supprimer un fichier
// donc on vérifie que le 'change' est un ajout ou modification
if( !$.isEmptyObject( event.target.files[0] ) ) {
var file = event.target.files[0],
$theReturn = $( '.' + $( this ).attr( 'id' ) );
// Affichage du nom du fichier
$theReturn.text( file.name );
// Si le fichier est une image on l'affiche
if( file.type.match( 'image' ) ) {
// Chemin temporaire de l'image et affichage
var tmppath = URL.createObjectURL( file );
$theReturn.removeClass( 'hidden' ).append( '<img src="' + tmppath + '" width="50%">' );
}
}
});
// Annuler le téléchargement
$( '.remove-file' ).click( function() {
var $thisFileInput = $( this ).prev( '.input-file-container' ).find( '.input-file' );
$thisFileInput.wrap( '<form>' ).closest( 'form' ).get(0).reset();
$thisFileInput.triggerHandler( 'change' );
$thisFileInput.unwrap();
$( this ).next( '.file-return' ).addClass( 'hidden' ).empty();
});
}
/***************************
* Lancement des scripts *
***************************/
 
// Style et affichage des list-checkboxes
function inputListCheckbox() {
// On écoute le click sur une list-checkbox ('.selectBox')
// à tout moment de son insertion dans le dom
$('#zone-appli').on( 'click' , '.selectBox' , function() {
$( '.checkboxes[data-id="' + $(this).attr( 'data-id' ) + '"]' ).toggleClass( 'hidden' );
jQuery( document ).ready( function() {
 
// Identifiant de champ
var fieldIndex = 0;
 
 
// Ajout de nouveaux champs
onClickAddNewFields( fieldIndex );
 
// Affichage des images ou nom des documents importés
inputFile();
 
});
}
 
// Mettre la première lettre en majuscule, les autres en minuscule
function capitalize( string ) {
return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
}
 
/***********************************************************
* Fonctions pour la création des champs supplémentaires *
***********************************************************/
69,16 → 28,59
 
// Logique globale pour l'ajout de nouveaux champs
function onClickAddNewFields( fieldIndex ) {
// Bouton ajouter un champ
 
// Drapeaux d'activation du bouton valider
var nameFlag = false,
keyFlag = false;
 
$( '#add-fields' ).click( function() {
// Affichage du formulaire pour un champ
 
// Réactiver le bouton valider les champs supplémentaires :
nameFlag = false;
keyFlag = false;
 
// Ajout d'un nouveau champ
displayNewField( fieldIndex );
// Affichage du nom du champ
 
// Désactivation du bouton valider
onflagEnableValidateNewFieldsButton( keyFlag , nameFlag );
 
// Test lorsque le nom du nouveau champ est renseigné
$('.new-field .field-name').change( function() {
 
nameFlag = true;
 
// Vérification de name pour tous les nouveaux champs
nameFlag = filledFieldFlag( $('.new-field .field-name') , nameFlag );
 
// Activation du bouton valider
onflagEnableValidateNewFieldsButton( keyFlag , nameFlag );
 
});
 
// Test lorsque la clé du nouveau champ est renseignée
$('.new-field .field-key').change( function() {
 
keyFlag = true;
 
// Vérification de key pour tous les nouveaux champs
keyFlag = filledFieldFlag( $('.new-field .field-key') , keyFlag );
 
// Activation du bouton valider
onflagEnableValidateNewFieldsButton( keyFlag , nameFlag );
 
});
 
// Nom du champ affichage titre du champ
onChangeDisplayFieldLabel( fieldIndex );
// Affichage des images/nom des documents importés dans les champs ajoutés
inputFile();
// Recueil des informations correspondantes au nouveau champ
 
// Les images ou les nom des documents importés doivent aussi
// s'afficher dans les champs ajoutés
inputFile( fieldIndex );
 
// En fonction du type de champ choisi on demande les informations correspondantes
onChangeFieldTypeCollectDetails( fieldIndex );
 
// Suppression d'un champ
onClickRemoveField();
 
86,140 → 88,213
});
}
 
// Création/affichage du formulaire d'un nouveau champ
// Création et logique pour un nouveau champ
// Un peu d'animation de l'affichage d'un nouveau champ
function displayNewField( fieldIndex ) {
// Html du formulaire du nouveaux champs inséré dans le dom
 
// Le html des nouveaux champs inséré dans le dom
$( '#new-fields' ).append(
'<fieldset data-id="' + fieldIndex + '" class="new-field">'+
'<h3>Nouveau champ :<br><strong class="field-title" data-id="' + fieldIndex + '"></strong></h3>'+
'<div data-id="' + fieldIndex + '" class="new-field">'+
'<h3>Nouveau champ :<br><strong class="field-title"></strong></h3>'+
 
// Nom du champ
'<label for="field-name" title="Donnez un titre à votre champ">Nom du champ *</label>'+
'<input type="text" name="field-name" data-id="' + fieldIndex + '" class="field-name" placeholder="Titre de votre champ" title="Donnez un titre à votre champ" required>'+
'<label for="field-name" title="Donnez titre à votre champ">Nom du champ</label>'+
'<input type="text" name="field-name" class="field-name" placeholder="Donnez titre à votre champ" required>'+
 
// Clé du champ
'<label for="field-key" title="Nom du champ dans la base de données">'+
'<label for="field-key" title="Clé du champ (son nom dans la base de données)">'+
'Clé du champ en camelCase (ecritureChameau)<br>'+
'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> '+
'Pas d\'accents ou de cédille, pas de caractères spéciaux. *'+
'Pas d\'accents ou de cédille, pas de caractères spéciaux.'+
'</label>'+
'<input type="text" name="field-key" data-id="' + fieldIndex + '" class="field-key" placeholder="Clé du champ" title="Nom du champ dans la base de données" required>'+
'<input type="text" name="field-key" class="field-key" placeholder="Clé du champ" required title="Clé du champ (son nom dans la base de données)">'+
 
// Type de champ
'<label for="field-element" title="Quel type de champ">Type de champ *</label>'+
'<div class="select-wrapper add-field-select" data-id="' + fieldIndex + '">'+
'<select name="field-element" data-id="' + fieldIndex + '" class="field-element">'+
'<option value="text">Champ texte</option>'+
'<label for="field-element" title="Quel type de champ">Type de champ</label>'+
'<div class="select-wrapper add-field-select">'+
'<select name="field-element" class="field-element">'+
'<option value="text" selected="selected">Champ texte</option>'+
'<option value="email">Champ email</option>'+
'<option value="textarea">Champ rédaction</option>'+
'<option value="select">Menu déroulant</option>'+
'<option value="checkbox">Cases à cocher</option>'+
'<option value="list-checkbox">Liste de cases à cocher</option>'+
'<option value="list-checkbox">liste Cases à cocher</option>'+
'<option value="radio">Boutons radio</option>'+
'<option value="date">Calendrier</option>'+
'<option value="file">Téléchargement</option>'+
'<option value="range">Curseur (entre 2 bornes)</option>'+
'<option value="range">Curseur (curseur entre 2 bornes)</option>'+
'<option value="number">Nombre</option>'+
'</select>'+
'</div>'+
 
// Checkbox "champ requis"
'<label for="field-is_mandatory" title="Ce champ est obligatoire">Champ requis ?</label>'+
'<input type="checkbox" name="field-is_mandatory" data-id="' + fieldIndex + '" class="field-is_mandatory">'+
'<input type="checkbox" name="field-is_mandatory" class="field-is_mandatory">'+
 
// Unité des valeurs
'<label for="field-unit" title="Unité de mesure de vos valeurs">Unités ( cm, kg, ha, etc.)</label>'+
'<input type="text" name="field-unit" data-id="' + fieldIndex + '" class="field-unit" placeholder="symbole de vos unités">'+
'<input type="text" name="field-unit" class="field-unit" placeholder="symbole de vos unités">'+
 
// Tooltip
'<label for="field-description" title="Ajoutez une info-bulle">Info-bulle</label>'+
'<input type="text" name="field-description" data-id="' + fieldIndex + '" class="field-description" placeholder="Quelques mots">'+
'<input type="text" name="field-description" class="field-description" placeholder="Quelques mots">'+
 
// Import d'une image ou d'un pdf d'aide à afficher en popup
'<div class="input-file-container">'+
'<input type="file" class="input-file field-help" name="field-help" data-id="' + fieldIndex + '" id="help-doc-' + fieldIndex + '" accept="application/pdf, image/*, video/*">'+
'<label for="field-help" class="label-file"><i class="fas fa-download"></i> Popup aide image/pdf</label>'+
'<input type="file" class="input-file field-help" name="field-help" id="help-doc-' + fieldIndex + '" accept="application/pdf, image/*, video/*">'+
'<label for="field-help" class="label-file"><i class="fas fa-download"></i>Image ou pdf d\'aide (popup)</label>'+
'</div>'+
'<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>'+
'<div class="file-return help-doc-' + fieldIndex + ' hidden"></div>'+
// Boutons supprimer
'<label for="remove-field">Supprimer</label>'+
'<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>'+
'</fieldset>'
'<div class="file-return help-doc-' + fieldIndex + '"></div>'+
 
'<label for="remove-field">Supprimer ce champ</label>'+
'<div class="remove-field button" name="remove-field" data-id="' + fieldIndex + '" title="Supprimer un champ"><i class="fa fa-times" aria-hidden="true"></i></div>'+
 
'</div>'+
 
'</div>'
);
 
// Animation de l'affichage
$( 'fieldset.new-field[data-id="' + fieldIndex + '"]').hide().show( 200 );
$( '.new-field[data-id="' + fieldIndex + '"]').hide().removeClass( 'hidden' ).show( 200 );
}
 
// Affichage du nom du champ dès qu'il est renseigné
function onChangeDisplayFieldLabel( fieldIndex ) {
$('.field-name[data-id="' + fieldIndex + '"]').change( function() {
$( '.field-title[data-id="' + fieldIndex + '"]' ).text( $( this ).val() );
 
$('.new-field[data-id="' + fieldIndex + '"] .field-name').change( function() {
$( '.new-field[data-id="' + fieldIndex + '"] .field-title' ).text( $( this ).val() );
});
}
 
// Supprimer un nouveau champ
// Supprimer tout un champ
function onClickRemoveField ( keyFlag , nameFlag ) {
$( '.remove-field' ).click( function() {
$(this).closest('fieldset').hide( 200 , function () {
$(this).remove();
 
$( '.remove-field.button' ).click( function() {
 
keyFlag = true ,
nameFlag = true ;
 
$( '.new-field[data-id="' + $( this ).attr( 'data-id' ) + '"]' ).remove();
 
// Vérification de name pour tous les nouveaux champs
nameFlag = filledFieldFlag( $('.new-field .field-name') , nameFlag );
 
// Vérification de name pour tous les nouveaux champs
keyFlag = filledFieldFlag( $('.new-field .field-key') , keyFlag );
 
// Activation du bouton valider
onflagEnableValidateNewFieldsButton( keyFlag , nameFlag );
});
}
 
// Vérification de key ou name pour tous les nouveaux champs
function filledFieldFlag( $field , flag) {
 
if( $field.length === 0 ) {
return flag = false;
}
 
// Vérification de name pour tous les nouveaux champs
$field.each( function() {
if( $( this ).val() === '' ) {
flag = false;
}
});
return flag;
}
 
// Activation du bouton valider les champs supplémentaires
function onflagEnableValidateNewFieldsButton( keyFlag , nameFlag ) {
 
// Activation du bouton valider
if( keyFlag && keyFlag ) {
onClickStoreNewFields();
$( '#validate-new-fields' ).removeClass('disabled');
} else {
$( '#validate-new-fields' ).off( 'click' ).addClass('disabled');
}
}
 
/**** Recueil des informations et détails qui dépendent du type de champ choisi ****/
 
// Logique de recueil d'informations en fonction du type de champ choisi
function onChangeFieldTypeCollectDetails( fieldIndex ) {
// On insère les champs par défaut de recueil d'informations
displayFieldDetailsCollect(
fieldIndex,
 
var today = new Date();
var tomorrow = new Date();
var todayMonth = ( today.getMonth() + 1 ).toString();
var tomorrowMonth = ( tomorrow.getMonth() + 1 ).toString();
if((today.getMonth() + 1) < 10) {
todayMonth = '0' + todayMonth;
}
if((tomorrow.getMonth() + 1) < 10) {
tomorrowMonth = '0' + tomorrowMonth;
}
 
today = today.getFullYear() + '-' + todayMonth + '-' + today.getDate();
tomorrow = tomorrow.getFullYear() + '-' + tomorrowMonth + '-' + ( tomorrow.getDate() + 1 );
 
var fieldDetails =
// Placeholder (champ type text par défaut)
'<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>'+
'<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'
);
'<input type="text" name="aide-saisie" class="aide-saisie" placeholder="Ce que doit contenir le champ">';
// On insère les champs par défaut de recueil d'informations
displayFieldDetailsCollect( fieldIndex , fieldDetails );
 
// Sinon :
$( '.field-element[data-id="' + fieldIndex + '"]' ).change( function() {
$( '.new-field[data-id="' + fieldIndex + '"] .field-element' ).change( function() {
 
// On intialise l'index pour les listes la variable qui contiendra un id pour chaque option
var valueIndex = 0;
 
// Si on hésite on qu'on se trompe dans la liste :
// les champs de détails de l'option précédente doivent être supprimés
$( '.field-details[data-id="' + fieldIndex + '"]' ).hide( 200 , function () {
$(this).remove();
});
$( '.new-field[data-id="' + fieldIndex + '"] .field-details' ).remove();
 
// Html de recueil de données en fonction de l'élément choisi
// $( this ).val() = le type de champ choisi dans select ".field-element"
switch( $( this ).val() ) {
 
case 'file':
fieldDetails = '';
break;
 
case 'number':
case 'range':
displayFieldDetailsCollect(
fieldIndex,
'<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>' +
fieldDetails =
// Placeholder
'<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>'+
'<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'+
'<input type="text" name="aide-saisie" class="aide-saisie" placeholder="Ce que doit contenir le champ">'+
 
// Valeur par défaut
'<label for="default" title="Valeur par défaut">Valeur par défaut</label>'+
'<input type="number" name="default" data-id="' + fieldIndex + '" class="default" step="0.01">'+
'<input type="number" name="default" class="default" step="0.01">'+
 
// Incrémentation ( attribut step="" )
'<label for="step" title="De 10 en 10, de 0.5 en 0.5, etc.">Incrémentation (step) :<br>defaut = +1</label>'+
'<input type="number" name="step" data-id="' + fieldIndex + '" class="step" step="0.01" value="1">'+
'<label for="step" title="De 10 en 10, de 0.5 en 0.5, etc.">Le "pas" d\'incrémentation (step).<br>Pour l\'utilisateur, par defaut step = 1</label>'+
'<input type="number" name="step" class="step" step="0.01">'+
 
// Min
'<label for="min" title="valeur min">Valeur minimale</label>'+
'<input type="number" name="min" data-id="' + fieldIndex + '" class="min" step="0.01" value="0">'+
'<input type="number" name="min" class="min" step="0.01">'+
 
// Max
'<label for="max" title="valeur max">Valeur maximale</label>'+
'<input type="number" name="max" data-id="' + fieldIndex + '" class="max" step="0.01" value="1">'
);
'<input type="number" name="max" class="max" step="0.01">'+
'<p class="message"><i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i> Ne pas oublier de changer la valeur max, fixée à 1 par defaut</p>';
 
break;
 
case 'date':
displayFieldDetailsCollect(
fieldIndex,
 
fieldDetails =
// Date min
'<label for="min" title="date min">Date minimale</label>'+
'<input type="date" name="min" data-id="' + fieldIndex + '" class="min">'+
'<label for="min" title="valeur min">Valeur minimale</label>'+
'<input type="date" name="min" class="min" value="' + today + '">'+
 
// Date max
'<label for="max" title="date max">Date maximale</label>'+
'<input type="date" name="max" data-id="' + fieldIndex + '" class="max">'
);
'<label for="max" title="valeur max">Valeur maximale</label>'+
'<input type="date" name="max" class="max" value="' + tomorrow + '">';
 
break;
 
case 'select':
226,75 → 301,94
case 'checkbox':
case 'list-checkbox':
case 'radio':
displayFieldDetailsCollect(
fieldIndex,
 
fieldDetails =
'<p class="message">Ajoutez les valeurs de \"' + $( this ).children( 'option:selected' ).text() + '\"</p>'+
 
// Bouton ajout d'une valeur à la liste
'<label for="add-value" class="add-value" data-id="' + fieldIndex + '" title="Ajouter une valeur à la liste">Ajouter une valeur</label>'+
'<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>'+
'<label for="add-value" class="add-value" title="Ajouter une valeur à la liste">Ajouter une valeur</label>'+
'<div class="button add-value-button" name="add-value" title="Ajouter une valeur à la liste"><i class="fa fa-plus" aria-hidden="true"></i></div>'+
 
// checkbox ajouter une valeur "Autre:"
'<label for="option-other-value" title="Ajouter une option \'Autre:\' à la fin">Valeur "Autre"</label>'+
'<input type="checkbox" name="option-other-value" data-id="' + fieldIndex + '" class="option-other-value" title="Ajouter une option \'Autre\' à la fin">'
);
'<input type="checkbox" class="option-other-value" name="option-other-value" title="Ajouter une option \'Autre\' à la fin">';
 
break;
 
 
case 'email':
case 'text':
case 'textarea':
default:
displayFieldDetailsCollect(
fieldIndex,
 
fieldDetails =
// Placeholder
'<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>'+
'<input type="text" name="aide-saisie" data-id="' + fieldIndex + '" class="aide-saisie" placeholder="Ce que doit contenir le champ">'
);
'<input type="text" name="aide-saisie" class="aide-saisie" placeholder="Ce que doit contenir le champ">';
 
break;
}
 
if( fieldDetails.length > 0 ) {
//ne pas ajouer une div vide s'il n'y pas d'informations à demander
displayFieldDetailsCollect( fieldIndex , fieldDetails );
}
 
// Ajout des valeurs possibles
// lorsque le champ est une liste ou case à cocher
onClickAddNewValueToList( fieldIndex , valueIndex );
 
});
}
 
// Insertion dans le dom des champs de recueil d'informations
function displayFieldDetailsCollect( fieldIndex , fieldDetails ) {
$( '.add-field-select[data-id="' + fieldIndex + '"]' ).after(
'<div class="field-details" data-id="' + fieldIndex + '">' +
fieldDetails +
'</div>'
).hide().show( 200);
$( '.new-field[data-id="' + fieldIndex + '"] .add-field-select' ).after( '<div class="field-details">' + fieldDetails + '</div>' );
}
 
/**** Ajout des valeurs (options) des "champs de listes" (select, checkbox, radio, etc.) ****/
 
// Ajout des options des listes (deroulantes, cases à cocher etc.)
// Logique d'ajout des options des listes (deroulantes, cases à cocher etc.)
function onClickAddNewValueToList( fieldIndex , valueIndex ) {
$( '.add-value-button[data-id="' + fieldIndex + '"]' ).click( function() {
$( '.add-value[data-id="' + fieldIndex + '"]' ).before(
 
$( '.new-field[data-id="' + fieldIndex + '"] .add-value-button' ).click( function() {
 
$( '.new-field[data-id="' + fieldIndex + '"] .add-value' ).before(
'<div class="new-value" data-list-value-id="' + valueIndex +'">'+
 
// Recueil d'une valeur de la liste
'<label for="list-value">Valeur *:</label>'+
'<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>'+
// Checkbox valeur par défaut+bouton supprimer
'<label for="list-value">Valeur:</label>'+
'<input type="text" name="list-value" class="list-value" data-list-value-id="' + valueIndex +'" placeholder="Une des valeurs de la liste">'+
 
'<div class="row">'+
 
'<div class="col-md-5">'+
// Valeur par défaut
 
// Checkbox "valeur par défaut" de la liste
'<label for="is-defaut-value" title="Ceci est la valeur par défaut">Valeur par défaut</label>'+
'<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 >'+
'<input type="checkbox" name="is-defaut-value" class="is-defaut-value" title="entrez une valeur pour activer cette case" data-list-value-id="' + valueIndex +'" disabled >'+
'</div>'+
 
'<div class="col-md-5">'+
// Bouton supprimer une option
'<label for="remove-value">supprimer valeur</label>'+
'<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>'+
 
// Bouton "supprimer la valeur" de la liste
'<label for="remove-value">Supprimer valeur</label>'+
'<div class="remove-value button" name="remove-value" data-list-value-id="' + valueIndex + '" title="Supprimer une valeur"><i class="fa fa-times" aria-hidden="true"></i></div>'+
 
'</div>'+
 
'</div>'+
'</div>'
).hide().show( 200);
);
 
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
onInputListValueLabelEnableDefaultCheckbox( valueIndex );
// Une seule valeur par défaut pour select et radio
onInputListValueLabelEnableDefaultCheckbox( fieldIndex , valueIndex );
 
// attribuer la valeur par défaut d'un liste
// et retirer l'ancienne s'il y en avait une
onClickDefaultValueRemoveOthers( fieldIndex );
// Supprimer une valeur
 
// Pouvoir supprimer une valeur
onClickRemoveListValue( fieldIndex );
 
valueIndex++;
302,270 → 396,178
}
 
// Activer la checkbox de valeur par default uniquement si une valeur est entrée
function onInputListValueLabelEnableDefaultCheckbox( valueIndex ) {
$( '.new-value[data-list-value-id="' + valueIndex + '"] .list-value' ).on( 'input' , function() {
if( $(this).val() !== '' ) {
$( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).removeAttr( 'disabled');
} else {
$( '.is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).attr( 'disabled', true ).removeAttr( 'checked' );
}
function onInputListValueLabelEnableDefaultCheckbox( fieldIndex , valueIndex ) {
 
$( '.new-field[data-id="' + fieldIndex + '"] .new-value[data-list-value-id="' + valueIndex + '"] .list-value' ).on( 'input' , function() {
$( '.new-field[data-id="' + fieldIndex + '"] .is-defaut-value[data-list-value-id="' + valueIndex + '"]' ).removeAttr( 'disabled');
});
}
 
// Pour les éléments "select" et "radio" il ne peut y avoir qu'une valeur par défaut cochée
// Dans une liste il ne peut y avoir qu'une valeur par défaut cochée
function onClickDefaultValueRemoveOthers( fieldIndex ) {
var selectedFieldElement = $( '.field-element[data-id="' + fieldIndex + '"]' ).val();
 
if( selectedFieldElement === 'select' || selectedFieldElement === 'radio' ) {
$( '.is-defaut-value[data-id="' + fieldIndex + '"]' ).click( function() {
$( '.new-field[data-id="' + fieldIndex + '"] .is-defaut-value' ).click( function() {
 
if( $( this ).attr( 'checked' ) ) {
// Décocher tous les autres
$( '.is-defaut-value[data-id="' + fieldIndex + '"]:checked' ).not( $( this) ).removeAttr( 'checked' );
$( '.new-field[data-id="' + fieldIndex + '"] .is-defaut-value:checked' ).not( $( this) ).removeAttr( 'checked' );
}
 
});
}
}
 
// Bouton supprimer une valeur
// Logique pour le bouton supprimer une valeur
function onClickRemoveListValue( fieldIndex ) {
$( '.remove-value.button[data-id="' + fieldIndex + '"]' ).click( function() {
$( '.new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).hide( 200 , function () {
$(this).remove();
 
$('.new-field[data-id="' + fieldIndex + '"] .remove-value.button').click( function() {
$( '.new-field[data-id="' + fieldIndex + '"] .new-value[data-list-value-id="' + $( this ).attr( 'data-list-value-id' ) + '"]' ).remove();
});
});
}
 
 
/*********************************************
* Validation et envoi des nouveaux champs *
*********************************************/
 
//Activation/Désactivation des boutons valider/prévisualiser
function activatePreviewAndValidateButtons() {
var invalidElementInfos = false, // true si aucune option n'a été entrée pour un élément de liste (select, radio, etc.)
invalidTextInfos = false; // true si au moins un input required n'est pas renseigné
// Clique sur le bouton prévisualiser ou valider
$('#preview-field , #validate-new-fields').on( 'click' , function() {
// S'il n'y a pas (plus) de bloc nouveau champ
if( 0 === $( 'fieldset' ).length ) {
return;
}
var count = $( 'fieldset' ).last().attr('data-id');
// si on a déjà des avertissements on les supprime
if( 0 < $( '.validation-warning' ).length ) {
// Supprimer les messages
$( '.validation-warning' ).each( function() {
$( this ).hide( 200 , function () {
$( this ).remove();
});
});
// Supprimer les bordures en rouge vif
$('.add-value-button , input[required]' ).each( function() {
$( this ).removeClass( 'invalid' );
});
}
// Parcourir tous les blocs d'infos de champs supplémentaires
for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
// Certains indices peuvent correspondre à un champ supprimé
if( 0 < $( thisFieldset ).length ) {
var $fieldElement = $( '.field-element' , thisFieldset ),
fieldElementVal = $fieldElement.val(),
isList = ( // true si c'est un élément "liste"
fieldElementVal === 'list-checkbox' ||
fieldElementVal === 'checkbox' ||
fieldElementVal === 'radio' ||
fieldElementVal === 'select'
);
// Si aucune option n'a été créée pour un élément "liste"
if( isList && 0 === $( '.list-value' , thisFieldset ).length ) {
invalidElementInfos = true;
// Le bouton "Ajouter une valeur" est signalé en rouge
$( '.add-value-button' , thisFieldset ).addClass( 'invalid' );
}
}
}
// Si au moins un champ "required" n'est pas rempli
$( 'input[required]' , thisFieldset ).each( function() {
if( 0 === $( this ).val().length ) {
invalidTextInfos = true;
// Le champ est signalé en rouge
$( this ).addClass( 'invalid' );
}
});
// Si la saisie est invalide
if( invalidElementInfos || invalidTextInfos ) {
// Désactivation des boutons valider et prévisualiser
$( '#preview-field , #validate-new-fields' ).addClass( 'invalid' );
// Message pour les options des "listes"
if( invalidElementInfos ) {
$( '#new-fields' ).append(
'<p class="validation-warning message">' +
'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
'&nbsp;Vérifiez les boutons<br>"<i class="fa fa-puzzle-piece" aria-hidden="true" style="color:#4bbacb"></i>&nbsp;Ajouter une valeur" signalés en rouge:' +
' il faut au moins une valeur pour les éléments "menu déroulant", "boutons radio", "cases à cocher" ou "liste de cases à cocher", ' +
'</p>'
);
}
// Message pour les champs
if( invalidTextInfos ) {
$( '#new-fields' ).append(
'<p class="validation-warning message">' +
'<i class="fa fa-exclamation-triangle" aria-hidden="true" style="color:#ff5d55"></i>' +
'&nbsp;Des informations sont manquantes pour certains champs,' +
' vérifiez ceux signalés en rouge' +
'</p>'
);
}
} else {
$( '#preview-field , #validate-new-fields' ).removeClass( 'invalid' );
if( $( this ).is( '#validate-new-fields') ) {
// Lancement de l'enregistrement des valeurs à transmettre
onClickStoreNewFields();
} else if( $( this ).is( '#preview-field') ) {
// Lancement de la prévisualisation
newFieldsPreview();
}
}
// Réinitialisation des drapeaux de saisie invalide
invalidElementInfos = false;
invalidTextInfos = false;
});
}
function onClickStoreNewFields() {
 
// Enregistrement des valeurs à transmettre
function onClickStoreNewFields() {
// Lorsqu'on valide
$( '#validate-new-fields' ).click( function() {
 
var resultArrayIndex = 0;
var count = $( 'fieldset' ).last().attr('data-id');
var helpFileExists = false;
var count = 0;
 
// Savoir si au moins un fichier "aide" est enregistré
$( '.field-help' ).each( function () {
if( '' !== $( this ).val() ){
helpFileExists = true;
$( '.new-field' ).each( function () {
if( $(this).attr('data-id') > count) {
count = $(this).attr('data-id');
}
})
// dans ce cas intégrer dans le formulaire à soumettre un bloc
// qui contiendra une copie de chacun de ces input[type="file"]
if( helpFileExists ){
$('#submit-button').before( '<div id="help-doc-submit" class="hidden"></div>' );
}
});
 
// On déroule les blocs de champs supplémentaires
for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
// Certains indices peuvent correspondre à un champ supprimé
if( 0 < $( thisFieldset ).length ) {
for( var index = 0 ; index <= count ; index++ ) {
 
if( $( '.new-field[data-id="' + index + '"]').length > 0 ) {
 
// initialisation du tableau de résultats
datasToSubmit[ resultArrayIndex ] = { fieldValues:{} };
 
// Ajout de la clé au tableau de resultats
datasToSubmit[ resultArrayIndex ].key = $( '.field-key' , thisFieldset ).val();
datasToSubmit[ resultArrayIndex ].key = $( '.new-field[data-id="' + index + '"] .field-key' ).val();
 
// Ajout de le nom au tableau de resultats
datasToSubmit[ resultArrayIndex ].name = $( '.field-name' , thisFieldset ).val();
datasToSubmit[ resultArrayIndex ].name = $( '.new-field[data-id="' + index + '"] .field-name' ).val();
 
// Recueil de l'élément choisi pour le tableau de resultats
datasToSubmit[ resultArrayIndex ].element = $( '.field-element' , thisFieldset ).val();
datasToSubmit[ resultArrayIndex ].element = $( '.new-field[data-id="' + index + '"] .field-element' ).val();
 
// Ajout de la valeur 'requis' ou non au tableau de resultats
if( $( '.new-field[data-id="' + index + '"] .field-is_mandatory' ).attr( 'checked' ) ) {
datasToSubmit[ resultArrayIndex ].mandatory = true;
} else {
datasToSubmit[ resultArrayIndex ].mandatory = false;
// Ajout de "champ requis"
if( $( '.field-is_mandatory' , thisFieldset ).is( ':checked' ) ) {
datasToSubmit[ resultArrayIndex ].mandatory = true;
}
 
// Ajout de l'unité au tableau de resultats
if ( $( '.field-unit' , thisFieldset ).val() ) {
datasToSubmit[ resultArrayIndex ].unit = $( '.field-unit' , thisFieldset ).val();
}
if ( $('.new-field[data-id="' + index + '"] .field-unit').val() ) {
datasToSubmit[ resultArrayIndex ].unit = $('.new-field[data-id="' + index + '"] .field-unit').val();
};
 
// Ajout du tooltip au tableau de resultats
if ( $( '.field-description' , thisFieldset ).val() ) {
datasToSubmit[ resultArrayIndex ].description = $( '.field-description' , thisFieldset ).val();
if ( $('.new-field[data-id="' + index + '"] .field-description').val() ) {
datasToSubmit[ resultArrayIndex ].description = $('.new-field[data-id="' + index + '"] .field-description').val();
}
 
// Ajout du nom du document d'aide au tableau de resultats
if ( $('.file-return.help-doc-' + index ).text() ) {
datasToSubmit[ resultArrayIndex ].help = $( '.file-return.help-doc-' + index ).text();
}
 
// Collecte les des données dépendantes de l'élément choisi
// sous forme d'un tableau de resultats
onSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , thisFieldset );
onSelectCollectDataValuesToSubmit( datasToSubmit[ resultArrayIndex ] , index );
if( $.isEmptyObject(datasToSubmit[ resultArrayIndex ].fieldValues) ){
delete datasToSubmit[ resultArrayIndex ].fieldValues;
}
 
// Copie d'un champ de fichier d'aide dans le bloc d'envoi
if( '' !== $( '.field-help' , thisFieldset ).val() ) {
$( '.field-help' , thisFieldset ).clone()
.attr( 'id' , datasToSubmit[ resultArrayIndex ].key )// l'id prend la valeur de la clé
.css( 'position' , 'static' )// Retrouver facilement le bloc dans la page
.appendTo( '#help-doc-submit' );
}
 
resultArrayIndex++;
}
}
 
var resultsArrayJson = JSON.stringify( datasToSubmit );
 
console.log(resultsArrayJson);
// console.log(datasToSubmit);
// Désactivation de tous les champs et boutons (nouveaux champs)
$( '#new-fields, #new-fields .button , #add-fields , #preview-field' ).addClass( 'disabled' );
$( '#validate-new-fields' ).addClass( 'validated' );
// Plus de nouvelle validation possible
$( '#validate-new-fields' ).off( 'click' ).addClass('validated');
$( '#add-fields' ).off( 'click' ).addClass('disabled');
$( '.validate-new-fields' ).text( 'Champs validés' );
// Mise à disposition des données pour le bouron submit
 
$('#submit-button').before(
'<input type="hidden" name="champs-supp" id="champs-supp" value=\'' + resultsArrayJson + '\'>'
);
});
 
}
 
// Renseigne le tableau de resultat
// pour les données dépendant de l'élément choisi
function onSelectCollectDataValuesToSubmit( datasToSubmitObject , thisFieldset ) {
function onSelectCollectDataValuesToSubmit( datasToSubmitObject , index ) {
 
switch( datasToSubmitObject.element ) {
 
// case 'file' :
// Rien à faire, pas de détails à transmettre
 
case 'select':
case 'checkbox':
case 'list-checkbox':
case 'radio':
 
datasToSubmitObject.fieldValues.listValue = [];
 
// Ajout des valeurs de liste
onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset );
onChangeStoreListValueLabel( datasToSubmitObject , index );
 
// S'il y a une valeur 'autre' on l'indique à la fin de la liste
if( $('.option-other-value' , thisFieldset ).attr( 'checked' ) && datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) === -1 ) {
if( $('.new-field[data-id="' + index + '"] .option-other-value').attr( 'checked' ) && datasToSubmitObject.fieldValues.listValue.indexOf( 'other' ) === -1 ) {
datasToSubmitObject.fieldValues.listValue.push( 'other' );
}
 
break;
 
case 'number':
case 'range':
 
// Placeholder
if( $( '.aide-saisie' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val();
if( $( '.new-field[data-id="' + index + '"] .aide-saisie' ).val() ) {
datasToSubmitObject.fieldValues.placeholder = $( '.new-field[data-id="' + index + '"] .aide-saisie' ).val();
}
 
// Valeur par défaut
if( $( '.default' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.default = $( '.default' , thisFieldset ).val();
if( $( '.new-field[data-id="' + index + '"] .default' ).val() ) {
datasToSubmitObject.fieldValues.default = $( '.new-field[data-id="' + index + '"] .default' ).val();
}
 
// Incrémentation ( attribut step="" )
if( $( '.step' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.step = $( '.step' , thisFieldset ).val();
if( $( '.new-field[data-id="' + index + '"] .step' ).val() ) {
datasToSubmitObject.fieldValues.step = $( '.new-field[data-id="' + index + '"] .step' ).val();
}
 
// Min
if( $( '.min' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val();
if( $( '.new-field[data-id="' + index + '"] .min' ).val() ) {
datasToSubmitObject.fieldValues.min = $( '.new-field[data-id="' + index + '"] .min' ).val();
}
 
// Max
if( $( '.max' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val();
if( $( '.new-field[data-id="' + index + '"] .max' ).val() ) {
datasToSubmitObject.fieldValues.max = $( '.new-field[data-id="' + index + '"] .max' ).val();
}
 
break;
 
case 'date':
 
// Min
if( $( '.min' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.min = $( '.min' , thisFieldset ).val();
}
datasToSubmitObject.fieldValues.min = $( '.new-field[data-id="' + index + '"] .min' ).val();
 
// Max
if( $( '.max' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.max = $( '.max' , thisFieldset ).val();
}
datasToSubmitObject.fieldValues.max = $( '.new-field[data-id="' + index + '"] .max' ).val();
 
break;
 
case 'email':
573,9 → 575,10
case 'textarea':
default:
// Placeholder
if( $( '.aide-saisie' , thisFieldset ).val() ) {
datasToSubmitObject.fieldValues.placeholder = $( '.aide-saisie' , thisFieldset ).val();
if( $( '.new-field[data-id="' + index + '"] .aide-saisie' ).val() ) {
datasToSubmitObject.fieldValues.placeholder = $( '.new-field[data-id="' + index + '"] .aide-saisie' ).val();
}
 
break;
}
return datasToSubmitObject;
583,863 → 586,60
 
// Ajout d'une valeur d'un élément liste (select, checkbox etc.)
// dans le tableau de resultats
function onChangeStoreListValueLabel( datasToSubmitObject , thisFieldset ) {
$( '.list-value' , thisFieldset ).each( function() {
var selectedFieldElement = $( '.field-element' , thisFieldset ).val();
if( $( this ).val() ){
if( !$( '.is-defaut-value[data-list-value-id="' + $( this ).attr('data-list-value-id') + '"]' , thisFieldset ).attr( 'checked' ) ) {
datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );
} else if( 'select' === selectedFieldElement || 'radio' === selectedFieldElement ) {
datasToSubmitObject.fieldValues.listValue.unshift( $( this ).val() + '#' );
} else {
datasToSubmitObject.fieldValues.listValue.push( $( this ).val() + '#' );
}
}
});
}
function onChangeStoreListValueLabel( datasToSubmitObject , index ) {
 
/************************************************
* Fonction d'affichage des champs classiques *
************************************************/
$( '.new-field[data-id="' + index + '"] .list-value' ).each( function() {
 
// Affichage des infos dès que disponibles
// pour les champs classiques
function renderFields( $source , $taget ) {
 
if($source.val()) {
$taget.text( $source.val() );
}
$source.change( function () {
$taget.text( $( this ).val() );
});
}
 
function DisplayClassicFields() {
// Affichage du titre du widget
renderFields( $('#titre') , $( '.widget-renderer h1' ) );
// Affichage du nom du projet
renderFields( $('#projet') , $( '.projet-description' ));
// Affichage de la description
renderFields( $('#description') , $( '.preview-description' ) );
// Affichage du logo s'il existe déjà
if( $('#logo').val() ) {
$( '#preview-logo' ).prop( 'src' , $( '#group-settings-form .logo img' ).prop('src') );
}
// Affichage du logo chargé
$( '#logo.input-file' ).change( function( event ) {
 
if( !$.isEmptyObject( event.target.files[0] ) ) {
$( '#preview-logo img' ).prop( 'src' , URL.createObjectURL( event.target.files[0] ) );
if( $( this ).val() ){
if( $( '.new-field[data-id="' + index + '"] .is-defaut-value[data-list-value-id="' + $( this ).attr('data-list-value-id') + '"]' ).attr( 'checked' ) ) {
datasToSubmitObject.fieldValues.listValue.unshift( $( this ).val() );
} else {
$( '#preview-logo img' ).prop( 'src' , '' );
datasToSubmitObject.fieldValues.listValue.push( $( this ).val() );
}
});
// Affichage de l'image de fond
$('#fond.input-file').change( function ( event ) {
if( !$.isEmptyObject( event.target.files[0] ) ) {
$( '.widget-renderer' ).css('background' ,'url(' + URL.createObjectURL( event.target.files[0] ) + ') no-repeat center');
} else {
$( '.widget-renderer' )[0].style.removeProperty( 'background' );
}
});
}
 
 
// /*****************************************************
// * Fonction d'affichage des champs supplémentaires *
// *****************************************************/
/****************************************
* Fonctions pour afficher les images *
* ou les nom de fichers importés *
****************************************/
 
// Construction des éléments à visualiser
function onClickPreviewField( thisFieldset , index ) {
// Logique d'affichage pour le input type=file
function inputFile() {
 
var fieldLabel = $( '.field-name' , thisFieldset ).val(),
fieldKey = $( '.field-key' , thisFieldset ).val(),
fieldElement = $( '.field-element' , thisFieldset ).val(),
fieldIsMandatory = $( '.field-is_mandatory' , thisFieldset ).is( ':checked' ),
fieldUnit = $( '.field-unit' , thisFieldset ).val(),
fieldTooltip = $( '.field-description' , thisFieldset ).val(),
fieldHelp = $( '.file-return.help-doc-' + index ).text(),
fieldPlaceholder = $( '.aide-saisie' , thisFieldset ).val() || '',
fieldDefaultNum = $( '.default' , thisFieldset ).val(),
fieldStep = $( '.step' , thisFieldset ).val(),
fieldMin = $( '.min' , thisFieldset ).val(),
fieldMax = $( '.max' , thisFieldset ).val(),
fieldOtherValue = $( '.option-other-value' , thisFieldset ).is( ':checked' ),
fieldOptions = collectListOptions( thisFieldset );
// initialisation des variables
var $fileInput = $( ".input-file" ),
$button = $( ".label-file" );
 
 
 
var fieldHtmlObject = {},
fieldHtml = '',
constHtml = {},
listHtml = {},
count = fieldOptions.length,
fieldHelpClass = '';
 
// Pour les éléments simples
fieldHtmlObject = {
fieldHelpButton : '',
fieldTitleAttr : '',
fieldLabel : {
labelForAttr :' for="' + fieldKey + '"',
labelClassAttr :'',
labelOtherAttr : '',
labelContent : fieldLabel
},
fieldInput : {
inputTypeAttr : ' type="' + fieldElement + '"',
inputNameAttr : ' name="' + fieldKey + '"',
inputDataIdAttr : ' data-id="' + index + '"',
inputClassAttr : ' class="' + fieldKey + '"',
inputPlaceholderAttr : '',
inputOtherAttr : ''
// action lorsque la "barre d'espace" ou "Entrée" est pressée
$button.on( 'keydown', function( event ) {
if ( event.keyCode == 13 || event.keyCode == 32 ) {
$fileInput.focus();
}
}
 
// Pour les éléments de listes (select, checkbox, etc.)
constHtml = {
fieldContainerContent : fieldLabel,
fieldDataIdAttr : ' data-id="' + index + '"',
fieldTitleAttr : '',
fieldMandatoryAttr : '',
fieldContainerClass : ''
};
 
listHtml = {
optionLabel : {},
optionInput : {
inputTypeAttr : ' type="' + fieldElement + '"',
inputNameAttr : ' name="' + fieldKey + '"',
inputClassAttr : ' class="' + fieldKey + '"',
inputOptionIdAttr : ''
}
};
 
// Changement d'un élément existant:
// supprimer le précédent pour ajouter le nouveau
if( 0 < $( '.preview-fields' , thisFieldset ).length ) {
$( '.preview-fields' , thisFieldset ).remove();
}
 
// Si l'élément est requis
if( fieldIsMandatory ) {
// Attribut required
fieldHtmlObject.fieldInput.inputOtherAttr += ' required="required"';
// Nom du champ (éléments listes)
constHtml.fieldContainerContent += ' *';
// Nom du champ (éléments simples)
fieldHtmlObject.fieldLabel.labelContent += ' *';
}
 
// Si on a une infobulle
if( '' !== fieldTooltip ) {
fieldHtmlObject.fieldTitleAttr = ' title="' + fieldTooltip + '"';
}
 
// Si on a un placeholder
if( '' !== fieldPlaceholder ) {
fieldHtmlObject.fieldInput.inputPlaceholderAttr = ' placeholder="' + fieldPlaceholder + '"';
console.log(fieldPlaceholder);
}
 
if( '' !== fieldHelp ) {
fieldHtmlObject.fieldHelpButton = '<div class="button help-button"><i class="fas fa-info-circle"></i></div>';
fieldHelpClass = ' and-help';
}
 
// html à ajouter en fonction de l'élément choisi
switch( fieldElement ) {
case 'checkbox' :
case 'radio' :
constHtml.fieldContainerClass = ' class="' + fieldElement +'"';
fieldHtml =
// Conteneur
'<div' +
// Class="L'élément choisi"
constHtml.fieldContainerClass +
// DataId
constHtml.fieldDataIdAttr +
// Required
constHtml.fieldMandatoryAttr +
// Info bulle
constHtml.fieldTitleAttr +
' >'+
// Nom du champ
'<div class="list-label' + fieldHelpClass + '">' +
constHtml.fieldContainerContent +
'</div>' +
fieldHtmlObject.fieldHelpButton;
// On déroule les différentes valeurs
for ( let i = 0; i < count; i++ ) {
let fieldOption = fieldOptions[i];
 
listHtml.optionInput.inputDefaultAttr = '';
listHtml.optionInput.inputIdAttr = ' id="' + fieldOption.optionValue + '"';
listHtml.optionLabel.labelForAttr = ' for="' + fieldOption.optionValue + '"';
 
// Si c'est une/l'option par défaut
if( fieldOption.isDefault ) {
listHtml.optionInput.inputDefaultAttr = ' checked';
}
 
// L'indice de chaque option
// L'option "autre" n'en a pas
if( '' !== fieldOption.optionIndex ) {
listHtml.optionInput.inputOptionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
}
 
fieldHtml +=
'<label' +
// For
listHtml.optionLabel.labelForAttr +
// value-id
listHtml.optionInput.inputOptionIdAttr +
// Class="nom du champ"
listHtml.optionInput.inputClassAttr +
'>' +
'<input' +
// Type
listHtml.optionInput.inputTypeAttr +
// DataId
constHtml.fieldDataIdAttr +
// value-id
listHtml.optionInput.inputOptionIdAttr +
// Name
listHtml.optionInput.inputNameAttr +
// Value
' value="' + fieldOption.optionValue + '"' +
// Checked
listHtml.optionInput.inputDefaultAttr +
// Class="nom du champ"
listHtml.optionInput.inputClassAttr +
'>' +
// Label de l'option
fieldOption.optionText +
'</label>';
 
// Si valeur "autre" est cochée
if( fieldOtherValue ) {
fieldHtml +=
'<label for="other"' +
constHtml.fieldDataIdAttr +
'>' +
'<input' +
listHtml.optionInput.inputTypeAttr +
' id="other"' +
listHtml.optionInput.inputNameAttr +
' value="other"' +
listHtml.optionInput.inputClassAttr +
constHtml.fieldDataIdAttr +
'>' +
'Autre</label>';
}
}
// Fin du conteneur
fieldHtml += '</div>';
 
break;
 
case 'list-checkbox':
fieldHtml =
'<div class="multiselect ' + fieldElement + fieldHelpClass + '"' +
// DataId
constHtml.fieldDataIdAttr +
'>' +
'<label>' +
// Nom du champ
constHtml.fieldContainerContent +
'</label>' +
'<div class="selectBox"' +
// DataId
constHtml.fieldDataIdAttr +
'>' +
 
'<select' +
// DataId
constHtml.fieldDataIdAttr +
// Required
constHtml.fieldMandatoryAttr +
// Info bulle
constHtml.fieldTitleAttr +
'>' +
// Apparait dans la barre de sélection
'<option>Plusieurs choix possibles</option>' +
'</select>' +
'<div class="overSelect"></div>' +
'</div>' +
'<div class="checkboxes hidden"' +
// DataId
constHtml.fieldDataIdAttr +
'>';
// On déroule les différentes valeurs
for ( let i = 0; i < count; i++ ) {
let fieldOption = fieldOptions[i];
 
listHtml.optionInput.inputTypeAttr = ' type="checkbox"';
listHtml.optionInput.inputIdAttr = ' id="' + fieldOption.optionValue.toLowerCase() + '"';
listHtml.optionLabel.labelForAttr = ' for="' + fieldOption.optionValue.toLowerCase() + '"';
listHtml.optionInput.inputDefaultAttr = '';
 
if( fieldOption.isDefault ) {
listHtml.optionInput.inputDefaultAttr = ' checked';
}
 
if( '' !== fieldOption.optionIndex ) {
listHtml.optionInput.inputOptionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
}
 
fieldHtml +=
 
'<label' +
listHtml.optionLabel.labelForAttr +
// value-id
listHtml.optionInput.inputOptionIdAttr +
'>' +
 
'<input type="checkbox"' +
// value-id
listHtml.optionInput.inputOptionIdAttr +
// Name
listHtml.optionInput.inputNameAttr +
// Value
' value="' + fieldOption.optionValue + '"' +
// Checked
listHtml.optionInput.inputDefaultAttr +
// Class="nom du champ"
listHtml.optionInput.inputClassAttr +
// DataId
constHtml.fieldDataIdAttr +
'>' +
// Label de l'option
fieldOption.optionText +
'</label>';
}
 
// Si valeur "autre" est cochée
if( fieldOtherValue ) {
fieldHtml +=
'<label for="other"' +
// DataId
constHtml.fieldDataIdAttr +
'>' +
'<input type="checkbox"' +
' id="other"' +
listHtml.optionInput.inputNameAttr +
' value="other"' +
listHtml.optionInput.inputClassAttr +
// DataId
constHtml.fieldDataIdAttr +
'>' +
'Autre</label>';
}
 
// Fermeture des conteneurs .multiselect .checkboxes
fieldHtml +=
'</div>'+
'</div>' +
fieldHtmlObject.fieldHelpButton;
 
break;
 
case 'select':
fieldHtml =
'<label' +
' for="' + fieldKey + '"' +
// Info bulle
constHtml.fieldTitleAttr +
'>' +
// Nom du champ
constHtml.fieldContainerContent +
'</label>' +
// Conteneur/Wrapper
'<div class="select-wrapper add-field-select ' + fieldElement + fieldHelpClass + '"' +
constHtml.fieldDataIdAttr +
'>' +
'<select' +
' name="' + fieldKey + '"' +
' id="' + fieldKey + '"' +
//Class
listHtml.optionInput.inputClassAttr +
// Required
constHtml.fieldMandatoryAttr +
// DataId
constHtml.fieldDataIdAttr +
'>';
 
// On déroule les différentes valeurs
for ( let i = 0; i < count; i++ ) {
let fieldOption = fieldOptions[i];
 
listHtml.optionInput.inputDefaultAttr = '';
listHtml.optionInput.inputdisabledAttr = '';
 
if( fieldOption.isDefault ) {
listHtml.optionInput.inputDefaultAttr = ' selected="selected"';
}
 
if( '' !== fieldOption.optionIndex ) {
listHtml.optionInput.inputOptionIdAttr = ' value-id="' + fieldOption.optionIndex + '"';
}
 
fieldHtml +=
'<option' +
// Value
' value="' + fieldOption.optionValue + '"' +
// Value-id
listHtml.optionInput.inputOptionIdAttr +
// Selected
listHtml.optionInput.inputDefaultAttr +
'>' +
// Option
fieldOption.optionText +
'</option>';
}
 
// Si valeur "autre" est cochée
if( fieldOtherValue ) {
fieldHtml +=
'<option class="other" value="other"' + constHtml.fieldDataIdAttr + '>' +
'Autre' +
'</option>';
}
 
fieldHtml +=
'</select>' +
// Fin du conteneur/wrapper
'</div>' +
 
fieldHtmlObject.fieldHelpButton;
 
break;
 
case 'file' :
fieldHtmlObject.fieldInput.inputClassAttr = fieldHtmlObject.fieldInput.inputClassAttr.slice(0, -1);
fieldHtmlObject.fieldInput.inputClassAttr += ' input-file"';
 
fieldHtmlObject.fieldLabel.labelClassAttr = ' class="label-file"';
 
fieldHtmlObject.fieldInput.inputOtherAttr += ' accept="application/pdf, image/*, video/*"';
 
fieldHtml =
'<div class="input-file-container' + fieldHelpClass + '">' +
'<input' +
// Type
fieldHtmlObject.fieldInput.inputTypeAttr +
// Name
fieldHtmlObject.fieldInput.inputNameAttr +
// DataId
fieldHtmlObject.fieldInput.inputDataIdAttr +
// Class
fieldHtmlObject.fieldInput.inputClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Placeholder
fieldHtmlObject.fieldInput.inputPlaceholderAttr +
// Autres attributs
fieldHtmlObject.fieldInput.inputOtherAttr +
'>' +
 
'<label' +
// For
fieldHtmlObject.fieldLabel.labelForAttr +
// Class
fieldHtmlObject.fieldLabel.labelClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
'><i class="fas fa-download"></i> ' +
// Nom du champ
fieldHtmlObject.fieldLabel.labelContent +
'</label>' +
 
'</div>' +
 
'<div class="remove-file button" name="remove-file" title="Supprimer le fichier"><i class="fas fa-times" aria-hidden="true"></i></div>' +
 
fieldHtmlObject.fieldHelpButton;
 
break;
 
case 'textarea':
fieldHtmlObject.fieldLabel.labelClassAttr = ' class="' + fieldHelpClass + '"';
// Autres attributs
fieldHtmlObject.fieldInput.inputOtherAttr += ' id="' + fieldKey + '"';
 
fieldHtml =
'<label' +
// For
fieldHtmlObject.fieldLabel.labelForAttr +
// Class
fieldHtmlObject.fieldLabel.labelClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Autres attributs
fieldHtmlObject.fieldLabel.labelOtherAttr +
'>' +
// Nom du champ
fieldHtmlObject.fieldLabel.labelContent +
'</label>' +
 
fieldHtmlObject.fieldHelpButton +
 
'<textarea' +
// Name
fieldHtmlObject.fieldInput.inputNameAttr +
// DataId
fieldHtmlObject.fieldInput.inputDataIdAttr +
// Class
fieldHtmlObject.fieldInput.inputClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Info-bulle
fieldHtmlObject.fieldInput.inputPlaceholderAttr +
// Autres attributs
fieldHtmlObject.fieldInput.inputOtherAttr +
'></textarea>';
 
break;
 
case 'range':
fieldHtmlObject.fieldLabel.labelClassAttr = ' class="' + fieldHelpClass + '"';
 
if( '' !== fieldStep ) {
fieldHtmlObject.fieldInput.inputOtherAttr += ' step="' + fieldStep + '"';
}
 
if( '' !== fieldMin ) {
fieldHtmlObject.fieldInput.inputOtherAttr += ' min="' + fieldMin + '"';
}
 
if( '' !== fieldMax ) {
fieldHtmlObject.fieldInput.inputOtherAttr += ' max="' + fieldMax + '"';
}
 
fieldHtml =
'<div class="number">' +
'<label' +
// For
fieldHtmlObject.fieldLabel.labelForAttr +
// Class
fieldHtmlObject.fieldLabel.labelClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Autres attributs
fieldHtmlObject.fieldLabel.labelOtherAttr +
'>' +
// Nom du champ
fieldHtmlObject.fieldLabel.labelContent +
'</label>' +
 
fieldHtmlObject.fieldHelpButton +
 
'<input' +
// Type
fieldHtmlObject.fieldInput.inputTypeAttr +
// Name
fieldHtmlObject.fieldInput.inputNameAttr +
// DataId
fieldHtmlObject.fieldInput.inputDataIdAttr +
// Class
fieldHtmlObject.fieldInput.inputClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Info-bulle
fieldHtmlObject.fieldInput.inputPlaceholderAttr +
// Autres attributs
fieldHtmlObject.fieldInput.inputOtherAttr +
'>' +
 
'</div>';
 
break;
 
case 'date':
case 'number':
fieldHtmlObject.fieldInput.inputClassAttr = fieldHtmlObject.fieldInput.inputClassAttr.slice(0, -1);
fieldHtmlObject.fieldInput.inputClassAttr += fieldHelpClass + '"';
 
if( '' !== fieldStep ) {
fieldHtmlObject.fieldInput.inputOtherAttr += ' step="' + fieldStep + '"';
}
 
if( '' !== fieldMin ) {
fieldHtmlObject.fieldInput.inputOtherAttr += ' min="' + fieldMin + '"';
}
 
if( '' !== fieldMax ) {
fieldHtmlObject.fieldInput.inputOtherAttr += ' max="' + fieldMax + '"';
}
 
fieldHtml =
'<div class="number">' +
'<label' +
// For
fieldHtmlObject.fieldLabel.labelForAttr +
// Class
fieldHtmlObject.fieldLabel.labelClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Autres attributs
fieldHtmlObject.fieldLabel.labelOtherAttr +
'>' +
// Nom du champ
fieldHtmlObject.fieldLabel.labelContent +
'</label>' +
 
'<input' +
// Type
fieldHtmlObject.fieldInput.inputTypeAttr +
// Name
fieldHtmlObject.fieldInput.inputNameAttr +
// DataId
fieldHtmlObject.fieldInput.inputDataIdAttr +
// Class
fieldHtmlObject.fieldInput.inputClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Info-bulle
fieldHtmlObject.fieldInput.inputPlaceholderAttr +
// Autres attributs
fieldHtmlObject.fieldInput.inputOtherAttr +
'>' +
 
fieldHtmlObject.fieldHelpButton +
 
'</div>';
 
break;
 
case 'text' :
case 'email':
default:
fieldHtmlObject.fieldInput.inputClassAttr = fieldHtmlObject.fieldInput.inputClassAttr.slice(0, -1);
fieldHtmlObject.fieldInput.inputClassAttr += fieldHelpClass + '"';
 
fieldHtml =
'<label' +
// For
fieldHtmlObject.fieldLabel.labelForAttr +
// Class
fieldHtmlObject.fieldLabel.labelClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Autres attributs
fieldHtmlObject.fieldLabel.labelOtherAttr +
'>' +
// Nom du champ
fieldHtmlObject.fieldLabel.labelContent +
'</label>' +
 
'<input' +
// Type
fieldHtmlObject.fieldInput.inputTypeAttr +
// Name
fieldHtmlObject.fieldInput.inputNameAttr +
// DataId
fieldHtmlObject.fieldInput.inputDataIdAttr +
// Class
fieldHtmlObject.fieldInput.inputClassAttr +
// Info-bulle
fieldHtmlObject.fieldTitleAttr +
// Info-bulle
fieldHtmlObject.fieldInput.inputPlaceholderAttr +
// Autres attributs
fieldHtmlObject.fieldInput.inputOtherAttr +
'>' +
 
fieldHtmlObject.fieldHelpButton;
 
break;
}
 
return fieldHtml;
}
 
// Construire un tableau des options pour chaque élément de listes
function collectListOptions( thisFieldset ) {
var $details = $( '.field-details' , thisFieldset ),
options = [];
 
$details.find( '.new-value' ).each( function() {
 
options.push({
// Valeur transmise (value)
optionValue : $( this ).find('.list-value').val().toLowerCase(),
// Valeur Visible
optionText : capitalize( $( this ).find('.list-value').val() ),
// Booléen "default"
isDefault : $( this ).find( '.is-defaut-value').is( ':checked' ),
// Indice de l'option
optionIndex : $( this ).attr('data-list-value-id')
});
 
// action lorsque le label est cliqué
$button.click( function() {
$fileInput.focus();
return false;
});
return options;
}
 
// Faire apparaitre un champ text "Autre"
function onOtherOption( thisFieldset , index ) {
//L'élément choisi
var element = $('.field-element' , thisFieldset ).val(),
// Où insérer le champ "Autre"
$element = $( '.' + element , thisFieldset ),
// html du champ "Autre"
collectOther =
'<label data-id="' + index + '" for="collect-other">Autre option :</label>' +
'<input type="text" name="collect-other" data-id="' + index + '" class="collect-other" >';
// affiche un retour visuel dès que input:file change
$fileInput.change( function( event ) {
var file = event.target.files[0],
$theReturn = $( '.' + $( this ).attr( 'id' ) );
 
// Pouvoir supprimer le champ "Autre"
function optionRemove( thisFieldset ) {
$( 'label[for="collect-other"]' , thisFieldset ).remove();
$( 'input.collect-other' , thisFieldset ).remove();
}
// affichage du nom du fichier
$theReturn.text( file.name );
 
switch( element ) {
case 'radio' :
// Lorsqu'un nouveau bouton est coché
$( 'input' , thisFieldset ).on( 'change' , function () {
if( 'other' === $( this ).val() ) {
// Insertion du champ "Autre" après les boutons
$element.after( collectOther );
} else {
// Suppression du champ autre
optionRemove( thisFieldset );
}
});
 
break;
 
case 'select' :
// Lorsque l'option "Autre" est selectionnée
$( 'select' , thisFieldset ).on( 'change' , function () {
if( 'other' === $( this).val() ) {
// Insertion du champ "Autre" après les boutons
$element.after( collectOther );
// Suppression du champ autre
} else {
optionRemove( thisFieldset );
}
});
 
break;
 
case 'checkbox' :
case 'list-checkbox' :
// Lorsque "Autre" est coché
$( 'input#other' , thisFieldset ).on( 'click' , function () {
// Insertion du champ "Autre" après les boutons
if( $( this ).is( ':checked' ) ) {
$element.after( collectOther );
} else {
// Suppression du champ autre
optionRemove( thisFieldset );
}
});
 
break;
 
default :
break;
}
}
 
// Prévisualisation des nouveaux champs
function newFieldsPreview() {
var count = $( 'fieldset' ).last().attr('data-id');
// Si on a déjà prévisualisé on efface tout pour recommencer
if( 0 < $( '.preview-fields' ).length ) {
$( '.preview-fields' ).each( function () {
$( this ).remove();
});
}
// Au premier ajout d'un champ dans la prévisualisation on ajoute un titre et un message
if( true === firstClick ) {
$( '#zone-supp' ).prepend(
'<h2>Informations spécifiques au projet</h2>' +
'<div class="message">Ceci n\'est qu\'un aperçu.<br>Il vous permet simplement de visualiser les contenus pour vérifier d\'évenutelles erreurs</div>'
);
}
// Parcourir tous les blocs d'infos de champs supplémentaires
for( var index = $( 'fieldset' ).first().attr('data-id') ; index <= count ; index++ ) {
var thisFieldset = $( 'fieldset[data-id="' + index + '"]');
// Certains indices peuvent correspondre à un champ supprimé
if( 0 < $( thisFieldset ).length ) {
// Prévisualisation d'un champ
$( '#zone-supp .preview-container' ).append(
'<div class="preview-fields" data-id="' + index + '">'+
onClickPreviewField( thisFieldset , index ) +
'</div>'
);
 
// Ajout/suppression d'un champ texte "Autre"
if( $( '.option-other-value' , thisFieldset ).is( ':checked' ) ) {
onOtherOption( thisFieldset , index);
}
}
}
// Le titre + message de la section prévisualisation ne sont ajoutés qu'une fois
firstClick = false;
}
 
function previewFieldHelpModal() {
$( '#zone-supp' ).on( 'click' , '.help-button' , function ( event ) {
var index = $( this ).closest( '.preview-fields' ).attr( 'data-id' ),
thisFieldset = $( '.new-field[data-id="' + index + '"]' ),
file = $( '.field-help' , thisFieldset )[0].files[0],
tmppath = URL.createObjectURL( file ),
helpModalHtml = '';
 
$( '#help-modal-label' ).text( 'Aide pour : ' + $( '.field-name' , thisFieldset ).val() );
 
// si le fichier est une image on l'affiche
if( file.type.match( 'image' ) ) {
$( '#print_content' ).append( '<img src="' + tmppath + '" style="max-width:100%">' );
} else if( file.type.match( 'pdf' ) ) {
$( '#print_content' ).append( '<iframe src="' + tmppath + '" width="100%" height="650" align="middle" scrolling="no" frameborder="0"></iframe>' );
// temporairement retrouver le chemin
// de l'image qui a été chagée, pour affichage
var tmppath = URL.createObjectURL( file );
$theReturn.append( '<img src="' + tmppath + '" width="50%">' );
}
 
$( '#help-modal' ).modal( { keyboard : true } );
$( '#help-modal' ).modal( 'show' );
 
$( '#help-modal' ).on( 'shown.bs.modal' , function () {
$( '#myInput' ).trigger( 'focus' );
})
 
$( '#help-modal' ).on( 'hidden.bs.modal' , function () {
$( '#help-modal-label' ).text();
$( '#print_content' ).empty();
})
});
}
 
 
 
/***************************
* Lancement des scripts *
***************************/
 
// Tableau d'envoi des données
var datasToSubmit = new Array();
var firstClick = true;
 
jQuery( document ).ready( function() {
// console.log($(location).attr('search'));
// console.log($(location).attr('search').search('='));
// console.log($(location).attr('search').charAt(6));
// Identifiant de champ
var fieldIndex = 0;
// Ajout de nouveaux champs
onClickAddNewFields( fieldIndex );
// Activation/Desactivation des boutons valider et prévisualiser
activatePreviewAndValidateButtons();
 
// Prévisualisation des champs classiques
DisplayClassicFields()
 
 
// Affichage des images ou nom des documents importés
inputFile();
// Affichage des List-checkbox
inputListCheckbox();
 
previewFieldHelpModal();
 
});