Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
3638 delphine 1
/**
2
 * Constructeur WidgetsSaisiesASL par défaut
3
 * S'applique au squelette apa.tpl.html
4
 * Squelette de base d'apa streets et lg
5
 */
6
// ASL : APA, sTREETs, Lichen's Go!
7
function WidgetsSaisiesASL( proprietes ) {
8
	if  ( utils.valOk( proprietes ) ) {
9
		this.urlWidgets                        = proprietes.urlWidgets;
10
		this.projet                            = proprietes.projet;
11
		this.idProjet                          = proprietes.idProjet;
12
		this.tagsMotsCles                      = proprietes.tagsMotsCles;
13
		this.mode                              = proprietes.mode;
14
		this.langue                            = proprietes.langue;
15
		this.serviceObsImgs                    = proprietes.serviceObsImgs;
16
		this.serviceObsImgUrl                  = proprietes.serviceObsImgUrl;
17
		this.serviceAnnuaireIdUrl              = proprietes.serviceAnnuaireIdUrl;
18
		this.serviceNomCommuneUrl              = proprietes.serviceNomCommuneUrl;
19
		this.serviceNomCommuneUrlAlt           = proprietes.serviceNomCommuneUrlAlt;
20
		this.debug                             = proprietes.debug;
21
		this.html5                             = proprietes.html5;
22
		this.serviceSaisieUrl                  = proprietes.serviceSaisieUrl;
23
		this.serviceObsUrl                     = proprietes.serviceObsUrl;
24
		this.chargementImageIconeUrl           = proprietes.chargementImageIconeUrl;
25
		this.pasDePhotoIconeUrl                = proprietes.pasDePhotoIconeUrl;
26
		this.autocompletionElementsNbre        = proprietes.autocompletionElementsNbre;
27
		this.serviceAutocompletionNomSciUrl    = proprietes.serviceAutocompletionNomSciUrl;
28
		this.serviceAutocompletionNomSciUrlTpl = proprietes.serviceAutocompletionNomSciUrlTpl;
29
		this.dureeMessage                      = proprietes.dureeMessage;
30
		this.obsMaxNbre                        = proprietes.obsMaxNbre;
31
		this.msgs                              = utils.msgs;
32
	}
33
	this.urlRacine            = window.location.origin;
34
	this.isASL                = true;
35
	this.nbObsEnCours         = 1;
36
	this.obsNbre              = 0;
37
	this.totalObsATransmettre = 0;
38
	this.nbObsTransmises      = 0;
39
	this.tagImg               = null;
40
	this.tagObs               = null;
41
	this.separationTagImg     = null;
42
	this.separationTagObs     = null;
43
	this.nomSciReferentiel    = null;
44
	this.referentielImpose    = null;
45
	this.releveDatas          = null;
46
	this.urlBaseAuth          = null;
47
	this.idUtilisateur        = null;
48
	this.sujet                = null;
49
	this.isTaxonListe         = false;
50
}
51
WidgetsSaisiesASL.prototype = new WidgetsSaisiesCommun();
52
 
53
/**
54
 * Initialise le formulaire, les validateurs, les listes de complétion...
55
 */
56
WidgetsSaisiesASL.prototype.initForm = function() {
57
	this.initFormConnection();
58
};
59
 
60
WidgetsSaisiesASL.prototype.initEvts = function() {
61
	const lthis = this;
62
	// initialisation des fonctions connexion utilisateur
63
	this.initEvtsConnection();
64
	// chargement plantes ou lichens
65
	if ( this.valOk( $( '.charger-releve' ) ) ) {
66
		var btnChargementForm = this.determinerBtnsChargementForm( '.' );
67
		// #releve-data n'est pas modifié, bouton dans #releves-utilisateur
68
		this.btnsChargerForm( btnChargementForm, false );
69
	}
70
};
71
 
