Subversion Repositories Sites.obs-saisons.fr

Compare Revisions

Regard whitespace Rev 319 → Rev 320

/trunk/applications/saisie/bibliotheque/dao/ObservationDao.php
51,10 → 51,6
$json = $this->envoyerRequeteAjout($url, $donnees);
$donnees = json_decode($json, true);
if (true) {
//TODO: verifier ajout
}
return true;
}
66,13 → 62,11
if (is_numeric($id_individu)) {
$url = $this->url_jrest.self::SERVICE_OBSERVATION."/$id_individu/";
$json = $this->envoyerRequeteModif($url, $donnees);
 
$donnees = json_decode($json, true);
if (true) {
//TODO: verifier modification
}
}
return true;
return $donnees;
}
}
?>
?>
/trunk/applications/saisie/squelettes/css/saisie.css
221,7 → 221,7
}
 
#saisie_modif_evenements tr, #saisie_liste_evenements tr {
height: 40px;
/*height: 40px;*/
}
 
.icone_s {
354,10 → 354,61
color: black;
}
 
.ajouter_observation .date_observation {
background: url("../images/ajout.png") no-repeat center center transparent;
width: 20px;
}
 
.conteneur_supprimer_observation {
position: absolute;
right: 0px;
top: 0px;
width: 20px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
 
.supprimer_observation {
background: url("../images/suppression.png") no-repeat center center transparent;
width: 20px;
display: none;
}
 
.date_observation_individu:not(.ajouter_observation):hover .supprimer_observation {
display: block;
}
 
.conteneur_date_observation {
padding: 0;
position: relative;
vertical-align: top;
}
 
.date_observation_individu {
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
flex: 1;
padding-top: 5px;
padding-bottom: 5px;
position: relative;
}
 
.date_observation_individu .ui-datepicker {
position: absolute;
top: 100%;
left: 0%;
z-index: 1;
}
 
.icone:hover {
filter: grayscale(100%);
}
 
.calendrier {
}
535,6 → 586,8
height: 32px; /*--Set height of tabs--*/
border-bottom: 1px solid #999;
border-left: 1px solid #999;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
}
 
#saisie_espece ul.liste_onglets li {
587,7 → 640,10
float: left;
background: #fff;
position: relative;
width:565px;
width: 100%;
display: flex;
justify-content: center;
margin-left: 10px;
}
 
#saisie_espece .contenu_onglet {
/trunk/applications/saisie/squelettes/js/saisie.js
100,215 → 100,249
htmlEnCours = '';
elementEnCours = null;
ancienneValeurEnCours = null;
id_formulaire = null;
 
