Subversion Repositories eFlore/Applications.cel

Rev

Rev 3857 | Details | Compare with Previous | Last modification | View Log | RSS feed

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