Commit 077a1602 authored by tguillon's avatar tguillon
Browse files

Correction ; Changelog

Ajout : Mise en place d'un champ select multiple dans le formulaire
parent 4e3cb045
......@@ -3,15 +3,30 @@
Toutes les modifications apportées au projet seront documentées dans ce fichier.
Le format est basé sur le modèle [Keep a Changelog](http://keepachangelog.com/) et adhère aux principes du [Semantic Versioning](http://semver.org/).
1.0.2 - 2019-XX-XX
2.0.0 - 2019-XX-XX
=====
### Ajouts
- Mise en place d'une FAQ.
- Mise en place de nouveau droits en rapport avec le FAQ.
### Evolutions
- php7.2
- ubuntu serveur 18.04 TLS
### Corrections
### Suppressions
1.0.2 - 2019-XX-XX
=====
### Ajouts
- Mise en place de la civilité du responsable de l'entité.
- Mise en place de la politique de confidentialité de l'application.
- Définition de l'entité responsable de la plate forme web-dpo afin d'afficher les informations de celle-ci dans la page de politique de confidentialité.
- Ajout d'un nouveau type de champ dans le formulaire (multi-select)
### Evolutions
- L'utilisateur ne peut plus changer son identifiant.
......@@ -21,6 +36,8 @@ Le format est basé sur le modèle [Keep a Changelog](http://keepachangelog.com/
faciliter les backups.
- Lors du login, si l'utilisateur a été créé à la main sur l'application, on n'interroge pas les LDAPS potentiellement
connecté.
- Si DPO non défini interdire la création d'un traitement
- Formatage des nom de variable lors de la création ou modification d'un formulaire. (suppression accents, espace, caratère spéciaux)
### Corrections
- Génération du registre au format .CSV
......
......@@ -182,6 +182,9 @@ msgstr "Choix unique"
msgid "formulaire.btnDeroulant"
msgstr "Menu déroulant"
msgid "formulaire.btnMultiSelect"
msgstr "Menu multi-sélect"
msgid "formulaire.btnTitreCategorie"
msgstr "Titre de catégorie"
......
......@@ -160,6 +160,9 @@ msgstr "Choix unique"
msgid "modele.textDeroulantChamp"
msgstr "Menu déroulant"
msgid "modele.textMultiSelectChamp"
msgstr "Menu multi-select"
msgid "modele.textTableauNomPrenomUserTraitement"
msgstr "Prénom et nom"
......
......@@ -420,7 +420,7 @@ class Fiche extends AppModel {
'conditions' => ['id' => $id]
]);
$typeChamps = ['deroulant', 'checkboxes', 'radios'];
$typeChamps = ['deroulant', 'checkboxes', 'radios', 'multi-select'];
$champs = ClassRegistry::init('FgChamp')->find('all', [
'conditions' => [
'formulaires_id' => $idForm['Fiche']['form_id'],
......@@ -437,10 +437,10 @@ class Fiche extends AppModel {
foreach ($champs as $value) {
$options = json_decode($value['FgChamp']['details'], true);
if ($value['FgChamp']['type'] != 'checkboxes') {
$choixChampMultiple[$options['name']] = $options['options'];
} else {
if (in_array($value['FgChamp']['type'], ['checkboxes', 'multi-select'])) {
$checkBoxField[$options['name']] = $options['options'];
} else {
$choixChampMultiple[$options['name']] = $options['options'];
}
}
......
......@@ -199,7 +199,11 @@ class WebdpoFiche extends AppModel {
if (isset($this->validate[$details->name]) == false) {
$this->validate[$details->name] = [];
}
$this->validate[$details->name]['notBlank'] = ['rule' => ['notBlank']];
if (in_array(Hash::get($champ, 'Champ.type'), ['checkboxes', 'multi-select'])) {
$this->validate[$details->name]['multiple'] = ['rule' => ['multiple', ['min' => 1]]];
} else {
$this->validate[$details->name]['notBlank'] = ['rule' => ['notBlank']];
}
}
}
......
......@@ -93,28 +93,6 @@ $(document).ready(function () {
break;
case 'btn-long-text':
/*
$input = $this->WebcilForm->input(
'test',
[
'id' => false,
'label' => [
'text' => 'Grand champ texte',
'class' => 'labeler',
],
'name' => null,
'type' => 'textarea',
'required' => false,
'placeholder' => 'Aide à la saisie',
'div' => [
'class' => 'draggable form-group col-md-6 long-text ui-selected',
'style' => 'left : 0px; top : 0px;' // @fixme
],
]
);
echo h($input);
// @fixme: span + div.col-md-4 + supprimer for="test"
*/
var new_element = jQuery(
'<div class="draggable form-group col-md-6 long-text ui-selected" style="left : 0px; top : '+top+'px;">\n\
<div class="col-md-4">\n\
......@@ -208,15 +186,33 @@ $(document).ready(function () {
</select>\n\
</div>'
);
break
break;
case 'btn-multi-select':
var new_element = jQuery(
'<div class="draggable col-md-6 form-group multi-select ui-selected" style="left : 0px; top : '+top+'px;">' +
'<div class="col-md-4">'+
'<label>'+
'<span class="labeler">Menu multi-select </span>'+
'</label>'+
'</div>'+
'<div class="col-md-8">' +
'<input type="hidden" name="multi-select" value="" id="multi-select_"/>\n' +
'<select name="multi-select" class="form-control multiSelect contentMultiSelect" multiple="multiple">\n' +
'<option>Aucune option</option>'+
'</select>' +
'</div>' +
'</div>'
);
break;
case 'btn-texte':
var new_element = jQuery(
'<div class="draggable form-group col-md-6 texte ui-selected" style="left : 0px; top : '+top+'px;">\n\
<h5>Votre texte</h5>\n\
</div>'
);
break
break;
default:
break;
......@@ -498,6 +494,42 @@ $(document).ready(function () {
'<div class=" btn-group text-center"><button type="button" class="btn btn-default-danger btn-sm" id="closer"><i class="fa fa-trash"></i></button><button type="button" class="btn btn-default-success btn-sm" id="applicable"><i class="fa fa-check"></i> Appliquer</button> </div>' +
'</div>'
);
} else if (object.hasClass('multi-select')) {
var list = '';
champId = "name-multi-select";
$('.ui-selected').find('option').each(function () {
if (list === '') {
list = list + $(this).val();
}
else {
list = list + '\n' + $(this).val();
}
});
if (!$('.ui-selected').find('option').attr('name')) {
var nom = '';
}
else {
var nom = $('.ui-selected').find('option').attr('name').replace('[]', '');
}
var options = jQuery('' +
'<div class="col-md-12">' +
'<div class="col-md-3">' +
'<div class="form-group"><label for='+champId+'>Nom de variable <span class="obligatoire">*</span></label><input type="text" class="form-control nameForm" name="multi-select" id='+champId+' placeholder="Nom UNIQUE" value="' + nom + '"></div>' +
'</div>' +
'<div class="col-md-3">' +
'<div class="form-group"><label for="label-checkbox">Nom du champ</label><input type="text" class="form-control labelForm" name="name" id="label-checkbox" placeholder="Label du champ" value="' + $('.ui-selected').find('.labeler').html() + '"></div>' +
'</div>' +
'<div class="col-md-3">' +
'<div class="form-group"><label for="option-checkbox">Liste des valeurs (1 par ligne)</label><textarea class="form-control multiSelectForm" id="option-checkbox">' + list + '</textarea></div>' +
'</div>' +
check +
'<div class=" btn-group text-center"><button type="button" class="btn btn-default-danger btn-sm" id="closer"><i class="fa fa-trash"></i></button><button type="button" class="btn btn-default-success btn-sm" id="applicable"><i class="fa fa-check"></i> Appliquer</button> </div>' +
'</div>'
);
}
/*Afficher les options en fontion du champ en question*/
......@@ -509,6 +541,11 @@ $(document).ready(function () {
$(this).val(value);
});
}
$('.multiSelect').select2({
placeholder: "Sélectionnez une option",
allowClear: true
});
/*On applique les modifications du champ en question au clic sur le boutton "Appliquer" */
$('#applicable').click(function () {
......@@ -530,6 +567,8 @@ $(document).ready(function () {
// checkName($(this).val());
$('.ui-selected').find('input').attr('name', $(this).val());//@fixme
$('.ui-selected').find('textarea').attr('name', $(this).val());
$('.ui-selected').find('select').attr('id', $(this).val());
}
if ($(this).hasClass('placeholderForm')) {
......@@ -591,8 +630,7 @@ $(document).ready(function () {
$('.ui-selected').attr('style', function (i, style) {
return style.replace(/width[^;]+;?/g, '');
});
}
else if ($(this).hasClass('deroulantForm')) {
} else if ($(this).hasClass('deroulantForm')) {
var options = $(this).val().split('\n');
var objet = '';
var nom = $(this).closest('#field-options').find('.nameForm').val();
......@@ -607,6 +645,24 @@ $(document).ready(function () {
return style.replace(/height[^;]+;?/g, '');
});
$('.ui-selected').attr('style', function (i, style) {
return style.replace(/width[^;]+;?/g, '');
});
} else if ($(this).hasClass('multiSelectForm')) {
var options = $(this).val().split('\n');
var objet = '';
var nom = $(this).closest('#field-options').find('.nameForm').val();
$.each(options, function (index, value) {
objet = objet + '<option name="' + nom + '" value="' + value +'">'+ value +'</option>';
});
$('.ui-selected').find('.contentMultiSelect').html(jQuery(objet));
$('.ui-selected').attr('style', function (i, style) {
return style.replace(/height[^;]+;?/g, '');
});
$('.ui-selected').attr('style', function (i, style) {
return style.replace(/width[^;]+;?/g, '');
});
......@@ -816,6 +872,22 @@ $(document).ready(function () {
var option = [];
$(this).find('option').each(function () {
option.push($(this).attr('value'));
});
contenu['options'] = option;
} else if ($(this).hasClass('multi-select')) {
if (typeof $(this).find('option').attr('name') === ''|| typeof $(this).find('option').attr('name') === 'undefined') {
alert('Le nom de variable du menu multi-select est incorrect');
success = false;
return;
}
contenu['type'] = 'multi-select';
contenu['name'] = $(this).find('option').attr('name');
contenu['label'] = $(this).find('.labeler').html();
var option = [];
$(this).find('option').each(function () {
option.push($(this).attr('value'));
});
......
......@@ -11,8 +11,7 @@
foreach ($this->validationErrors['Fiche'] as $key => $errorChamps) {
foreach ($champs as $value) {
$options = json_decode($value['Champ']['details'], true);
if ($key == $options['name']) {
if (isset($options['name']) === true && $key == $options['name']) {
$champ = $options['label'];
}
}
......@@ -184,7 +183,7 @@
'value' => $this->Session->read('Auth.User.email')
],
'declarantpersonnefix' => [
'id' => 'declarantpersonneportable',
'id' => 'declarantpersonnefix',
'readonly' => true,
'placeholder' => false,
'value' => $this->Session->read('Auth.User.telephonefixe')
......@@ -216,6 +215,7 @@
'options' => $options_normes,
'class' => 'usersDeroulant transformSelect form-control',
'empty' => true,
'placeholder' => false,
'data-placeholder' => __d('norme', 'norme.placeholderFiltreNorme')
]);
?>
......@@ -265,9 +265,10 @@
'Oui' => 'Oui',
'Non' => 'Non'
],
'class' => 'usersDeroulant transformSelect form-control',
'class' => 'transformSelect form-control',
'required' => true,
'empty' => true,
'placeholder' => false,
'data-placeholder' => ' '
],
'donneesSensible' => [
......@@ -276,9 +277,10 @@
'Oui' => 'Oui',
'Non' => 'Non'
],
'class' => 'usersDeroulant transformSelect form-control',
'class' => 'transformSelect form-control',
'required' => true,
'empty' => true,
'placeholder' => false,
'data-placeholder' => ' '
]
]);
......@@ -343,7 +345,8 @@
echo $this->WebcilForm->input('soustraitantid', [
'id' => 'soustraitantid_hidden',
'type' => 'hidden',
'value' => null
'value' => null,
'placeholder' => false
]);
if ($soustraitance['Formulaire']['soustraitant'] === true) {
......@@ -371,6 +374,7 @@
'empty' => true,
'multiple' => false,
'required' => true,
'placeholder' => false,
'data-placeholder' => 'Choisir un sous-traitant'
]);
......@@ -434,7 +438,8 @@
echo $this->WebcilForm->input('soustraitant', [
'id' => 'soustraitant',
'type' => 'hidden',
'value' => 0
'value' => 0,
'placeholder' => false
]);
}
?>
......@@ -573,11 +578,30 @@
'options' => $options['options'],
'required' => $options['obligatoire'],
'class' => 'usersDeroulant transformSelect form-control',
'empty' => true,
'empty' => true,
'placeholder' => false,
'data-placeholder' => ' '
]);
break;
// Menu multi-select
case 'multi-select':
echo $this->WebcilForm->input($options['name'], [
'options' => $options['options'],
'class' => 'form-group multiSelect',
'id' => $options['name'],
'label' => [
'text' => $options['label'],
'class' => 'col-md-4 control-label'
],
'required' => $options['obligatoire'],
'between' => '<div class="col-md-8">',
'after' => '</div>',
'multiple' => 'multiple',
'placeholder' => false
]);
break;
// Choix unique
case 'radios':
?>
......@@ -1034,7 +1058,7 @@
'value' => $userDPO['User']['email']
],
'portableDpo' => [
'id' => 'declarantpersonneportable',
'id' => 'portableDpo',
'readonly' => true,
'placeholder' => false,
'value' => $userDPO['User']['telephoneportable']
......@@ -1123,10 +1147,10 @@ require_once dirname(__FILE__).DS.'model_extention.ctp';
try{
var content = JSON.parse(data);
for (var key in content) {
var tr = $('<tr id="rowFiche'+key+'"></tr>')
.append('<td class="col-md-1"><i class="fa fa-file-text-o fa-lg"><!----></i></td>')
.append('<td class="col-md-9 tdleft">'+content[key].filename+'</td>')
.append('<td class=\"col-md-2\"><button type="button" class="btn btn-warning" onclick=\"deleteFile(\''+content[key].filename+'\',\''+key+'\')\"><i class="fa fa-times-circle"><!----></i> Annuler</button></td>')
var tr = $('<tr id="rowFiche'+key+'"><\/tr>')
.append('<td class="col-md-1"><i class="fa fa-file-text-o fa-lg"><!----><\/i><\/td>')
.append('<td class="col-md-9 tdleft">'+content[key].filename+'<\/td>')
.append('<td class="col-md-2"><button type="button" class="btn btn-warning" onclick=\"deleteFile(\''+content[key].filename+'\',\''+key+'\')\"><i class="fa fa-times-circle"><!----><\/i> Annuler<\/button><\/td>')
$('#render').find('tbody').append(tr);
}
}catch(e){
......@@ -1249,7 +1273,12 @@ require_once dirname(__FILE__).DS.'model_extention.ctp';
$("div.form-group .error-message").closest("div.tab-pane").each(function(idx, pane) {
var a = $( "a[href='#"+$(pane).attr('id')+"']" );
$(a).closest("li").addClass("form-error");
$(a).append("<span class='fa fa-exclamation-circle fa-danger' aria-hidden='true'><!----></span>");
$(a).append("<span class='fa fa-exclamation-circle fa-danger' aria-hidden='true'><!----><\/span>");
});
$('.multiSelect').select2({
placeholder: "Sélectionnez une ou plusieurs options",
allowClear: true
});
});
......
......@@ -547,6 +547,24 @@
]);
break;
// Menu multi-select
case 'multi-select':
echo $this->WebcilForm->input($options['name'], [
'options' => $options['options'],
'class' => 'form-group multiSelect',
'id' => $options['name'],
'label' => [
'text' => $options['label'],
'class' => 'col-md-4 control-label'
],
'required' => $options['obligatoire'],
'between' => '<div class="col-md-8">',
'after' => '</div>',
'multiple' => 'multiple',
'placeholder' => false
]);
break;
// Choix unique
case 'radios':
?>
......@@ -1257,6 +1275,11 @@ require_once dirname(__FILE__).DS.'model_extention.ctp';
$("div.form-group .error-message").closest("div.tab-pane").each(function(idx, pane) {
$( "a[href='#"+$(pane).attr('id')+"']" ).append("<span class='fa fa-exclamation-circle fa-danger' aria-hidden='true'><!----></span>");
});
$('.multiSelect').select2({
placeholder: "Sélectionnez une ou plusieurs options",
allowClear: true
});
});
function deleteFile(file, key){
......
......@@ -524,6 +524,21 @@
]);
break;
// Menu multi-select
case 'multi-select':
echo $this->WebcilForm->input($options['name'], [
'id' => $options['name'],
'name' => $options['name'],
'label' => [
'text' => $options['label']
],
'options' => $options['options'],
'required' => $options['obligatoire'],
'class' => 'form-group multiSelect',
'multiple' => 'multiple',
]);
break;
// Choix unique
case 'radios':
?>
......@@ -970,5 +985,10 @@ echo $this->WebcilForm->end();
$('#aOngletCoresponsable').attr('role', '');
$('#aOngletCoresponsable').attr('data-toggle', '');
}
$('.multiSelect').select2({
placeholder: "Sélectionnez une ou plusieurs options",
allowClear: true
});
});
</script>
......@@ -121,6 +121,12 @@
<?php echo __d ('formulaire','formulaire.btnDeroulant');?>
</button>
<!-- Bouton Menu multi-select-->
<button class="btn btn-default-default btn-sm btn-input" id="btn-multi-select">
<i class="fa fa-list-alt fa-lg fa-fw"><!----></i>
<?php echo __d ('formulaire','formulaire.btnMultiSelect');?>
</button>
<!-- Bouton Titre de catégorie -->
<button class="btn btn-default-default btn-sm btn-input" id="btn-title">
<i class="fa fa-tag fa-lg fa-fw"><!----></i>
......
......@@ -122,6 +122,12 @@
<?php echo __d ('formulaire','formulaire.btnDeroulant');?>
</button>
<!-- Bouton Menu multi-select-->
<button class="btn btn-default-default btn-sm btn-input" id="btn-multi-select">
<i class="fa fa-list-alt fa-lg fa-fw"><!----></i>
<?php echo __d ('formulaire','formulaire.btnMultiSelect');?>
</button>
<!-- Bouton Titre de catégorie -->
<button class="btn btn-default-default btn-sm btn-input" id="btn-title">
<i class="fa fa-tag fa-lg fa-fw"><!----></i>
......@@ -313,6 +319,26 @@
. '</div>';
break;
case 'multi-select' :
echo '<div class="draggable col-md-6 form-group multi-select ui-selected" style="top:' . $line . 'px; ' . $colonne . '" data="' . $champObligatoire . '">'
.'<div class="col-md-4">'
.'<label>'
.'<span class="labeler">' . $details['label'] . '</span>'
. ($details['obligatoire'] ? '<span class="obligatoire"> *</span>' : '')
.'</label>'
.'</div>'
.'<div class="col-md-8">'
.'<input type="hidden" name="multi-select" value="" id="multi-select_"/>'
.'<select id="' . $details['name'] . '" name="multi-select" class="form-control multiSelect contentMultiSelect" multiple="multiple">';
foreach ($details['options'] as $val) {
echo '<option name="' . $details['name'] . '" value="' . $val . '"> ' . $val . '</option>';
}
echo '</select>'
.'</div>'
.'</div>';
break;
// Label
case 'texte':
echo '<div class="draggable form-group col-md-6 texte" style="top:' . $line . 'px;' . $colonne . '">'
......@@ -982,4 +1008,13 @@
?>
</div>
</div>
</div>
\ No newline at end of file
</div>
<script type="text/javascript">
$(document).ready(function () {
$('.multiSelect').select2({
placeholder: "Sélectionnez une option",
allowClear: true
});
});
</script>
\ No newline at end of file
......@@ -220,6 +220,25 @@
. '</div>';
break;
case 'multi-select' :
echo '<div class="draggable col-md-6 form-group multi-select ui-selected" style="top:' . $line . 'px; ' . $colonne . '" data="' . $champObligatoire . '">'
.'<div class="col-md-4">'
.'<label>'
.'<span class="labeler">' . $details['label'] . '</span>'
. ($details['obligatoire'] ? '<span class="obligatoire"> *</span>' : '')
.'</label>'
.'</div>'
.'<div class="col-md-8">'
.'<input type="hidden" name="multi-select" value="" id="multi-select_"/>'
.'<select id="' . $details['name'] . '" name="multi-select" class="form-control multiSelect contentMultiSelect" multiple="multiple">';
foreach ($details['options'] as $val) {
echo '<option name="' . $details['name'] . '" value="' . $val . '"> ' . $val . '</option>';
}
echo '</select>'
.'</div>'
.'</div>';
break;
// Label
case 'texte':
echo '<div class="draggable form-group col-md-6 texte" style="top:' . $line . 'px;' . $colonne . '">'
......@@ -910,6 +929,11 @@
language: 'fr'
});
}
$('.multiSelect').select2({