Rev 3217 | Blame | Last modification | View Log | RSS feed
// configuration// prod :/*var urlRacine = 'https://www.tela-botanica.org',config = {prod: {urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'}};*/// beta (test) :var urlRacine = 'https://beta.tela-botanica.org',config = {test: {urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',urlBaseAuth : 'https://beta.tela-botanica.org/service:annuaire:auth'}};// dev (localhost):/*var urlRacine = 'http://localhost',config = {local: {urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',urlBaseAuth : 'https://api.tela-botanica.test/service:annuaire:auth'}};*//*** Charge la barre de navigation depuis le widget:reseau:navigation dans un <div id="tb-navigation"> , s'il existe* dans la page appelante.** Nécessite jQuery** Utilisation :* - prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.* - si ce <div> contient déjà quelque chose, son contenu sera reporté à la place de la zone ayant l'id "contenu-source"* de la barre de navigation (si une telle zone existe)* - si ce <div> contient un attribut "data-courant" et si la valeur de cet attribut correspond à l'id d'un des éléments* de navigation, alors cet élément aura la classe "active" (pour localiser la page courante dans les menus)* - si ce <div> contient un attribut "data-squelette", alors le widget de navigation sera appelé avec le paramètre* "?squelette=contenu-de-data-squelette"; se reporter à la documentation du widget:reseau:navigation*/$( document ).ready( function() {var $div = $( '#tb-navigation' );if ( $div ) {var squelette = $div.data( 'squelette' ),courant = $div.data( 'courant' ),mode = $div.data( 'mode' ) || 'prod',contenu = $div.html();// chargement de la barrevar urlBaseAuth = config[mode]['urlBaseAuth'];var urlBarreNavigation = config[mode]['urlWidgetNavigation'];urlBarreNavigation += ( squelette ) ? '?squelette=' + squelette : '';$.ajax({url: urlBarreNavigation,type: 'get',success: function( data ) {// remplacement de la zone contenu-sourcevar $zoneSource = $div.find( '#contenu-source' );if ( $zoneSource ) {$zoneSource.replaceWith( contenu );// Chargement des informations de connexion SSOchargerStatutSSO( urlBaseAuth );}},error: function() {$div.html( 'Erreur: impossible de charger la barre de navigation' );}});$( '#deconnexion a' ).click( function() {deconnecterUtilisateur( urlBaseAuth );});}});/*** Modifie les liens des boutons de connexion / déconnexion SSO pour prendre ne compte* l'adresse exacte de la page d'origine (si on fait ça en PHP, on obtient l'URL du* widget de barre de navigation et pas de la page appelante)*/function definirPageOrigineDansLiens() {var page = window.location.href;$( '#bouton-connexion a' ).attr( 'href', $( '#bouton-connexion a' ).attr( 'href' ) + page );$( '#deconnexion a' ).attr( 'href', $( '#deconnexion a' ).attr( 'href' ) + page );}/*** Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu* à droite de la barre en fonction*/function chargerStatutSSO( urlBaseAuth ) {var urlAuth = urlBaseAuth + '/identite';if( 'local' !== $( '#tb-navigation' ).data( 'mode' ) ) {connexion( urlAuth, true );} else {urlAuth ='http://localhost/widget:cel:modules/saisie2/test-token.json';$( '#connexion' ).click( function() {connexion( urlAuth, true );return false;});}}/*** Déconnecte l'utilisateur du SSO*/function deconnecterUtilisateur( urlBaseAuth ) {if( 'local' === $( '#tb-navigation' ).data( 'mode' ) ) {definirUtilisateur( undefined );window.location.reload();return;}var urlAuth = urlBaseAuth + '/deconnexion';connexion( urlAuth, false );}function connexion( urlAuth, connexionOnOff ) {$.ajax({url: urlAuth,type: "GET",dataType: 'json',xhrFields: {withCredentials: true}}).done( function( data ) {// connectédefinirUtilisateur( data.token );if( !connexionOnOff ) {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();console.log( error );});}function definirUtilisateur( jeton ) {var idUtilisateur = '',nomComplet = '',courriel = '',prenom = '',nom = '';// affichageif ( undefined !== jeton ) {// décodage jetonvar jetonDecode = decoderJeton( jeton );// console.log(jetonDecode);idUtilisateur = jetonDecode.id;nomComplet = jetonDecode.intitule;courriel = jetonDecode.sub;prenom = jetonDecode.prenom;nom = jetonDecode.nom;$( '#courriel, #courriel_confirmation' ).attr( 'disabled', 'disabled' );$( '#prenom' ).attr( 'disabled', 'disabled' );$( '#nom' ).attr( 'disabled', 'disabled' );$( '#bouton-connexion, #creation-compte' ).addClass( 'hidden' );$( '#utilisateur-connecte, #anonyme, #zone-courriel-confirmation, #zone-prenom-nom' ).removeClass( 'hidden' );$( '#date-releve' ).focus();}$( '.warning' ).remove();$( '#nom-complet' ).html( nomComplet );$( '#courriel, #courriel_confirmation' ).val( courriel );$( '#id_utilisateur' ).val( idUtilisateur );$( '#prenom' ).val( prenom );$( '#nom' ).val( nom );}/*** 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*/function decoderJeton( jeton ) {parts = jeton.split( '.' );payload = parts[1];payload = b64d( payload );payload = JSON.parse( payload, true );return payload;}/*** Décodage "url-safe" des chaînes base64 retournées par le SSO (lib jwt)*/function b64d( 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 );}