function initialiserLignesCliquables() {
$('.conteneur_element_modifier').hide();
$(".date_observation_individu").each(function() {
$(".date_observation_individu").live("click", function(e) {
e.preventDefault();
$(this).bind('click', function() {
if($(e.target).hasClass('conteneur_supprimer_observation') || $(e.target).hasClass('supprimer_observation')) {
return;
}
$('.element_clique').removeClass('element_clique');
if($(this).hasClass('element_clique')) {
fermerDatePicker();
return false;
} else {
conteneur_obs = $(this).children('span');
id_formulaire = conteneur_obs.attr('id');
remplacerElementDateParFormulaireAjax(id_formulaire, $(this));
$(this).addClass('element_clique');
afficherSaisieObservation($(this));
return false;
}
});
 
$(".date_observation_individu .conteneur_supprimer_observation").live("click", function(e) {
e.preventDefault();
if(window.confirm('Êtes-vous sûr de vouloir supprimer cette observation ?')) {
// les obs ne sont jamais vraiment supprimées
// mais seulement remplacées par des dates au format 00/00/yyyy
envoyerRequeteAjaxSaisieObservation('', $(this).parent('.date_observation_individu'));
}
});
 
// pour fermer le datepicker sur esc
$(document).keyup(function(e) {
if (e.keyCode === 27) {
$('.element_clique').removeClass('element_clique');
fermerDatePicker(); // esc
}
});
}
 
function initialiserCalendrierFormulaire() {
function afficherSaisieObservation($obs) {
dateMin = getDateMinCalendrier();
dateMax = getDateMaxCalendrier();
fermerDatePicker();
$(".calendrier").each(function() {
$(this).find("input").datepicker({
var dateMin = getDateMinCalendrier();
var dateMax = getDateMaxCalendrier();
 
var dateCouranteStr = $obs.data('date-observation');
var dateCourante = new Date();
if(!!dateCouranteStr && dateCouranteStr != '' && dateCouranteStr != '+') {
var jour = parseInt(dateCouranteStr.substring(0,2));
var mois = parseInt(dateCouranteStr.substring(3,5));
var annee = parseInt(dateCouranteStr.substring(6,10));
dateCourante = new Date(annee, mois-1, jour);
}
 
$obs.find('.datepicker_container').datepicker({
disabled: true,
constrainInput: true,
altFormat: 'dd/mm/yyyy',
minDate: dateMin,
maxDate: dateMax
});
});
maxDate: dateMax,
changeMonth: true,
defaultDate: dateCourante,
onSelect: function(dateText, inst) {
validerSaisieObservation(dateText, $obs)
},
beforeShowDay: function(date) {
var dates_a_exclure = getDatesSaisiesPourStadeEtIndividu($obs.data('id-individu'), $obs.data('id-stade-observation'));
var string = jQuery.datepicker.formatDate('dd/mm/yy', date);
return [dates_a_exclure.indexOf(string) == -1]
}
 
$(document).ready(function() {
initialiserCalendrierFormulaire();
 
});
 
function estUneDateValide(peutEtreUneDate) {
var reg= new RegExp("^[0-3][0-9][/]{1}[0-1][0-2][/]{1}[0-9]{4}$","g");
return reg.test(peutEtreUneDate);
$obs.datepicker("show");
$('.ui-datepicker').attr("title", "Appuyez sur échap pour annuler l'édition");
}
 
function getAnneeEnCoursDeConsultation() {
function validerSaisieObservation(dateStr, $obs) {
anneeEnCours = jQuery.trim($("#annee_en_cours").html());
if(typeof(anneeEnCours)=='undefined'){
dateCourante = new Date();
anneeEnCours = dateCourante.getFullYear();
if(estUneDateValide(dateStr)) {
envoyerRequeteAjaxSaisieObservation(dateStr, $obs);
}
return anneeEnCours;
}
 
function getDateMinCalendrier() {
anneeEnCours = getAnneeEnCoursDeConsultation();
dateMin = '01/01/'+anneeEnCours;
function formaterDonneesObservationPourEnvoi(dateStr, $obs) {
return dateMin;
if(dateStr == null ) {
return false ;
}
 
function getDateMaxCalendrier() {
var anneeEnCours = getAnneeEnCoursDeConsultation();
if(jQuery.trim(dateStr) == '') {
dateStr = '00/00/'+anneeEnCours;
}
anneeEnCours = getAnneeEnCoursDeConsultation();
donnees_obs = {
"id_individu": $obs.data('id-individu'),
"id_evenement": $obs.data('id-stade-observation'),
"date_evenement": dateStr,
"annee_en_cours": anneeEnCours
};
dateMax = '31/12/'+anneeEnCours;
dateCourante = new Date();
if(anneeEnCours == dateCourante.getFullYear()) {
dateMax = dateCourante.getDate()+'/'+(dateCourante.getMonth()+ 1)+'/'+anneeEnCours;
if(!!$obs.data('id-observation')) {
donnees_obs.id_observation = $obs.data('id-observation');
}
return dateMax;
return donnees_obs;
}
 
/** Fonctions de manipulation des éléments du tableau pour les transformer en élements cliquables et calendriers **/
function initialiserMiniCalendrierFormulaire(id_element) {
dateMin = getDateMinCalendrier();
dateMax = getDateMaxCalendrier();
/** Fonctions d'envoi et de récupération des élements du formulaire ajax **/
function envoyerRequeteAjaxSaisieObservation(dateStr, $obs) {
$('#'+id_element)
.datepicker({
disabled: true,
constrainInput: true,
altFormat: 'dd/mm/yyyy',
minDate: dateMin,
maxDate: dateMax,
onSelect: function(dateText, inst) {
$('#'+id_element).val(dateText);
donnees_obs = collecterDonneesMiniFormulaire(id_formulaire);
envoyerRequeteAjaxValidationMiniFormulaire(donnees_obs, id_formulaire);
},
onClose: function(dateText, inst) {
gererFermetureMiniCalendrier(dateText,id_formulaire);
}
});
var est_obs_existante = !!$obs.data('id-observation');
var donnees_obs = formaterDonneesObservationPourEnvoi(dateStr, $obs);
 
$('#'+id_element).datepicker( "show" );
url_page_courante = document.URL;
url_page_courante = url_page_courante.replace('module=Individu','module=Observation');
url_page_courante = url_page_courante.replace('action=afficherListeIndividu','action=validerFormulaireModificationObservationAjax');
url_ajax = url_page_courante.replace('action=validerFormulaireSaisieIndividu','action=validerFormulaireModificationObservationAjax');
 
$conteneurAjout = null;
if(!est_obs_existante) {
var id_conteneur_ajout = 'ajouter_observation_individu_'+donnees_obs['id_individu']+'_evenement_'+donnees_obs['id_evenement'];
var $conteneurAjout = $('#'+id_conteneur_ajout).clone();
}
 
function gererFermetureMiniCalendrier(dateText, id_formulaire) {
var donnees_obs = formaterDonneesObservationPourEnvoi(dateStr, $obs);
$.post(url_ajax, donnees_obs, function(obj_retour) {
ancienne_valeur_date = jQuery.trim(ancienneValeurEnCours);
nouvelle_valeur_date = jQuery.trim(dateText);
if(nouvelle_valeur_date == '' && ancienne_valeur_date != '-' && ancienne_valeur_date != nouvelle_valeur_date) {
if(window.confirm("Voulez vous supprimer cette observation ?")) {
$('#'+id_formulaire).val(nouvelle_valeur_date);
donnees_obs = collecterDonneesMiniFormulaire(id_formulaire);
envoyerRequeteAjaxValidationMiniFormulaire(donnees_obs, id_formulaire);
} else {
$('#'+id_formulaire).val(ancienne_valeur_date);
remplacerMiniFormulaireParElementDate(id_formulaire);
if(obj_retour.data.erreurs) {
var message = 'Une ou plusieurs erreurs se sont produites : '+"\n";
for (var key in obj_retour.data.erreurs) {
if (obj_retour.data.erreurs.hasOwnProperty(key))
message += '- '+obj_retour.data.erreurs[key]+"\n";
}
window.alert(message);
return;
}
}
 
function remplacerElementDateParFormulaireAjax(id_element, conteneur_selectionne) {
if(obj_retour.reponse === 'OK') {
if(elementEnCours != null) {
elementEnCours.removeClass('element_clique');
elementEnCours.html(htmlEnCours);
ancienneValeurEnCours = null;
// les obs ne sont jamais vraiment supprimées
// mais seulement remplacées par des dates au format 00/00/yyyy
if(estUneDateSuppressionObs(dateStr)) {
$obs.remove();
delete $obs;
return;
}
ancienneValeurEnCours = conteneur_selectionne.children('span').html()
elementEnCours = conteneur_selectionne;
htmlEnCours = conteneur_selectionne.html();
$obs.find('.date_observation').text(dateStr);
$obs.data('date-observation', dateStr);
conteneur_obs = $('#'+id_element);
valeur_date = conteneur_obs.html();
valeur_date = valeur_date.replace('-','');
if(!est_obs_existante) {
$obs.removeClass('ajouter_observation');
$obs.attr('title', 'Cliquez pour modifier la date de cette observation')
$obs.data('id-observation', obj_retour.data.id_observation);
conteneur_selectionne.addClass('element_clique');
conteneur_selectionne.html('<span class="calendrier"><input type="text" value="'+jQuery.trim(valeur_date)+'" class="calendrier" id="'+id_formulaire+'" size="7" maxlenght="10" /></div>');
initialiserMiniCalendrierFormulaire(id_formulaire);
var id_conteneur_observation = 'individu_'+donnees_obs['id_individu']+'_evenement_'+donnees_obs['id_evenement']+'_observation_'+obj_retour.data.id_observation;
$obs.attr('id', id_conteneur_observation);
$obs.after($conteneurAjout);
}
 
function remplacerMiniFormulaireParElementDate(id_element) {
$('.element_clique').removeClass('element_clique');
fermerDatePicker();
}
});
}
valeur_date_pour_stade = $('#'+id_element).val();
function estUneDateSuppressionObs(dateStr) {
var date_vide_pattern = /^00\/00\/\d{4}$/;
return dateStr == '' || date_vide_pattern.test(dateStr);
}
if(jQuery.trim(valeur_date_pour_stade) == '') {
valeur_date_pour_stade = '-';
function fermerDatePicker() {
if($(".hasDatepicker").length == 0) {
return;
}
elementEnCours.html('<span id="'+id_element+'">'+valeur_date_pour_stade+' </span>');
elementEnCours.removeClass('element_clique');
elementEnCours = null;
ancienneValeurEnCours = null;
$(".hasDatepicker").each(function() {
$(this).datepicker("destroy");
$(this).removeClass(".hasDatepicker").removeAttr('id');
});
}
 
function obtenirAttributsData(el) {
return [].filter.call(el.attributes, function(at) { return /^data-/.test(at.name); });
}
 
// vérifie qu'une date est au format d/m/y
// merci stacky https://stackoverflow.com/questions/5812220/how-to-validate-a-date
function estUneDateValide(s) {
var bits = s.split('/');
var d = new Date(bits[2], bits[1] - 1, bits[0]);
return d && (d.getMonth() + 1) == bits[1];
}
 
/** Fonctions d'envoi et de récupération des élements du formulaire ajax **/
function envoyerRequeteAjaxValidationMiniFormulaire(donnees_obs, id_formulaire) {
function getDatesSaisiesPourStadeEtIndividu(id_individu, id_stade) {
var selecteur_data = '[data-id-individu="'+id_individu+'"]'+
'[data-id-stade-observation="'+id_stade+'"]';
url_page_courante = document.URL;
url_page_courante = url_page_courante.replace('module=Individu','module=Observation');
url_page_courante = url_page_courante.replace('action=afficherListeIndividu','action=validerFormulaireModificationObservationAjax');
url_ajax = url_page_courante.replace('action=validerFormulaireSaisieIndividu','action=validerFormulaireModificationObservationAjax');
$.post(url_ajax, donnees_obs, function(obj_retour) {
if(obj_retour.reponse === 'OK') {
remplacerMiniFormulaireParElementDate(id_formulaire);
return $('.date_observation_individu'+selecteur_data).map(function() {
return $(this).data("date-observation");
}).get();
}
});
}
 
function collecterDonneesMiniFormulaire(id_formulaire) {
function getAnneeEnCoursDeConsultation() {
valeur_date_pour_stade = $('#'+id_formulaire).val();
anneeEnCours = jQuery.trim($("#annee_en_cours").html());
if(valeur_date_pour_stade == null ) {
return false ;
if(typeof(anneeEnCours)=='undefined'){
dateCourante = new Date();
anneeEnCours = dateCourante.getFullYear();
}
if(jQuery.trim(valeur_date_pour_stade) == '') {
valeur_date_pour_stade = '00/00/'+anneeEnCours;
return anneeEnCours;
}
id_individu_stade_obs = id_formulaire.split('_');
function getDateMinCalendrier() {
anneeEnCours = getAnneeEnCoursDeConsultation();
dateMin = '01/01/'+anneeEnCours;
stade_obs = 'observation_'+id_individu_stade_obs[3];
date_annee_en_cours = jQuery.trim($("#annee_en_cours").html());
return dateMin;
}
donnees_obs = { "id_individu": id_individu_stade_obs[1],
"annee_en_cours": date_annee_en_cours
};
function getDateMaxCalendrier() {
identifiant_observation = 'observation_'+id_individu_stade_obs[3];
anneeEnCours = getAnneeEnCoursDeConsultation();
donnees_obs[identifiant_observation] = valeur_date_pour_stade;
dateMax = '31/12/'+anneeEnCours;
return donnees_obs;
dateCourante = new Date();
 
if(anneeEnCours == dateCourante.getFullYear()) {
dateMax = dateCourante.getDate()+'/'+(dateCourante.getMonth()+ 1)+'/'+anneeEnCours;
}
 
return dateMax;
}
 
$('#saisie_liste_evenements').ready(function() {
initialiserLignesCliquables();
/trunk/applications/saisie/squelettes/fiches/individu_fiche.tpl.html
26,9 → 26,9
<div class="pliage stade_<?= aControleur::formaterChaineVersClasseCss($stade);?>">
<h4><?= $stade ?></h4>
<ul>
<?php foreach($observation as $num_stade => $date) : ?>
<?php foreach($observation as $num_stade => $dates) : ?>
<li>
<?= ' stade '.$num_stade.' : '.$date ?>
<?= ' stade '.$num_stade.' : '.implode(', ', $dates) ?>
</li>
<?php endforeach; ?>
</ul>
/trunk/applications/saisie/squelettes/listes/evenement_liste.tpl.html
3,7 → 3,7
<h2> Observations pour l'année <?= $annee ?> </h2>
<p class="cadre_information">Pour ajouter ou modifier une observation, cliquez sur la case correspondante et sélectionnez une date dans le calendrier,
pour la supprimer, effacez la date, cliquez en dehors de la case et confirmez.
(vous pouvez annuler l'édition en appuyant sur la touche échap). Pour la supprimer cliquez sur la croix à droite de la date.
</p>
 
<ul class="liste_annees_observations">
40,7 → 40,6
<?php endforeach; ?>
</tr>
 
<?php foreach ($individus as $individu) : ?>
<tr class="liste_observations_individu" id="observations_individu_<?= $individu['id_individu'] ?>">
<td class="information_individu">
50,14 → 49,33
</td>
<?php foreach($evenements as $nom_evenement => $evenement) : ?>
<?php foreach($evenement['stades'] as $id_stade => $stade) : ?>
<td class="date_observation_individu element_cliquable" title="Cliquez sur la cellule pour modifier la date de cette observation">
<span id="individu_<?=$individu['id_individu']?>_evenement_<?=$id_stade?>">
<?php if (isset($individu['observations'][$annee][$nom_evenement][$stade])) { ?>
<?= $individu['observations'][$annee][$nom_evenement][$stade]; ?>
<?php } else { ?>
-
<td class="conteneur_date_observation" title="Cliquez pour modifier la date de cette observation">
<?php if (!empty($individu['observations'][$annee][$nom_evenement][$stade])) { ?>
<?php foreach($individu['observations'][$annee][$nom_evenement][$stade] as $id_observation => $date_observation) : ?>
<div class="date_observation_individu element_cliquable"
data-id-stade-observation="<?=$id_stade?>"
data-id-observation="<?=$id_observation?>"
data-id-individu="<?=$individu['id_individu']?>"
data-date-observation="<?=$date_observation?>"
id="individu_<?=$individu['id_individu']?>_evenement_<?=$id_stade?>_observation_<?=$id_observation?>">
<span class="date_observation"><?= $date_observation ?></span>
<span class="datepicker_container"></span>
<div class="conteneur_supprimer_observation">
<span title="Cliquez pour supprimer cette observation" class="icone supprimer_observation">&nbsp;</span>
</div>
</div>
<?php endforeach; ?>
<?php } ?>
</span>
<div class="ajouter_observation date_observation_individu element_cliquable"
data-id-stade-observation="<?=$id_stade?>"
data-id-individu="<?=$individu['id_individu']?>"
title="Cliquez pour ajouter une nouvelle observation de ce stade"
id="ajouter_observation_individu_<?=$individu['id_individu']?>_evenement_<?=$id_stade?>">
<span class="icone date_observation">&nbsp;</span>
<span class="datepicker_container"></span>
<div class="conteneur_supprimer_observation">
<span title="Cliquez pour supprimer cette observation" class="icone supprimer_observation">&nbsp;</span>
</div>
</td>
<?php endforeach; ?>
<?php endforeach; ?>
/trunk/applications/saisie/controleurs/Observation.php
119,9 → 119,9
$valeurs_verifiees = $this->collecterValeursFormulaireModificationObservation();
$observation_dao = new ObservationDao();
$observation_dao->modifierObservation($valeurs_verifiees['id_individu'],$valeurs_verifiees);
$data = $observation_dao->modifierObservation($valeurs_verifiees['id_individu'],$valeurs_verifiees);
$retour = array('reponse' => 'OK');
$retour = array('reponse' => 'OK', 'data' => $data);
 
header('Content-type: text/json');
echo json_encode($retour);
132,35 → 132,19
$valeurs_verifiees = array();
foreach($_POST as $nom_champ => $valeur) {
$id_si_est_champ_observation = $this->renvoyerIdEvenementSiChampDeFormulaireObservation($nom_champ);
if($id_si_est_champ_observation && trim($valeur) != '') {
$valeurs_verifiees[$nom_champ] = $valeur;
}
}
$valeurs_verifiees['id_individu'] = $_POST['id_individu'];
$valeurs_verifiees['annee_en_cours'] = $_POST['annee_en_cours'];
//TODO: verifier valeurs plus complètement
$valeurs_verifiees['id_evenement'] = $_POST['id_evenement'];
$valeurs_verifiees['date_evenement'] = $_POST['date_evenement'];
return $valeurs_verifiees;
if(!empty($_POST['id_observation'])) {
$valeurs_verifiees['id_observation'] = $_POST['id_observation'];
}
private function renvoyerIdEvenementSiChampDeFormulaireObservation($champ) {
$tab_champ = explode('observation_',$champ);
if(count($tab_champ) > 1 && is_numeric($tab_champ[1])) {
return $tab_champ[1];
return $valeurs_verifiees;
}
return false;
}
// +---------------------------------------------------------------------------------------------------------------+
// METHODES DE RECHERCHE DE DONNEES
public function getListeObservationsPourIndividu($id_individu, $annee = null) {