72
WidgetsSaisiesASL.prototype.determinerBtnsChargementForm = function( typeSelecteur, ajouterBtnPoursuivre = false ) {
73
	var complement       = '',
74
		selecteurDefault = '',
75
		separateur       = ',';
76
 
77
	if ( '#' === typeSelecteur ) {
78
		if ( ajouterBtnPoursuivre ) {
79
			selecteurDefault = 'poursuivre';
80
		}
81
		typeSelecteur += 'bouton-';
82
	} else if ( '.' === typeSelecteur ) {
83
		selecteurDefault = 'charger-releve';
84
		complement = separateur + typeSelecteur;
85
	}
86
	switch( this.projet ) {
87
		case 'tb_streets':
88
			if ( !ajouterBtnPoursuivre ) {
89
				complement += 'saisir-plantes';
90
			}
91
			break;
92
		case 'tb_lichensgo':
93
			if ( !ajouterBtnPoursuivre ) {
94
				complement += 'saisir-lichens';
95
			}
96
			break;
97
		case 'tb_aupresdemonarbre':
98
		default:
99
			separateur += typeSelecteur;
100
			if ( ajouterBtnPoursuivre) {
101
				complement = separateur;
102
			}
103
			complement += 'saisir-plantes' + separateur + 'saisir-lichens';
104
			break;
105
	}
106
	return typeSelecteur + selecteurDefault + complement;
107
};
108
 
109
WidgetsSaisiesASL.prototype.btnsChargerForm = function( btn, modifierReleveData = true, dansRelevesUtilisateur = true ) {
110
	const lthis = this;
111
	var bloc = ( dansRelevesUtilisateur ) ? '#releves-utilisateur' : '#charger-form';
112
 
113
	$( btn, bloc ).off().on( 'click', function( event ) {
114
		event.preventDefault();
115
 
116
		var thisWidgetObs = ( lthis.valOk( $( '#' + lthis.projet + '-obs' ).val() ) ) ? $.parseJSON( $( '#' + lthis.projet + '-obs' ).val() ) : [];
117
		var nomSquelette  = $( this ).data( 'load' ),
118
			releveDatas   = '';
119
 
120
		$( '#charger-form' ).data( 'load', nomSquelette );
121
		if ( modifierReleveData ) {
122
			if ( '#bouton-nouveau-releve' !== btn ) {
123
				$( '#bouton-nouveau-releve' ).removeClass( 'hidden' );
124
				if ( lthis.valOk( thisWidgetObs ) ) {
125
			 		releveDatas = JSON.stringify( thisWidgetObs[ $( this ).data( 'releve' ) ] );
126
			 	}
127
			} else {
128
				$( btn ).addClass( 'hidden' );
129
			}
130
			$( '#releve-data' ).val( releveDatas );
131
		}
132
		lthis.chargerForm( nomSquelette, lthis );
133
		if ( lthis.valOk( thisWidgetObs ) ) {
134
			$( '#bouton-list-releves' ).removeClass( 'hidden' );
135
		}
136
		$( '#table-releves' ).addClass( 'hidden' );
137
	});
138
};
139
 
140
WidgetsSaisiesASL.prototype.chargerForm = function( nomSquelette, formObj ) {
141
	const lthis = this;
142
 
143
	var urlSquelette = this.urlWidgets + 'saisie?projet=' + this.projet + '&squelette=' + nomSquelette;
144
 
145
	$.ajax({
146
		url: urlSquelette,
147
		type: 'get',
148
		success: function( squelette ) {
149
			if ( lthis.valOk( squelette ) ) {
150
				formObj.chargerSquelette( squelette, nomSquelette );
151
			}
152
		},
153
		error: function() {
154
			$( '#charger-form' ).html( lthis.msgTraduction( 'erreur-formulaire' ) );
155
		}
156
	});
157
};
158
 
159
// Préchargement des infos-obs ************************************************/
160
/**
161
 * Callback dans le chargement du formulaire dans #charger-form
162
 */
163
WidgetsSaisiesASL.prototype.chargerSquelette = function( squelette , nomSquelette ) {
164
	//  à compléter plus tard si nécessaire, pour le moment on charge "arbres"
165
	switch( nomSquelette ) {
166
		case 'plantes' :
167
		case 'lichens' :
168
			this.chargerFormPlantesOuLichens( squelette, nomSquelette );
169
			break;
170
		case 'arbres' :
171
		default :
172
			if ( this.valOk( this.sujet ) ) {
173
				this.reinitialiserWidget( squelette );
174
			} else {
175
				this.chargerObsUtilisateur( squelette );
176
			}
177
		break;
178
	}
179
};
180
 
