Subversion Repositories eFlore/Applications.cel

Rev

Rev 3425 | Rev 3430 | 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
 
112
	$( btn, bloc ).off().on( 'click', function( event ) {
113
		var nomSquelette  = $( this ).data( 'load' ),
114
			thisWidgetObs = $.parseJSON( $( '#' + lthis.module + '-obs' ).val() ),
115
			releveDatas   = '';
116
 
117
		$( '#charger-form' ).data( 'load', nomSquelette );
118
		if ( modifierReleveData ) {
119
			if ( '#bouton-nouveau-releve' !== btn ) {
120
				$( '#bouton-nouveau-releve' ).removeClass( 'hidden' );
121
			 	releveDatas = JSON.stringify( thisWidgetObs[ $( this ).data( 'releve' ) ] );
122
			} else {
123
				$( btn ).addClass( 'hidden' );
124
			}
125
			$( '#releve-data' ).val( releveDatas );
126
		}
127
		lthis.chargerForm( nomSquelette, lthis );
128
		if ( lthis.valOk( thisWidgetObs ) ) {
129
			$( '#bouton-list-releves' ).removeClass( 'hidden' );
130
		}
131
		$( '#table-releves' ).addClass( 'hidden' );
132
	});
133
};
134
 
135
WidgetsSaisiesASL.prototype.chargerForm = function( nomSquelette, formObj ) {
136
	const lthis = this;
137
 
138
	var urlSqueletteArbres = this.urlWidgets + 'saisie2?projet=' + this.module + '&squelette=' + nomSquelette;
139
 
140
	$.ajax({
141
		url: urlSqueletteArbres,
142
		type: 'get',
143
		success: function( squelette ) {
144
			if ( lthis.valOk( squelette ) ) {
145
				formObj.chargerSquelette( squelette, nomSquelette );
146
			}
147
		},
148
		error: function() {
149
			$( '#charger-form' ).html( lthis.msgTraduction( 'erreur-formulaire' ) );
150
		}
151
	});
152
};
153
 
154
// Préchargement des infos-obs ************************************************/
155
/**
156
 * Callback dans le chargement du formulaire dans #charger-form
157
 */
158
WidgetsSaisiesASL.prototype.chargerSquelette = function( squelette , nomSquelette ) {
159
	//  à compléter plus tard si nécessaire, pour le moment on charge "arbres"
160
	switch( nomSquelette ) {
161
		case 'plantes' :
162
		case 'lichens' :
163
			this.chargerFormPlantesOuLichens( squelette, nomSquelette );
164
			break;
165
		case 'arbres' :
166
		default :
167
			if ( this.valOk( this.sujet ) ) {
168
				this.reinitialiserWidget( squelette );
169
			} else {
170
				this.chargerObsUtilisateur( squelette );
171
			}
172
		break;
173
	}
174
};
175
 
176
WidgetsSaisiesASL.prototype.chargerFormPlantesOuLichens = function( squelette, nomSquelette ) {
177
	if ( this.valOk( $( '#releve-data' ).val() ) ) {
178
		$( '#charger-form' ).html( squelette );
179
		this.confirmerSortie();
180
		const releveDatas = $.parseJSON( $( '#releve-data' ).val() );
181
		const nbArbres    = releveDatas.length -1;
182
 
183
		for ( var i = 1; i <= nbArbres ; i++ ) {
184
			$( '#choisir-arbre' ).append(
185
				'<option value="' + i + '">'+
186
					this.msgTraduction( 'arbre' ) + ' ' + i +
187
				'</option>'
188
			);
189
		}
3427 idir 190
		this.scrollFormTop( '#zone-' + nomSquelette );
3425 idir 191
	}
192
};
193
 
194
WidgetsSaisiesASL.prototype.reinitialiserWidget = function( squelette ) {
195
	$( '#charger-form' ).html( squelette );
196
	if ( this.valOk( $( '#releve-data' ).val() ) ) {
197
		this.rechargerFormulaire();
198
	}
199
};
200
 
201
/**
202
 * Infos des obs arbres de cet utilisateur
203
 */
204
WidgetsSaisiesASL.prototype.chargerObsUtilisateur = function( formReleve ) {
205
	const lthis = this;
206
	var tagsProjet          = this.tagsProjet.split( ',' ),
207
		reprereAjoutTags    = tagsProjet.length - 1,
208
		queryStringMotsCles = '';
209
 
210
	$.each( tagsProjet , function( i, tag ) {
211
		queryStringMotsCles += 'mots_cles=' + tagsProjet[i];
212
		if ( i < reprereAjoutTags ) {
213
			queryStringMotsCles += '&';
214
		}
215
	});
216
 
217
	const urlObs =
218
		$( 'body' ).data( 'obs-list' ) + '/'+
219
		$( '#id_utilisateur' ).val() + '?' + queryStringMotsCles;
220
 
221
	$.ajax({
222
		url: urlObs,
223
		type: 'GET',
224
		success: function( dataObs, textStatus, jqXHR ) {
225
			if ( !lthis.valOk( dataObs ) ) {
226
				dataObs = '';
227
			}
228
			lthis.preformaterDonneesObs( dataObs );
229
		},
230
		error: function( jqXHR, textStatus, errorThrown ) {
231
			lthis.activerModale( lthis.msgTraduction( 'erreur-chargement-obs-utilisateur' ) );
232
		}
233
	})
234
	.always( function() {
235
		$( '#charger-form' ).html( formReleve );
236
	});
237
};
238
 
