Subversion Repositories eFlore/Applications.cel

Rev

Rev 3204 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

// configuration
var urlRacine = 'https://www.tela-botanica.org',
  config = {
    prod: {
      urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
      urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
    },
    test: {
      urlWidgetNavigation : urlRacine + '/widget-test:cel:saisie2',
      urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire-test:auth'
    },
    local: {
      urlWidgetNavigation : 'https://localhost/widget:cel:saisie2',
      urlBaseAuth : 'https://localhost/service:annuaire:auth'
    }
  }
// // Prod: décommenter ci-dessus et commenter ou supprimer ci-dessous
// var urlRacine = 'http://localhost',
//   config = {
//     prod: {
//       urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
//       urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
//     },
//     test: {
//       urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
//       urlBaseAuth : 'https://api.tela-botanica.test/service:annuaire:auth'
//     },
//     local: {
//       urlWidgetNavigation : 'https://localhost/widget:cel:saisie2',
//       urlBaseAuth : 'https://localhost/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 barre
    var urlBarreNavigation = config[mode]['urlWidgetNavigation'];

    if ( squelette ) {
      urlBarreNavigation += '?squelette=' + squelette;
    }

    htmlBarre = $.ajax({
      url: urlBarreNavigation,
      type: 'get',
      success: function( data ) {
        // remplacement de la zone contenu-source
        var $zoneSource = $div.find( '#contenu-source' );
        if ( $zoneSource ) {
          $zoneSource.replaceWith( contenu );
          // Chargement des informations de connexion SSO
          var urlBaseAuth = config[mode]['urlBaseAuth'];
          chargerStatutSSO( urlBaseAuth );
        }
      },
      error: function() {
        $div.html( 'Erreur: impossible de charger la barre de navigation' );
      }
    });
  }
});

/**
 * 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';
  // definirUtilisateur( 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvd3d3LnRlbGEtYm90YW5pY2Eub3JnIiwidG9rZW5faWQiOiJ0Yl9hdXRoIiwic3ViIjoiaWRpckB0ZWxhLWJvdGFuaWNhLm9yZyIsImlhdCI6MTU0Mjk3MjIxNiwiZXhwIjoxNTQyOTg0NDQ1LCJzY29wZXMiOlsidGVsYS1ib3RhbmljYS5vcmciXSwiaWQiOiI0NDA4NCIsInByZW5vbSI6IklkaXIiLCJub20iOiJBbGxpY2hlIiwicHNldWRvIjoiSWRpciBBbGxpY2hlIiwicHNldWRvVXRpbGlzZSI6dHJ1ZSwiaW50aXR1bGUiOiJJZGlyIEFsbGljaGUiLCJhdmF0YXIiOiJcL1wvd3d3LmdyYXZhdGFyLmNvbVwvYXZhdGFyXC83ODU3ZmY2MWE5Yjk5NWE4NjIyMzdkMmEyYzYxODAyMT9zPTUwJnI9ZyZkPW1tIiwiZ3JvdXBlcyI6W10sInBlcm1pc3Npb25zIjpbImVkaXRvciJdLCJub21XaWtpIjoiSWRpckFsbGljaGUiLCJkYXRlRGVybmllcmVNb2RpZiI6MTQ5NTIwNjM3Nn0.D3rySwuCDsSl6JAmjncwgwg4gUJijZjeaYeDYHsw3uI' );
  // Prod: décommenter $.ajax ci-dessous et supprimer la ligne ci-dessus
  $.ajax({
    url: urlAuth,
    type: "GET",
    dataType: 'json',
    xhrFields: {
      withCredentials: true
    }
  }).done( function( data ) {
    // connecté
    definirUtilisateur( data.token );
  });
}

function definirUtilisateur( jeton ) {
  var nomComplet = '',
      idUtilisateur = '',
      courriel = '',
      nom = '',
      prenom = '';
  if ( undefined !== jeton ) {
    // décodage jeton
    var jetonDecode = decoderJeton( jeton );
    nomComplet = jetonDecode.intitule;
    idUtilisateur = jetonDecode.id;
    courriel = jetonDecode.sub;
    nom = jetonDecode.nom;
    prenom = jetonDecode.prenom;
    // console.log(jetonDecode);
  }
  // affichage
  $( '#bouton-connexion, #creation-compte' ).addClass( 'hidden' );
  $( '#utilisateur-connecte, #anonyme, #zone-courriel-confirmation, #zone-prenom-nom' ).removeClass( 'hidden' );
  $( '#nom-complet' ).html( nomComplet );
  $( '#courriel, #courriel_confirmation' ).val( courriel ).attr( 'disabled', 'disabled' );
  $( '#id_utilisateur' ).val( idUtilisateur );
  $( '#prenom' ).val( prenom ).attr( 'disabled', 'disabled' );
  $( '#nom' ).val( nom ).attr( 'disabled', 'disabled' );
  $( '#date-releve' ).focus();
}

/**
 * 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
 * Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
 * ou ceci : https://code.google.com/p/crypto-js
 */
function decoderJeton( jeton ) {
  parts   = jeton.split( '.' );
  payload = parts[1];
  payload = atob( payload );
  payload = JSON.parse( payload, true );

  return payload;
}