Subversion Repositories eFlore/Applications.cel

Rev

Rev 3209 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3209 Rev 3213
1
// configuration
1
// configuration
-
 
2
// prod :
-
 
3
/*var urlRacine =
2
/*var urlRacine = 'https://www.tela-botanica.org',
4
  'https://www.tela-botanica.org',
3
  config = {
5
  config = {
4
    prod: {
6
    prod: {
5
      urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
7
      urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
6
      urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
8
      urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire:auth'
7
    },
-
 
8
    test: {
-
 
9
      urlWidgetNavigation : urlRacine + '/widget-test:cel:saisie2',
-
 
10
      urlBaseAuth : 'https://www.tela-botanica.org/service:annuaire-test:auth'
-
 
11
    },
-
 
12
    local: {
-
 
13
      urlWidgetNavigation : 'https://localhost/widget:cel:saisie2',
-
 
14
      urlBaseAuth : 'https://localhost/service:annuaire:auth'
-
 
15
    }
9
    }
16
  }
10
  }
17
  */
11
  */
18
// // Prod: décommenter ci-dessus et commenter ou supprimer ci-dessous
12
// beta (test) :
-
 
13
var urlRacine =
19
 var urlRacine = 'https://beta.tela-botanica.org',
14
  'https://beta.tela-botanica.org',