239
/**
240
 * Préformater les données des obs d'un utilisateur
241
 */
242
WidgetsSaisiesASL.prototype.preformaterDonneesObs = function( dataObs ) {
243
	const lthis = this;
244
 
245
	if ( this.valOk( dataObs ) ) {
246
		var projetObs  = [],
247
			datRuComun = [],
248
			obsArbres  = [],
249
			projetObsE = {},
250
			count      = 0,
251
			tagsProjet = this.tagsProjet.split( ',' );
252
 
253
		$.each( dataObs, function( i, obs ) {
254
			if (
255
				new RegExp( tagsProjet[0] ).test( obs.mots_cles_texte ) &&
256
				new RegExp( tagsProjet[1] ).test( obs.mots_cles_texte ) &&
257
				!/(:?plantes|lichens)/.test( obs.mots_cles_texte )
258
			) {
259
				if ( lthis.valOk( obs.obs_etendue ) ) {
260
					$.each( obs.obs_etendue, function( indice, obsE ) {
261
						projetObsE[obsE.cle] = obsE.valeur;
262
					});
263
				}
264
				obs.date_observation = $.trim( obs.date_observation.replace( /[0-9]{2}:[0-9]{2}:[0-9]{2}$/, '') );
265
				if ( -1 === datRuComun.indexOf( obs.date_observation + projetObsE.rue + obs.zone_geo )  ) {
266
					datRuComun.push( obs.date_observation + projetObsE.rue + obs.zone_geo );
267
					projetObs[count] = lthis.formaterReleveData( { 'obs':obs, 'obsE':projetObsE } );
268
					count++;
269
				}
270
				obsArbres.push( lthis.formaterArbreData( { 'obs':obs, 'obsE':projetObsE } ) );
271
				projetObsE = [];
272
			}
273
		});
274
		// on insert les arbres dans les relevés en fonction de la date et la rue d'observation
275
		// car les arbres pour un relevé (date/rue) n'ont pas forcément été enregistrés dans l'ordre ni le même jour
276
		$.each( obsArbres, function( indexArbre, arbre ) {
277
			for ( var indexReleve = 0; indexReleve < datRuComun.length; indexReleve++ ) {
278
				if ( arbre.date_rue_commune  === datRuComun[indexReleve] ) {
279
					projetObs[indexReleve].push( arbre );
280
				}
281
			}
282
		});
283
		if ( this.valOk( projetObs ) ) {
284
			this.prechargerLesObs( projetObs );
285
			$( '#' + this.module + '-obs' ).val( JSON.stringify( projetObs ) );
286
			$( '#bouton-list-releves' ).removeClass( 'hidden' );
287
		}
288
		$( '#dates-rues-communes' ).val( JSON.stringify( datRuComun ) );
289
	}
290
};
291
 
292
/**
293
 * Stocke en Json les valeurs du relevé dans en value d'un input hidden
294
 */
295
WidgetsSaisiesASL.prototype.formaterReleveData = function( releveDatas ) {
296
	var releve  = [],
297
		obs  = releveDatas.obs,
298
		obsE = releveDatas.obsE;
299
 
300
	releve[0] = {
301
		utilisateur        : obs.ce_utilisateur,
302
		date               : obs.date_observation,
303
		rue                : obsE.rue,
304
		'commune-nom'      : obs.zone_geo,
305
		'commune-insee'    : obs.ce_zone_geo,
306
		pays               : obs.pays,
307
		'latitude-releve'  : obsE['latitude-releve'],
308
		'longitude-releve' : obsE['longitude-releve'],
309
		'altitude-releve'  : obsE['altitude-releve'],
310
		commentaires       : obs.commentaire
311
	};
312
	if ( 'tb_lichensgo' !== this.module ) {
313
		releve[0]['zone-pietonne']    = obsE['zone-pietonne'];
314
		releve[0]['pres-lampadaires'] = obsE['pres-lampadaires'];
315
	}
316
	return releve;
317
};
318
 
319
/**
320
 * Stocke en Json les valeurs d'une obs
321
 */