181
WidgetsSaisiesASL.prototype.chargerFormPlantesOuLichens = function( squelette, nomSquelette ) {
182
	if ( this.valOk( $( '#releve-data' ).val() ) ) {
183
		$( '#charger-form' ).html( squelette );
184
		this.confirmerSortie();
185
		const releveDatas = $.parseJSON( $( '#releve-data' ).val() );
186
		const nbArbres    = releveDatas.length -1;
187
 
188
		for ( var i = 1; i <= nbArbres ; i++ ) {
189
			$( '#choisir-arbre' ).append(
190
				'<option value="' + i + '">'+
191
					this.msgTraduction( 'arbre' ) + ' ' + i +
192
				'</option>'
193
			);
194
		}
195
		this.scrollFormTop( '#zone-' + nomSquelette );
196
	}
197
};
198
 
199
WidgetsSaisiesASL.prototype.reinitialiserWidget = function( squelette ) {
200
	$( '#charger-form' ).html( squelette );
201
	if ( this.valOk( $( '#releve-data' ).val() ) ) {
202
		this.rechargerFormulaire();
203
	}
204
};
205
 
206
/**
207
 * Infos des obs arbres de cet utilisateur
208
 */
209
WidgetsSaisiesASL.prototype.chargerObsUtilisateur = function( formReleve ) {
210
	const lthis = this;
211
	var tagsMotsCles          = this.tagsMotsCles.split( ',' ),
212
		reprereAjoutTags    = tagsMotsCles.length - 1,
213
		queryStringMotsCles = '';
214
 
215
	$.each( tagsMotsCles , function( i, tag ) {
216
		queryStringMotsCles += 'mots_cles=' + tagsMotsCles[i];
217
		if ( i < reprereAjoutTags ) {
218
			queryStringMotsCles += '&';
219
		}
220
	});
221
 
222
	const urlObs =
223
		$( 'body' ).data( 'obs-list' ) + '/'+
224
		$( '#id_utilisateur' ).val() + '?' + queryStringMotsCles;
225
 
226
	$.ajax({
227
		url: urlObs,
228
		type: 'GET',
229
		success: function( dataObs, textStatus, jqXHR ) {
230
			if ( !lthis.valOk( dataObs ) ) {
231
				dataObs = '';
232
			}
233
			lthis.preformaterDonneesObs( dataObs );
234
		},
235
		error: function( jqXHR, textStatus, errorThrown ) {
236
			lthis.activerModale( lthis.msgTraduction( 'erreur-chargement-obs-utilisateur' ) );
237
		}
238
	})
239
	.always( function() {
240
		$( '#charger-form' ).html( formReleve );
241
	});
242
};
243
 
244
/**
245
 * Préformater les données des obs d'un utilisateur
246
 */
