Rev 3392 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
function WidgetApa() {
this.utils = new UtilsApa();
this.mode = null;
this.urlRacine = window.location.origin;
this.urlBaseAuth = null;
this.idUtilisateur = null;
this.infosUtilisateur = null;
}
WidgetApa.prototype.init = function() {
const lthis = this;
this.urlBaseAuth = this.urlRacine + '/service:annuaire:auth';
$( '#mdp' ).val('');
$( '#inscription' ).attr( 'href', this.urlSiteTb() + 'inscription' );
$( '#inscription' ).attr( 'href', this.urlSiteTb() + 'wp-login.php?action=lostpassword' );
this.chargerStatutSSO();
this.connexionDprodownMenu()
$( '#deconnexion a' ).click( function( event ) {
event.preventDefault();
lthis.deconnecterUtilisateur();
});
$( '#formulaire' ).on( 'click', '.saisir-plantes,.saisir-lichens', function() {
var nomSquelette = $( this ).data( 'load' );
$( '#charger-form' ).data( 'load', nomSquelette );
lthis.utils.chargerForm( nomSquelette, lthis );
$( '#bouton-list-releves' ).removeClass( 'hidden' );
$( '#table-releves' ).addClass( 'hidden' );
});
};
/**
* Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
* à droite de la barre en fonction
*/
WidgetApa.prototype.chargerStatutSSO = function() {
const lthis = this;
var urlAuth = this.urlBaseAuth + '/identite';
if( 'local' !== this.mode ) {
this.connexion( urlAuth, true );
$( '#connexion' ).click( function( event ) {
event.preventDefault();
if( $( '#utilisateur-connecte' ).hasClass( 'hidden' ) || !lthis.utils.valOk( $( '#nom-complet' ).text() ) ) {
var login = $( '#courriel' ).val(),
mdp = $( '#mdp' ).val();
if ( lthis.utils.valOk( login ) && lthis.utils.valOk( mdp ) ) {
urlAuth = lthis.urlBaseAuth + '/connexion?login=' + login + '&password=' + mdp;
lthis.connexion( urlAuth, true );
} else {
alert( lthis.utils.msgTraduction( 'non-connexion' ) );
}
}
});
} else {
urlAuth = this.urlRacine + '/widget:cel:modules/apa/test-token.json';
// $( '#connexion' ).click( function( event ) {
// event.preventDefault();
// lthis.connexion( urlAuth, true );
this.connexion( urlAuth, true );
// });
}
};
/**
* Déconnecte l'utilisateur du SSO
*/
WidgetApa.prototype.deconnecterUtilisateur = function() {
var urlAuth = this.urlBaseAuth + '/deconnexion';
if( 'local' === this.mode ) {
this.definirUtilisateur();
window.location.reload();
return;
}
this.connexion( urlAuth, false );
};
WidgetApa.prototype.connexion = function( urlAuth, connexionOnOff ) {
const lthis = this;
$.ajax({
url: urlAuth,
type: "GET",
dataType: 'json',
xhrFields: {
withCredentials: true
}
})
.done( function( data ) {
if( connexionOnOff ) {
// connecté
lthis.definirUtilisateur( data.token );
} else {
lthis.definirUtilisateur();
window.location.reload();
}
})
.fail( function( error ) {
// @TODO gérer l'affichage de l'erreur, mais pas facile à placer
// dans l'interface actuelle sans que ce soit moche
//afficherErreurServeur();
});
};
WidgetApa.prototype.definirUtilisateur = function( jeton ) {
const thisObj = this;
var nomComplet = '',
courriel = '',
pseudo = '',
prenom = '',
nom = '';
// affichage
if ( undefined !== jeton ) {
// décodage jeton
this.infosUtilisateur = this.decoderJeton( jeton );
// console.log(jetonDecode);
idUtilisateur = this.infosUtilisateur.id;
nomComplet = this.infosUtilisateur.intitule;
courriel = this.infosUtilisateur.sub;
pseudo = this.infosUtilisateur.pseudo;
prenom = this.infosUtilisateur.prenom;
nom = this.infosUtilisateur.nom;
$( '#courriel' ).attr( 'disabled', 'disabled' );
$( '#bloc-connexion' ).addClass( 'hidden' );
$( '#utilisateur-connecte, #anonyme' ).removeClass( 'hidden' );
}
$( '#id_utilisateur' ).val( idUtilisateur );
$( '#prenom' ).val( prenom );
$( '#nom' ).val( nom );
$( '#nom-complet' ).html( nomComplet );
$( '#courriel' ).val( courriel );
$( '#profil-utilisateur a' ).attr( 'href', this.urlSiteTb() + 'membres/' + pseudo.toLowerCase().replace( ' ', '-' ) );
if ( this.utils.valOk( idUtilisateur ) ) {
var nomSquelette = $( '#charger-form' ).data( 'load' ) || 'arbres';
this.utils.chargerForm( nomSquelette, thisObj );
}
};
/**
* Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
* JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
*/
WidgetApa.prototype.decoderJeton = function( jeton ) {
var parts = jeton.split( '.' ),
payload = parts[1];
payload = this.b64d( payload );
payload = JSON.parse( payload, true );
return payload;
};
/**
* Décodage "url-safe" des chaînes base64 retournées par le SSO (lib jwt)
*/
WidgetApa.prototype.b64d = function( input ) {
var remainder = input.length % 4;
if ( 0 !== remainder ) {
var padlen = 4 - remainder;
for ( var i = 0; i < padlen; i++ ) {
input += '=';
}
}
input = input.replace( '-', '+' );
input = input.replace( '_', '/' );
return atob( input );
};
WidgetApa.prototype.urlSiteTb = function() {
var urlPart = ( 'test' === this.mode ) ? '/test/' : '/';
return this.urlRacine + urlPart;
};
// Volet de profil/déconnexion
WidgetApa.prototype.connexionDprodownMenu = function() {
$( '#utilisateur-connecte .volet-toggle, #profil-utilisateur a, #deconnexion a' ).click( function( event ) {
if( $( this ).hasClass( 'volet-toggle' ) ) {
event.preventDefault();
}
$( '#utilisateur-connecte .volet-menu' ).toggleClass( 'hidden' );
});
}
// Préchargement des infos-obs ************************************************/
/**
* Callback dans le chargement du formulaire dans #charger-form
*/
WidgetApa.prototype.chargerSquelette = function( squelette , nomSquelette ) {
// à compléter plus tard si nécessaire, pour le moment on charge "arbres"
switch( nomSquelette ) {
case 'plantes' :
case 'lichens' :
this.utils.chargerFormPlantesOuLichens( squelette, nomSquelette );
break;
case 'arbres' :
default :
this.chargerObsUtilisateur( squelette );
break;
}
};
/**
* Infos des obs arbres de cet utilisateur
*/
WidgetApa.prototype.chargerObsUtilisateur = function( formReleve ) {
const lthis = this;
const urlObs = $( 'body' ).data( 'obs-list' ) + '/' + this.infosUtilisateur.id;
$( '#bouton-nouveau-releve' ).removeClass( 'hidden' );
$.ajax({
url: urlObs,
type: 'GET',
success: function( dataObs, textStatus, jqXHR ) {
if ( !lthis.utils.valOk( dataObs ) ) {
dataObs = '';
}
lthis.preformaterDonneesObs( dataObs );
},
error: function( jqXHR, textStatus, errorThrown ) {
alert( lthis.utils.msgTraduction( 'erreur-chargement-obs-utilisateur' ) );
}
})
.always( function() {
$( '#charger-form' ).html( formReleve );
});
};
/**
* Préformater les données des obs d'un utilisateur
*/
WidgetApa.prototype.preformaterDonneesObs = function( dataObs ) {
const lthis = this;
if ( this.utils.valOk( dataObs ) ) {
var apaObs = [],
datRuComun = [],
obsArbres = [],
apaObsE = {},
count = 0;
$.each( dataObs, function( i, obs ) {
if( /WidgetSaisie,apa/.test( obs.mots_cles_texte ) && !/(:?plantes|lichens)/.test( obs.mots_cles_texte ) ) {
if ( lthis.utils.valOk( obs.obs_etendue ) ) {
$.each( obs.obs_etendue, function( indice, obsE ) {
apaObsE[obsE.cle] = obsE.valeur;
});
}
obs.date_observation = $.trim( obs.date_observation.replace( /[0-9]{2}:[0-9]{2}:[0-9]{2}$/, '') );
if ( -1 === datRuComun.indexOf( obs.date_observation + apaObsE.rue + obs.zone_geo ) ) {
datRuComun.push( obs.date_observation + apaObsE.rue + obs.zone_geo );
apaObs[count] = lthis.utils.formaterReleveData( { 'obs':obs, 'obsE':apaObsE } );
count++;
}
obsArbres.push( lthis.utils.formaterArbreData( { 'obs':obs, 'obsE':apaObsE } ) );
apaObsE = [];
}
});
// on insert les arbres dans les relevés en fonction de la date et la rue d'observation
// car les arbres pour un relevé (date/rue) n'ont pas forcément été enregistrés dans l'ordre ni le même jour
$.each( obsArbres, function( indexArbre, arbre ) {
for ( var indexReleve = 0; indexReleve < datRuComun.length; indexReleve++ ) {
if ( arbre.date_rue_commune === datRuComun[indexReleve] ) {
apaObs[indexReleve].push( arbre );
}
}
});
if ( this.utils.valOk( apaObs ) ) {
this.prechargerLesObs( apaObs );
$( '#apa-obs' ).val( JSON.stringify( apaObs ) );
$( '#bouton-list-releves' ).removeClass( 'hidden' );
}
$( '#dates-rues-communes' ).val( JSON.stringify( datRuComun ) );
}
};
WidgetApa.prototype.prechargerLesObs = function( apaObs ) {
const lthis = this;
const $listReleve = $( '#list-releves' );
const TEXT_ARBRE = ' ' + this.utils.msgTraduction( 'arbre' ).toLowerCase();
var nbArbres = '',
texteArbre = '';
var releveHtml = '';
$( '#bouton-list-releves' )
.removeClass( 'hidden' )
.click( function() {
$( '#table-releves' ).removeClass( 'hidden' );
$( this ).addClass( 'hidden' );
});
$.each( apaObs, function( i, releve ) {
nbArbres = releve.length - 1;
texteArbre = ( 1 < nbArbres ) ? ( TEXT_ARBRE + 's' ) : TEXT_ARBRE;
releveHtml +=
'<tr class="table-light text-center">'+
'<td>' +
'<p>'+
lthis.utils.fournirDate( releve[0].date ) +
'</p><p>'+
releve[0].rue + ', ' + releve[0]['commune-nom'] +
'</p><p>'+
'(' + nbArbres + texteArbre + ')' +
'</p>'+
'</td>'+
'<td class="d-flex flex-column">' +
'<div class="charger-releve btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="arbres">'+
'<i class="fas fa-clone"></i> ' + lthis.utils.msgTraduction( 'dupliquer' )+
'</div> '+
'<div class="saisir-plantes btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="plantes">'+
'<i class="fas fa-seedling"></i> ' + lthis.utils.msgTraduction( 'saisir-plantes' )+
'</div> '+
'<div class="saisir-lichens btn btn-sm btn-info" data-releve="' + i + '" data-load="lichens">'+
// '<i class="fas fa-certificate"></i> ' + lthis.utils.msgTraduction( 'saisir-lichens' )+
'<i class="far fa-snowflake"></i> ' + lthis.utils.msgTraduction( 'saisir-lichens' )+
'</div> '+
'</td>'+
'</tr>';
});
$listReleve.append( releveHtml );
$( '#nb-releves-bienvenue' )
.removeClass( 'hidden' )
.find( 'span.nb-releves' )
.text( apaObs.length );
};