322
WidgetsSaisiesASL.prototype.formaterArbreData = function( arbresDatas ) {
323
	var retour = {},
324
		obs          = arbresDatas.obs,
325
		obsE         = arbresDatas.obsE,
326
		miniatureImg = [];
327
	if( this.valOk( obs['miniature-img'] ) ) {
328
		miniatureImg = obs['miniature-img'];
329
	} else if ( this.valOk( obsE['miniature-img'] ) ) {
330
		miniatureImg = $.parseJSON( obsE['miniature-img'] );
331
	}
332
 
333
	retour = {
334
		'date_rue_commune'      : obs.date_observation + obsE.rue + obs.zone_geo,
335
		'num-arbre'             : obsE.num_arbre,
336
		'id_observation'        : obs.id_observation,
337
		'taxon'                 : {
338
			'numNomSel' : obs.nom_sel_nn,
339
			'value'     : obs.nom_sel,
340
			'nomRet'    : obs.nom_ret,
341
			'numNomRet' : obs.nom_ret_nn,
342
			'nt'        : obs.nt,
343
			'famille'   : obs.famille,
344
		},
345
		'miniature-img'         : miniatureImg,
346
		'referentiel'           : obs.nom_referentiel,
347
		'certitude'             : obs.certitude,
348
		'rue-arbres'            : obsE['rue-arbres'],
349
		'latitude-arbres'       : obs['latitude'],
350
		'longitude-arbres'      : obs['longitude'],
351
		'altitude-arbres'       : obs['altitude'],
352
		'circonference'         : obsE.circonference,
353
		'com-arbres'            : obsE['com-arbres']
354
	};
355
	if ( 'tb_lichensgo' !== this.module ) {
356
		retour['surface-pied']          = obsE['surface-pied'];
357
		retour['equipement-pied-arbre'] = obsE['equipement-pied-arbre'];
358
		retour['tassement']             = obsE.tassement;
359
		retour['dejections']            = obsE.dejections;
360
	}
361
	if ( 'tb_streets' !== this.module ) {
362
		retour['face-ombre'] = obsE['face-ombre'];
363
	}
364
	return retour;
365
};
366
 
367
WidgetsSaisiesASL.prototype.prechargerLesObs = function( thisWidgetObs ) {
368
	const lthis = this;
369
	const $listReleve = $( '#list-releves' );
370
	const TEXT_ARBRE = ' ' + this.msgTraduction( 'arbre' ).toLowerCase();
371
 
372
	var nbArbres   = '',
373
		texteArbre = '',
374
		releveHtml = '';
375
 
376
	$( '#bouton-list-releves' )
377
		.removeClass( 'hidden' )
378
		.on( 'click', function(event) {
379
			$( '#table-releves' ).removeClass( 'hidden' );
380
			$( this ).addClass( 'hidden' );
381
	});
382
	function boutonsChargerReleve( lthis, squelette, indice ) {
383
		var boutonLichens =
384
				'<div class="saisir-lichens btn btn-sm btn-info" data-releve="' + indice + '" data-load="lichens">'+
385
					'<i class="far fa-snowflake"></i> ' + lthis.msgTraduction( 'saisir-lichens' )+
386
				'</div> ',
387
			boutonPlantes =
388
				'<div class="saisir-plantes btn btn-sm btn-info mb-1" data-releve="' + indice + '" data-load="plantes">'+
389
					'<i class="fas fa-seedling"></i> ' + lthis.msgTraduction( 'saisir-plantes' )+
390
				'</div> ';
391
 
392
		switch( squelette ) {
393
			case 'tb_streets':
394
				return boutonPlantes;
395
			case 'tb_lichensgo' :
396
				return boutonLichens;
397
			case 'tb_aupresdemonarbre' :
398
			default :
399
				return boutonPlantes + boutonLichens;
400
		}
401
		return '';
402
	}
403
	$.each( thisWidgetObs, function( i, releve ) {
404
		nbArbres = releve.length - 1;
405
		texteArbre = ( 1 < nbArbres ) ? ( TEXT_ARBRE + 's' ) : TEXT_ARBRE;
406
		releveHtml +=
407
			'<tr class="table-light text-center">'+
408
				'<td>' +
409
					'<p>'+
410
						lthis.fournirDate( releve[0].date ) +
411
					'</p><p>'+
412
						releve[0].rue + ', ' + releve[0]['commune-nom'] +
413
					'</p><p>'+
414
						'(' + nbArbres + texteArbre + ')' +
415
					'</p>'+
416
				'</td>'+
417
				'<td class="d-flex flex-column">' +
418
					'<div class="charger-releve btn btn-sm btn-info mb-1" data-releve="' + i + '" data-load="arbres">'+
419
						'<i class="fas fa-clone"></i> ' + lthis.msgTraduction( 'dupliquer' )+
420
					'</div> '+
421
					boutonsChargerReleve( lthis, lthis.module, i ) +
422
				'</td>'+
423
			'</tr>';
424
	});
425
	$listReleve.append( releveHtml );
426
	$( '#nb-releves-bienvenue' )
427
		.removeClass( 'hidden' )
428
		.find( 'span.nb-releves' )
429
			.text( thisWidgetObs.length );
430
};