Subversion Repositories eFlore/Applications.cel

Rev

Rev 3432 | Rev 3532 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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