247
WidgetsSaisiesASL.prototype.preformaterDonneesObs = function( dataObs ) {
248
	const lthis = this;
249
 
250
	if ( this.valOk( dataObs ) ) {
251
		var projetObs  = [],
252
			datRuComun = [],
253
			obsArbres  = [],
254
			projetObsE = {},
255
			count      = 0,
256
			tagsMotsCles = this.tagsMotsCles.split( ',' );
257
 
258
		$.each( dataObs, function( i, obs ) {
259
			if (
260
				new RegExp( tagsMotsCles[0] ).test( obs.mots_cles_texte ) &&
261
				new RegExp( tagsMotsCles[1] ).test( obs.mots_cles_texte ) &&
262
				!/(:?plantes|lichens(?!go))/.test( obs.mots_cles_texte )
263
			) {
264
				if ( lthis.valOk( obs.obs_etendue ) ) {
265
					$.each( obs.obs_etendue, function( indice, obsE ) {
266
						projetObsE[obsE.cle] = obsE.valeur;
267
					});
268
				}
269
				obs.date_observation = $.trim( obs.date_observation.replace( /[0-9]{2}:[0-9]{2}:[0-9]{2}$/, '') );
270
				if ( -1 === datRuComun.indexOf( obs.date_observation + projetObsE.rue + obs.zone_geo )  ) {
271
					datRuComun.push( obs.date_observation + projetObsE.rue + obs.zone_geo );
272
					projetObs[count] = lthis.formaterReleveData( { 'obs':obs, 'obsE':projetObsE } );
273
					count++;
274
				}
275
				obsArbres.push( lthis.formaterArbreData( { 'obs':obs, 'obsE':projetObsE } ) );
276
				projetObsE = [];
277
			}
278
		});
279
		// on insert les arbres dans les relevés en fonction de la date et la rue d'observation
280
		// car les arbres pour un relevé (date/rue) n'ont pas forcément été enregistrés dans l'ordre ni le même jour
281
		$.each( obsArbres, function( indexArbre, arbre ) {
282
			for ( var indexReleve = 0; indexReleve < datRuComun.length; indexReleve++ ) {
283
				if ( arbre.date_rue_commune  === datRuComun[indexReleve] ) {
284
					projetObs[indexReleve].push( arbre );
285
				}
286
			}
287
		});
288
		if ( this.valOk( projetObs ) ) {
289
			this.prechargerLesObs( projetObs );
290
			$( '#' + this.projet + '-obs' ).val( JSON.stringify( projetObs ) );
291
			$( '#bouton-list-releves' ).removeClass( 'hidden' );
292
		}
293
		$( '#dates-rues-communes' ).val( JSON.stringify( datRuComun ) );
294
	}
295
};
296
 
297
/**
298
 * Stocke en Json les valeurs du relevé dans en value d'un input hidden
299
 */
300
WidgetsSaisiesASL.prototype.formaterReleveData = function( releveDatas ) {
301
	var releve  = [],
302
		obs  = releveDatas.obs,
303
		obsE = releveDatas.obsE;
304
 
305
	releve[0] = {
306
		utilisateur        : obs.ce_utilisateur,
307
		date               : obs.date_observation,
308
		rue                : obsE.rue,
309
		'commune-nom'      : obs.zone_geo,
310
		'commune-insee'    : obs.ce_zone_geo,
311
		pays               : obs.pays,
312
		'geometry-releve'  : obsE['geometry-releve'],
313
		'latitude-releve'  : obsE['latitude-releve'],
314
		'longitude-releve' : obsE['longitude-releve'],
315
		'altitude-releve'  : obsE['altitude-releve'],
316
		commentaires       : obs.commentaire
317
	};
318
	if ( 'tb_lichensgo' !== this.projet ) {
319
		releve[0]['zone-pietonne']    = obsE['zone-pietonne'];
320
		releve[0]['pres-lampadaires'] = obsE['pres-lampadaires'];
321
	}
322
	return releve;
323
};
324
 
325
/**
326
 * Stocke en Json les valeurs d'une obs
327
 */
328
WidgetsSaisiesASL.prototype.formaterArbreData = function( arbresDatas ) {
329
	var retour = {},
330
		obs          = arbresDatas.obs,
331
		obsE         = arbresDatas.obsE,
332
		miniatureImg = [];
333
	if( this.valOk( obs['miniature-img'] ) ) {
334
		miniatureImg = obs['miniature-img'];
335
	} else if ( this.valOk( obsE['miniature-img'] ) ) {
336
		miniatureImg = $.parseJSON( obsE['miniature-img'] );
337
	}
338
 
339
	retour = {
340
		'date_rue_commune'      : obs.date_observation + obsE.rue + obs.zone_geo,
341
		'num-arbre'             : obsE.num_arbre,
342
		'id_observation'        : obs.id_observation,
343
		'taxon'                 : {
344
			'numNomSel' : obs.nom_sel_nn,
345
			'value'     : obs.nom_sel,
346
			'nomRet'    : obs.nom_ret,
347
			'numNomRet' : obs.nom_ret_nn,
348
			'nt'        : obs.nt,
349
			'famille'   : obs.famille,
350
		},
351
		'miniature-img'         : miniatureImg,
352
		'referentiel'           : obs.nom_referentiel,
353
		'certitude'             : obs.certitude,
354
		'rue-arbres'            : obsE['rue-arbres'],
355
		'geometry-arbres'       : obs['geometry'],
356
		'latitude-arbres'       : obs['latitude'],
357
		'longitude-arbres'      : obs['longitude'],
358
		'altitude-arbres'       : obs['altitude'],
359
		'circonference'         : obsE.circonference,
360
		'com-arbres'            : obsE['com-arbres']
361
	};
362
	if ( 'tb_lichensgo' !== this.projet ) {
363
		retour['surface-pied']          = obsE['surface-pied'];
364
		retour['equipement-pied-arbre'] = obsE['equipement-pied-arbre'];
365
		retour['tassement']             = obsE.tassement;
366
		retour['dejections']            = obsE.dejections;
367
	}
368
	if ( 'tb_streets' !== this.projet ) {
369
		retour['face-ombre'] = obsE['face-ombre'];
370
	}
371
	return retour;
372
};
373
 
