Subversion Repositories eFlore/Applications.cel

Rev

Rev 3319 | Details | Compare with Previous | 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;
3319 idir 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', 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
WidgetStreets.prototype.chargerStatutSSO = function() {
40
	const lthis = this;
3318 idir 41
	var urlAuth = this.urlBaseAuth + '/identite';
42
 
43
	if( 'local' !== this.mode ) {
44
		this.connexion( urlAuth, true );
45
		$( '#connexion' ).click( function( event ) {
46
			event.preventDefault();
47
			if( $( '#utilisateur-connecte' ).hasClass( 'hidden' ) || !lthis.utils.valOk( $( '#nom-complet' ).text() ) ) {
48
				var login = $( '#courriel' ).val(),
49
					mdp   = $( '#mdp' ).val();
50
				if ( lthis.utils.valOk( login ) && lthis.utils.valOk( mdp ) ) {
51
					urlAuth = lthis.urlBaseAuth + '/connexion?login=' + login + '&password=' + mdp;
52
					lthis.connexion( urlAuth, true );
53
				} else {
54
					alert( lthis.utils.msgTraduction( 'non-connexion' ) );
55
				}
56
			}
57
		});
58
	} else {
59
		urlAuth = this.urlRacine + '/widget:cel:modules/streets/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
WidgetStreets.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
WidgetStreets.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
WidgetStreets.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
WidgetStreets.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
WidgetStreets.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
WidgetStreets.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
WidgetStreets.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
WidgetStreets.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
			this.utils.chargerFormPlantes( squelette, nomSquelette );
202
			break;
203
		case 'arbres' :
204
		default :
205
			this.chargerObsUtilisateur( squelette );
206
		break;
207
	}
208
};
209
 
210
/**
211
 * Infos des obs arbres de cet utilisateur
212
 */
213
WidgetStreets.prototype.chargerObsUtilisateur = function( formReleve ) {
214
	const lthis = this;
215
	const urlObs = $( 'body' ).data( 'obs-list' ) + '/' + this.infosUtilisateur.id;
216
	$( '#bouton-nouveau-releve' ).removeClass( 'hidden' );
217
 
218
	$.ajax({
219
		url: urlObs,
220
		type: 'GET',
221
		success: function( dataObs, textStatus, jqXHR ) {
222
			if ( !lthis.utils.valOk( dataObs ) ) {
223
				dataObs = '';
224
			}
225
			lthis.preformaterDonneesObs( dataObs );
226
		},
227
		error: function( jqXHR, textStatus, errorThrown ) {
228
			alert( lthis.utils.msgTraduction( 'erreur-chargement-obs-utilisateur' ) );
229
		}
230
	})
231
	.always( function() {
232
		$( '#charger-form' ).html( formReleve );
233
	});
234
};
235
 
236
/**
237
 * Préformater les données des obs d'un utilisateur
238
 */
239
WidgetStreets.prototype.preformaterDonneesObs = function( dataObs ) {
240
	const lthis = this;
241
	if ( this.utils.valOk( dataObs ) ) {
242
		var streetsObs     = [],
243
			datRuComun = [],
244
			obsArbres  = [],
245
			streetsObsE    = {},
246
			count      = 0;
247
 
248
		$.each( dataObs, function( i, obs ) {
249
			if(  /WidgetStreets/.test( obs.mots_cles_texte ) && !/(:?plantes)/.test( obs.mots_cles_texte ) ) {
250
				if ( lthis.utils.valOk( obs.obs_etendue ) ) {
251
					$.each( obs.obs_etendue, function( indice, obsE ) {
252
						streetsObsE[obsE.cle] = obsE.valeur;
253
					});
254
				}
255
				obs.date_observation = $.trim( obs.date_observation.replace( /[0-9]{2}:[0-9]{2}:[0-9]{2}$/, '') );
256
				if ( -1 === datRuComun.indexOf( obs.date_observation + streetsObsE.rue + obs.zone_geo )  ) {
257
					datRuComun.push( obs.date_observation + streetsObsE.rue + obs.zone_geo );
258
					streetsObs[count] = lthis.utils.formaterReleveData( { 'obs':obs, 'obsE':streetsObsE } );
259
					count++;
260
				}
261
				obsArbres.push( lthis.utils.formaterArbreData( { 'obs':obs, 'obsE':streetsObsE } ) );
262
				streetsObsE = [];
263
			}
264
		});
265
		// on insert les arbres dans les relevés en fonction de la date et la rue d'observation
266
		// car les arbres pour un relevé (date/rue) n'ont pas forcément été enregistrés dans l'ordre ni le même jour
267
		$.each( obsArbres, function( indexArbre, arbre ) {
268
			for ( var indexReleve = 0; indexReleve < datRuComun.length; indexReleve++ ) {
269
				if ( arbre.date_rue_commune  === datRuComun[indexReleve] ) {
270
					streetsObs[indexReleve].push( arbre );
271
				}
272
			}
273
		});
274
		if ( this.utils.valOk( streetsObs ) ) {
275
			this.prechargerLesObs( streetsObs );
276
			$( '#streets-obs' ).val( JSON.stringify( streetsObs ) );
277
			$( '#bouton-list-releves' ).removeClass( 'hidden' );
278
		}
279
		$( '#dates-rues-communes' ).val( JSON.stringify( datRuComun ) );
280
	}
281
};
282
 
283
WidgetStreets.prototype.prechargerLesObs = function( streetsObs ) {
284
	const lthis = this;
285
	const $listReleve = $( '#list-releves' );
286
	const TEXT_ARBRE = ' ' + this.utils.msgTraduction( 'arbre' ).toLowerCase();
287
 
288
	var nbArbres   = '',
289
		texteArbre = '';
290
 
291
	var releveHtml = '';
292
	$( '#bouton-list-releves' )
293
		.removeClass( 'hidden' )
294
		.click( function() {
295
			$( '#table-releves' ).removeClass( 'hidden' );
296
			$( this ).addClass( 'hidden' );
297
	});
298
 
299
	$.each( streetsObs, function( i, releve ) {
300
		nbArbres = releve.length - 1;
301
		texteArbre = ( 1 < nbArbres ) ? ( TEXT_ARBRE + 's' ) : TEXT_ARBRE;
302
		releveHtml +=
303
			'<tr class="table-light text-center">'+
304
				'<td>' +
305
					'<p>'+
306
						lthis.utils.fournirDate( releve[0].date ) +
307
					'</p><p>'+
308
						releve[0].rue + ', ' + releve[0]['commune-nom'] +
309
					'</p><p>'+
310
						'(' + nbArbres + texteArbre + ')' +
311
					'</p>'+
312
				'</td>'+
313
				'<td class="d-flex flex-column">' +
314
					'<div class="charger-releve btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="arbres">'+
315
						'<i class="fas fa-clone"></i> ' + lthis.utils.msgTraduction( 'dupliquer' )+
316
					'</div> '+
317
					'<div class="saisir-plantes btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="plantes">'+
318
						'<i class="fas fa-seedling"></i> ' + lthis.utils.msgTraduction( 'saisir-plantes' )+
319
					'</div> '
320
				'</td>'+
321
			'</tr>';
322
	});
323
	$listReleve.append( releveHtml );
324
	$( '#nb-releves-bienvenue' )
325
		.removeClass( 'hidden' )
326
		.find( 'span.nb-releves' )
327
			.text( streetsObs.length );
328
};