20
   config = {
15
  config = {
21
     prod: {
16
    test: {
22
       urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
17
      urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
23
       urlBaseAuth : 'https://beta.tela-botanica.org/service:annuaire:auth'
18
      urlBaseAuth : 'https://beta.tela-botanica.org/service:annuaire:auth'
24
     },
19
    }
-
 
20
  }
-
 
21
 
-
 
22
// dev (localhost):
-
 
23
/*var urlRacine =
-
 
24
  'http://localhost',
-
 
25
  config = {
25
     test: {
26
    local: {
26
       urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
27
      urlWidgetNavigation : urlRacine + '/widget:cel:saisie2',
27
       urlBaseAuth : 'https://api.tela-botanica.test/service:annuaire:auth'
28
      urlBaseAuth : 'https://api.tela-botanica.test/service:annuaire:auth'
28
     },
-
 
29
     local: {
-
 
30
       urlWidgetNavigation : 'https://localhost/widget:cel:saisie2',
-
 
31
      urlBaseAuth : 'https://localhost/service:annuaire:auth'
-
 
32
     }
29
    }
33
   }
30
  }
34
 
31
*/
35
/**
32
/**
36
 * Charge la barre de navigation depuis le widget:reseau:navigation dans un <div id="tb-navigation"> , s'il existe
33
 * Charge la barre de navigation depuis le widget:reseau:navigation dans un <div id="tb-navigation"> , s'il existe
37
 * dans la page appelante.
34
 * dans la page appelante.
38
 *
35
 *
39
 * Nécessite jQuery
36
 * Nécessite jQuery
40
 *
37
 *
41
 * Utilisation :
38
 * Utilisation :
42
 *      - prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.
39
 *      - prévoir un <div id="tb-navigation"> dans la page, qui accueillera la barre de navigation.
43
 *      - si ce <div> contient déjà quelque chose, son contenu sera reporté à la place de la zone ayant l'id "contenu-source"
40
 *      - si ce <div> contient déjà quelque chose, son contenu sera reporté à la place de la zone ayant l'id "contenu-source"
44
 *        de la barre de navigation (si une telle zone existe)
41
 *        de la barre de navigation (si une telle zone existe)
45
 *  - si ce <div> contient un attribut "data-courant" et si la valeur de cet attribut correspond à l'id d'un des éléments
42
 *  - si ce <div> contient un attribut "data-courant" et si la valeur de cet attribut correspond à l'id d'un des éléments
46
 *    de navigation, alors cet élément aura la classe "active" (pour localiser la page courante dans les menus)
43
 *    de navigation, alors cet élément aura la classe "active" (pour localiser la page courante dans les menus)
47
 *  - si ce <div> contient un attribut "data-squelette", alors le widget de navigation sera appelé avec le paramètre
44
 *  - si ce <div> contient un attribut "data-squelette", alors le widget de navigation sera appelé avec le paramètre
48
 *    "?squelette=contenu-de-data-squelette"; se reporter à la documentation du widget:reseau:navigation
45
 *    "?squelette=contenu-de-data-squelette"; se reporter à la documentation du widget:reseau:navigation
49
 */
46
 */
50
 
47
 
51
$( document ).ready( function() {
48
$( document ).ready( function() {
52
  var $div = $( '#tb-navigation' );
49
  var $div = $( '#tb-navigation' );
53
  if ( $div ) {
50
  if ( $div ) {
54
    var squelette = $div.data( 'squelette' ),
51
    var squelette = $div.data( 'squelette' ),
55
        courant   = $div.data( 'courant' ),
52
        courant   = $div.data( 'courant' ),
56
        mode      = $div.data( 'mode' ) || 'prod',
53
        mode      = $div.data( 'mode' ) || 'prod',
57
        contenu   = $div.html();
54
        contenu   = $div.html();
58
 
55
 
59
    // chargement de la barre
56
    // chargement de la barre
60
    var urlBarreNavigation = config[mode]['urlWidgetNavigation'];
57
    var urlBarreNavigation = config[mode]['urlWidgetNavigation'];
61
 
58
 
62
    if ( squelette ) {
59
    if ( squelette ) {
63
      urlBarreNavigation += '?squelette=' + squelette;
60
      urlBarreNavigation += '?squelette=' + squelette;
64
    }
61
    }
65
 
62
 
66
    htmlBarre = $.ajax({
63
    htmlBarre = $.ajax({
67
      url: urlBarreNavigation,
64
      url: urlBarreNavigation,
68
      type: 'get',
65
      type: 'get',
69
      success: function( data ) {
66
      success: function( data ) {
70
        // remplacement de la zone contenu-source
67
        // remplacement de la zone contenu-source
71
        var $zoneSource = $div.find( '#contenu-source' );
68
        var $zoneSource = $div.find( '#contenu-source' );
72
        if ( $zoneSource ) {
69
        if ( $zoneSource ) {
73
          $zoneSource.replaceWith( contenu );
70
          $zoneSource.replaceWith( contenu );
74
          // Chargement des informations de connexion SSO
71
          // Chargement des informations de connexion SSO
75
          var urlBaseAuth = config[mode]['urlBaseAuth'];
72
          var urlBaseAuth = config[mode]['urlBaseAuth'];
76
          chargerStatutSSO( urlBaseAuth );
73
          chargerStatutSSO( config[mode]['urlBaseAuth'] );
77
        }
74
        }
78
      },
75
      },
79
      error: function() {
76
      error: function() {
80
        $div.html( 'Erreur: impossible de charger la barre de navigation' );
77
        $div.html( 'Erreur: impossible de charger la barre de navigation' );
81
      }
78
      }
82
    });
79
    });
83
  }
80
  }
84
});
81
});
85
 
82
 
86
/**
83
/**
87
 * Modifie les liens des boutons de connexion / déconnexion SSO pour prendre ne compte
84
 * Modifie les liens des boutons de connexion / déconnexion SSO pour prendre ne compte
88
 * l'adresse exacte de la page d'origine (si on fait ça en PHP, on obtient l'URL du
85
 * l'adresse exacte de la page d'origine (si on fait ça en PHP, on obtient l'URL du
89
 * widget de barre de navigation et pas de la page appelante)
86
 * widget de barre de navigation et pas de la page appelante)
90
 */
87
 */
91
function definirPageOrigineDansLiens() {
88
function definirPageOrigineDansLiens() {
92
  var page = window.location.href;
89
  var page = window.location.href;
93
  $( '#bouton-connexion a' ).attr( 'href', $( '#bouton-connexion a' ).attr( 'href' ) + page );
90
  $( '#bouton-connexion a' ).attr( 'href', $( '#bouton-connexion a' ).attr( 'href' ) + page );
94
  $( '#deconnexion a' ).attr( 'href', $( '#deconnexion a' ).attr( 'href' ) + page );
91
  $( '#deconnexion a' ).attr( 'href', $( '#deconnexion a' ).attr( 'href' ) + page );
95
}
92
}
96
 
93
 
97
/**
94
/**
98
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
95
 * Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
99
 * à droite de la barre en fonction
96
 * à droite de la barre en fonction
100
 */
97
 */
101
function chargerStatutSSO( urlBaseAuth ) {
98
function chargerStatutSSO( urlBaseAuth ) {
102
  var urlAuth = urlBaseAuth + '/identite';
99
  var urlAuth = urlBaseAuth + '/identite';
103
  // Prod: décommenter $.ajax ci-dessous et supprimer la ligne ci-dessus
-
 
104
  $.ajax({
100
  $.ajax({
105
    url: urlAuth,
101
    url: urlAuth,
106
    type: "GET",
102
    type: "GET",
107
    dataType: 'json',
103
    dataType: 'json',
108
    xhrFields: {
104
    xhrFields: {
109
      withCredentials: true
105
      withCredentials: true
110
    }
106
    }
111
  }).done( function( data ) {
107
  }).done( function( data ) {
112
    // connecté
108
    // connecté
-
 
109
    if ( undefined !== data.token ) {
113
    definirUtilisateur( data.token );
110
      definirUtilisateur( data.token );
-
 
111
    }
114
  });
112
  });
115
}
113
}
116
 
114
 
117
function definirUtilisateur( jeton ) {
115
function definirUtilisateur( jeton ) {
118
  var nomComplet = '',
-
 
119
      idUtilisateur = '',
-
 
120
      courriel = '',
-
 
121
      nom = '',
-
 
122
      prenom = '';
-
 
123
  if ( undefined !== jeton ) {
-
 
124
    // décodage jeton
116
  // décodage jeton
125
    var jetonDecode = decoderJeton( jeton );
117
  var jetonDecode = decoderJeton( jeton );
126
    nomComplet = jetonDecode.intitule;
-
 
127
    idUtilisateur = jetonDecode.id;
-
 
128
    courriel = jetonDecode.sub;
-
 
129
    nom = jetonDecode.nom;
-
 
130
    prenom = jetonDecode.prenom;
-
 
131
    // console.log(jetonDecode);
118
  // console.log(jetonDecode);
132
  }
-
 
133
  // affichage
119
  // affichage
-
 
120
  $( '.warning' ).remove();
134
  $( '#bouton-connexion, #creation-compte' ).addClass( 'hidden' );
121
  $( '#bouton-connexion, #creation-compte' ).addClass( 'hidden' );
135
  $( '#utilisateur-connecte, #anonyme, #zone-courriel-confirmation, #zone-prenom-nom' ).removeClass( 'hidden' );
122
  $( '#utilisateur-connecte, #anonyme, #zone-courriel-confirmation, #zone-prenom-nom' ).removeClass( 'hidden' );
136
  $( '#nom-complet' ).html( nomComplet );
123
  $( '#nom-complet' ).html( jetonDecode.intitule );
137
  $( '#courriel, #courriel_confirmation' ).val( courriel ).attr( 'disabled', 'disabled' );
124
  $( '#courriel, #courriel_confirmation' ).val( jetonDecode.sub ).attr( 'disabled', 'disabled' );
138
  $( '#id_utilisateur' ).val( idUtilisateur );
125
  $( '#id_utilisateur' ).val( jetonDecode.id );
139
  $( '#prenom' ).val( prenom ).attr( 'disabled', 'disabled' );
126
  $( '#prenom' ).val( jetonDecode.prenom ).attr( 'disabled', 'disabled' );
140
  $( '#nom' ).val( nom ).attr( 'disabled', 'disabled' );
127
  $( '#nom' ).val( jetonDecode.nom ).attr( 'disabled', 'disabled' );
141
  $( '#date-releve' ).focus();
128
  $( '#date-releve' ).focus();
142
}
129
}
143
 
130
 
144
/**
131
/**
145
 * Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
132
 * Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
146
 * JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
133
 * JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
147
 * Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
134
 * Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
148
 * ou ceci : https://code.google.com/p/crypto-js
135
 * ou ceci : https://code.google.com/p/crypto-js
149
 */
136
 */
150
function decoderJeton( jeton ) {
137
function decoderJeton( jeton ) {
151
  parts   = jeton.split( '.' );
138
  parts   = jeton.split( '.' );
152
  payload = parts[1];
139
  payload = parts[1];
-
 
140
  payload = payload.replace('-', '+').replace('_', '/');
153
  payload = atob( payload );
141
  payload = atob( payload );
154
  payload = JSON.parse( payload, true );
142
  payload = JSON.parse( payload, true );
155
 
143
 
156
  return payload;
144
  return payload;
157
}
145
}