374
WidgetsSaisiesASL.prototype.prechargerLesObs = function( thisWidgetObs ) {
375
	const lthis = this;
376
	const $listReleve = $( '#list-releves' );
377
	const TEXT_ARBRE = ' ' + this.msgTraduction( 'arbre' ).toLowerCase();
378
 
379
	var nbArbres   = '',
380
		texteArbre = '',
381
		releveHtml = '';
382
 
383
	$( '#bouton-list-releves' )
384
		.removeClass( 'hidden' )
385
		.on( 'click', function( event ) {
386
			event.preventDefault();
387
			$( '#table-releves' ).removeClass( 'hidden' );
388
			$( this ).addClass( 'hidden' );
389
	});
390
	function boutonsChargerReleve( lthis, squelette, indice ) {
391
		var boutonLichens =
392
				'<a href="" class="saisir-lichens btn btn-sm btn-info" data-releve="' + indice + '" data-load="lichens">'+
393
					'<i class="far fa-snowflake"></i> ' + lthis.msgTraduction( 'saisir-lichens' )+
394
				'</a> ',
395
			boutonPlantes =
396
				'<a href="" class="saisir-plantes btn btn-sm btn-info mb-1" data-releve="' + indice + '" data-load="plantes">'+
397
					'<i class="fas fa-seedling"></i> ' + lthis.msgTraduction( 'saisir-plantes' )+
398
				'</a> ';
399
 
400
		switch( squelette ) {
401
			case 'tb_streets':
402
				return boutonPlantes;
403
			case 'tb_lichensgo' :
404
				return boutonLichens;
405
			case 'tb_aupresdemonarbre' :
406
			default :
407
				return boutonPlantes + boutonLichens;
408
		}
409
		return '';
410
	}
411
	$.each( thisWidgetObs, function( i, releve ) {
412
		nbArbres = releve.length - 1;
413
		texteArbre = ( 1 < nbArbres ) ? ( TEXT_ARBRE + 's' ) : TEXT_ARBRE;
414
		releveHtml +=
415
			'<tr class="table-light text-center">'+
416
				'<td>' +
417
					'<p>'+
418
						lthis.fournirDate( releve[0].date ) +
419
					'</p><p>'+
420
						releve[0].rue + ', ' + releve[0]['commune-nom'] +
421
					'</p><p>'+
422
						'(' + nbArbres + texteArbre + ')' +
423
					'</p>'+
424
				'</td>'+
425
				'<td class="d-flex flex-column">' +
426
					'<a href="" class="charger-releve btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="arbres">'+
427
						'<i class="fas fa-clone"></i> ' + lthis.msgTraduction( 'dupliquer' )+
428
					'</a> '+
429
					boutonsChargerReleve( lthis, lthis.projet, i ) +
430
				'</td>'+
431
			'</tr>';
432
	});
433
	$listReleve.append( releveHtml );
434
	$( '#nb-releves-bienvenue' )
435
		.removeClass( 'hidden' )
436
		.find( 'span.nb-releves' )
437
			.text( thisWidgetObs.length );
438
};