Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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