3312 |
idir |
1 |
function WidgetApa() {
|
|
|
2 |
this.utils = new UtilsApa();
|
|
|
3 |
this.mode = null;
|
|
|
4 |
this.urlRacine = window.location.origin;
|
|
|
5 |
this.urlBaseAuth = null;
|
|
|
6 |
this.idUtilisateur = null;
|
|
|
7 |
this.infosUtilisateur = null;
|
|
|
8 |
}
|
|
|
9 |
|
|
|
10 |
WidgetApa.prototype.init = function() {
|
|
|
11 |
const lthis = this;
|
|
|
12 |
|
|
|
13 |
this.urlBaseAuth = this.urlRacine + '/service:annuaire:auth';
|
|
|
14 |
$( '#mdp' ).val('');
|
|
|
15 |
$( '#inscription' ).attr( 'href', this.urlSiteTb() + 'inscription' );
|
|
|
16 |
$( '#inscription' ).attr( 'href', this.urlSiteTb() + 'wp-login.php?action=lostpassword' );
|
|
|
17 |
|
|
|
18 |
this.chargerStatutSSO();
|
|
|
19 |
this.connexionDprodownMenu()
|
|
|
20 |
$( '#deconnexion a' ).click( function( event ) {
|
|
|
21 |
event.preventDefault();
|
|
|
22 |
lthis.deconnecterUtilisateur();
|
|
|
23 |
});
|
|
|
24 |
|
|
|
25 |
$( '#formulaire' ).on( 'click', '.saisir-plantes,.saisir-lichens', function() {
|
|
|
26 |
var nomSquelette = $( this ).data( 'load' );
|
|
|
27 |
$( '#charger-form' ).data( 'load', nomSquelette );
|
|
|
28 |
lthis.utils.chargerForm( nomSquelette, lthis );
|
|
|
29 |
$( '#bouton-list-releves' ).removeClass( 'hidden' );
|
|
|
30 |
$( '#table-releves' ).addClass( 'hidden' );
|
|
|
31 |
});
|
|
|
32 |
};
|
|
|
33 |
|
|
|
34 |
|
|
|
35 |
/**
|
|
|
36 |
* Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
|
|
|
37 |
* à droite de la barre en fonction
|
|
|
38 |
*/
|
|
|
39 |
WidgetApa.prototype.chargerStatutSSO = function() {
|
|
|
40 |
const lthis = this;
|
|
|
41 |
var urlAuth = this.urlBaseAuth + '/identite';
|
|
|
42 |
|
|
|
43 |
if( 'local' !== this.mode ) {
|
|
|
44 |
this.connexion( urlAuth, true );
|
|
|
45 |
if( $( '#utilisateur-connecte' ).hasClass( 'hidden' ) || !this.utils.valOk( $( '#nom-complet' ).text() ) ) {
|
|
|
46 |
var login = $( '#courriel' ).val(),
|
|
|
47 |
mdp = $( '#mdp' ).val();
|
|
|
48 |
if ( this.utils.valOk( login ) && this.utils.valOk( mdp ) ) {
|
|
|
49 |
urlAuth = this.urlBaseAuth + '/connexion?login=' + login + '&password=' + mdp;
|
|
|
50 |
$( '#connexion' ).click( function( event ) {
|
|
|
51 |
event.preventDefault();
|
|
|
52 |
lthis.connexion( urlAuth, true );
|
|
|
53 |
});
|
|
|
54 |
} else {
|
|
|
55 |
alert( lthis.utils.msgTraduction( 'non-connexion' ) );
|
|
|
56 |
}
|
|
|
57 |
}
|
|
|
58 |
} else {
|
|
|
59 |
urlAuth = this.urlRacine + '/widget:cel:modules/apa/test-token.json';
|
|
|
60 |
// $( '#connexion' ).click( function( event ) {
|
|
|
61 |
// event.preventDefault();
|
|
|
62 |
// lthis.connexion( urlAuth, true );
|
|
|
63 |
this.connexion( urlAuth, true );
|
|
|
64 |
// });
|
|
|
65 |
}
|
|
|
66 |
};
|
|
|
67 |
|
|
|
68 |
/**
|
|
|
69 |
* Déconnecte l'utilisateur du SSO
|
|
|
70 |
*/
|
|
|
71 |
WidgetApa.prototype.deconnecterUtilisateur = function() {
|
|
|
72 |
var urlAuth = this.urlBaseAuth + '/deconnexion';
|
|
|
73 |
|
|
|
74 |
if( 'local' === this.mode ) {
|
|
|
75 |
this.definirUtilisateur();
|
|
|
76 |
window.location.reload();
|
|
|
77 |
return;
|
|
|
78 |
}
|
|
|
79 |
this.connexion( urlAuth, false );
|
|
|
80 |
};
|
|
|
81 |
|
|
|
82 |
WidgetApa.prototype.connexion = function( urlAuth, connexionOnOff ) {
|
|
|
83 |
const lthis = this;
|
|
|
84 |
|
|
|
85 |
$.ajax({
|
|
|
86 |
url: urlAuth,
|
|
|
87 |
type: "GET",
|
|
|
88 |
dataType: 'json',
|
|
|
89 |
xhrFields: {
|
|
|
90 |
withCredentials: true
|
|
|
91 |
}
|
|
|
92 |
})
|
|
|
93 |
.done( function( data ) {
|
|
|
94 |
if( connexionOnOff ) {
|
|
|
95 |
// connecté
|
|
|
96 |
lthis.definirUtilisateur( data.token );
|
|
|
97 |
} else {
|
|
|
98 |
lthis.definirUtilisateur();
|
|
|
99 |
window.location.reload();
|
|
|
100 |
}
|
|
|
101 |
})
|
|
|
102 |
.fail( function( error ) {
|
|
|
103 |
// @TODO gérer l'affichage de l'erreur, mais pas facile à placer
|
|
|
104 |
// dans l'interface actuelle sans que ce soit moche
|
|
|
105 |
//afficherErreurServeur();
|
|
|
106 |
});
|
|
|
107 |
};
|
|
|
108 |
|
|
|
109 |
|
|
|
110 |
WidgetApa.prototype.definirUtilisateur = function( jeton ) {
|
|
|
111 |
const thisObj = this;
|
|
|
112 |
var nomComplet = '',
|
|
|
113 |
courriel = '',
|
|
|
114 |
pseudo = '',
|
|
|
115 |
prenom = '',
|
|
|
116 |
nom = '';
|
|
|
117 |
|
|
|
118 |
// affichage
|
|
|
119 |
if ( undefined !== jeton ) {
|
|
|
120 |
// décodage jeton
|
|
|
121 |
this.infosUtilisateur = this.decoderJeton( jeton );
|
|
|
122 |
// console.log(jetonDecode);
|
|
|
123 |
|
|
|
124 |
idUtilisateur = this.infosUtilisateur.id;
|
|
|
125 |
nomComplet = this.infosUtilisateur.intitule;
|
|
|
126 |
courriel = this.infosUtilisateur.sub;
|
|
|
127 |
pseudo = this.infosUtilisateur.pseudo;
|
|
|
128 |
prenom = this.infosUtilisateur.prenom;
|
|
|
129 |
nom = this.infosUtilisateur.nom;
|
|
|
130 |
$( '#courriel' ).attr( 'disabled', 'disabled' );
|
|
|
131 |
$( '#bloc-connexion' ).addClass( 'hidden' );
|
|
|
132 |
$( '#utilisateur-connecte, #anonyme' ).removeClass( 'hidden' );
|
|
|
133 |
}
|
|
|
134 |
$( '#id_utilisateur' ).val( idUtilisateur );
|
|
|
135 |
$( '#prenom' ).val( prenom );
|
|
|
136 |
$( '#nom' ).val( nom );
|
|
|
137 |
$( '#nom-complet' ).html( nomComplet );
|
|
|
138 |
$( '#courriel' ).val( courriel );
|
|
|
139 |
$( '#profil-utilisateur a' ).attr( 'href', this.urlSiteTb() + 'membres/' + pseudo.toLowerCase().replace( ' ', '-' ) );
|
|
|
140 |
if ( this.utils.valOk( idUtilisateur ) ) {
|
|
|
141 |
var nomSquelette = $( '#charger-form' ).data( 'load' ) || 'arbres';
|
|
|
142 |
this.utils.chargerForm( nomSquelette, thisObj );
|
|
|
143 |
}
|
|
|
144 |
};
|
|
|
145 |
|
|
|
146 |
/**
|
|
|
147 |
* Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
|
|
|
148 |
* JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
|
|
|
149 |
*/
|
|
|
150 |
WidgetApa.prototype.decoderJeton = function( jeton ) {
|
|
|
151 |
var parts = jeton.split( '.' ),
|
|
|
152 |
payload = parts[1];
|
|
|
153 |
payload = this.b64d( payload );
|
|
|
154 |
payload = JSON.parse( payload, true );
|
|
|
155 |
return payload;
|
|
|
156 |
};
|
|
|
157 |
|
|
|
158 |
/**
|
|
|
159 |
* Décodage "url-safe" des chaînes base64 retournées par le SSO (lib jwt)
|
|
|
160 |
*/
|
|
|
161 |
WidgetApa.prototype.b64d = function( input ) {
|
|
|
162 |
var remainder = input.length % 4;
|
|
|
163 |
|
|
|
164 |
if ( 0 !== remainder ) {
|
|
|
165 |
var padlen = 4 - remainder;
|
|
|
166 |
|
|
|
167 |
for ( var i = 0; i < padlen; i++ ) {
|
|
|
168 |
input += '=';
|
|
|
169 |
}
|
|
|
170 |
}
|
|
|
171 |
input = input.replace( '-', '+' );
|
|
|
172 |
input = input.replace( '_', '/' );
|
|
|
173 |
return atob( input );
|
|
|
174 |
};
|
|
|
175 |
|
|
|
176 |
WidgetApa.prototype.urlSiteTb = function() {
|
|
|
177 |
var urlPart = ( 'test' === this.mode ) ? '/test/' : '/';
|
|
|
178 |
|
|
|
179 |
return this.urlRacine + urlPart;
|
|
|
180 |
};
|
|
|
181 |
|
|
|
182 |
// Volet de profil/déconnexion
|
|
|
183 |
WidgetApa.prototype.connexionDprodownMenu = function() {
|
|
|
184 |
$( '#utilisateur-connecte .volet-toggle, #profil-utilisateur a, #deconnexion a' ).click( function( event ) {
|
|
|
185 |
if( $( this ).hasClass( 'volet-toggle' ) ) {
|
|
|
186 |
event.preventDefault();
|
|
|
187 |
}
|
|
|
188 |
$( '#utilisateur-connecte .volet-menu' ).toggleClass( 'hidden' );
|
|
|
189 |
});
|
|
|
190 |
}
|
|
|
191 |
|
|
|
192 |
// Préchargement des infos-obs ************************************************/
|
|
|
193 |
|
|
|
194 |
/**
|
|
|
195 |
* Callback dans le chargement du formulaire dans #charger-form
|
|
|
196 |
*/
|
|
|
197 |
WidgetApa.prototype.chargerSquelette = function( squelette , nomSquelette ) {
|
|
|
198 |
// à compléter plus tard si nécessaire, pour le moment on charge "arbres"
|
|
|
199 |
switch( nomSquelette ) {
|
|
|
200 |
case 'plantes' :
|
|
|
201 |
case 'lichens' :
|
|
|
202 |
this.utils.chargerFormPlantesOuLichens( squelette, nomSquelette );
|
|
|
203 |
break;
|
|
|
204 |
case 'arbres' :
|
|
|
205 |
default :
|
|
|
206 |
this.chargerObsUtilisateur( squelette );
|
|
|
207 |
break;
|
|
|
208 |
}
|
|
|
209 |
};
|
|
|
210 |
|
|
|
211 |
/**
|
|
|
212 |
* Infos des obs arbres de cet utilisateur
|
|
|
213 |
*/
|
|
|
214 |
WidgetApa.prototype.chargerObsUtilisateur = function( formReleve ) {
|
|
|
215 |
const lthis = this;
|
|
|
216 |
const urlObs = $( 'body' ).data( 'obs-list' ) + '/' + this.infosUtilisateur.id;
|
|
|
217 |
$( '#bouton-nouveau-releve' ).removeClass( 'hidden' );
|
|
|
218 |
|
|
|
219 |
$.ajax({
|
|
|
220 |
url: urlObs,
|
|
|
221 |
type: 'GET',
|
|
|
222 |
success: function( dataObs, textStatus, jqXHR ) {
|
|
|
223 |
if ( !lthis.utils.valOk( dataObs ) ) {
|
|
|
224 |
dataObs = '';
|
|
|
225 |
}
|
|
|
226 |
lthis.preformaterDonneesObs( dataObs );
|
|
|
227 |
},
|
|
|
228 |
error: function( jqXHR, textStatus, errorThrown ) {
|
|
|
229 |
alert( lthis.utils.msgTraduction( 'erreur-chargement-obs-utilisateur' ) );
|
|
|
230 |
}
|
|
|
231 |
})
|
|
|
232 |
.always( function() {
|
|
|
233 |
$( '#charger-form' ).html( formReleve );
|
|
|
234 |
});
|
|
|
235 |
};
|
|
|
236 |
|
|
|
237 |
/**
|
|
|
238 |
* Préformater les données des obs d'un utilisateur
|
|
|
239 |
*/
|
|
|
240 |
WidgetApa.prototype.preformaterDonneesObs = function( dataObs ) {
|
|
|
241 |
const lthis = this;
|
|
|
242 |
if ( this.utils.valOk( dataObs ) ) {
|
|
|
243 |
var apaObs = [],
|
|
|
244 |
datRuComun = [],
|
|
|
245 |
obsArbres = [],
|
|
|
246 |
apaObsE = {},
|
|
|
247 |
count = 0;
|
|
|
248 |
|
|
|
249 |
$.each( dataObs, function( i, obs ) {
|
|
|
250 |
if( /WidgetApa/.test( obs.mots_cles_texte ) && !/(:?plantes|lichens)/.test( obs.mots_cles_texte ) ) {
|
|
|
251 |
if ( lthis.utils.valOk( obs.obs_etendue ) ) {
|
|
|
252 |
$.each( obs.obs_etendue, function( indice, obsE ) {
|
|
|
253 |
apaObsE[obsE.cle] = obsE.valeur;
|
|
|
254 |
});
|
|
|
255 |
}
|
|
|
256 |
obs.date_observation = $.trim( obs.date_observation.replace( /[0-9]{2}:[0-9]{2}:[0-9]{2}$/, '') );
|
|
|
257 |
if ( -1 === datRuComun.indexOf( obs.date_observation + apaObsE.rue + obs.zone_geo ) ) {
|
|
|
258 |
datRuComun.push( obs.date_observation + apaObsE.rue + obs.zone_geo );
|
|
|
259 |
apaObs[count] = lthis.utils.formaterReleveData( { 'obs':obs, 'obsE':apaObsE } );
|
|
|
260 |
count++;
|
|
|
261 |
}
|
|
|
262 |
obsArbres.push( lthis.utils.formaterArbreData( { 'obs':obs, 'obsE':apaObsE } ) );
|
|
|
263 |
apaObsE = [];
|
|
|
264 |
}
|
|
|
265 |
});
|
|
|
266 |
// on insert les arbres dans les relevés en fonction de la date et la rue d'observation
|
|
|
267 |
// car les arbres pour un relevé (date/rue) n'ont pas forcément été enregistrés dans l'ordre ni le même jour
|
|
|
268 |
$.each( obsArbres, function( indexArbre, arbre ) {
|
|
|
269 |
for ( var indexReleve = 0; indexReleve < datRuComun.length; indexReleve++ ) {
|
|
|
270 |
if ( arbre.date_rue_commune === datRuComun[indexReleve] ) {
|
|
|
271 |
apaObs[indexReleve].push( arbre );
|
|
|
272 |
}
|
|
|
273 |
}
|
|
|
274 |
});
|
|
|
275 |
if ( this.utils.valOk( apaObs ) ) {
|
|
|
276 |
this.prechargerLesObs( apaObs );
|
|
|
277 |
$( '#apa-obs' ).val( JSON.stringify( apaObs ) );
|
|
|
278 |
$( '#bouton-list-releves' ).removeClass( 'hidden' );
|
|
|
279 |
}
|
|
|
280 |
$( '#dates-rues-communes' ).val( JSON.stringify( datRuComun ) );
|
|
|
281 |
}
|
|
|
282 |
};
|
|
|
283 |
|
|
|
284 |
WidgetApa.prototype.prechargerLesObs = function( apaObs ) {
|
|
|
285 |
const lthis = this;
|
|
|
286 |
const $listReleve = $( '#list-releves' );
|
|
|
287 |
const TEXT_ARBRE = ' ' + this.utils.msgTraduction( 'arbre' ).toLowerCase();
|
|
|
288 |
|
|
|
289 |
var nbArbres = '',
|
|
|
290 |
texteArbre = '';
|
|
|
291 |
|
|
|
292 |
var releveHtml = '';
|
|
|
293 |
$( '#bouton-list-releves' )
|
|
|
294 |
.removeClass( 'hidden' )
|
|
|
295 |
.click( function() {
|
|
|
296 |
$( '#table-releves' ).removeClass( 'hidden' );
|
|
|
297 |
$( this ).addClass( 'hidden' );
|
|
|
298 |
});
|
|
|
299 |
|
|
|
300 |
$.each( apaObs, function( i, releve ) {
|
|
|
301 |
nbArbres = releve.length - 1;
|
|
|
302 |
texteArbre = ( 1 < nbArbres ) ? ( TEXT_ARBRE + 's' ) : TEXT_ARBRE;
|
|
|
303 |
releveHtml +=
|
|
|
304 |
'<tr class="table-light text-center">'+
|
|
|
305 |
'<td>' +
|
|
|
306 |
'<p>'+
|
|
|
307 |
lthis.utils.fournirDate( releve[0].date ) +
|
|
|
308 |
'</p><p>'+
|
|
|
309 |
releve[0].rue + ', ' + releve[0]['commune-nom'] +
|
|
|
310 |
'</p><p>'+
|
|
|
311 |
'(' + nbArbres + texteArbre + ')' +
|
|
|
312 |
'</p>'+
|
|
|
313 |
'</td>'+
|
|
|
314 |
'<td class="d-flex flex-column">' +
|
|
|
315 |
'<div class="charger-releve btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="arbres">'+
|
|
|
316 |
'<i class="fas fa-clone"></i> ' + lthis.utils.msgTraduction( 'dupliquer' )+
|
|
|
317 |
'</div> '+
|
|
|
318 |
'<div class="saisir-plantes btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="plantes">'+
|
|
|
319 |
'<i class="fas fa-seedling"></i> ' + lthis.utils.msgTraduction( 'saisir-plantes' )+
|
|
|
320 |
'</div> '+
|
|
|
321 |
'<div class="saisir-lichens btn btn-sm btn-info" data-releve="' + i + '" data-load="lichens">'+
|
|
|
322 |
// '<i class="fas fa-certificate"></i> ' + lthis.utils.msgTraduction( 'saisir-lichens' )+
|
|
|
323 |
'<i class="far fa-snowflake"></i> ' + lthis.utils.msgTraduction( 'saisir-lichens' )+
|
|
|
324 |
'</div> '+
|
|
|
325 |
'</td>'+
|
|
|
326 |
'</tr>';
|
|
|
327 |
});
|
|
|
328 |
$listReleve.append( releveHtml );
|
|
|
329 |
$( '#nb-releves-bienvenue' )
|
|
|
330 |
.removeClass( 'hidden' )
|
|
|
331 |
.find( 'span.nb-releves' )
|
|
|
332 |
.text( apaObs.length );
|
|
|
333 |
};
|